temp contents
diff --git a/404.html b/404.html
new file mode 100644
index 0000000..3e559d8
--- /dev/null
+++ b/404.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><title>The Apache Groovy programming language - 404</title><link href='img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='css/style.css'/>
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: 20px; right: -58px; border: 0; z-index: 100; transform: rotate(45deg);' src='/img/horizontal-github-ribbon.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/groovy-weekly.html' class='icon'><span class='fa fa-envelope-o'></span> Groovy newsletter</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+                <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span>
+                                    </button><a class='navbar-brand' href='index.html'>
+                                        <i class='fa fa-star'></i> Apache Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li class=''><a href='/download.html'>Download</a></li><li class=''><a href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='/'>Contribute</a></li><li class=''><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li>
+                                            <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='panel panel-danger'><div class='panel-heading'>Oops! The page you are looking for does not exist!</div><div class='panel-body'><p>We could not find the page you are looking for. Maybe you are looking for one of those?</p><ul><li>The <a href='http://docs.groovy-lang.org/latest/html/documentation'>reference documentation</a> of the Groovy language.</li><li>The latest <a href='http://docs.groovy-lang.org/latest/html/api'>Javadocs</a> of the language.</li><li>The latest <a href='http://docs.groovy-lang.org/latest/html/gapi'>Groovdocs</a> of the language.</li><li>Description of <a href='http://docs.groovy-lang.org/latest/html/groovy-jdk'>the Groovy development kit APIs</a>.</li></ul></div></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='/download.html'>Download</a></li><li><a href='http://groovy-lang.org/support.html'>Support</a></li><li><a href='/'>Contribute</a></li><li><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='http://groovy-lang.org/security.html'>Security</a></li><li><a href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='http://groovy-lang.org/search.html'>Search</a></li>
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a href='http://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='http://groovy-lang.org/groovy-weekly.html'>Groovy newsletter</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='http://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li>
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community
+                                        </p><img src='img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' class='img-responsive'/>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2019 the Apache Groovy project &mdash; Groovy is Open Source, <a href='http://www.apache.org/licenses/LICENSE-2.0.html'>Apache 2 License</a></div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='js/vendor/jquery-1.10.2.min.js' defer></script><script src='js/vendor/classie.js' defer></script><script src='js/vendor/bootstrap.js' defer></script><script src='js/vendor/sidebarEffects.js' defer></script><script src='js/vendor/modernizr-2.6.2.min.js' defer></script><script src='js/plugins.js' defer></script><script>
+          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index ad410e1..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
-Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "{}"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright {yyyy} {name of copyright owner}
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
\ No newline at end of file
diff --git a/README.adoc b/README.adoc
deleted file mode 100644
index 230d929..0000000
--- a/README.adoc
+++ /dev/null
@@ -1,77 +0,0 @@
-= Groovy website
-The Groovy development team
-:revdate: 24-02-2014
-:build-icon: http://ci.groovy-lang.org:8111/app/rest/builds/buildType:(id:Groovy_Website)/statusIcon
-:noheader:
-:groovy-www: http://groovy-lang.org/
-:groovy-ci: http://ci.groovy-lang.org/viewType.html?buildTypeId=Groovy_Website&guest=1
-:gradle: http://www.gradle.org
-:markupte: http://docs.groovy-lang.org/latest/html/documentation/markup-template-engine.html
-
-[.left.text-left]
-image::http://groovy-lang.org/img/groovy-logo.png[]
-{groovy-www}[Groovy] is an agile and dynamic language for the Java Virtual Machine. It builds upon the strengths of Java, but has additional power features inspired by languages like Python, Ruby and Smalltalk.
-
-Groovy makes modern programming features available to Java developers with almost-zero learning curve as well as supports Domain-Specific Languages and other compact syntax so your code becomes easy to read and maintain.
-
-Groovy makes writing shell and build scripts easy with its powerful processing primitives, OO abilities and an Ant DSL.
-
-It also increases developer productivity by reducing scaffolding code when developing web, GUI, database or console applications. Groovy simplifies testing by supporting unit testing and mocking out-of-the-box. Groovy also seamlessly integrates with all existing Java classes and libraries and compiles straight to Java bytecode so you can use it anywhere you can use Java.
-
-== Sources for the Groovy website
-
-This project builds the Groovy website. It is using {gradle}[Gradle] and is fully statically generated.
-
-Build is image:{build-icon}[build status, link={groovy-ci}].
-
-== Generating the site
-
-----
-git clone http://git-wip-us.apache.org/repos/asf/groovy-user-site.git
-cd groovy-user-site
-./gradlew webzip
-----
-
-The output can be found in the `build` directory:
-
-----
-build
-  |---- site            : the generated static website
-  |---- reports         : deadlinks report
-  |---- distributions   : zip of the website
-----
-
-== Contributing
-
-The website is generated thanks to Gradle and makes use of the {markupte}[Markup Template Engine]. The structure of the
-project consists of two modules:
-
-----
-generator                       : utility classes and model for generating the website
-site                            : the website itself
-----
-
-The website subproject consists of:
-
-----
-src/main/site                   : sources for the static website
-          |--- assets           : static resources such as images, CSS files, ...
-          |--- html             : elements that templates include as raw HTML contents
-          |--- includes         : includes used by templates
-          |--- layouts          : layouts for the various pages
-          |--- pages            : individual pages
-build.gradle                    : website weaving logic
-----
-
-Additional details can be found in this http://melix.github.io/blog/2014/07/new-groovy-website.html[blog post].
-
-== Continuous Integration
-
-The official CI server runs {groovy-ci}[here] (login as user guest and leave the password blank) and is sponsored by http://www.jetbrains.com[JetBrains].
-
-WARNING: The website is continuously updated from the _master_ branch. This means that *every merge on master is immediately published*. Changes that need to be
-applied on a specific date need to be done on a dedicated branch.
-
-== License
-
-Groovy is licensed under the terms of the http://www.apache.org/licenses/LICENSE-2.0.html[Apache License, Version 2.0]
diff --git a/build.gradle b/build.gradle
deleted file mode 100644
index d56e185..0000000
--- a/build.gradle
+++ /dev/null
@@ -1,23 +0,0 @@
-// Grab the plugin from a Maven Repo automatically
-buildscript {
-    repositories {
-        jcenter()
-    }
-    dependencies {
-        classpath 'com.yahoo.platform.yui:yuicompressor:2.4.7'
-    }
-}
-
-plugins {
-    id 'com.gradle.build-scan' version '1.0'
-}
-
-buildScan {
-    licenseAgreementUrl = 'https://gradle.com/terms-of-service'
-    licenseAgree = 'yes'
-}
-
-allprojects {
-    apply plugin: 'idea'
-}
-
diff --git a/buildstatus.html b/buildstatus.html
new file mode 100644
index 0000000..38a7554
--- /dev/null
+++ b/buildstatus.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><title>The Apache Groovy programming language - Continuous integration</title><link href='img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='css/style.css'/>
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: 20px; right: -58px; border: 0; z-index: 100; transform: rotate(45deg);' src='/img/horizontal-github-ribbon.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/groovy-weekly.html' class='icon'><span class='fa fa-envelope-o'></span> Groovy newsletter</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+                <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span>
+                                    </button><a class='navbar-brand' href='index.html'>
+                                        <i class='fa fa-star'></i> Apache Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li class=''><a href='/download.html'>Download</a></li><li class=''><a href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='/'>Contribute</a></li><li class=''><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li>
+                                            <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-8 col-lg-pull-0'><div id='contribute-btn'>
+                                            <button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/groovy-website/tree/asf-site/site/src/site/pages/buildstatus.groovy"'>
+                                                <i class='fa fa-pencil-square-o'></i> Improve this doc
+                                            </button>
+                                        </div><h1><i class='fa fa-circle-o-notch'></i> Continuous integration</h1><article><p>
+                                    Our <a href='http://ci.groovy-lang.org?guest=1'>continuous integration server</a>,
+                                    sponsored by <a href='http://www.jetbrains.com'>JetBrains</a>,
+                                    builds Groovy against multiple JDK versions, as well as some projects from the community tested
+                                    against development versions of Groovy:
+                                </p><hr class='divider'/><h2>Groovy builds</h2><table class='table table-stripped'><thead><tr><th>Build name</th><th>Status</th></tr></thead><tbody><tr><td>Groovy master, JDK 7</td><td><a href='http://ci.groovy-lang.org/viewType.html?buildTypeId=Groovy_Jdk7Build&branch=master&tab=buildTypeStatusDiv&guest=1'><img src='http://ci.groovy-lang.org:8111/app/rest/builds/buildType:(id:Groovy_Jdk7Build),branch:master/statusIcon'/></a></td></tr><tr><td>Groovy master, JDK 8</td><td><a href='http://ci.groovy-lang.org/viewType.html?buildTypeId=Groovy_Jdk8Build_2&branch=master&tab=buildTypeStatusDiv&guest=1'><img src='http://ci.groovy-lang.org:8111/app/rest/builds/buildType:(id:Groovy_Jdk8Build_2),branch:master/statusIcon'/></a></td></tr><tr><td>Groovy master, JDK 9</td><td><a href='http://ci.groovy-lang.org/viewType.html?buildTypeId=Groovy_Jdk9Build&branch=master&tab=buildTypeStatusDiv&guest=1'><img src='http://ci.groovy-lang.org:8111/app/rest/builds/buildType:(id:Groovy_Jdk9Build),branch:master/statusIcon'/></a></td></tr><tr><td>Groovy 2.4.X, JDK 6</td><td><a href='http://ci.groovy-lang.org/viewType.html?buildTypeId=Groovy_Jdk6Build&branch=GROOVY_2_4_X&tab=buildTypeStatusDiv&guest=1'><img src='http://ci.groovy-lang.org:8111/app/rest/builds/buildType:(id:Groovy_Jdk6Build),branch:GROOVY_2_4_X/statusIcon'/></a></td></tr><tr><td>Groovy 2.4.X, JDK 7</td><td><a href='http://ci.groovy-lang.org/viewType.html?buildTypeId=Groovy_Jdk7Build&branch=GROOVY_2_4_X&tab=buildTypeStatusDiv&guest=1'><img src='http://ci.groovy-lang.org:8111/app/rest/builds/buildType:(id:Groovy_Jdk7Build),branch:GROOVY_2_4_X/statusIcon'/></a></td></tr><tr><td>Groovy 2.5.X, JDK 7</td><td><a href='http://ci.groovy-lang.org/viewType.html?buildTypeId=Groovy_Jdk7Build_2&branch=GROOVY_2_5_X&tab=buildTypeStatusDiv&guest=1'><img src='http://ci.groovy-lang.org:8111/app/rest/builds/buildType:(id:Groovy_Jdk7Build_2),branch:GROOVY_2_5_X/statusIcon'/></a></td></tr></tbody></table><hr class='divider'/><h2>Community joint builds</h2><table class='table table-stripped'><thead><tr><th>Build name</th><th>Status</th></tr></thead><tbody><tr><td>Grails 3.2.x, Groovy 2.4.X</td><td><a href='http://ci.groovy-lang.org/viewType.html?buildTypeId=JointBuilds_Grails_Grails32x_Groovy24x&branch=&tab=buildTypeStatusDiv&guest=1'><img src='http://ci.groovy-lang.org:8111/app/rest/builds/buildType:(id:JointBuilds_Grails_Grails32x_Groovy24x)/statusIcon'/></a></td></tr><tr><td>GORM 6.1.x, Groovy 2.4.X</td><td><a href='http://ci.groovy-lang.org/viewType.html?buildTypeId=JointBuilds_Grails_Gorm61xGroovy24x&branch=&tab=buildTypeStatusDiv&guest=1'><img src='http://ci.groovy-lang.org:8111/app/rest/builds/buildType:(id:JointBuilds_Grails_Gorm61xGroovy24x)/statusIcon'/></a></td></tr><tr><td>Nextflow master, Groovy 2.4.X</td><td><a href='http://ci.groovy-lang.org/viewType.html?buildTypeId=JointBuilds_Nextflow_Groovy24xJointBuild&branch=&tab=buildTypeStatusDiv&guest=1'><img src='http://ci.groovy-lang.org:8111/app/rest/builds/buildType:(id:JointBuilds_Nextflow_Groovy24xJointBuild)/statusIcon'/></a></td></tr><tr><td>Ratpack master, Groovy 2.4.X</td><td><a href='http://ci.groovy-lang.org/viewType.html?buildTypeId=JointBuilds_Ratpac_RatpackGroovy24x&branch=&tab=buildTypeStatusDiv&guest=1'><img src='http://ci.groovy-lang.org:8111/app/rest/builds/buildType:(id:JointBuilds_Ratpac_RatpackGroovy24x)/statusIcon'/></a></td></tr></tbody></table><p>
+                                    The Groovy development team is keen to test Groovy development versions against important
+                                    ecosystem projects. If you want your project to be added to the list, please contact
+                                    us on the <a href='http://groovy-lang.org/mailing-lists.html'>development mailing list</a>.
+                                </p></article></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='/download.html'>Download</a></li><li><a href='http://groovy-lang.org/support.html'>Support</a></li><li><a href='/'>Contribute</a></li><li><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='http://groovy-lang.org/security.html'>Security</a></li><li><a href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='http://groovy-lang.org/search.html'>Search</a></li>
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a href='http://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='http://groovy-lang.org/groovy-weekly.html'>Groovy newsletter</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='http://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li>
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community
+                                        </p><img src='img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' class='img-responsive'/>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2019 the Apache Groovy project &mdash; Groovy is Open Source, <a href='http://www.apache.org/licenses/LICENSE-2.0.html'>Apache 2 License</a></div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='js/vendor/jquery-1.10.2.min.js' defer></script><script src='js/vendor/classie.js' defer></script><script src='js/vendor/bootstrap.js' defer></script><script src='js/vendor/sidebarEffects.js' defer></script><script src='js/vendor/modernizr-2.6.2.min.js' defer></script><script src='js/plugins.js' defer></script><script>
+          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file
diff --git a/css/book.css b/css/book.css
new file mode 100644
index 0000000..44b1cb2
--- /dev/null
+++ b/css/book.css
@@ -0,0 +1 @@
+.book-btn{display:inline-block;text-transform:uppercase;text-decoration:none;border:2px solid black;margin-top:100px;font-size:.7em;font-weight:700;padding:.1em .4em;margin-left:40px;text-align:center;-webkit-transition:color .3s,border-color .3s;-moz-transition:color .3s,border-color .3s;transition:color .3s,border-color .3s}.book-btn:hover{border-color:#db4800;color:#db4800}.book{position:relative;width:160px;height:220px;-webkit-perspective:1000px;-moz-perspective:1000px;perspective:1000px;-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;transform-style:preserve-3d;margin:20px;margin-bottom:40px;margin-left:60px}.book ul{list-style:none}.hardcover_front li:first-child{background-color:#eee;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden}.hardcover_front li:last-child{background:#fffbec}.hardcover_back li:first-child{background:#fffbec}.hardcover_back li:last-child{background:#fffbec}.book_spine li:first-child{background:#eee}.book_spine li:last-child{background:#333}.hardcover_front li:first-child:after,.hardcover_front li:first-child:before,.hardcover_front li:last-child:after,.hardcover_front li:last-child:before,.hardcover_back li:first-child:after,.hardcover_back li:first-child:before,.hardcover_back li:last-child:after,.hardcover_back li:last-child:before,.book_spine li:first-child:after,.book_spine li:first-child:before,.book_spine li:last-child:after,.book_spine li:last-child:before{background:#999}.page>li{background:-webkit-linear-gradient(left,#e1ddd8 0,#fffbf6 100%);background:-moz-linear-gradient(left,#e1ddd8 0,#fffbf6 100%);background:-ms-linear-gradient(left,#e1ddd8 0,#fffbf6 100%);background:linear-gradient(left,#e1ddd8 0,#fffbf6 100%);box-shadow:inset 0 -1px 2px rgba(50,50,50,0.1),inset -1px 0 1px rgba(150,150,150,0.2);border-radius:0 5px 5px 0}.hardcover_front{-webkit-transform:rotateY(-34deg) translateZ(8px);-moz-transform:rotateY(-34deg) translateZ(8px);transform:rotateY(-34deg) translateZ(8px);z-index:100}.hardcover_back{-webkit-transform:rotateY(-15deg) translateZ(-8px);-moz-transform:rotateY(-15deg) translateZ(-8px);transform:rotateY(-15deg) translateZ(-8px)}.page li:nth-child(1){-webkit-transform:rotateY(-28deg);-moz-transform:rotateY(-28deg);transform:rotateY(-28deg)}.page li:nth-child(2){-webkit-transform:rotateY(-30deg);-moz-transform:rotateY(-30deg);transform:rotateY(-30deg)}.page li:nth-child(3){-webkit-transform:rotateY(-32deg);-moz-transform:rotateY(-32deg);transform:rotateY(-32deg)}.page li:nth-child(4){-webkit-transform:rotateY(-34deg);-moz-transform:rotateY(-34deg);transform:rotateY(-34deg)}.page li:nth-child(5){-webkit-transform:rotateY(-36deg);-moz-transform:rotateY(-36deg);transform:rotateY(-36deg)}.hardcover_front,.hardcover_back,.book_spine,.hardcover_front li,.hardcover_back li,.book_spine li{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;transform-style:preserve-3d}.hardcover_front,.hardcover_back{-webkit-transform-origin:0 100%;-moz-transform-origin:0 100%;transform-origin:0 100%}.hardcover_front{-webkit-transition:all .8s ease,z-index .6s;-moz-transition:all .8s ease,z-index .6s;transition:all .8s ease,z-index .6s}.hardcover_front li:first-child{cursor:default;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-transform:translateZ(2px);-moz-transform:translateZ(2px);transform:translateZ(2px)}.hardcover_front li:last-child{-webkit-transform:rotateY(180deg) translateZ(2px);-moz-transform:rotateY(180deg) translateZ(2px);transform:rotateY(180deg) translateZ(2px)}.hardcover_back li:first-child{-webkit-transform:translateZ(2px);-moz-transform:translateZ(2px);transform:translateZ(2px)}.hardcover_back li:last-child{-webkit-transform:translateZ(-2px);-moz-transform:translateZ(-2px);transform:translateZ(-2px)}.hardcover_front li:first-child:after,.hardcover_front li:first-child:before,.hardcover_front li:last-child:after,.hardcover_front li:last-child:before,.hardcover_back li:first-child:after,.hardcover_back li:first-child:before,.hardcover_back li:last-child:after,.hardcover_back li:last-child:before,.book_spine li:first-child:after,.book_spine li:first-child:before,.book_spine li:last-child:after,.book_spine li:last-child:before{position:absolute;top:0;left:0}.hardcover_front li:first-child:after,.hardcover_front li:first-child:before{width:4px;height:100%}.hardcover_front li:first-child:after{-webkit-transform:rotateY(90deg) translateZ(-2px) translateX(2px);-moz-transform:rotateY(90deg) translateZ(-2px) translateX(2px);transform:rotateY(90deg) translateZ(-2px) translateX(2px)}.hardcover_front li:first-child:before{-webkit-transform:rotateY(90deg) translateZ(158px) translateX(2px);-moz-transform:rotateY(90deg) translateZ(158px) translateX(2px);transform:rotateY(90deg) translateZ(158px) translateX(2px)}.hardcover_front li:last-child:after,.hardcover_front li:last-child:before{width:4px;height:160px}.hardcover_front li:last-child:after{-webkit-transform:rotateX(90deg) rotateZ(90deg) translateZ(80px) translateX(-2px) translateY(-78px);-moz-transform:rotateX(90deg) rotateZ(90deg) translateZ(80px) translateX(-2px) translateY(-78px);transform:rotateX(90deg) rotateZ(90deg) translateZ(80px) translateX(-2px) translateY(-78px)}.hardcover_front li:last-child:before{box-shadow:0 0 30px 5px #333;-webkit-transform:rotateX(90deg) rotateZ(90deg) translateZ(-140px) translateX(-2px) translateY(-78px);-moz-transform:rotateX(90deg) rotateZ(90deg) translateZ(-140px) translateX(-2px) translateY(-78px);transform:rotateX(90deg) rotateZ(90deg) translateZ(-140px) translateX(-2px) translateY(-78px)}.hardcover_back li:first-child:after,.hardcover_back li:first-child:before{width:4px;height:100%}.hardcover_back li:first-child:after{-webkit-transform:rotateY(90deg) translateZ(-2px) translateX(2px);-moz-transform:rotateY(90deg) translateZ(-2px) translateX(2px);transform:rotateY(90deg) translateZ(-2px) translateX(2px)}.hardcover_back li:first-child:before{-webkit-transform:rotateY(90deg) translateZ(158px) translateX(2px);-moz-transform:rotateY(90deg) translateZ(158px) translateX(2px);transform:rotateY(90deg) translateZ(158px) translateX(2px)}.hardcover_back li:last-child:after,.hardcover_back li:last-child:before{width:4px;height:160px}.hardcover_back li:last-child:after{-webkit-transform:rotateX(90deg) rotateZ(90deg) translateZ(80px) translateX(2px) translateY(-78px);-moz-transform:rotateX(90deg) rotateZ(90deg) translateZ(80px) translateX(2px) translateY(-78px);transform:rotateX(90deg) rotateZ(90deg) translateZ(80px) translateX(2px) translateY(-78px)}.hardcover_back li:last-child:before{box-shadow:10px -1px 80px 20px #666;-webkit-transform:rotateX(90deg) rotateZ(90deg) translateZ(-140px) translateX(2px) translateY(-78px);-moz-transform:rotateX(90deg) rotateZ(90deg) translateZ(-140px) translateX(2px) translateY(-78px);transform:rotateX(90deg) rotateZ(90deg) translateZ(-140px) translateX(2px) translateY(-78px)}.book_spine{-webkit-transform:rotateY(60deg) translateX(-5px) translateZ(-12px);-moz-transform:rotateY(60deg) translateX(-5px) translateZ(-12px);transform:rotateY(60deg) translateX(-5px) translateZ(-12px);width:16px;z-index:0}.book_spine li:first-child{-webkit-transform:translateZ(2px);-moz-transform:translateZ(2px);transform:translateZ(2px)}.book_spine li:last-child{-webkit-transform:translateZ(-2px);-moz-transform:translateZ(-2px);transform:translateZ(-2px)}.book_spine li:first-child:after,.book_spine li:first-child:before{width:4px;height:100%}.book_spine li:first-child:after{-webkit-transform:rotateY(90deg) translateZ(-2px) translateX(2px);-moz-transform:rotateY(90deg) translateZ(-2px) translateX(2px);transform:rotateY(90deg) translateZ(-2px) translateX(2px)}.book_spine li:first-child:before{-webkit-transform:rotateY(-90deg) translateZ(-12px);-moz-transform:rotateY(-90deg) translateZ(-12px);transform:rotateY(-90deg) translateZ(-12px)}.book_spine li:last-child:after,.book_spine li:last-child:before{width:4px;height:16px}.book_spine li:last-child:after{-webkit-transform:rotateX(90deg) rotateZ(90deg) translateZ(8px) translateX(2px) translateY(-6px);-moz-transform:rotateX(90deg) rotateZ(90deg) translateZ(8px) translateX(2px) translateY(-6px);transform:rotateX(90deg) rotateZ(90deg) translateZ(8px) translateX(2px) translateY(-6px)}.book_spine li:last-child:before{box-shadow:5px -1px 100px 40px rgba(0,0,0,0.2);-webkit-transform:rotateX(90deg) rotateZ(90deg) translateZ(-210px) translateX(2px) translateY(-6px);-moz-transform:rotateX(90deg) rotateZ(90deg) translateZ(-210px) translateX(2px) translateY(-6px);transform:rotateX(90deg) rotateZ(90deg) translateZ(-210px) translateX(2px) translateY(-6px)}.page,.page>li{position:absolute;top:0;left:0;-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;transform-style:preserve-3d}.page{width:100%;height:98%;top:1%;left:3%;z-index:10}.page>li{width:100%;height:100%;-webkit-transform-origin:left center;-moz-transform-origin:left center;transform-origin:left center;-webkit-transition-property:transform;-moz-transition-property:transform;transition-property:transform;-webkit-transition-timing-function:ease;-moz-transition-timing-function:ease;transition-timing-function:ease}.page>li:nth-child(1){-webkit-transition-duration:.6s;-moz-transition-duration:.6s;transition-duration:.6s}.page>li:nth-child(2){-webkit-transition-duration:.6s;-moz-transition-duration:.6s;transition-duration:.6s}.page>li:nth-child(3){-webkit-transition-duration:.4s;-moz-transition-duration:.4s;transition-duration:.4s}.page>li:nth-child(4){-webkit-transition-duration:.5s;-moz-transition-duration:.5s;transition-duration:.5s}.page>li:nth-child(5){-webkit-transition-duration:.6s;-moz-transition-duration:.6s;transition-duration:.6s}@media screen and (min-width:768px){.book:hover>.hardcover_front{-webkit-transform:rotateY(-145deg) translateZ(0);-moz-transform:rotateY(-145deg) translateZ(0);transform:rotateY(-145deg) translateZ(0);z-index:0}.book:hover>.page li:nth-child(1){-webkit-transform:rotateY(-30deg);-moz-transform:rotateY(-30deg);transform:rotateY(-30deg);-webkit-transition-duration:1.5s;-moz-transition-duration:1.5s;transition-duration:1.5s}.book:hover>.page li:nth-child(2){-webkit-transform:rotateY(-35deg);-moz-transform:rotateY(-35deg);transform:rotateY(-35deg);-webkit-transition-duration:1.8s;-moz-transition-duration:1.8s;transition-duration:1.8s}.book:hover>.page li:nth-child(3){-webkit-transform:rotateY(-118deg);-moz-transform:rotateY(-118deg);transform:rotateY(-118deg);-webkit-transition-duration:1.6s;-moz-transition-duration:1.6s;transition-duration:1.6s}.book:hover>.page li:nth-child(4){-webkit-transform:rotateY(-130deg);-moz-transform:rotateY(-130deg);transform:rotateY(-130deg);-webkit-transition-duration:1.4s;-moz-transition-duration:1.4s;transition-duration:1.4s}.book:hover>.page li:nth-child(5){-webkit-transform:rotateY(-140deg);-moz-transform:rotateY(-140deg);transform:rotateY(-140deg);-webkit-transition-duration:1.2s;-moz-transition-duration:1.2s;transition-duration:1.2s}}.coverDesign{position:absolute;top:0;left:0;bottom:0;right:0;overflow:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden}.coverDesign::after{background-image:-webkit-linear-gradient(-135deg,rgba(255,255,255,0.45) 0,transparent 100%);background-image:-moz-linear-gradient(-135deg,rgba(255,255,255,0.45) 0,transparent 100%);background-image:linear-gradient(-135deg,rgba(255,255,255,0.45) 0,transparent 100%);position:absolute;top:0;left:0;bottom:0;right:0}.coverDesign h1{color:#fff;font-size:2.2em;letter-spacing:.05em;text-align:center;margin:54% 0 0 0;text-shadow:-1px -1px 0 rgba(0,0,0,0.1)}.coverDesign p{color:#f8f8f8;font-size:1em;text-align:center;text-shadow:-1px -1px 0 rgba(0,0,0,0.1)}.yellow{background-color:#f1c40f;background-image:-webkit-linear-gradient(top,#f1c40f 58%,#e7ba07 0);background-image:-moz-linear-gradient(top,#f1c40f 58%,#e7ba07 0);background-image:linear-gradient(top,#f1c40f 58%,#e7ba07 0)}.blue{background-color:#3498db;background-image:-webkit-linear-gradient(top,#3498db 58%,#2a90d4 0);background-image:-moz-linear-gradient(top,#3498db 58%,#2a90d4 0);background-image:linear-gradient(top,#3498db 58%,#2a90d4 0)}.grey{background-color:#f8e9d1;background-image:-webkit-linear-gradient(top,#f8e9d1 58%,#e7d5b7 0);background-image:-moz-linear-gradient(top,#f8e9d1 58%,#e7d5b7 0);background-image:linear-gradient(top,#f8e9d1 58%,#e7d5b7 0)}.ribbon{background:#c0392b;color:#fff;display:block;font-size:.7em;position:absolute;top:11px;right:1px;width:40px;height:20px;line-height:20px;letter-spacing:.15em;text-align:center;-webkit-transform:rotateZ(45deg) translateZ(1px);-moz-transform:rotateZ(45deg) translateZ(1px);transform:rotateZ(45deg) translateZ(1px);-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;z-index:10}.ribbon::before,.ribbon::after{position:absolute;top:-20px;width:0;height:0;border-bottom:20px solid #c0392b;border-top:20px solid transparent}.ribbon::before{left:-20px;border-left:20px solid transparent}.ribbon::after{right:-20px;border-right:20px solid transparent}.book figcaption{padding-left:40px;padding-top:40px;text-align:left;position:absolute;top:0;left:160px;width:500px}.book figcaption h1{margin:0}.book figcaption span{color:#245f78;padding:.6em 0 .2em 0;display:block}.book figcaption p{color:black;line-height:1.3}@media screen and (max-width:767px){.align>li{width:100%;min-height:440px;height:auto;padding:0;margin:0 0 30px 0}.book{margin-left:60px;display:block;margin-bottom:280px}.book figcaption{min-width:320px;top:250px;padding-left:0;left:-60px;display:block}}@media screen and (max-width:550px){.book{height:250px}.book figcaption{width:320px}}
\ No newline at end of file
diff --git a/css/bootstrap.css b/css/bootstrap.css
new file mode 100644
index 0000000..237492f
--- /dev/null
+++ b/css/bootstrap.css
@@ -0,0 +1,5 @@
+/*!
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid #c0c0c0}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;width:100% \9;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;width:100% \9;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media(min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}mark,.mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media(min-width:768px){.container{width:750px}}@media(min-width:992px){.container{width:970px}}@media(min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media(min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media(min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media(min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{position:static;display:table-cell;float:none}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height:34px;line-height:1.42857143 \0}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;min-height:20px;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-top:4px \9;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:normal;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm,.form-horizontal .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg,.form-horizontal .form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:25px;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label.sr-only ~ .form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media(min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}@media(min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media(min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:normal;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:normal;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:1000px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{position:absolute;z-index:-1;filter:alpha(opacity=0);opacity:0}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media(min-width:1000px){.navbar{border-radius:4px}}@media(min-width:1000px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media(min-width:1000px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media(max-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:1000px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media(min-width:1000px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@media(min-width:1000px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:1000px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:1000px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media(max-width:999px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media(min-width:1000px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media(min-width:1000px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media(min-width:1000px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media(max-width:999px){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:1000px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media(min-width:1000px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media(max-width:999px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#777}.navbar-inverse .navbar-nav>li>a{color:#777}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media(max-width:999px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#428bca;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar[aria-valuenow="1"],.progress-bar[aria-valuenow="2"]{min-width:30px}.progress-bar[aria-valuenow="0"]{min-width:30px;color:#777;background-color:transparent;background-image:none;-webkit-box-shadow:none;box-shadow:none}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{color:#777;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#428bca}.panel-primary>.panel-heading .badge{color:#428bca;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:transparent;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate3d(0,-25%,0);-o-transform:translate3d(0,-25%,0);transform:translate3d(0,-25%,0)}.modal.in .modal-dialog{-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.42857143px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media(min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media(min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-size:12px;line-height:1.4;visibility:visible;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1);background-repeat:repeat-x}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{display:table;content:" "}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed;-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media(max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media(max-width:767px){.visible-xs-block{display:block!important}}@media(max-width:767px){.visible-xs-inline{display:inline!important}}@media(max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media(min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media(min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media(min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media(min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media(min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media(min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media(min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media(min-width:1200px){.visible-lg-block{display:block!important}}@media(min-width:1200px){.visible-lg-inline{display:inline!important}}@media(min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media(max-width:767px){.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}
\ No newline at end of file
diff --git a/css/docstyle.css b/css/docstyle.css
new file mode 100644
index 0000000..dcadc29
--- /dev/null
+++ b/css/docstyle.css
@@ -0,0 +1 @@
+.hdlist>table,.colist>table{border:0;background:0}.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:0}td.hdlist1{padding-right:.8em;font-weight:bold}td.hdlist1,td.hdlist2{vertical-align:top}.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}.colist>table tr>td:first-of-type{padding:0 .8em;line-height:1}.colist>table tr>td:last-of-type{padding:.25em 0}.conum{display:inline-block;color:#fff!important;background-color:#222;-webkit-border-radius:100px;border-radius:100px;text-align:center;width:20px;height:20px;font-size:12px;font-weight:bold;line-height:20px;font-family:Arial,sans-serif;font-style:normal;position:relative;top:-2px;letter-spacing:-1px}.conum *{color:#fff!important}.conum+b{display:none}.conum:after{content:attr(data-value)}.conum:not([data-value]):empty{display:none}
\ No newline at end of file
diff --git a/site/src/site/assets/css/documentation.css b/css/documentation.css
similarity index 100%
rename from site/src/site/assets/css/documentation.css
rename to css/documentation.css
diff --git a/site/src/site/assets/css/font-awesome.min.css b/css/font-awesome.min.css
similarity index 100%
rename from site/src/site/assets/css/font-awesome.min.css
rename to css/font-awesome.min.css
diff --git a/css/main.css b/css/main.css
new file mode 100644
index 0000000..b458d99
--- /dev/null
+++ b/css/main.css
@@ -0,0 +1 @@
+/*! HTML5 Boilerplate v4.3.0 | MIT License | http://h5bp.com/ */html,button,input,select,textarea{color:#222}html{font-size:1em;line-height:1.4}::-moz-selection{background:#b3d4fc;text-shadow:none}::selection{background:#b3d4fc;text-shadow:none}hr{display:block;height:1px;border:0;border-top:1px solid #ccc;margin:1em 0;padding:0}audio,canvas,img,video{vertical-align:middle}fieldset{border:0;margin:0;padding:0}textarea{resize:vertical}.browsehappy{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{background-color:transparent;border:0;overflow:hidden;*text-indent:-9999px}.ir:before{content:"";display:block;width:0;height:150%}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.clearfix{*zoom:1}@media print,(-o-min-device-pixel-ratio:5/@media print{*{background:transparent!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}
\ No newline at end of file
diff --git a/css/normalize.css b/css/normalize.css
new file mode 100644
index 0000000..47057f0
--- /dev/null
+++ b/css/normalize.css
@@ -0,0 +1 @@
+/*! normalize.css v1.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-size:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}html,button,input,select,textarea{font-family:sans-serif}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}h2{font-size:1.5em;margin:.83em 0}h3{font-size:1.17em;margin:1em 0}h4{font-size:1em;margin:1.33em 0}h5{font-size:.83em;margin:1.67em 0}h6{font-size:.67em;margin:2.33em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:1em 40px}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}p,pre{margin:1em 0}code,kbd,pre,samp{font-family:monospace,serif;_font-family:'courier new',monospace;font-size:1em}pre{white-space:pre;white-space:pre-wrap;word-wrap:break-word}q{quotes:none}q:before,q:after{content:'';content:none}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}dl,menu,ol,ul{margin:1em 0}dd{margin:0 0 0 40px}menu,ol,ul{padding:0 0 0 40px}nav ul,nav ol{list-style:none;list-style-image:none}img{border:0;-ms-interpolation-mode:bicubic}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0;white-space:normal;*margin-left:-7px}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;*overflow:visible}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*height:13px;*width:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}
\ No newline at end of file
diff --git a/css/style.css b/css/style.css
new file mode 100644
index 0000000..1f1bbaa
--- /dev/null
+++ b/css/style.css
@@ -0,0 +1 @@
+@import url(http://fonts.googleapis.com/css?family=Source+Code+Pro:500,700|Open+Sans:400,600);html,code,kbd,pre,samp{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}html,body{height:100%;-webkit-overflow-scrolling:touch}p,ul,pre,h1,h2,h3,h4,h5,h6,h7,h8{margin:1em 0}p{display:block}h1,h2,h3,h4,h5,h6,h7,h8{font-weight:bold}pre{border-radius:0;border:0!important;font-size:14px}.navbar{margin-bottom:0;padding-right:110px}.navbar .container{margin:10px}.navbar-default a{color:#c0d3db!important;font-size:18px!important;text-decoration:none}.navbar-default,.navbar-static-top{background-color:#286b86;border:0}a.navbar-brand{color:white!important;font-size:19px!important}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{background-color:transparent;color:white}.navbar-nav>li.active>a{color:white!important}.navbar-nav>li>a:hover{background-color:#db4800!important;color:white!important}.navbar-nav>li>a{color:#c0d3db}.navbar-default .navbar-toggle .icon-bar{background-color:white}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#db4800}@media(min-width:768px){.container{width:auto}}@media(max-width:999px){.doc-embed{width:100%!important}#fork-me{display:none}.navbar{padding-right:0}}#band{background:#4298b8 no-repeat 50% 30%;height:400px}.svg #band{background-image:url(../img/groovy-logo-white.svg)}.no-svg #band{background-image:url(../img/groovy-logo-white.png)}@media(max-width:1010px){#band{background-size:90%;height:300px}}@media(max-width:690px){#band{background-size:80%;height:200px}}@media(max-width:475px){#band{background-size:70%;height:100px}}#they-use-groovy{width:100%;background-color:#db4800;margin-bottom:20px;text-align:center}#they-use-groovy .item{text-align:center;color:white}#logos-holder{display:inline-block;padding:0;margin:0;text-align:center}#logos-holder .logo{padding:0;margin:0;display:inline-block;width:105px;height:87px;background-size:95%;background-repeat:no-repeat;background-position:50% 50%}@media(min-width:330px){#logos-holder{width:320px}}@media(min-width:475px){#logos-holder{width:420px}}@media(min-width:690px){#logos-holder{width:630px}}@media(min-width:1010px){#logos-holder{width:940px}}.centered{text-align:center}.event-img{margin:-20px -20px 20px -20px;background-repeat:no-repeat;background-position:50% top;height:180px}.event-logo{height:180px;float:right}@media(max-width:1010px){.event-logo{height:}}@media(max-width:690px){.event-logo{height:60px}}@media(max-width:475px){.event-logo{display:none}}article .content time{font-weight:bold}.doc-embed{border:0;border-right:1px solid #e7e7e7;width:88%;height:100vh;min-height:100%}.download-table{width:100%;text-align:center}.download-table td{width:20%}#mc-embedded-subscribe{width:200px;font-weight:bold}#mc-embedded-subscribe:hover{background-color:#f2f2f2;font-weight:bold}#footer .colset-3-footer .col-1 h1,#footer .colset-3-footer .col-2 h1,#footer .colset-3-footer .col-3 h1{font-size:15px!important}.anchor-link:before{content:' # ';color:lightgray}.anchor-link:hover:before{color:orange}code,kbd,pre,samp{font-family:"Source Code Pro","Consolas","Monaco","Bitstream Vera Sans Mono","Courier New",Courier,monospace}#contribute-btn{position:absolute;right:15px}@media(max-width:767px){#contribute-btn{width:100%;position:relative;margin-top:30px;right:0}#contribute-btn button{width:100%;right:15px}}@media(min-width:1200px){#contribute-btn{top:25px;right:15px}}#big-download-button{float:right;font-size:20px;padding:10px;margin:6px 0 6px 12px;border:2px solid #db4800;border-radius:6px;background-color:#db4800;color:white}#big-download-button:hover{background-color:#e6e6e6;color:#db4800}.colset-3-footer .col-1,.colset-3-footer .col-2,.colset-3-footer .col-3{min-width:180px;float:left}.colset-3-footer .col-3{min-width:220px}.colset-3-article article{float:left}.col1,.col2{min-width:300px;float:left}@media(max-width:988px){.col1,.col2{width:98%!important;max-width:98%}.colset-3-article article{width:98%!important;max-width:98%}}body,html{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;padding:0;margin:0;color:#343437;line-height:25px;font-weight:normal;font-size:14px}a{color:#db4800;text-decoration:underline}a:hover{color:#db4800;text-decoration:none}h1{font-size:2.125em;margin:.67em 0}h2{font-size:1.6875em;font-weight:bold}h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em;font-weight:bold}h4{font-size:1.125em;font-weight:bold}h5{font-size:1.125em;font-weight:bold;color:#db4800}h6{font-size:1.08em;font-weight:normal;color:#db4800}h7{font-weight:bold;color:#245f78}h8{color:#245f78}#footer{background:#f2f2f2;text-align:center;font-size:14px;padding:20px 0 30px;margin-top:30px;color:#AAA}#footer .col-right{float:right;width:300px;text-align:right;padding-top:10px}#footer .colset-3-footer{color:#222;font-size:14px}#footer .colset-3-footer:before,#footer .colset-3-footer:after{content:" ";display:table}#footer .colset-3-footer:after{clear:both}#footer .colset-3-footer .col-1,#footer .colset-3-footer .col-2,#footer .colset-3-footer .col-3{width:18%;padding:20px 0 30px;padding-right:3%;float:left;text-align:left}#footer .colset-3-footer .col-3{width:24%}#footer .colset-3-footer .col-1 h1,#footer .colset-3-footer .col-2 h1,#footer .colset-3-footer .col-3 h1{font-weight:600;font-size:15px;line-height:30px;margin:0}#footer .colset-3-footer .col-1 ul,#footer .colset-3-footer .col-2 ul,#footer .colset-3-footer .col-3 ul{list-style-type:none;margin:0;padding:0}#footer .colset-3-footer .col-1 ul li,#footer .colset-3-footer .col-2 ul li,#footer .colset-3-footer .col-3 ul li{margin:0;padding:0}#footer .colset-3-footer .col-1 ul li a,#footer .colset-3-footer .col-2 ul li a,#footer .colset-3-footer .col-3 ul li a{color:#343437;text-decoration:none}#footer .colset-3-footer .col-1 ul li a:hover,#footer .colset-3-footer .col-2 ul li a:hover,#footer .colset-3-footer .col-3 ul li a:hover{text-decoration:underline}#footer .second a{color:#db4800}.row{position:relative;max-width:1400px;margin:0 auto;padding:0 5%}.row:before,.row:after{content:" ";display:table}.row:after{clear:both}.band{background:#4298b8;height:400px;margin-bottom:20px;color:white}.band .item{text-align:center}.band .item:before,.band .item:after{content:" ";display:table}.band .item:after{clear:both}#content{background:white}#content .row:before,#content .row:after{content:" ";display:table}#content .row:after{clear:both}#content .row>h1{font-size:34px;line-height:40px;font-weight:200;text-align:center;margin:0;padding:20px 0}#content hr.row,#content hr.divider{border:0 none;border-top:1px solid #EEE;margin:0 5%;margin-top:40px}#content hr.divider{margin:0;margin-top:40px;margin-bottom:30px}#content .colset-2-its:before,#content .colset-2-its:after{content:" ";display:table}#content .colset-2-its:after{clear:both}#content .colset-2-its>h1{padding-bottom:15px;margin-top:15px;margin-bottom:0}#content .colset-2-its>p{margin-top:0;padding-bottom:5px;text-align:center;color:#222;font-size:15px}#content .colset-2-its .col1,#content .colset-2-its .col2{float:left;width:48%;padding-right:1%;padding-left:1%}#content .colset-2-its .col2{padding-left:1%;padding-right:1%}#content .colset-2-its article{padding:10px 0}#content .colset-2-its article:before,#content .colset-2-its article:after{content:" ";display:table}#content .colset-2-its article:after{clear:both}#content .colset-2-its article .icon{display:block;width:80px;height:80px;background-image:url(/img/icons-colset-2-its.png);float:left;margin-top:12px;margin-right:15px}#content .colset-2-its article .icon.icon-1{background-position:0 0}#content .colset-2-its article .icon.icon-2{background-position:0 -80px}#content .colset-2-its article .icon.icon-3{background-position:0 -160px}#content .colset-2-its article .icon.icon-4{background-position:0 -240px}#content .colset-2-its article .icon.icon-5{background-position:0 -320px}#content .colset-2-its article .icon.icon-6{background-position:0 -400px}#content .colset-2-its article>h1{font-size:19px;font-weight:600;margin-bottom:0;line-height:30px}#content .colset-2-its article p{margin:0;line-height:24px;font-size:14px}#content .colset-3-article{padding-top:30px;padding-bottom:30px}#content .colset-3-article>h1{font-size:24px}#content .colset-3-article div.content{padding:20px;padding-bottom:5px}#content .colset-3-article article{float:left;width:29%;margin:10px 2%;-webkit-box-shadow:inset 0 0 0 1px rgba(0,0,0,0.1);box-shadow:inset 0 0 0 1px rgba(0,0,0,0.1)}#content .colset-3-article article .img{margin:-20px -20px 20px -20px;background-position:center top;height:180px}#content .colset-3-article article h1{margin:0;font-size:18px;font-weight:normal;line-height:25px}#content .colset-3-article article h1 a{color:#343437;cursor:pointer}#content .colset-3-article article h1 a:hover{color:#46a5c8}#content .colset-3-article article p,#content .colset-3-article article time{font-size:13px}#content .colset-3-article article .author a{color:#db4800}#content .colset-3-article article:first-child{padding-left:0}#content .colset-3-article article:last-child{padding-right:0}#content.page-1 .row{padding-top:10px;padding-bottom:10px}#content.page-1 .row h1{text-align:left;font-size:36px}#content.page-1 .row article{font-size:14px}#content.page-1 .row article .desc{font-size:16px}#content.page-1 .row article h1{margin:0;paddnig:0;text-align:left;font-size:26px}#content.page-1 .row article h2{margin:0;paddnig:0}#content.page-1 .row article h3{font-weight:bold}#content.page-1 .row article pre{display:block;background:#f2f2f2;padding:12px 20px}ul.nav-sidebar{margin:0;margin-top:20px;padding:5px 0;border:1px solid #EEE;list-style-type:none}ul.nav-sidebar li a{display:block;cursor:pointer;padding:5px 10px;font-weight:400;text-decoration:none;color:#343437}ul.nav-sidebar li.active a:hover,ul.nav-sidebar li a:hover{color:white;background-color:#db4800}ul.nav-sidebar li.active a{background-color:#f2f2f2}.table{margin:20px 0}.table thead tr th{padding:10px;font-weight:normal;font-size:18px}.table tbody tr td{vertical-align:top;font-size:12px;padding:10px;border-top:1px solid #EEE}*,*:after,*::before{-moz-box-sizing:border-box;box-sizing:border-box}body{background:#444;overflow:auto}html.noScroll{overflow:hidden}html.noScroll body,html.noScroll .st-container,html.noScroll .st-pusher,html.noScroll .st-content{overflow:hidden}.sign-in-fa-icon:before{font-family:FontAwesome;content:'\f090';padding-right:10px}.st-content{background:white}.st-content,.st-content-inner{position:relative;height:100%}.st-container{position:relative;overflow:hidden;-webkit-transition:margin .5s,-webkit-transform .5s;transition:margin .5s,transform .5s}.st-container.st-menu-open{margin:10px -15px -10px 15px}.st-pusher{position:relative;left:0;z-index:99;height:100%}.st-pusher::after{position:absolute;top:0;right:0;width:0;height:0;background:rgba(0,0,0,0.3);content:'';opacity:0;-webkit-transition:opacity .5s,width .1s .5s,height .1s .5s;transition:opacity .5s,width .1s .5s,height .1s .5s}.st-menu-open .st-pusher::after{width:100%;height:100%;opacity:1;-webkit-transition:opacity .5s;transition:opacity .5s}.st-menu{position:fixed;top:0;left:auto;z-index:100;visibility:hidden;width:300px;height:100%;background:#4298b8;-webkit-transition:all .5s;transition:all .5s;right:-600px}.st-menu::after{position:absolute;top:0;right:0;width:100%;height:100%;background:rgba(0,0,0,0.2);content:'';opacity:1;-webkit-transition:opacity .5s;transition:opacity .5s}.st-menu-open .st-menu::after{width:0;height:0;opacity:0;-webkit-transition:opacity .5s,width .1s .5s,height .1s .5s;transition:opacity .5s,width .1s .5s,height .1s .5s}.st-menu ul{margin:0;padding:0;list-style:none}.st-menu h2{margin:0;padding:1em;color:white;text-shadow:0 0 1px rgba(0,0,0,0.1);font-weight:300;font-size:2em}.st-menu ul li{display:block}.st-menu ul li a{display:block;position:relative;padding:1em 1em 1em 45px;outline:0;box-shadow:inset 0 -1px rgba(0,0,0,0.2);color:#f3efe0;text-shadow:0 0 1px rgba(255,255,255,0.1);letter-spacing:1px;font-weight:400;text-decoration:none}.st-menu ul li a span.fa{display:block;position:absolute;left:12px;top:17px;font-size:20px;width:30px;text-align:center}.st-menu ul li a span.fa.fa-tasks,.st-menu ul li a span.fa.fa-envelope{top:18px;font-size:18px}.st-menu ul li:first-child a{box-shadow:inset 0 -1px rgba(0,0,0,0.2),inset 0 1px rgba(0,0,0,0.2)}.st-menu ul li a:hover{background:rgba(0,0,0,0.2);box-shadow:inset 0 -1px rgba(0,0,0,0);color:#fff}.st-effect-9 .st-pusher{-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.st-effect-9.st-menu-open .st-pusher{-webkit-transform:translate3d(0,0,-300px);transform:translate3d(0,0,-300px)}.st-effect-9.st-menu{right:-600px;opacity:1;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.st-effect-9.st-menu-open .st-effect-9.st-menu{visibility:visible;right:-300px}.st-effect-9.st-menu::after{display:none}.presentations{margin-top:30px;margin-bottom:30px}.presentations img.screenshot{float:left;margin-right:40px;margin-top:1em;margin-bottom:0;width:300px;height:auto}.presentations .metadata{display:table-cell;min-width:328px}.presentations .title{margin-top:1em!important;margin-bottom:.5em!important}.presentations .speaker{color:#245f78;margin-bottom:.5em}.presentations .summary{line-height:1.3}.courses{margin-top:30px;margin-bottom:30px}.courses img.screenshot{float:left;margin-right:40px;margin-top:1em;margin-bottom:0;width:300px;height:auto}.courses .metadata{display:table-cell;min-width:328px}.courses .title{margin-top:1em!important;margin-bottom:.5em!important}.courses .instructor{color:#245f78;margin-bottom:.5em}.courses .description{line-height:1.3}@media screen and (max-width:767px){.presentations .img.screenshot,.video .metadata{float:none}}#content #toc{margin-bottom:1.25em;padding:1.25em;border-width:0;-webkit-border-radius:4px;border-radius:4px}#content #toc>:first-child{margin-top:0}#content #toc>:last-child{margin-bottom:0}#content #toc a{text-decoration:none}#content #toctitle{font-weight:bold;font-family:"Helvetica Neue","Helvetica",Helvetica,Arial,sans-serif;font-size:1em;padding-left:.125em}#content #toc ul{list-style-type:none;padding-left:.2em}
\ No newline at end of file
diff --git a/download.html b/download.html
new file mode 100644
index 0000000..7b38f74
--- /dev/null
+++ b/download.html
@@ -0,0 +1,98 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><title>The Apache Groovy programming language - Download</title><link href='img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='css/style.css'/>
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: 20px; right: -58px; border: 0; z-index: 100; transform: rotate(45deg);' src='/img/horizontal-github-ribbon.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/groovy-weekly.html' class='icon'><span class='fa fa-envelope-o'></span> Groovy newsletter</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+                <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span>
+                                    </button><a class='navbar-brand' href='index.html'>
+                                        <i class='fa fa-star'></i> Apache Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li class='active'><a href='/download.html'>Download</a></li><li class=''><a href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='/'>Contribute</a></li><li class=''><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li>
+                                            <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li class='active'><a href='download.html'><strong>Download Groovy</strong></a></li><li><a href='#distro' class='anchor-link'>Distributions</a></li><li><a href='#osinstall' class='anchor-link'>OS/package manager install</a></li><li><a href='#buildtools' class='anchor-link'>From your build tools</a></li><li><a href='#requirements' class='anchor-link'>System requirements</a></li><li><a href='versioning.html'>Groovy version scheme</a></li><li><a href='http://groovy-lang.org/indy.html'>Invoke dynamic support</a></li><li><a href='http://groovy-lang.org/releases.html'>Release notes</a></li></ul></div><div class='col-lg-8 col-lg-pull-0'><div id='contribute-btn'>
+                                            <button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/groovy-website/tree/asf-site/site/src/site/pages/download.groovy"'>
+                                                <i class='fa fa-pencil-square-o'></i> Improve this doc
+                                            </button>
+                                        </div><h1><i class='fa fa-cloud-download'></i> Download</h1><button id='big-download-button' type='button' class='btn btn-default' title='Download Apache Groovy 2.5.8 binary zip
+See below for verification information' onclick='window.location.href="https://dl.bintray.com/groovy/maven/apache-groovy-sdk-2.5.8.zip"'><i class='fa fa-download'></i> Download 2.5.8</button><article><p>Ways to get Apache Groovy:</p><ul><li>Download a source or binary <a href='#distro'>distribution</a>.</li><li>Use a package manager or bundle for your <a href='#osinstall'>operating system</a>.</li><li>Refer to the appropriate Apache Groovy jars from your <a href='#buildtools'>build tools</a>.</li><li>Grab the latest <a href='http://groovy-lang.org/ides.html'>plugin</a> for your IDE and follow the installation instructions.</li><li>Find the latest source code in the <a href='https://git-wip-us.apache.org/repos/asf/groovy.git'>Git repo</a> (or the <a href='https://github.com/apache/groovy'>GitHub mirror</a>).</li><li>If you&apos;re using Docker, Groovy is available on <a href='https://hub.docker.com/_/groovy/'>Docker Hub</a>.</li></ul></article><hr class='divider'/><a name='distro'></a><article><h1>Distributions</h1><p>Distributions are bundles of source or class files needed to build or use Groovy.</p><p>All Apache projects provide a source zip which lets anyone build the software from scratch. If any doubt arises, you can regard the source zip as the authoritative artifact for each release. We also provide binary, downloadable documentation and SDK (combines src, binary and docs) convenience artifacts. You can also find a link to a non-ASF Windows installer convenience executable (if available).</p><h3>Verification</h3><p>We provide OpenPGP signatures (&apos;.asc&apos;) files and checksums for every release artifact. We recommend that you <a href='https://www.apache.org/info/verification.html'>verify</a> the integrity of downloaded files by generating your own checksums and matching them against ours and checking signatures using the <a href='https://www.apache.org/dist/groovy/KEYS'>KEYS</a> file which contains the OpenPGP keys of Groovy&apos;s Release Managers across all releases.</p><h2><i class='fa fa-star'></i> Groovy 3.0</h2><p>Groovy 3.0 is a bleeding edge <a href='versioning.html'>version</a> of Groovy designed for JDK8+ and with the new Parrot parser enabled by default. Pre-stable versions are available:</p><h3>3.0.0-beta-3 distributions</h3><table width='100%' class='download-table'><tr><td><a href='https://dl.bintray.com/groovy/maven/apache-groovy-binary-3.0.0-beta-3.zip'><i class='fa fa-gears fa-4x'></i><br/>binary</a><br/>(<a href='https://archive.apache.org/dist/groovy/3.0.0-beta-3/distribution/apache-groovy-binary-3.0.0-beta-3.zip.asc'>asc</a> <a href='https://archive.apache.org/dist/groovy/3.0.0-beta-3/distribution/apache-groovy-binary-3.0.0-beta-3.zip.sha256'>sha256</a>)</td><td><a href='http://www.apache.org/dyn/closer.cgi/groovy/3.0.0-beta-3/sources/apache-groovy-src-3.0.0-beta-3.zip'><i class='fa fa-code fa-4x'></i><br/> source</a><br/>(<a href='https://www.apache.org/dist/groovy/3.0.0-beta-3/sources/apache-groovy-src-3.0.0-beta-3.zip.asc'>asc</a> <a href='https://www.apache.org/dist/groovy/3.0.0-beta-3/sources/apache-groovy-src-3.0.0-beta-3.zip.sha256'>sha256</a>)</td><td><a href='https://dl.bintray.com/groovy/maven/apache-groovy-docs-3.0.0-beta-3.zip'><i class='fa fa-file-text fa-4x'></i><br/> documentation</a><br/>(<a href='https://archive.apache.org/dist/groovy/3.0.0-beta-3/distribution/apache-groovy-docs-3.0.0-beta-3.zip.asc'>asc</a> <a href='https://archive.apache.org/dist/groovy/3.0.0-beta-3/distribution/apache-groovy-docs-3.0.0-beta-3.zip.sha256'>sha256</a>)</td><td><a href='https://dl.bintray.com/groovy/maven/apache-groovy-sdk-3.0.0-beta-3.zip'><i class='fa fa-file-zip-o fa-4x'></i><br/> SDK bundle</a><br/>(<a href='https://archive.apache.org/dist/groovy/3.0.0-beta-3/distribution/apache-groovy-sdk-3.0.0-beta-3.zip.asc'>asc</a> <a href='https://archive.apache.org/dist/groovy/3.0.0-beta-3/distribution/apache-groovy-sdk-3.0.0-beta-3.zip.sha256'>sha256</a>)</td><td><a href='https://dl.bintray.com/groovy/Distributions/groovy-3.0.0-beta-3-installer.exe'><i class='fa fa-windows fa-4x'></i><br/> Windows installer</a><br/>(community artifact)</td></tr></table><p>Please consult the <a href='http://groovy-lang.org/changelogs/changelog-3.0.0-beta-3.html'> change log</a> for details. </p><h2><i class='fa fa-star'></i> Groovy 2.6</h2><p>Groovy 2.6 is designed for JDK7+ and supports the new Parrot parser (when enabled) but has been retired before reaching final release to focus on Groovy 3.0. Alpha versions are available to help people wanting to port towards Groovy 3.0 but who are stuck on JDK7. See links under &quot;Other versions&quot; for details.</p><h2><i class='fa fa-star'></i> Groovy 2.5</h2><p>Groovy 2.5 is the latest stable <a href='versioning.html'>version</a> of Groovy.</p><h3>2.5.8 distributions</h3><table width='100%' class='download-table'><tr><td><a href='https://dl.bintray.com/groovy/maven/apache-groovy-binary-2.5.8.zip'><i class='fa fa-gears fa-4x'></i><br/>binary</a><br/>(<a href='https://archive.apache.org/dist/groovy/2.5.8/distribution/apache-groovy-binary-2.5.8.zip.asc'>asc</a> <a href='https://archive.apache.org/dist/groovy/2.5.8/distribution/apache-groovy-binary-2.5.8.zip.sha256'>sha256</a>)</td><td><a href='http://www.apache.org/dyn/closer.cgi/groovy/2.5.8/sources/apache-groovy-src-2.5.8.zip'><i class='fa fa-code fa-4x'></i><br/> source</a><br/>(<a href='https://www.apache.org/dist/groovy/2.5.8/sources/apache-groovy-src-2.5.8.zip.asc'>asc</a> <a href='https://www.apache.org/dist/groovy/2.5.8/sources/apache-groovy-src-2.5.8.zip.sha256'>sha256</a>)</td><td><a href='https://dl.bintray.com/groovy/maven/apache-groovy-docs-2.5.8.zip'><i class='fa fa-file-text fa-4x'></i><br/> documentation</a><br/>(<a href='https://archive.apache.org/dist/groovy/2.5.8/distribution/apache-groovy-docs-2.5.8.zip.asc'>asc</a> <a href='https://archive.apache.org/dist/groovy/2.5.8/distribution/apache-groovy-docs-2.5.8.zip.sha256'>sha256</a>)</td><td><a href='https://dl.bintray.com/groovy/maven/apache-groovy-sdk-2.5.8.zip'><i class='fa fa-file-zip-o fa-4x'></i><br/> SDK bundle</a><br/>(<a href='https://archive.apache.org/dist/groovy/2.5.8/distribution/apache-groovy-sdk-2.5.8.zip.asc'>asc</a> <a href='https://archive.apache.org/dist/groovy/2.5.8/distribution/apache-groovy-sdk-2.5.8.zip.sha256'>sha256</a>)</td><td><a href='https://dl.bintray.com/groovy/Distributions/groovy-2.5.8-installer.exe'><i class='fa fa-windows fa-4x'></i><br/> Windows installer</a><br/>(community artifact)</td></tr></table><p>Please consult the <a href='http://groovy-lang.org/changelogs/changelog-2.5.8.html'> change log</a> for details. </p><h2><i class='fa fa-star'></i> Groovy 2.4</h2><p>Groovy 2.4 is the previous stable <a href='versioning.html'>version</a> of Groovy. Important: Releases before 2.4.4 weren't done under the Apache Software Foundation and are provided as a convenience, without any warranty.</p><h3>2.4.17 distributions</h3><table width='100%' class='download-table'><tr><td><a href='https://dl.bintray.com/groovy/maven/apache-groovy-binary-2.4.17.zip'><i class='fa fa-gears fa-4x'></i><br/>binary</a><br/>(<a href='https://archive.apache.org/dist/groovy/2.4.17/distribution/apache-groovy-binary-2.4.17.zip.asc'>asc</a> <a href='https://archive.apache.org/dist/groovy/2.4.17/distribution/apache-groovy-binary-2.4.17.zip.sha256'>sha256</a>)</td><td><a href='http://www.apache.org/dyn/closer.cgi/groovy/2.4.17/sources/apache-groovy-src-2.4.17.zip'><i class='fa fa-code fa-4x'></i><br/> source</a><br/>(<a href='https://www.apache.org/dist/groovy/2.4.17/sources/apache-groovy-src-2.4.17.zip.asc'>asc</a> <a href='https://www.apache.org/dist/groovy/2.4.17/sources/apache-groovy-src-2.4.17.zip.sha256'>sha256</a>)</td><td><a href='https://dl.bintray.com/groovy/maven/apache-groovy-docs-2.4.17.zip'><i class='fa fa-file-text fa-4x'></i><br/> documentation</a><br/>(<a href='https://archive.apache.org/dist/groovy/2.4.17/distribution/apache-groovy-docs-2.4.17.zip.asc'>asc</a> <a href='https://archive.apache.org/dist/groovy/2.4.17/distribution/apache-groovy-docs-2.4.17.zip.sha256'>sha256</a>)</td><td><a href='https://dl.bintray.com/groovy/maven/apache-groovy-sdk-2.4.17.zip'><i class='fa fa-file-zip-o fa-4x'></i><br/> SDK bundle</a><br/>(<a href='https://archive.apache.org/dist/groovy/2.4.17/distribution/apache-groovy-sdk-2.4.17.zip.asc'>asc</a> <a href='https://archive.apache.org/dist/groovy/2.4.17/distribution/apache-groovy-sdk-2.4.17.zip.sha256'>sha256</a>)</td><td><a href='https://dl.bintray.com/groovy/Distributions/groovy-2.4.17-installer.exe'><i class='fa fa-windows fa-4x'></i><br/> Windows installer</a><br/>(community artifact)</td></tr></table><p>Please consult the <a href='http://groovy-lang.org/changelogs/changelog-2.4.17.html'> change log</a> for details. </p><article><h3>Other versions</h3><p>Downloads for all versions are hosted (and mirrored) in:<ul><li>Apache&apos;s <a href='http://www.apache.org/dyn/closer.cgi/groovy/'>release mirrors</a> and <a href='https://archive.apache.org/dist/groovy/'>archive repository</a>.</li><li>Bintray&apos;s <a href='http://bintray.com/groovy/'>Groovy repository</a>. Register on Bintray to rate, review, and register for new version notifications. Or <a href='https://dl.bintray.com/groovy/maven/'>browse</a> all versions.</li></ul></p><p>You can also read the changelogs for <a href='http://groovy-lang.org/changelogs.html'>all versions</a>.</p></article><article><h3>Invoke dynamic support</h3><p>Please read the <a href='http://groovy-lang.org/indy.html'>invoke dynamic support information</a> if you would like to enable indy support and are using Groovy on JDK 7+.</p></article></article><hr class='divider'/><a name='osinstall'></a><article><h1>Operating system/package manager installation</h1><p><a href='http://groovy-lang.org/install.html'>Installing</a> Apache Groovy from a distribution zip is not hard but if you don&apos;t want the hassle, consider the alternatives listed here.</p><article><p><a href='http://sdkman.io/'>SDKMAN!</a> is a tool for managing parallel versions of multiple Software Development Kits on most Unix-based systems:</p><pre><code>$ sdk install groovy</code></pre><p>Windows users: see the SDKMAN <a href='https://sdkman.io/install'>install</a> instructions for potential options.</p></article><article><p><a href='http://brew.sh/'>Homebrew</a> is &quot;the missing package manager for macOS&quot;:</p><pre><code>$ brew install groovy</code></pre></article><article><p><a href='https://snapcraft.io/'>SnapCraft</a> is &quot;the app store for Linux&quot;. Groovy is supported in the <a href='https://snapcraft.io/groovy'>store</a> or via the commandline:</p><pre><code>$ sudo snap install groovy --classic</code></pre></article><article><p><a href='http://www.macports.org/'>MacPorts</a> is a system for managing tools on macOS:</p><pre><code>$ sudo port install groovy</code></pre></article><article><p><a href='http://scoop.sh/'>Scoop</a> is a command-line installer for Windows inspired by Homebrew:</p><pre><code>> scoop install groovy</code></pre></article><article><p><a href='https://chocolatey.org/'>Chocolatey</a> provides a sane way to manage software on Windows:</p><pre><code>> choco install groovy</code></pre></article><p>Linux/*nix users: you may also find Groovy is available using your preferred operating system package manager, e.g.: apt, dpkg, pacman, etc.</p><p>Windows users: consider also the Windows installer (see links above under Distributions).</p></article><hr class='divider'/><a name='buildtools'></a><article><h1>From your build tools</h1><p>If you wish to add Groovy as a dependency in your projects, you can refer to the Groovy JARs in the dependency section of your project build file descriptor:</p><table class='table'><thead><tr><th>Gradle</th><th>Maven</th><th>Explanation</th></tr></thead><tbody><tr><td><code>org.codehaus.groovy:groovy:x.y.z</code></td><td><code>&lt;groupId&gt;org.codehaus.groovy&lt;/groupId&gt;</code><br/><code>&lt;artifactId&gt;groovy&lt;/artifactId&gt;</code><br/><code>&lt;version&gt;x.y.z&lt;/version&gt;</code></td><td>Just the core of Groovy without the modules*. Also includes jarjar'ed versions of Antlr, ASM, and an internal copy of needed CLI implementation classes.</td></tr><tr><td><code>org.codehaus.groovy:groovy-$module:x.y.z</code></td><td><code>&lt;groupId&gt;org.codehaus.groovy&lt;/groupId&gt;</code><br/><code>&lt;artifactId&gt;groovy-$module&lt;/artifactId&gt;</code><br/><code>&lt;version&gt;x.y.z&lt;/version&gt;</code></td><td><code>"$module"</code> stands for the different optional groovy modules*. Example: <code>&lt;artifactId&gt;groovy-sql&lt;/artifactId&gt;</code>.</td></tr><tr><td><code>org.codehaus.groovy:groovy-all:x.y.z</code></td><td><code>&lt;groupId&gt;org.codehaus.groovy&lt;/groupId&gt;</code><br/><code>&lt;artifactId&gt;groovy-all&lt;/artifactId&gt;</code><br/><code>&lt;version&gt;x.y.z&lt;/version&gt;</code><br/><code>&lt;type&gt;pom&lt;/type&gt; &lt;!-- required JUST since Groovy 2.5.0 --&gt;</code></td><td>Core plus all of the modules (excluding optional modules) according to the version packaging scheme**.</td></tr><tr><td colspan='3'>* Modules:<br/><em>2.4.X:</em> &quot;ant&quot;, &quot;bsf&quot;, &quot;console&quot;, &quot;docgenerator&quot;, &quot;groovydoc&quot;, &quot;groovysh&quot;, &quot;jmx&quot;, &quot;json&quot;, &quot;jsr223&quot;, &quot;nio&quot;, &quot;servlet&quot;, &quot;sql&quot;, &quot;swing&quot;, &quot;test&quot;, &quot;templates&quot;, &quot;testng&quot; and &quot;xml&quot;<br/><em>2.5.0:</em> as above but excluding optional module &quot;bsf&quot; plus &quot;cli-picocli&quot;, &quot;datetime&quot;, &quot;macro&quot;, &quot;test-junit5&quot;. Optional modules: &quot;bsf&quot;, &quot;dateutil&quot;, &quot;cli-commons&quot;<br/><em>2.5.1+:</em> as above but &quot;groovy-jaxb&quot; is moved to become optional</td></tr><tr><td colspan='3'>** Packaging Scheme:<br/><em>2.4.X:</em> The core plus all the modules merged into one &quot;fat jar&quot;. Optional dependencies are marked as optional, so you may need to include some of the optional dependencies to use some features of Groovy, e.g. AntBuilder, GroovyMBeans...<br/><em>2.5+:</em> A &quot;fat pom&quot; <code>groovy-all-x.y.z.pom</code> referring to the core plus all modules (excluding optional ones). In order to cater to the module system of Java 9+, the <code>groovy-all-x.y.z.jar</code> file is no longer available.</td></tr><tr><td colspan='3'>Indy jars<br/>You can access the indy version of the core or a module jar by using the &apos;indy&apos; classifier.</td></tr></tbody></table><h3>Maven repositories</h3><p>Groovy release jars are available from <a href='http://repo1.maven.org/maven2/org/codehaus/groovy/'>Maven Central</a> or <a href='http://jcenter.bintray.com/org/codehaus/groovy/'>JCenter</a>.</p><p>Groovy snapshot jars are available from <a href='https://oss.jfrog.org/oss-snapshot-local/org/codehaus/groovy'>JFrog OpenSource Snapshots repository</a>. Snapshots are not official releases but are provided to assist with integration testing leading up to an official release.</p></article><hr class='divider'/><a name='requirements'></a><article><h1>System requirements</h1><p><table class='table'><thead><tr><th>Groovy</th><th>JVM Required (non-indy)</th><th>JVM Required (indy) *</th></tr></thead><tbody><tr><td><b>3.0 - current</b></td><td>1.8+</td><td>1.8+</td></tr><tr><td><b>2.5 - 2.6</b></td><td>1.7+</td><td>1.7+</td></tr><tr><td><b>2.3 - 2.4</b></td><td>1.6+</td><td>1.7+</td></tr><tr><td><b>2.0 - 2.2</b></td><td>1.5+</td><td>1.7+</td></tr><tr><td><b>1.6 - 1.8</b></td><td>1.5+</td><td>N/A</td></tr><tr><td><b>1.5</b></td><td>1.4+</td><td>N/A</td></tr><tr><td><b>1.0</b></td><td>1.4-1.7</td><td>N/A</td></tr></tbody></table>* If you plan to use invoke dynamic support, please read the <a href='http://groovy-lang.org/indy.html'>support information</a>.</p></article></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='/download.html'>Download</a></li><li><a href='http://groovy-lang.org/support.html'>Support</a></li><li><a href='/'>Contribute</a></li><li><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='http://groovy-lang.org/security.html'>Security</a></li><li><a href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='http://groovy-lang.org/search.html'>Search</a></li>
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a href='http://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='http://groovy-lang.org/groovy-weekly.html'>Groovy newsletter</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='http://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li>
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community
+                                        </p><img src='img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' class='img-responsive'/>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2019 the Apache Groovy project &mdash; Groovy is Open Source, <a href='http://www.apache.org/licenses/LICENSE-2.0.html'>Apache 2 License</a></div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='js/vendor/jquery-1.10.2.min.js' defer></script><script src='js/vendor/classie.js' defer></script><script src='js/vendor/bootstrap.js' defer></script><script src='js/vendor/sidebarEffects.js' defer></script><script src='js/vendor/modernizr-2.6.2.min.js' defer></script><script src='js/plugins.js' defer></script><script>
+          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file
diff --git a/faq.html b/faq.html
new file mode 100644
index 0000000..86758ba
--- /dev/null
+++ b/faq.html
@@ -0,0 +1,97 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><title>The Apache Groovy programming language - FAQ - Frequently Asked Questions</title><link href='img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='css/style.css'/>
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: 20px; right: -58px; border: 0; z-index: 100; transform: rotate(45deg);' src='/img/horizontal-github-ribbon.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/groovy-weekly.html' class='icon'><span class='fa fa-envelope-o'></span> Groovy newsletter</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+                <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span>
+                                    </button><a class='navbar-brand' href='index.html'>
+                                        <i class='fa fa-star'></i> Apache Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li class='active'><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li class=''><a href='/download.html'>Download</a></li><li class=''><a href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='/'>Contribute</a></li><li class=''><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li>
+                                            <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='documentation.html'>Documentation</a></li><li><a href='documentation.html#all-versions' class='anchor-link'>Documentation for other versions</a></li><li class='active'><a href='faq.html'><strong>FAQ</strong></a></li></ul></div><div class='col-lg-8 col-lg-pull-0'><div id='contribute-btn'>
+                                            <button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/groovy-website/tree/asf-site/site/src/site/pages/faq.groovy"'>
+                                                <i class='fa fa-pencil-square-o'></i> Improve this doc
+                                            </button>
+                                        </div><h1><i class='fa fa-question-circle'></i> Frequently Asked Questions</h1><hr class='divider'/><article><h2>Is Groovy an Open Source project?</h2><p>Yes, Groovy is an Open Source programming language project, licensed under the <a href='http://www.apache.org/licenses/LICENSE-2.0'>Apache License v2</a>. You can see the license header in all the source files of the project, as well as a <a href='https://github.com/apache/groovy/blob/master/LICENSE'>license file</a> at the root of the project</p><h2>What are the differences between Groovy and Java?</h2><p>Learn more about the <a href='differences.html'>differences between Groovy and Java</a>.</p></article></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='/download.html'>Download</a></li><li><a href='http://groovy-lang.org/support.html'>Support</a></li><li><a href='/'>Contribute</a></li><li><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='http://groovy-lang.org/security.html'>Security</a></li><li><a href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='http://groovy-lang.org/search.html'>Search</a></li>
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a href='http://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='http://groovy-lang.org/groovy-weekly.html'>Groovy newsletter</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='http://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li>
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community
+                                        </p><img src='img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' class='img-responsive'/>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2019 the Apache Groovy project &mdash; Groovy is Open Source, <a href='http://www.apache.org/licenses/LICENSE-2.0.html'>Apache 2 License</a></div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='js/vendor/jquery-1.10.2.min.js' defer></script><script src='js/vendor/classie.js' defer></script><script src='js/vendor/bootstrap.js' defer></script><script src='js/vendor/sidebarEffects.js' defer></script><script src='js/vendor/modernizr-2.6.2.min.js' defer></script><script src='js/plugins.js' defer></script><script>
+          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file
diff --git a/site/src/site/assets/fonts/FontAwesome.otf b/fonts/FontAwesome.otf
similarity index 100%
rename from site/src/site/assets/fonts/FontAwesome.otf
rename to fonts/FontAwesome.otf
Binary files differ
diff --git a/site/src/site/assets/fonts/fontawesome-webfont.eot b/fonts/fontawesome-webfont.eot
similarity index 100%
rename from site/src/site/assets/fonts/fontawesome-webfont.eot
rename to fonts/fontawesome-webfont.eot
Binary files differ
diff --git a/site/src/site/assets/fonts/fontawesome-webfont.svg b/fonts/fontawesome-webfont.svg
similarity index 100%
rename from site/src/site/assets/fonts/fontawesome-webfont.svg
rename to fonts/fontawesome-webfont.svg
diff --git a/site/src/site/assets/fonts/fontawesome-webfont.ttf b/fonts/fontawesome-webfont.ttf
similarity index 100%
rename from site/src/site/assets/fonts/fontawesome-webfont.ttf
rename to fonts/fontawesome-webfont.ttf
Binary files differ
diff --git a/site/src/site/assets/fonts/fontawesome-webfont.woff b/fonts/fontawesome-webfont.woff
similarity index 100%
rename from site/src/site/assets/fonts/fontawesome-webfont.woff
rename to fonts/fontawesome-webfont.woff
Binary files differ
diff --git a/generator/build.gradle b/generator/build.gradle
deleted file mode 100644
index 5f36eb0..0000000
--- a/generator/build.gradle
+++ /dev/null
@@ -1,17 +0,0 @@
-apply plugin: 'groovy'
-
-repositories {
-    jcenter()
-}
-
-dependencies {
-    ext.groovyVersion = '2.4.8'
-    ext.asciidocVersion = '1.5.4.1'
-    compile "org.codehaus.groovy:groovy:$groovyVersion"
-    compile "org.codehaus.groovy:groovy-json:$groovyVersion"
-    compile "org.codehaus.groovy:groovy-templates:$groovyVersion"
-    compile "org.asciidoctor:asciidoctorj:$asciidocVersion"
-}
-
-compileGroovy.sourceCompatibility = '1.7'
-compileGroovy.targetCompatibility = '1.7'
\ No newline at end of file
diff --git a/generator/src/main/groovy/generator/AsciidoctorFactory.groovy b/generator/src/main/groovy/generator/AsciidoctorFactory.groovy
deleted file mode 100644
index 72d48dd..0000000
--- a/generator/src/main/groovy/generator/AsciidoctorFactory.groovy
+++ /dev/null
@@ -1,9 +0,0 @@
-package generator
-
-import groovy.transform.CompileStatic
-import org.asciidoctor.Asciidoctor
-
-@CompileStatic
-class AsciidoctorFactory {
-    @Lazy static Asciidoctor instance = Asciidoctor.Factory.create()
-}
diff --git a/generator/src/main/groovy/generator/ChangelogParser.groovy b/generator/src/main/groovy/generator/ChangelogParser.groovy
deleted file mode 100644
index ee84faa..0000000
--- a/generator/src/main/groovy/generator/ChangelogParser.groovy
+++ /dev/null
@@ -1,104 +0,0 @@
-package generator
-
-import groovy.json.JsonSlurper
-import model.Changelog
-import model.Issue
-
-import java.util.regex.Pattern
-
-class ChangelogParser {
-    private static final String JIRA_SERVER = 'https://issues.apache.org/jira'
-    private static final String PROJECT_NAME = 'GROOVY'
-    private static final String PROJECT_ID = '12318123'
-
-    private static final String LOGNOTES_INTRO = /Release Notes - Groovy/
-    private static final String LOGNOTES_END = /<\/textarea>/
-    private static final String BUGTYPE_MARK = '** '
-    private static final String ITEM_MARK = '    * '
-    private static final Pattern ITEM_PATTERN = ~/\[(GROOVY-[0-9]+)\] - (.+)/
-    private static final String VERSION_PATTERN = /^((1\.)|[23]\.)/
-
-    static List<Changelog> fetchReleaseNotes(File cacheDirectory) {
-        def slurper = new JsonSlurper()
-        def versions = slurper.parse("$JIRA_SERVER/rest/api/2/project/$PROJECT_NAME/versions".toURL())
-        def versionMap = versions.findAll {
-            it.name =~ VERSION_PATTERN &&
-                    it.released == true
-        }.collectEntries {
-            [fixName(it.name), it.id]
-        }
-
-        def raw = versionMap.collect { name, id ->
-            println "Fetching changelog for version $name"
-            new Changelog(groovyVersion: name, issues: changelogHTML(id, cacheDirectory))
-        }
-        createAggregates(raw, versionMap.keySet())
-    }
-
-    private static String fixName(String name) {
-        String id = name
-        String classifier = ''
-
-        int idx = name.indexOf('-')
-        if (idx>0) {
-            classifier = name.substring(idx)
-            id = name - classifier
-        }
-        if (id.count('.')<2) {
-            // groovy 2.0 instead of 2.0.0
-            id = "${id}.0"
-        }
-        "$id$classifier"
-    }
-
-    private static List<Changelog> createAggregates(final List<Changelog> changelogs, final Set<String> releasedVersions) {
-        def allMajor = changelogs.groupBy {
-            def v = it.groovyVersion
-            v.contains('-')?v-v.substring(v.indexOf('-')):v
-        }.findAll { ver, logs -> ver in releasedVersions }
-        allMajor.collect { k,v ->
-            def changelog = changelogs.find { it.groovyVersion == k }
-            if (!changelog) {
-                println "Not found: $k"
-                changelog = new Changelog(groovyVersion: k, issues:[])
-                changelogs << changelog
-            }
-            v.each {
-                changelog.issues = [*changelog.issues, *it.issues].unique().sort { it.id }
-            }
-        }
-        changelogs
-    }
-
-    private static List<Issue> changelogHTML(String id, File cacheDir) {
-        def cache = new File(cacheDir, "changelog-${id}.html")
-        def log
-        if (cache.exists()) {
-            log = cache.getText('UTF-8')
-        } else {
-            log = new URL("$JIRA_SERVER/secure/ReleaseNote.jspa?version=$id&styleName=Text&projectId=$PROJECT_ID").getText('UTF-8')
-            cache.write(log, 'UTF-8')
-        }
-        boolean inNotes = false
-        String type = null
-        List<Issue> issues = []
-
-        log.eachLine { line ->
-            if (line.startsWith(LOGNOTES_INTRO)) {
-                inNotes = true
-            } else if (line.startsWith(LOGNOTES_END)) {
-                inNotes = false
-            } else if (inNotes) {
-                if (line.startsWith(BUGTYPE_MARK)) {
-                    type = line - BUGTYPE_MARK
-                } else if (line.startsWith(ITEM_MARK)) {
-                    def m = ITEM_PATTERN.matcher(line)
-                    m.find()
-                    issues << new Issue(id: m.group(1), description: m.group(2), type: type)
-                }
-            }
-        }
-
-        issues
-    }
-}
diff --git a/generator/src/main/groovy/generator/DocUtils.groovy b/generator/src/main/groovy/generator/DocUtils.groovy
deleted file mode 100644
index 49d8609..0000000
--- a/generator/src/main/groovy/generator/DocUtils.groovy
+++ /dev/null
@@ -1,5 +0,0 @@
-package generator
-
-class DocUtils {
-    @Lazy public static final String DOCS_BASEURL = System.getProperty('docs_baseurl')
-}
diff --git a/generator/src/main/groovy/generator/DocumentationHTMLCleaner.groovy b/generator/src/main/groovy/generator/DocumentationHTMLCleaner.groovy
deleted file mode 100644
index fafa9db..0000000
--- a/generator/src/main/groovy/generator/DocumentationHTMLCleaner.groovy
+++ /dev/null
@@ -1,101 +0,0 @@
-package generator
-
-import groovy.transform.CompileStatic
-
-/**
- * This class is responsible for downloading a documentation page as generated through the Asciidoctor task
- * of the Groovy build, then filter its contents in order to return only the body of the documentation, as HTML.
- *
- * @author Cédric Champeau
- */
-@CompileStatic
-class DocumentationHTMLCleaner {
-    private final static String BODY_START = /<body/
-    private final static String BODY_END = /<\/body/
-    private final static String TOC_START = /<div id="toc"/
-    private final static String MAIN_START = /<div id="content"/
-    private final static String MAIN_END = /<div id="footer"/
-
-    /**
-     * A list of links which are badly generated, but we know how to fix them
-     */
-    private final static Map<String,String> KNOWN_REPLACEMENTS = [
-        /docs\.groovy-lang\.org\/(latest|next)\/html\/documentation\/gdk\.html/: 'groovy-lang.org/gdk.html',
-        /\/maven\/groovy-/: '/maven/apache-groovy-'
-    ]
-
-    private static String cleanupPage(String location) {
-        def url = location.toURL()
-        try {
-            def fullHTML = url.getText('utf-8')
-            return extractBetween(fullHTML, BODY_START, BODY_END)
-        } catch (FileNotFoundException e) {
-            // 404 not found
-        }
-
-        null
-    }
-
-    private static String extractBetween(String html, String startString, String endString) {
-        def start = html.indexOf(startString)
-        if (start > 0) {
-            start = html.indexOf('>', start) + 1
-        }
-        if (start > 1) {
-            def end = html.indexOf(endString, start)
-            if (end > start) {
-                return html.substring(start, end)
-            }
-        }
-        null
-    }
-
-    public static DocPage parsePage(String location) {
-        String contents = cleanupPage(location)
-        if (contents==null) {
-            return new DocPage(content: "Contents not found for <a href='$location'>$location</a>, most likely because this section has not yet been written.")
-        }
-        String toc = extractTOC(contents)?:''
-        String main = extractBetween(contents, MAIN_START, MAIN_END)?:"Main body not found for <a href='$location'>$location</a>"
-        main = replaceInternalLinks(main)
-        new DocPage(toc: toc, content: main)
-    }
-
-    private static String replaceInternalLinks(String html) {
-        def replacer = { List<String> it ->
-            def (String tag, String attr, String url) = [it[1], it[2], it[3]]
-            url = url.replaceAll(/x(.+)\.(?:pagespeed.+)/, '$1')
-            if (!url.startsWith('http') && !url.startsWith('#') && 'target.html'!=url) {
-                "$tag $attr'${DocUtils.DOCS_BASEURL}/html/documentation/$url'"
-            } else {
-                it[0]
-            }
-        }
-        html = html.replaceAll(/(a)\s+(href=)["'](.+?)["']/,replacer)
-        html = html.replaceAll(/(img)\s+(src=)["'](.+?)["']/,replacer)
-        KNOWN_REPLACEMENTS.each { link, repl ->
-            html = html.replaceAll(link, repl)
-        }
-        html
-    }
-
-    private static String extractTOC(final String html) {
-        int start = html.indexOf(TOC_START)
-        if (start > 0) {
-            int end = html.indexOf(MAIN_START)
-            if (end>0) {
-                def out = html.substring(start, end).replace("<div id=\"toctitle\">Table of Contents</div>", "")
-                end = out.size()-1
-                while (!out.substring(end, out.size()).startsWith('</div>')) end--
-                return out.substring(0, end)
-            }
-        }
-        null
-    }
-
-    static class DocPage {
-        String toc = ''
-        String content
-    }
-
-}
diff --git a/generator/src/main/groovy/generator/PageTemplate.groovy b/generator/src/main/groovy/generator/PageTemplate.groovy
deleted file mode 100644
index cb753f8..0000000
--- a/generator/src/main/groovy/generator/PageTemplate.groovy
+++ /dev/null
@@ -1,61 +0,0 @@
-package generator
-
-import groovy.text.markup.BaseTemplate
-import groovy.text.markup.MarkupTemplateEngine
-import groovy.text.markup.TemplateConfiguration
-import groovy.transform.CompileStatic
-import org.asciidoctor.Asciidoctor
-import org.asciidoctor.AttributesBuilder
-
-@CompileStatic
-abstract class PageTemplate extends BaseTemplate {
-    public static final String BASEDIR = "basePath";
-
-    private final Map model
-
-    PageTemplate(
-            final MarkupTemplateEngine templateEngine,
-            final Map model, final Map<String, String> modelTypes, final TemplateConfiguration configuration) {
-        super(templateEngine, model, modelTypes, configuration)
-        this.model = model
-    }
-
-    String relative(String path) {
-        String base = (String) model.get(BASEDIR)
-        if (base && !path.startsWith('http') && !path.startsWith(File.separator)) {
-            String up = "..${File.separator}"
-            "${up*(1+base.count(File.separator))}$path"
-        } else {
-            path
-        }
-    }
-
-    /**
-     * Converts and outputs asciidoctor markup into HTML
-     * @param body the asciidoctor markup
-     */
-    void asciidoc(String body, Map options=[:]) {
-        yieldUnescaped asciidocText(body, options)
-    }
-
-    /**
-     * Converts and returns asciidoctor markup into HTML. This method
-     * does *not* automatically renders the result so it is possible
-     * to post-process the generated HTML.
-     * @param body the asciidoctor markup
-     */
-    String asciidocText(String body, Map options=[:]) {
-        def asciidoctor = AsciidoctorFactory.instance
-        def attributes = options.attributes
-        if (!attributes) {
-            attributes = [:]
-            options.put('attributes', attributes)
-        }
-        attributes['source-highlighter'] = 'prettify'
-        asciidoctor.convert(body,options)
-    }
-
-    String latestDocURL(String target) {
-        "${DocUtils.DOCS_BASEURL}/html/$target"
-    }
-}
diff --git a/generator/src/main/groovy/generator/SiteGenerator.groovy b/generator/src/main/groovy/generator/SiteGenerator.groovy
deleted file mode 100644
index 77c9c48..0000000
--- a/generator/src/main/groovy/generator/SiteGenerator.groovy
+++ /dev/null
@@ -1,251 +0,0 @@
-package generator
-
-import groovy.text.markup.MarkupTemplateEngine
-import groovy.text.markup.TemplateConfiguration
-import groovy.transform.CompileStatic
-import model.Changelog
-import model.Page
-import model.Section
-import model.SectionItem
-import model.SiteMap
-
-import java.nio.file.FileSystems
-import java.nio.file.Path
-import java.nio.file.WatchEvent
-
-import static generator.DocumentationHTMLCleaner.cleanupPage
-import static generator.DocumentationHTMLCleaner.parsePage
-import static java.nio.file.StandardWatchEventKinds.*
-
-@CompileStatic
-class SiteGenerator {
-
-    private final static Closure SEMANTIC_SORT = { String v1, String v2 ->
-        List<String> items1 = decomposeVersion(v1)
-        List<String> items2 = decomposeVersion(v2)
-        for (int i=0; i<Math.max(items1.size(),items2.size());i++) {
-            if (i>=items2.size()) {
-                return 1
-            }
-            if (i>=items1.size()) {
-                return -1
-            }
-            def p1 = items1[i]
-            def p2 = items2[i]
-            if (p1.isNumber()) {
-                if (p2.isNumber()) {
-                    def pi1 = p1.toInteger()
-                    def pi2 = p2.toInteger()
-
-                    if (pi1 < pi2) {
-                        return 1
-                    } else if (pi1 > pi2) {
-                        return -1
-                    }
-                } else {
-                    return -1
-                }
-            } else if (p2.isNumber()) {
-                return 1
-            } else {
-                return p2 <=> p1
-            }
-        }
-        0
-    }
-
-    File sourcesDir
-    File outputDir
-
-    private MarkupTemplateEngine tplEngine
-    private SiteMap siteMap
-
-    void setup() {
-
-        println "Generating website using Groovy ${GroovySystem.version}"
-
-        def tplConf = new TemplateConfiguration()
-        tplConf.autoIndent = true
-        tplConf.autoNewLine = true
-        tplConf.baseTemplateClass = PageTemplate
-
-        def classLoader = new URLClassLoader([sourcesDir.toURI().toURL()] as URL[], this.class.classLoader)
-        tplEngine = new MarkupTemplateEngine(classLoader, tplConf, new MarkupTemplateEngine.CachingTemplateResolver())
-
-        siteMap = SiteMap.from(new File(sourcesDir, "sitemap.groovy"))
-
-    }
-
-    void render(String page, String target = null, Map model = [:], String baseDir=null) {
-        model.menu = siteMap.menu
-        model.currentPage = target
-        target = target ?: page
-        File root
-        if (baseDir) {
-            root = new File(outputDir, baseDir)
-            model[PageTemplate.BASEDIR] = baseDir
-            root.mkdirs()
-        } else {
-            root = outputDir
-        }
-
-        new File(root,"${target}.html").write(tplEngine.createTemplateByPath("pages/${page}.groovy").make(model).toString(), 'utf-8')
-    }
-
-    void generateSite() {
-        long sd = System.currentTimeMillis()
-        setup()
-
-        def cacheDir = new File(new File('build'), 'cache')
-        cacheDir.mkdirs()
-        println "Cache directory: $cacheDir"
-        def changelogs = ChangelogParser.fetchReleaseNotes(cacheDir);
-
-        renderDocumentation()
-
-        renderPages(changelogs)
-
-        renderChangelogs(changelogs)
-
-        renderReleaseNotes()
-
-        renderWiki()
-
-
-        long dur = System.currentTimeMillis() - sd
-        println "Generated site into $outputDir in ${dur}ms"
-    }
-
-    private List<Section> renderDocumentation() {
-        siteMap.documentationSections.each { Section section ->
-            section.items.each { SectionItem item ->
-                if (item.generate) {
-                    println "Generating documentation page [$item.name]"
-                    render 'docpage', item.targetFilename, [
-                            category: 'Learn',
-                            title   : item.name,
-                            page    : parsePage("${DocUtils.DOCS_BASEURL}/html/documentation/${item.sourceFilename}.html")]
-                }
-            }
-        }
-    }
-
-    private List<Page> renderPages(List<Changelog> changelogs) {
-        siteMap.pages.each { Page page ->
-            println "Rendering individual page [$page.source]"
-            if ('changelogs' == page.source) {
-                page.model.versions = changelogs.groovyVersion.sort(SEMANTIC_SORT)
-            }
-            render page.source, page.target, page.model
-        }
-    }
-
-    private List<Changelog> renderChangelogs(List<Changelog> changelogs) {
-        changelogs.each {
-            println "Rendering changelog for Groovy $it.groovyVersion"
-            render 'changelog', "changelog-$it.groovyVersion", [groovyVersion: it.groovyVersion, issues: it.issues], 'changelogs'
-        }
-    }
-
-    private void renderReleaseNotes() {
-        def releaseNotesVersions = new TreeSet<String>(new Comparator<String>() {
-            @Override
-            int compare(final String v1, final String v2) {
-                v2.toDouble() <=> v1.toDouble()
-            }
-        })
-        new File(sourcesDir, 'releasenotes').eachFile { File file ->
-            def name = file.name.substring(0, file.name.lastIndexOf('.adoc'))
-            def version = name - 'groovy-'
-            releaseNotesVersions << version
-            println "Rendering release notes for Groovy $version"
-            render 'release-notes', name, [notes: file.getText('utf-8'), groovyVersion: version], 'releasenotes'
-        }
-        render 'releases', 'releases', [versions: releaseNotesVersions]
-    }
-
-    private void renderWiki() {
-        def asciidoctor = AsciidoctorFactory.instance
-        println "Rendering wiki"
-
-        def wikiDir = new File(sourcesDir, "wiki")
-        wikiDir.eachFileRecurse { f->
-            if (f.name.endsWith('.adoc')) {
-                def header = asciidoctor.readDocumentHeader(f)
-                def bn = f.name.substring(0,f.name.lastIndexOf('.adoc'))
-                println "Rendering $header.documentTitle.main by ${header.author?.fullName}"
-                def relativePath = []
-                def p = f.parentFile
-                while (p!=wikiDir) {
-                    relativePath << p.name
-                    p = p.parentFile
-                }
-                String baseDir = relativePath?"wiki${File.separator}${relativePath.join(File.separator)}":'wiki'
-                render 'wiki', bn, [notes:f.getText('utf-8'), header: header], baseDir
-                println baseDir
-            }
-        }
-    }
-
-    static void main(String... args) {
-        def sourcesDir = args[0] as File
-        def outputDir = args[1] as File
-        def generator = new SiteGenerator(sourcesDir: sourcesDir, outputDir: outputDir)
-        boolean watchMode = args.length > 2 ? Boolean.valueOf(args[2]) : false
-        generator.generateSite()
-
-        if (watchMode) {
-            println "Started watch mode"
-            def watcher = FileSystems.default.newWatchService()
-
-            sourcesDir.toPath().register(watcher,
-                    ENTRY_CREATE,
-                    ENTRY_DELETE,
-                    ENTRY_MODIFY)
-
-            sourcesDir.eachDirRecurse { File f ->
-                f.toPath().register(watcher,
-                        ENTRY_CREATE,
-                        ENTRY_DELETE,
-                        ENTRY_MODIFY)
-            }
-
-            def existingDirectories = ['pages', 'layouts', 'includes', 'html', 'assets', 'css', 'fonts', 'img', 'js', 'vendor']
-
-            while (true) {
-                def key = watcher.take()
-                def pollEvents = (List<WatchEvent<Path>>) key.pollEvents()
-
-                def changed = pollEvents.collect { "${it.context()}".toString() }.join(', ')
-
-                // only generate when the event refers to the actual file modified / created / added
-                // as otherwise the watcher service generates two events:
-                // 1) one for directory containing the modified file, and
-                // 2) one for the actual file being modified
-                // this checks avoid getting two events for one change
-                if (existingDirectories.every { !changed.contains(it) }) {
-                    try {
-                        println "Regenerating site due to changes in: ${changed}"
-                        // todo: selective regeneration
-                        generator.generateSite()
-                    } finally {
-                        key.reset()
-                    }
-                }
-            }
-        }
-    }
-
-    static List<String> decomposeVersion(String version) {
-        String qualifier = ''
-        if (version.indexOf('-')>0) {
-            qualifier = version.substring(version.indexOf('-'))
-            version = version - qualifier
-        }
-        List<String> parts = version.split(/\./).toList()
-        if (qualifier) {
-            parts << qualifier
-        }
-        parts
-    }
-}
diff --git a/generator/src/main/groovy/model/Book.groovy b/generator/src/main/groovy/model/Book.groovy
deleted file mode 100644
index 4537ace..0000000
--- a/generator/src/main/groovy/model/Book.groovy
+++ /dev/null
@@ -1,17 +0,0 @@
-package model
-
-import groovy.transform.CompileStatic
-
-@CompileStatic
-class Book {
-    String title
-    String authors
-    String cover
-    String url
-    String description
-
-    void authors    (String authors)     { this.authors     = authors }
-    void cover      (String cover)       { this.cover       = cover }
-    void url        (String url)         { this.url         = url }
-    void description(String description) { this.description = description }
-}
diff --git a/generator/src/main/groovy/model/Changelog.groovy b/generator/src/main/groovy/model/Changelog.groovy
deleted file mode 100644
index b7ba910..0000000
--- a/generator/src/main/groovy/model/Changelog.groovy
+++ /dev/null
@@ -1,11 +0,0 @@
-package model
-
-import groovy.transform.CompileStatic
-import groovy.transform.ToString
-
-@CompileStatic
-@ToString
-class Changelog {
-    String groovyVersion
-    List<Issue> issues
-}
diff --git a/generator/src/main/groovy/model/Course.groovy b/generator/src/main/groovy/model/Course.groovy
deleted file mode 100644
index 68f8618..0000000
--- a/generator/src/main/groovy/model/Course.groovy
+++ /dev/null
@@ -1,34 +0,0 @@
-package model
-
-import groovy.transform.CompileStatic
-
-@CompileStatic
-class Course {
-
-    String title
-    String instructor
-    String url
-    String description
-    String cover
-
-    void title(String title) {
-        this.title = title
-    }
-
-    void instructor(String instructor) {
-        this.instructor = instructor
-    }
-
-    void url(String url){
-        this.url = url
-    }
-
-    void description(String description){
-        this.description = description
-    }
-
-    void cover(String cover){
-        this.cover = cover
-    }
-
-}
diff --git a/generator/src/main/groovy/model/Distribution.groovy b/generator/src/main/groovy/model/Distribution.groovy
deleted file mode 100644
index 55ef17c..0000000
--- a/generator/src/main/groovy/model/Distribution.groovy
+++ /dev/null
@@ -1,19 +0,0 @@
-package model
-
-import groovy.transform.CompileStatic
-
-@CompileStatic
-class Distribution {
-    String name
-    Closure description
-    List<DownloadPackage> packages = []
-
-    void description(Closure cl) { this.description = cl }
-
-    void version(String name, Closure versionSpec) {
-        DownloadPackage pkg = new DownloadPackage(version:name)
-        def clone = versionSpec.rehydrate(pkg,pkg,pkg)
-        clone()
-        packages.add(pkg)
-    }
-}
diff --git a/generator/src/main/groovy/model/DownloadPackage.groovy b/generator/src/main/groovy/model/DownloadPackage.groovy
deleted file mode 100644
index 152fa8d..0000000
--- a/generator/src/main/groovy/model/DownloadPackage.groovy
+++ /dev/null
@@ -1,23 +0,0 @@
-package model
-
-import groovy.transform.CompileStatic
-
-@CompileStatic
-class DownloadPackage {
-    String version
-    String releaseNotes
-    String windowsInstaller
-    boolean stable = false
-
-    void releaseNotes(String notes) {
-        releaseNotes = notes
-    }
-
-    void windowsInstaller(String installer) {
-        windowsInstaller = installer
-    }
-
-    void stable(boolean b) {
-        stable = b
-    }
-}
diff --git a/generator/src/main/groovy/model/Ecosystem.groovy b/generator/src/main/groovy/model/Ecosystem.groovy
deleted file mode 100644
index 17a102f..0000000
--- a/generator/src/main/groovy/model/Ecosystem.groovy
+++ /dev/null
@@ -1,13 +0,0 @@
-package model
-
-import groovy.transform.CompileStatic
-
-@CompileStatic
-class Ecosystem extends LinkedHashMap<String,EcosystemEntry> {
-    void project(String name, Closure entrySpec) {
-        def entry = new EcosystemEntry(name:name)
-        def clone = entrySpec.rehydrate(entry,entry,entry)
-        clone()
-        put(name, entry)
-    }
-}
diff --git a/generator/src/main/groovy/model/EcosystemEntry.groovy b/generator/src/main/groovy/model/EcosystemEntry.groovy
deleted file mode 100644
index 55dc9fd..0000000
--- a/generator/src/main/groovy/model/EcosystemEntry.groovy
+++ /dev/null
@@ -1,18 +0,0 @@
-package model
-
-import groovy.transform.ToString
-
-import groovy.transform.CompileStatic
-
-@CompileStatic
-@ToString(includeNames=true)
-class EcosystemEntry {
-    String name
-    String url
-    String description
-    String logo
-
-    void url(String url) { this.url = url }
-    void description(String description) { this.description = description }
-    void logo(String logo) { this.logo = logo }
-}
diff --git a/generator/src/main/groovy/model/Event.groovy b/generator/src/main/groovy/model/Event.groovy
deleted file mode 100644
index 6eaf7d7..0000000
--- a/generator/src/main/groovy/model/Event.groovy
+++ /dev/null
@@ -1,19 +0,0 @@
-package model
-
-import groovy.transform.CompileStatic
-
-@CompileStatic
-class Event {
-    String name
-    String location
-    String date
-    String description
-    String url
-    String logo
-
-    void location   (String location)    { this.location    = location }
-    void date       (String date)        { this.date        = date }
-    void description(String description) { this.description = description }
-    void url        (String url)         { this.url         = url }
-    void logo       (String logo)        { this.logo        = logo }
-}
diff --git a/generator/src/main/groovy/model/Events.groovy b/generator/src/main/groovy/model/Events.groovy
deleted file mode 100644
index 8767dec..0000000
--- a/generator/src/main/groovy/model/Events.groovy
+++ /dev/null
@@ -1,13 +0,0 @@
-package model
-
-import groovy.transform.CompileStatic
-
-@CompileStatic
-class Events extends LinkedHashMap<String, Event> {
-    void event(String name, Closure eventClosure) {
-        def entry = new Event(name: name)
-        def clone = eventClosure.rehydrate(entry, entry, entry)
-        clone()
-        put(name, entry)
-    }
-}
diff --git a/generator/src/main/groovy/model/Issue.groovy b/generator/src/main/groovy/model/Issue.groovy
deleted file mode 100644
index db4b1ee..0000000
--- a/generator/src/main/groovy/model/Issue.groovy
+++ /dev/null
@@ -1,14 +0,0 @@
-package model
-
-import groovy.transform.CompileStatic
-import groovy.transform.EqualsAndHashCode
-import groovy.transform.ToString
-
-@CompileStatic
-@ToString
-@EqualsAndHashCode
-class Issue {
-    String id
-    String type
-    String description
-}
diff --git a/generator/src/main/groovy/model/Library.groovy b/generator/src/main/groovy/model/Library.groovy
deleted file mode 100644
index 879cd98..0000000
--- a/generator/src/main/groovy/model/Library.groovy
+++ /dev/null
@@ -1,13 +0,0 @@
-package model
-
-import groovy.transform.CompileStatic
-
-@CompileStatic
-class Library extends LinkedHashMap<String, Book> {
-    void book(String title, Closure bookClosure) {
-        def book = new Book(title: title)
-        def clone = bookClosure.rehydrate(book, book, book)
-        clone()
-        put(title, book)
-    }
-}
diff --git a/generator/src/main/groovy/model/Menu.groovy b/generator/src/main/groovy/model/Menu.groovy
deleted file mode 100644
index 9e495ed..0000000
--- a/generator/src/main/groovy/model/Menu.groovy
+++ /dev/null
@@ -1,21 +0,0 @@
-package model
-
-import groovy.transform.CompileStatic
-
-@CompileStatic
-class Menu extends LinkedHashMap<String, List<MenuItem>> {
-
-    void group(String name, Closure groupSpec) {
-        Group g = new Group()
-        def clone = groupSpec.rehydrate(g,g,g)
-        clone()
-        put(name, g.items)
-    }
-
-    private static class Group {
-        List<MenuItem> items = []
-        void item(String name, String link, String style=null) {
-            items << new MenuItem(name:name, link: link, style:style)
-        }
-    }
-}
diff --git a/generator/src/main/groovy/model/MenuItem.groovy b/generator/src/main/groovy/model/MenuItem.groovy
deleted file mode 100644
index 6e58074..0000000
--- a/generator/src/main/groovy/model/MenuItem.groovy
+++ /dev/null
@@ -1,13 +0,0 @@
-package model
-
-import groovy.transform.ToString
-
-import groovy.transform.CompileStatic
-
-@CompileStatic
-@ToString(includeNames=true)
-class MenuItem {
-    String name
-    String link
-    String style
-}
diff --git a/generator/src/main/groovy/model/Page.groovy b/generator/src/main/groovy/model/Page.groovy
deleted file mode 100644
index 5b29679..0000000
--- a/generator/src/main/groovy/model/Page.groovy
+++ /dev/null
@@ -1,10 +0,0 @@
-package model
-
-import groovy.transform.CompileStatic
-
-@CompileStatic
-class Page {
-    String source
-    String target
-    Map model = [:]
-}
diff --git a/generator/src/main/groovy/model/Section.groovy b/generator/src/main/groovy/model/Section.groovy
deleted file mode 100644
index b0b14fd..0000000
--- a/generator/src/main/groovy/model/Section.groovy
+++ /dev/null
@@ -1,21 +0,0 @@
-package model
-
-import groovy.transform.ToString
-
-@ToString(includeNames=true)
-import groovy.transform.CompileStatic
-
-@CompileStatic
-class Section {
-    String name
-    String icon
-    List<SectionItem> items = []
-
-    void item(String name, String targetFile, String sourceFile, boolean generate = true) {
-        items.add(new SectionItem(name: name, sourceFilename: sourceFile, targetFilename: targetFile, generate:generate))
-    }
-
-    String getAnchor() {
-        name.replaceAll('[^a-zA-Z0-9]','').toLowerCase()
-    }
-}
diff --git a/generator/src/main/groovy/model/SectionItem.groovy b/generator/src/main/groovy/model/SectionItem.groovy
deleted file mode 100644
index 7379b23..0000000
--- a/generator/src/main/groovy/model/SectionItem.groovy
+++ /dev/null
@@ -1,14 +0,0 @@
-package model
-
-import groovy.transform.ToString
-
-import groovy.transform.CompileStatic
-
-@CompileStatic
-@ToString(includeNames=true)
-class SectionItem {
-    String name
-    String targetFilename
-    String sourceFilename
-    boolean generate = true
-}
diff --git a/generator/src/main/groovy/model/SiteMap.groovy b/generator/src/main/groovy/model/SiteMap.groovy
deleted file mode 100644
index 8742dbc..0000000
--- a/generator/src/main/groovy/model/SiteMap.groovy
+++ /dev/null
@@ -1,134 +0,0 @@
-package model
-
-import groovy.transform.ToString
-import org.codehaus.groovy.control.CompilerConfiguration
-
-import groovy.transform.CompileStatic
-import org.codehaus.groovy.control.customizers.ImportCustomizer
-
-@CompileStatic
-@ToString(includeNames=true)
-class SiteMap {
-    final List<Section> documentationSections = []
-    final List<Distribution> distributions = []
-    final Menu menu = new Menu()
-    final Ecosystem ecosystem = new Ecosystem()
-    final Events allEvents = new Events()
-    final Library library = new Library()
-    final List<String> allDocVersions = []
-    final List<Page> pages = []
-    final List<UserGroup> usergroups = []
-    final List<Video> videos = []
-    final List<Course> courses = []
-
-    private SiteMap() {}
-
-    public static SiteMap from(File source) {
-        CompilerConfiguration config = new CompilerConfiguration()
-        def customizer = new ImportCustomizer()
-        config.addCompilationCustomizers(customizer)
-        customizer.addStaticImport('generator.DocUtils','DOCS_BASEURL')
-        config.scriptBaseClass = 'groovy.util.DelegatingScript'
-        GroovyShell shell = new GroovyShell(config)
-        def script = shell.parse(source)
-
-        def result = new SiteMap()
-        ((DelegatingScript)script).setDelegate(result)
-        script.run()
-
-        result
-    }
-
-    private void documentation(Closure docSpec) {
-        def clone = docSpec.rehydrate(this, this, this)
-        clone()
-    }
-
-    private void section(String name, String icon, Closure sectionSpec) {
-        Section section = new Section(name:name, icon:icon)
-        def spec = sectionSpec.rehydrate(section,section,section)
-        spec()
-        documentationSections.add(section)
-    }
-
-    private void groovyDocumentationVersions(List<String> allDocVersions) {
-        this.allDocVersions.addAll(allDocVersions)
-    }
-
-    private void downloads(Closure dlSpec) {
-        def clone = dlSpec.rehydrate(this, this, this)
-        clone()
-    }
-
-    private void pages(Closure pagesSpec) {
-        def clone = pagesSpec.rehydrate(this, this, this)
-        clone()
-    }
-
-    private void usergroups(Closure groupsSpec) {
-        def clone = groupsSpec.rehydrate(this ,this ,this)
-        clone()
-    }
-
-    private void videos(Closure videosSpec) {
-        def clone = videosSpec.rehydrate(this, this, this)
-        clone()
-    }
-
-    private void courses(Closure coursesSpec) {
-        def clone = coursesSpec.rehydrate(this, this, this)
-        clone()
-    }
-
-    private void distribution(String name, Closure distSpec) {
-        Distribution dist = new Distribution(name: name)
-        def clone = distSpec.rehydrate(dist, dist, dist)
-        clone()
-        distributions.add(dist)
-    }
-
-    private void menu(Closure menuSpec) {
-        def clone = menuSpec.rehydrate(menu, menu, menu)
-        clone()
-    }
-
-    private void ecosystem(Closure ecoSpec) {
-        def clone = ecoSpec.rehydrate(ecosystem, ecosystem, ecosystem)
-        clone()
-    }
-
-    private void allEvents(Closure eventsSpec) {
-        def clone = eventsSpec.rehydrate(allEvents, allEvents, allEvents)
-        clone()
-    }
-
-    private void books(Closure booksSpec) {
-        def clone = booksSpec.rehydrate(library, library, library)
-        clone()
-    }
-
-    private void page(String source, String target, Map model = [:]) {
-        pages.add(new Page(source:source, target: target, model: model))
-    }
-
-    private void userGroup(String name, Closure groupSpec) {
-        def group = new UserGroup(name: name)
-        def clone = groupSpec.rehydrate(group,group,group)
-        clone()
-        usergroups.add(group)
-    }
-
-    private void video(String title, Closure videoSpec) {
-        def video = new Video(title: title)
-        def clone = videoSpec.rehydrate(video, video, video)
-        clone()
-        videos.add(video)
-    }
-
-    private void course(String title, Closure courseSpec) {
-        def course = new Course(title: title)
-        def clone = courseSpec.rehydrate(course,course,course)
-        clone()
-        courses.add(course)
-    }
-}
diff --git a/generator/src/main/groovy/model/UserGroup.groovy b/generator/src/main/groovy/model/UserGroup.groovy
deleted file mode 100644
index 84007e3..0000000
--- a/generator/src/main/groovy/model/UserGroup.groovy
+++ /dev/null
@@ -1,28 +0,0 @@
-package model
-
-import groovy.transform.CompileStatic
-import groovy.transform.ToString
-
-@CompileStatic
-@ToString(includeNames=true)
-class UserGroup {
-    String location
-    String name
-    String url
-
-    void location(String location) {
-        this.location = location
-    }
-
-    void name(String name) {
-        this.name = name
-    }
-
-    void url(String url) {
-        this.url = url
-    }
-
-    String[] getLocationParts() {
-        location.split('/')
-    }
-}
diff --git a/generator/src/main/groovy/model/Video.groovy b/generator/src/main/groovy/model/Video.groovy
deleted file mode 100644
index a5a4667..0000000
--- a/generator/src/main/groovy/model/Video.groovy
+++ /dev/null
@@ -1,38 +0,0 @@
-package model
-
-import groovy.transform.CompileStatic
-
-@CompileStatic
-class Video {
-    String title
-    String speaker
-    String summary
-    String pictureUrl
-    String videoUrl = ""
-    String slidesUrl = ""
-    String codeUrl = ""
-
-    void speaker(String speaker) {
-        this.speaker = speaker
-    }
-
-    void summary(String summary) {
-        this.summary = summary
-    }
-
-    void pictureUrl(String pictureUrl) {
-        this.pictureUrl = pictureUrl
-    }
-
-    void videoUrl(String videoUrl) {
-        this.videoUrl = videoUrl
-    }
-
-    void slidesUrl(String slidesUrl) {
-        this.slidesUrl = slidesUrl
-    }
-
-    void codeUrl(String codeUrl) {
-        this.codeUrl = codeUrl
-    }
-}
diff --git a/gradle.properties b/gradle.properties
deleted file mode 100644
index c9d5166..0000000
--- a/gradle.properties
+++ /dev/null
@@ -1 +0,0 @@
-systemProp.docs_baseurl=http://docs.groovy-lang.org/latest
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index 1d7437d..0000000
--- a/gradle/wrapper/gradle-wrapper.jar
+++ /dev/null
Binary files differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index da60a3a..0000000
--- a/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#Mon Apr 03 10:41:25 AEST 2017
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-3.4.1-bin.zip
diff --git a/gradlew b/gradlew
deleted file mode 100644
index 9aa616c..0000000
--- a/gradlew
+++ /dev/null
@@ -1,169 +0,0 @@
-#!/usr/bin/env bash
-
-##############################################################################
-##
-##  Gradle start up script for UN*X
-##
-##############################################################################
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-        PRG="$link"
-    else
-        PRG=`dirname "$PRG"`"/$link"
-    fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn ( ) {
-    echo "$*"
-}
-
-die ( ) {
-    echo
-    echo "$*"
-    echo
-    exit 1
-}
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-nonstop=false
-case "`uname`" in
-  CYGWIN* )
-    cygwin=true
-    ;;
-  Darwin* )
-    darwin=true
-    ;;
-  MINGW* )
-    msys=true
-    ;;
-  NONSTOP* )
-    nonstop=true
-    ;;
-esac
-
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
-    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
-        # IBM's JDK on AIX uses strange locations for the executables
-        JAVACMD="$JAVA_HOME/jre/sh/java"
-    else
-        JAVACMD="$JAVA_HOME/bin/java"
-    fi
-    if [ ! -x "$JAVACMD" ] ; then
-        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-    fi
-else
-    JAVACMD="java"
-    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-fi
-
-# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
-    MAX_FD_LIMIT=`ulimit -H -n`
-    if [ $? -eq 0 ] ; then
-        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
-            MAX_FD="$MAX_FD_LIMIT"
-        fi
-        ulimit -n $MAX_FD
-        if [ $? -ne 0 ] ; then
-            warn "Could not set maximum file descriptor limit: $MAX_FD"
-        fi
-    else
-        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
-    fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
-    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
-    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
-    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
-    JAVACMD=`cygpath --unix "$JAVACMD"`
-
-    # We build the pattern for arguments to be converted via cygpath
-    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
-    SEP=""
-    for dir in $ROOTDIRSRAW ; do
-        ROOTDIRS="$ROOTDIRS$SEP$dir"
-        SEP="|"
-    done
-    OURCYGPATTERN="(^($ROOTDIRS))"
-    # Add a user-defined pattern to the cygpath arguments
-    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
-        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
-    fi
-    # Now convert the arguments - kludge to limit ourselves to /bin/sh
-    i=0
-    for arg in "$@" ; do
-        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
-        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
-
-        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
-            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
-        else
-            eval `echo args$i`="\"$arg\""
-        fi
-        i=$((i+1))
-    done
-    case $i in
-        (0) set -- ;;
-        (1) set -- "$args0" ;;
-        (2) set -- "$args0" "$args1" ;;
-        (3) set -- "$args0" "$args1" "$args2" ;;
-        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
-        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
-        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
-        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
-        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
-        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
-    esac
-fi
-
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
-    JVM_OPTS=("$@")
-}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
-
-# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
-if [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]]; then
-  cd "$(dirname "$0")"
-fi
-
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/gradlew.bat b/gradlew.bat
deleted file mode 100644
index f955316..0000000
--- a/gradlew.bat
+++ /dev/null
@@ -1,84 +0,0 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem  Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windows variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
diff --git a/site/src/site/assets/img/asf_logo.png b/img/asf_logo.png
similarity index 100%
rename from site/src/site/assets/img/asf_logo.png
rename to img/asf_logo.png
Binary files differ
diff --git a/site/src/site/assets/img/books/Kousen-MJG.png b/img/books/Kousen-MJG.png
similarity index 100%
rename from site/src/site/assets/img/books/Kousen-MJG.png
rename to img/books/Kousen-MJG.png
Binary files differ
diff --git a/site/src/site/assets/img/books/g2cook.jpg b/img/books/g2cook.jpg
similarity index 100%
rename from site/src/site/assets/img/books/g2cook.jpg
rename to img/books/g2cook.jpg
Binary files differ
diff --git a/site/src/site/assets/img/books/gdsl.jpg b/img/books/gdsl.jpg
similarity index 100%
rename from site/src/site/assets/img/books/gdsl.jpg
rename to img/books/gdsl.jpg
Binary files differ
diff --git a/site/src/site/assets/img/books/ggood.jpg b/img/books/ggood.jpg
similarity index 100%
rename from site/src/site/assets/img/books/ggood.jpg
rename to img/books/ggood.jpg
Binary files differ
diff --git a/img/books/learning_groovy.jpg b/img/books/learning_groovy.jpg
new file mode 100644
index 0000000..f5ffd87
--- /dev/null
+++ b/img/books/learning_groovy.jpg
Binary files differ
diff --git a/site/src/site/assets/img/books/pratical-grails-3-book-cover.png b/img/books/practical-grails-3-book-cover.png
similarity index 100%
copy from site/src/site/assets/img/books/pratical-grails-3-book-cover.png
copy to img/books/practical-grails-3-book-cover.png
Binary files differ
diff --git a/site/src/site/assets/img/books/pratical-grails-3-book-cover.png b/img/books/pratical-grails-3-book-cover.png
similarity index 100%
rename from site/src/site/assets/img/books/pratical-grails-3-book-cover.png
rename to img/books/pratical-grails-3-book-cover.png
Binary files differ
diff --git a/site/src/site/assets/img/books/regina.png b/img/books/regina.png
similarity index 100%
rename from site/src/site/assets/img/books/regina.png
rename to img/books/regina.png
Binary files differ
diff --git a/site/src/site/assets/img/books/vslg2.jpg b/img/books/vslg2.jpg
similarity index 100%
rename from site/src/site/assets/img/books/vslg2.jpg
rename to img/books/vslg2.jpg
Binary files differ
diff --git a/site/src/site/assets/img/books/weissmann_groovy_grails.png b/img/books/weissmann_groovy_grails.png
similarity index 100%
rename from site/src/site/assets/img/books/weissmann_groovy_grails.png
rename to img/books/weissmann_groovy_grails.png
Binary files differ
diff --git a/img/confs/apacheconNA.png b/img/confs/apacheconNA.png
new file mode 100644
index 0000000..6d2b317
--- /dev/null
+++ b/img/confs/apacheconNA.png
Binary files differ
diff --git a/img/confs/codeone.png b/img/confs/codeone.png
new file mode 100644
index 0000000..72d778f
--- /dev/null
+++ b/img/confs/codeone.png
Binary files differ
diff --git a/img/confs/devnexus-2gm.png b/img/confs/devnexus-2gm.png
new file mode 100644
index 0000000..6f10f5b
--- /dev/null
+++ b/img/confs/devnexus-2gm.png
Binary files differ
diff --git a/site/src/site/assets/img/confs/g3summit2016.png b/img/confs/g3summit2016.png
similarity index 100%
rename from site/src/site/assets/img/confs/g3summit2016.png
rename to img/confs/g3summit2016.png
Binary files differ
diff --git a/site/src/site/assets/img/confs/gr8confeu.png b/img/confs/gr8confeu.png
similarity index 100%
rename from site/src/site/assets/img/confs/gr8confeu.png
rename to img/confs/gr8confeu.png
Binary files differ
diff --git a/site/src/site/assets/img/confs/gr8confin.png b/img/confs/gr8confin.png
similarity index 100%
rename from site/src/site/assets/img/confs/gr8confin.png
rename to img/confs/gr8confin.png
Binary files differ
diff --git a/site/src/site/assets/img/confs/gr8confus.png b/img/confs/gr8confus.png
similarity index 100%
rename from site/src/site/assets/img/confs/gr8confus.png
rename to img/confs/gr8confus.png
Binary files differ
diff --git a/img/confs/greach.png b/img/confs/greach.png
new file mode 100644
index 0000000..909cd05
--- /dev/null
+++ b/img/confs/greach.png
Binary files differ
diff --git a/site/src/site/assets/img/courses/groovy-course-cover.png b/img/courses/groovy-course-cover.png
similarity index 100%
rename from site/src/site/assets/img/courses/groovy-course-cover.png
rename to img/courses/groovy-course-cover.png
Binary files differ
diff --git a/img/ecosystem/beakerx.png b/img/ecosystem/beakerx.png
new file mode 100644
index 0000000..a88bf0c
--- /dev/null
+++ b/img/ecosystem/beakerx.png
Binary files differ
diff --git a/site/src/site/assets/img/ecosystem/geb.png b/img/ecosystem/geb.png
similarity index 100%
rename from site/src/site/assets/img/ecosystem/geb.png
rename to img/ecosystem/geb.png
Binary files differ
diff --git a/site/src/site/assets/img/ecosystem/gpars.png b/img/ecosystem/gpars.png
similarity index 100%
rename from site/src/site/assets/img/ecosystem/gpars.png
rename to img/ecosystem/gpars.png
Binary files differ
diff --git a/site/src/site/assets/img/ecosystem/gradle.png b/img/ecosystem/gradle.png
similarity index 100%
rename from site/src/site/assets/img/ecosystem/gradle.png
rename to img/ecosystem/gradle.png
Binary files differ
diff --git a/site/src/site/assets/img/ecosystem/grails.png b/img/ecosystem/grails.png
similarity index 100%
rename from site/src/site/assets/img/ecosystem/grails.png
rename to img/ecosystem/grails.png
Binary files differ
diff --git a/site/src/site/assets/img/ecosystem/griffon.png b/img/ecosystem/griffon.png
similarity index 100%
rename from site/src/site/assets/img/ecosystem/griffon.png
rename to img/ecosystem/griffon.png
Binary files differ
diff --git a/img/ecosystem/micronaut.png b/img/ecosystem/micronaut.png
new file mode 100644
index 0000000..e672b86
--- /dev/null
+++ b/img/ecosystem/micronaut.png
Binary files differ
diff --git a/site/src/site/assets/img/ecosystem/ratpack.png b/img/ecosystem/ratpack.png
similarity index 100%
rename from site/src/site/assets/img/ecosystem/ratpack.png
rename to img/ecosystem/ratpack.png
Binary files differ
diff --git a/site/src/site/assets/img/ecosystem/sdkman.png b/img/ecosystem/sdkman.png
similarity index 100%
rename from site/src/site/assets/img/ecosystem/sdkman.png
rename to img/ecosystem/sdkman.png
Binary files differ
diff --git a/site/src/site/assets/img/favicon.ico b/img/favicon.ico
similarity index 100%
rename from site/src/site/assets/img/favicon.ico
rename to img/favicon.ico
Binary files differ
diff --git a/site/src/site/assets/img/groovy-logo-black.svg b/img/groovy-logo-black.svg
similarity index 100%
rename from site/src/site/assets/img/groovy-logo-black.svg
rename to img/groovy-logo-black.svg
diff --git a/site/src/site/assets/img/groovy-logo-colored.svg b/img/groovy-logo-colored.svg
similarity index 100%
rename from site/src/site/assets/img/groovy-logo-colored.svg
rename to img/groovy-logo-colored.svg
diff --git a/site/src/site/assets/img/groovy-logo-white.png b/img/groovy-logo-white.png
similarity index 100%
rename from site/src/site/assets/img/groovy-logo-white.png
rename to img/groovy-logo-white.png
Binary files differ
diff --git a/site/src/site/assets/img/groovy-logo-white.svg b/img/groovy-logo-white.svg
similarity index 100%
rename from site/src/site/assets/img/groovy-logo-white.svg
rename to img/groovy-logo-white.svg
diff --git a/site/src/site/assets/img/groovy-logo.png b/img/groovy-logo.png
similarity index 100%
rename from site/src/site/assets/img/groovy-logo.png
rename to img/groovy-logo.png
Binary files differ
diff --git a/img/horizontal-github-ribbon.png b/img/horizontal-github-ribbon.png
new file mode 100644
index 0000000..a3ab20d
--- /dev/null
+++ b/img/horizontal-github-ribbon.png
Binary files differ
diff --git a/site/src/site/assets/img/icons-colset-2-its.png b/img/icons-colset-2-its.png
similarity index 100%
rename from site/src/site/assets/img/icons-colset-2-its.png
rename to img/icons-colset-2-its.png
Binary files differ
diff --git a/site/src/site/assets/img/logo.png b/img/logo.png
similarity index 100%
rename from site/src/site/assets/img/logo.png
rename to img/logo.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/airbusgroup.png b/img/logos/airbusgroup.png
similarity index 100%
rename from site/src/site/assets/img/logos/airbusgroup.png
rename to img/logos/airbusgroup.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/amadeus.png b/img/logos/amadeus.png
similarity index 100%
rename from site/src/site/assets/img/logos/amadeus.png
rename to img/logos/amadeus.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/bestbuy.png b/img/logos/bestbuy.png
similarity index 100%
rename from site/src/site/assets/img/logos/bestbuy.png
rename to img/logos/bestbuy.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/carfax.png b/img/logos/carfax.png
similarity index 100%
rename from site/src/site/assets/img/logos/carfax.png
rename to img/logos/carfax.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/carriots.png b/img/logos/carriots.png
similarity index 100%
rename from site/src/site/assets/img/logos/carriots.png
rename to img/logos/carriots.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/cisco.png b/img/logos/cisco.png
similarity index 100%
rename from site/src/site/assets/img/logos/cisco.png
rename to img/logos/cisco.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/commerzbank.png b/img/logos/commerzbank.png
similarity index 100%
rename from site/src/site/assets/img/logos/commerzbank.png
rename to img/logos/commerzbank.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/credit-suisse.png b/img/logos/credit-suisse.png
similarity index 100%
rename from site/src/site/assets/img/logos/credit-suisse.png
rename to img/logos/credit-suisse.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/eads.png b/img/logos/eads.png
similarity index 100%
rename from site/src/site/assets/img/logos/eads.png
rename to img/logos/eads.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/energy-transfer.png b/img/logos/energy-transfer.png
similarity index 100%
rename from site/src/site/assets/img/logos/energy-transfer.png
rename to img/logos/energy-transfer.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/epo.png b/img/logos/epo.png
similarity index 100%
rename from site/src/site/assets/img/logos/epo.png
rename to img/logos/epo.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/fanniemae.png b/img/logos/fanniemae.png
similarity index 100%
rename from site/src/site/assets/img/logos/fanniemae.png
rename to img/logos/fanniemae.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/google.png b/img/logos/google.png
similarity index 100%
rename from site/src/site/assets/img/logos/google.png
rename to img/logos/google.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/hypoport.png b/img/logos/hypoport.png
similarity index 100%
rename from site/src/site/assets/img/logos/hypoport.png
rename to img/logos/hypoport.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/ibm.png b/img/logos/ibm.png
similarity index 100%
rename from site/src/site/assets/img/logos/ibm.png
rename to img/logos/ibm.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/jpmorganchase.png b/img/logos/jpmorganchase.png
similarity index 100%
rename from site/src/site/assets/img/logos/jpmorganchase.png
rename to img/logos/jpmorganchase.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/linkedin.png b/img/logos/linkedin.png
similarity index 100%
rename from site/src/site/assets/img/logos/linkedin.png
rename to img/logos/linkedin.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/mastercard.png b/img/logos/mastercard.png
similarity index 100%
rename from site/src/site/assets/img/logos/mastercard.png
rename to img/logos/mastercard.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/mtv.png b/img/logos/mtv.png
similarity index 100%
rename from site/src/site/assets/img/logos/mtv.png
rename to img/logos/mtv.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/mutual-of-omaha.png b/img/logos/mutual-of-omaha.png
similarity index 100%
rename from site/src/site/assets/img/logos/mutual-of-omaha.png
rename to img/logos/mutual-of-omaha.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/national-cancer-institute.png b/img/logos/national-cancer-institute.png
similarity index 100%
rename from site/src/site/assets/img/logos/national-cancer-institute.png
rename to img/logos/national-cancer-institute.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/nestle.png b/img/logos/nestle.png
similarity index 100%
rename from site/src/site/assets/img/logos/nestle.png
rename to img/logos/nestle.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/netflix.png b/img/logos/netflix.png
similarity index 100%
rename from site/src/site/assets/img/logos/netflix.png
rename to img/logos/netflix.png
Binary files differ
diff --git a/img/logos/nielsen.png b/img/logos/nielsen.png
new file mode 100644
index 0000000..dc50bfa
--- /dev/null
+++ b/img/logos/nielsen.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/oracle.png b/img/logos/oracle.png
similarity index 100%
rename from site/src/site/assets/img/logos/oracle.png
rename to img/logos/oracle.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/paterson-cancer-institute.png b/img/logos/paterson-cancer-institute.png
similarity index 100%
rename from site/src/site/assets/img/logos/paterson-cancer-institute.png
rename to img/logos/paterson-cancer-institute.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/roche.png b/img/logos/roche.png
similarity index 100%
rename from site/src/site/assets/img/logos/roche.png
rename to img/logos/roche.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/sas.png b/img/logos/sas.png
similarity index 100%
rename from site/src/site/assets/img/logos/sas.png
rename to img/logos/sas.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/sky.png b/img/logos/sky.png
similarity index 100%
rename from site/src/site/assets/img/logos/sky.png
rename to img/logos/sky.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/smartthings.png b/img/logos/smartthings.png
similarity index 100%
rename from site/src/site/assets/img/logos/smartthings.png
rename to img/logos/smartthings.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/sony.png b/img/logos/sony.png
similarity index 100%
rename from site/src/site/assets/img/logos/sony.png
rename to img/logos/sony.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/target.png b/img/logos/target.png
similarity index 100%
rename from site/src/site/assets/img/logos/target.png
rename to img/logos/target.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/thales.png b/img/logos/thales.png
similarity index 100%
rename from site/src/site/assets/img/logos/thales.png
rename to img/logos/thales.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/ubs.png b/img/logos/ubs.png
similarity index 100%
rename from site/src/site/assets/img/logos/ubs.png
rename to img/logos/ubs.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/vodafone.png b/img/logos/vodafone.png
similarity index 100%
rename from site/src/site/assets/img/logos/vodafone.png
rename to img/logos/vodafone.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/voyages-sncf.png b/img/logos/voyages-sncf.png
similarity index 100%
rename from site/src/site/assets/img/logos/voyages-sncf.png
rename to img/logos/voyages-sncf.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/walmart.png b/img/logos/walmart.png
similarity index 100%
rename from site/src/site/assets/img/logos/walmart.png
rename to img/logos/walmart.png
Binary files differ
diff --git a/site/src/site/assets/img/logos/wells-fargo.png b/img/logos/wells-fargo.png
similarity index 100%
rename from site/src/site/assets/img/logos/wells-fargo.png
rename to img/logos/wells-fargo.png
Binary files differ
diff --git a/site/src/site/assets/img/videos/groovy-ecosystem-revisited.png b/img/videos/groovy-ecosystem-revisited.png
similarity index 100%
rename from site/src/site/assets/img/videos/groovy-ecosystem-revisited.png
rename to img/videos/groovy-ecosystem-revisited.png
Binary files differ
diff --git a/site/src/site/assets/img/videos/groovy-puzzlers.png b/img/videos/groovy-puzzlers.png
similarity index 100%
rename from site/src/site/assets/img/videos/groovy-puzzlers.png
rename to img/videos/groovy-puzzlers.png
Binary files differ
diff --git a/site/src/site/assets/img/videos/metaprogramming-part-1.png b/img/videos/metaprogramming-part-1.png
similarity index 100%
rename from site/src/site/assets/img/videos/metaprogramming-part-1.png
rename to img/videos/metaprogramming-part-1.png
Binary files differ
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..858528c
--- /dev/null
+++ b/index.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><title>The Apache Groovy programming language - Contribute</title><link href='img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='css/style.css'/>
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: 20px; right: -58px; border: 0; z-index: 100; transform: rotate(45deg);' src='/img/horizontal-github-ribbon.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/groovy-weekly.html' class='icon'><span class='fa fa-envelope-o'></span> Groovy newsletter</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+                <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span>
+                                    </button><a class='navbar-brand' href='index.html'>
+                                        <i class='fa fa-star'></i> Apache Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li class=''><a href='/download.html'>Download</a></li><li class=''><a href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='/'>Contribute</a></li><li class=''><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li>
+                                            <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-8 col-lg-pull-0'><div id='contribute-btn'>
+                                            <button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/groovy-website/tree/asf-site/site/src/site/pages/index.groovy"'>
+                                                <i class='fa fa-pencil-square-o'></i> Improve this doc
+                                            </button>
+                                        </div><h1><i class='fa fa-pencil-square-o'></i> Getting Involved</h1><article><p>
+                                    Would you like to help us make the Groovy programming language even better? 
+                                    There are many ways in which you can get involved, make a difference and help
+                                    the Groovy development team to make Groovy even, well, groovier?
+                                    We really appreciate and welcome contributions and you can help us by:
+                                </p><ul><li>helping other users or discussing future language directions on the <a href='http://groovy-lang.org/mailing-lists.html'>mailing-lists</a></li><li>contribute to discussions on <a href='https://groovycommunity.com/'>Slack</a> - this channel is not endorsed by the Apache Software Foundation, it&apos;s run by Groovy enthusiasts in the community for casual conversations and Q&amp;A,</li><li>reporting or fixing <a href='#reporting-issues'>issues</a> you encounter in our <a href='https://issues.apache.org/jira/browse/GROOVY'>bug tracker</a></li><li><a href='#documenting'>documenting</a> various aspects of the language or its APIs</li><li>Creating or commenting on the <a href='wiki/geps.html'>Groovy Enhancement Proposals</a> which describe how we make significant changes to the language</li><li>improving this <a href='https://github.com/apache/groovy-website'>website</a></li><li>covering the code base with more tests to avoid future regressions, </li><li>and of course, by <a href='#code'>contributing bug fixes or new features</a></li></ul><hr class='divider'/><h2>Discussing on the mailing-lists and forums</h2><p>
+                                        If you encounter a problem, want to discuss a new feature,
+                                        share interesting findings, and more, then the <a href='http://groovy-lang.org/mailing-lists.html'>mailing-lists</a>
+                                        are the place to go to start a conversation with the Groovy developers
+                                        and other Groovy users. Discussions on the mailing list are archived.
+                                        It&apos;s the place to go to for all formal discussions or if you want to
+                                        search the archives. </p><p>Alternatively, for more casual conversations and Q&amp;A, consider using the <a href='https://groovycommunity.com/'>Slack</a> channel. (This channel is not endorsed by the Apache Software Foundation; it&apos;s run by Groovy enthusiasts in the community.)</p><hr class='divider'/><a name='reporting-issues'></a><h2>Reporting issues</h2><p>
+                                        If you are wanting to search existing issues, raise a new one or are keen
+                                        to fix some existing issues, then you should become familiar with Groovy&apos;s <a href='https://issues.apache.org/jira/browse/GROOVY'>Bug tracker</a>.</p><p>Before submitting a new issue, we recommend you read our guide to <a href='http://groovy-lang.org/reporting-issues.html'>reporting issues</a></p><p><button type='button' class='btn btn-default' onclick='window.location.href="https://issues.apache.org/jira/browse/GROOVY"'>Report an issue</button></p><hr class='divider'/><a name='documenting'></a><h2>Improving the documentation</h2><p>The documentation of the Groovy programming language comes in various forms:</p><ul><li>the <a href='http://groovy-lang.org/single-page-documentation.html'>reference documentation</a> covering the language specification, the user guides, getting started, and more.</li><li>the <a href='http://groovy-lang.org/api.html'>GroovyDoc APIs</a> documenting the classes of the Groovy code base</li><li>the <a href='http://groovy-lang.org/gdk.html'>Groovy GDK</a> documentation, explaining how Groovy enriches the JDK APIs</li><li>this <a href='https://github.com/apache/groovy-website'>website</a></li></ul><p>To contribute to the Groovy reference documentation, this <a href='http://blog.cacoethes.co.uk/groovyandgrails/contributing-to-the-groovy-documentation'>blog post</a> gives all the details on how you can work on that documentation.</p><p>All the above is stored in our code <a href='https://github.com/apache/groovy-website'>repositories on Github</a>, so having an account on Github would be ideal.</p><p>
+                                    Contributing to this website is fairly easy, if you have a Github account already,
+                                    as you can click on the <em>Improve this doc</em> buttons that you can see on all the pages of this website.
+                                    So don't hesitate to help us improve it, fix typos, broken language, clarify complicated sections,
+                                    add new material, etc.
+                                </p><p>Please check the following section for more information on how to contribute to our codebase.</p><hr class='divider'/><a name='code'></a><h2>Contributing code</h2><p>
+                                        If you know the area you want to contribute to, this is great, but if you are looking for
+                                        some first contributions, the Groovy development team tries to maintain a <a href='https://issues.apache.org/jira/secure/IssueNavigator%21executeAdvanced.jspa?jqlQuery=project%3DGROOVY+and+labels+%3D+contrib+AND+resolution%3DUnresolved&runQuery=true&clear=true'>list of tickets</a>
+                                        of possible easy contributions that could get you started on your journey
+                                        to become a Groovy committer. Just raise your hand on the Groovy developer <a href='http://groovy-lang.org/mailing-lists.html'>mailing-list</a> to tell us about your desire to work on that ticket.</p><p>
+                                    For more complicated tasks, the best approach is also to bring that to the attention of the Groovy developers,
+                                    so they can give you some guidance on how best to tackle a particular problem, discuss implementation ideas
+                                    and the semantics or scope of the proposed change.
+                                </p><h3>Cloning the code base</h3><p>To work on the Groovy code base, you should be proficient enough in <a href='http://git-scm.com/'>git</a> and you should have an account on <a href='https://github.com/'>Github</a> to be able to create <a href='https://help.github.com/articles/creating-a-pull-request'>pull requests</a> with your changes.</p><p>Please fork <a href='https://github.com/apache/groovy'>https://github.com/apache/groovy</a> and create a local clone of your fork as explained in <a href='https://help.github.com/articles/fork-a-repo/'>fork a repo</a>.</p><p>Make sure you configure Git appropriately with the same email that you registered with on Github:</p><pre><code>git config --global user.name "YOUR NAME"
+git config --global user.email "YOUR EMAIL"</code></pre><p>You can verify these are configured appropriately by running:</p><pre><code>git config --list</code></pre><h3>Working on the code base</h3><p>If you are working with the IntelliJ IDEA development environment, this <a href='http://melix.github.io/blog/2014/06/contribute-groovy-ide.html'>screencast</a> gives lots of details on how to setup your IDE.</p><p>Then, to work on the Groovy code base, to build and test Groovy, you can follow the <a href='https://github.com/apache/groovy/blob/master/README.adoc'>instructions</a> from the readme file in the Groovy repository.</p><p>The most important command you will have to run before sending your changes is the test command:</p><pre><code>./gradlew test</code></pre><p>For a successful contribution, all tests should be green!</p><h3>Creating a pull request</h3><p>Once you are satisfied with your changes:</p><ul><li>commit your changes in your local branch</li><li>push your changes to your remote branch on Github</li><li>send us a <a href='https://help.github.com/articles/creating-a-pull-request'>pull request</a></li></ul></article><hr class='divider'/><h2>Donating to Friends of Groovy Open Collective</h2><p>
+								As an independent initiative, we have set up an open collective for Groovy:
+								<a href='https://opencollective.com/friends-of-groovy'>Friends of Groovy Open Collective</a>
+								This initiative is designed to complement the Apache project and the many contributions we get from our great community and supporters.
+							</p><hr class='divider'/><h2>Build status</h2><p>The Groovy sources are tested thanks to our <a href='buildstatus.html'>continuous integration server</a>.</p><hr class='divider'/><h2>Help Wanted</h2><p>We try to keep a list of tasks that we would greatly appreciate help with in the Apache <a href='https://helpwanted.apache.org/'>Help Wanted</a> app:</p><div style='width: 100%; margin-left: 0px; margin-right: 0px;' type='helpwanted' project='groovy' description='the Apache Groovy Project'/><script src='https://helpwanted.apache.org/widget.js' type='text/javascript'/></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='/download.html'>Download</a></li><li><a href='http://groovy-lang.org/support.html'>Support</a></li><li><a href='/'>Contribute</a></li><li><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='http://groovy-lang.org/security.html'>Security</a></li><li><a href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='http://groovy-lang.org/search.html'>Search</a></li>
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a href='http://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='http://groovy-lang.org/groovy-weekly.html'>Groovy newsletter</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='http://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li>
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community
+                                        </p><img src='img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' class='img-responsive'/>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2019 the Apache Groovy project &mdash; Groovy is Open Source, <a href='http://www.apache.org/licenses/LICENSE-2.0.html'>Apache 2 License</a></div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='js/vendor/jquery-1.10.2.min.js' defer></script><script src='js/vendor/classie.js' defer></script><script src='js/vendor/bootstrap.js' defer></script><script src='js/vendor/sidebarEffects.js' defer></script><script src='js/vendor/modernizr-2.6.2.min.js' defer></script><script src='js/plugins.js' defer></script><script>
+          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file
diff --git a/js/plugins.js b/js/plugins.js
new file mode 100644
index 0000000..2788f75
--- /dev/null
+++ b/js/plugins.js
@@ -0,0 +1 @@
+(function(){var e;var d=function(){};var b=["assert","clear","count","debug","dir","dirxml","error","exception","group","groupCollapsed","groupEnd","info","log","markTimeline","profile","profileEnd","table","time","timeEnd","timeStamp","trace","warn"];var c=b.length;var a=(window.console=window.console||{});while(c--){e=b[c];if(!a[e]){a[e]=d}}}());
\ No newline at end of file
diff --git a/js/vendor/bootstrap.js b/js/vendor/bootstrap.js
new file mode 100644
index 0000000..276a166
--- /dev/null
+++ b/js/vendor/bootstrap.js
@@ -0,0 +1,6 @@
+/*!
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+if(typeof jQuery==="undefined"){throw new Error("Bootstrap's JavaScript requires jQuery")}+function(b){function a(){var e=document.createElement("bootstrap");var d={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in d){if(e.style[c]!==undefined){return{end:d[c]}}}return false}b.fn.emulateTransitionEnd=function(e){var d=false;var c=this;b(this).one("bsTransitionEnd",function(){d=true});var f=function(){if(!d){b(c).trigger(b.support.transition.end)}};setTimeout(f,e);return this};b(function(){b.support.transition=a();if(!b.support.transition){return}b.event.special.bsTransitionEnd={bindType:b.support.transition.end,delegateType:b.support.transition.end,handle:function(c){if(b(c.target).is(this)){return c.handleObj.handler.apply(this,arguments)}}}})}(jQuery);+function(e){var d='[data-dismiss="alert"]';var b=function(f){e(f).on("click",d,this.close)};b.VERSION="3.2.0";b.prototype.close=function(j){var i=e(this);var g=i.attr("data-target");if(!g){g=i.attr("href");g=g&&g.replace(/.*(?=#[^\s]*$)/,"")}var h=e(g);if(j){j.preventDefault()}if(!h.length){h=i.hasClass("alert")?i:i.parent()}h.trigger(j=e.Event("close.bs.alert"));if(j.isDefaultPrevented()){return}h.removeClass("in");function f(){h.detach().trigger("closed.bs.alert").remove()}e.support.transition&&h.hasClass("fade")?h.one("bsTransitionEnd",f).emulateTransitionEnd(150):f()};function c(f){return this.each(function(){var h=e(this);var g=h.data("bs.alert");if(!g){h.data("bs.alert",(g=new b(this)))}if(typeof f=="string"){g[f].call(h)}})}var a=e.fn.alert;e.fn.alert=c;e.fn.alert.Constructor=b;e.fn.alert.noConflict=function(){e.fn.alert=a;return this};e(document).on("click.bs.alert.data-api",d,b.prototype.close)}(jQuery);+function(d){var b=function(f,e){this.$element=d(f);this.options=d.extend({},b.DEFAULTS,e);this.isLoading=false};b.VERSION="3.2.0";b.DEFAULTS={loadingText:"loading..."};b.prototype.setState=function(g){var i="disabled";var e=this.$element;var h=e.is("input")?"val":"html";var f=e.data();g=g+"Text";if(f.resetText==null){e.data("resetText",e[h]())}e[h](f[g]==null?this.options[g]:f[g]);setTimeout(d.proxy(function(){if(g=="loadingText"){this.isLoading=true;e.addClass(i).attr(i,i)}else{if(this.isLoading){this.isLoading=false;e.removeClass(i).removeAttr(i)}}},this),0)};b.prototype.toggle=function(){var f=true;var e=this.$element.closest('[data-toggle="buttons"]');if(e.length){var g=this.$element.find("input");if(g.prop("type")=="radio"){if(g.prop("checked")&&this.$element.hasClass("active")){f=false}else{e.find(".active").removeClass("active")}}if(f){g.prop("checked",!this.$element.hasClass("active")).trigger("change")}}if(f){this.$element.toggleClass("active")}};function c(e){return this.each(function(){var h=d(this);var g=h.data("bs.button");var f=typeof e=="object"&&e;if(!g){h.data("bs.button",(g=new b(this,f)))}if(e=="toggle"){g.toggle()}else{if(e){g.setState(e)}}})}var a=d.fn.button;d.fn.button=c;d.fn.button.Constructor=b;d.fn.button.noConflict=function(){d.fn.button=a;return this};d(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(g){var f=d(g.target);if(!f.hasClass("btn")){f=f.closest(".btn")}c.call(f,"toggle");g.preventDefault()})}(jQuery);+function(c){var d=function(f,e){this.$element=c(f).on("keydown.bs.carousel",c.proxy(this.keydown,this));this.$indicators=this.$element.find(".carousel-indicators");this.options=e;this.paused=this.sliding=this.interval=this.$active=this.$items=null;this.options.pause=="hover"&&this.$element.on("mouseenter.bs.carousel",c.proxy(this.pause,this)).on("mouseleave.bs.carousel",c.proxy(this.cycle,this))};d.VERSION="3.2.0";d.DEFAULTS={interval:5000,pause:"hover",wrap:true};d.prototype.keydown=function(f){switch(f.which){case 37:this.prev();break;case 39:this.next();break;default:return}f.preventDefault()};d.prototype.cycle=function(f){f||(this.paused=false);this.interval&&clearInterval(this.interval);this.options.interval&&!this.paused&&(this.interval=setInterval(c.proxy(this.next,this),this.options.interval));return this};d.prototype.getItemIndex=function(e){this.$items=e.parent().children(".item");return this.$items.index(e||this.$active)};d.prototype.to=function(g){var f=this;var e=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(g>(this.$items.length-1)||g<0){return}if(this.sliding){return this.$element.one("slid.bs.carousel",function(){f.to(g)})}if(e==g){return this.pause().cycle()}return this.slide(g>e?"next":"prev",c(this.$items[g]))};d.prototype.pause=function(f){f||(this.paused=true);if(this.$element.find(".next, .prev").length&&c.support.transition){this.$element.trigger(c.support.transition.end);this.cycle(true)}this.interval=clearInterval(this.interval);return this};d.prototype.next=function(){if(this.sliding){return}return this.slide("next")};d.prototype.prev=function(){if(this.sliding){return}return this.slide("prev")};d.prototype.slide=function(m,h){var p=this.$element.find(".item.active");var f=h||p[m]();var k=this.interval;var n=m=="next"?"left":"right";var i=m=="next"?"first":"last";var j=this;if(!f.length){if(!this.options.wrap){return}f=this.$element.find(".item")[i]()}if(f.hasClass("active")){return(this.sliding=false)}var l=f[0];var e=c.Event("slide.bs.carousel",{relatedTarget:l,direction:n});this.$element.trigger(e);if(e.isDefaultPrevented()){return}this.sliding=true;k&&this.pause();if(this.$indicators.length){this.$indicators.find(".active").removeClass("active");var g=c(this.$indicators.children()[this.getItemIndex(f)]);g&&g.addClass("active")}var o=c.Event("slid.bs.carousel",{relatedTarget:l,direction:n});if(c.support.transition&&this.$element.hasClass("slide")){f.addClass(m);f[0].offsetWidth;p.addClass(n);f.addClass(n);p.one("bsTransitionEnd",function(){f.removeClass([m,n].join(" ")).addClass("active");p.removeClass(["active",n].join(" "));j.sliding=false;setTimeout(function(){j.$element.trigger(o)},0)}).emulateTransitionEnd(p.css("transition-duration").slice(0,-1)*1000)}else{p.removeClass("active");f.addClass("active");this.sliding=false;this.$element.trigger(o)}k&&this.cycle();return this};function b(e){return this.each(function(){var i=c(this);var h=i.data("bs.carousel");var f=c.extend({},d.DEFAULTS,i.data(),typeof e=="object"&&e);var g=typeof e=="string"?e:f.slide;if(!h){i.data("bs.carousel",(h=new d(this,f)))}if(typeof e=="number"){h.to(e)}else{if(g){h[g]()}else{if(f.interval){h.pause().cycle()}}}})}var a=c.fn.carousel;c.fn.carousel=b;c.fn.carousel.Constructor=d;c.fn.carousel.noConflict=function(){c.fn.carousel=a;return this};c(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(k){var g;var j=c(this);var f=c(j.attr("data-target")||(g=j.attr("href"))&&g.replace(/.*(?=#[^\s]+$)/,""));if(!f.hasClass("carousel")){return}var h=c.extend({},f.data(),j.data());var i=j.attr("data-slide-to");if(i){h.interval=false}b.call(f,h);if(i){f.data("bs.carousel").to(i)}k.preventDefault()});c(window).on("load",function(){c('[data-ride="carousel"]').each(function(){var e=c(this);b.call(e,e.data())})})}(jQuery);+function(c){var d=function(f,e){this.$element=c(f);this.options=c.extend({},d.DEFAULTS,e);this.transitioning=null;if(this.options.parent){this.$parent=c(this.options.parent)}if(this.options.toggle){this.toggle()}};d.VERSION="3.2.0";d.DEFAULTS={toggle:true};d.prototype.dimension=function(){var e=this.$element.hasClass("width");return e?"width":"height"};d.prototype.show=function(){if(this.transitioning||this.$element.hasClass("in")){return}var f=c.Event("show.bs.collapse");this.$element.trigger(f);if(f.isDefaultPrevented()){return}var i=this.$parent&&this.$parent.find("> .panel > .in");if(i&&i.length){var g=i.data("bs.collapse");if(g&&g.transitioning){return}b.call(i,"hide");g||i.data("bs.collapse",null)}var j=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[j](0);this.transitioning=1;var e=function(){this.$element.removeClass("collapsing").addClass("collapse in")[j]("");this.transitioning=0;this.$element.trigger("shown.bs.collapse")};if(!c.support.transition){return e.call(this)}var h=c.camelCase(["scroll",j].join("-"));this.$element.one("bsTransitionEnd",c.proxy(e,this)).emulateTransitionEnd(350)[j](this.$element[0][h])};d.prototype.hide=function(){if(this.transitioning||!this.$element.hasClass("in")){return}var f=c.Event("hide.bs.collapse");this.$element.trigger(f);if(f.isDefaultPrevented()){return}var g=this.dimension();this.$element[g](this.$element[g]())[0].offsetHeight;this.$element.addClass("collapsing").removeClass("collapse").removeClass("in");this.transitioning=1;var e=function(){this.transitioning=0;this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};if(!c.support.transition){return e.call(this)}this.$element[g](0).one("bsTransitionEnd",c.proxy(e,this)).emulateTransitionEnd(350)};d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};function b(e){return this.each(function(){var h=c(this);var g=h.data("bs.collapse");var f=c.extend({},d.DEFAULTS,h.data(),typeof e=="object"&&e);if(!g&&f.toggle&&e=="show"){e=!e}if(!g){h.data("bs.collapse",(g=new d(this,f)))}if(typeof e=="string"){g[e]()}})}var a=c.fn.collapse;c.fn.collapse=b;c.fn.collapse.Constructor=d;c.fn.collapse.noConflict=function(){c.fn.collapse=a;return this};c(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(k){var f;var m=c(this);var l=m.attr("data-target")||k.preventDefault()||(f=m.attr("href"))&&f.replace(/.*(?=#[^\s]+$)/,"");var g=c(l);var i=g.data("bs.collapse");var j=i?"toggle":m.data();var n=m.attr("data-parent");var h=n&&c(n);if(!i||!i.transitioning){if(h){h.find('[data-toggle="collapse"][data-parent="'+n+'"]').not(m).addClass("collapsed")}m[g.hasClass("in")?"addClass":"removeClass"]("collapsed")}b.call(g,j)})}(jQuery);+function(h){var e=".dropdown-backdrop";var b='[data-toggle="dropdown"]';var a=function(i){h(i).on("click.bs.dropdown",this.toggle)};a.VERSION="3.2.0";a.prototype.toggle=function(m){var l=h(this);if(l.is(".disabled, :disabled")){return}var k=f(l);var j=k.hasClass("open");d();if(!j){if("ontouchstart" in document.documentElement&&!k.closest(".navbar-nav").length){h('<div class="dropdown-backdrop"/>').insertAfter(h(this)).on("click",d)}var i={relatedTarget:this};k.trigger(m=h.Event("show.bs.dropdown",i));if(m.isDefaultPrevented()){return}l.trigger("focus");k.toggleClass("open").trigger("shown.bs.dropdown",i)}return false};a.prototype.keydown=function(m){if(!/(38|40|27)/.test(m.keyCode)){return}var l=h(this);m.preventDefault();m.stopPropagation();if(l.is(".disabled, :disabled")){return}var k=f(l);var j=k.hasClass("open");if(!j||(j&&m.keyCode==27)){if(m.which==27){k.find(b).trigger("focus")}return l.trigger("click")}var n=" li:not(.divider):visible a";var o=k.find('[role="menu"]'+n+', [role="listbox"]'+n);if(!o.length){return}var i=o.index(o.filter(":focus"));if(m.keyCode==38&&i>0){i--}if(m.keyCode==40&&i<o.length-1){i++}if(!~i){i=0}o.eq(i).trigger("focus")};function d(i){if(i&&i.which===3){return}h(e).remove();h(b).each(function(){var k=f(h(this));var j={relatedTarget:this};if(!k.hasClass("open")){return}k.trigger(i=h.Event("hide.bs.dropdown",j));if(i.isDefaultPrevented()){return}k.removeClass("open").trigger("hidden.bs.dropdown",j)})}function f(k){var i=k.attr("data-target");if(!i){i=k.attr("href");i=i&&/#[A-Za-z]/.test(i)&&i.replace(/.*(?=#[^\s]*$)/,"")}var j=i&&h(i);return j&&j.length?j:k.parent()}function g(i){return this.each(function(){var k=h(this);var j=k.data("bs.dropdown");if(!j){k.data("bs.dropdown",(j=new a(this)))}if(typeof i=="string"){j[i].call(k)}})}var c=h.fn.dropdown;h.fn.dropdown=g;h.fn.dropdown.Constructor=a;h.fn.dropdown.noConflict=function(){h.fn.dropdown=c;return this};h(document).on("click.bs.dropdown.data-api",d).on("click.bs.dropdown.data-api",".dropdown form",function(i){i.stopPropagation()}).on("click.bs.dropdown.data-api",b,a.prototype.toggle).on("keydown.bs.dropdown.data-api",b+', [role="menu"], [role="listbox"]',a.prototype.keydown)}(jQuery);+function(d){var b=function(f,e){this.options=e;this.$body=d(document.body);this.$element=d(f);this.$backdrop=this.isShown=null;this.scrollbarWidth=0;if(this.options.remote){this.$element.find(".modal-content").load(this.options.remote,d.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))}};b.VERSION="3.2.0";b.DEFAULTS={backdrop:true,keyboard:true,show:true};b.prototype.toggle=function(e){return this.isShown?this.hide():this.show(e)};b.prototype.show=function(h){var f=this;var g=d.Event("show.bs.modal",{relatedTarget:h});this.$element.trigger(g);if(this.isShown||g.isDefaultPrevented()){return}this.isShown=true;this.checkScrollbar();this.$body.addClass("modal-open");this.setScrollbar();this.escape();this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',d.proxy(this.hide,this));this.backdrop(function(){var j=d.support.transition&&f.$element.hasClass("fade");if(!f.$element.parent().length){f.$element.appendTo(f.$body)}f.$element.show().scrollTop(0);if(j){f.$element[0].offsetWidth}f.$element.addClass("in").attr("aria-hidden",false);f.enforceFocus();var i=d.Event("shown.bs.modal",{relatedTarget:h});j?f.$element.find(".modal-dialog").one("bsTransitionEnd",function(){f.$element.trigger("focus").trigger(i)}).emulateTransitionEnd(300):f.$element.trigger("focus").trigger(i)})};b.prototype.hide=function(f){if(f){f.preventDefault()}f=d.Event("hide.bs.modal");this.$element.trigger(f);if(!this.isShown||f.isDefaultPrevented()){return}this.isShown=false;this.$body.removeClass("modal-open");this.resetScrollbar();this.escape();d(document).off("focusin.bs.modal");this.$element.removeClass("in").attr("aria-hidden",true).off("click.dismiss.bs.modal");d.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",d.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal()};b.prototype.enforceFocus=function(){d(document).off("focusin.bs.modal").on("focusin.bs.modal",d.proxy(function(f){if(this.$element[0]!==f.target&&!this.$element.has(f.target).length){this.$element.trigger("focus")}},this))};b.prototype.escape=function(){if(this.isShown&&this.options.keyboard){this.$element.on("keyup.dismiss.bs.modal",d.proxy(function(f){f.which==27&&this.hide()},this))}else{if(!this.isShown){this.$element.off("keyup.dismiss.bs.modal")}}};b.prototype.hideModal=function(){var e=this;this.$element.hide();this.backdrop(function(){e.$element.trigger("hidden.bs.modal")})};b.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove();this.$backdrop=null};b.prototype.backdrop=function(i){var h=this;var f=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=d.support.transition&&f;this.$backdrop=d('<div class="modal-backdrop '+f+'" />').appendTo(this.$body);this.$element.on("click.dismiss.bs.modal",d.proxy(function(j){if(j.target!==j.currentTarget){return}this.options.backdrop=="static"?this.$element[0].focus.call(this.$element[0]):this.hide.call(this)},this));if(e){this.$backdrop[0].offsetWidth}this.$backdrop.addClass("in");if(!i){return}e?this.$backdrop.one("bsTransitionEnd",i).emulateTransitionEnd(150):i()}else{if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){h.removeBackdrop();i&&i()};d.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(150):g()}else{if(i){i()}}}};b.prototype.checkScrollbar=function(){if(document.body.clientWidth>=window.innerWidth){return}this.scrollbarWidth=this.scrollbarWidth||this.measureScrollbar()};b.prototype.setScrollbar=function(){var e=parseInt((this.$body.css("padding-right")||0),10);if(this.scrollbarWidth){this.$body.css("padding-right",e+this.scrollbarWidth)}};b.prototype.resetScrollbar=function(){this.$body.css("padding-right","")};b.prototype.measureScrollbar=function(){var f=document.createElement("div");f.className="modal-scrollbar-measure";this.$body.append(f);var e=f.offsetWidth-f.clientWidth;this.$body[0].removeChild(f);return e};function c(e,f){return this.each(function(){var i=d(this);var h=i.data("bs.modal");var g=d.extend({},b.DEFAULTS,i.data(),typeof e=="object"&&e);if(!h){i.data("bs.modal",(h=new b(this,g)))}if(typeof e=="string"){h[e](f)}else{if(g.show){h.show(f)}}})}var a=d.fn.modal;d.fn.modal=c;d.fn.modal.Constructor=b;d.fn.modal.noConflict=function(){d.fn.modal=a;return this};d(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(j){var i=d(this);var g=i.attr("href");var f=d(i.attr("data-target")||(g&&g.replace(/.*(?=#[^\s]+$)/,"")));var h=f.data("bs.modal")?"toggle":d.extend({remote:!/#/.test(g)&&g},f.data(),i.data());if(i.is("a")){j.preventDefault()}f.one("show.bs.modal",function(e){if(e.isDefaultPrevented()){return}f.one("hidden.bs.modal",function(){i.is(":visible")&&i.trigger("focus")})});c.call(f,h,this)})}(jQuery);+function(d){var c=function(f,e){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null;this.init("tooltip",f,e)};c.VERSION="3.2.0";c.DEFAULTS={animation:true,placement:"top",selector:false,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:false,container:false,viewport:{selector:"body",padding:0}};c.prototype.init=function(l,j,g){this.enabled=true;this.type=l;this.$element=d(j);this.options=this.getOptions(g);this.$viewport=this.options.viewport&&d(this.options.viewport.selector||this.options.viewport);var k=this.options.trigger.split(" ");for(var h=k.length;h--;){var f=k[h];if(f=="click"){this.$element.on("click."+this.type,this.options.selector,d.proxy(this.toggle,this))}else{if(f!="manual"){var m=f=="hover"?"mouseenter":"focusin";var e=f=="hover"?"mouseleave":"focusout";this.$element.on(m+"."+this.type,this.options.selector,d.proxy(this.enter,this));this.$element.on(e+"."+this.type,this.options.selector,d.proxy(this.leave,this))}}}this.options.selector?(this._options=d.extend({},this.options,{trigger:"manual",selector:""})):this.fixTitle()};c.prototype.getDefaults=function(){return c.DEFAULTS};c.prototype.getOptions=function(e){e=d.extend({},this.getDefaults(),this.$element.data(),e);if(e.delay&&typeof e.delay=="number"){e.delay={show:e.delay,hide:e.delay}}return e};c.prototype.getDelegateOptions=function(){var e={};var f=this.getDefaults();this._options&&d.each(this._options,function(g,h){if(f[g]!=h){e[g]=h}});return e};c.prototype.enter=function(f){var e=f instanceof this.constructor?f:d(f.currentTarget).data("bs."+this.type);if(!e){e=new this.constructor(f.currentTarget,this.getDelegateOptions());d(f.currentTarget).data("bs."+this.type,e)}clearTimeout(e.timeout);e.hoverState="in";if(!e.options.delay||!e.options.delay.show){return e.show()}e.timeout=setTimeout(function(){if(e.hoverState=="in"){e.show()}},e.options.delay.show)};c.prototype.leave=function(f){var e=f instanceof this.constructor?f:d(f.currentTarget).data("bs."+this.type);if(!e){e=new this.constructor(f.currentTarget,this.getDelegateOptions());d(f.currentTarget).data("bs."+this.type,e)}clearTimeout(e.timeout);e.hoverState="out";if(!e.options.delay||!e.options.delay.hide){return e.hide()}e.timeout=setTimeout(function(){if(e.hoverState=="out"){e.hide()}},e.options.delay.hide)};c.prototype.show=function(){var q=d.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(q);var r=d.contains(document.documentElement,this.$element[0]);if(q.isDefaultPrevented()||!r){return}var p=this;var n=this.tip();var h=this.getUID(this.type);this.setContent();n.attr("id",h);this.$element.attr("aria-describedby",h);if(this.options.animation){n.addClass("fade")}var l=typeof this.options.placement=="function"?this.options.placement.call(this,n[0],this.$element[0]):this.options.placement;var t=/\s?auto?\s?/i;var u=t.test(l);if(u){l=l.replace(t,"")||"top"}n.detach().css({top:0,left:0,display:"block"}).addClass(l).data("bs."+this.type,this);this.options.container?n.appendTo(this.options.container):n.insertAfter(this.$element);var s=this.getPosition();var f=n[0].offsetWidth;var o=n[0].offsetHeight;if(u){var j=l;var k=this.$element.parent();var m=this.getPosition(k);l=l=="bottom"&&s.top+s.height+o-m.scroll>m.height?"top":l=="top"&&s.top-m.scroll-o<0?"bottom":l=="right"&&s.right+f>m.width?"left":l=="left"&&s.left-f<m.left?"right":l;n.removeClass(j).addClass(l)}var i=this.getCalculatedOffset(l,s,f,o);this.applyPlacement(i,l);var g=function(){p.$element.trigger("shown.bs."+p.type);p.hoverState=null};d.support.transition&&this.$tip.hasClass("fade")?n.one("bsTransitionEnd",g).emulateTransitionEnd(150):g()}};c.prototype.applyPlacement=function(k,l){var m=this.tip();var g=m[0].offsetWidth;var q=m[0].offsetHeight;var f=parseInt(m.css("margin-top"),10);var i=parseInt(m.css("margin-left"),10);if(isNaN(f)){f=0}if(isNaN(i)){i=0}k.top=k.top+f;k.left=k.left+i;d.offset.setOffset(m[0],d.extend({using:function(r){m.css({top:Math.round(r.top),left:Math.round(r.left)})}},k),0);m.addClass("in");var e=m[0].offsetWidth;var n=m[0].offsetHeight;if(l=="top"&&n!=q){k.top=k.top+q-n}var p=this.getViewportAdjustedDelta(l,k,e,n);if(p.left){k.left+=p.left}else{k.top+=p.top}var h=p.left?p.left*2-g+e:p.top*2-q+n;var j=p.left?"left":"top";var o=p.left?"offsetWidth":"offsetHeight";m.offset(k);this.replaceArrow(h,m[0][o],j)};c.prototype.replaceArrow=function(g,f,e){this.arrow().css(e,g?(50*(1-g/f)+"%"):"")};c.prototype.setContent=function(){var f=this.tip();var e=this.getTitle();f.find(".tooltip-inner")[this.options.html?"html":"text"](e);f.removeClass("fade in top bottom left right")};c.prototype.hide=function(){var g=this;var i=this.tip();var h=d.Event("hide.bs."+this.type);this.$element.removeAttr("aria-describedby");function f(){if(g.hoverState!="in"){i.detach()}g.$element.trigger("hidden.bs."+g.type)}this.$element.trigger(h);if(h.isDefaultPrevented()){return}i.removeClass("in");d.support.transition&&this.$tip.hasClass("fade")?i.one("bsTransitionEnd",f).emulateTransitionEnd(150):f();this.hoverState=null;return this};c.prototype.fixTitle=function(){var e=this.$element;if(e.attr("title")||typeof(e.attr("data-original-title"))!="string"){e.attr("data-original-title",e.attr("title")||"").attr("title","")}};c.prototype.hasContent=function(){return this.getTitle()};c.prototype.getPosition=function(f){f=f||this.$element;var g=f[0];var e=g.tagName=="BODY";return d.extend({},(typeof g.getBoundingClientRect=="function")?g.getBoundingClientRect():null,{scroll:e?document.documentElement.scrollTop||document.body.scrollTop:f.scrollTop(),width:e?d(window).width():f.outerWidth(),height:e?d(window).height():f.outerHeight()},e?{top:0,left:0}:f.offset())};c.prototype.getCalculatedOffset=function(e,h,f,g){return e=="bottom"?{top:h.top+h.height,left:h.left+h.width/2-f/2}:e=="top"?{top:h.top-g,left:h.left+h.width/2-f/2}:e=="left"?{top:h.top+h.height/2-g/2,left:h.left-f}:{top:h.top+h.height/2-g/2,left:h.left+h.width}};c.prototype.getViewportAdjustedDelta=function(h,k,e,j){var m={top:0,left:0};if(!this.$viewport){return m}var g=this.options.viewport&&this.options.viewport.padding||0;var l=this.getPosition(this.$viewport);if(/right|left/.test(h)){var n=k.top-g-l.scroll;var i=k.top+g-l.scroll+j;if(n<l.top){m.top=l.top-n}else{if(i>l.top+l.height){m.top=l.top+l.height-i}}}else{var o=k.left-g;var f=k.left+g+e;if(o<l.left){m.left=l.left-o}else{if(f>l.width){m.left=l.left+l.width-f}}}return m};c.prototype.getTitle=function(){var g;var e=this.$element;var f=this.options;g=e.attr("data-original-title")||(typeof f.title=="function"?f.title.call(e[0]):f.title);return g};c.prototype.getUID=function(e){do{e+=~~(Math.random()*1000000)}while(document.getElementById(e));return e};c.prototype.tip=function(){return(this.$tip=this.$tip||d(this.options.template))};c.prototype.arrow=function(){return(this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow"))};c.prototype.validate=function(){if(!this.$element[0].parentNode){this.hide();this.$element=null;this.options=null}};c.prototype.enable=function(){this.enabled=true};c.prototype.disable=function(){this.enabled=false};c.prototype.toggleEnabled=function(){this.enabled=!this.enabled};c.prototype.toggle=function(g){var f=this;if(g){f=d(g.currentTarget).data("bs."+this.type);if(!f){f=new this.constructor(g.currentTarget,this.getDelegateOptions());d(g.currentTarget).data("bs."+this.type,f)}}f.tip().hasClass("in")?f.leave(f):f.enter(f)};c.prototype.destroy=function(){clearTimeout(this.timeout);this.hide().$element.off("."+this.type).removeData("bs."+this.type)};function b(e){return this.each(function(){var h=d(this);var g=h.data("bs.tooltip");var f=typeof e=="object"&&e;if(!g&&e=="destroy"){return}if(!g){h.data("bs.tooltip",(g=new c(this,f)))}if(typeof e=="string"){g[e]()}})}var a=d.fn.tooltip;d.fn.tooltip=b;d.fn.tooltip.Constructor=c;d.fn.tooltip.noConflict=function(){d.fn.tooltip=a;return this}}(jQuery);+function(d){var c=function(f,e){this.init("popover",f,e)};if(!d.fn.tooltip){throw new Error("Popover requires tooltip.js")}c.VERSION="3.2.0";c.DEFAULTS=d.extend({},d.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'});c.prototype=d.extend({},d.fn.tooltip.Constructor.prototype);c.prototype.constructor=c;c.prototype.getDefaults=function(){return c.DEFAULTS};c.prototype.setContent=function(){var g=this.tip();var f=this.getTitle();var e=this.getContent();g.find(".popover-title")[this.options.html?"html":"text"](f);g.find(".popover-content").empty()[this.options.html?(typeof e=="string"?"html":"append"):"text"](e);g.removeClass("fade top bottom left right in");if(!g.find(".popover-title").html()){g.find(".popover-title").hide()}};c.prototype.hasContent=function(){return this.getTitle()||this.getContent()};c.prototype.getContent=function(){var e=this.$element;var f=this.options;return e.attr("data-content")||(typeof f.content=="function"?f.content.call(e[0]):f.content)};c.prototype.arrow=function(){return(this.$arrow=this.$arrow||this.tip().find(".arrow"))};c.prototype.tip=function(){if(!this.$tip){this.$tip=d(this.options.template)}return this.$tip};function b(e){return this.each(function(){var h=d(this);var g=h.data("bs.popover");var f=typeof e=="object"&&e;if(!g&&e=="destroy"){return}if(!g){h.data("bs.popover",(g=new c(this,f)))}if(typeof e=="string"){g[e]()}})}var a=d.fn.popover;d.fn.popover=b;d.fn.popover.Constructor=c;d.fn.popover.noConflict=function(){d.fn.popover=a;return this}}(jQuery);+function(d){function c(f,e){var g=d.proxy(this.process,this);this.$body=d("body");this.$scrollElement=d(f).is("body")?d(window):d(f);this.options=d.extend({},c.DEFAULTS,e);this.selector=(this.options.target||"")+" .nav li > a";this.offsets=[];this.targets=[];this.activeTarget=null;this.scrollHeight=0;this.$scrollElement.on("scroll.bs.scrollspy",g);this.refresh();this.process()}c.VERSION="3.2.0";c.DEFAULTS={offset:10};c.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)};c.prototype.refresh=function(){var e="offset";var g=0;if(!d.isWindow(this.$scrollElement[0])){e="position";g=this.$scrollElement.scrollTop()}this.offsets=[];this.targets=[];this.scrollHeight=this.getScrollHeight();var f=this;this.$body.find(this.selector).map(function(){var i=d(this);var h=i.data("target")||i.attr("href");var j=/^#./.test(h)&&d(h);return(j&&j.length&&j.is(":visible")&&[[j[e]().top+g,h]])||null}).sort(function(i,h){return i[0]-h[0]}).each(function(){f.offsets.push(this[0]);f.targets.push(this[1])})};c.prototype.process=function(){var k=this.$scrollElement.scrollTop()+this.options.offset;var g=this.getScrollHeight();var j=this.options.offset+g-this.$scrollElement.height();var h=this.offsets;var e=this.targets;var l=this.activeTarget;var f;if(this.scrollHeight!=g){this.refresh()}if(k>=j){return l!=(f=e[e.length-1])&&this.activate(f)}if(l&&k<=h[0]){return l!=(f=e[0])&&this.activate(f)}for(f=h.length;f--;){l!=e[f]&&k>=h[f]&&(!h[f+1]||k<=h[f+1])&&this.activate(e[f])}};c.prototype.activate=function(g){this.activeTarget=g;d(this.selector).parentsUntil(this.options.target,".active").removeClass("active");var e=this.selector+'[data-target="'+g+'"],'+this.selector+'[href="'+g+'"]';var f=d(e).parents("li").addClass("active");if(f.parent(".dropdown-menu").length){f=f.closest("li.dropdown").addClass("active")}f.trigger("activate.bs.scrollspy")};function b(e){return this.each(function(){var h=d(this);var g=h.data("bs.scrollspy");var f=typeof e=="object"&&e;if(!g){h.data("bs.scrollspy",(g=new c(this,f)))}if(typeof e=="string"){g[e]()}})}var a=d.fn.scrollspy;d.fn.scrollspy=b;d.fn.scrollspy.Constructor=c;d.fn.scrollspy.noConflict=function(){d.fn.scrollspy=a;return this};d(window).on("load.bs.scrollspy.data-api",function(){d('[data-spy="scroll"]').each(function(){var e=d(this);b.call(e,e.data())})})}(jQuery);+function(d){var b=function(e){this.element=d(e)};b.VERSION="3.2.0";b.prototype.show=function(){var k=this.element;var h=k.closest("ul:not(.dropdown-menu)");var g=k.data("target");if(!g){g=k.attr("href");g=g&&g.replace(/.*(?=#[^\s]*$)/,"")}if(k.parent("li").hasClass("active")){return}var i=h.find(".active:last a")[0];var j=d.Event("show.bs.tab",{relatedTarget:i});k.trigger(j);if(j.isDefaultPrevented()){return}var f=d(g);this.activate(k.closest("li"),h);this.activate(f,f.parent(),function(){k.trigger({type:"shown.bs.tab",relatedTarget:i})})};b.prototype.activate=function(g,f,j){var e=f.find("> .active");var i=j&&d.support.transition&&e.hasClass("fade");function h(){e.removeClass("active").find("> .dropdown-menu > .active").removeClass("active");g.addClass("active");if(i){g[0].offsetWidth;g.addClass("in")}else{g.removeClass("fade")}if(g.parent(".dropdown-menu")){g.closest("li.dropdown").addClass("active")}j&&j()}i?e.one("bsTransitionEnd",h).emulateTransitionEnd(150):h();e.removeClass("in")};function c(e){return this.each(function(){var g=d(this);var f=g.data("bs.tab");if(!f){g.data("bs.tab",(f=new b(this)))}if(typeof e=="string"){f[e]()}})}var a=d.fn.tab;d.fn.tab=c;d.fn.tab.Constructor=b;d.fn.tab.noConflict=function(){d.fn.tab=a;return this};d(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(f){f.preventDefault();c.call(d(this),"show")})}(jQuery);+function(d){var c=function(f,e){this.options=d.extend({},c.DEFAULTS,e);this.$target=d(this.options.target).on("scroll.bs.affix.data-api",d.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",d.proxy(this.checkPositionWithEventLoop,this));this.$element=d(f);this.affixed=this.unpin=this.pinnedOffset=null;this.checkPosition()};c.VERSION="3.2.0";c.RESET="affix affix-top affix-bottom";c.DEFAULTS={offset:0,target:window};c.prototype.getPinnedOffset=function(){if(this.pinnedOffset){return this.pinnedOffset}this.$element.removeClass(c.RESET).addClass("affix");var f=this.$target.scrollTop();var e=this.$element.offset();return(this.pinnedOffset=e.top-f)};c.prototype.checkPositionWithEventLoop=function(){setTimeout(d.proxy(this.checkPosition,this),1)};c.prototype.checkPosition=function(){if(!this.$element.is(":visible")){return}var n=d(document).height();var f=this.$target.scrollTop();var k=this.$element.offset();var i=this.options.offset;var g=i.top;var h=i.bottom;if(typeof i!="object"){h=g=i}if(typeof g=="function"){g=i.top(this.$element)}if(typeof h=="function"){h=i.bottom(this.$element)}var j=this.unpin!=null&&(f+this.unpin<=k.top)?false:h!=null&&(k.top+this.$element.height()>=n-h)?"bottom":g!=null&&(f<=g)?"top":false;if(this.affixed===j){return}if(this.unpin!=null){this.$element.css("top","")}var m="affix"+(j?"-"+j:"");var l=d.Event(m+".bs.affix");this.$element.trigger(l);if(l.isDefaultPrevented()){return}this.affixed=j;this.unpin=j=="bottom"?this.getPinnedOffset():null;this.$element.removeClass(c.RESET).addClass(m).trigger(d.Event(m.replace("affix","affixed")));if(j=="bottom"){this.$element.offset({top:n-this.$element.height()-h})}};function b(e){return this.each(function(){var h=d(this);var g=h.data("bs.affix");var f=typeof e=="object"&&e;if(!g){h.data("bs.affix",(g=new c(this,f)))}if(typeof e=="string"){g[e]()}})}var a=d.fn.affix;d.fn.affix=b;d.fn.affix.Constructor=c;d.fn.affix.noConflict=function(){d.fn.affix=a;return this};d(window).on("load",function(){d('[data-spy="affix"]').each(function(){var f=d(this);var e=f.data();e.offset=e.offset||{};if(e.offsetBottom){e.offset.bottom=e.offsetBottom}if(e.offsetTop){e.offset.top=e.offsetTop}b.call(f,e)})})}(jQuery);
\ No newline at end of file
diff --git a/site/src/site/assets/js/vendor/bootstrap.min.js b/js/vendor/bootstrap.min.js
similarity index 100%
rename from site/src/site/assets/js/vendor/bootstrap.min.js
rename to js/vendor/bootstrap.min.js
diff --git a/js/vendor/classie.js b/js/vendor/classie.js
new file mode 100644
index 0000000..ed7e3b0
--- /dev/null
+++ b/js/vendor/classie.js
@@ -0,0 +1,10 @@
+/*!
+ * classie - class helper functions
+ * from bonzo https://github.com/ded/bonzo
+ * 
+ * classie.has( elem, 'my-class' ) -> true/false
+ * classie.add( elem, 'my-new-class' )
+ * classie.remove( elem, 'my-unwanted-class' )
+ * classie.toggle( elem, 'my-class' )
+ */
+(function(e){function a(h){return new RegExp("(^|\\s+)"+h+"(\\s+|$)")}var d,f,g;if("classList" in document.documentElement){d=function(h,i){return h.classList.contains(i)};f=function(h,i){h.classList.add(i)};g=function(h,i){h.classList.remove(i)}}else{d=function(h,i){return a(i).test(h.className)};f=function(h,i){if(!d(h,i)){h.className=h.className+" "+i}};g=function(h,i){h.className=h.className.replace(a(i)," ")}}function b(i,j){var h=d(i,j)?g:f;h(i,j)}var c={hasClass:d,addClass:f,removeClass:g,toggleClass:b,has:d,add:f,remove:g,toggle:b};if(typeof define==="function"&&define.amd){define(c)}else{e.classie=c}})(window);
\ No newline at end of file
diff --git a/site/src/site/assets/js/vendor/jquery-1.10.2.min.js b/js/vendor/jquery-1.10.2.min.js
similarity index 100%
rename from site/src/site/assets/js/vendor/jquery-1.10.2.min.js
rename to js/vendor/jquery-1.10.2.min.js
diff --git a/site/src/site/assets/js/vendor/modernizr-2.6.2.min.js b/js/vendor/modernizr-2.6.2.min.js
similarity index 100%
rename from site/src/site/assets/js/vendor/modernizr-2.6.2.min.js
rename to js/vendor/modernizr-2.6.2.min.js
diff --git a/js/vendor/sidebarEffects.js b/js/vendor/sidebarEffects.js
new file mode 100644
index 0000000..0986cff
--- /dev/null
+++ b/js/vendor/sidebarEffects.js
@@ -0,0 +1 @@
+var SidebarMenuEffects=(function(){function c(f,d){if(f===document){return false}if(classie.has(f,d)){return true}return f.parentNode&&c(f.parentNode,d)}function a(){var d=false;(function(e){if(/(android|ipad|playbook|silk|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(e)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(e.substr(0,4))){d=true}})(navigator.userAgent||navigator.vendor||window.opera);return d}function b(){var d=document.getElementById("st-container"),f=Array.prototype.slice.call(document.querySelectorAll(".st-trigger")),g=a()?"touchstart":"click",h=function(){classie.remove(d,"st-menu-open");$("html").removeClass("noScroll")},e=function(i){if(!c(i.target,"st-menu")){h();document.removeEventListener(g,e)}};f.forEach(function(l,j){var k=l.getAttribute("data-effect");l.addEventListener(g,function(i){i.stopPropagation();i.preventDefault();d.className="st-container";classie.add(d,k);setTimeout(function(){classie.add(d,"st-menu-open");$("html").addClass("noScroll")},25);document.addEventListener(g,e)})})}b()})();
\ No newline at end of file
diff --git a/search.html b/search.html
new file mode 100644
index 0000000..ea99207
--- /dev/null
+++ b/search.html
@@ -0,0 +1,184 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><title>The Apache Groovy programming language - Search</title><link href='img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='css/style.css'/>
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: 20px; right: -58px; border: 0; z-index: 100; transform: rotate(45deg);' src='/img/horizontal-github-ribbon.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/groovy-weekly.html' class='icon'><span class='fa fa-envelope-o'></span> Groovy newsletter</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+                <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span>
+                                    </button><a class='navbar-brand' href='index.html'>
+                                        <i class='fa fa-star'></i> Apache Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li class=''><a href='/download.html'>Download</a></li><li class=''><a href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='/'>Contribute</a></li><li class=''><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li>
+                                            <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class='active'>
+                                            <a href='search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'></div><div class='col-lg-8 col-lg-pull-0'><div id='contribute-btn'>
+                                            <button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/groovy-website/tree/asf-site/site/src/site/pages/search.groovy"'>
+                                                <i class='fa fa-pencil-square-o'></i> Improve this doc
+                                            </button>
+                                        </div><h1><i class='fa fa-search'></i> Search</h1><p>
+                                You can search the Groovy website, the Groovy documentation, and the Groovy APIs,
+                                with the Google Custom Search box below. Please type your search query, and hit enter:</p><div><script>
+                                  (function() {
+                                    var cx = '013939896723962546743:hbhn__olhii';
+                                    var gcse = document.createElement('script');
+                                    gcse.type = 'text/javascript';
+                                    gcse.async = true;
+                                    gcse.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') +
+                                        '//www.google.com/cse/cse.js?cx=' + cx;
+                                    var s = document.getElementsByTagName('script')[0];
+                                    s.parentNode.insertBefore(gcse, s);
+                                  })();
+                                </script><gcse:search linkTarget='_blank'></gcse:search><style>
+                                    .gsc-input-box {
+                                        height: 30px;
+                                    }
+                                    input.gsc-search-button, input.gsc-search-button-v2 {
+                                        height: 30px;
+                                        display: none;
+                                    }
+                                    .gs-title {
+                                        line-height: 20px;
+                                        font-weight: bold;
+                                    }
+                                    .gs-snippet {
+                                        margin-left: 8px;
+                                        line-height: 18px;
+                                        font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
+                                    }
+                                    .gsc-cursor-page {
+                                        margin: 4px;
+                                        padding: 4px;
+                                        padding-left: 8px;
+                                        padding-right: 8px;
+                                        border: 1px solid gray;
+                                    }
+                                    .gsc-cursor-page:hover {
+                                        color: white !important;
+                                        background-color: #db4800 !important;
+                                        text-decoration: none !important;
+                                    }
+                                    .gsc-cursor-current-page {
+                                        background-color: #F2F2F2 !important;
+                                        color: black !important;
+                                    }
+                                    .gsc-selected-option-container {
+                                        width: 120px !important;
+                                    }
+                                    td.gsc-search-button {
+                                        padding-top: 6px;
+                                    }
+                                    td.gsc-orderby-container {
+                                        padding-right: 20px;
+                                    }
+                                    .gs-no-results-result .gs-snippet {
+                                        font-weight: bold;
+                                        color: #db4800;
+                                        background-color: white;
+                                        border: 0px;
+                                    }
+                                    .gsc-webResult, .gsc-result {
+                                        font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
+                                    }
+                                    .gsst_a, .gscb_a {
+                                        margin-top: 3px;
+                                    }
+                                    .gs-per-result-labels {
+                                        margin-left: 8px;
+                                        margin-top: 4px;
+                                    }
+                                    .gs-per-result-labels:before {
+                                        font-family: FontAwesome;
+                                        content: '\f02c';
+                                        margin-right: 8px;
+                                    }
+                                    .gsc-tabHeader.gsc-tabhActive {
+                                        border-color: #CCCCCC;
+                                        border-bottom-color: #F2F2F2;
+                                        background-color: #F2F2F2;
+                                    }
+                                    .gsc-tabsArea {
+                                        border-bottom: 0;
+                                    }
+                                    a.gs-label, img.gs-image {
+                                        margin-left: 5px;
+                                    }
+                                </style></div><hr class='divider'/></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='/download.html'>Download</a></li><li><a href='http://groovy-lang.org/support.html'>Support</a></li><li><a href='/'>Contribute</a></li><li><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='http://groovy-lang.org/security.html'>Security</a></li><li><a href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='http://groovy-lang.org/search.html'>Search</a></li>
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a href='http://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='http://groovy-lang.org/groovy-weekly.html'>Groovy newsletter</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='http://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li>
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community
+                                        </p><img src='img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' class='img-responsive'/>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2019 the Apache Groovy project &mdash; Groovy is Open Source, <a href='http://www.apache.org/licenses/LICENSE-2.0.html'>Apache 2 License</a></div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='js/vendor/jquery-1.10.2.min.js' defer></script><script src='js/vendor/classie.js' defer></script><script src='js/vendor/bootstrap.js' defer></script><script src='js/vendor/sidebarEffects.js' defer></script><script src='js/vendor/modernizr-2.6.2.min.js' defer></script><script src='js/plugins.js' defer></script><script>
+          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
deleted file mode 100644
index 2fd2033..0000000
--- a/settings.gradle
+++ /dev/null
@@ -1,4 +0,0 @@
-rootProject.name = 'groovy-user-site'
-
-include 'generator','site'
-
diff --git a/site/build.gradle b/site/build.gradle
deleted file mode 100644
index d63bb9a..0000000
--- a/site/build.gradle
+++ /dev/null
@@ -1,230 +0,0 @@
-import org.apache.http.client.config.RequestConfig
-import org.apache.http.client.methods.CloseableHttpResponse
-import org.apache.http.client.methods.HttpGet
-import org.apache.http.impl.client.CloseableHttpClient
-import org.apache.http.impl.client.HttpClients
-import groovy.text.markup.MarkupTemplateEngine
-import groovy.text.markup.TemplateConfiguration
-import org.gradle.internal.logging.ConsoleRenderer
-import com.yahoo.platform.yui.compressor.CssCompressor
-import com.yahoo.platform.yui.compressor.JavaScriptCompressor
-import org.apache.tools.ant.filters.BaseFilterReader
-
-buildscript {
-    repositories {
-        jcenter()
-    }
-    dependencies {
-        classpath 'org.apache.httpcomponents:httpclient:4.5.1'
-    }
-}
-
-ext.watchmode = project.hasProperty('watchmode')?project.getProperty('watchmode'):'false'
-
-apply plugin: 'base'
-
-task copyAssets(type:Copy) {
-    from file('src/site/assets')
-    into file("$buildDir/site")
-    filesMatching('**/*.css') { f->
-        if (!f.name.contains('.min.')) {
-            filter(CssFilter)
-        }
-    }
-    filesMatching('**/*.js') { f->
-        if (!f.name.contains('.min.')) {
-            filter(JsFilter)
-        }
-    }
-}
-
-task generateSite(type:JavaExec) {
-
-    description = 'Generates the Groovy Website'
-    dependsOn copyAssets
-
-    ext.sources = file('src/site')
-    ext.outputDir = file("$buildDir/site")
-
-    inputs.files fileTree(sources)
-    outputs.files fileTree(outputDir)
-
-    classpath = project(':generator').sourceSets.main.runtimeClasspath
-    main = 'generator.SiteGenerator'
-    args = [sources, outputDir, project.watchmode]
-    systemProperties.docs_baseurl = System.getProperty('docs_baseurl')
-}
-
-task checkDeadLinks(dependsOn: generateSite) {
-    description = "Checks for dead links in the generated Groovy website"
-
-    ext.outputDir = file("$buildDir/reports")
-    ext.reportFile = file("$outputDir/deadlinks.html")
-
-    inputs.files fileTree(generateSite.outputDir)
-    outputs.file reportFile
-
-    // a collection of links which have either been validated
-    // or are dummy links
-    def excludeFromChecks = [
-            'http://issues.apache.org/jira',
-            'https://issues.apache.org/jira',
-            'target.html',
-            'foo.html',
-            'http://www.acme.com/cars',
-            'http://localhost:8080/groovy/hello.groovy'
-    ]
-
-    doLast {
-        def deadLinks = [:]
-
-        def currentPath
-        def isDead = [:].withDefault { String link ->
-            if (excludeFromChecks.any { link.startsWith(it) }) {
-                // skip checking those links because they dramatically increase build time
-                // while being most likely ok because generated through changelog parsing
-                return false
-            }
-
-            try {
-                URL url
-                try {
-                    url = URI.create(link).toURL()
-                } catch (e) {
-                    if (e.message.contains('URI is not absolute')) {
-                        url = URI.create("file://${file("${generateSite.outputDir}/$currentPath/$link").absoluteFile}").toURL()
-                    }
-                }
-                logger.debug("Checking URL: $url")
-                def cx = url.openConnection()
-                if (cx instanceof HttpURLConnection) {
-                    CloseableHttpClient httpclient = HttpClients.createDefault()
-                    RequestConfig requestConfig = RequestConfig.custom()
-                            .setSocketTimeout(5_000)
-                            .setConnectTimeout(5_000)
-                            .setConnectionRequestTimeout(5_000)
-                            .build()
-                    HttpGet httpget = new HttpGet(link)
-                    httpget.config = requestConfig
-                    CloseableHttpResponse response
-                    try {
-                        response = httpclient.execute(httpget)
-                        if (response.statusLine.statusCode == 404) {
-                            return true
-                        }
-                    } finally {
-                        response.close()
-                    }
-                }
-            } catch (e) {
-                return true
-            }
-            return false
-        }
-
-        def checkLink = { List dead, int line, String link ->
-            if (isDead[link]) {
-                dead << [line:line, link:link]
-            }
-        }
-
-        def checkPage = { File f ->
-            currentPath = GFileUtils.relativePath(generateSite.outputDir, f.parentFile)
-            f.eachLine('utf-8') { String line, int nb ->
-                def dead = []
-                [/\shref=['"](.+?)['"]/, /src=['"](.+?)['"]/].each { regex ->
-                    def matcher = line =~ regex
-                    if (matcher) {
-                        matcher.each {
-                            def path = it[1]
-                            checkLink(dead, nb, path)
-                        }
-                    }
-                }
-                if (dead) {
-                    deadLinks[f] = dead
-                }
-            }
-        }
-
-        file(generateSite.outputDir).eachFileRecurse {
-            if (it.name.endsWith('.html')) {
-                checkPage(it)
-            }
-        }
-
-        outputDir.mkdirs()
-        def tplConf = new TemplateConfiguration()
-        tplConf.with {
-            autoIndent = true
-            autoNewLine = true
-        }
-        def tplEngine = new MarkupTemplateEngine(this.class.classLoader, file('gradle/templates'), tplConf)
-
-        def report = tplEngine.createTemplateByPath("deadlinks.groovy").make(deadLinks: deadLinks).toString()
-
-        reportFile.write(report, 'utf-8')
-        def reportURL = new ConsoleRenderer().asClickableFileUrl(reportFile)
-        logger.lifecycle "Dead links report written at $reportURL"
-    }
-}
-
-task webzip(type:Zip, dependsOn: checkDeadLinks) {
-    description = "Creates a zip with the generated website and the deadlink report"
-    destinationDir = file("$buildDir/distributions")
-
-    baseName = 'groovy'
-    appendix = 'website'
-    from(generateSite.outputDir) {
-        into 'site'
-    }
-    from (checkDeadLinks.outputDir) {
-        into 'reports'
-    }
-}
-
-// Resource filtering classes
-
-class JsFilter extends BaseFilterReader {
-    Writer writer
-    Thread worker
-
-    JsFilter(Reader reader) {
-        super(new PipedReader())
-        writer = new PipedWriter(this.@in)
-        def compressor = new JavaScriptCompressor(reader, null)
-        reader.close()
-        worker = Thread.start {
-            compressor.compress(writer, -1, true, false, false, false)
-            writer.close()
-        }
-    }
-
-    void close() {
-        worker.join()
-        super.close()
-    }
-
-}
-
-class CssFilter extends BaseFilterReader {
-    Writer writer
-    Thread worker
-
-    CssFilter(Reader reader) {
-        super(new PipedReader())
-        writer = new PipedWriter(this.@in)
-        def compressor = new CssCompressor(reader)
-        reader.close()
-        worker = Thread.start {
-            compressor.compress(writer, -1)
-            writer.close()
-        }
-    }
-
-    void close() {
-        worker.join()
-        super.close()
-    }
-
-}
diff --git a/site/gradle/templates/deadlinks.groovy b/site/gradle/templates/deadlinks.groovy
deleted file mode 100644
index 726a11f..0000000
--- a/site/gradle/templates/deadlinks.groovy
+++ /dev/null
@@ -1,25 +0,0 @@
-html {
-    head {
-        title 'Dead links report'
-    }
-    body {
-        h1('Dead links report')
-        if (!deadLinks) {
-            p("No dead link found. All green!")
-        } else {
-            p "Found a total of ${deadLinks.values().sum { it.size()}} dead links."
-            p """Not that not all dead links can be fixed directly in the Groovy website project: some of them
-are generated in the Groovy documentation instead."""
-            p "The following files contain dead links:"
-        }
-        deadLinks.each { entry ->
-            def (page, links) = [entry.key, entry.value]
-            h3 { a(href:page,page) }
-            ul {
-                links.each { link ->
-                    asciidoc("At line ${link.line}, dead link to ${link.link}")
-                }
-            }
-        }
-    }
-}
diff --git a/site/src/site/assets/css/book.css b/site/src/site/assets/css/book.css
deleted file mode 100644
index 517dd54..0000000
--- a/site/src/site/assets/css/book.css
+++ /dev/null
@@ -1,680 +0,0 @@
-.book-btn {
-    display: inline-block;
-    text-transform: uppercase;
-    text-decoration: none;
-    border: 2px solid black;
-    margin-top: 100px;
-    font-size: 0.7em;
-    font-weight: 700;
-    padding: 0.1em 0.4em;
-    margin-left: 40px;
-    text-align: center;
-    -webkit-transition: color 0.3s, border-color 0.3s;
-    -moz-transition: color 0.3s, border-color 0.3s;
-    transition: color 0.3s, border-color 0.3s;
-}
-
-.book-btn:hover {
-    border-color: #db4800;
-    color: #db4800;
-}
-
-/* ///////////////////////////////////////////////////
-
-HARDCOVER
-Table of Contents
-
-1. container
-2. background & color
-3. opening cover, back cover and pages
-4. position, transform y transition
-5. events
-6. Bonus
-    - Cover design
-    - Ribbon
-    - Figcaption
-7. mini-reset
-
-/////////////////////////////////////////////////////*/
-
-/*
-    1. container
-*/
-
-.book {
-    position: relative;
-    width: 160px;
-    height: 220px;
-    -webkit-perspective: 1000px;
-    -moz-perspective: 1000px;
-    perspective: 1000px;
-    -webkit-transform-style: preserve-3d;
-    -moz-transform-style: preserve-3d;
-    transform-style: preserve-3d;
-    margin: 20px;
-    margin-bottom: 40px;
-    margin-left: 60px;
-}
-
-.book ul {
-    list-style: none;
-}
-
-/*
-    2. background & color
-*/
-
-/* HARDCOVER FRONT */
-.hardcover_front li:first-child {
-    background-color: #eee;
-    -webkit-backface-visibility: hidden;
-    -moz-backface-visibility: hidden;
-    backface-visibility: hidden;
-}
-
-/* reverse */
-.hardcover_front li:last-child {
-    background: #fffbec;
-}
-
-/* HARDCOVER BACK */
-.hardcover_back li:first-child {
-    background: #fffbec;
-}
-
-/* reverse */
-.hardcover_back li:last-child {
-    background: #fffbec;
-}
-
-.book_spine li:first-child {
-    background: #eee;
-}
-
-.book_spine li:last-child {
-    background: #333;
-}
-
-/* thickness of cover */
-
-.hardcover_front li:first-child:after,
-.hardcover_front li:first-child:before,
-.hardcover_front li:last-child:after,
-.hardcover_front li:last-child:before,
-.hardcover_back li:first-child:after,
-.hardcover_back li:first-child:before,
-.hardcover_back li:last-child:after,
-.hardcover_back li:last-child:before,
-.book_spine li:first-child:after,
-.book_spine li:first-child:before,
-.book_spine li:last-child:after,
-.book_spine li:last-child:before {
-    background: #999;
-}
-
-/* page */
-
-.page > li {
-    background: -webkit-linear-gradient(left, #e1ddd8 0%, #fffbf6 100%);
-    background: -moz-linear-gradient(left, #e1ddd8 0%, #fffbf6 100%);
-    background: -ms-linear-gradient(left, #e1ddd8 0%, #fffbf6 100%);
-    background: linear-gradient(left, #e1ddd8 0%, #fffbf6 100%);
-    box-shadow: inset 0px -1px 2px rgba(50, 50, 50, 0.1), inset -1px 0px 1px rgba(150, 150, 150, 0.2);
-    border-radius: 0px 5px 5px 0px;
-}
-
-/*
-    3. opening cover, back cover and pages
-*/
-
-.hardcover_front {
-    -webkit-transform: rotateY(-34deg) translateZ(8px);
-    -moz-transform: rotateY(-34deg) translateZ(8px);
-    transform: rotateY(-34deg) translateZ(8px);
-    z-index: 100;
-}
-
-.hardcover_back {
-    -webkit-transform: rotateY(-15deg) translateZ(-8px);
-    -moz-transform: rotateY(-15deg) translateZ(-8px);
-    transform: rotateY(-15deg) translateZ(-8px);
-}
-
-.page li:nth-child(1) {
-    -webkit-transform: rotateY(-28deg);
-    -moz-transform: rotateY(-28deg);
-    transform: rotateY(-28deg);
-}
-
-.page li:nth-child(2) {
-    -webkit-transform: rotateY(-30deg);
-    -moz-transform: rotateY(-30deg);
-    transform: rotateY(-30deg);
-}
-
-.page li:nth-child(3) {
-    -webkit-transform: rotateY(-32deg);
-    -moz-transform: rotateY(-32deg);
-    transform: rotateY(-32deg);
-}
-
-.page li:nth-child(4) {
-    -webkit-transform: rotateY(-34deg);
-    -moz-transform: rotateY(-34deg);
-    transform: rotateY(-34deg);
-}
-
-.page li:nth-child(5) {
-    -webkit-transform: rotateY(-36deg);
-    -moz-transform: rotateY(-36deg);
-    transform: rotateY(-36deg);
-}
-
-/*
-    4. position, transform & transition
-*/
-
-.hardcover_front,
-.hardcover_back,
-.book_spine,
-.hardcover_front li,
-.hardcover_back li,
-.book_spine li {
-    position: absolute;
-    top: 0;
-    left: 0;
-    width: 100%;
-    height: 100%;
-    -webkit-transform-style: preserve-3d;
-    -moz-transform-style: preserve-3d;
-    transform-style: preserve-3d;
-}
-
-.hardcover_front,
-.hardcover_back {
-    -webkit-transform-origin: 0% 100%;
-    -moz-transform-origin: 0% 100%;
-    transform-origin: 0% 100%;
-}
-
-.hardcover_front {
-    -webkit-transition: all 0.8s ease, z-index 0.6s;
-    -moz-transition: all 0.8s ease, z-index 0.6s;
-    transition: all 0.8s ease, z-index 0.6s;
-}
-
-/* HARDCOVER front */
-.hardcover_front li:first-child {
-    cursor: default;
-    -webkit-user-select: none;
-    -moz-user-select: none;
-    user-select: none;
-    -webkit-transform: translateZ(2px);
-    -moz-transform: translateZ(2px);
-    transform: translateZ(2px);
-}
-
-.hardcover_front li:last-child {
-    -webkit-transform: rotateY(180deg) translateZ(2px);
-    -moz-transform: rotateY(180deg) translateZ(2px);
-    transform: rotateY(180deg) translateZ(2px);
-}
-
-/* HARDCOVER back */
-.hardcover_back li:first-child {
-    -webkit-transform: translateZ(2px);
-    -moz-transform: translateZ(2px);
-    transform: translateZ(2px);
-}
-
-.hardcover_back li:last-child {
-    -webkit-transform: translateZ(-2px);
-    -moz-transform: translateZ(-2px);
-    transform: translateZ(-2px);
-}
-
-/* thickness of cover */
-.hardcover_front li:first-child:after,
-.hardcover_front li:first-child:before,
-.hardcover_front li:last-child:after,
-.hardcover_front li:last-child:before,
-.hardcover_back li:first-child:after,
-.hardcover_back li:first-child:before,
-.hardcover_back li:last-child:after,
-.hardcover_back li:last-child:before,
-.book_spine li:first-child:after,
-.book_spine li:first-child:before,
-.book_spine li:last-child:after,
-.book_spine li:last-child:before {
-    position: absolute;
-    top: 0;
-    left: 0;
-}
-
-/* HARDCOVER front */
-.hardcover_front li:first-child:after,
-.hardcover_front li:first-child:before {
-    width: 4px;
-    height: 100%;
-}
-
-.hardcover_front li:first-child:after {
-    -webkit-transform: rotateY(90deg) translateZ(-2px) translateX(2px);
-    -moz-transform: rotateY(90deg) translateZ(-2px) translateX(2px);
-    transform: rotateY(90deg) translateZ(-2px) translateX(2px);
-}
-
-.hardcover_front li:first-child:before {
-    -webkit-transform: rotateY(90deg) translateZ(158px) translateX(2px);
-    -moz-transform: rotateY(90deg) translateZ(158px) translateX(2px);
-    transform: rotateY(90deg) translateZ(158px) translateX(2px);
-}
-
-.hardcover_front li:last-child:after,
-.hardcover_front li:last-child:before {
-    width: 4px;
-    height: 160px;
-}
-
-.hardcover_front li:last-child:after {
-    -webkit-transform: rotateX(90deg) rotateZ(90deg) translateZ(80px) translateX(-2px) translateY(-78px);
-    -moz-transform: rotateX(90deg) rotateZ(90deg) translateZ(80px) translateX(-2px) translateY(-78px);
-    transform: rotateX(90deg) rotateZ(90deg) translateZ(80px) translateX(-2px) translateY(-78px);
-}
-
-.hardcover_front li:last-child:before {
-    box-shadow: 0px 0px 30px 5px #333;
-    -webkit-transform: rotateX(90deg) rotateZ(90deg) translateZ(-140px) translateX(-2px) translateY(-78px);
-    -moz-transform: rotateX(90deg) rotateZ(90deg) translateZ(-140px) translateX(-2px) translateY(-78px);
-    transform: rotateX(90deg) rotateZ(90deg) translateZ(-140px) translateX(-2px) translateY(-78px);
-}
-
-/* thickness of cover */
-
-.hardcover_back li:first-child:after,
-.hardcover_back li:first-child:before {
-    width: 4px;
-    height: 100%;
-}
-
-.hardcover_back li:first-child:after {
-    -webkit-transform: rotateY(90deg) translateZ(-2px) translateX(2px);
-    -moz-transform: rotateY(90deg) translateZ(-2px) translateX(2px);
-    transform: rotateY(90deg) translateZ(-2px) translateX(2px);
-}
-
-.hardcover_back li:first-child:before {
-    -webkit-transform: rotateY(90deg) translateZ(158px) translateX(2px);
-    -moz-transform: rotateY(90deg) translateZ(158px) translateX(2px);
-    transform: rotateY(90deg) translateZ(158px) translateX(2px);
-}
-
-.hardcover_back li:last-child:after,
-.hardcover_back li:last-child:before {
-    width: 4px;
-    height: 160px;
-}
-
-.hardcover_back li:last-child:after {
-    -webkit-transform: rotateX(90deg) rotateZ(90deg) translateZ(80px) translateX(2px) translateY(-78px);
-    -moz-transform: rotateX(90deg) rotateZ(90deg) translateZ(80px) translateX(2px) translateY(-78px);
-    transform: rotateX(90deg) rotateZ(90deg) translateZ(80px) translateX(2px) translateY(-78px);
-}
-
-.hardcover_back li:last-child:before {
-    box-shadow: 10px -1px 80px 20px #666;
-    -webkit-transform: rotateX(90deg) rotateZ(90deg) translateZ(-140px) translateX(2px) translateY(-78px);
-    -moz-transform: rotateX(90deg) rotateZ(90deg) translateZ(-140px) translateX(2px) translateY(-78px);
-    transform: rotateX(90deg) rotateZ(90deg) translateZ(-140px) translateX(2px) translateY(-78px);
-}
-
-/* BOOK SPINE */
-.book_spine {
-    -webkit-transform: rotateY(60deg) translateX(-5px) translateZ(-12px);
-    -moz-transform: rotateY(60deg) translateX(-5px) translateZ(-12px);
-    transform: rotateY(60deg) translateX(-5px) translateZ(-12px);
-    width: 16px;
-    z-index: 0;
-}
-
-.book_spine li:first-child {
-    -webkit-transform: translateZ(2px);
-    -moz-transform: translateZ(2px);
-    transform: translateZ(2px);
-}
-
-.book_spine li:last-child {
-    -webkit-transform: translateZ(-2px);
-    -moz-transform: translateZ(-2px);
-    transform: translateZ(-2px);
-}
-
-/* thickness of book spine */
-.book_spine li:first-child:after,
-.book_spine li:first-child:before {
-    width: 4px;
-    height: 100%;
-}
-
-.book_spine li:first-child:after {
-    -webkit-transform: rotateY(90deg) translateZ(-2px) translateX(2px);
-    -moz-transform: rotateY(90deg) translateZ(-2px) translateX(2px);
-    transform: rotateY(90deg) translateZ(-2px) translateX(2px);
-}
-
-.book_spine li:first-child:before {
-    -webkit-transform: rotateY(-90deg) translateZ(-12px);
-    -moz-transform: rotateY(-90deg) translateZ(-12px);
-    transform: rotateY(-90deg) translateZ(-12px);
-}
-
-.book_spine li:last-child:after,
-.book_spine li:last-child:before {
-    width: 4px;
-    height: 16px;
-}
-
-.book_spine li:last-child:after {
-    -webkit-transform: rotateX(90deg) rotateZ(90deg) translateZ(8px) translateX(2px) translateY(-6px);
-    -moz-transform: rotateX(90deg) rotateZ(90deg) translateZ(8px) translateX(2px) translateY(-6px);
-    transform: rotateX(90deg) rotateZ(90deg) translateZ(8px) translateX(2px) translateY(-6px);
-}
-
-.book_spine li:last-child:before {
-    box-shadow: 5px -1px 100px 40px rgba(0, 0, 0, 0.2);
-    -webkit-transform: rotateX(90deg) rotateZ(90deg) translateZ(-210px) translateX(2px) translateY(-6px);
-    -moz-transform: rotateX(90deg) rotateZ(90deg) translateZ(-210px) translateX(2px) translateY(-6px);
-    transform: rotateX(90deg) rotateZ(90deg) translateZ(-210px) translateX(2px) translateY(-6px);
-}
-
-.page,
-.page > li {
-    position: absolute;
-    top: 0;
-    left: 0;
-    -webkit-transform-style: preserve-3d;
-    -moz-transform-style: preserve-3d;
-    transform-style: preserve-3d;
-}
-
-.page {
-    width: 100%;
-    height: 98%;
-    top: 1%;
-    left: 3%;
-    z-index: 10;
-}
-
-.page > li {
-    width: 100%;
-    height: 100%;
-    -webkit-transform-origin: left center;
-    -moz-transform-origin: left center;
-    transform-origin: left center;
-    -webkit-transition-property: transform;
-    -moz-transition-property: transform;
-    transition-property: transform;
-    -webkit-transition-timing-function: ease;
-    -moz-transition-timing-function: ease;
-    transition-timing-function: ease;
-}
-
-.page > li:nth-child(1) {
-    -webkit-transition-duration: 0.6s;
-    -moz-transition-duration: 0.6s;
-    transition-duration: 0.6s;
-}
-
-.page > li:nth-child(2) {
-    -webkit-transition-duration: 0.6s;
-    -moz-transition-duration: 0.6s;
-    transition-duration: 0.6s;
-}
-
-.page > li:nth-child(3) {
-    -webkit-transition-duration: 0.4s;
-    -moz-transition-duration: 0.4s;
-    transition-duration: 0.4s;
-}
-
-.page > li:nth-child(4) {
-    -webkit-transition-duration: 0.5s;
-    -moz-transition-duration: 0.5s;
-    transition-duration: 0.5s;
-}
-
-.page > li:nth-child(5) {
-    -webkit-transition-duration: 0.6s;
-    -moz-transition-duration: 0.6s;
-    transition-duration: 0.6s;
-}
-
-/*
-    5. events
-*/
-
-@media screen and (min-width: 768px) {
-    .book:hover > .hardcover_front {
-        -webkit-transform: rotateY(-145deg) translateZ(0);
-        -moz-transform: rotateY(-145deg) translateZ(0);
-        transform: rotateY(-145deg) translateZ(0);
-        z-index: 0;
-    }
-
-    .book:hover > .page li:nth-child(1) {
-        -webkit-transform: rotateY(-30deg);
-        -moz-transform: rotateY(-30deg);
-        transform: rotateY(-30deg);
-        -webkit-transition-duration: 1.5s;
-        -moz-transition-duration: 1.5s;
-        transition-duration: 1.5s;
-    }
-
-    .book:hover > .page li:nth-child(2) {
-        -webkit-transform: rotateY(-35deg);
-        -moz-transform: rotateY(-35deg);
-        transform: rotateY(-35deg);
-        -webkit-transition-duration: 1.8s;
-        -moz-transition-duration: 1.8s;
-        transition-duration: 1.8s;
-    }
-
-    .book:hover > .page li:nth-child(3) {
-        -webkit-transform: rotateY(-118deg);
-        -moz-transform: rotateY(-118deg);
-        transform: rotateY(-118deg);
-        -webkit-transition-duration: 1.6s;
-        -moz-transition-duration: 1.6s;
-        transition-duration: 1.6s;
-    }
-
-    .book:hover > .page li:nth-child(4) {
-        -webkit-transform: rotateY(-130deg);
-        -moz-transform: rotateY(-130deg);
-        transform: rotateY(-130deg);
-        -webkit-transition-duration: 1.4s;
-        -moz-transition-duration: 1.4s;
-        transition-duration: 1.4s;
-    }
-
-    .book:hover > .page li:nth-child(5) {
-        -webkit-transform: rotateY(-140deg);
-        -moz-transform: rotateY(-140deg);
-        transform: rotateY(-140deg);
-        -webkit-transition-duration: 1.2s;
-        -moz-transition-duration: 1.2s;
-        transition-duration: 1.2s;
-    }
-}
-
-/*
-    6. Bonus
-*/
-
-/* cover CSS */
-
-.coverDesign {
-    position: absolute;
-    top: 0;
-    left: 0;
-    bottom: 0;
-    right: 0;
-    overflow: hidden;
-    -webkit-backface-visibility: hidden;
-    -moz-backface-visibility: hidden;
-    backface-visibility: hidden;
-}
-
-.coverDesign::after {
-    background-image: -webkit-linear-gradient(-135deg, rgba(255, 255, 255, 0.45) 0%, transparent 100%);
-    background-image: -moz-linear-gradient(-135deg, rgba(255, 255, 255, 0.45) 0%, transparent 100%);
-    background-image: linear-gradient(-135deg, rgba(255, 255, 255, 0.45) 0%, transparent 100%);
-    position: absolute;
-    top: 0;
-    left: 0;
-    bottom: 0;
-    right: 0;
-}
-
-.coverDesign h1 {
-    color: #fff;
-    font-size: 2.2em;
-    letter-spacing: 0.05em;
-    text-align: center;
-    margin: 54% 0 0 0;
-    text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.1);
-}
-
-.coverDesign p {
-    color: #f8f8f8;
-    font-size: 1em;
-    text-align: center;
-    text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.1);
-}
-
-.yellow {
-    background-color: #f1c40f;
-    background-image: -webkit-linear-gradient(top, #f1c40f 58%, #e7ba07 0%);
-    background-image: -moz-linear-gradient(top, #f1c40f 58%, #e7ba07 0%);
-    background-image: linear-gradient(top, #f1c40f 58%, #e7ba07 0%);
-}
-
-.blue {
-    background-color: #3498db;
-    background-image: -webkit-linear-gradient(top, #3498db 58%, #2a90d4 0%);
-    background-image: -moz-linear-gradient(top, #3498db 58%, #2a90d4 0%);
-    background-image: linear-gradient(top, #3498db 58%, #2a90d4 0%);
-}
-
-.grey {
-    background-color: #f8e9d1;
-    background-image: -webkit-linear-gradient(top, #f8e9d1 58%, #e7d5b7 0%);
-    background-image: -moz-linear-gradient(top, #f8e9d1 58%, #e7d5b7 0%);
-    background-image: linear-gradient(top, #f8e9d1 58%, #e7d5b7 0%);
-}
-
-/* Basic ribbon */
-
-.ribbon {
-    background: #c0392b;
-    color: #fff;
-    display: block;
-    font-size: 0.7em;
-    position: absolute;
-    top: 11px;
-    right: 1px;
-    width: 40px;
-    height: 20px;
-    line-height: 20px;
-    letter-spacing: 0.15em;
-    text-align: center;
-    -webkit-transform: rotateZ(45deg) translateZ(1px);
-    -moz-transform: rotateZ(45deg) translateZ(1px);
-    transform: rotateZ(45deg) translateZ(1px);
-    -webkit-backface-visibility: hidden;
-    -moz-backface-visibility: hidden;
-    backface-visibility: hidden;
-    z-index: 10;
-}
-
-.ribbon::before,
-.ribbon::after {
-    position: absolute;
-    top: -20px;
-    width: 0;
-    height: 0;
-    border-bottom: 20px solid #c0392b;
-    border-top: 20px solid transparent;
-}
-
-.ribbon::before {
-    left: -20px;
-    border-left: 20px solid transparent;
-}
-
-.ribbon::after {
-    right: -20px;
-    border-right: 20px solid transparent;
-}
-
-/* figcaption */
-
-.book figcaption {
-    padding-left: 40px;
-    padding-top: 40px;
-    text-align: left;
-    position: absolute;
-    top: 0%;
-    left: 160px;
-    width: 500px;
-}
-
-.book figcaption h1 {
-    margin: 0;
-}
-
-.book figcaption span {
-    color: #245f78;
-    padding: 0.6em 0 0.2em 0;
-    display: block;
-}
-
-.book figcaption p {
-    color: black;
-    line-height: 1.3;
-}
-
-/* Media Queries */
-@media screen and (max-width: 767px) {
-    .align > li {
-        width: 100%;
-        min-height: 440px;
-        height: auto;
-        padding: 0;
-        margin: 0 0 30px 0;
-    }
-
-    .book {
-        margin-left: 60px;
-        display: block;
-        margin-bottom: 280px;
-    }
-
-    .book figcaption {
-        min-width: 320px;
-        top: 250px;
-        padding-left: 0;
-        left: -60px;
-        display: block;
-    }
-}
-
-@media screen and (max-width: 550px) {
-    .book {
-        height: 250px;
-    }
-
-    .book figcaption {
-        width: 320px;
-    }
-}
diff --git a/site/src/site/assets/css/bootstrap.css b/site/src/site/assets/css/bootstrap.css
deleted file mode 100644
index 1a98538..0000000
--- a/site/src/site/assets/css/bootstrap.css
+++ /dev/null
@@ -1,6203 +0,0 @@
-/*!
- * Bootstrap v3.2.0 (http://getbootstrap.com)
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-
-/*! normalize.css v3.0.1 | MIT License | git.io/normalize */
-html {
-  font-family: sans-serif;
-  -webkit-text-size-adjust: 100%;
-      -ms-text-size-adjust: 100%;
-}
-body {
-  margin: 0;
-}
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-main,
-nav,
-section,
-summary {
-  display: block;
-}
-audio,
-canvas,
-progress,
-video {
-  display: inline-block;
-  vertical-align: baseline;
-}
-audio:not([controls]) {
-  display: none;
-  height: 0;
-}
-[hidden],
-template {
-  display: none;
-}
-a {
-  background: transparent;
-}
-a:active,
-a:hover {
-  outline: 0;
-}
-abbr[title] {
-  border-bottom: 1px dotted;
-}
-b,
-strong {
-  font-weight: bold;
-}
-dfn {
-  font-style: italic;
-}
-h1 {
-  margin: .67em 0;
-  font-size: 2em;
-}
-mark {
-  color: #000;
-  background: #ff0;
-}
-small {
-  font-size: 80%;
-}
-sub,
-sup {
-  position: relative;
-  font-size: 75%;
-  line-height: 0;
-  vertical-align: baseline;
-}
-sup {
-  top: -.5em;
-}
-sub {
-  bottom: -.25em;
-}
-img {
-  border: 0;
-}
-svg:not(:root) {
-  overflow: hidden;
-}
-figure {
-  margin: 1em 40px;
-}
-hr {
-  height: 0;
-  -webkit-box-sizing: content-box;
-     -moz-box-sizing: content-box;
-          box-sizing: content-box;
-}
-pre {
-  overflow: auto;
-}
-code,
-kbd,
-pre,
-samp {
-  font-family: monospace, monospace;
-  font-size: 1em;
-}
-button,
-input,
-optgroup,
-select,
-textarea {
-  margin: 0;
-  font: inherit;
-  color: inherit;
-}
-button {
-  overflow: visible;
-}
-button,
-select {
-  text-transform: none;
-}
-button,
-html input[type="button"],
-input[type="reset"],
-input[type="submit"] {
-  -webkit-appearance: button;
-  cursor: pointer;
-}
-button[disabled],
-html input[disabled] {
-  cursor: default;
-}
-button::-moz-focus-inner,
-input::-moz-focus-inner {
-  padding: 0;
-  border: 0;
-}
-input {
-  line-height: normal;
-}
-input[type="checkbox"],
-input[type="radio"] {
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-  padding: 0;
-}
-input[type="number"]::-webkit-inner-spin-button,
-input[type="number"]::-webkit-outer-spin-button {
-  height: auto;
-}
-input[type="search"] {
-  -webkit-box-sizing: content-box;
-     -moz-box-sizing: content-box;
-          box-sizing: content-box;
-  -webkit-appearance: textfield;
-}
-input[type="search"]::-webkit-search-cancel-button,
-input[type="search"]::-webkit-search-decoration {
-  -webkit-appearance: none;
-}
-fieldset {
-  padding: .35em .625em .75em;
-  margin: 0 2px;
-  border: 1px solid #c0c0c0;
-}
-legend {
-  padding: 0;
-  border: 0;
-}
-textarea {
-  overflow: auto;
-}
-optgroup {
-  font-weight: bold;
-}
-table {
-  border-spacing: 0;
-  border-collapse: collapse;
-}
-td,
-th {
-  padding: 0;
-}
-@media print {
-  * {
-    color: #000 !important;
-    text-shadow: none !important;
-    background: transparent !important;
-    -webkit-box-shadow: none !important;
-            box-shadow: none !important;
-  }
-  a,
-  a:visited {
-    text-decoration: underline;
-  }
-  a[href]:after {
-    content: " (" attr(href) ")";
-  }
-  abbr[title]:after {
-    content: " (" attr(title) ")";
-  }
-  a[href^="javascript:"]:after,
-  a[href^="#"]:after {
-    content: "";
-  }
-  pre,
-  blockquote {
-    border: 1px solid #999;
-
-    page-break-inside: avoid;
-  }
-  thead {
-    display: table-header-group;
-  }
-  tr,
-  img {
-    page-break-inside: avoid;
-  }
-  img {
-    max-width: 100% !important;
-  }
-  p,
-  h2,
-  h3 {
-    orphans: 3;
-    widows: 3;
-  }
-  h2,
-  h3 {
-    page-break-after: avoid;
-  }
-  select {
-    background: #fff !important;
-  }
-  .navbar {
-    display: none;
-  }
-  .table td,
-  .table th {
-    background-color: #fff !important;
-  }
-  .btn > .caret,
-  .dropup > .btn > .caret {
-    border-top-color: #000 !important;
-  }
-  .label {
-    border: 1px solid #000;
-  }
-  .table {
-    border-collapse: collapse !important;
-  }
-  .table-bordered th,
-  .table-bordered td {
-    border: 1px solid #ddd !important;
-  }
-}
-@font-face {
-  font-family: 'Glyphicons Halflings';
-
-  src: url('../fonts/glyphicons-halflings-regular.eot');
-  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
-}
-.glyphicon {
-  position: relative;
-  top: 1px;
-  display: inline-block;
-  font-family: 'Glyphicons Halflings';
-  font-style: normal;
-  font-weight: normal;
-  line-height: 1;
-
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-}
-.glyphicon-asterisk:before {
-  content: "\2a";
-}
-.glyphicon-plus:before {
-  content: "\2b";
-}
-.glyphicon-euro:before {
-  content: "\20ac";
-}
-.glyphicon-minus:before {
-  content: "\2212";
-}
-.glyphicon-cloud:before {
-  content: "\2601";
-}
-.glyphicon-envelope:before {
-  content: "\2709";
-}
-.glyphicon-pencil:before {
-  content: "\270f";
-}
-.glyphicon-glass:before {
-  content: "\e001";
-}
-.glyphicon-music:before {
-  content: "\e002";
-}
-.glyphicon-search:before {
-  content: "\e003";
-}
-.glyphicon-heart:before {
-  content: "\e005";
-}
-.glyphicon-star:before {
-  content: "\e006";
-}
-.glyphicon-star-empty:before {
-  content: "\e007";
-}
-.glyphicon-user:before {
-  content: "\e008";
-}
-.glyphicon-film:before {
-  content: "\e009";
-}
-.glyphicon-th-large:before {
-  content: "\e010";
-}
-.glyphicon-th:before {
-  content: "\e011";
-}
-.glyphicon-th-list:before {
-  content: "\e012";
-}
-.glyphicon-ok:before {
-  content: "\e013";
-}
-.glyphicon-remove:before {
-  content: "\e014";
-}
-.glyphicon-zoom-in:before {
-  content: "\e015";
-}
-.glyphicon-zoom-out:before {
-  content: "\e016";
-}
-.glyphicon-off:before {
-  content: "\e017";
-}
-.glyphicon-signal:before {
-  content: "\e018";
-}
-.glyphicon-cog:before {
-  content: "\e019";
-}
-.glyphicon-trash:before {
-  content: "\e020";
-}
-.glyphicon-home:before {
-  content: "\e021";
-}
-.glyphicon-file:before {
-  content: "\e022";
-}
-.glyphicon-time:before {
-  content: "\e023";
-}
-.glyphicon-road:before {
-  content: "\e024";
-}
-.glyphicon-download-alt:before {
-  content: "\e025";
-}
-.glyphicon-download:before {
-  content: "\e026";
-}
-.glyphicon-upload:before {
-  content: "\e027";
-}
-.glyphicon-inbox:before {
-  content: "\e028";
-}
-.glyphicon-play-circle:before {
-  content: "\e029";
-}
-.glyphicon-repeat:before {
-  content: "\e030";
-}
-.glyphicon-refresh:before {
-  content: "\e031";
-}
-.glyphicon-list-alt:before {
-  content: "\e032";
-}
-.glyphicon-lock:before {
-  content: "\e033";
-}
-.glyphicon-flag:before {
-  content: "\e034";
-}
-.glyphicon-headphones:before {
-  content: "\e035";
-}
-.glyphicon-volume-off:before {
-  content: "\e036";
-}
-.glyphicon-volume-down:before {
-  content: "\e037";
-}
-.glyphicon-volume-up:before {
-  content: "\e038";
-}
-.glyphicon-qrcode:before {
-  content: "\e039";
-}
-.glyphicon-barcode:before {
-  content: "\e040";
-}
-.glyphicon-tag:before {
-  content: "\e041";
-}
-.glyphicon-tags:before {
-  content: "\e042";
-}
-.glyphicon-book:before {
-  content: "\e043";
-}
-.glyphicon-bookmark:before {
-  content: "\e044";
-}
-.glyphicon-print:before {
-  content: "\e045";
-}
-.glyphicon-camera:before {
-  content: "\e046";
-}
-.glyphicon-font:before {
-  content: "\e047";
-}
-.glyphicon-bold:before {
-  content: "\e048";
-}
-.glyphicon-italic:before {
-  content: "\e049";
-}
-.glyphicon-text-height:before {
-  content: "\e050";
-}
-.glyphicon-text-width:before {
-  content: "\e051";
-}
-.glyphicon-align-left:before {
-  content: "\e052";
-}
-.glyphicon-align-center:before {
-  content: "\e053";
-}
-.glyphicon-align-right:before {
-  content: "\e054";
-}
-.glyphicon-align-justify:before {
-  content: "\e055";
-}
-.glyphicon-list:before {
-  content: "\e056";
-}
-.glyphicon-indent-left:before {
-  content: "\e057";
-}
-.glyphicon-indent-right:before {
-  content: "\e058";
-}
-.glyphicon-facetime-video:before {
-  content: "\e059";
-}
-.glyphicon-picture:before {
-  content: "\e060";
-}
-.glyphicon-map-marker:before {
-  content: "\e062";
-}
-.glyphicon-adjust:before {
-  content: "\e063";
-}
-.glyphicon-tint:before {
-  content: "\e064";
-}
-.glyphicon-edit:before {
-  content: "\e065";
-}
-.glyphicon-share:before {
-  content: "\e066";
-}
-.glyphicon-check:before {
-  content: "\e067";
-}
-.glyphicon-move:before {
-  content: "\e068";
-}
-.glyphicon-step-backward:before {
-  content: "\e069";
-}
-.glyphicon-fast-backward:before {
-  content: "\e070";
-}
-.glyphicon-backward:before {
-  content: "\e071";
-}
-.glyphicon-play:before {
-  content: "\e072";
-}
-.glyphicon-pause:before {
-  content: "\e073";
-}
-.glyphicon-stop:before {
-  content: "\e074";
-}
-.glyphicon-forward:before {
-  content: "\e075";
-}
-.glyphicon-fast-forward:before {
-  content: "\e076";
-}
-.glyphicon-step-forward:before {
-  content: "\e077";
-}
-.glyphicon-eject:before {
-  content: "\e078";
-}
-.glyphicon-chevron-left:before {
-  content: "\e079";
-}
-.glyphicon-chevron-right:before {
-  content: "\e080";
-}
-.glyphicon-plus-sign:before {
-  content: "\e081";
-}
-.glyphicon-minus-sign:before {
-  content: "\e082";
-}
-.glyphicon-remove-sign:before {
-  content: "\e083";
-}
-.glyphicon-ok-sign:before {
-  content: "\e084";
-}
-.glyphicon-question-sign:before {
-  content: "\e085";
-}
-.glyphicon-info-sign:before {
-  content: "\e086";
-}
-.glyphicon-screenshot:before {
-  content: "\e087";
-}
-.glyphicon-remove-circle:before {
-  content: "\e088";
-}
-.glyphicon-ok-circle:before {
-  content: "\e089";
-}
-.glyphicon-ban-circle:before {
-  content: "\e090";
-}
-.glyphicon-arrow-left:before {
-  content: "\e091";
-}
-.glyphicon-arrow-right:before {
-  content: "\e092";
-}
-.glyphicon-arrow-up:before {
-  content: "\e093";
-}
-.glyphicon-arrow-down:before {
-  content: "\e094";
-}
-.glyphicon-share-alt:before {
-  content: "\e095";
-}
-.glyphicon-resize-full:before {
-  content: "\e096";
-}
-.glyphicon-resize-small:before {
-  content: "\e097";
-}
-.glyphicon-exclamation-sign:before {
-  content: "\e101";
-}
-.glyphicon-gift:before {
-  content: "\e102";
-}
-.glyphicon-leaf:before {
-  content: "\e103";
-}
-.glyphicon-fire:before {
-  content: "\e104";
-}
-.glyphicon-eye-open:before {
-  content: "\e105";
-}
-.glyphicon-eye-close:before {
-  content: "\e106";
-}
-.glyphicon-warning-sign:before {
-  content: "\e107";
-}
-.glyphicon-plane:before {
-  content: "\e108";
-}
-.glyphicon-calendar:before {
-  content: "\e109";
-}
-.glyphicon-random:before {
-  content: "\e110";
-}
-.glyphicon-comment:before {
-  content: "\e111";
-}
-.glyphicon-magnet:before {
-  content: "\e112";
-}
-.glyphicon-chevron-up:before {
-  content: "\e113";
-}
-.glyphicon-chevron-down:before {
-  content: "\e114";
-}
-.glyphicon-retweet:before {
-  content: "\e115";
-}
-.glyphicon-shopping-cart:before {
-  content: "\e116";
-}
-.glyphicon-folder-close:before {
-  content: "\e117";
-}
-.glyphicon-folder-open:before {
-  content: "\e118";
-}
-.glyphicon-resize-vertical:before {
-  content: "\e119";
-}
-.glyphicon-resize-horizontal:before {
-  content: "\e120";
-}
-.glyphicon-hdd:before {
-  content: "\e121";
-}
-.glyphicon-bullhorn:before {
-  content: "\e122";
-}
-.glyphicon-bell:before {
-  content: "\e123";
-}
-.glyphicon-certificate:before {
-  content: "\e124";
-}
-.glyphicon-thumbs-up:before {
-  content: "\e125";
-}
-.glyphicon-thumbs-down:before {
-  content: "\e126";
-}
-.glyphicon-hand-right:before {
-  content: "\e127";
-}
-.glyphicon-hand-left:before {
-  content: "\e128";
-}
-.glyphicon-hand-up:before {
-  content: "\e129";
-}
-.glyphicon-hand-down:before {
-  content: "\e130";
-}
-.glyphicon-circle-arrow-right:before {
-  content: "\e131";
-}
-.glyphicon-circle-arrow-left:before {
-  content: "\e132";
-}
-.glyphicon-circle-arrow-up:before {
-  content: "\e133";
-}
-.glyphicon-circle-arrow-down:before {
-  content: "\e134";
-}
-.glyphicon-globe:before {
-  content: "\e135";
-}
-.glyphicon-wrench:before {
-  content: "\e136";
-}
-.glyphicon-tasks:before {
-  content: "\e137";
-}
-.glyphicon-filter:before {
-  content: "\e138";
-}
-.glyphicon-briefcase:before {
-  content: "\e139";
-}
-.glyphicon-fullscreen:before {
-  content: "\e140";
-}
-.glyphicon-dashboard:before {
-  content: "\e141";
-}
-.glyphicon-paperclip:before {
-  content: "\e142";
-}
-.glyphicon-heart-empty:before {
-  content: "\e143";
-}
-.glyphicon-link:before {
-  content: "\e144";
-}
-.glyphicon-phone:before {
-  content: "\e145";
-}
-.glyphicon-pushpin:before {
-  content: "\e146";
-}
-.glyphicon-usd:before {
-  content: "\e148";
-}
-.glyphicon-gbp:before {
-  content: "\e149";
-}
-.glyphicon-sort:before {
-  content: "\e150";
-}
-.glyphicon-sort-by-alphabet:before {
-  content: "\e151";
-}
-.glyphicon-sort-by-alphabet-alt:before {
-  content: "\e152";
-}
-.glyphicon-sort-by-order:before {
-  content: "\e153";
-}
-.glyphicon-sort-by-order-alt:before {
-  content: "\e154";
-}
-.glyphicon-sort-by-attributes:before {
-  content: "\e155";
-}
-.glyphicon-sort-by-attributes-alt:before {
-  content: "\e156";
-}
-.glyphicon-unchecked:before {
-  content: "\e157";
-}
-.glyphicon-expand:before {
-  content: "\e158";
-}
-.glyphicon-collapse-down:before {
-  content: "\e159";
-}
-.glyphicon-collapse-up:before {
-  content: "\e160";
-}
-.glyphicon-log-in:before {
-  content: "\e161";
-}
-.glyphicon-flash:before {
-  content: "\e162";
-}
-.glyphicon-log-out:before {
-  content: "\e163";
-}
-.glyphicon-new-window:before {
-  content: "\e164";
-}
-.glyphicon-record:before {
-  content: "\e165";
-}
-.glyphicon-save:before {
-  content: "\e166";
-}
-.glyphicon-open:before {
-  content: "\e167";
-}
-.glyphicon-saved:before {
-  content: "\e168";
-}
-.glyphicon-import:before {
-  content: "\e169";
-}
-.glyphicon-export:before {
-  content: "\e170";
-}
-.glyphicon-send:before {
-  content: "\e171";
-}
-.glyphicon-floppy-disk:before {
-  content: "\e172";
-}
-.glyphicon-floppy-saved:before {
-  content: "\e173";
-}
-.glyphicon-floppy-remove:before {
-  content: "\e174";
-}
-.glyphicon-floppy-save:before {
-  content: "\e175";
-}
-.glyphicon-floppy-open:before {
-  content: "\e176";
-}
-.glyphicon-credit-card:before {
-  content: "\e177";
-}
-.glyphicon-transfer:before {
-  content: "\e178";
-}
-.glyphicon-cutlery:before {
-  content: "\e179";
-}
-.glyphicon-header:before {
-  content: "\e180";
-}
-.glyphicon-compressed:before {
-  content: "\e181";
-}
-.glyphicon-earphone:before {
-  content: "\e182";
-}
-.glyphicon-phone-alt:before {
-  content: "\e183";
-}
-.glyphicon-tower:before {
-  content: "\e184";
-}
-.glyphicon-stats:before {
-  content: "\e185";
-}
-.glyphicon-sd-video:before {
-  content: "\e186";
-}
-.glyphicon-hd-video:before {
-  content: "\e187";
-}
-.glyphicon-subtitles:before {
-  content: "\e188";
-}
-.glyphicon-sound-stereo:before {
-  content: "\e189";
-}
-.glyphicon-sound-dolby:before {
-  content: "\e190";
-}
-.glyphicon-sound-5-1:before {
-  content: "\e191";
-}
-.glyphicon-sound-6-1:before {
-  content: "\e192";
-}
-.glyphicon-sound-7-1:before {
-  content: "\e193";
-}
-.glyphicon-copyright-mark:before {
-  content: "\e194";
-}
-.glyphicon-registration-mark:before {
-  content: "\e195";
-}
-.glyphicon-cloud-download:before {
-  content: "\e197";
-}
-.glyphicon-cloud-upload:before {
-  content: "\e198";
-}
-.glyphicon-tree-conifer:before {
-  content: "\e199";
-}
-.glyphicon-tree-deciduous:before {
-  content: "\e200";
-}
-* {
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-*:before,
-*:after {
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-html {
-  font-size: 10px;
-
-  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-}
-body {
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-size: 14px;
-  line-height: 1.42857143;
-  color: #333;
-  background-color: #fff;
-}
-input,
-button,
-select,
-textarea {
-  font-family: inherit;
-  font-size: inherit;
-  line-height: inherit;
-}
-a {
-  color: #428bca;
-  text-decoration: none;
-}
-a:hover,
-a:focus {
-  color: #2a6496;
-  text-decoration: underline;
-}
-a:focus {
-  outline: thin dotted;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-figure {
-  margin: 0;
-}
-img {
-  vertical-align: middle;
-}
-.img-responsive,
-.thumbnail > img,
-.thumbnail a > img,
-.carousel-inner > .item > img,
-.carousel-inner > .item > a > img {
-  display: block;
-  width: 100% \9;
-  max-width: 100%;
-  height: auto;
-}
-.img-rounded {
-  border-radius: 6px;
-}
-.img-thumbnail {
-  display: inline-block;
-  width: 100% \9;
-  max-width: 100%;
-  height: auto;
-  padding: 4px;
-  line-height: 1.42857143;
-  background-color: #fff;
-  border: 1px solid #ddd;
-  border-radius: 4px;
-  -webkit-transition: all .2s ease-in-out;
-       -o-transition: all .2s ease-in-out;
-          transition: all .2s ease-in-out;
-}
-.img-circle {
-  border-radius: 50%;
-}
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-}
-.sr-only {
-  position: absolute;
-  width: 1px;
-  height: 1px;
-  padding: 0;
-  margin: -1px;
-  overflow: hidden;
-  clip: rect(0, 0, 0, 0);
-  border: 0;
-}
-.sr-only-focusable:active,
-.sr-only-focusable:focus {
-  position: static;
-  width: auto;
-  height: auto;
-  margin: 0;
-  overflow: visible;
-  clip: auto;
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-.h1,
-.h2,
-.h3,
-.h4,
-.h5,
-.h6 {
-  font-family: inherit;
-  font-weight: 500;
-  line-height: 1.1;
-  color: inherit;
-}
-h1 small,
-h2 small,
-h3 small,
-h4 small,
-h5 small,
-h6 small,
-.h1 small,
-.h2 small,
-.h3 small,
-.h4 small,
-.h5 small,
-.h6 small,
-h1 .small,
-h2 .small,
-h3 .small,
-h4 .small,
-h5 .small,
-h6 .small,
-.h1 .small,
-.h2 .small,
-.h3 .small,
-.h4 .small,
-.h5 .small,
-.h6 .small {
-  font-weight: normal;
-  line-height: 1;
-  color: #777;
-}
-h1,
-.h1,
-h2,
-.h2,
-h3,
-.h3 {
-  margin-top: 20px;
-  margin-bottom: 10px;
-}
-h1 small,
-.h1 small,
-h2 small,
-.h2 small,
-h3 small,
-.h3 small,
-h1 .small,
-.h1 .small,
-h2 .small,
-.h2 .small,
-h3 .small,
-.h3 .small {
-  font-size: 65%;
-}
-h4,
-.h4,
-h5,
-.h5,
-h6,
-.h6 {
-  margin-top: 10px;
-  margin-bottom: 10px;
-}
-h4 small,
-.h4 small,
-h5 small,
-.h5 small,
-h6 small,
-.h6 small,
-h4 .small,
-.h4 .small,
-h5 .small,
-.h5 .small,
-h6 .small,
-.h6 .small {
-  font-size: 75%;
-}
-h1,
-.h1 {
-  font-size: 36px;
-}
-h2,
-.h2 {
-  font-size: 30px;
-}
-h3,
-.h3 {
-  font-size: 24px;
-}
-h4,
-.h4 {
-  font-size: 18px;
-}
-h5,
-.h5 {
-  font-size: 14px;
-}
-h6,
-.h6 {
-  font-size: 12px;
-}
-p {
-  margin: 0 0 10px;
-}
-.lead {
-  margin-bottom: 20px;
-  font-size: 16px;
-  font-weight: 300;
-  line-height: 1.4;
-}
-@media (min-width: 768px) {
-  .lead {
-    font-size: 21px;
-  }
-}
-small,
-.small {
-  font-size: 85%;
-}
-cite {
-  font-style: normal;
-}
-mark,
-.mark {
-  padding: .2em;
-  background-color: #fcf8e3;
-}
-.text-left {
-  text-align: left;
-}
-.text-right {
-  text-align: right;
-}
-.text-center {
-  text-align: center;
-}
-.text-justify {
-  text-align: justify;
-}
-.text-nowrap {
-  white-space: nowrap;
-}
-.text-lowercase {
-  text-transform: lowercase;
-}
-.text-uppercase {
-  text-transform: uppercase;
-}
-.text-capitalize {
-  text-transform: capitalize;
-}
-.text-muted {
-  color: #777;
-}
-.text-primary {
-  color: #428bca;
-}
-a.text-primary:hover {
-  color: #3071a9;
-}
-.text-success {
-  color: #3c763d;
-}
-a.text-success:hover {
-  color: #2b542c;
-}
-.text-info {
-  color: #31708f;
-}
-a.text-info:hover {
-  color: #245269;
-}
-.text-warning {
-  color: #8a6d3b;
-}
-a.text-warning:hover {
-  color: #66512c;
-}
-.text-danger {
-  color: #a94442;
-}
-a.text-danger:hover {
-  color: #843534;
-}
-.bg-primary {
-  color: #fff;
-  background-color: #428bca;
-}
-a.bg-primary:hover {
-  background-color: #3071a9;
-}
-.bg-success {
-  background-color: #dff0d8;
-}
-a.bg-success:hover {
-  background-color: #c1e2b3;
-}
-.bg-info {
-  background-color: #d9edf7;
-}
-a.bg-info:hover {
-  background-color: #afd9ee;
-}
-.bg-warning {
-  background-color: #fcf8e3;
-}
-a.bg-warning:hover {
-  background-color: #f7ecb5;
-}
-.bg-danger {
-  background-color: #f2dede;
-}
-a.bg-danger:hover {
-  background-color: #e4b9b9;
-}
-.page-header {
-  padding-bottom: 9px;
-  margin: 40px 0 20px;
-  border-bottom: 1px solid #eee;
-}
-ul,
-ol {
-  margin-top: 0;
-  margin-bottom: 10px;
-}
-ul ul,
-ol ul,
-ul ol,
-ol ol {
-  margin-bottom: 0;
-}
-.list-unstyled {
-  padding-left: 0;
-  list-style: none;
-}
-.list-inline {
-  padding-left: 0;
-  margin-left: -5px;
-  list-style: none;
-}
-.list-inline > li {
-  display: inline-block;
-  padding-right: 5px;
-  padding-left: 5px;
-}
-dl {
-  margin-top: 0;
-  margin-bottom: 20px;
-}
-dt,
-dd {
-  line-height: 1.42857143;
-}
-dt {
-  font-weight: bold;
-}
-dd {
-  margin-left: 0;
-}
-@media (min-width: 768px) {
-  .dl-horizontal dt {
-    float: left;
-    width: 160px;
-    overflow: hidden;
-    clear: left;
-    text-align: right;
-    text-overflow: ellipsis;
-    white-space: nowrap;
-  }
-  .dl-horizontal dd {
-    margin-left: 180px;
-  }
-}
-abbr[title],
-abbr[data-original-title] {
-  cursor: help;
-  border-bottom: 1px dotted #777;
-}
-.initialism {
-  font-size: 90%;
-  text-transform: uppercase;
-}
-blockquote {
-  padding: 10px 20px;
-  margin: 0 0 20px;
-  font-size: 17.5px;
-  border-left: 5px solid #eee;
-}
-blockquote p:last-child,
-blockquote ul:last-child,
-blockquote ol:last-child {
-  margin-bottom: 0;
-}
-blockquote footer,
-blockquote small,
-blockquote .small {
-  display: block;
-  font-size: 80%;
-  line-height: 1.42857143;
-  color: #777;
-}
-blockquote footer:before,
-blockquote small:before,
-blockquote .small:before {
-  content: '\2014 \00A0';
-}
-.blockquote-reverse,
-blockquote.pull-right {
-  padding-right: 15px;
-  padding-left: 0;
-  text-align: right;
-  border-right: 5px solid #eee;
-  border-left: 0;
-}
-.blockquote-reverse footer:before,
-blockquote.pull-right footer:before,
-.blockquote-reverse small:before,
-blockquote.pull-right small:before,
-.blockquote-reverse .small:before,
-blockquote.pull-right .small:before {
-  content: '';
-}
-.blockquote-reverse footer:after,
-blockquote.pull-right footer:after,
-.blockquote-reverse small:after,
-blockquote.pull-right small:after,
-.blockquote-reverse .small:after,
-blockquote.pull-right .small:after {
-  content: '\00A0 \2014';
-}
-blockquote:before,
-blockquote:after {
-  content: "";
-}
-address {
-  margin-bottom: 20px;
-  font-style: normal;
-  line-height: 1.42857143;
-}
-code,
-kbd,
-pre,
-samp {
-  font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
-}
-code {
-  padding: 2px 4px;
-  font-size: 90%;
-  color: #c7254e;
-  background-color: #f9f2f4;
-  border-radius: 4px;
-}
-kbd {
-  padding: 2px 4px;
-  font-size: 90%;
-  color: #fff;
-  background-color: #333;
-  border-radius: 3px;
-  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
-          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
-}
-kbd kbd {
-  padding: 0;
-  font-size: 100%;
-  -webkit-box-shadow: none;
-          box-shadow: none;
-}
-pre {
-  display: block;
-  padding: 9.5px;
-  margin: 0 0 10px;
-  font-size: 13px;
-  line-height: 1.42857143;
-  color: #333;
-  word-break: break-all;
-  word-wrap: break-word;
-  background-color: #f5f5f5;
-  border: 1px solid #ccc;
-  border-radius: 4px;
-}
-pre code {
-  padding: 0;
-  font-size: inherit;
-  color: inherit;
-  white-space: pre-wrap;
-  background-color: transparent;
-  border-radius: 0;
-}
-.pre-scrollable {
-  max-height: 340px;
-  overflow-y: scroll;
-}
-.container {
-  padding-right: 15px;
-  padding-left: 15px;
-  margin-right: auto;
-  margin-left: auto;
-}
-@media (min-width: 768px) {
-  .container {
-    width: 750px;
-  }
-}
-@media (min-width: 992px) {
-  .container {
-    width: 970px;
-  }
-}
-@media (min-width: 1200px) {
-  .container {
-    width: 1170px;
-  }
-}
-.container-fluid {
-  padding-right: 15px;
-  padding-left: 15px;
-  margin-right: auto;
-  margin-left: auto;
-}
-.row {
-  margin-right: -15px;
-  margin-left: -15px;
-}
-.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
-  position: relative;
-  min-height: 1px;
-  padding-right: 15px;
-  padding-left: 15px;
-}
-.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
-  float: left;
-}
-.col-xs-12 {
-  width: 100%;
-}
-.col-xs-11 {
-  width: 91.66666667%;
-}
-.col-xs-10 {
-  width: 83.33333333%;
-}
-.col-xs-9 {
-  width: 75%;
-}
-.col-xs-8 {
-  width: 66.66666667%;
-}
-.col-xs-7 {
-  width: 58.33333333%;
-}
-.col-xs-6 {
-  width: 50%;
-}
-.col-xs-5 {
-  width: 41.66666667%;
-}
-.col-xs-4 {
-  width: 33.33333333%;
-}
-.col-xs-3 {
-  width: 25%;
-}
-.col-xs-2 {
-  width: 16.66666667%;
-}
-.col-xs-1 {
-  width: 8.33333333%;
-}
-.col-xs-pull-12 {
-  right: 100%;
-}
-.col-xs-pull-11 {
-  right: 91.66666667%;
-}
-.col-xs-pull-10 {
-  right: 83.33333333%;
-}
-.col-xs-pull-9 {
-  right: 75%;
-}
-.col-xs-pull-8 {
-  right: 66.66666667%;
-}
-.col-xs-pull-7 {
-  right: 58.33333333%;
-}
-.col-xs-pull-6 {
-  right: 50%;
-}
-.col-xs-pull-5 {
-  right: 41.66666667%;
-}
-.col-xs-pull-4 {
-  right: 33.33333333%;
-}
-.col-xs-pull-3 {
-  right: 25%;
-}
-.col-xs-pull-2 {
-  right: 16.66666667%;
-}
-.col-xs-pull-1 {
-  right: 8.33333333%;
-}
-.col-xs-pull-0 {
-  right: auto;
-}
-.col-xs-push-12 {
-  left: 100%;
-}
-.col-xs-push-11 {
-  left: 91.66666667%;
-}
-.col-xs-push-10 {
-  left: 83.33333333%;
-}
-.col-xs-push-9 {
-  left: 75%;
-}
-.col-xs-push-8 {
-  left: 66.66666667%;
-}
-.col-xs-push-7 {
-  left: 58.33333333%;
-}
-.col-xs-push-6 {
-  left: 50%;
-}
-.col-xs-push-5 {
-  left: 41.66666667%;
-}
-.col-xs-push-4 {
-  left: 33.33333333%;
-}
-.col-xs-push-3 {
-  left: 25%;
-}
-.col-xs-push-2 {
-  left: 16.66666667%;
-}
-.col-xs-push-1 {
-  left: 8.33333333%;
-}
-.col-xs-push-0 {
-  left: auto;
-}
-.col-xs-offset-12 {
-  margin-left: 100%;
-}
-.col-xs-offset-11 {
-  margin-left: 91.66666667%;
-}
-.col-xs-offset-10 {
-  margin-left: 83.33333333%;
-}
-.col-xs-offset-9 {
-  margin-left: 75%;
-}
-.col-xs-offset-8 {
-  margin-left: 66.66666667%;
-}
-.col-xs-offset-7 {
-  margin-left: 58.33333333%;
-}
-.col-xs-offset-6 {
-  margin-left: 50%;
-}
-.col-xs-offset-5 {
-  margin-left: 41.66666667%;
-}
-.col-xs-offset-4 {
-  margin-left: 33.33333333%;
-}
-.col-xs-offset-3 {
-  margin-left: 25%;
-}
-.col-xs-offset-2 {
-  margin-left: 16.66666667%;
-}
-.col-xs-offset-1 {
-  margin-left: 8.33333333%;
-}
-.col-xs-offset-0 {
-  margin-left: 0;
-}
-@media (min-width: 768px) {
-  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
-    float: left;
-  }
-  .col-sm-12 {
-    width: 100%;
-  }
-  .col-sm-11 {
-    width: 91.66666667%;
-  }
-  .col-sm-10 {
-    width: 83.33333333%;
-  }
-  .col-sm-9 {
-    width: 75%;
-  }
-  .col-sm-8 {
-    width: 66.66666667%;
-  }
-  .col-sm-7 {
-    width: 58.33333333%;
-  }
-  .col-sm-6 {
-    width: 50%;
-  }
-  .col-sm-5 {
-    width: 41.66666667%;
-  }
-  .col-sm-4 {
-    width: 33.33333333%;
-  }
-  .col-sm-3 {
-    width: 25%;
-  }
-  .col-sm-2 {
-    width: 16.66666667%;
-  }
-  .col-sm-1 {
-    width: 8.33333333%;
-  }
-  .col-sm-pull-12 {
-    right: 100%;
-  }
-  .col-sm-pull-11 {
-    right: 91.66666667%;
-  }
-  .col-sm-pull-10 {
-    right: 83.33333333%;
-  }
-  .col-sm-pull-9 {
-    right: 75%;
-  }
-  .col-sm-pull-8 {
-    right: 66.66666667%;
-  }
-  .col-sm-pull-7 {
-    right: 58.33333333%;
-  }
-  .col-sm-pull-6 {
-    right: 50%;
-  }
-  .col-sm-pull-5 {
-    right: 41.66666667%;
-  }
-  .col-sm-pull-4 {
-    right: 33.33333333%;
-  }
-  .col-sm-pull-3 {
-    right: 25%;
-  }
-  .col-sm-pull-2 {
-    right: 16.66666667%;
-  }
-  .col-sm-pull-1 {
-    right: 8.33333333%;
-  }
-  .col-sm-pull-0 {
-    right: auto;
-  }
-  .col-sm-push-12 {
-    left: 100%;
-  }
-  .col-sm-push-11 {
-    left: 91.66666667%;
-  }
-  .col-sm-push-10 {
-    left: 83.33333333%;
-  }
-  .col-sm-push-9 {
-    left: 75%;
-  }
-  .col-sm-push-8 {
-    left: 66.66666667%;
-  }
-  .col-sm-push-7 {
-    left: 58.33333333%;
-  }
-  .col-sm-push-6 {
-    left: 50%;
-  }
-  .col-sm-push-5 {
-    left: 41.66666667%;
-  }
-  .col-sm-push-4 {
-    left: 33.33333333%;
-  }
-  .col-sm-push-3 {
-    left: 25%;
-  }
-  .col-sm-push-2 {
-    left: 16.66666667%;
-  }
-  .col-sm-push-1 {
-    left: 8.33333333%;
-  }
-  .col-sm-push-0 {
-    left: auto;
-  }
-  .col-sm-offset-12 {
-    margin-left: 100%;
-  }
-  .col-sm-offset-11 {
-    margin-left: 91.66666667%;
-  }
-  .col-sm-offset-10 {
-    margin-left: 83.33333333%;
-  }
-  .col-sm-offset-9 {
-    margin-left: 75%;
-  }
-  .col-sm-offset-8 {
-    margin-left: 66.66666667%;
-  }
-  .col-sm-offset-7 {
-    margin-left: 58.33333333%;
-  }
-  .col-sm-offset-6 {
-    margin-left: 50%;
-  }
-  .col-sm-offset-5 {
-    margin-left: 41.66666667%;
-  }
-  .col-sm-offset-4 {
-    margin-left: 33.33333333%;
-  }
-  .col-sm-offset-3 {
-    margin-left: 25%;
-  }
-  .col-sm-offset-2 {
-    margin-left: 16.66666667%;
-  }
-  .col-sm-offset-1 {
-    margin-left: 8.33333333%;
-  }
-  .col-sm-offset-0 {
-    margin-left: 0;
-  }
-}
-@media (min-width: 992px) {
-  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
-    float: left;
-  }
-  .col-md-12 {
-    width: 100%;
-  }
-  .col-md-11 {
-    width: 91.66666667%;
-  }
-  .col-md-10 {
-    width: 83.33333333%;
-  }
-  .col-md-9 {
-    width: 75%;
-  }
-  .col-md-8 {
-    width: 66.66666667%;
-  }
-  .col-md-7 {
-    width: 58.33333333%;
-  }
-  .col-md-6 {
-    width: 50%;
-  }
-  .col-md-5 {
-    width: 41.66666667%;
-  }
-  .col-md-4 {
-    width: 33.33333333%;
-  }
-  .col-md-3 {
-    width: 25%;
-  }
-  .col-md-2 {
-    width: 16.66666667%;
-  }
-  .col-md-1 {
-    width: 8.33333333%;
-  }
-  .col-md-pull-12 {
-    right: 100%;
-  }
-  .col-md-pull-11 {
-    right: 91.66666667%;
-  }
-  .col-md-pull-10 {
-    right: 83.33333333%;
-  }
-  .col-md-pull-9 {
-    right: 75%;
-  }
-  .col-md-pull-8 {
-    right: 66.66666667%;
-  }
-  .col-md-pull-7 {
-    right: 58.33333333%;
-  }
-  .col-md-pull-6 {
-    right: 50%;
-  }
-  .col-md-pull-5 {
-    right: 41.66666667%;
-  }
-  .col-md-pull-4 {
-    right: 33.33333333%;
-  }
-  .col-md-pull-3 {
-    right: 25%;
-  }
-  .col-md-pull-2 {
-    right: 16.66666667%;
-  }
-  .col-md-pull-1 {
-    right: 8.33333333%;
-  }
-  .col-md-pull-0 {
-    right: auto;
-  }
-  .col-md-push-12 {
-    left: 100%;
-  }
-  .col-md-push-11 {
-    left: 91.66666667%;
-  }
-  .col-md-push-10 {
-    left: 83.33333333%;
-  }
-  .col-md-push-9 {
-    left: 75%;
-  }
-  .col-md-push-8 {
-    left: 66.66666667%;
-  }
-  .col-md-push-7 {
-    left: 58.33333333%;
-  }
-  .col-md-push-6 {
-    left: 50%;
-  }
-  .col-md-push-5 {
-    left: 41.66666667%;
-  }
-  .col-md-push-4 {
-    left: 33.33333333%;
-  }
-  .col-md-push-3 {
-    left: 25%;
-  }
-  .col-md-push-2 {
-    left: 16.66666667%;
-  }
-  .col-md-push-1 {
-    left: 8.33333333%;
-  }
-  .col-md-push-0 {
-    left: auto;
-  }
-  .col-md-offset-12 {
-    margin-left: 100%;
-  }
-  .col-md-offset-11 {
-    margin-left: 91.66666667%;
-  }
-  .col-md-offset-10 {
-    margin-left: 83.33333333%;
-  }
-  .col-md-offset-9 {
-    margin-left: 75%;
-  }
-  .col-md-offset-8 {
-    margin-left: 66.66666667%;
-  }
-  .col-md-offset-7 {
-    margin-left: 58.33333333%;
-  }
-  .col-md-offset-6 {
-    margin-left: 50%;
-  }
-  .col-md-offset-5 {
-    margin-left: 41.66666667%;
-  }
-  .col-md-offset-4 {
-    margin-left: 33.33333333%;
-  }
-  .col-md-offset-3 {
-    margin-left: 25%;
-  }
-  .col-md-offset-2 {
-    margin-left: 16.66666667%;
-  }
-  .col-md-offset-1 {
-    margin-left: 8.33333333%;
-  }
-  .col-md-offset-0 {
-    margin-left: 0;
-  }
-}
-@media (min-width: 1200px) {
-  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
-    float: left;
-  }
-  .col-lg-12 {
-    width: 100%;
-  }
-  .col-lg-11 {
-    width: 91.66666667%;
-  }
-  .col-lg-10 {
-    width: 83.33333333%;
-  }
-  .col-lg-9 {
-    width: 75%;
-  }
-  .col-lg-8 {
-    width: 66.66666667%;
-  }
-  .col-lg-7 {
-    width: 58.33333333%;
-  }
-  .col-lg-6 {
-    width: 50%;
-  }
-  .col-lg-5 {
-    width: 41.66666667%;
-  }
-  .col-lg-4 {
-    width: 33.33333333%;
-  }
-  .col-lg-3 {
-    width: 25%;
-  }
-  .col-lg-2 {
-    width: 16.66666667%;
-  }
-  .col-lg-1 {
-    width: 8.33333333%;
-  }
-  .col-lg-pull-12 {
-    right: 100%;
-  }
-  .col-lg-pull-11 {
-    right: 91.66666667%;
-  }
-  .col-lg-pull-10 {
-    right: 83.33333333%;
-  }
-  .col-lg-pull-9 {
-    right: 75%;
-  }
-  .col-lg-pull-8 {
-    right: 66.66666667%;
-  }
-  .col-lg-pull-7 {
-    right: 58.33333333%;
-  }
-  .col-lg-pull-6 {
-    right: 50%;
-  }
-  .col-lg-pull-5 {
-    right: 41.66666667%;
-  }
-  .col-lg-pull-4 {
-    right: 33.33333333%;
-  }
-  .col-lg-pull-3 {
-    right: 25%;
-  }
-  .col-lg-pull-2 {
-    right: 16.66666667%;
-  }
-  .col-lg-pull-1 {
-    right: 8.33333333%;
-  }
-  .col-lg-pull-0 {
-    right: auto;
-  }
-  .col-lg-push-12 {
-    left: 100%;
-  }
-  .col-lg-push-11 {
-    left: 91.66666667%;
-  }
-  .col-lg-push-10 {
-    left: 83.33333333%;
-  }
-  .col-lg-push-9 {
-    left: 75%;
-  }
-  .col-lg-push-8 {
-    left: 66.66666667%;
-  }
-  .col-lg-push-7 {
-    left: 58.33333333%;
-  }
-  .col-lg-push-6 {
-    left: 50%;
-  }
-  .col-lg-push-5 {
-    left: 41.66666667%;
-  }
-  .col-lg-push-4 {
-    left: 33.33333333%;
-  }
-  .col-lg-push-3 {
-    left: 25%;
-  }
-  .col-lg-push-2 {
-    left: 16.66666667%;
-  }
-  .col-lg-push-1 {
-    left: 8.33333333%;
-  }
-  .col-lg-push-0 {
-    left: auto;
-  }
-  .col-lg-offset-12 {
-    margin-left: 100%;
-  }
-  .col-lg-offset-11 {
-    margin-left: 91.66666667%;
-  }
-  .col-lg-offset-10 {
-    margin-left: 83.33333333%;
-  }
-  .col-lg-offset-9 {
-    margin-left: 75%;
-  }
-  .col-lg-offset-8 {
-    margin-left: 66.66666667%;
-  }
-  .col-lg-offset-7 {
-    margin-left: 58.33333333%;
-  }
-  .col-lg-offset-6 {
-    margin-left: 50%;
-  }
-  .col-lg-offset-5 {
-    margin-left: 41.66666667%;
-  }
-  .col-lg-offset-4 {
-    margin-left: 33.33333333%;
-  }
-  .col-lg-offset-3 {
-    margin-left: 25%;
-  }
-  .col-lg-offset-2 {
-    margin-left: 16.66666667%;
-  }
-  .col-lg-offset-1 {
-    margin-left: 8.33333333%;
-  }
-  .col-lg-offset-0 {
-    margin-left: 0;
-  }
-}
-table {
-  background-color: transparent;
-}
-th {
-  text-align: left;
-}
-.table {
-  width: 100%;
-  max-width: 100%;
-  margin-bottom: 20px;
-}
-.table > thead > tr > th,
-.table > tbody > tr > th,
-.table > tfoot > tr > th,
-.table > thead > tr > td,
-.table > tbody > tr > td,
-.table > tfoot > tr > td {
-  padding: 8px;
-  line-height: 1.42857143;
-  vertical-align: top;
-  border-top: 1px solid #ddd;
-}
-.table > thead > tr > th {
-  vertical-align: bottom;
-  border-bottom: 2px solid #ddd;
-}
-.table > caption + thead > tr:first-child > th,
-.table > colgroup + thead > tr:first-child > th,
-.table > thead:first-child > tr:first-child > th,
-.table > caption + thead > tr:first-child > td,
-.table > colgroup + thead > tr:first-child > td,
-.table > thead:first-child > tr:first-child > td {
-  border-top: 0;
-}
-.table > tbody + tbody {
-  border-top: 2px solid #ddd;
-}
-.table .table {
-  background-color: #fff;
-}
-.table-condensed > thead > tr > th,
-.table-condensed > tbody > tr > th,
-.table-condensed > tfoot > tr > th,
-.table-condensed > thead > tr > td,
-.table-condensed > tbody > tr > td,
-.table-condensed > tfoot > tr > td {
-  padding: 5px;
-}
-.table-bordered {
-  border: 1px solid #ddd;
-}
-.table-bordered > thead > tr > th,
-.table-bordered > tbody > tr > th,
-.table-bordered > tfoot > tr > th,
-.table-bordered > thead > tr > td,
-.table-bordered > tbody > tr > td,
-.table-bordered > tfoot > tr > td {
-  border: 1px solid #ddd;
-}
-.table-bordered > thead > tr > th,
-.table-bordered > thead > tr > td {
-  border-bottom-width: 2px;
-}
-.table-striped > tbody > tr:nth-child(odd) > td,
-.table-striped > tbody > tr:nth-child(odd) > th {
-  background-color: #f9f9f9;
-}
-.table-hover > tbody > tr:hover > td,
-.table-hover > tbody > tr:hover > th {
-  background-color: #f5f5f5;
-}
-table col[class*="col-"] {
-  position: static;
-  display: table-column;
-  float: none;
-}
-table td[class*="col-"],
-table th[class*="col-"] {
-  position: static;
-  display: table-cell;
-  float: none;
-}
-.table > thead > tr > td.active,
-.table > tbody > tr > td.active,
-.table > tfoot > tr > td.active,
-.table > thead > tr > th.active,
-.table > tbody > tr > th.active,
-.table > tfoot > tr > th.active,
-.table > thead > tr.active > td,
-.table > tbody > tr.active > td,
-.table > tfoot > tr.active > td,
-.table > thead > tr.active > th,
-.table > tbody > tr.active > th,
-.table > tfoot > tr.active > th {
-  background-color: #f5f5f5;
-}
-.table-hover > tbody > tr > td.active:hover,
-.table-hover > tbody > tr > th.active:hover,
-.table-hover > tbody > tr.active:hover > td,
-.table-hover > tbody > tr:hover > .active,
-.table-hover > tbody > tr.active:hover > th {
-  background-color: #e8e8e8;
-}
-.table > thead > tr > td.success,
-.table > tbody > tr > td.success,
-.table > tfoot > tr > td.success,
-.table > thead > tr > th.success,
-.table > tbody > tr > th.success,
-.table > tfoot > tr > th.success,
-.table > thead > tr.success > td,
-.table > tbody > tr.success > td,
-.table > tfoot > tr.success > td,
-.table > thead > tr.success > th,
-.table > tbody > tr.success > th,
-.table > tfoot > tr.success > th {
-  background-color: #dff0d8;
-}
-.table-hover > tbody > tr > td.success:hover,
-.table-hover > tbody > tr > th.success:hover,
-.table-hover > tbody > tr.success:hover > td,
-.table-hover > tbody > tr:hover > .success,
-.table-hover > tbody > tr.success:hover > th {
-  background-color: #d0e9c6;
-}
-.table > thead > tr > td.info,
-.table > tbody > tr > td.info,
-.table > tfoot > tr > td.info,
-.table > thead > tr > th.info,
-.table > tbody > tr > th.info,
-.table > tfoot > tr > th.info,
-.table > thead > tr.info > td,
-.table > tbody > tr.info > td,
-.table > tfoot > tr.info > td,
-.table > thead > tr.info > th,
-.table > tbody > tr.info > th,
-.table > tfoot > tr.info > th {
-  background-color: #d9edf7;
-}
-.table-hover > tbody > tr > td.info:hover,
-.table-hover > tbody > tr > th.info:hover,
-.table-hover > tbody > tr.info:hover > td,
-.table-hover > tbody > tr:hover > .info,
-.table-hover > tbody > tr.info:hover > th {
-  background-color: #c4e3f3;
-}
-.table > thead > tr > td.warning,
-.table > tbody > tr > td.warning,
-.table > tfoot > tr > td.warning,
-.table > thead > tr > th.warning,
-.table > tbody > tr > th.warning,
-.table > tfoot > tr > th.warning,
-.table > thead > tr.warning > td,
-.table > tbody > tr.warning > td,
-.table > tfoot > tr.warning > td,
-.table > thead > tr.warning > th,
-.table > tbody > tr.warning > th,
-.table > tfoot > tr.warning > th {
-  background-color: #fcf8e3;
-}
-.table-hover > tbody > tr > td.warning:hover,
-.table-hover > tbody > tr > th.warning:hover,
-.table-hover > tbody > tr.warning:hover > td,
-.table-hover > tbody > tr:hover > .warning,
-.table-hover > tbody > tr.warning:hover > th {
-  background-color: #faf2cc;
-}
-.table > thead > tr > td.danger,
-.table > tbody > tr > td.danger,
-.table > tfoot > tr > td.danger,
-.table > thead > tr > th.danger,
-.table > tbody > tr > th.danger,
-.table > tfoot > tr > th.danger,
-.table > thead > tr.danger > td,
-.table > tbody > tr.danger > td,
-.table > tfoot > tr.danger > td,
-.table > thead > tr.danger > th,
-.table > tbody > tr.danger > th,
-.table > tfoot > tr.danger > th {
-  background-color: #f2dede;
-}
-.table-hover > tbody > tr > td.danger:hover,
-.table-hover > tbody > tr > th.danger:hover,
-.table-hover > tbody > tr.danger:hover > td,
-.table-hover > tbody > tr:hover > .danger,
-.table-hover > tbody > tr.danger:hover > th {
-  background-color: #ebcccc;
-}
-@media screen and (max-width: 767px) {
-  .table-responsive {
-    width: 100%;
-    margin-bottom: 15px;
-    overflow-x: auto;
-    overflow-y: hidden;
-    -webkit-overflow-scrolling: touch;
-    -ms-overflow-style: -ms-autohiding-scrollbar;
-    border: 1px solid #ddd;
-  }
-  .table-responsive > .table {
-    margin-bottom: 0;
-  }
-  .table-responsive > .table > thead > tr > th,
-  .table-responsive > .table > tbody > tr > th,
-  .table-responsive > .table > tfoot > tr > th,
-  .table-responsive > .table > thead > tr > td,
-  .table-responsive > .table > tbody > tr > td,
-  .table-responsive > .table > tfoot > tr > td {
-    white-space: nowrap;
-  }
-  .table-responsive > .table-bordered {
-    border: 0;
-  }
-  .table-responsive > .table-bordered > thead > tr > th:first-child,
-  .table-responsive > .table-bordered > tbody > tr > th:first-child,
-  .table-responsive > .table-bordered > tfoot > tr > th:first-child,
-  .table-responsive > .table-bordered > thead > tr > td:first-child,
-  .table-responsive > .table-bordered > tbody > tr > td:first-child,
-  .table-responsive > .table-bordered > tfoot > tr > td:first-child {
-    border-left: 0;
-  }
-  .table-responsive > .table-bordered > thead > tr > th:last-child,
-  .table-responsive > .table-bordered > tbody > tr > th:last-child,
-  .table-responsive > .table-bordered > tfoot > tr > th:last-child,
-  .table-responsive > .table-bordered > thead > tr > td:last-child,
-  .table-responsive > .table-bordered > tbody > tr > td:last-child,
-  .table-responsive > .table-bordered > tfoot > tr > td:last-child {
-    border-right: 0;
-  }
-  .table-responsive > .table-bordered > tbody > tr:last-child > th,
-  .table-responsive > .table-bordered > tfoot > tr:last-child > th,
-  .table-responsive > .table-bordered > tbody > tr:last-child > td,
-  .table-responsive > .table-bordered > tfoot > tr:last-child > td {
-    border-bottom: 0;
-  }
-}
-fieldset {
-  min-width: 0;
-  padding: 0;
-  margin: 0;
-  border: 0;
-}
-legend {
-  display: block;
-  width: 100%;
-  padding: 0;
-  margin-bottom: 20px;
-  font-size: 21px;
-  line-height: inherit;
-  color: #333;
-  border: 0;
-  border-bottom: 1px solid #e5e5e5;
-}
-label {
-  display: inline-block;
-  max-width: 100%;
-  margin-bottom: 5px;
-  font-weight: bold;
-}
-input[type="search"] {
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-input[type="radio"],
-input[type="checkbox"] {
-  margin: 4px 0 0;
-  margin-top: 1px \9;
-  line-height: normal;
-}
-input[type="file"] {
-  display: block;
-}
-input[type="range"] {
-  display: block;
-  width: 100%;
-}
-select[multiple],
-select[size] {
-  height: auto;
-}
-input[type="file"]:focus,
-input[type="radio"]:focus,
-input[type="checkbox"]:focus {
-  outline: thin dotted;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-output {
-  display: block;
-  padding-top: 7px;
-  font-size: 14px;
-  line-height: 1.42857143;
-  color: #555;
-}
-.form-control {
-  display: block;
-  width: 100%;
-  height: 34px;
-  padding: 6px 12px;
-  font-size: 14px;
-  line-height: 1.42857143;
-  color: #555;
-  background-color: #fff;
-  background-image: none;
-  border: 1px solid #ccc;
-  border-radius: 4px;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
-  -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
-       -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
-          transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
-}
-.form-control:focus {
-  border-color: #66afe9;
-  outline: 0;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
-          box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
-}
-.form-control::-moz-placeholder {
-  color: #777;
-  opacity: 1;
-}
-.form-control:-ms-input-placeholder {
-  color: #777;
-}
-.form-control::-webkit-input-placeholder {
-  color: #777;
-}
-.form-control[disabled],
-.form-control[readonly],
-fieldset[disabled] .form-control {
-  cursor: not-allowed;
-  background-color: #eee;
-  opacity: 1;
-}
-textarea.form-control {
-  height: auto;
-}
-input[type="search"] {
-  -webkit-appearance: none;
-}
-input[type="date"],
-input[type="time"],
-input[type="datetime-local"],
-input[type="month"] {
-  line-height: 34px;
-  line-height: 1.42857143 \0;
-}
-input[type="date"].input-sm,
-input[type="time"].input-sm,
-input[type="datetime-local"].input-sm,
-input[type="month"].input-sm {
-  line-height: 30px;
-}
-input[type="date"].input-lg,
-input[type="time"].input-lg,
-input[type="datetime-local"].input-lg,
-input[type="month"].input-lg {
-  line-height: 46px;
-}
-.form-group {
-  margin-bottom: 15px;
-}
-.radio,
-.checkbox {
-  position: relative;
-  display: block;
-  min-height: 20px;
-  margin-top: 10px;
-  margin-bottom: 10px;
-}
-.radio label,
-.checkbox label {
-  padding-left: 20px;
-  margin-bottom: 0;
-  font-weight: normal;
-  cursor: pointer;
-}
-.radio input[type="radio"],
-.radio-inline input[type="radio"],
-.checkbox input[type="checkbox"],
-.checkbox-inline input[type="checkbox"] {
-  position: absolute;
-  margin-top: 4px \9;
-  margin-left: -20px;
-}
-.radio + .radio,
-.checkbox + .checkbox {
-  margin-top: -5px;
-}
-.radio-inline,
-.checkbox-inline {
-  display: inline-block;
-  padding-left: 20px;
-  margin-bottom: 0;
-  font-weight: normal;
-  vertical-align: middle;
-  cursor: pointer;
-}
-.radio-inline + .radio-inline,
-.checkbox-inline + .checkbox-inline {
-  margin-top: 0;
-  margin-left: 10px;
-}
-input[type="radio"][disabled],
-input[type="checkbox"][disabled],
-input[type="radio"].disabled,
-input[type="checkbox"].disabled,
-fieldset[disabled] input[type="radio"],
-fieldset[disabled] input[type="checkbox"] {
-  cursor: not-allowed;
-}
-.radio-inline.disabled,
-.checkbox-inline.disabled,
-fieldset[disabled] .radio-inline,
-fieldset[disabled] .checkbox-inline {
-  cursor: not-allowed;
-}
-.radio.disabled label,
-.checkbox.disabled label,
-fieldset[disabled] .radio label,
-fieldset[disabled] .checkbox label {
-  cursor: not-allowed;
-}
-.form-control-static {
-  padding-top: 7px;
-  padding-bottom: 7px;
-  margin-bottom: 0;
-}
-.form-control-static.input-lg,
-.form-control-static.input-sm {
-  padding-right: 0;
-  padding-left: 0;
-}
-.input-sm,
-.form-horizontal .form-group-sm .form-control {
-  height: 30px;
-  padding: 5px 10px;
-  font-size: 12px;
-  line-height: 1.5;
-  border-radius: 3px;
-}
-select.input-sm {
-  height: 30px;
-  line-height: 30px;
-}
-textarea.input-sm,
-select[multiple].input-sm {
-  height: auto;
-}
-.input-lg,
-.form-horizontal .form-group-lg .form-control {
-  height: 46px;
-  padding: 10px 16px;
-  font-size: 18px;
-  line-height: 1.33;
-  border-radius: 6px;
-}
-select.input-lg {
-  height: 46px;
-  line-height: 46px;
-}
-textarea.input-lg,
-select[multiple].input-lg {
-  height: auto;
-}
-.has-feedback {
-  position: relative;
-}
-.has-feedback .form-control {
-  padding-right: 42.5px;
-}
-.form-control-feedback {
-  position: absolute;
-  top: 25px;
-  right: 0;
-  z-index: 2;
-  display: block;
-  width: 34px;
-  height: 34px;
-  line-height: 34px;
-  text-align: center;
-}
-.input-lg + .form-control-feedback {
-  width: 46px;
-  height: 46px;
-  line-height: 46px;
-}
-.input-sm + .form-control-feedback {
-  width: 30px;
-  height: 30px;
-  line-height: 30px;
-}
-.has-success .help-block,
-.has-success .control-label,
-.has-success .radio,
-.has-success .checkbox,
-.has-success .radio-inline,
-.has-success .checkbox-inline {
-  color: #3c763d;
-}
-.has-success .form-control {
-  border-color: #3c763d;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
-}
-.has-success .form-control:focus {
-  border-color: #2b542c;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
-}
-.has-success .input-group-addon {
-  color: #3c763d;
-  background-color: #dff0d8;
-  border-color: #3c763d;
-}
-.has-success .form-control-feedback {
-  color: #3c763d;
-}
-.has-warning .help-block,
-.has-warning .control-label,
-.has-warning .radio,
-.has-warning .checkbox,
-.has-warning .radio-inline,
-.has-warning .checkbox-inline {
-  color: #8a6d3b;
-}
-.has-warning .form-control {
-  border-color: #8a6d3b;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
-}
-.has-warning .form-control:focus {
-  border-color: #66512c;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
-}
-.has-warning .input-group-addon {
-  color: #8a6d3b;
-  background-color: #fcf8e3;
-  border-color: #8a6d3b;
-}
-.has-warning .form-control-feedback {
-  color: #8a6d3b;
-}
-.has-error .help-block,
-.has-error .control-label,
-.has-error .radio,
-.has-error .checkbox,
-.has-error .radio-inline,
-.has-error .checkbox-inline {
-  color: #a94442;
-}
-.has-error .form-control {
-  border-color: #a94442;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
-}
-.has-error .form-control:focus {
-  border-color: #843534;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
-}
-.has-error .input-group-addon {
-  color: #a94442;
-  background-color: #f2dede;
-  border-color: #a94442;
-}
-.has-error .form-control-feedback {
-  color: #a94442;
-}
-.has-feedback label.sr-only ~ .form-control-feedback {
-  top: 0;
-}
-.help-block {
-  display: block;
-  margin-top: 5px;
-  margin-bottom: 10px;
-  color: #737373;
-}
-@media (min-width: 768px) {
-  .form-inline .form-group {
-    display: inline-block;
-    margin-bottom: 0;
-    vertical-align: middle;
-  }
-  .form-inline .form-control {
-    display: inline-block;
-    width: auto;
-    vertical-align: middle;
-  }
-  .form-inline .input-group {
-    display: inline-table;
-    vertical-align: middle;
-  }
-  .form-inline .input-group .input-group-addon,
-  .form-inline .input-group .input-group-btn,
-  .form-inline .input-group .form-control {
-    width: auto;
-  }
-  .form-inline .input-group > .form-control {
-    width: 100%;
-  }
-  .form-inline .control-label {
-    margin-bottom: 0;
-    vertical-align: middle;
-  }
-  .form-inline .radio,
-  .form-inline .checkbox {
-    display: inline-block;
-    margin-top: 0;
-    margin-bottom: 0;
-    vertical-align: middle;
-  }
-  .form-inline .radio label,
-  .form-inline .checkbox label {
-    padding-left: 0;
-  }
-  .form-inline .radio input[type="radio"],
-  .form-inline .checkbox input[type="checkbox"] {
-    position: relative;
-    margin-left: 0;
-  }
-  .form-inline .has-feedback .form-control-feedback {
-    top: 0;
-  }
-}
-.form-horizontal .radio,
-.form-horizontal .checkbox,
-.form-horizontal .radio-inline,
-.form-horizontal .checkbox-inline {
-  padding-top: 7px;
-  margin-top: 0;
-  margin-bottom: 0;
-}
-.form-horizontal .radio,
-.form-horizontal .checkbox {
-  min-height: 27px;
-}
-.form-horizontal .form-group {
-  margin-right: -15px;
-  margin-left: -15px;
-}
-@media (min-width: 768px) {
-  .form-horizontal .control-label {
-    padding-top: 7px;
-    margin-bottom: 0;
-    text-align: right;
-  }
-}
-.form-horizontal .has-feedback .form-control-feedback {
-  top: 0;
-  right: 15px;
-}
-@media (min-width: 768px) {
-  .form-horizontal .form-group-lg .control-label {
-    padding-top: 14.3px;
-  }
-}
-@media (min-width: 768px) {
-  .form-horizontal .form-group-sm .control-label {
-    padding-top: 6px;
-  }
-}
-.btn {
-  display: inline-block;
-  padding: 6px 12px;
-  margin-bottom: 0;
-  font-size: 14px;
-  font-weight: normal;
-  line-height: 1.42857143;
-  text-align: center;
-  white-space: nowrap;
-  vertical-align: middle;
-  cursor: pointer;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  background-image: none;
-  border: 1px solid transparent;
-  border-radius: 4px;
-}
-.btn:focus,
-.btn:active:focus,
-.btn.active:focus {
-  outline: thin dotted;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-.btn:hover,
-.btn:focus {
-  color: #333;
-  text-decoration: none;
-}
-.btn:active,
-.btn.active {
-  background-image: none;
-  outline: 0;
-  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
-          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
-}
-.btn.disabled,
-.btn[disabled],
-fieldset[disabled] .btn {
-  pointer-events: none;
-  cursor: not-allowed;
-  filter: alpha(opacity=65);
-  -webkit-box-shadow: none;
-          box-shadow: none;
-  opacity: .65;
-}
-.btn-default {
-  color: #333;
-  background-color: #fff;
-  border-color: #ccc;
-}
-.btn-default:hover,
-.btn-default:focus,
-.btn-default:active,
-.btn-default.active,
-.open > .dropdown-toggle.btn-default {
-  color: #333;
-  background-color: #e6e6e6;
-  border-color: #adadad;
-}
-.btn-default:active,
-.btn-default.active,
-.open > .dropdown-toggle.btn-default {
-  background-image: none;
-}
-.btn-default.disabled,
-.btn-default[disabled],
-fieldset[disabled] .btn-default,
-.btn-default.disabled:hover,
-.btn-default[disabled]:hover,
-fieldset[disabled] .btn-default:hover,
-.btn-default.disabled:focus,
-.btn-default[disabled]:focus,
-fieldset[disabled] .btn-default:focus,
-.btn-default.disabled:active,
-.btn-default[disabled]:active,
-fieldset[disabled] .btn-default:active,
-.btn-default.disabled.active,
-.btn-default[disabled].active,
-fieldset[disabled] .btn-default.active {
-  background-color: #fff;
-  border-color: #ccc;
-}
-.btn-default .badge {
-  color: #fff;
-  background-color: #333;
-}
-.btn-primary {
-  color: #fff;
-  background-color: #428bca;
-  border-color: #357ebd;
-}
-.btn-primary:hover,
-.btn-primary:focus,
-.btn-primary:active,
-.btn-primary.active,
-.open > .dropdown-toggle.btn-primary {
-  color: #fff;
-  background-color: #3071a9;
-  border-color: #285e8e;
-}
-.btn-primary:active,
-.btn-primary.active,
-.open > .dropdown-toggle.btn-primary {
-  background-image: none;
-}
-.btn-primary.disabled,
-.btn-primary[disabled],
-fieldset[disabled] .btn-primary,
-.btn-primary.disabled:hover,
-.btn-primary[disabled]:hover,
-fieldset[disabled] .btn-primary:hover,
-.btn-primary.disabled:focus,
-.btn-primary[disabled]:focus,
-fieldset[disabled] .btn-primary:focus,
-.btn-primary.disabled:active,
-.btn-primary[disabled]:active,
-fieldset[disabled] .btn-primary:active,
-.btn-primary.disabled.active,
-.btn-primary[disabled].active,
-fieldset[disabled] .btn-primary.active {
-  background-color: #428bca;
-  border-color: #357ebd;
-}
-.btn-primary .badge {
-  color: #428bca;
-  background-color: #fff;
-}
-.btn-success {
-  color: #fff;
-  background-color: #5cb85c;
-  border-color: #4cae4c;
-}
-.btn-success:hover,
-.btn-success:focus,
-.btn-success:active,
-.btn-success.active,
-.open > .dropdown-toggle.btn-success {
-  color: #fff;
-  background-color: #449d44;
-  border-color: #398439;
-}
-.btn-success:active,
-.btn-success.active,
-.open > .dropdown-toggle.btn-success {
-  background-image: none;
-}
-.btn-success.disabled,
-.btn-success[disabled],
-fieldset[disabled] .btn-success,
-.btn-success.disabled:hover,
-.btn-success[disabled]:hover,
-fieldset[disabled] .btn-success:hover,
-.btn-success.disabled:focus,
-.btn-success[disabled]:focus,
-fieldset[disabled] .btn-success:focus,
-.btn-success.disabled:active,
-.btn-success[disabled]:active,
-fieldset[disabled] .btn-success:active,
-.btn-success.disabled.active,
-.btn-success[disabled].active,
-fieldset[disabled] .btn-success.active {
-  background-color: #5cb85c;
-  border-color: #4cae4c;
-}
-.btn-success .badge {
-  color: #5cb85c;
-  background-color: #fff;
-}
-.btn-info {
-  color: #fff;
-  background-color: #5bc0de;
-  border-color: #46b8da;
-}
-.btn-info:hover,
-.btn-info:focus,
-.btn-info:active,
-.btn-info.active,
-.open > .dropdown-toggle.btn-info {
-  color: #fff;
-  background-color: #31b0d5;
-  border-color: #269abc;
-}
-.btn-info:active,
-.btn-info.active,
-.open > .dropdown-toggle.btn-info {
-  background-image: none;
-}
-.btn-info.disabled,
-.btn-info[disabled],
-fieldset[disabled] .btn-info,
-.btn-info.disabled:hover,
-.btn-info[disabled]:hover,
-fieldset[disabled] .btn-info:hover,
-.btn-info.disabled:focus,
-.btn-info[disabled]:focus,
-fieldset[disabled] .btn-info:focus,
-.btn-info.disabled:active,
-.btn-info[disabled]:active,
-fieldset[disabled] .btn-info:active,
-.btn-info.disabled.active,
-.btn-info[disabled].active,
-fieldset[disabled] .btn-info.active {
-  background-color: #5bc0de;
-  border-color: #46b8da;
-}
-.btn-info .badge {
-  color: #5bc0de;
-  background-color: #fff;
-}
-.btn-warning {
-  color: #fff;
-  background-color: #f0ad4e;
-  border-color: #eea236;
-}
-.btn-warning:hover,
-.btn-warning:focus,
-.btn-warning:active,
-.btn-warning.active,
-.open > .dropdown-toggle.btn-warning {
-  color: #fff;
-  background-color: #ec971f;
-  border-color: #d58512;
-}
-.btn-warning:active,
-.btn-warning.active,
-.open > .dropdown-toggle.btn-warning {
-  background-image: none;
-}
-.btn-warning.disabled,
-.btn-warning[disabled],
-fieldset[disabled] .btn-warning,
-.btn-warning.disabled:hover,
-.btn-warning[disabled]:hover,
-fieldset[disabled] .btn-warning:hover,
-.btn-warning.disabled:focus,
-.btn-warning[disabled]:focus,
-fieldset[disabled] .btn-warning:focus,
-.btn-warning.disabled:active,
-.btn-warning[disabled]:active,
-fieldset[disabled] .btn-warning:active,
-.btn-warning.disabled.active,
-.btn-warning[disabled].active,
-fieldset[disabled] .btn-warning.active {
-  background-color: #f0ad4e;
-  border-color: #eea236;
-}
-.btn-warning .badge {
-  color: #f0ad4e;
-  background-color: #fff;
-}
-.btn-danger {
-  color: #fff;
-  background-color: #d9534f;
-  border-color: #d43f3a;
-}
-.btn-danger:hover,
-.btn-danger:focus,
-.btn-danger:active,
-.btn-danger.active,
-.open > .dropdown-toggle.btn-danger {
-  color: #fff;
-  background-color: #c9302c;
-  border-color: #ac2925;
-}
-.btn-danger:active,
-.btn-danger.active,
-.open > .dropdown-toggle.btn-danger {
-  background-image: none;
-}
-.btn-danger.disabled,
-.btn-danger[disabled],
-fieldset[disabled] .btn-danger,
-.btn-danger.disabled:hover,
-.btn-danger[disabled]:hover,
-fieldset[disabled] .btn-danger:hover,
-.btn-danger.disabled:focus,
-.btn-danger[disabled]:focus,
-fieldset[disabled] .btn-danger:focus,
-.btn-danger.disabled:active,
-.btn-danger[disabled]:active,
-fieldset[disabled] .btn-danger:active,
-.btn-danger.disabled.active,
-.btn-danger[disabled].active,
-fieldset[disabled] .btn-danger.active {
-  background-color: #d9534f;
-  border-color: #d43f3a;
-}
-.btn-danger .badge {
-  color: #d9534f;
-  background-color: #fff;
-}
-.btn-link {
-  font-weight: normal;
-  color: #428bca;
-  cursor: pointer;
-  border-radius: 0;
-}
-.btn-link,
-.btn-link:active,
-.btn-link[disabled],
-fieldset[disabled] .btn-link {
-  background-color: transparent;
-  -webkit-box-shadow: none;
-          box-shadow: none;
-}
-.btn-link,
-.btn-link:hover,
-.btn-link:focus,
-.btn-link:active {
-  border-color: transparent;
-}
-.btn-link:hover,
-.btn-link:focus {
-  color: #2a6496;
-  text-decoration: underline;
-  background-color: transparent;
-}
-.btn-link[disabled]:hover,
-fieldset[disabled] .btn-link:hover,
-.btn-link[disabled]:focus,
-fieldset[disabled] .btn-link:focus {
-  color: #777;
-  text-decoration: none;
-}
-.btn-lg,
-.btn-group-lg > .btn {
-  padding: 10px 16px;
-  font-size: 18px;
-  line-height: 1.33;
-  border-radius: 6px;
-}
-.btn-sm,
-.btn-group-sm > .btn {
-  padding: 5px 10px;
-  font-size: 12px;
-  line-height: 1.5;
-  border-radius: 3px;
-}
-.btn-xs,
-.btn-group-xs > .btn {
-  padding: 1px 5px;
-  font-size: 12px;
-  line-height: 1.5;
-  border-radius: 3px;
-}
-.btn-block {
-  display: block;
-  width: 100%;
-}
-.btn-block + .btn-block {
-  margin-top: 5px;
-}
-input[type="submit"].btn-block,
-input[type="reset"].btn-block,
-input[type="button"].btn-block {
-  width: 100%;
-}
-.fade {
-  opacity: 0;
-  -webkit-transition: opacity .15s linear;
-       -o-transition: opacity .15s linear;
-          transition: opacity .15s linear;
-}
-.fade.in {
-  opacity: 1;
-}
-.collapse {
-  display: none;
-}
-.collapse.in {
-  display: block;
-}
-tr.collapse.in {
-  display: table-row;
-}
-tbody.collapse.in {
-  display: table-row-group;
-}
-.collapsing {
-  position: relative;
-  height: 0;
-  overflow: hidden;
-  -webkit-transition: height .35s ease;
-       -o-transition: height .35s ease;
-          transition: height .35s ease;
-}
-.caret {
-  display: inline-block;
-  width: 0;
-  height: 0;
-  margin-left: 2px;
-  vertical-align: middle;
-  border-top: 4px solid;
-  border-right: 4px solid transparent;
-  border-left: 4px solid transparent;
-}
-.dropdown {
-  position: relative;
-}
-.dropdown-toggle:focus {
-  outline: 0;
-}
-.dropdown-menu {
-  position: absolute;
-  top: 100%;
-  left: 0;
-  z-index: 1000;
-  display: none;
-  float: left;
-  min-width: 160px;
-  padding: 5px 0;
-  margin: 2px 0 0;
-  font-size: 14px;
-  text-align: left;
-  list-style: none;
-  background-color: #fff;
-  -webkit-background-clip: padding-box;
-          background-clip: padding-box;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, .15);
-  border-radius: 4px;
-  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
-          box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
-}
-.dropdown-menu.pull-right {
-  right: 0;
-  left: auto;
-}
-.dropdown-menu .divider {
-  height: 1px;
-  margin: 9px 0;
-  overflow: hidden;
-  background-color: #e5e5e5;
-}
-.dropdown-menu > li > a {
-  display: block;
-  padding: 3px 20px;
-  clear: both;
-  font-weight: normal;
-  line-height: 1.42857143;
-  color: #333;
-  white-space: nowrap;
-}
-.dropdown-menu > li > a:hover,
-.dropdown-menu > li > a:focus {
-  color: #262626;
-  text-decoration: none;
-  background-color: #f5f5f5;
-}
-.dropdown-menu > .active > a,
-.dropdown-menu > .active > a:hover,
-.dropdown-menu > .active > a:focus {
-  color: #fff;
-  text-decoration: none;
-  background-color: #428bca;
-  outline: 0;
-}
-.dropdown-menu > .disabled > a,
-.dropdown-menu > .disabled > a:hover,
-.dropdown-menu > .disabled > a:focus {
-  color: #777;
-}
-.dropdown-menu > .disabled > a:hover,
-.dropdown-menu > .disabled > a:focus {
-  text-decoration: none;
-  cursor: not-allowed;
-  background-color: transparent;
-  background-image: none;
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.open > .dropdown-menu {
-  display: block;
-}
-.open > a {
-  outline: 0;
-}
-.dropdown-menu-right {
-  right: 0;
-  left: auto;
-}
-.dropdown-menu-left {
-  right: auto;
-  left: 0;
-}
-.dropdown-header {
-  display: block;
-  padding: 3px 20px;
-  font-size: 12px;
-  line-height: 1.42857143;
-  color: #777;
-  white-space: nowrap;
-}
-.dropdown-backdrop {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: 990;
-}
-.pull-right > .dropdown-menu {
-  right: 0;
-  left: auto;
-}
-.dropup .caret,
-.navbar-fixed-bottom .dropdown .caret {
-  content: "";
-  border-top: 0;
-  border-bottom: 4px solid;
-}
-.dropup .dropdown-menu,
-.navbar-fixed-bottom .dropdown .dropdown-menu {
-  top: auto;
-  bottom: 100%;
-  margin-bottom: 1px;
-}
-@media (min-width: 1000px) {
-  .navbar-right .dropdown-menu {
-    right: 0;
-    left: auto;
-  }
-  .navbar-right .dropdown-menu-left {
-    right: auto;
-    left: 0;
-  }
-}
-.btn-group,
-.btn-group-vertical {
-  position: relative;
-  display: inline-block;
-  vertical-align: middle;
-}
-.btn-group > .btn,
-.btn-group-vertical > .btn {
-  position: relative;
-  float: left;
-}
-.btn-group > .btn:hover,
-.btn-group-vertical > .btn:hover,
-.btn-group > .btn:focus,
-.btn-group-vertical > .btn:focus,
-.btn-group > .btn:active,
-.btn-group-vertical > .btn:active,
-.btn-group > .btn.active,
-.btn-group-vertical > .btn.active {
-  z-index: 2;
-}
-.btn-group > .btn:focus,
-.btn-group-vertical > .btn:focus {
-  outline: 0;
-}
-.btn-group .btn + .btn,
-.btn-group .btn + .btn-group,
-.btn-group .btn-group + .btn,
-.btn-group .btn-group + .btn-group {
-  margin-left: -1px;
-}
-.btn-toolbar {
-  margin-left: -5px;
-}
-.btn-toolbar .btn-group,
-.btn-toolbar .input-group {
-  float: left;
-}
-.btn-toolbar > .btn,
-.btn-toolbar > .btn-group,
-.btn-toolbar > .input-group {
-  margin-left: 5px;
-}
-.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
-  border-radius: 0;
-}
-.btn-group > .btn:first-child {
-  margin-left: 0;
-}
-.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
-  border-top-right-radius: 0;
-  border-bottom-right-radius: 0;
-}
-.btn-group > .btn:last-child:not(:first-child),
-.btn-group > .dropdown-toggle:not(:first-child) {
-  border-top-left-radius: 0;
-  border-bottom-left-radius: 0;
-}
-.btn-group > .btn-group {
-  float: left;
-}
-.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
-  border-radius: 0;
-}
-.btn-group > .btn-group:first-child > .btn:last-child,
-.btn-group > .btn-group:first-child > .dropdown-toggle {
-  border-top-right-radius: 0;
-  border-bottom-right-radius: 0;
-}
-.btn-group > .btn-group:last-child > .btn:first-child {
-  border-top-left-radius: 0;
-  border-bottom-left-radius: 0;
-}
-.btn-group .dropdown-toggle:active,
-.btn-group.open .dropdown-toggle {
-  outline: 0;
-}
-.btn-group > .btn + .dropdown-toggle {
-  padding-right: 8px;
-  padding-left: 8px;
-}
-.btn-group > .btn-lg + .dropdown-toggle {
-  padding-right: 12px;
-  padding-left: 12px;
-}
-.btn-group.open .dropdown-toggle {
-  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
-          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
-}
-.btn-group.open .dropdown-toggle.btn-link {
-  -webkit-box-shadow: none;
-          box-shadow: none;
-}
-.btn .caret {
-  margin-left: 0;
-}
-.btn-lg .caret {
-  border-width: 5px 5px 0;
-  border-bottom-width: 0;
-}
-.dropup .btn-lg .caret {
-  border-width: 0 5px 5px;
-}
-.btn-group-vertical > .btn,
-.btn-group-vertical > .btn-group,
-.btn-group-vertical > .btn-group > .btn {
-  display: block;
-  float: none;
-  width: 100%;
-  max-width: 100%;
-}
-.btn-group-vertical > .btn-group > .btn {
-  float: none;
-}
-.btn-group-vertical > .btn + .btn,
-.btn-group-vertical > .btn + .btn-group,
-.btn-group-vertical > .btn-group + .btn,
-.btn-group-vertical > .btn-group + .btn-group {
-  margin-top: -1px;
-  margin-left: 0;
-}
-.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
-  border-radius: 0;
-}
-.btn-group-vertical > .btn:first-child:not(:last-child) {
-  border-top-right-radius: 4px;
-  border-bottom-right-radius: 0;
-  border-bottom-left-radius: 0;
-}
-.btn-group-vertical > .btn:last-child:not(:first-child) {
-  border-top-left-radius: 0;
-  border-top-right-radius: 0;
-  border-bottom-left-radius: 4px;
-}
-.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
-  border-radius: 0;
-}
-.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
-.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
-  border-bottom-right-radius: 0;
-  border-bottom-left-radius: 0;
-}
-.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
-  border-top-left-radius: 0;
-  border-top-right-radius: 0;
-}
-.btn-group-justified {
-  display: table;
-  width: 100%;
-  table-layout: fixed;
-  border-collapse: separate;
-}
-.btn-group-justified > .btn,
-.btn-group-justified > .btn-group {
-  display: table-cell;
-  float: none;
-  width: 1%;
-}
-.btn-group-justified > .btn-group .btn {
-  width: 100%;
-}
-.btn-group-justified > .btn-group .dropdown-menu {
-  left: auto;
-}
-[data-toggle="buttons"] > .btn > input[type="radio"],
-[data-toggle="buttons"] > .btn > input[type="checkbox"] {
-  position: absolute;
-  z-index: -1;
-  filter: alpha(opacity=0);
-  opacity: 0;
-}
-.input-group {
-  position: relative;
-  display: table;
-  border-collapse: separate;
-}
-.input-group[class*="col-"] {
-  float: none;
-  padding-right: 0;
-  padding-left: 0;
-}
-.input-group .form-control {
-  position: relative;
-  z-index: 2;
-  float: left;
-  width: 100%;
-  margin-bottom: 0;
-}
-.input-group-lg > .form-control,
-.input-group-lg > .input-group-addon,
-.input-group-lg > .input-group-btn > .btn {
-  height: 46px;
-  padding: 10px 16px;
-  font-size: 18px;
-  line-height: 1.33;
-  border-radius: 6px;
-}
-select.input-group-lg > .form-control,
-select.input-group-lg > .input-group-addon,
-select.input-group-lg > .input-group-btn > .btn {
-  height: 46px;
-  line-height: 46px;
-}
-textarea.input-group-lg > .form-control,
-textarea.input-group-lg > .input-group-addon,
-textarea.input-group-lg > .input-group-btn > .btn,
-select[multiple].input-group-lg > .form-control,
-select[multiple].input-group-lg > .input-group-addon,
-select[multiple].input-group-lg > .input-group-btn > .btn {
-  height: auto;
-}
-.input-group-sm > .form-control,
-.input-group-sm > .input-group-addon,
-.input-group-sm > .input-group-btn > .btn {
-  height: 30px;
-  padding: 5px 10px;
-  font-size: 12px;
-  line-height: 1.5;
-  border-radius: 3px;
-}
-select.input-group-sm > .form-control,
-select.input-group-sm > .input-group-addon,
-select.input-group-sm > .input-group-btn > .btn {
-  height: 30px;
-  line-height: 30px;
-}
-textarea.input-group-sm > .form-control,
-textarea.input-group-sm > .input-group-addon,
-textarea.input-group-sm > .input-group-btn > .btn,
-select[multiple].input-group-sm > .form-control,
-select[multiple].input-group-sm > .input-group-addon,
-select[multiple].input-group-sm > .input-group-btn > .btn {
-  height: auto;
-}
-.input-group-addon,
-.input-group-btn,
-.input-group .form-control {
-  display: table-cell;
-}
-.input-group-addon:not(:first-child):not(:last-child),
-.input-group-btn:not(:first-child):not(:last-child),
-.input-group .form-control:not(:first-child):not(:last-child) {
-  border-radius: 0;
-}
-.input-group-addon,
-.input-group-btn {
-  width: 1%;
-  white-space: nowrap;
-  vertical-align: middle;
-}
-.input-group-addon {
-  padding: 6px 12px;
-  font-size: 14px;
-  font-weight: normal;
-  line-height: 1;
-  color: #555;
-  text-align: center;
-  background-color: #eee;
-  border: 1px solid #ccc;
-  border-radius: 4px;
-}
-.input-group-addon.input-sm {
-  padding: 5px 10px;
-  font-size: 12px;
-  border-radius: 3px;
-}
-.input-group-addon.input-lg {
-  padding: 10px 16px;
-  font-size: 18px;
-  border-radius: 6px;
-}
-.input-group-addon input[type="radio"],
-.input-group-addon input[type="checkbox"] {
-  margin-top: 0;
-}
-.input-group .form-control:first-child,
-.input-group-addon:first-child,
-.input-group-btn:first-child > .btn,
-.input-group-btn:first-child > .btn-group > .btn,
-.input-group-btn:first-child > .dropdown-toggle,
-.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
-.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
-  border-top-right-radius: 0;
-  border-bottom-right-radius: 0;
-}
-.input-group-addon:first-child {
-  border-right: 0;
-}
-.input-group .form-control:last-child,
-.input-group-addon:last-child,
-.input-group-btn:last-child > .btn,
-.input-group-btn:last-child > .btn-group > .btn,
-.input-group-btn:last-child > .dropdown-toggle,
-.input-group-btn:first-child > .btn:not(:first-child),
-.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
-  border-top-left-radius: 0;
-  border-bottom-left-radius: 0;
-}
-.input-group-addon:last-child {
-  border-left: 0;
-}
-.input-group-btn {
-  position: relative;
-  font-size: 0;
-  white-space: nowrap;
-}
-.input-group-btn > .btn {
-  position: relative;
-}
-.input-group-btn > .btn + .btn {
-  margin-left: -1px;
-}
-.input-group-btn > .btn:hover,
-.input-group-btn > .btn:focus,
-.input-group-btn > .btn:active {
-  z-index: 2;
-}
-.input-group-btn:first-child > .btn,
-.input-group-btn:first-child > .btn-group {
-  margin-right: -1px;
-}
-.input-group-btn:last-child > .btn,
-.input-group-btn:last-child > .btn-group {
-  margin-left: -1px;
-}
-.nav {
-  padding-left: 0;
-  margin-bottom: 0;
-  list-style: none;
-}
-.nav > li {
-  position: relative;
-  display: block;
-}
-.nav > li > a {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-}
-.nav > li > a:hover,
-.nav > li > a:focus {
-  text-decoration: none;
-  background-color: #eee;
-}
-.nav > li.disabled > a {
-  color: #777;
-}
-.nav > li.disabled > a:hover,
-.nav > li.disabled > a:focus {
-  color: #777;
-  text-decoration: none;
-  cursor: not-allowed;
-  background-color: transparent;
-}
-.nav .open > a,
-.nav .open > a:hover,
-.nav .open > a:focus {
-  background-color: #eee;
-  border-color: #428bca;
-}
-.nav .nav-divider {
-  height: 1px;
-  margin: 9px 0;
-  overflow: hidden;
-  background-color: #e5e5e5;
-}
-.nav > li > a > img {
-  max-width: none;
-}
-.nav-tabs {
-  border-bottom: 1px solid #ddd;
-}
-.nav-tabs > li {
-  float: left;
-  margin-bottom: -1px;
-}
-.nav-tabs > li > a {
-  margin-right: 2px;
-  line-height: 1.42857143;
-  border: 1px solid transparent;
-  border-radius: 4px 4px 0 0;
-}
-.nav-tabs > li > a:hover {
-  border-color: #eee #eee #ddd;
-}
-.nav-tabs > li.active > a,
-.nav-tabs > li.active > a:hover,
-.nav-tabs > li.active > a:focus {
-  color: #555;
-  cursor: default;
-  background-color: #fff;
-  border: 1px solid #ddd;
-  border-bottom-color: transparent;
-}
-.nav-tabs.nav-justified {
-  width: 100%;
-  border-bottom: 0;
-}
-.nav-tabs.nav-justified > li {
-  float: none;
-}
-.nav-tabs.nav-justified > li > a {
-  margin-bottom: 5px;
-  text-align: center;
-}
-.nav-tabs.nav-justified > .dropdown .dropdown-menu {
-  top: auto;
-  left: auto;
-}
-@media (min-width: 768px) {
-  .nav-tabs.nav-justified > li {
-    display: table-cell;
-    width: 1%;
-  }
-  .nav-tabs.nav-justified > li > a {
-    margin-bottom: 0;
-  }
-}
-.nav-tabs.nav-justified > li > a {
-  margin-right: 0;
-  border-radius: 4px;
-}
-.nav-tabs.nav-justified > .active > a,
-.nav-tabs.nav-justified > .active > a:hover,
-.nav-tabs.nav-justified > .active > a:focus {
-  border: 1px solid #ddd;
-}
-@media (min-width: 768px) {
-  .nav-tabs.nav-justified > li > a {
-    border-bottom: 1px solid #ddd;
-    border-radius: 4px 4px 0 0;
-  }
-  .nav-tabs.nav-justified > .active > a,
-  .nav-tabs.nav-justified > .active > a:hover,
-  .nav-tabs.nav-justified > .active > a:focus {
-    border-bottom-color: #fff;
-  }
-}
-.nav-pills > li {
-  float: left;
-}
-.nav-pills > li > a {
-  border-radius: 4px;
-}
-.nav-pills > li + li {
-  margin-left: 2px;
-}
-.nav-pills > li.active > a,
-.nav-pills > li.active > a:hover,
-.nav-pills > li.active > a:focus {
-  color: #fff;
-  background-color: #428bca;
-}
-.nav-stacked > li {
-  float: none;
-}
-.nav-stacked > li + li {
-  margin-top: 2px;
-  margin-left: 0;
-}
-.nav-justified {
-  width: 100%;
-}
-.nav-justified > li {
-  float: none;
-}
-.nav-justified > li > a {
-  margin-bottom: 5px;
-  text-align: center;
-}
-.nav-justified > .dropdown .dropdown-menu {
-  top: auto;
-  left: auto;
-}
-@media (min-width: 768px) {
-  .nav-justified > li {
-    display: table-cell;
-    width: 1%;
-  }
-  .nav-justified > li > a {
-    margin-bottom: 0;
-  }
-}
-.nav-tabs-justified {
-  border-bottom: 0;
-}
-.nav-tabs-justified > li > a {
-  margin-right: 0;
-  border-radius: 4px;
-}
-.nav-tabs-justified > .active > a,
-.nav-tabs-justified > .active > a:hover,
-.nav-tabs-justified > .active > a:focus {
-  border: 1px solid #ddd;
-}
-@media (min-width: 768px) {
-  .nav-tabs-justified > li > a {
-    border-bottom: 1px solid #ddd;
-    border-radius: 4px 4px 0 0;
-  }
-  .nav-tabs-justified > .active > a,
-  .nav-tabs-justified > .active > a:hover,
-  .nav-tabs-justified > .active > a:focus {
-    border-bottom-color: #fff;
-  }
-}
-.tab-content > .tab-pane {
-  display: none;
-}
-.tab-content > .active {
-  display: block;
-}
-.nav-tabs .dropdown-menu {
-  margin-top: -1px;
-  border-top-left-radius: 0;
-  border-top-right-radius: 0;
-}
-.navbar {
-  position: relative;
-  min-height: 50px;
-  margin-bottom: 20px;
-  border: 1px solid transparent;
-}
-@media (min-width: 1000px) {
-  .navbar {
-    border-radius: 4px;
-  }
-}
-@media (min-width: 1000px) {
-  .navbar-header {
-    float: left;
-  }
-}
-.navbar-collapse {
-  padding-right: 15px;
-  padding-left: 15px;
-  overflow-x: visible;
-  -webkit-overflow-scrolling: touch;
-  border-top: 1px solid transparent;
-  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
-          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
-}
-.navbar-collapse.in {
-  overflow-y: auto;
-}
-@media (min-width: 1000px) {
-  .navbar-collapse {
-    width: auto;
-    border-top: 0;
-    -webkit-box-shadow: none;
-            box-shadow: none;
-  }
-  .navbar-collapse.collapse {
-    display: block !important;
-    height: auto !important;
-    padding-bottom: 0;
-    overflow: visible !important;
-  }
-  .navbar-collapse.in {
-    overflow-y: visible;
-  }
-  .navbar-fixed-top .navbar-collapse,
-  .navbar-static-top .navbar-collapse,
-  .navbar-fixed-bottom .navbar-collapse {
-    padding-right: 0;
-    padding-left: 0;
-  }
-}
-.navbar-fixed-top .navbar-collapse,
-.navbar-fixed-bottom .navbar-collapse {
-  max-height: 340px;
-}
-@media (max-width: 480px) and (orientation: landscape) {
-  .navbar-fixed-top .navbar-collapse,
-  .navbar-fixed-bottom .navbar-collapse {
-    max-height: 200px;
-  }
-}
-.container > .navbar-header,
-.container-fluid > .navbar-header,
-.container > .navbar-collapse,
-.container-fluid > .navbar-collapse {
-  margin-right: -15px;
-  margin-left: -15px;
-}
-@media (min-width: 1000px) {
-  .container > .navbar-header,
-  .container-fluid > .navbar-header,
-  .container > .navbar-collapse,
-  .container-fluid > .navbar-collapse {
-    margin-right: 0;
-    margin-left: 0;
-  }
-}
-.navbar-static-top {
-  z-index: 1000;
-  border-width: 0 0 1px;
-}
-@media (min-width: 1000px) {
-  .navbar-static-top {
-    border-radius: 0;
-  }
-}
-.navbar-fixed-top,
-.navbar-fixed-bottom {
-  position: fixed;
-  right: 0;
-  left: 0;
-  z-index: 1030;
-  -webkit-transform: translate3d(0, 0, 0);
-       -o-transform: translate3d(0, 0, 0);
-          transform: translate3d(0, 0, 0);
-}
-@media (min-width: 1000px) {
-  .navbar-fixed-top,
-  .navbar-fixed-bottom {
-    border-radius: 0;
-  }
-}
-.navbar-fixed-top {
-  top: 0;
-  border-width: 0 0 1px;
-}
-.navbar-fixed-bottom {
-  bottom: 0;
-  margin-bottom: 0;
-  border-width: 1px 0 0;
-}
-.navbar-brand {
-  float: left;
-  height: 50px;
-  padding: 15px 15px;
-  font-size: 18px;
-  line-height: 20px;
-}
-.navbar-brand:hover,
-.navbar-brand:focus {
-  text-decoration: none;
-}
-@media (min-width: 1000px) {
-  .navbar > .container .navbar-brand,
-  .navbar > .container-fluid .navbar-brand {
-    margin-left: -15px;
-  }
-}
-.navbar-toggle {
-  position: relative;
-  float: right;
-  padding: 9px 10px;
-  margin-top: 8px;
-  margin-right: 15px;
-  margin-bottom: 8px;
-  background-color: transparent;
-  background-image: none;
-  border: 1px solid transparent;
-  border-radius: 4px;
-}
-.navbar-toggle:focus {
-  outline: 0;
-}
-.navbar-toggle .icon-bar {
-  display: block;
-  width: 22px;
-  height: 2px;
-  border-radius: 1px;
-}
-.navbar-toggle .icon-bar + .icon-bar {
-  margin-top: 4px;
-}
-@media (min-width: 1000px) {
-  .navbar-toggle {
-    display: none;
-  }
-}
-.navbar-nav {
-  margin: 7.5px -15px;
-}
-.navbar-nav > li > a {
-  padding-top: 10px;
-  padding-bottom: 10px;
-  line-height: 20px;
-}
-@media (max-width: 999px) {
-  .navbar-nav .open .dropdown-menu {
-    position: static;
-    float: none;
-    width: auto;
-    margin-top: 0;
-    background-color: transparent;
-    border: 0;
-    -webkit-box-shadow: none;
-            box-shadow: none;
-  }
-  .navbar-nav .open .dropdown-menu > li > a,
-  .navbar-nav .open .dropdown-menu .dropdown-header {
-    padding: 5px 15px 5px 25px;
-  }
-  .navbar-nav .open .dropdown-menu > li > a {
-    line-height: 20px;
-  }
-  .navbar-nav .open .dropdown-menu > li > a:hover,
-  .navbar-nav .open .dropdown-menu > li > a:focus {
-    background-image: none;
-  }
-}
-@media (min-width: 1000px) {
-  .navbar-nav {
-    float: left;
-    margin: 0;
-  }
-  .navbar-nav > li {
-    float: left;
-  }
-  .navbar-nav > li > a {
-    padding-top: 15px;
-    padding-bottom: 15px;
-  }
-  .navbar-nav.navbar-right:last-child {
-    margin-right: -15px;
-  }
-}
-@media (min-width: 1000px) {
-  .navbar-left {
-    float: left !important;
-  }
-  .navbar-right {
-    float: right !important;
-  }
-}
-.navbar-form {
-  padding: 10px 15px;
-  margin-top: 8px;
-  margin-right: -15px;
-  margin-bottom: 8px;
-  margin-left: -15px;
-  border-top: 1px solid transparent;
-  border-bottom: 1px solid transparent;
-  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
-          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
-}
-@media (min-width: 1000px) {
-  .navbar-form .form-group {
-    display: inline-block;
-    margin-bottom: 0;
-    vertical-align: middle;
-  }
-  .navbar-form .form-control {
-    display: inline-block;
-    width: auto;
-    vertical-align: middle;
-  }
-  .navbar-form .input-group {
-    display: inline-table;
-    vertical-align: middle;
-  }
-  .navbar-form .input-group .input-group-addon,
-  .navbar-form .input-group .input-group-btn,
-  .navbar-form .input-group .form-control {
-    width: auto;
-  }
-  .navbar-form .input-group > .form-control {
-    width: 100%;
-  }
-  .navbar-form .control-label {
-    margin-bottom: 0;
-    vertical-align: middle;
-  }
-  .navbar-form .radio,
-  .navbar-form .checkbox {
-    display: inline-block;
-    margin-top: 0;
-    margin-bottom: 0;
-    vertical-align: middle;
-  }
-  .navbar-form .radio label,
-  .navbar-form .checkbox label {
-    padding-left: 0;
-  }
-  .navbar-form .radio input[type="radio"],
-  .navbar-form .checkbox input[type="checkbox"] {
-    position: relative;
-    margin-left: 0;
-  }
-  .navbar-form .has-feedback .form-control-feedback {
-    top: 0;
-  }
-}
-@media (max-width: 999px) {
-  .navbar-form .form-group {
-    margin-bottom: 5px;
-  }
-}
-@media (min-width: 1000px) {
-  .navbar-form {
-    width: auto;
-    padding-top: 0;
-    padding-bottom: 0;
-    margin-right: 0;
-    margin-left: 0;
-    border: 0;
-    -webkit-box-shadow: none;
-            box-shadow: none;
-  }
-  .navbar-form.navbar-right:last-child {
-    margin-right: -15px;
-  }
-}
-.navbar-nav > li > .dropdown-menu {
-  margin-top: 0;
-  border-top-left-radius: 0;
-  border-top-right-radius: 0;
-}
-.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
-  border-bottom-right-radius: 0;
-  border-bottom-left-radius: 0;
-}
-.navbar-btn {
-  margin-top: 8px;
-  margin-bottom: 8px;
-}
-.navbar-btn.btn-sm {
-  margin-top: 10px;
-  margin-bottom: 10px;
-}
-.navbar-btn.btn-xs {
-  margin-top: 14px;
-  margin-bottom: 14px;
-}
-.navbar-text {
-  margin-top: 15px;
-  margin-bottom: 15px;
-}
-@media (min-width: 1000px) {
-  .navbar-text {
-    float: left;
-    margin-right: 15px;
-    margin-left: 15px;
-  }
-  .navbar-text.navbar-right:last-child {
-    margin-right: 0;
-  }
-}
-.navbar-default {
-  background-color: #f8f8f8;
-  border-color: #e7e7e7;
-}
-.navbar-default .navbar-brand {
-  color: #777;
-}
-.navbar-default .navbar-brand:hover,
-.navbar-default .navbar-brand:focus {
-  color: #5e5e5e;
-  background-color: transparent;
-}
-.navbar-default .navbar-text {
-  color: #777;
-}
-.navbar-default .navbar-nav > li > a {
-  color: #777;
-}
-.navbar-default .navbar-nav > li > a:hover,
-.navbar-default .navbar-nav > li > a:focus {
-  color: #333;
-  background-color: transparent;
-}
-.navbar-default .navbar-nav > .active > a,
-.navbar-default .navbar-nav > .active > a:hover,
-.navbar-default .navbar-nav > .active > a:focus {
-  color: #555;
-  background-color: #e7e7e7;
-}
-.navbar-default .navbar-nav > .disabled > a,
-.navbar-default .navbar-nav > .disabled > a:hover,
-.navbar-default .navbar-nav > .disabled > a:focus {
-  color: #ccc;
-  background-color: transparent;
-}
-.navbar-default .navbar-toggle {
-  border-color: #ddd;
-}
-.navbar-default .navbar-toggle:hover,
-.navbar-default .navbar-toggle:focus {
-  background-color: #ddd;
-}
-.navbar-default .navbar-toggle .icon-bar {
-  background-color: #888;
-}
-.navbar-default .navbar-collapse,
-.navbar-default .navbar-form {
-  border-color: #e7e7e7;
-}
-.navbar-default .navbar-nav > .open > a,
-.navbar-default .navbar-nav > .open > a:hover,
-.navbar-default .navbar-nav > .open > a:focus {
-  color: #555;
-  background-color: #e7e7e7;
-}
-@media (max-width: 999px) {
-  .navbar-default .navbar-nav .open .dropdown-menu > li > a {
-    color: #777;
-  }
-  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
-  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
-    color: #333;
-    background-color: transparent;
-  }
-  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,
-  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
-  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
-    color: #555;
-    background-color: #e7e7e7;
-  }
-  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
-  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
-  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
-    color: #ccc;
-    background-color: transparent;
-  }
-}
-.navbar-default .navbar-link {
-  color: #777;
-}
-.navbar-default .navbar-link:hover {
-  color: #333;
-}
-.navbar-default .btn-link {
-  color: #777;
-}
-.navbar-default .btn-link:hover,
-.navbar-default .btn-link:focus {
-  color: #333;
-}
-.navbar-default .btn-link[disabled]:hover,
-fieldset[disabled] .navbar-default .btn-link:hover,
-.navbar-default .btn-link[disabled]:focus,
-fieldset[disabled] .navbar-default .btn-link:focus {
-  color: #ccc;
-}
-.navbar-inverse {
-  background-color: #222;
-  border-color: #080808;
-}
-.navbar-inverse .navbar-brand {
-  color: #777;
-}
-.navbar-inverse .navbar-brand:hover,
-.navbar-inverse .navbar-brand:focus {
-  color: #fff;
-  background-color: transparent;
-}
-.navbar-inverse .navbar-text {
-  color: #777;
-}
-.navbar-inverse .navbar-nav > li > a {
-  color: #777;
-}
-.navbar-inverse .navbar-nav > li > a:hover,
-.navbar-inverse .navbar-nav > li > a:focus {
-  color: #fff;
-  background-color: transparent;
-}
-.navbar-inverse .navbar-nav > .active > a,
-.navbar-inverse .navbar-nav > .active > a:hover,
-.navbar-inverse .navbar-nav > .active > a:focus {
-  color: #fff;
-  background-color: #080808;
-}
-.navbar-inverse .navbar-nav > .disabled > a,
-.navbar-inverse .navbar-nav > .disabled > a:hover,
-.navbar-inverse .navbar-nav > .disabled > a:focus {
-  color: #444;
-  background-color: transparent;
-}
-.navbar-inverse .navbar-toggle {
-  border-color: #333;
-}
-.navbar-inverse .navbar-toggle:hover,
-.navbar-inverse .navbar-toggle:focus {
-  background-color: #333;
-}
-.navbar-inverse .navbar-toggle .icon-bar {
-  background-color: #fff;
-}
-.navbar-inverse .navbar-collapse,
-.navbar-inverse .navbar-form {
-  border-color: #101010;
-}
-.navbar-inverse .navbar-nav > .open > a,
-.navbar-inverse .navbar-nav > .open > a:hover,
-.navbar-inverse .navbar-nav > .open > a:focus {
-  color: #fff;
-  background-color: #080808;
-}
-@media (max-width: 999px) {
-  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
-    border-color: #080808;
-  }
-  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
-    background-color: #080808;
-  }
-  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
-    color: #777;
-  }
-  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
-  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
-    color: #fff;
-    background-color: transparent;
-  }
-  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
-  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
-  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
-    color: #fff;
-    background-color: #080808;
-  }
-  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
-  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
-  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
-    color: #444;
-    background-color: transparent;
-  }
-}
-.navbar-inverse .navbar-link {
-  color: #777;
-}
-.navbar-inverse .navbar-link:hover {
-  color: #fff;
-}
-.navbar-inverse .btn-link {
-  color: #777;
-}
-.navbar-inverse .btn-link:hover,
-.navbar-inverse .btn-link:focus {
-  color: #fff;
-}
-.navbar-inverse .btn-link[disabled]:hover,
-fieldset[disabled] .navbar-inverse .btn-link:hover,
-.navbar-inverse .btn-link[disabled]:focus,
-fieldset[disabled] .navbar-inverse .btn-link:focus {
-  color: #444;
-}
-.breadcrumb {
-  padding: 8px 15px;
-  margin-bottom: 20px;
-  list-style: none;
-  background-color: #f5f5f5;
-  border-radius: 4px;
-}
-.breadcrumb > li {
-  display: inline-block;
-}
-.breadcrumb > li + li:before {
-  padding: 0 5px;
-  color: #ccc;
-  content: "/\00a0";
-}
-.breadcrumb > .active {
-  color: #777;
-}
-.pagination {
-  display: inline-block;
-  padding-left: 0;
-  margin: 20px 0;
-  border-radius: 4px;
-}
-.pagination > li {
-  display: inline;
-}
-.pagination > li > a,
-.pagination > li > span {
-  position: relative;
-  float: left;
-  padding: 6px 12px;
-  margin-left: -1px;
-  line-height: 1.42857143;
-  color: #428bca;
-  text-decoration: none;
-  background-color: #fff;
-  border: 1px solid #ddd;
-}
-.pagination > li:first-child > a,
-.pagination > li:first-child > span {
-  margin-left: 0;
-  border-top-left-radius: 4px;
-  border-bottom-left-radius: 4px;
-}
-.pagination > li:last-child > a,
-.pagination > li:last-child > span {
-  border-top-right-radius: 4px;
-  border-bottom-right-radius: 4px;
-}
-.pagination > li > a:hover,
-.pagination > li > span:hover,
-.pagination > li > a:focus,
-.pagination > li > span:focus {
-  color: #2a6496;
-  background-color: #eee;
-  border-color: #ddd;
-}
-.pagination > .active > a,
-.pagination > .active > span,
-.pagination > .active > a:hover,
-.pagination > .active > span:hover,
-.pagination > .active > a:focus,
-.pagination > .active > span:focus {
-  z-index: 2;
-  color: #fff;
-  cursor: default;
-  background-color: #428bca;
-  border-color: #428bca;
-}
-.pagination > .disabled > span,
-.pagination > .disabled > span:hover,
-.pagination > .disabled > span:focus,
-.pagination > .disabled > a,
-.pagination > .disabled > a:hover,
-.pagination > .disabled > a:focus {
-  color: #777;
-  cursor: not-allowed;
-  background-color: #fff;
-  border-color: #ddd;
-}
-.pagination-lg > li > a,
-.pagination-lg > li > span {
-  padding: 10px 16px;
-  font-size: 18px;
-}
-.pagination-lg > li:first-child > a,
-.pagination-lg > li:first-child > span {
-  border-top-left-radius: 6px;
-  border-bottom-left-radius: 6px;
-}
-.pagination-lg > li:last-child > a,
-.pagination-lg > li:last-child > span {
-  border-top-right-radius: 6px;
-  border-bottom-right-radius: 6px;
-}
-.pagination-sm > li > a,
-.pagination-sm > li > span {
-  padding: 5px 10px;
-  font-size: 12px;
-}
-.pagination-sm > li:first-child > a,
-.pagination-sm > li:first-child > span {
-  border-top-left-radius: 3px;
-  border-bottom-left-radius: 3px;
-}
-.pagination-sm > li:last-child > a,
-.pagination-sm > li:last-child > span {
-  border-top-right-radius: 3px;
-  border-bottom-right-radius: 3px;
-}
-.pager {
-  padding-left: 0;
-  margin: 20px 0;
-  text-align: center;
-  list-style: none;
-}
-.pager li {
-  display: inline;
-}
-.pager li > a,
-.pager li > span {
-  display: inline-block;
-  padding: 5px 14px;
-  background-color: #fff;
-  border: 1px solid #ddd;
-  border-radius: 15px;
-}
-.pager li > a:hover,
-.pager li > a:focus {
-  text-decoration: none;
-  background-color: #eee;
-}
-.pager .next > a,
-.pager .next > span {
-  float: right;
-}
-.pager .previous > a,
-.pager .previous > span {
-  float: left;
-}
-.pager .disabled > a,
-.pager .disabled > a:hover,
-.pager .disabled > a:focus,
-.pager .disabled > span {
-  color: #777;
-  cursor: not-allowed;
-  background-color: #fff;
-}
-.label {
-  display: inline;
-  padding: .2em .6em .3em;
-  font-size: 75%;
-  font-weight: bold;
-  line-height: 1;
-  color: #fff;
-  text-align: center;
-  white-space: nowrap;
-  vertical-align: baseline;
-  border-radius: .25em;
-}
-a.label:hover,
-a.label:focus {
-  color: #fff;
-  text-decoration: none;
-  cursor: pointer;
-}
-.label:empty {
-  display: none;
-}
-.btn .label {
-  position: relative;
-  top: -1px;
-}
-.label-default {
-  background-color: #777;
-}
-.label-default[href]:hover,
-.label-default[href]:focus {
-  background-color: #5e5e5e;
-}
-.label-primary {
-  background-color: #428bca;
-}
-.label-primary[href]:hover,
-.label-primary[href]:focus {
-  background-color: #3071a9;
-}
-.label-success {
-  background-color: #5cb85c;
-}
-.label-success[href]:hover,
-.label-success[href]:focus {
-  background-color: #449d44;
-}
-.label-info {
-  background-color: #5bc0de;
-}
-.label-info[href]:hover,
-.label-info[href]:focus {
-  background-color: #31b0d5;
-}
-.label-warning {
-  background-color: #f0ad4e;
-}
-.label-warning[href]:hover,
-.label-warning[href]:focus {
-  background-color: #ec971f;
-}
-.label-danger {
-  background-color: #d9534f;
-}
-.label-danger[href]:hover,
-.label-danger[href]:focus {
-  background-color: #c9302c;
-}
-.badge {
-  display: inline-block;
-  min-width: 10px;
-  padding: 3px 7px;
-  font-size: 12px;
-  font-weight: bold;
-  line-height: 1;
-  color: #fff;
-  text-align: center;
-  white-space: nowrap;
-  vertical-align: baseline;
-  background-color: #777;
-  border-radius: 10px;
-}
-.badge:empty {
-  display: none;
-}
-.btn .badge {
-  position: relative;
-  top: -1px;
-}
-.btn-xs .badge {
-  top: 0;
-  padding: 1px 5px;
-}
-a.badge:hover,
-a.badge:focus {
-  color: #fff;
-  text-decoration: none;
-  cursor: pointer;
-}
-a.list-group-item.active > .badge,
-.nav-pills > .active > a > .badge {
-  color: #428bca;
-  background-color: #fff;
-}
-.nav-pills > li > a > .badge {
-  margin-left: 3px;
-}
-.jumbotron {
-  padding: 30px;
-  margin-bottom: 30px;
-  color: inherit;
-  background-color: #eee;
-}
-.jumbotron h1,
-.jumbotron .h1 {
-  color: inherit;
-}
-.jumbotron p {
-  margin-bottom: 15px;
-  font-size: 21px;
-  font-weight: 200;
-}
-.jumbotron > hr {
-  border-top-color: #d5d5d5;
-}
-.container .jumbotron {
-  border-radius: 6px;
-}
-.jumbotron .container {
-  max-width: 100%;
-}
-@media screen and (min-width: 768px) {
-  .jumbotron {
-    padding-top: 48px;
-    padding-bottom: 48px;
-  }
-  .container .jumbotron {
-    padding-right: 60px;
-    padding-left: 60px;
-  }
-  .jumbotron h1,
-  .jumbotron .h1 {
-    font-size: 63px;
-  }
-}
-.thumbnail {
-  display: block;
-  padding: 4px;
-  margin-bottom: 20px;
-  line-height: 1.42857143;
-  background-color: #fff;
-  border: 1px solid #ddd;
-  border-radius: 4px;
-  -webkit-transition: all .2s ease-in-out;
-       -o-transition: all .2s ease-in-out;
-          transition: all .2s ease-in-out;
-}
-.thumbnail > img,
-.thumbnail a > img {
-  margin-right: auto;
-  margin-left: auto;
-}
-a.thumbnail:hover,
-a.thumbnail:focus,
-a.thumbnail.active {
-  border-color: #428bca;
-}
-.thumbnail .caption {
-  padding: 9px;
-  color: #333;
-}
-.alert {
-  padding: 15px;
-  margin-bottom: 20px;
-  border: 1px solid transparent;
-  border-radius: 4px;
-}
-.alert h4 {
-  margin-top: 0;
-  color: inherit;
-}
-.alert .alert-link {
-  font-weight: bold;
-}
-.alert > p,
-.alert > ul {
-  margin-bottom: 0;
-}
-.alert > p + p {
-  margin-top: 5px;
-}
-.alert-dismissable,
-.alert-dismissible {
-  padding-right: 35px;
-}
-.alert-dismissable .close,
-.alert-dismissible .close {
-  position: relative;
-  top: -2px;
-  right: -21px;
-  color: inherit;
-}
-.alert-success {
-  color: #3c763d;
-  background-color: #dff0d8;
-  border-color: #d6e9c6;
-}
-.alert-success hr {
-  border-top-color: #c9e2b3;
-}
-.alert-success .alert-link {
-  color: #2b542c;
-}
-.alert-info {
-  color: #31708f;
-  background-color: #d9edf7;
-  border-color: #bce8f1;
-}
-.alert-info hr {
-  border-top-color: #a6e1ec;
-}
-.alert-info .alert-link {
-  color: #245269;
-}
-.alert-warning {
-  color: #8a6d3b;
-  background-color: #fcf8e3;
-  border-color: #faebcc;
-}
-.alert-warning hr {
-  border-top-color: #f7e1b5;
-}
-.alert-warning .alert-link {
-  color: #66512c;
-}
-.alert-danger {
-  color: #a94442;
-  background-color: #f2dede;
-  border-color: #ebccd1;
-}
-.alert-danger hr {
-  border-top-color: #e4b9c0;
-}
-.alert-danger .alert-link {
-  color: #843534;
-}
-@-webkit-keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-@-o-keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-@keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-.progress {
-  height: 20px;
-  margin-bottom: 20px;
-  overflow: hidden;
-  background-color: #f5f5f5;
-  border-radius: 4px;
-  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
-          box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
-}
-.progress-bar {
-  float: left;
-  width: 0;
-  height: 100%;
-  font-size: 12px;
-  line-height: 20px;
-  color: #fff;
-  text-align: center;
-  background-color: #428bca;
-  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
-          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
-  -webkit-transition: width .6s ease;
-       -o-transition: width .6s ease;
-          transition: width .6s ease;
-}
-.progress-striped .progress-bar,
-.progress-bar-striped {
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
-  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
-  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
-  -webkit-background-size: 40px 40px;
-          background-size: 40px 40px;
-}
-.progress.active .progress-bar,
-.progress-bar.active {
-  -webkit-animation: progress-bar-stripes 2s linear infinite;
-       -o-animation: progress-bar-stripes 2s linear infinite;
-          animation: progress-bar-stripes 2s linear infinite;
-}
-.progress-bar[aria-valuenow="1"],
-.progress-bar[aria-valuenow="2"] {
-  min-width: 30px;
-}
-.progress-bar[aria-valuenow="0"] {
-  min-width: 30px;
-  color: #777;
-  background-color: transparent;
-  background-image: none;
-  -webkit-box-shadow: none;
-          box-shadow: none;
-}
-.progress-bar-success {
-  background-color: #5cb85c;
-}
-.progress-striped .progress-bar-success {
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
-  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
-  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
-}
-.progress-bar-info {
-  background-color: #5bc0de;
-}
-.progress-striped .progress-bar-info {
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
-  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
-  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
-}
-.progress-bar-warning {
-  background-color: #f0ad4e;
-}
-.progress-striped .progress-bar-warning {
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
-  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
-  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
-}
-.progress-bar-danger {
-  background-color: #d9534f;
-}
-.progress-striped .progress-bar-danger {
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
-  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
-  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
-}
-.media,
-.media-body {
-  overflow: hidden;
-  zoom: 1;
-}
-.media,
-.media .media {
-  margin-top: 15px;
-}
-.media:first-child {
-  margin-top: 0;
-}
-.media-object {
-  display: block;
-}
-.media-heading {
-  margin: 0 0 5px;
-}
-.media > .pull-left {
-  margin-right: 10px;
-}
-.media > .pull-right {
-  margin-left: 10px;
-}
-.media-list {
-  padding-left: 0;
-  list-style: none;
-}
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-  border: 1px solid #ddd;
-}
-.list-group-item:first-child {
-  border-top-left-radius: 4px;
-  border-top-right-radius: 4px;
-}
-.list-group-item:last-child {
-  margin-bottom: 0;
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius: 4px;
-}
-.list-group-item > .badge {
-  float: right;
-}
-.list-group-item > .badge + .badge {
-  margin-right: 5px;
-}
-a.list-group-item {
-  color: #555;
-}
-a.list-group-item .list-group-item-heading {
-  color: #333;
-}
-a.list-group-item:hover,
-a.list-group-item:focus {
-  color: #555;
-  text-decoration: none;
-  background-color: #f5f5f5;
-}
-.list-group-item.disabled,
-.list-group-item.disabled:hover,
-.list-group-item.disabled:focus {
-  color: #777;
-  background-color: #eee;
-}
-.list-group-item.disabled .list-group-item-heading,
-.list-group-item.disabled:hover .list-group-item-heading,
-.list-group-item.disabled:focus .list-group-item-heading {
-  color: inherit;
-}
-.list-group-item.disabled .list-group-item-text,
-.list-group-item.disabled:hover .list-group-item-text,
-.list-group-item.disabled:focus .list-group-item-text {
-  color: #777;
-}
-.list-group-item.active,
-.list-group-item.active:hover,
-.list-group-item.active:focus {
-  z-index: 2;
-  color: #fff;
-  background-color: #428bca;
-  border-color: #428bca;
-}
-.list-group-item.active .list-group-item-heading,
-.list-group-item.active:hover .list-group-item-heading,
-.list-group-item.active:focus .list-group-item-heading,
-.list-group-item.active .list-group-item-heading > small,
-.list-group-item.active:hover .list-group-item-heading > small,
-.list-group-item.active:focus .list-group-item-heading > small,
-.list-group-item.active .list-group-item-heading > .small,
-.list-group-item.active:hover .list-group-item-heading > .small,
-.list-group-item.active:focus .list-group-item-heading > .small {
-  color: inherit;
-}
-.list-group-item.active .list-group-item-text,
-.list-group-item.active:hover .list-group-item-text,
-.list-group-item.active:focus .list-group-item-text {
-  color: #e1edf7;
-}
-.list-group-item-success {
-  color: #3c763d;
-  background-color: #dff0d8;
-}
-a.list-group-item-success {
-  color: #3c763d;
-}
-a.list-group-item-success .list-group-item-heading {
-  color: inherit;
-}
-a.list-group-item-success:hover,
-a.list-group-item-success:focus {
-  color: #3c763d;
-  background-color: #d0e9c6;
-}
-a.list-group-item-success.active,
-a.list-group-item-success.active:hover,
-a.list-group-item-success.active:focus {
-  color: #fff;
-  background-color: #3c763d;
-  border-color: #3c763d;
-}
-.list-group-item-info {
-  color: #31708f;
-  background-color: #d9edf7;
-}
-a.list-group-item-info {
-  color: #31708f;
-}
-a.list-group-item-info .list-group-item-heading {
-  color: inherit;
-}
-a.list-group-item-info:hover,
-a.list-group-item-info:focus {
-  color: #31708f;
-  background-color: #c4e3f3;
-}
-a.list-group-item-info.active,
-a.list-group-item-info.active:hover,
-a.list-group-item-info.active:focus {
-  color: #fff;
-  background-color: #31708f;
-  border-color: #31708f;
-}
-.list-group-item-warning {
-  color: #8a6d3b;
-  background-color: #fcf8e3;
-}
-a.list-group-item-warning {
-  color: #8a6d3b;
-}
-a.list-group-item-warning .list-group-item-heading {
-  color: inherit;
-}
-a.list-group-item-warning:hover,
-a.list-group-item-warning:focus {
-  color: #8a6d3b;
-  background-color: #faf2cc;
-}
-a.list-group-item-warning.active,
-a.list-group-item-warning.active:hover,
-a.list-group-item-warning.active:focus {
-  color: #fff;
-  background-color: #8a6d3b;
-  border-color: #8a6d3b;
-}
-.list-group-item-danger {
-  color: #a94442;
-  background-color: #f2dede;
-}
-a.list-group-item-danger {
-  color: #a94442;
-}
-a.list-group-item-danger .list-group-item-heading {
-  color: inherit;
-}
-a.list-group-item-danger:hover,
-a.list-group-item-danger:focus {
-  color: #a94442;
-  background-color: #ebcccc;
-}
-a.list-group-item-danger.active,
-a.list-group-item-danger.active:hover,
-a.list-group-item-danger.active:focus {
-  color: #fff;
-  background-color: #a94442;
-  border-color: #a94442;
-}
-.list-group-item-heading {
-  margin-top: 0;
-  margin-bottom: 5px;
-}
-.list-group-item-text {
-  margin-bottom: 0;
-  line-height: 1.3;
-}
-.panel {
-  margin-bottom: 20px;
-  background-color: #fff;
-  border: 1px solid transparent;
-  border-radius: 4px;
-  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
-          box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
-}
-.panel-body {
-  padding: 15px;
-}
-.panel-heading {
-  padding: 10px 15px;
-  border-bottom: 1px solid transparent;
-  border-top-left-radius: 3px;
-  border-top-right-radius: 3px;
-}
-.panel-heading > .dropdown .dropdown-toggle {
-  color: inherit;
-}
-.panel-title {
-  margin-top: 0;
-  margin-bottom: 0;
-  font-size: 16px;
-  color: inherit;
-}
-.panel-title > a {
-  color: inherit;
-}
-.panel-footer {
-  padding: 10px 15px;
-  background-color: #f5f5f5;
-  border-top: 1px solid #ddd;
-  border-bottom-right-radius: 3px;
-  border-bottom-left-radius: 3px;
-}
-.panel > .list-group {
-  margin-bottom: 0;
-}
-.panel > .list-group .list-group-item {
-  border-width: 1px 0;
-  border-radius: 0;
-}
-.panel > .list-group:first-child .list-group-item:first-child {
-  border-top: 0;
-  border-top-left-radius: 3px;
-  border-top-right-radius: 3px;
-}
-.panel > .list-group:last-child .list-group-item:last-child {
-  border-bottom: 0;
-  border-bottom-right-radius: 3px;
-  border-bottom-left-radius: 3px;
-}
-.panel-heading + .list-group .list-group-item:first-child {
-  border-top-width: 0;
-}
-.list-group + .panel-footer {
-  border-top-width: 0;
-}
-.panel > .table,
-.panel > .table-responsive > .table,
-.panel > .panel-collapse > .table {
-  margin-bottom: 0;
-}
-.panel > .table:first-child,
-.panel > .table-responsive:first-child > .table:first-child {
-  border-top-left-radius: 3px;
-  border-top-right-radius: 3px;
-}
-.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,
-.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
-.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
-.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
-.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
-.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
-.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
-.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
-  border-top-left-radius: 3px;
-}
-.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
-.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
-.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
-.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
-.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
-.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
-.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
-.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
-  border-top-right-radius: 3px;
-}
-.panel > .table:last-child,
-.panel > .table-responsive:last-child > .table:last-child {
-  border-bottom-right-radius: 3px;
-  border-bottom-left-radius: 3px;
-}
-.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
-.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
-.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
-.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
-.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
-.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
-.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
-.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
-  border-bottom-left-radius: 3px;
-}
-.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
-.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
-.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
-.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
-.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
-.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
-.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
-.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
-  border-bottom-right-radius: 3px;
-}
-.panel > .panel-body + .table,
-.panel > .panel-body + .table-responsive {
-  border-top: 1px solid #ddd;
-}
-.panel > .table > tbody:first-child > tr:first-child th,
-.panel > .table > tbody:first-child > tr:first-child td {
-  border-top: 0;
-}
-.panel > .table-bordered,
-.panel > .table-responsive > .table-bordered {
-  border: 0;
-}
-.panel > .table-bordered > thead > tr > th:first-child,
-.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
-.panel > .table-bordered > tbody > tr > th:first-child,
-.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
-.panel > .table-bordered > tfoot > tr > th:first-child,
-.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,
-.panel > .table-bordered > thead > tr > td:first-child,
-.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
-.panel > .table-bordered > tbody > tr > td:first-child,
-.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
-.panel > .table-bordered > tfoot > tr > td:first-child,
-.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
-  border-left: 0;
-}
-.panel > .table-bordered > thead > tr > th:last-child,
-.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
-.panel > .table-bordered > tbody > tr > th:last-child,
-.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
-.panel > .table-bordered > tfoot > tr > th:last-child,
-.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
-.panel > .table-bordered > thead > tr > td:last-child,
-.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
-.panel > .table-bordered > tbody > tr > td:last-child,
-.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
-.panel > .table-bordered > tfoot > tr > td:last-child,
-.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
-  border-right: 0;
-}
-.panel > .table-bordered > thead > tr:first-child > td,
-.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
-.panel > .table-bordered > tbody > tr:first-child > td,
-.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
-.panel > .table-bordered > thead > tr:first-child > th,
-.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
-.panel > .table-bordered > tbody > tr:first-child > th,
-.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
-  border-bottom: 0;
-}
-.panel > .table-bordered > tbody > tr:last-child > td,
-.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
-.panel > .table-bordered > tfoot > tr:last-child > td,
-.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
-.panel > .table-bordered > tbody > tr:last-child > th,
-.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
-.panel > .table-bordered > tfoot > tr:last-child > th,
-.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
-  border-bottom: 0;
-}
-.panel > .table-responsive {
-  margin-bottom: 0;
-  border: 0;
-}
-.panel-group {
-  margin-bottom: 20px;
-}
-.panel-group .panel {
-  margin-bottom: 0;
-  border-radius: 4px;
-}
-.panel-group .panel + .panel {
-  margin-top: 5px;
-}
-.panel-group .panel-heading {
-  border-bottom: 0;
-}
-.panel-group .panel-heading + .panel-collapse > .panel-body {
-  border-top: 1px solid #ddd;
-}
-.panel-group .panel-footer {
-  border-top: 0;
-}
-.panel-group .panel-footer + .panel-collapse .panel-body {
-  border-bottom: 1px solid #ddd;
-}
-.panel-default {
-  border-color: #ddd;
-}
-.panel-default > .panel-heading {
-  color: #333;
-  background-color: #f5f5f5;
-  border-color: #ddd;
-}
-.panel-default > .panel-heading + .panel-collapse > .panel-body {
-  border-top-color: #ddd;
-}
-.panel-default > .panel-heading .badge {
-  color: #f5f5f5;
-  background-color: #333;
-}
-.panel-default > .panel-footer + .panel-collapse > .panel-body {
-  border-bottom-color: #ddd;
-}
-.panel-primary {
-  border-color: #428bca;
-}
-.panel-primary > .panel-heading {
-  color: #fff;
-  background-color: #428bca;
-  border-color: #428bca;
-}
-.panel-primary > .panel-heading + .panel-collapse > .panel-body {
-  border-top-color: #428bca;
-}
-.panel-primary > .panel-heading .badge {
-  color: #428bca;
-  background-color: #fff;
-}
-.panel-primary > .panel-footer + .panel-collapse > .panel-body {
-  border-bottom-color: #428bca;
-}
-.panel-success {
-  border-color: #d6e9c6;
-}
-.panel-success > .panel-heading {
-  color: #3c763d;
-  background-color: #dff0d8;
-  border-color: #d6e9c6;
-}
-.panel-success > .panel-heading + .panel-collapse > .panel-body {
-  border-top-color: #d6e9c6;
-}
-.panel-success > .panel-heading .badge {
-  color: #dff0d8;
-  background-color: #3c763d;
-}
-.panel-success > .panel-footer + .panel-collapse > .panel-body {
-  border-bottom-color: #d6e9c6;
-}
-.panel-info {
-  border-color: #bce8f1;
-}
-.panel-info > .panel-heading {
-  color: #31708f;
-  background-color: #d9edf7;
-  border-color: #bce8f1;
-}
-.panel-info > .panel-heading + .panel-collapse > .panel-body {
-  border-top-color: #bce8f1;
-}
-.panel-info > .panel-heading .badge {
-  color: #d9edf7;
-  background-color: #31708f;
-}
-.panel-info > .panel-footer + .panel-collapse > .panel-body {
-  border-bottom-color: #bce8f1;
-}
-.panel-warning {
-  border-color: #faebcc;
-}
-.panel-warning > .panel-heading {
-  color: #8a6d3b;
-  background-color: #fcf8e3;
-  border-color: #faebcc;
-}
-.panel-warning > .panel-heading + .panel-collapse > .panel-body {
-  border-top-color: #faebcc;
-}
-.panel-warning > .panel-heading .badge {
-  color: #fcf8e3;
-  background-color: #8a6d3b;
-}
-.panel-warning > .panel-footer + .panel-collapse > .panel-body {
-  border-bottom-color: #faebcc;
-}
-.panel-danger {
-  border-color: #ebccd1;
-}
-.panel-danger > .panel-heading {
-  color: #a94442;
-  background-color: #f2dede;
-  border-color: #ebccd1;
-}
-.panel-danger > .panel-heading + .panel-collapse > .panel-body {
-  border-top-color: #ebccd1;
-}
-.panel-danger > .panel-heading .badge {
-  color: #f2dede;
-  background-color: #a94442;
-}
-.panel-danger > .panel-footer + .panel-collapse > .panel-body {
-  border-bottom-color: #ebccd1;
-}
-.embed-responsive {
-  position: relative;
-  display: block;
-  height: 0;
-  padding: 0;
-  overflow: hidden;
-}
-.embed-responsive .embed-responsive-item,
-.embed-responsive iframe,
-.embed-responsive embed,
-.embed-responsive object {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  width: 100%;
-  height: 100%;
-  border: 0;
-}
-.embed-responsive.embed-responsive-16by9 {
-  padding-bottom: 56.25%;
-}
-.embed-responsive.embed-responsive-4by3 {
-  padding-bottom: 75%;
-}
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
-}
-.well blockquote {
-  border-color: #ddd;
-  border-color: rgba(0, 0, 0, .15);
-}
-.well-lg {
-  padding: 24px;
-  border-radius: 6px;
-}
-.well-sm {
-  padding: 9px;
-  border-radius: 3px;
-}
-.close {
-  float: right;
-  font-size: 21px;
-  font-weight: bold;
-  line-height: 1;
-  color: #000;
-  text-shadow: 0 1px 0 #fff;
-  filter: alpha(opacity=20);
-  opacity: .2;
-}
-.close:hover,
-.close:focus {
-  color: #000;
-  text-decoration: none;
-  cursor: pointer;
-  filter: alpha(opacity=50);
-  opacity: .5;
-}
-button.close {
-  -webkit-appearance: none;
-  padding: 0;
-  cursor: pointer;
-  background: transparent;
-  border: 0;
-}
-.modal-open {
-  overflow: hidden;
-}
-.modal {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: 1050;
-  display: none;
-  overflow: hidden;
-  -webkit-overflow-scrolling: touch;
-  outline: 0;
-}
-.modal.fade .modal-dialog {
-  -webkit-transition: -webkit-transform .3s ease-out;
-       -o-transition:      -o-transform .3s ease-out;
-          transition:         transform .3s ease-out;
-  -webkit-transform: translate3d(0, -25%, 0);
-       -o-transform: translate3d(0, -25%, 0);
-          transform: translate3d(0, -25%, 0);
-}
-.modal.in .modal-dialog {
-  -webkit-transform: translate3d(0, 0, 0);
-       -o-transform: translate3d(0, 0, 0);
-          transform: translate3d(0, 0, 0);
-}
-.modal-open .modal {
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-.modal-dialog {
-  position: relative;
-  width: auto;
-  margin: 10px;
-}
-.modal-content {
-  position: relative;
-  background-color: #fff;
-  -webkit-background-clip: padding-box;
-          background-clip: padding-box;
-  border: 1px solid #999;
-  border: 1px solid rgba(0, 0, 0, .2);
-  border-radius: 6px;
-  outline: 0;
-  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
-          box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
-}
-.modal-backdrop {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: 1040;
-  background-color: #000;
-}
-.modal-backdrop.fade {
-  filter: alpha(opacity=0);
-  opacity: 0;
-}
-.modal-backdrop.in {
-  filter: alpha(opacity=50);
-  opacity: .5;
-}
-.modal-header {
-  min-height: 16.42857143px;
-  padding: 15px;
-  border-bottom: 1px solid #e5e5e5;
-}
-.modal-header .close {
-  margin-top: -2px;
-}
-.modal-title {
-  margin: 0;
-  line-height: 1.42857143;
-}
-.modal-body {
-  position: relative;
-  padding: 15px;
-}
-.modal-footer {
-  padding: 15px;
-  text-align: right;
-  border-top: 1px solid #e5e5e5;
-}
-.modal-footer .btn + .btn {
-  margin-bottom: 0;
-  margin-left: 5px;
-}
-.modal-footer .btn-group .btn + .btn {
-  margin-left: -1px;
-}
-.modal-footer .btn-block + .btn-block {
-  margin-left: 0;
-}
-.modal-scrollbar-measure {
-  position: absolute;
-  top: -9999px;
-  width: 50px;
-  height: 50px;
-  overflow: scroll;
-}
-@media (min-width: 768px) {
-  .modal-dialog {
-    width: 600px;
-    margin: 30px auto;
-  }
-  .modal-content {
-    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
-            box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
-  }
-  .modal-sm {
-    width: 300px;
-  }
-}
-@media (min-width: 992px) {
-  .modal-lg {
-    width: 900px;
-  }
-}
-.tooltip {
-  position: absolute;
-  z-index: 1070;
-  display: block;
-  font-size: 12px;
-  line-height: 1.4;
-  visibility: visible;
-  filter: alpha(opacity=0);
-  opacity: 0;
-}
-.tooltip.in {
-  filter: alpha(opacity=90);
-  opacity: .9;
-}
-.tooltip.top {
-  padding: 5px 0;
-  margin-top: -3px;
-}
-.tooltip.right {
-  padding: 0 5px;
-  margin-left: 3px;
-}
-.tooltip.bottom {
-  padding: 5px 0;
-  margin-top: 3px;
-}
-.tooltip.left {
-  padding: 0 5px;
-  margin-left: -3px;
-}
-.tooltip-inner {
-  max-width: 200px;
-  padding: 3px 8px;
-  color: #fff;
-  text-align: center;
-  text-decoration: none;
-  background-color: #000;
-  border-radius: 4px;
-}
-.tooltip-arrow {
-  position: absolute;
-  width: 0;
-  height: 0;
-  border-color: transparent;
-  border-style: solid;
-}
-.tooltip.top .tooltip-arrow {
-  bottom: 0;
-  left: 50%;
-  margin-left: -5px;
-  border-width: 5px 5px 0;
-  border-top-color: #000;
-}
-.tooltip.top-left .tooltip-arrow {
-  bottom: 0;
-  left: 5px;
-  border-width: 5px 5px 0;
-  border-top-color: #000;
-}
-.tooltip.top-right .tooltip-arrow {
-  right: 5px;
-  bottom: 0;
-  border-width: 5px 5px 0;
-  border-top-color: #000;
-}
-.tooltip.right .tooltip-arrow {
-  top: 50%;
-  left: 0;
-  margin-top: -5px;
-  border-width: 5px 5px 5px 0;
-  border-right-color: #000;
-}
-.tooltip.left .tooltip-arrow {
-  top: 50%;
-  right: 0;
-  margin-top: -5px;
-  border-width: 5px 0 5px 5px;
-  border-left-color: #000;
-}
-.tooltip.bottom .tooltip-arrow {
-  top: 0;
-  left: 50%;
-  margin-left: -5px;
-  border-width: 0 5px 5px;
-  border-bottom-color: #000;
-}
-.tooltip.bottom-left .tooltip-arrow {
-  top: 0;
-  left: 5px;
-  border-width: 0 5px 5px;
-  border-bottom-color: #000;
-}
-.tooltip.bottom-right .tooltip-arrow {
-  top: 0;
-  right: 5px;
-  border-width: 0 5px 5px;
-  border-bottom-color: #000;
-}
-.popover {
-  position: absolute;
-  top: 0;
-  left: 0;
-  z-index: 1060;
-  display: none;
-  max-width: 276px;
-  padding: 1px;
-  text-align: left;
-  white-space: normal;
-  background-color: #fff;
-  -webkit-background-clip: padding-box;
-          background-clip: padding-box;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, .2);
-  border-radius: 6px;
-  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
-          box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
-}
-.popover.top {
-  margin-top: -10px;
-}
-.popover.right {
-  margin-left: 10px;
-}
-.popover.bottom {
-  margin-top: 10px;
-}
-.popover.left {
-  margin-left: -10px;
-}
-.popover-title {
-  padding: 8px 14px;
-  margin: 0;
-  font-size: 14px;
-  font-weight: normal;
-  line-height: 18px;
-  background-color: #f7f7f7;
-  border-bottom: 1px solid #ebebeb;
-  border-radius: 5px 5px 0 0;
-}
-.popover-content {
-  padding: 9px 14px;
-}
-.popover > .arrow,
-.popover > .arrow:after {
-  position: absolute;
-  display: block;
-  width: 0;
-  height: 0;
-  border-color: transparent;
-  border-style: solid;
-}
-.popover > .arrow {
-  border-width: 11px;
-}
-.popover > .arrow:after {
-  content: "";
-  border-width: 10px;
-}
-.popover.top > .arrow {
-  bottom: -11px;
-  left: 50%;
-  margin-left: -11px;
-  border-top-color: #999;
-  border-top-color: rgba(0, 0, 0, .25);
-  border-bottom-width: 0;
-}
-.popover.top > .arrow:after {
-  bottom: 1px;
-  margin-left: -10px;
-  content: " ";
-  border-top-color: #fff;
-  border-bottom-width: 0;
-}
-.popover.right > .arrow {
-  top: 50%;
-  left: -11px;
-  margin-top: -11px;
-  border-right-color: #999;
-  border-right-color: rgba(0, 0, 0, .25);
-  border-left-width: 0;
-}
-.popover.right > .arrow:after {
-  bottom: -10px;
-  left: 1px;
-  content: " ";
-  border-right-color: #fff;
-  border-left-width: 0;
-}
-.popover.bottom > .arrow {
-  top: -11px;
-  left: 50%;
-  margin-left: -11px;
-  border-top-width: 0;
-  border-bottom-color: #999;
-  border-bottom-color: rgba(0, 0, 0, .25);
-}
-.popover.bottom > .arrow:after {
-  top: 1px;
-  margin-left: -10px;
-  content: " ";
-  border-top-width: 0;
-  border-bottom-color: #fff;
-}
-.popover.left > .arrow {
-  top: 50%;
-  right: -11px;
-  margin-top: -11px;
-  border-right-width: 0;
-  border-left-color: #999;
-  border-left-color: rgba(0, 0, 0, .25);
-}
-.popover.left > .arrow:after {
-  right: 1px;
-  bottom: -10px;
-  content: " ";
-  border-right-width: 0;
-  border-left-color: #fff;
-}
-.carousel {
-  position: relative;
-}
-.carousel-inner {
-  position: relative;
-  width: 100%;
-  overflow: hidden;
-}
-.carousel-inner > .item {
-  position: relative;
-  display: none;
-  -webkit-transition: .6s ease-in-out left;
-       -o-transition: .6s ease-in-out left;
-          transition: .6s ease-in-out left;
-}
-.carousel-inner > .item > img,
-.carousel-inner > .item > a > img {
-  line-height: 1;
-}
-.carousel-inner > .active,
-.carousel-inner > .next,
-.carousel-inner > .prev {
-  display: block;
-}
-.carousel-inner > .active {
-  left: 0;
-}
-.carousel-inner > .next,
-.carousel-inner > .prev {
-  position: absolute;
-  top: 0;
-  width: 100%;
-}
-.carousel-inner > .next {
-  left: 100%;
-}
-.carousel-inner > .prev {
-  left: -100%;
-}
-.carousel-inner > .next.left,
-.carousel-inner > .prev.right {
-  left: 0;
-}
-.carousel-inner > .active.left {
-  left: -100%;
-}
-.carousel-inner > .active.right {
-  left: 100%;
-}
-.carousel-control {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  width: 15%;
-  font-size: 20px;
-  color: #fff;
-  text-align: center;
-  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
-  filter: alpha(opacity=50);
-  opacity: .5;
-}
-.carousel-control.left {
-  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
-  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
-  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));
-  background-image:         linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);
-  background-repeat: repeat-x;
-}
-.carousel-control.right {
-  right: 0;
-  left: auto;
-  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
-  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
-  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));
-  background-image:         linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);
-  background-repeat: repeat-x;
-}
-.carousel-control:hover,
-.carousel-control:focus {
-  color: #fff;
-  text-decoration: none;
-  filter: alpha(opacity=90);
-  outline: 0;
-  opacity: .9;
-}
-.carousel-control .icon-prev,
-.carousel-control .icon-next,
-.carousel-control .glyphicon-chevron-left,
-.carousel-control .glyphicon-chevron-right {
-  position: absolute;
-  top: 50%;
-  z-index: 5;
-  display: inline-block;
-}
-.carousel-control .icon-prev,
-.carousel-control .glyphicon-chevron-left {
-  left: 50%;
-  margin-left: -10px;
-}
-.carousel-control .icon-next,
-.carousel-control .glyphicon-chevron-right {
-  right: 50%;
-  margin-right: -10px;
-}
-.carousel-control .icon-prev,
-.carousel-control .icon-next {
-  width: 20px;
-  height: 20px;
-  margin-top: -10px;
-  font-family: serif;
-}
-.carousel-control .icon-prev:before {
-  content: '\2039';
-}
-.carousel-control .icon-next:before {
-  content: '\203a';
-}
-.carousel-indicators {
-  position: absolute;
-  bottom: 10px;
-  left: 50%;
-  z-index: 15;
-  width: 60%;
-  padding-left: 0;
-  margin-left: -30%;
-  text-align: center;
-  list-style: none;
-}
-.carousel-indicators li {
-  display: inline-block;
-  width: 10px;
-  height: 10px;
-  margin: 1px;
-  text-indent: -999px;
-  cursor: pointer;
-  background-color: #000 \9;
-  background-color: rgba(0, 0, 0, 0);
-  border: 1px solid #fff;
-  border-radius: 10px;
-}
-.carousel-indicators .active {
-  width: 12px;
-  height: 12px;
-  margin: 0;
-  background-color: #fff;
-}
-.carousel-caption {
-  position: absolute;
-  right: 15%;
-  bottom: 20px;
-  left: 15%;
-  z-index: 10;
-  padding-top: 20px;
-  padding-bottom: 20px;
-  color: #fff;
-  text-align: center;
-  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
-}
-.carousel-caption .btn {
-  text-shadow: none;
-}
-@media screen and (min-width: 768px) {
-  .carousel-control .glyphicon-chevron-left,
-  .carousel-control .glyphicon-chevron-right,
-  .carousel-control .icon-prev,
-  .carousel-control .icon-next {
-    width: 30px;
-    height: 30px;
-    margin-top: -15px;
-    font-size: 30px;
-  }
-  .carousel-control .glyphicon-chevron-left,
-  .carousel-control .icon-prev {
-    margin-left: -15px;
-  }
-  .carousel-control .glyphicon-chevron-right,
-  .carousel-control .icon-next {
-    margin-right: -15px;
-  }
-  .carousel-caption {
-    right: 20%;
-    left: 20%;
-    padding-bottom: 30px;
-  }
-  .carousel-indicators {
-    bottom: 20px;
-  }
-}
-.clearfix:before,
-.clearfix:after,
-.dl-horizontal dd:before,
-.dl-horizontal dd:after,
-.container:before,
-.container:after,
-.container-fluid:before,
-.container-fluid:after,
-.row:before,
-.row:after,
-.form-horizontal .form-group:before,
-.form-horizontal .form-group:after,
-.btn-toolbar:before,
-.btn-toolbar:after,
-.btn-group-vertical > .btn-group:before,
-.btn-group-vertical > .btn-group:after,
-.nav:before,
-.nav:after,
-.navbar:before,
-.navbar:after,
-.navbar-header:before,
-.navbar-header:after,
-.navbar-collapse:before,
-.navbar-collapse:after,
-.pager:before,
-.pager:after,
-.panel-body:before,
-.panel-body:after,
-.modal-footer:before,
-.modal-footer:after {
-  display: table;
-  content: " ";
-}
-.clearfix:after,
-.dl-horizontal dd:after,
-.container:after,
-.container-fluid:after,
-.row:after,
-.form-horizontal .form-group:after,
-.btn-toolbar:after,
-.btn-group-vertical > .btn-group:after,
-.nav:after,
-.navbar:after,
-.navbar-header:after,
-.navbar-collapse:after,
-.pager:after,
-.panel-body:after,
-.modal-footer:after {
-  clear: both;
-}
-.center-block {
-  display: block;
-  margin-right: auto;
-  margin-left: auto;
-}
-.pull-right {
-  float: right !important;
-}
-.pull-left {
-  float: left !important;
-}
-.hide {
-  display: none !important;
-}
-.show {
-  display: block !important;
-}
-.invisible {
-  visibility: hidden;
-}
-.text-hide {
-  font: 0/0 a;
-  color: transparent;
-  text-shadow: none;
-  background-color: transparent;
-  border: 0;
-}
-.hidden {
-  display: none !important;
-  visibility: hidden !important;
-}
-.affix {
-  position: fixed;
-  -webkit-transform: translate3d(0, 0, 0);
-       -o-transform: translate3d(0, 0, 0);
-          transform: translate3d(0, 0, 0);
-}
-@-ms-viewport {
-  width: device-width;
-}
-.visible-xs,
-.visible-sm,
-.visible-md,
-.visible-lg {
-  display: none !important;
-}
-.visible-xs-block,
-.visible-xs-inline,
-.visible-xs-inline-block,
-.visible-sm-block,
-.visible-sm-inline,
-.visible-sm-inline-block,
-.visible-md-block,
-.visible-md-inline,
-.visible-md-inline-block,
-.visible-lg-block,
-.visible-lg-inline,
-.visible-lg-inline-block {
-  display: none !important;
-}
-@media (max-width: 767px) {
-  .visible-xs {
-    display: block !important;
-  }
-  table.visible-xs {
-    display: table;
-  }
-  tr.visible-xs {
-    display: table-row !important;
-  }
-  th.visible-xs,
-  td.visible-xs {
-    display: table-cell !important;
-  }
-}
-@media (max-width: 767px) {
-  .visible-xs-block {
-    display: block !important;
-  }
-}
-@media (max-width: 767px) {
-  .visible-xs-inline {
-    display: inline !important;
-  }
-}
-@media (max-width: 767px) {
-  .visible-xs-inline-block {
-    display: inline-block !important;
-  }
-}
-@media (min-width: 768px) and (max-width: 991px) {
-  .visible-sm {
-    display: block !important;
-  }
-  table.visible-sm {
-    display: table;
-  }
-  tr.visible-sm {
-    display: table-row !important;
-  }
-  th.visible-sm,
-  td.visible-sm {
-    display: table-cell !important;
-  }
-}
-@media (min-width: 768px) and (max-width: 991px) {
-  .visible-sm-block {
-    display: block !important;
-  }
-}
-@media (min-width: 768px) and (max-width: 991px) {
-  .visible-sm-inline {
-    display: inline !important;
-  }
-}
-@media (min-width: 768px) and (max-width: 991px) {
-  .visible-sm-inline-block {
-    display: inline-block !important;
-  }
-}
-@media (min-width: 992px) and (max-width: 1199px) {
-  .visible-md {
-    display: block !important;
-  }
-  table.visible-md {
-    display: table;
-  }
-  tr.visible-md {
-    display: table-row !important;
-  }
-  th.visible-md,
-  td.visible-md {
-    display: table-cell !important;
-  }
-}
-@media (min-width: 992px) and (max-width: 1199px) {
-  .visible-md-block {
-    display: block !important;
-  }
-}
-@media (min-width: 992px) and (max-width: 1199px) {
-  .visible-md-inline {
-    display: inline !important;
-  }
-}
-@media (min-width: 992px) and (max-width: 1199px) {
-  .visible-md-inline-block {
-    display: inline-block !important;
-  }
-}
-@media (min-width: 1200px) {
-  .visible-lg {
-    display: block !important;
-  }
-  table.visible-lg {
-    display: table;
-  }
-  tr.visible-lg {
-    display: table-row !important;
-  }
-  th.visible-lg,
-  td.visible-lg {
-    display: table-cell !important;
-  }
-}
-@media (min-width: 1200px) {
-  .visible-lg-block {
-    display: block !important;
-  }
-}
-@media (min-width: 1200px) {
-  .visible-lg-inline {
-    display: inline !important;
-  }
-}
-@media (min-width: 1200px) {
-  .visible-lg-inline-block {
-    display: inline-block !important;
-  }
-}
-@media (max-width: 767px) {
-  .hidden-xs {
-    display: none !important;
-  }
-}
-@media (min-width: 768px) and (max-width: 991px) {
-  .hidden-sm {
-    display: none !important;
-  }
-}
-@media (min-width: 992px) and (max-width: 1199px) {
-  .hidden-md {
-    display: none !important;
-  }
-}
-@media (min-width: 1200px) {
-  .hidden-lg {
-    display: none !important;
-  }
-}
-.visible-print {
-  display: none !important;
-}
-@media print {
-  .visible-print {
-    display: block !important;
-  }
-  table.visible-print {
-    display: table;
-  }
-  tr.visible-print {
-    display: table-row !important;
-  }
-  th.visible-print,
-  td.visible-print {
-    display: table-cell !important;
-  }
-}
-.visible-print-block {
-  display: none !important;
-}
-@media print {
-  .visible-print-block {
-    display: block !important;
-  }
-}
-.visible-print-inline {
-  display: none !important;
-}
-@media print {
-  .visible-print-inline {
-    display: inline !important;
-  }
-}
-.visible-print-inline-block {
-  display: none !important;
-}
-@media print {
-  .visible-print-inline-block {
-    display: inline-block !important;
-  }
-}
-@media print {
-  .hidden-print {
-    display: none !important;
-  }
-}
-/*# sourceMappingURL=bootstrap.css.map */
diff --git a/site/src/site/assets/css/docstyle.css b/site/src/site/assets/css/docstyle.css
deleted file mode 100644
index b21b97f..0000000
--- a/site/src/site/assets/css/docstyle.css
+++ /dev/null
@@ -1,65 +0,0 @@
-.hdlist>table,.colist>table{
-    border:0;
-    background:none
-}
-
-.hdlist>table>tbody>tr,.colist>table>tbody>tr{
-    background:none
-}
-
-td.hdlist1{
-    padding-right:.8em;
-    font-weight:bold
-}
-
-td.hdlist1,td.hdlist2{
-    vertical-align:top
-}
-
-.literalblock+.colist,.listingblock+.colist{
-    margin-top:-.5em
-}
-
-.colist>table tr>td:first-of-type{
-    padding:0 .8em;
-    line-height:1
-}
-
-.colist>table tr>td:last-of-type{
-    padding:.25em 0
-}
-
-.conum{
-    display:inline-block;
-    color:#fff!important;
-    background-color:#222;
-    -webkit-border-radius:100px;
-    border-radius:100px;
-    text-align:center;
-    width:20px;
-    height:20px;
-    font-size:12px;
-    font-weight:bold;
-    line-height:20px;
-    font-family:Arial,sans-serif;
-    font-style:normal;
-    position:relative;
-    top:-2px;
-    letter-spacing:-1px
-}
-
-.conum *{
-    color:#fff!important
-}
-
-.conum+b{
-    display:none
-}
-
-.conum:after{
-    content:attr(data-value)
-}
-
-.conum:not([data-value]):empty {
-    display:none
-}
diff --git a/site/src/site/assets/css/main.css b/site/src/site/assets/css/main.css
deleted file mode 100644
index 294e019..0000000
--- a/site/src/site/assets/css/main.css
+++ /dev/null
@@ -1,304 +0,0 @@
-/*! HTML5 Boilerplate v4.3.0 | MIT License | http://h5bp.com/ */
-
-/*
- * What follows is the result of much research on cross-browser styling.
- * Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal,
- * Kroc Camen, and the H5BP dev community and team.
- */
-
-/* ==========================================================================
-   Base styles: opinionated defaults
-   ========================================================================== */
-
-html,
-button,
-input,
-select,
-textarea {
-    color: #222;
-}
-
-html {
-    font-size: 1em;
-    line-height: 1.4;
-}
-
-/*
- * Remove text-shadow in selection highlight: h5bp.com/i
- * These selection rule sets have to be separate.
- * Customize the background color to match your design.
- */
-
-::-moz-selection {
-    background: #b3d4fc;
-    text-shadow: none;
-}
-
-::selection {
-    background: #b3d4fc;
-    text-shadow: none;
-}
-
-/*
- * A better looking default horizontal rule
- */
-
-hr {
-    display: block;
-    height: 1px;
-    border: 0;
-    border-top: 1px solid #ccc;
-    margin: 1em 0;
-    padding: 0;
-}
-
-/*
- * Remove the gap between images, videos, audio and canvas and the bottom of
- * their containers: h5bp.com/i/440
- */
-
-audio,
-canvas,
-img,
-video {
-    vertical-align: middle;
-}
-
-/*
- * Remove default fieldset styles.
- */
-
-fieldset {
-    border: 0;
-    margin: 0;
-    padding: 0;
-}
-
-/*
- * Allow only vertical resizing of textareas.
- */
-
-textarea {
-    resize: vertical;
-}
-
-/* ==========================================================================
-   Browse Happy prompt
-   ========================================================================== */
-
-.browsehappy {
-    margin: 0.2em 0;
-    background: #ccc;
-    color: #000;
-    padding: 0.2em 0;
-}
-
-/* ==========================================================================
-   Author's custom styles
-   ========================================================================== */
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/* ==========================================================================
-   Helper classes
-   ========================================================================== */
-
-/*
- * Image replacement
- */
-
-.ir {
-    background-color: transparent;
-    border: 0;
-    overflow: hidden;
-    /* IE 6/7 fallback */
-    *text-indent: -9999px;
-}
-
-.ir:before {
-    content: "";
-    display: block;
-    width: 0;
-    height: 150%;
-}
-
-/*
- * Hide from both screenreaders and browsers: h5bp.com/u
- */
-
-.hidden {
-    display: none !important;
-    visibility: hidden;
-}
-
-/*
- * Hide only visually, but have it available for screenreaders: h5bp.com/v
- */
-
-.visuallyhidden {
-    border: 0;
-    clip: rect(0 0 0 0);
-    height: 1px;
-    margin: -1px;
-    overflow: hidden;
-    padding: 0;
-    position: absolute;
-    width: 1px;
-}
-
-/*
- * Extends the .visuallyhidden class to allow the element to be focusable
- * when navigated to via the keyboard: h5bp.com/p
- */
-
-.visuallyhidden.focusable:active,
-.visuallyhidden.focusable:focus {
-    clip: auto;
-    height: auto;
-    margin: 0;
-    overflow: visible;
-    position: static;
-    width: auto;
-}
-
-/*
- * Hide visually and from screenreaders, but maintain layout
- */
-
-.invisible {
-    visibility: hidden;
-}
-
-/*
- * Clearfix: contain floats
- *
- * For modern browsers
- * 1. The space content is one way to avoid an Opera bug when the
- *    `contenteditable` attribute is included anywhere else in the document.
- *    Otherwise it causes space to appear at the top and bottom of elements
- *    that receive the `clearfix` class.
- * 2. The use of `table` rather than `block` is only necessary if using
- *    `:before` to contain the top-margins of child elements.
- */
-
-.clearfix:before,
-.clearfix:after {
-    content: " "; /* 1 */
-    display: table; /* 2 */
-}
-
-.clearfix:after {
-    clear: both;
-}
-
-/*
- * For IE 6/7 only
- * Include this rule to trigger hasLayout and contain floats.
- */
-
-.clearfix {
-    *zoom: 1;
-}
-
-/* ==========================================================================
-   EXAMPLE Media Queries for Responsive Design.
-   These examples override the primary ('mobile first') styles.
-   Modify as content requires.
-   ========================================================================== */
-
-@media only screen and (min-width: 35em) {
-    /* Style adjustments for viewports that meet the condition */
-}
-
-@media print,
-       (-o-min-device-pixel-ratio: 5/4),
-       (-webkit-min-device-pixel-ratio: 1.25),
-       (min-resolution: 120dpi) {
-    /* Style adjustments for high resolution devices */
-}
-
-/* ==========================================================================
-   Print styles.
-   Inlined to avoid required HTTP connection: h5bp.com/r
-   ========================================================================== */
-
-@media print {
-    * {
-        background: transparent !important;
-        color: #000 !important; /* Black prints faster: h5bp.com/s */
-        box-shadow: none !important;
-        text-shadow: none !important;
-    }
-
-    a,
-    a:visited {
-        text-decoration: underline;
-    }
-
-    a[href]:after {
-        content: " (" attr(href) ")";
-    }
-
-    abbr[title]:after {
-        content: " (" attr(title) ")";
-    }
-
-    /*
-     * Don't show links for images, or javascript/internal links
-     */
-
-    .ir a:after,
-    a[href^="javascript:"]:after,
-    a[href^="#"]:after {
-        content: "";
-    }
-
-    pre,
-    blockquote {
-        border: 1px solid #999;
-        page-break-inside: avoid;
-    }
-
-    thead {
-        display: table-header-group; /* h5bp.com/t */
-    }
-
-    tr,
-    img {
-        page-break-inside: avoid;
-    }
-
-    img {
-        max-width: 100% !important;
-    }
-
-    @page {
-        margin: 0.5cm;
-    }
-
-    p,
-    h2,
-    h3 {
-        orphans: 3;
-        widows: 3;
-    }
-
-    h2,
-    h3 {
-        page-break-after: avoid;
-    }
-}
diff --git a/site/src/site/assets/css/normalize.css b/site/src/site/assets/css/normalize.css
deleted file mode 100644
index 42e24d6..0000000
--- a/site/src/site/assets/css/normalize.css
+++ /dev/null
@@ -1,527 +0,0 @@
-/*! normalize.css v1.1.3 | MIT License | git.io/normalize */
-
-/* ==========================================================================
-   HTML5 display definitions
-   ========================================================================== */
-
-/**
- * Correct `block` display not defined in IE 6/7/8/9 and Firefox 3.
- */
-
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-main,
-nav,
-section,
-summary {
-    display: block;
-}
-
-/**
- * Correct `inline-block` display not defined in IE 6/7/8/9 and Firefox 3.
- */
-
-audio,
-canvas,
-video {
-    display: inline-block;
-    *display: inline;
-    *zoom: 1;
-}
-
-/**
- * Prevent modern browsers from displaying `audio` without controls.
- * Remove excess height in iOS 5 devices.
- */
-
-audio:not([controls]) {
-    display: none;
-    height: 0;
-}
-
-/**
- * Address styling not present in IE 7/8/9, Firefox 3, and Safari 4.
- * Known issue: no IE 6 support.
- */
-
-[hidden] {
-    display: none;
-}
-
-/* ==========================================================================
-   Base
-   ========================================================================== */
-
-/**
- * 1. Correct text resizing oddly in IE 6/7 when body `font-size` is set using
- *    `em` units.
- * 2. Prevent iOS text size adjust after orientation change, without disabling
- *    user zoom.
- */
-
-html {
-    font-size: 100%; /* 1 */
-    -ms-text-size-adjust: 100%; /* 2 */
-    -webkit-text-size-adjust: 100%; /* 2 */
-}
-
-/**
- * Address `font-family` inconsistency between `textarea` and other form
- * elements.
- */
-
-html,
-button,
-input,
-select,
-textarea {
-    font-family: sans-serif;
-}
-
-/**
- * Address margins handled incorrectly in IE 6/7.
- */
-
-body {
-    margin: 0;
-}
-
-/* ==========================================================================
-   Links
-   ========================================================================== */
-
-/**
- * Address `outline` inconsistency between Chrome and other browsers.
- */
-
-a:focus {
-    outline: thin dotted;
-}
-
-/**
- * Improve readability when focused and also mouse hovered in all browsers.
- */
-
-a:active,
-a:hover {
-    outline: 0;
-}
-
-/* ==========================================================================
-   Typography
-   ========================================================================== */
-
-/**
- * Address font sizes and margins set differently in IE 6/7.
- * Address font sizes within `section` and `article` in Firefox 4+, Safari 5,
- * and Chrome.
- */
-
-h1 {
-    font-size: 2em;
-    margin: 0.67em 0;
-}
-
-h2 {
-    font-size: 1.5em;
-    margin: 0.83em 0;
-}
-
-h3 {
-    font-size: 1.17em;
-    margin: 1em 0;
-}
-
-h4 {
-    font-size: 1em;
-    margin: 1.33em 0;
-}
-
-h5 {
-    font-size: 0.83em;
-    margin: 1.67em 0;
-}
-
-h6 {
-    font-size: 0.67em;
-    margin: 2.33em 0;
-}
-
-/**
- * Address styling not present in IE 7/8/9, Safari 5, and Chrome.
- */
-
-abbr[title] {
-    border-bottom: 1px dotted;
-}
-
-/**
- * Address style set to `bolder` in Firefox 3+, Safari 4/5, and Chrome.
- */
-
-b,
-strong {
-    font-weight: bold;
-}
-
-blockquote {
-    margin: 1em 40px;
-}
-
-/**
- * Address styling not present in Safari 5 and Chrome.
- */
-
-dfn {
-    font-style: italic;
-}
-
-/**
- * Address differences between Firefox and other browsers.
- * Known issue: no IE 6/7 normalization.
- */
-
-hr {
-    -moz-box-sizing: content-box;
-    box-sizing: content-box;
-    height: 0;
-}
-
-/**
- * Address styling not present in IE 6/7/8/9.
- */
-
-mark {
-    background: #ff0;
-    color: #000;
-}
-
-/**
- * Address margins set differently in IE 6/7.
- */
-
-p,
-pre {
-    margin: 1em 0;
-}
-
-/**
- * Correct font family set oddly in IE 6, Safari 4/5, and Chrome.
- */
-
-code,
-kbd,
-pre,
-samp {
-    font-family: monospace, serif;
-    _font-family: 'courier new', monospace;
-    font-size: 1em;
-}
-
-/**
- * Improve readability of pre-formatted text in all browsers.
- */
-
-pre {
-    white-space: pre;
-    white-space: pre-wrap;
-    word-wrap: break-word;
-}
-
-/**
- * Address CSS quotes not supported in IE 6/7.
- */
-
-q {
-    quotes: none;
-}
-
-/**
- * Address `quotes` property not supported in Safari 4.
- */
-
-q:before,
-q:after {
-    content: '';
-    content: none;
-}
-
-/**
- * Address inconsistent and variable font size in all browsers.
- */
-
-small {
-    font-size: 80%;
-}
-
-/**
- * Prevent `sub` and `sup` affecting `line-height` in all browsers.
- */
-
-sub,
-sup {
-    font-size: 75%;
-    line-height: 0;
-    position: relative;
-    vertical-align: baseline;
-}
-
-sup {
-    top: -0.5em;
-}
-
-sub {
-    bottom: -0.25em;
-}
-
-/* ==========================================================================
-   Lists
-   ========================================================================== */
-
-/**
- * Address margins set differently in IE 6/7.
- */
-
-dl,
-menu,
-ol,
-ul {
-    margin: 1em 0;
-}
-
-dd {
-    margin: 0 0 0 40px;
-}
-
-/**
- * Address paddings set differently in IE 6/7.
- */
-
-menu,
-ol,
-ul {
-    padding: 0 0 0 40px;
-}
-
-/**
- * Correct list images handled incorrectly in IE 7.
- */
-
-nav ul,
-nav ol {
-    list-style: none;
-    list-style-image: none;
-}
-
-/* ==========================================================================
-   Embedded content
-   ========================================================================== */
-
-/**
- * 1. Remove border when inside `a` element in IE 6/7/8/9 and Firefox 3.
- * 2. Improve image quality when scaled in IE 7.
- */
-
-img {
-    border: 0; /* 1 */
-    -ms-interpolation-mode: bicubic; /* 2 */
-}
-
-/**
- * Correct overflow displayed oddly in IE 9.
- */
-
-svg:not(:root) {
-    overflow: hidden;
-}
-
-/* ==========================================================================
-   Figures
-   ========================================================================== */
-
-/**
- * Address margin not present in IE 6/7/8/9, Safari 5, and Opera 11.
- */
-
-figure {
-    margin: 0;
-}
-
-/* ==========================================================================
-   Forms
-   ========================================================================== */
-
-/**
- * Correct margin displayed oddly in IE 6/7.
- */
-
-form {
-    margin: 0;
-}
-
-/**
- * Define consistent border, margin, and padding.
- */
-
-fieldset {
-    border: 1px solid #c0c0c0;
-    margin: 0 2px;
-    padding: 0.35em 0.625em 0.75em;
-}
-
-/**
- * 1. Correct color not being inherited in IE 6/7/8/9.
- * 2. Correct text not wrapping in Firefox 3.
- * 3. Correct alignment displayed oddly in IE 6/7.
- */
-
-legend {
-    border: 0; /* 1 */
-    padding: 0;
-    white-space: normal; /* 2 */
-    *margin-left: -7px; /* 3 */
-}
-
-/**
- * 1. Correct font size not being inherited in all browsers.
- * 2. Address margins set differently in IE 6/7, Firefox 3+, Safari 5,
- *    and Chrome.
- * 3. Improve appearance and consistency in all browsers.
- */
-
-button,
-input,
-select,
-textarea {
-    font-size: 100%; /* 1 */
-    margin: 0; /* 2 */
-    vertical-align: baseline; /* 3 */
-    *vertical-align: middle; /* 3 */
-}
-
-/**
- * Address Firefox 3+ setting `line-height` on `input` using `!important` in
- * the UA stylesheet.
- */
-
-button,
-input {
-    line-height: normal;
-}
-
-/**
- * Address inconsistent `text-transform` inheritance for `button` and `select`.
- * All other form control elements do not inherit `text-transform` values.
- * Correct `button` style inheritance in Chrome, Safari 5+, and IE 6+.
- * Correct `select` style inheritance in Firefox 4+ and Opera.
- */
-
-button,
-select {
-    text-transform: none;
-}
-
-/**
- * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
- *    and `video` controls.
- * 2. Correct inability to style clickable `input` types in iOS.
- * 3. Improve usability and consistency of cursor style between image-type
- *    `input` and others.
- * 4. Remove inner spacing in IE 7 without affecting normal text inputs.
- *    Known issue: inner spacing remains in IE 6.
- */
-
-button,
-html input[type="button"], /* 1 */
-input[type="reset"],
-input[type="submit"] {
-    -webkit-appearance: button; /* 2 */
-    cursor: pointer; /* 3 */
-    *overflow: visible;  /* 4 */
-}
-
-/**
- * Re-set default cursor for disabled elements.
- */
-
-button[disabled],
-html input[disabled] {
-    cursor: default;
-}
-
-/**
- * 1. Address box sizing set to content-box in IE 8/9.
- * 2. Remove excess padding in IE 8/9.
- * 3. Remove excess padding in IE 7.
- *    Known issue: excess padding remains in IE 6.
- */
-
-input[type="checkbox"],
-input[type="radio"] {
-    box-sizing: border-box; /* 1 */
-    padding: 0; /* 2 */
-    *height: 13px; /* 3 */
-    *width: 13px; /* 3 */
-}
-
-/**
- * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
- * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome
- *    (include `-moz` to future-proof).
- */
-
-input[type="search"] {
-    -webkit-appearance: textfield; /* 1 */
-    -moz-box-sizing: content-box;
-    -webkit-box-sizing: content-box; /* 2 */
-    box-sizing: content-box;
-}
-
-/**
- * Remove inner padding and search cancel button in Safari 5 and Chrome
- * on OS X.
- */
-
-input[type="search"]::-webkit-search-cancel-button,
-input[type="search"]::-webkit-search-decoration {
-    -webkit-appearance: none;
-}
-
-/**
- * Remove inner padding and border in Firefox 3+.
- */
-
-button::-moz-focus-inner,
-input::-moz-focus-inner {
-    border: 0;
-    padding: 0;
-}
-
-/**
- * 1. Remove default vertical scrollbar in IE 6/7/8/9.
- * 2. Improve readability and alignment in all browsers.
- */
-
-textarea {
-    overflow: auto; /* 1 */
-    vertical-align: top; /* 2 */
-}
-
-/* ==========================================================================
-   Tables
-   ========================================================================== */
-
-/**
- * Remove most spacing between table cells.
- */
-
-table {
-    border-collapse: collapse;
-    border-spacing: 0;
-}
diff --git a/site/src/site/assets/css/style.css b/site/src/site/assets/css/style.css
deleted file mode 100644
index 1fcf3ec..0000000
--- a/site/src/site/assets/css/style.css
+++ /dev/null
@@ -1,1098 +0,0 @@
-@import url(http://fonts.googleapis.com/css?family=Source+Code+Pro:500,700|Open+Sans:400,600);
-
-html, code, kbd, pre, samp {
-    -ms-text-size-adjust: 100%;
-    -webkit-text-size-adjust: 100%;
-}
-
-html, body {
-    height: 100%;
-    -webkit-overflow-scrolling: touch;
-}
-
-p, ul, pre, h1, h2, h3, h4, h5, h6, h7, h8 {
-    margin: 1em 0;
-}
-
-p {
-    display: block;
-}
-
-h1, h2, h3, h4, h5, h6, h7, h8 {
-    font-weight: bold;
-}
-
-pre {
-    border-radius: 0;
-    border: 0 !important;;
-    font-size: 14px;
-}
-
-/* customizing bootstrap nav bar */
-.navbar {
-    margin-bottom: 0px;
-    padding-right: 110px;
-}
-.navbar .container {
-    margin: 10px;
-}
-.navbar-default a {
-    color: #c0d3db !important;
-    font-size: 18px !important;
-    text-decoration: none;
-}
-.navbar-default, .navbar-static-top {
-    background-color: #286b86;
-    border: 0px;
-}
-a.navbar-brand {
-    color: white !important;
-    font-size: 19px !important;
-}
-.navbar-default .navbar-nav>.active>a, .navbar-default .navbar-nav>.active>a:hover, .navbar-default .navbar-nav>.active>a:focus {
-    background-color: transparent;
-    color: white;
-}
-.navbar-nav>li.active>a {
-    color: white !important;
-}
-.navbar-nav>li>a:hover {
-    background-color: #db4800 !important;
-    color: white !important;
-}
-.navbar-nav>li>a {
-    color: #c0d3db;
-}
-.navbar-default .navbar-toggle .icon-bar {
-    background-color: white;
-}
-.navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {
-    background-color: #db4800;
-}
-
-@media (min-width: 768px) {
-    .container {
-        width: auto;
-    }
-}
-
-/* specific to index.html */
-
-@media (max-width: 999px) {
-    #fork-me {
-        display: none;
-    }
-
-    .navbar {
-        padding-right: 0px;
-    }
-}
-
-#band {
-    background: #4298b8 no-repeat 50% 30%;
-    height: 400px;
-}
-
-.svg #band {
-    background-image: url(../img/groovy-logo-white.svg);
-}
-
-.no-svg #band {
-    background-image: url(../img/groovy-logo-white.png);
-}
-
-@media (max-width: 1010px) {
-    #band {
-        background-size: 90%;
-        height: 300px;
-    }
-}
-
-@media (max-width: 690px) {
-    #band {
-        background-size: 80%;
-        height: 200px;
-    }
-}
-
-@media (max-width: 475px) {
-    #band {
-        background-size: 70%;
-        height: 100px;
-    }
-}
-
-#they-use-groovy {
-    width: 100%;
-    height: 450px;
-    background-color: #db4800;
-    margin-bottom: 20px;
-    text-align: center;
-}
-
-#they-use-groovy .item {
-    text-align: center;
-    color: white;
-}
-
-#logos-holder {
-    display: inline-block;
-    padding: 0px;
-    margin: 0px;
-    text-align: center;
-}
-
-#logos-holder .logo {
-    padding: 0px;
-    margin: 0px;
-    display: inline-block;
-    width: 100px;
-    height: 80px;
-    background-size: 95%;
-    background-repeat: no-repeat;
-    background-position: 50% 50%;
-}
-
-@media (min-width: 330px) {
-    #logos-holder {
-        width: 320px;
-    }
-
-    #they-use-groovy {
-        height: 1130px;
-    }
-}
-
-@media (min-width: 475px) {
-    #logos-holder {
-        width: 420px;
-    }
-
-    #they-use-groovy {
-        height: 900px;
-    }
-}
-
-@media (min-width: 690px) {
-    #logos-holder {
-        width: 630px;
-    }
-
-    #they-use-groovy {
-        height: 600px;
-    }
-}
-
-@media (min-width: 1010px) {
-    #logos-holder {
-        width: 940px;
-    }
-
-    #they-use-groovy {
-        height: 450px;
-    }
-}
-
-.centered {
-    text-align: center;
-}
-
-.event-img {
-    margin: -20px -20px 20px -20px;
-    background-repeat: no-repeat;
-    background-position: 50% top;
-    height: 180px;
-}
-
-.event-logo {
-    height: 180px;
-    float: right;
-}
-
-@media (max-width: 1010px) {
-    .event-logo {
-        height: ;
-    }
-
-}
-
-@media (max-width: 690px) {
-    .event-logo {
-        height: 60px;
-    }}
-
-@media (max-width: 475px) {
-    .event-logo {
-        display: none;
-    }
-}
-
-article .content time {
-    font-weight: bold;
-}
-
-.doc-embed {
-    border: 0;
-    width: 100%;
-    min-height: 100%;
-}
-
-.download-table {
-    width: 100%;
-    text-align: center;
-}
-
-.download-table td {
-    width: 20%;
-}
-
-#mc-embedded-subscribe {
-    width: 200px;
-    font-weight: bold;
-}
-
-#mc-embedded-subscribe:hover {
-    background-color: #F2F2F2;
-    font-weight: bold;
-}
-
-#footer .colset-3-footer .col-1 h1, #footer .colset-3-footer .col-2 h1, #footer .colset-3-footer .col-3 h1 {
-    font-size: 15px !important;
-}
-
-.anchor-link:before {
-    content: ' # ';
-    color: lightgray;
-}
-
-.anchor-link:hover:before {
-    color: orange;
-}
-
-code, kbd, pre, samp {
-    font-family: "Source Code Pro", "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;
-}
-
-#contribute-btn {
-    position: absolute;
-    right: 15px;
-}
-
-@media (max-width: 767px) {
-    #contribute-btn {
-        width: 100%;
-        position: relative;
-        margin-top: 30px;
-        right: 0px;
-    }
-
-    #contribute-btn button {
-        width: 100%;
-        right: 15px;
-    }
-}
-
-@media (min-width: 1200px) {
-    #contribute-btn {
-        top: 25px;
-        right: 15px;
-    }
-}
-
-#big-download-button {
-    float: right;
-    font-size: 30px;
-    padding: 15px;
-    margin: 10px 0px 10px 20px;
-    border: 2px solid #db4800;
-    border-radius: 6px;
-    background-color: #db4800;
-    color: white;
-}
-
-#big-download-button:hover {
-    background-color: #e6e6e6;
-    color: #db4800;
-}
-
-.colset-3-footer .col-1, .colset-3-footer .col-2, .colset-3-footer .col-3 {
-    min-width: 180px;
-    float: left;
-}
-
-.colset-3-footer .col-3 {
-    min-width: 220px;
-}
-
-.colset-3-article article {
-    float: left;
-}
-
-.col1, .col2 {
-    min-width: 300px;
-    float: left;
-}
-
-@media (max-width: 988px) {
-    .col1, .col2 {
-        width: 98% !important;
-        max-width: 98%;
-    }
-
-    .colset-3-article article {
-        width: 98% !important;
-        max-width: 98%;
-    }
-}
-
-body, html {
-    font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
-    padding: 0;
-    margin: 0;
-    background: #FFF;
-    color: #343437;
-    line-height: 25px;
-    font-weight: normal;
-    font-size: 14px;
-}
-
-a {
-    color: #db4800;
-    text-decoration: underline;
-}
-
-a:hover {
-    color: #db4800;
-    text-decoration: none
-}
-
-h1 {
-    font-size: 2.125em;
-    margin: .67em 0
-}
-
-h2 {
-    font-size: 1.6875em;
-    font-weight: bold;
-}
-
-h3, #toctitle, .sidebarblock > .content > .title {
-    font-size: 1.375em;
-    font-weight: bold;
-}
-
-h4 {
-    font-size: 1.125em;
-    font-weight: bold;
-}
-
-h5 {
-    font-size: 1.125em;
-    font-weight: bold;
-    color: #db4800;
-}
-
-h6 {
-    font-size: 1.08em;
-    font-weight: normal;
-    color: #db4800;
-}
-
-h7 {
-    font-weight: bold;
-    color: #245f78;
-}
-
-h8 {
-    color: #245f78;
-}
-
-#footer {
-    background: #f2f2f2;
-    text-align: center;
-    font-size: 14px;
-    padding: 20px 0 30px;
-    margin-top: 30px;
-    color: #AAA
-}
-
-#footer .col-right {
-    float: right;
-    width: 300px;
-    text-align: right;
-    padding-top: 10px
-}
-
-#footer .colset-3-footer {
-    color: #222;
-    font-size: 14px
-}
-
-#footer .colset-3-footer:before, #footer .colset-3-footer:after {
-    content: " ";
-    display: table
-}
-
-#footer .colset-3-footer:after {
-    clear: both
-}
-
-#footer .colset-3-footer .col-1, #footer .colset-3-footer .col-2, #footer .colset-3-footer .col-3 {
-    width: 18%;
-    padding: 20px 0 30px;
-    padding-right: 3%;
-    float: left;
-    text-align: left
-}
-
-#footer .colset-3-footer .col-3 {
-    width: 24%;
-}
-
-#footer .colset-3-footer .col-1 h1, #footer .colset-3-footer .col-2 h1, #footer .colset-3-footer .col-3 h1 {
-    font-weight: 600;
-    font-size: 15px;
-    line-height: 30px;
-    margin: 0
-}
-
-#footer .colset-3-footer .col-1 ul, #footer .colset-3-footer .col-2 ul, #footer .colset-3-footer .col-3 ul {
-    list-style-type: none;
-    margin: 0;
-    padding: 0
-}
-
-#footer .colset-3-footer .col-1 ul li, #footer .colset-3-footer .col-2 ul li, #footer .colset-3-footer .col-3 ul li {
-    margin: 0;
-    padding: 0
-}
-
-#footer .colset-3-footer .col-1 ul li a, #footer .colset-3-footer .col-2 ul li a, #footer .colset-3-footer .col-3 ul li a {
-    color: #343437;
-    text-decoration: none
-}
-
-#footer .colset-3-footer .col-1 ul li a:hover, #footer .colset-3-footer .col-2 ul li a:hover, #footer .colset-3-footer .col-3 ul li a:hover {
-    text-decoration: underline
-}
-
-#footer .second a {
-    color: #db4800
-}
-
-.row {
-    position: relative;
-    max-width: 1400px;
-    margin: 0 auto;
-    padding: 0 5%
-}
-
-.row:before, .row:after {
-    content: " ";
-    display: table
-}
-
-.row:after {
-    clear: both
-}
-
-.band {
-    background: #4298b8;
-    height: 400px;
-    margin-bottom: 20px;
-    color: white
-}
-
-.band .item {
-    text-align: center
-}
-
-.band .item:before, .band .item:after {
-    content: " ";
-    display: table
-}
-
-.band .item:after {
-    clear: both
-}
-
-#content {
-    background: white
-}
-
-#content .row:before, #content .row:after {
-    content: " ";
-    display: table
-}
-
-#content .row:after {
-    clear: both
-}
-
-#content .row > h1 {
-    font-size: 34px;
-    line-height: 40px;
-    font-weight: 200;
-    text-align: center;
-    margin: 0;
-    padding: 20px 0
-}
-
-#content hr.row, #content hr.divider {
-    border: 0 none;
-    border-top: 1px solid #EEE;
-    margin: 0 5%;
-    margin-top: 40px
-}
-
-#content hr.divider {
-    margin: 0;
-    margin-top: 40px;
-    margin-bottom: 30px
-}
-
-#content .colset-2-its:before, #content .colset-2-its:after {
-    content: " ";
-    display: table
-}
-
-#content .colset-2-its:after {
-    clear: both
-}
-
-#content .colset-2-its > h1 {
-    padding-bottom: 15px;
-    margin-top: 15px;
-    margin-bottom: 0
-}
-
-#content .colset-2-its > p {
-    margin-top: 0;
-    padding-bottom: 5px;
-    text-align: center;
-    color: #222;
-    font-size: 15px
-}
-
-#content .colset-2-its .col1, #content .colset-2-its .col2 {
-    float: left;
-    width: 48%;
-    padding-right: 1%;
-    padding-left: 1%;
-}
-
-#content .colset-2-its .col2 {
-    padding-left: 1%;
-    padding-right: 1%;
-}
-
-#content .colset-2-its article {
-    padding: 10px 0
-}
-
-#content .colset-2-its article:before, #content .colset-2-its article:after {
-    content: " ";
-    display: table
-}
-
-#content .colset-2-its article:after {
-    clear: both
-}
-
-#content .colset-2-its article .icon {
-    display: block;
-    width: 80px;
-    height: 80px;
-    background-image: url(/img/icons-colset-2-its.png);
-    float: left;
-    margin-top: 12px;
-    margin-right: 15px
-}
-
-#content .colset-2-its article .icon.icon-1 {
-    background-position: 0 0
-}
-
-#content .colset-2-its article .icon.icon-2 {
-    background-position: 0 -80px
-}
-
-#content .colset-2-its article .icon.icon-3 {
-    background-position: 0 -160px
-}
-
-#content .colset-2-its article .icon.icon-4 {
-    background-position: 0 -240px
-}
-
-#content .colset-2-its article .icon.icon-5 {
-    background-position: 0 -320px
-}
-
-#content .colset-2-its article .icon.icon-6 {
-    background-position: 0 -400px
-}
-
-#content .colset-2-its article > h1 {
-    font-size: 19px;
-    font-weight: 600;
-    margin-bottom: 0;
-    line-height: 30px
-}
-
-#content .colset-2-its article p {
-    margin: 0;
-    line-height: 24px;
-    font-size: 14px
-}
-
-#content .colset-3-article {
-    padding-top: 30px;
-    padding-bottom: 30px
-}
-
-#content .colset-3-article > h1 {
-    font-size: 24px
-}
-
-#content .colset-3-article div.content {
-    padding: 20px;
-    padding-bottom: 5px
-}
-
-#content .colset-3-article article {
-    float: left;
-    width: 29%;
-    margin: 10px 2%;
-    -webkit-box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1);
-    box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1)
-}
-
-#content .colset-3-article article .img {
-    margin: -20px -20px 20px -20px;
-    background-position: center top;
-    height: 180px
-}
-
-#content .colset-3-article article h1 {
-    margin: 0;
-    font-size: 18px;
-    font-weight: normal;
-    line-height: 25px
-}
-
-#content .colset-3-article article h1 a {
-    color: #343437;
-    cursor: pointer
-}
-
-#content .colset-3-article article h1 a:hover {
-    color: #46a5c8
-}
-
-#content .colset-3-article article p, #content .colset-3-article article time {
-    font-size: 13px
-}
-
-#content .colset-3-article article .author a {
-    color: #db4800
-}
-
-#content .colset-3-article article:first-child {
-    padding-left: 0
-}
-
-#content .colset-3-article article:last-child {
-    padding-right: 0
-}
-
-#content.page-1 .row {
-    padding-top: 10px;
-    padding-bottom: 10px
-}
-
-#content.page-1 .row h1 {
-    text-align: left;
-    font-size: 36px
-}
-
-#content.page-1 .row article {
-    font-size: 14px
-}
-
-#content.page-1 .row article .desc {
-    font-size: 16px
-}
-
-#content.page-1 .row article h1 {
-    margin: 0;
-    paddnig: 0;
-    text-align: left;
-    font-size: 26px
-}
-
-#content.page-1 .row article h2 {
-    margin: 0;
-    paddnig: 0
-}
-
-#content.page-1 .row article h3 {
-    font-weight: bold
-}
-
-#content.page-1 .row article pre {
-    display: block;
-    background: #f2f2f2;
-    padding: 12px 20px
-}
-
-ul.nav-sidebar {
-    margin: 0;
-    margin-top: 20px;
-    padding: 5px 0;
-    border: 1px solid #EEE;
-    list-style-type: none
-}
-
-ul.nav-sidebar li a {
-    display: block;
-    cursor: pointer;
-    padding: 5px 10px;
-    font-weight: 400;
-    text-decoration: none;
-    color: #343437
-}
-
-ul.nav-sidebar li.active a:hover, ul.nav-sidebar li a:hover {
-    color: white;
-    background-color: #db4800;
-}
-
-ul.nav-sidebar li.active a {
-    background-color: #f2f2f2
-}
-
-.table {
-    margin: 20px 0
-}
-
-.table thead tr th {
-    padding: 10px;
-    font-weight: normal;
-    font-size: 18px
-}
-
-.table tbody tr td {
-    vertical-align: top;
-    font-size: 12px;
-    padding: 10px;
-    border-top: 1px solid #EEE
-}
-
-*, *:after, *::before {
-    -moz-box-sizing: border-box;
-    box-sizing: border-box
-}
-
-body {
-    background: #444
-}
-
-html.noScroll {
-    overflow: hidden
-}
-
-html.noScroll body, html.noScroll .st-container, html.noScroll .st-pusher, html.noScroll .st-content {
-    overflow: hidden
-}
-
-html, body, .st-container, .st-pusher, .st-content {
-    overflow: auto
-}
-
-.sign-in-fa-icon:before {
-    font-family: FontAwesome;
-    content: '\f090';
-    padding-right: 10px;
-}
-
-#st-container {
-    height: 100%;
-}
-
-.st-content {
-    background: white
-}
-
-.st-content, .st-content-inner {
-    position: relative;
-    height: 100%;
-}
-
-.st-container {
-    position: relative;
-    overflow: hidden
-}
-
-.st-pusher {
-    position: relative;
-    left: 0;
-    z-index: 99;
-    height: 100%;
-    -webkit-transition: -webkit-transform .5s;
-    transition: transform .5s
-}
-
-.st-pusher::after {
-    position: absolute;
-    top: 0;
-    right: 0;
-    width: 0;
-    height: 0;
-    background: rgba(0, 0, 0, 0.3);
-    content: '';
-    opacity: 0;
-    -webkit-transition: opacity .5s, width .1s .5s, height .1s .5s;
-    transition: opacity .5s, width .1s .5s, height .1s .5s
-}
-
-.st-menu-open .st-pusher::after {
-    width: 100%;
-    height: 100%;
-    opacity: 1;
-    -webkit-transition: opacity .5s;
-    transition: opacity .5s
-}
-
-.st-menu {
-    position: fixed;
-    top: 0;
-    left: auto;
-    z-index: 100;
-    visibility: hidden;
-    width: 300px;
-    height: 100%;
-    background: #4298b8;
-    -webkit-transition: all .5s;
-    transition: all .5s;
-    right: -600px
-}
-
-.st-menu::after {
-    position: absolute;
-    top: 0;
-    right: 0;
-    width: 100%;
-    height: 100%;
-    background: rgba(0, 0, 0, 0.2);
-    content: '';
-    opacity: 1;
-    -webkit-transition: opacity .5s;
-    transition: opacity .5s
-}
-
-.st-menu-open .st-menu::after {
-    width: 0;
-    height: 0;
-    opacity: 0;
-    -webkit-transition: opacity .5s, width .1s .5s, height .1s .5s;
-    transition: opacity .5s, width .1s .5s, height .1s .5s
-}
-
-.st-menu ul {
-    margin: 0;
-    padding: 0;
-    list-style: none
-}
-
-.st-menu h2 {
-    margin: 0;
-    padding: 1em;
-    color: white;
-    text-shadow: 0 0 1px rgba(0, 0, 0, 0.1);
-    font-weight: 300;
-    font-size: 2em
-}
-
-.st-menu ul li {
-    display: block
-}
-
-.st-menu ul li a {
-    display: block;
-    position: relative;
-    padding: 1em 1em 1em 45px;
-    outline: 0;
-    box-shadow: inset 0 -1px rgba(0, 0, 0, 0.2);
-    color: #f3efe0;
-    text-shadow: 0 0 1px rgba(255, 255, 255, 0.1);
-    letter-spacing: 1px;
-    font-weight: 400;
-    text-decoration: none
-}
-
-.st-menu ul li a span.fa {
-    display: block;
-    position: absolute;
-    left: 12px;
-    top: 17px;
-    font-size: 20px;
-    width: 30px;
-    text-align: center
-}
-
-.st-menu ul li a span.fa.fa-tasks, .st-menu ul li a span.fa.fa-envelope {
-    top: 18px;
-    font-size: 18px
-}
-
-.st-menu ul li:first-child a {
-    box-shadow: inset 0 -1px rgba(0, 0, 0, 0.2), inset 0 1px rgba(0, 0, 0, 0.2)
-}
-
-.st-menu ul li a:hover {
-    background: rgba(0, 0, 0, 0.2);
-    box-shadow: inset 0 -1px rgba(0, 0, 0, 0);
-    color: #fff
-}
-
-.st-effect-9.st-container {
-    -webkit-perspective: 10000px;
-    perspective: 10000px
-}
-
-.st-effect-9 .st-pusher {
-    -webkit-transform-style: preserve-3d;
-    transform-style: preserve-3d
-}
-
-.st-effect-9.st-menu-open .st-pusher {
-    -webkit-transform: translate3d(0, 0, -300px);
-    transform: translate3d(0, 0, -300px)
-}
-
-.st-effect-9.st-menu {
-    right: -600px;
-    opacity: 1;
-    -webkit-transform: translate3d(-100%, 0, 0);
-    transform: translate3d(-100%, 0, 0)
-}
-
-.st-effect-9.st-menu-open .st-effect-9.st-menu {
-    visibility: visible;
-    right: -300px
-}
-
-.st-effect-9.st-menu::after {
-    display: none
-}
-
-/* Video from the learn page */
-.presentations {
-    margin-top: 30px;
-    margin-bottom: 30px;
-}
-
-.presentations img.screenshot {
-    float: left;
-    margin-right: 40px;
-    margin-top: 1em;
-    margin-bottom: 0px;
-    width: 300px;
-    height: auto;
-}
-
-.presentations .metadata {
-    display: table-cell;
-    min-width: 328px;
-}
-
-.presentations .title {
-    margin-top: 1em !important;
-    margin-bottom: 0.5em !important;
-}
-
-
-.presentations .speaker {
-    color: #245f78;
-    margin-bottom: 0.5em;
-}
-
-.presentations .summary {
-    line-height: 1.3;
-}
-
-.presentations .urls {
-}
-
-/* Courses from the Learn Page */
-.courses {
-    margin-top: 30px;
-    margin-bottom: 30px;
-}
-
-.courses img.screenshot {
-    float: left;
-    margin-right: 40px;
-    margin-top: 1em;
-    margin-bottom: 0px;
-    width: 300px;
-    height: auto;
-}
-
-.courses .metadata {
-    display: table-cell;
-    min-width: 328px;
-}
-
-.courses .title {
-    margin-top: 1em !important;
-    margin-bottom: 0.5em !important;
-}
-
-.courses .instructor {
-    color: #245f78;
-    margin-bottom: 0.5em;
-}
-
-.courses .description {
-    line-height: 1.3;
-}
-
-@media screen and (max-width: 767px) {
-    .presentations .img.screenshot, .video .metadata {
-        float: none;
-    }
-}
-
-#content #toc {
-    margin-bottom: 1.25em;
-    padding: 1.25em;
-    border-width: 0;
-    -webkit-border-radius: 4px;
-    border-radius: 4px;
-}
-
-#content #toc > :first-child {
-    margin-top: 0;
-}
-
-#content #toc > :last-child {
-    margin-bottom: 0;
-}
-
-#content #toc a {
-    text-decoration: none;
-}
-
-#content #toctitle {
-    font-weight: bold;
-    font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif;
-    font-size: 1em;
-    padding-left: 0.125em;
-}
-
-#content #toc ul {
-    list-style-type: none;
-    padding-left: 0.2em;
-}
\ No newline at end of file
diff --git a/site/src/site/assets/img/confs/greach2017.png b/site/src/site/assets/img/confs/greach2017.png
deleted file mode 100644
index 9f1f305..0000000
--- a/site/src/site/assets/img/confs/greach2017.png
+++ /dev/null
Binary files differ
diff --git a/site/src/site/assets/js/plugins.js b/site/src/site/assets/js/plugins.js
deleted file mode 100644
index 728680b..0000000
--- a/site/src/site/assets/js/plugins.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// Avoid `console` errors in browsers that lack a console.
-(function() {
-    var method;
-    var noop = function () {};
-    var methods = [
-        'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error',
-        'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log',
-        'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd',
-        'timeStamp', 'trace', 'warn'
-    ];
-    var length = methods.length;
-    var console = (window.console = window.console || {});
-
-    while (length--) {
-        method = methods[length];
-
-        // Only stub undefined methods.
-        if (!console[method]) {
-            console[method] = noop;
-        }
-    }
-}());
-
-// Place any jQuery/helper plugins in here.
diff --git a/site/src/site/assets/js/vendor/bootstrap.js b/site/src/site/assets/js/vendor/bootstrap.js
deleted file mode 100644
index 53da1c7..0000000
--- a/site/src/site/assets/js/vendor/bootstrap.js
+++ /dev/null
@@ -1,2114 +0,0 @@
-/*!
- * Bootstrap v3.2.0 (http://getbootstrap.com)
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-
-if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') }
-
-/* ========================================================================
- * Bootstrap: transition.js v3.2.0
- * http://getbootstrap.com/javascript/#transitions
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
-  'use strict';
-
-  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
-  // ============================================================
-
-  function transitionEnd() {
-    var el = document.createElement('bootstrap')
-
-    var transEndEventNames = {
-      WebkitTransition : 'webkitTransitionEnd',
-      MozTransition    : 'transitionend',
-      OTransition      : 'oTransitionEnd otransitionend',
-      transition       : 'transitionend'
-    }
-
-    for (var name in transEndEventNames) {
-      if (el.style[name] !== undefined) {
-        return { end: transEndEventNames[name] }
-      }
-    }
-
-    return false // explicit for ie8 (  ._.)
-  }
-
-  // http://blog.alexmaccaw.com/css-transitions
-  $.fn.emulateTransitionEnd = function (duration) {
-    var called = false
-    var $el = this
-    $(this).one('bsTransitionEnd', function () { called = true })
-    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
-    setTimeout(callback, duration)
-    return this
-  }
-
-  $(function () {
-    $.support.transition = transitionEnd()
-
-    if (!$.support.transition) return
-
-    $.event.special.bsTransitionEnd = {
-      bindType: $.support.transition.end,
-      delegateType: $.support.transition.end,
-      handle: function (e) {
-        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
-      }
-    }
-  })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: alert.js v3.2.0
- * http://getbootstrap.com/javascript/#alerts
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
-  'use strict';
-
-  // ALERT CLASS DEFINITION
-  // ======================
-
-  var dismiss = '[data-dismiss="alert"]'
-  var Alert   = function (el) {
-    $(el).on('click', dismiss, this.close)
-  }
-
-  Alert.VERSION = '3.2.0'
-
-  Alert.prototype.close = function (e) {
-    var $this    = $(this)
-    var selector = $this.attr('data-target')
-
-    if (!selector) {
-      selector = $this.attr('href')
-      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
-    }
-
-    var $parent = $(selector)
-
-    if (e) e.preventDefault()
-
-    if (!$parent.length) {
-      $parent = $this.hasClass('alert') ? $this : $this.parent()
-    }
-
-    $parent.trigger(e = $.Event('close.bs.alert'))
-
-    if (e.isDefaultPrevented()) return
-
-    $parent.removeClass('in')
-
-    function removeElement() {
-      // detach from parent, fire event then clean up data
-      $parent.detach().trigger('closed.bs.alert').remove()
-    }
-
-    $.support.transition && $parent.hasClass('fade') ?
-      $parent
-        .one('bsTransitionEnd', removeElement)
-        .emulateTransitionEnd(150) :
-      removeElement()
-  }
-
-
-  // ALERT PLUGIN DEFINITION
-  // =======================
-
-  function Plugin(option) {
-    return this.each(function () {
-      var $this = $(this)
-      var data  = $this.data('bs.alert')
-
-      if (!data) $this.data('bs.alert', (data = new Alert(this)))
-      if (typeof option == 'string') data[option].call($this)
-    })
-  }
-
-  var old = $.fn.alert
-
-  $.fn.alert             = Plugin
-  $.fn.alert.Constructor = Alert
-
-
-  // ALERT NO CONFLICT
-  // =================
-
-  $.fn.alert.noConflict = function () {
-    $.fn.alert = old
-    return this
-  }
-
-
-  // ALERT DATA-API
-  // ==============
-
-  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: button.js v3.2.0
- * http://getbootstrap.com/javascript/#buttons
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
-  'use strict';
-
-  // BUTTON PUBLIC CLASS DEFINITION
-  // ==============================
-
-  var Button = function (element, options) {
-    this.$element  = $(element)
-    this.options   = $.extend({}, Button.DEFAULTS, options)
-    this.isLoading = false
-  }
-
-  Button.VERSION  = '3.2.0'
-
-  Button.DEFAULTS = {
-    loadingText: 'loading...'
-  }
-
-  Button.prototype.setState = function (state) {
-    var d    = 'disabled'
-    var $el  = this.$element
-    var val  = $el.is('input') ? 'val' : 'html'
-    var data = $el.data()
-
-    state = state + 'Text'
-
-    if (data.resetText == null) $el.data('resetText', $el[val]())
-
-    $el[val](data[state] == null ? this.options[state] : data[state])
-
-    // push to event loop to allow forms to submit
-    setTimeout($.proxy(function () {
-      if (state == 'loadingText') {
-        this.isLoading = true
-        $el.addClass(d).attr(d, d)
-      } else if (this.isLoading) {
-        this.isLoading = false
-        $el.removeClass(d).removeAttr(d)
-      }
-    }, this), 0)
-  }
-
-  Button.prototype.toggle = function () {
-    var changed = true
-    var $parent = this.$element.closest('[data-toggle="buttons"]')
-
-    if ($parent.length) {
-      var $input = this.$element.find('input')
-      if ($input.prop('type') == 'radio') {
-        if ($input.prop('checked') && this.$element.hasClass('active')) changed = false
-        else $parent.find('.active').removeClass('active')
-      }
-      if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
-    }
-
-    if (changed) this.$element.toggleClass('active')
-  }
-
-
-  // BUTTON PLUGIN DEFINITION
-  // ========================
-
-  function Plugin(option) {
-    return this.each(function () {
-      var $this   = $(this)
-      var data    = $this.data('bs.button')
-      var options = typeof option == 'object' && option
-
-      if (!data) $this.data('bs.button', (data = new Button(this, options)))
-
-      if (option == 'toggle') data.toggle()
-      else if (option) data.setState(option)
-    })
-  }
-
-  var old = $.fn.button
-
-  $.fn.button             = Plugin
-  $.fn.button.Constructor = Button
-
-
-  // BUTTON NO CONFLICT
-  // ==================
-
-  $.fn.button.noConflict = function () {
-    $.fn.button = old
-    return this
-  }
-
-
-  // BUTTON DATA-API
-  // ===============
-
-  $(document).on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
-    var $btn = $(e.target)
-    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
-    Plugin.call($btn, 'toggle')
-    e.preventDefault()
-  })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: carousel.js v3.2.0
- * http://getbootstrap.com/javascript/#carousel
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
-  'use strict';
-
-  // CAROUSEL CLASS DEFINITION
-  // =========================
-
-  var Carousel = function (element, options) {
-    this.$element    = $(element).on('keydown.bs.carousel', $.proxy(this.keydown, this))
-    this.$indicators = this.$element.find('.carousel-indicators')
-    this.options     = options
-    this.paused      =
-    this.sliding     =
-    this.interval    =
-    this.$active     =
-    this.$items      = null
-
-    this.options.pause == 'hover' && this.$element
-      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
-      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
-  }
-
-  Carousel.VERSION  = '3.2.0'
-
-  Carousel.DEFAULTS = {
-    interval: 5000,
-    pause: 'hover',
-    wrap: true
-  }
-
-  Carousel.prototype.keydown = function (e) {
-    switch (e.which) {
-      case 37: this.prev(); break
-      case 39: this.next(); break
-      default: return
-    }
-
-    e.preventDefault()
-  }
-
-  Carousel.prototype.cycle = function (e) {
-    e || (this.paused = false)
-
-    this.interval && clearInterval(this.interval)
-
-    this.options.interval
-      && !this.paused
-      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
-
-    return this
-  }
-
-  Carousel.prototype.getItemIndex = function (item) {
-    this.$items = item.parent().children('.item')
-    return this.$items.index(item || this.$active)
-  }
-
-  Carousel.prototype.to = function (pos) {
-    var that        = this
-    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
-
-    if (pos > (this.$items.length - 1) || pos < 0) return
-
-    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
-    if (activeIndex == pos) return this.pause().cycle()
-
-    return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
-  }
-
-  Carousel.prototype.pause = function (e) {
-    e || (this.paused = true)
-
-    if (this.$element.find('.next, .prev').length && $.support.transition) {
-      this.$element.trigger($.support.transition.end)
-      this.cycle(true)
-    }
-
-    this.interval = clearInterval(this.interval)
-
-    return this
-  }
-
-  Carousel.prototype.next = function () {
-    if (this.sliding) return
-    return this.slide('next')
-  }
-
-  Carousel.prototype.prev = function () {
-    if (this.sliding) return
-    return this.slide('prev')
-  }
-
-  Carousel.prototype.slide = function (type, next) {
-    var $active   = this.$element.find('.item.active')
-    var $next     = next || $active[type]()
-    var isCycling = this.interval
-    var direction = type == 'next' ? 'left' : 'right'
-    var fallback  = type == 'next' ? 'first' : 'last'
-    var that      = this
-
-    if (!$next.length) {
-      if (!this.options.wrap) return
-      $next = this.$element.find('.item')[fallback]()
-    }
-
-    if ($next.hasClass('active')) return (this.sliding = false)
-
-    var relatedTarget = $next[0]
-    var slideEvent = $.Event('slide.bs.carousel', {
-      relatedTarget: relatedTarget,
-      direction: direction
-    })
-    this.$element.trigger(slideEvent)
-    if (slideEvent.isDefaultPrevented()) return
-
-    this.sliding = true
-
-    isCycling && this.pause()
-
-    if (this.$indicators.length) {
-      this.$indicators.find('.active').removeClass('active')
-      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
-      $nextIndicator && $nextIndicator.addClass('active')
-    }
-
-    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
-    if ($.support.transition && this.$element.hasClass('slide')) {
-      $next.addClass(type)
-      $next[0].offsetWidth // force reflow
-      $active.addClass(direction)
-      $next.addClass(direction)
-      $active
-        .one('bsTransitionEnd', function () {
-          $next.removeClass([type, direction].join(' ')).addClass('active')
-          $active.removeClass(['active', direction].join(' '))
-          that.sliding = false
-          setTimeout(function () {
-            that.$element.trigger(slidEvent)
-          }, 0)
-        })
-        .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)
-    } else {
-      $active.removeClass('active')
-      $next.addClass('active')
-      this.sliding = false
-      this.$element.trigger(slidEvent)
-    }
-
-    isCycling && this.cycle()
-
-    return this
-  }
-
-
-  // CAROUSEL PLUGIN DEFINITION
-  // ==========================
-
-  function Plugin(option) {
-    return this.each(function () {
-      var $this   = $(this)
-      var data    = $this.data('bs.carousel')
-      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
-      var action  = typeof option == 'string' ? option : options.slide
-
-      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
-      if (typeof option == 'number') data.to(option)
-      else if (action) data[action]()
-      else if (options.interval) data.pause().cycle()
-    })
-  }
-
-  var old = $.fn.carousel
-
-  $.fn.carousel             = Plugin
-  $.fn.carousel.Constructor = Carousel
-
-
-  // CAROUSEL NO CONFLICT
-  // ====================
-
-  $.fn.carousel.noConflict = function () {
-    $.fn.carousel = old
-    return this
-  }
-
-
-  // CAROUSEL DATA-API
-  // =================
-
-  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
-    var href
-    var $this   = $(this)
-    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
-    if (!$target.hasClass('carousel')) return
-    var options = $.extend({}, $target.data(), $this.data())
-    var slideIndex = $this.attr('data-slide-to')
-    if (slideIndex) options.interval = false
-
-    Plugin.call($target, options)
-
-    if (slideIndex) {
-      $target.data('bs.carousel').to(slideIndex)
-    }
-
-    e.preventDefault()
-  })
-
-  $(window).on('load', function () {
-    $('[data-ride="carousel"]').each(function () {
-      var $carousel = $(this)
-      Plugin.call($carousel, $carousel.data())
-    })
-  })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: collapse.js v3.2.0
- * http://getbootstrap.com/javascript/#collapse
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
-  'use strict';
-
-  // COLLAPSE PUBLIC CLASS DEFINITION
-  // ================================
-
-  var Collapse = function (element, options) {
-    this.$element      = $(element)
-    this.options       = $.extend({}, Collapse.DEFAULTS, options)
-    this.transitioning = null
-
-    if (this.options.parent) this.$parent = $(this.options.parent)
-    if (this.options.toggle) this.toggle()
-  }
-
-  Collapse.VERSION  = '3.2.0'
-
-  Collapse.DEFAULTS = {
-    toggle: true
-  }
-
-  Collapse.prototype.dimension = function () {
-    var hasWidth = this.$element.hasClass('width')
-    return hasWidth ? 'width' : 'height'
-  }
-
-  Collapse.prototype.show = function () {
-    if (this.transitioning || this.$element.hasClass('in')) return
-
-    var startEvent = $.Event('show.bs.collapse')
-    this.$element.trigger(startEvent)
-    if (startEvent.isDefaultPrevented()) return
-
-    var actives = this.$parent && this.$parent.find('> .panel > .in')
-
-    if (actives && actives.length) {
-      var hasData = actives.data('bs.collapse')
-      if (hasData && hasData.transitioning) return
-      Plugin.call(actives, 'hide')
-      hasData || actives.data('bs.collapse', null)
-    }
-
-    var dimension = this.dimension()
-
-    this.$element
-      .removeClass('collapse')
-      .addClass('collapsing')[dimension](0)
-
-    this.transitioning = 1
-
-    var complete = function () {
-      this.$element
-        .removeClass('collapsing')
-        .addClass('collapse in')[dimension]('')
-      this.transitioning = 0
-      this.$element
-        .trigger('shown.bs.collapse')
-    }
-
-    if (!$.support.transition) return complete.call(this)
-
-    var scrollSize = $.camelCase(['scroll', dimension].join('-'))
-
-    this.$element
-      .one('bsTransitionEnd', $.proxy(complete, this))
-      .emulateTransitionEnd(350)[dimension](this.$element[0][scrollSize])
-  }
-
-  Collapse.prototype.hide = function () {
-    if (this.transitioning || !this.$element.hasClass('in')) return
-
-    var startEvent = $.Event('hide.bs.collapse')
-    this.$element.trigger(startEvent)
-    if (startEvent.isDefaultPrevented()) return
-
-    var dimension = this.dimension()
-
-    this.$element[dimension](this.$element[dimension]())[0].offsetHeight
-
-    this.$element
-      .addClass('collapsing')
-      .removeClass('collapse')
-      .removeClass('in')
-
-    this.transitioning = 1
-
-    var complete = function () {
-      this.transitioning = 0
-      this.$element
-        .trigger('hidden.bs.collapse')
-        .removeClass('collapsing')
-        .addClass('collapse')
-    }
-
-    if (!$.support.transition) return complete.call(this)
-
-    this.$element
-      [dimension](0)
-      .one('bsTransitionEnd', $.proxy(complete, this))
-      .emulateTransitionEnd(350)
-  }
-
-  Collapse.prototype.toggle = function () {
-    this[this.$element.hasClass('in') ? 'hide' : 'show']()
-  }
-
-
-  // COLLAPSE PLUGIN DEFINITION
-  // ==========================
-
-  function Plugin(option) {
-    return this.each(function () {
-      var $this   = $(this)
-      var data    = $this.data('bs.collapse')
-      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
-
-      if (!data && options.toggle && option == 'show') option = !option
-      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  var old = $.fn.collapse
-
-  $.fn.collapse             = Plugin
-  $.fn.collapse.Constructor = Collapse
-
-
-  // COLLAPSE NO CONFLICT
-  // ====================
-
-  $.fn.collapse.noConflict = function () {
-    $.fn.collapse = old
-    return this
-  }
-
-
-  // COLLAPSE DATA-API
-  // =================
-
-  $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
-    var href
-    var $this   = $(this)
-    var target  = $this.attr('data-target')
-        || e.preventDefault()
-        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
-    var $target = $(target)
-    var data    = $target.data('bs.collapse')
-    var option  = data ? 'toggle' : $this.data()
-    var parent  = $this.attr('data-parent')
-    var $parent = parent && $(parent)
-
-    if (!data || !data.transitioning) {
-      if ($parent) $parent.find('[data-toggle="collapse"][data-parent="' + parent + '"]').not($this).addClass('collapsed')
-      $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
-    }
-
-    Plugin.call($target, option)
-  })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: dropdown.js v3.2.0
- * http://getbootstrap.com/javascript/#dropdowns
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
-  'use strict';
-
-  // DROPDOWN CLASS DEFINITION
-  // =========================
-
-  var backdrop = '.dropdown-backdrop'
-  var toggle   = '[data-toggle="dropdown"]'
-  var Dropdown = function (element) {
-    $(element).on('click.bs.dropdown', this.toggle)
-  }
-
-  Dropdown.VERSION = '3.2.0'
-
-  Dropdown.prototype.toggle = function (e) {
-    var $this = $(this)
-
-    if ($this.is('.disabled, :disabled')) return
-
-    var $parent  = getParent($this)
-    var isActive = $parent.hasClass('open')
-
-    clearMenus()
-
-    if (!isActive) {
-      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
-        // if mobile we use a backdrop because click events don't delegate
-        $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
-      }
-
-      var relatedTarget = { relatedTarget: this }
-      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
-
-      if (e.isDefaultPrevented()) return
-
-      $this.trigger('focus')
-
-      $parent
-        .toggleClass('open')
-        .trigger('shown.bs.dropdown', relatedTarget)
-    }
-
-    return false
-  }
-
-  Dropdown.prototype.keydown = function (e) {
-    if (!/(38|40|27)/.test(e.keyCode)) return
-
-    var $this = $(this)
-
-    e.preventDefault()
-    e.stopPropagation()
-
-    if ($this.is('.disabled, :disabled')) return
-
-    var $parent  = getParent($this)
-    var isActive = $parent.hasClass('open')
-
-    if (!isActive || (isActive && e.keyCode == 27)) {
-      if (e.which == 27) $parent.find(toggle).trigger('focus')
-      return $this.trigger('click')
-    }
-
-    var desc = ' li:not(.divider):visible a'
-    var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc)
-
-    if (!$items.length) return
-
-    var index = $items.index($items.filter(':focus'))
-
-    if (e.keyCode == 38 && index > 0)                 index--                        // up
-    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
-    if (!~index)                                      index = 0
-
-    $items.eq(index).trigger('focus')
-  }
-
-  function clearMenus(e) {
-    if (e && e.which === 3) return
-    $(backdrop).remove()
-    $(toggle).each(function () {
-      var $parent = getParent($(this))
-      var relatedTarget = { relatedTarget: this }
-      if (!$parent.hasClass('open')) return
-      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
-      if (e.isDefaultPrevented()) return
-      $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
-    })
-  }
-
-  function getParent($this) {
-    var selector = $this.attr('data-target')
-
-    if (!selector) {
-      selector = $this.attr('href')
-      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
-    }
-
-    var $parent = selector && $(selector)
-
-    return $parent && $parent.length ? $parent : $this.parent()
-  }
-
-
-  // DROPDOWN PLUGIN DEFINITION
-  // ==========================
-
-  function Plugin(option) {
-    return this.each(function () {
-      var $this = $(this)
-      var data  = $this.data('bs.dropdown')
-
-      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
-      if (typeof option == 'string') data[option].call($this)
-    })
-  }
-
-  var old = $.fn.dropdown
-
-  $.fn.dropdown             = Plugin
-  $.fn.dropdown.Constructor = Dropdown
-
-
-  // DROPDOWN NO CONFLICT
-  // ====================
-
-  $.fn.dropdown.noConflict = function () {
-    $.fn.dropdown = old
-    return this
-  }
-
-
-  // APPLY TO STANDARD DROPDOWN ELEMENTS
-  // ===================================
-
-  $(document)
-    .on('click.bs.dropdown.data-api', clearMenus)
-    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
-    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
-    .on('keydown.bs.dropdown.data-api', toggle + ', [role="menu"], [role="listbox"]', Dropdown.prototype.keydown)
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: modal.js v3.2.0
- * http://getbootstrap.com/javascript/#modals
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
-  'use strict';
-
-  // MODAL CLASS DEFINITION
-  // ======================
-
-  var Modal = function (element, options) {
-    this.options        = options
-    this.$body          = $(document.body)
-    this.$element       = $(element)
-    this.$backdrop      =
-    this.isShown        = null
-    this.scrollbarWidth = 0
-
-    if (this.options.remote) {
-      this.$element
-        .find('.modal-content')
-        .load(this.options.remote, $.proxy(function () {
-          this.$element.trigger('loaded.bs.modal')
-        }, this))
-    }
-  }
-
-  Modal.VERSION  = '3.2.0'
-
-  Modal.DEFAULTS = {
-    backdrop: true,
-    keyboard: true,
-    show: true
-  }
-
-  Modal.prototype.toggle = function (_relatedTarget) {
-    return this.isShown ? this.hide() : this.show(_relatedTarget)
-  }
-
-  Modal.prototype.show = function (_relatedTarget) {
-    var that = this
-    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
-
-    this.$element.trigger(e)
-
-    if (this.isShown || e.isDefaultPrevented()) return
-
-    this.isShown = true
-
-    this.checkScrollbar()
-    this.$body.addClass('modal-open')
-
-    this.setScrollbar()
-    this.escape()
-
-    this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
-
-    this.backdrop(function () {
-      var transition = $.support.transition && that.$element.hasClass('fade')
-
-      if (!that.$element.parent().length) {
-        that.$element.appendTo(that.$body) // don't move modals dom position
-      }
-
-      that.$element
-        .show()
-        .scrollTop(0)
-
-      if (transition) {
-        that.$element[0].offsetWidth // force reflow
-      }
-
-      that.$element
-        .addClass('in')
-        .attr('aria-hidden', false)
-
-      that.enforceFocus()
-
-      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
-
-      transition ?
-        that.$element.find('.modal-dialog') // wait for modal to slide in
-          .one('bsTransitionEnd', function () {
-            that.$element.trigger('focus').trigger(e)
-          })
-          .emulateTransitionEnd(300) :
-        that.$element.trigger('focus').trigger(e)
-    })
-  }
-
-  Modal.prototype.hide = function (e) {
-    if (e) e.preventDefault()
-
-    e = $.Event('hide.bs.modal')
-
-    this.$element.trigger(e)
-
-    if (!this.isShown || e.isDefaultPrevented()) return
-
-    this.isShown = false
-
-    this.$body.removeClass('modal-open')
-
-    this.resetScrollbar()
-    this.escape()
-
-    $(document).off('focusin.bs.modal')
-
-    this.$element
-      .removeClass('in')
-      .attr('aria-hidden', true)
-      .off('click.dismiss.bs.modal')
-
-    $.support.transition && this.$element.hasClass('fade') ?
-      this.$element
-        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
-        .emulateTransitionEnd(300) :
-      this.hideModal()
-  }
-
-  Modal.prototype.enforceFocus = function () {
-    $(document)
-      .off('focusin.bs.modal') // guard against infinite focus loop
-      .on('focusin.bs.modal', $.proxy(function (e) {
-        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
-          this.$element.trigger('focus')
-        }
-      }, this))
-  }
-
-  Modal.prototype.escape = function () {
-    if (this.isShown && this.options.keyboard) {
-      this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {
-        e.which == 27 && this.hide()
-      }, this))
-    } else if (!this.isShown) {
-      this.$element.off('keyup.dismiss.bs.modal')
-    }
-  }
-
-  Modal.prototype.hideModal = function () {
-    var that = this
-    this.$element.hide()
-    this.backdrop(function () {
-      that.$element.trigger('hidden.bs.modal')
-    })
-  }
-
-  Modal.prototype.removeBackdrop = function () {
-    this.$backdrop && this.$backdrop.remove()
-    this.$backdrop = null
-  }
-
-  Modal.prototype.backdrop = function (callback) {
-    var that = this
-    var animate = this.$element.hasClass('fade') ? 'fade' : ''
-
-    if (this.isShown && this.options.backdrop) {
-      var doAnimate = $.support.transition && animate
-
-      this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
-        .appendTo(this.$body)
-
-      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
-        if (e.target !== e.currentTarget) return
-        this.options.backdrop == 'static'
-          ? this.$element[0].focus.call(this.$element[0])
-          : this.hide.call(this)
-      }, this))
-
-      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
-
-      this.$backdrop.addClass('in')
-
-      if (!callback) return
-
-      doAnimate ?
-        this.$backdrop
-          .one('bsTransitionEnd', callback)
-          .emulateTransitionEnd(150) :
-        callback()
-
-    } else if (!this.isShown && this.$backdrop) {
-      this.$backdrop.removeClass('in')
-
-      var callbackRemove = function () {
-        that.removeBackdrop()
-        callback && callback()
-      }
-      $.support.transition && this.$element.hasClass('fade') ?
-        this.$backdrop
-          .one('bsTransitionEnd', callbackRemove)
-          .emulateTransitionEnd(150) :
-        callbackRemove()
-
-    } else if (callback) {
-      callback()
-    }
-  }
-
-  Modal.prototype.checkScrollbar = function () {
-    if (document.body.clientWidth >= window.innerWidth) return
-    this.scrollbarWidth = this.scrollbarWidth || this.measureScrollbar()
-  }
-
-  Modal.prototype.setScrollbar = function () {
-    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
-    if (this.scrollbarWidth) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
-  }
-
-  Modal.prototype.resetScrollbar = function () {
-    this.$body.css('padding-right', '')
-  }
-
-  Modal.prototype.measureScrollbar = function () { // thx walsh
-    var scrollDiv = document.createElement('div')
-    scrollDiv.className = 'modal-scrollbar-measure'
-    this.$body.append(scrollDiv)
-    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
-    this.$body[0].removeChild(scrollDiv)
-    return scrollbarWidth
-  }
-
-
-  // MODAL PLUGIN DEFINITION
-  // =======================
-
-  function Plugin(option, _relatedTarget) {
-    return this.each(function () {
-      var $this   = $(this)
-      var data    = $this.data('bs.modal')
-      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
-
-      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
-      if (typeof option == 'string') data[option](_relatedTarget)
-      else if (options.show) data.show(_relatedTarget)
-    })
-  }
-
-  var old = $.fn.modal
-
-  $.fn.modal             = Plugin
-  $.fn.modal.Constructor = Modal
-
-
-  // MODAL NO CONFLICT
-  // =================
-
-  $.fn.modal.noConflict = function () {
-    $.fn.modal = old
-    return this
-  }
-
-
-  // MODAL DATA-API
-  // ==============
-
-  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
-    var $this   = $(this)
-    var href    = $this.attr('href')
-    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
-    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
-
-    if ($this.is('a')) e.preventDefault()
-
-    $target.one('show.bs.modal', function (showEvent) {
-      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
-      $target.one('hidden.bs.modal', function () {
-        $this.is(':visible') && $this.trigger('focus')
-      })
-    })
-    Plugin.call($target, option, this)
-  })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: tooltip.js v3.2.0
- * http://getbootstrap.com/javascript/#tooltip
- * Inspired by the original jQuery.tipsy by Jason Frame
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
-  'use strict';
-
-  // TOOLTIP PUBLIC CLASS DEFINITION
-  // ===============================
-
-  var Tooltip = function (element, options) {
-    this.type       =
-    this.options    =
-    this.enabled    =
-    this.timeout    =
-    this.hoverState =
-    this.$element   = null
-
-    this.init('tooltip', element, options)
-  }
-
-  Tooltip.VERSION  = '3.2.0'
-
-  Tooltip.DEFAULTS = {
-    animation: true,
-    placement: 'top',
-    selector: false,
-    template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
-    trigger: 'hover focus',
-    title: '',
-    delay: 0,
-    html: false,
-    container: false,
-    viewport: {
-      selector: 'body',
-      padding: 0
-    }
-  }
-
-  Tooltip.prototype.init = function (type, element, options) {
-    this.enabled   = true
-    this.type      = type
-    this.$element  = $(element)
-    this.options   = this.getOptions(options)
-    this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport)
-
-    var triggers = this.options.trigger.split(' ')
-
-    for (var i = triggers.length; i--;) {
-      var trigger = triggers[i]
-
-      if (trigger == 'click') {
-        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
-      } else if (trigger != 'manual') {
-        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'
-        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
-
-        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
-        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
-      }
-    }
-
-    this.options.selector ?
-      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
-      this.fixTitle()
-  }
-
-  Tooltip.prototype.getDefaults = function () {
-    return Tooltip.DEFAULTS
-  }
-
-  Tooltip.prototype.getOptions = function (options) {
-    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
-
-    if (options.delay && typeof options.delay == 'number') {
-      options.delay = {
-        show: options.delay,
-        hide: options.delay
-      }
-    }
-
-    return options
-  }
-
-  Tooltip.prototype.getDelegateOptions = function () {
-    var options  = {}
-    var defaults = this.getDefaults()
-
-    this._options && $.each(this._options, function (key, value) {
-      if (defaults[key] != value) options[key] = value
-    })
-
-    return options
-  }
-
-  Tooltip.prototype.enter = function (obj) {
-    var self = obj instanceof this.constructor ?
-      obj : $(obj.currentTarget).data('bs.' + this.type)
-
-    if (!self) {
-      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
-      $(obj.currentTarget).data('bs.' + this.type, self)
-    }
-
-    clearTimeout(self.timeout)
-
-    self.hoverState = 'in'
-
-    if (!self.options.delay || !self.options.delay.show) return self.show()
-
-    self.timeout = setTimeout(function () {
-      if (self.hoverState == 'in') self.show()
-    }, self.options.delay.show)
-  }
-
-  Tooltip.prototype.leave = function (obj) {
-    var self = obj instanceof this.constructor ?
-      obj : $(obj.currentTarget).data('bs.' + this.type)
-
-    if (!self) {
-      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
-      $(obj.currentTarget).data('bs.' + this.type, self)
-    }
-
-    clearTimeout(self.timeout)
-
-    self.hoverState = 'out'
-
-    if (!self.options.delay || !self.options.delay.hide) return self.hide()
-
-    self.timeout = setTimeout(function () {
-      if (self.hoverState == 'out') self.hide()
-    }, self.options.delay.hide)
-  }
-
-  Tooltip.prototype.show = function () {
-    var e = $.Event('show.bs.' + this.type)
-
-    if (this.hasContent() && this.enabled) {
-      this.$element.trigger(e)
-
-      var inDom = $.contains(document.documentElement, this.$element[0])
-      if (e.isDefaultPrevented() || !inDom) return
-      var that = this
-
-      var $tip = this.tip()
-
-      var tipId = this.getUID(this.type)
-
-      this.setContent()
-      $tip.attr('id', tipId)
-      this.$element.attr('aria-describedby', tipId)
-
-      if (this.options.animation) $tip.addClass('fade')
-
-      var placement = typeof this.options.placement == 'function' ?
-        this.options.placement.call(this, $tip[0], this.$element[0]) :
-        this.options.placement
-
-      var autoToken = /\s?auto?\s?/i
-      var autoPlace = autoToken.test(placement)
-      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
-
-      $tip
-        .detach()
-        .css({ top: 0, left: 0, display: 'block' })
-        .addClass(placement)
-        .data('bs.' + this.type, this)
-
-      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
-
-      var pos          = this.getPosition()
-      var actualWidth  = $tip[0].offsetWidth
-      var actualHeight = $tip[0].offsetHeight
-
-      if (autoPlace) {
-        var orgPlacement = placement
-        var $parent      = this.$element.parent()
-        var parentDim    = this.getPosition($parent)
-
-        placement = placement == 'bottom' && pos.top   + pos.height       + actualHeight - parentDim.scroll > parentDim.height ? 'top'    :
-                    placement == 'top'    && pos.top   - parentDim.scroll - actualHeight < 0                                   ? 'bottom' :
-                    placement == 'right'  && pos.right + actualWidth      > parentDim.width                                    ? 'left'   :
-                    placement == 'left'   && pos.left  - actualWidth      < parentDim.left                                     ? 'right'  :
-                    placement
-
-        $tip
-          .removeClass(orgPlacement)
-          .addClass(placement)
-      }
-
-      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
-
-      this.applyPlacement(calculatedOffset, placement)
-
-      var complete = function () {
-        that.$element.trigger('shown.bs.' + that.type)
-        that.hoverState = null
-      }
-
-      $.support.transition && this.$tip.hasClass('fade') ?
-        $tip
-          .one('bsTransitionEnd', complete)
-          .emulateTransitionEnd(150) :
-        complete()
-    }
-  }
-
-  Tooltip.prototype.applyPlacement = function (offset, placement) {
-    var $tip   = this.tip()
-    var width  = $tip[0].offsetWidth
-    var height = $tip[0].offsetHeight
-
-    // manually read margins because getBoundingClientRect includes difference
-    var marginTop = parseInt($tip.css('margin-top'), 10)
-    var marginLeft = parseInt($tip.css('margin-left'), 10)
-
-    // we must check for NaN for ie 8/9
-    if (isNaN(marginTop))  marginTop  = 0
-    if (isNaN(marginLeft)) marginLeft = 0
-
-    offset.top  = offset.top  + marginTop
-    offset.left = offset.left + marginLeft
-
-    // $.fn.offset doesn't round pixel values
-    // so we use setOffset directly with our own function B-0
-    $.offset.setOffset($tip[0], $.extend({
-      using: function (props) {
-        $tip.css({
-          top: Math.round(props.top),
-          left: Math.round(props.left)
-        })
-      }
-    }, offset), 0)
-
-    $tip.addClass('in')
-
-    // check to see if placing tip in new offset caused the tip to resize itself
-    var actualWidth  = $tip[0].offsetWidth
-    var actualHeight = $tip[0].offsetHeight
-
-    if (placement == 'top' && actualHeight != height) {
-      offset.top = offset.top + height - actualHeight
-    }
-
-    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
-
-    if (delta.left) offset.left += delta.left
-    else offset.top += delta.top
-
-    var arrowDelta          = delta.left ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
-    var arrowPosition       = delta.left ? 'left'        : 'top'
-    var arrowOffsetPosition = delta.left ? 'offsetWidth' : 'offsetHeight'
-
-    $tip.offset(offset)
-    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], arrowPosition)
-  }
-
-  Tooltip.prototype.replaceArrow = function (delta, dimension, position) {
-    this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '')
-  }
-
-  Tooltip.prototype.setContent = function () {
-    var $tip  = this.tip()
-    var title = this.getTitle()
-
-    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
-    $tip.removeClass('fade in top bottom left right')
-  }
-
-  Tooltip.prototype.hide = function () {
-    var that = this
-    var $tip = this.tip()
-    var e    = $.Event('hide.bs.' + this.type)
-
-    this.$element.removeAttr('aria-describedby')
-
-    function complete() {
-      if (that.hoverState != 'in') $tip.detach()
-      that.$element.trigger('hidden.bs.' + that.type)
-    }
-
-    this.$element.trigger(e)
-
-    if (e.isDefaultPrevented()) return
-
-    $tip.removeClass('in')
-
-    $.support.transition && this.$tip.hasClass('fade') ?
-      $tip
-        .one('bsTransitionEnd', complete)
-        .emulateTransitionEnd(150) :
-      complete()
-
-    this.hoverState = null
-
-    return this
-  }
-
-  Tooltip.prototype.fixTitle = function () {
-    var $e = this.$element
-    if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {
-      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
-    }
-  }
-
-  Tooltip.prototype.hasContent = function () {
-    return this.getTitle()
-  }
-
-  Tooltip.prototype.getPosition = function ($element) {
-    $element   = $element || this.$element
-    var el     = $element[0]
-    var isBody = el.tagName == 'BODY'
-    return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : null, {
-      scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop(),
-      width:  isBody ? $(window).width()  : $element.outerWidth(),
-      height: isBody ? $(window).height() : $element.outerHeight()
-    }, isBody ? { top: 0, left: 0 } : $element.offset())
-  }
-
-  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
-    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :
-           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :
-           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
-        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }
-
-  }
-
-  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
-    var delta = { top: 0, left: 0 }
-    if (!this.$viewport) return delta
-
-    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
-    var viewportDimensions = this.getPosition(this.$viewport)
-
-    if (/right|left/.test(placement)) {
-      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
-      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
-      if (topEdgeOffset < viewportDimensions.top) { // top overflow
-        delta.top = viewportDimensions.top - topEdgeOffset
-      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
-        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
-      }
-    } else {
-      var leftEdgeOffset  = pos.left - viewportPadding
-      var rightEdgeOffset = pos.left + viewportPadding + actualWidth
-      if (leftEdgeOffset < viewportDimensions.left) { // left overflow
-        delta.left = viewportDimensions.left - leftEdgeOffset
-      } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow
-        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
-      }
-    }
-
-    return delta
-  }
-
-  Tooltip.prototype.getTitle = function () {
-    var title
-    var $e = this.$element
-    var o  = this.options
-
-    title = $e.attr('data-original-title')
-      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
-
-    return title
-  }
-
-  Tooltip.prototype.getUID = function (prefix) {
-    do prefix += ~~(Math.random() * 1000000)
-    while (document.getElementById(prefix))
-    return prefix
-  }
-
-  Tooltip.prototype.tip = function () {
-    return (this.$tip = this.$tip || $(this.options.template))
-  }
-
-  Tooltip.prototype.arrow = function () {
-    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
-  }
-
-  Tooltip.prototype.validate = function () {
-    if (!this.$element[0].parentNode) {
-      this.hide()
-      this.$element = null
-      this.options  = null
-    }
-  }
-
-  Tooltip.prototype.enable = function () {
-    this.enabled = true
-  }
-
-  Tooltip.prototype.disable = function () {
-    this.enabled = false
-  }
-
-  Tooltip.prototype.toggleEnabled = function () {
-    this.enabled = !this.enabled
-  }
-
-  Tooltip.prototype.toggle = function (e) {
-    var self = this
-    if (e) {
-      self = $(e.currentTarget).data('bs.' + this.type)
-      if (!self) {
-        self = new this.constructor(e.currentTarget, this.getDelegateOptions())
-        $(e.currentTarget).data('bs.' + this.type, self)
-      }
-    }
-
-    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
-  }
-
-  Tooltip.prototype.destroy = function () {
-    clearTimeout(this.timeout)
-    this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)
-  }
-
-
-  // TOOLTIP PLUGIN DEFINITION
-  // =========================
-
-  function Plugin(option) {
-    return this.each(function () {
-      var $this   = $(this)
-      var data    = $this.data('bs.tooltip')
-      var options = typeof option == 'object' && option
-
-      if (!data && option == 'destroy') return
-      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  var old = $.fn.tooltip
-
-  $.fn.tooltip             = Plugin
-  $.fn.tooltip.Constructor = Tooltip
-
-
-  // TOOLTIP NO CONFLICT
-  // ===================
-
-  $.fn.tooltip.noConflict = function () {
-    $.fn.tooltip = old
-    return this
-  }
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: popover.js v3.2.0
- * http://getbootstrap.com/javascript/#popovers
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
-  'use strict';
-
-  // POPOVER PUBLIC CLASS DEFINITION
-  // ===============================
-
-  var Popover = function (element, options) {
-    this.init('popover', element, options)
-  }
-
-  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
-
-  Popover.VERSION  = '3.2.0'
-
-  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
-    placement: 'right',
-    trigger: 'click',
-    content: '',
-    template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
-  })
-
-
-  // NOTE: POPOVER EXTENDS tooltip.js
-  // ================================
-
-  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
-
-  Popover.prototype.constructor = Popover
-
-  Popover.prototype.getDefaults = function () {
-    return Popover.DEFAULTS
-  }
-
-  Popover.prototype.setContent = function () {
-    var $tip    = this.tip()
-    var title   = this.getTitle()
-    var content = this.getContent()
-
-    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
-    $tip.find('.popover-content').empty()[ // we use append for html objects to maintain js events
-      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
-    ](content)
-
-    $tip.removeClass('fade top bottom left right in')
-
-    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
-    // this manually by checking the contents.
-    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
-  }
-
-  Popover.prototype.hasContent = function () {
-    return this.getTitle() || this.getContent()
-  }
-
-  Popover.prototype.getContent = function () {
-    var $e = this.$element
-    var o  = this.options
-
-    return $e.attr('data-content')
-      || (typeof o.content == 'function' ?
-            o.content.call($e[0]) :
-            o.content)
-  }
-
-  Popover.prototype.arrow = function () {
-    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
-  }
-
-  Popover.prototype.tip = function () {
-    if (!this.$tip) this.$tip = $(this.options.template)
-    return this.$tip
-  }
-
-
-  // POPOVER PLUGIN DEFINITION
-  // =========================
-
-  function Plugin(option) {
-    return this.each(function () {
-      var $this   = $(this)
-      var data    = $this.data('bs.popover')
-      var options = typeof option == 'object' && option
-
-      if (!data && option == 'destroy') return
-      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  var old = $.fn.popover
-
-  $.fn.popover             = Plugin
-  $.fn.popover.Constructor = Popover
-
-
-  // POPOVER NO CONFLICT
-  // ===================
-
-  $.fn.popover.noConflict = function () {
-    $.fn.popover = old
-    return this
-  }
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: scrollspy.js v3.2.0
- * http://getbootstrap.com/javascript/#scrollspy
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
-  'use strict';
-
-  // SCROLLSPY CLASS DEFINITION
-  // ==========================
-
-  function ScrollSpy(element, options) {
-    var process  = $.proxy(this.process, this)
-
-    this.$body          = $('body')
-    this.$scrollElement = $(element).is('body') ? $(window) : $(element)
-    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
-    this.selector       = (this.options.target || '') + ' .nav li > a'
-    this.offsets        = []
-    this.targets        = []
-    this.activeTarget   = null
-    this.scrollHeight   = 0
-
-    this.$scrollElement.on('scroll.bs.scrollspy', process)
-    this.refresh()
-    this.process()
-  }
-
-  ScrollSpy.VERSION  = '3.2.0'
-
-  ScrollSpy.DEFAULTS = {
-    offset: 10
-  }
-
-  ScrollSpy.prototype.getScrollHeight = function () {
-    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
-  }
-
-  ScrollSpy.prototype.refresh = function () {
-    var offsetMethod = 'offset'
-    var offsetBase   = 0
-
-    if (!$.isWindow(this.$scrollElement[0])) {
-      offsetMethod = 'position'
-      offsetBase   = this.$scrollElement.scrollTop()
-    }
-
-    this.offsets = []
-    this.targets = []
-    this.scrollHeight = this.getScrollHeight()
-
-    var self     = this
-
-    this.$body
-      .find(this.selector)
-      .map(function () {
-        var $el   = $(this)
-        var href  = $el.data('target') || $el.attr('href')
-        var $href = /^#./.test(href) && $(href)
-
-        return ($href
-          && $href.length
-          && $href.is(':visible')
-          && [[$href[offsetMethod]().top + offsetBase, href]]) || null
-      })
-      .sort(function (a, b) { return a[0] - b[0] })
-      .each(function () {
-        self.offsets.push(this[0])
-        self.targets.push(this[1])
-      })
-  }
-
-  ScrollSpy.prototype.process = function () {
-    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
-    var scrollHeight = this.getScrollHeight()
-    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()
-    var offsets      = this.offsets
-    var targets      = this.targets
-    var activeTarget = this.activeTarget
-    var i
-
-    if (this.scrollHeight != scrollHeight) {
-      this.refresh()
-    }
-
-    if (scrollTop >= maxScroll) {
-      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
-    }
-
-    if (activeTarget && scrollTop <= offsets[0]) {
-      return activeTarget != (i = targets[0]) && this.activate(i)
-    }
-
-    for (i = offsets.length; i--;) {
-      activeTarget != targets[i]
-        && scrollTop >= offsets[i]
-        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
-        && this.activate(targets[i])
-    }
-  }
-
-  ScrollSpy.prototype.activate = function (target) {
-    this.activeTarget = target
-
-    $(this.selector)
-      .parentsUntil(this.options.target, '.active')
-      .removeClass('active')
-
-    var selector = this.selector +
-        '[data-target="' + target + '"],' +
-        this.selector + '[href="' + target + '"]'
-
-    var active = $(selector)
-      .parents('li')
-      .addClass('active')
-
-    if (active.parent('.dropdown-menu').length) {
-      active = active
-        .closest('li.dropdown')
-        .addClass('active')
-    }
-
-    active.trigger('activate.bs.scrollspy')
-  }
-
-
-  // SCROLLSPY PLUGIN DEFINITION
-  // ===========================
-
-  function Plugin(option) {
-    return this.each(function () {
-      var $this   = $(this)
-      var data    = $this.data('bs.scrollspy')
-      var options = typeof option == 'object' && option
-
-      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  var old = $.fn.scrollspy
-
-  $.fn.scrollspy             = Plugin
-  $.fn.scrollspy.Constructor = ScrollSpy
-
-
-  // SCROLLSPY NO CONFLICT
-  // =====================
-
-  $.fn.scrollspy.noConflict = function () {
-    $.fn.scrollspy = old
-    return this
-  }
-
-
-  // SCROLLSPY DATA-API
-  // ==================
-
-  $(window).on('load.bs.scrollspy.data-api', function () {
-    $('[data-spy="scroll"]').each(function () {
-      var $spy = $(this)
-      Plugin.call($spy, $spy.data())
-    })
-  })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: tab.js v3.2.0
- * http://getbootstrap.com/javascript/#tabs
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
-  'use strict';
-
-  // TAB CLASS DEFINITION
-  // ====================
-
-  var Tab = function (element) {
-    this.element = $(element)
-  }
-
-  Tab.VERSION = '3.2.0'
-
-  Tab.prototype.show = function () {
-    var $this    = this.element
-    var $ul      = $this.closest('ul:not(.dropdown-menu)')
-    var selector = $this.data('target')
-
-    if (!selector) {
-      selector = $this.attr('href')
-      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
-    }
-
-    if ($this.parent('li').hasClass('active')) return
-
-    var previous = $ul.find('.active:last a')[0]
-    var e        = $.Event('show.bs.tab', {
-      relatedTarget: previous
-    })
-
-    $this.trigger(e)
-
-    if (e.isDefaultPrevented()) return
-
-    var $target = $(selector)
-
-    this.activate($this.closest('li'), $ul)
-    this.activate($target, $target.parent(), function () {
-      $this.trigger({
-        type: 'shown.bs.tab',
-        relatedTarget: previous
-      })
-    })
-  }
-
-  Tab.prototype.activate = function (element, container, callback) {
-    var $active    = container.find('> .active')
-    var transition = callback
-      && $.support.transition
-      && $active.hasClass('fade')
-
-    function next() {
-      $active
-        .removeClass('active')
-        .find('> .dropdown-menu > .active')
-        .removeClass('active')
-
-      element.addClass('active')
-
-      if (transition) {
-        element[0].offsetWidth // reflow for transition
-        element.addClass('in')
-      } else {
-        element.removeClass('fade')
-      }
-
-      if (element.parent('.dropdown-menu')) {
-        element.closest('li.dropdown').addClass('active')
-      }
-
-      callback && callback()
-    }
-
-    transition ?
-      $active
-        .one('bsTransitionEnd', next)
-        .emulateTransitionEnd(150) :
-      next()
-
-    $active.removeClass('in')
-  }
-
-
-  // TAB PLUGIN DEFINITION
-  // =====================
-
-  function Plugin(option) {
-    return this.each(function () {
-      var $this = $(this)
-      var data  = $this.data('bs.tab')
-
-      if (!data) $this.data('bs.tab', (data = new Tab(this)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  var old = $.fn.tab
-
-  $.fn.tab             = Plugin
-  $.fn.tab.Constructor = Tab
-
-
-  // TAB NO CONFLICT
-  // ===============
-
-  $.fn.tab.noConflict = function () {
-    $.fn.tab = old
-    return this
-  }
-
-
-  // TAB DATA-API
-  // ============
-
-  $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
-    e.preventDefault()
-    Plugin.call($(this), 'show')
-  })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: affix.js v3.2.0
- * http://getbootstrap.com/javascript/#affix
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
-  'use strict';
-
-  // AFFIX CLASS DEFINITION
-  // ======================
-
-  var Affix = function (element, options) {
-    this.options = $.extend({}, Affix.DEFAULTS, options)
-
-    this.$target = $(this.options.target)
-      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
-      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))
-
-    this.$element     = $(element)
-    this.affixed      =
-    this.unpin        =
-    this.pinnedOffset = null
-
-    this.checkPosition()
-  }
-
-  Affix.VERSION  = '3.2.0'
-
-  Affix.RESET    = 'affix affix-top affix-bottom'
-
-  Affix.DEFAULTS = {
-    offset: 0,
-    target: window
-  }
-
-  Affix.prototype.getPinnedOffset = function () {
-    if (this.pinnedOffset) return this.pinnedOffset
-    this.$element.removeClass(Affix.RESET).addClass('affix')
-    var scrollTop = this.$target.scrollTop()
-    var position  = this.$element.offset()
-    return (this.pinnedOffset = position.top - scrollTop)
-  }
-
-  Affix.prototype.checkPositionWithEventLoop = function () {
-    setTimeout($.proxy(this.checkPosition, this), 1)
-  }
-
-  Affix.prototype.checkPosition = function () {
-    if (!this.$element.is(':visible')) return
-
-    var scrollHeight = $(document).height()
-    var scrollTop    = this.$target.scrollTop()
-    var position     = this.$element.offset()
-    var offset       = this.options.offset
-    var offsetTop    = offset.top
-    var offsetBottom = offset.bottom
-
-    if (typeof offset != 'object')         offsetBottom = offsetTop = offset
-    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)
-    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
-
-    var affix = this.unpin   != null && (scrollTop + this.unpin <= position.top) ? false :
-                offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :
-                offsetTop    != null && (scrollTop <= offsetTop) ? 'top' : false
-
-    if (this.affixed === affix) return
-    if (this.unpin != null) this.$element.css('top', '')
-
-    var affixType = 'affix' + (affix ? '-' + affix : '')
-    var e         = $.Event(affixType + '.bs.affix')
-
-    this.$element.trigger(e)
-
-    if (e.isDefaultPrevented()) return
-
-    this.affixed = affix
-    this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
-
-    this.$element
-      .removeClass(Affix.RESET)
-      .addClass(affixType)
-      .trigger($.Event(affixType.replace('affix', 'affixed')))
-
-    if (affix == 'bottom') {
-      this.$element.offset({
-        top: scrollHeight - this.$element.height() - offsetBottom
-      })
-    }
-  }
-
-
-  // AFFIX PLUGIN DEFINITION
-  // =======================
-
-  function Plugin(option) {
-    return this.each(function () {
-      var $this   = $(this)
-      var data    = $this.data('bs.affix')
-      var options = typeof option == 'object' && option
-
-      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  var old = $.fn.affix
-
-  $.fn.affix             = Plugin
-  $.fn.affix.Constructor = Affix
-
-
-  // AFFIX NO CONFLICT
-  // =================
-
-  $.fn.affix.noConflict = function () {
-    $.fn.affix = old
-    return this
-  }
-
-
-  // AFFIX DATA-API
-  // ==============
-
-  $(window).on('load', function () {
-    $('[data-spy="affix"]').each(function () {
-      var $spy = $(this)
-      var data = $spy.data()
-
-      data.offset = data.offset || {}
-
-      if (data.offsetBottom) data.offset.bottom = data.offsetBottom
-      if (data.offsetTop)    data.offset.top    = data.offsetTop
-
-      Plugin.call($spy, data)
-    })
-  })
-
-}(jQuery);
diff --git a/site/src/site/assets/js/vendor/classie.js b/site/src/site/assets/js/vendor/classie.js
deleted file mode 100644
index a967554..0000000
--- a/site/src/site/assets/js/vendor/classie.js
+++ /dev/null
@@ -1,80 +0,0 @@
-/*!
- * classie - class helper functions
- * from bonzo https://github.com/ded/bonzo
- * 
- * classie.has( elem, 'my-class' ) -> true/false
- * classie.add( elem, 'my-new-class' )
- * classie.remove( elem, 'my-unwanted-class' )
- * classie.toggle( elem, 'my-class' )
- */
-
-/*jshint browser: true, strict: true, undef: true */
-/*global define: false */
-
-( function( window ) {
-
-'use strict';
-
-// class helper functions from bonzo https://github.com/ded/bonzo
-
-function classReg( className ) {
-  return new RegExp("(^|\\s+)" + className + "(\\s+|$)");
-}
-
-// classList support for class management
-// altho to be fair, the api sucks because it won't accept multiple classes at once
-var hasClass, addClass, removeClass;
-
-if ( 'classList' in document.documentElement ) {
-  hasClass = function( elem, c ) {
-    return elem.classList.contains( c );
-  };
-  addClass = function( elem, c ) {
-    elem.classList.add( c );
-  };
-  removeClass = function( elem, c ) {
-    elem.classList.remove( c );
-  };
-}
-else {
-  hasClass = function( elem, c ) {
-    return classReg( c ).test( elem.className );
-  };
-  addClass = function( elem, c ) {
-    if ( !hasClass( elem, c ) ) {
-      elem.className = elem.className + ' ' + c;
-    }
-  };
-  removeClass = function( elem, c ) {
-    elem.className = elem.className.replace( classReg( c ), ' ' );
-  };
-}
-
-function toggleClass( elem, c ) {
-  var fn = hasClass( elem, c ) ? removeClass : addClass;
-  fn( elem, c );
-}
-
-var classie = {
-  // full names
-  hasClass: hasClass,
-  addClass: addClass,
-  removeClass: removeClass,
-  toggleClass: toggleClass,
-  // short names
-  has: hasClass,
-  add: addClass,
-  remove: removeClass,
-  toggle: toggleClass
-};
-
-// transport
-if ( typeof define === 'function' && define.amd ) {
-  // AMD
-  define( classie );
-} else {
-  // browser global
-  window.classie = classie;
-}
-
-})( window );
diff --git a/site/src/site/assets/js/vendor/sidebarEffects.js b/site/src/site/assets/js/vendor/sidebarEffects.js
deleted file mode 100644
index 5906710..0000000
--- a/site/src/site/assets/js/vendor/sidebarEffects.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- * sidebarEffects.js v1.0.0
- * http://www.codrops.com
- *
- * Licensed under the MIT license.
- * http://www.opensource.org/licenses/mit-license.php
- * 
- * Copyright 2013, Codrops
- * http://www.codrops.com
- */
- var SidebarMenuEffects = (function() {
-
- 	function hasParentClass( e, classname ) {
-		if(e === document) return false;
-		if( classie.has( e, classname ) ) {
-			return true;
-		}
-		return e.parentNode && hasParentClass( e.parentNode, classname );
-	}
-
-	// http://coveroverflow.com/a/11381730/989439
-	function mobilecheck() {
-		var check = false;
-		(function(a){if(/(android|ipad|playbook|silk|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera);
-		return check;
-	}
-
-	function init() {
-
-		var container = document.getElementById( 'st-container' ),
-			buttons = Array.prototype.slice.call( document.querySelectorAll( '.st-trigger' ) ),
-			// event type (if mobile use touch events)
-			eventtype = mobilecheck() ? 'touchstart' : 'click',
-			resetMenu = function() {
-				classie.remove( container, 'st-menu-open' );
-                $("html").removeClass('noScroll');
-			},
-			bodyClickFn = function(evt) {
-				if( !hasParentClass( evt.target, 'st-menu' ) ) {
-					resetMenu();
-					document.removeEventListener( eventtype, bodyClickFn );
-				}
-			};
-
-		buttons.forEach( function( el, i ) {
-			var effect = el.getAttribute( 'data-effect' );
-
-			el.addEventListener( eventtype, function( ev ) {
-				ev.stopPropagation();
-				ev.preventDefault();
-				container.className = 'st-container'; // clear
-				classie.add( container, effect );
-				setTimeout( function() {
-					classie.add( container, 'st-menu-open' );
-					$("html").addClass('noScroll');
-				}, 25 );
-				document.addEventListener( eventtype, bodyClickFn );
-			});
-		} );
-
-	}
-
-	init();
-
-})();
\ No newline at end of file
diff --git a/site/src/site/html/index.html b/site/src/site/html/index.html
deleted file mode 100644
index 970d45e..0000000
--- a/site/src/site/html/index.html
+++ /dev/null
@@ -1,68 +0,0 @@
-    <section class="row colset-2-its">
-        <h1>A multi-faceted language for the Java platform</h1>
-
-        <p>
-            <a href='http://www.apache.org/'>Apache</a> Groovy is a <strong>powerful</strong>, <strong>optionally typed</strong> and <strong>dynamic</strong>
-            language, with <strong>static-typing and static compilation</strong> capabilities, for the Java platform
-            aimed at improving developer productivity thanks to a concise, <strong>familiar and easy to learn
-            syntax</strong>. It integrates smoothly with any Java program, and immediately delivers to your application
-            powerful features, including scripting capabilities, <strong>Domain-Specific Language</strong> authoring,
-            runtime and compile-time <strong>meta-programming</strong> and <strong>functional</strong> programming.
-        </p>
-
-        <div class="col1">
-            <article>
-                <div class="icon icon-1"></div>
-                <h1>Flat learning curve</h1>
-
-                <p>Concise, readable and expressive syntax, easy to learn for Java developers</p>
-            </article>
-            <article>
-                <div class="icon icon-2"></div>
-                <h1>Smooth Java integration</h1>
-
-                <p>
-                    Seamlessly and transparently integrates and interoperates with Java and any third-party libraries
-                </p>
-            </article>
-            <article>
-                <div class="icon icon-6"></div>
-                <h1>Vibrant and rich ecosystem</h1>
-
-                <p>
-                    Web development, reactive applications, concurrency / asynchronous / parallelism library, test
-                    frameworks, build tools, code analysis, GUI building
-                </p>
-            </article>
-        </div>
-
-        <div class="col2">
-            <article>
-                <div class="icon icon-4"></div>
-                <h1>Powerful features</h1>
-
-                <p>
-                    Closures, builders, runtime &amp; compile-time meta-programming, functional programming, type
-                    inference, and static compilation
-                </p>
-            </article>
-            <article>
-                <div class="icon icon-5"></div>
-                <h1>Domain-Specific Languages</h1>
-
-                <p>
-                    Flexible &amp; malleable syntax, advanced integration &amp; customization mechanisms, to integrate
-                    readable business rules in your applications
-                </p>
-            </article>
-            <article>
-                <div class="icon icon-3"></div>
-                <h1>Scripting and testing glue</h1>
-
-                <p>
-                    Great for writing concise and maintainable tests, and for all your build and automation tasks
-                </p>
-            </article>
-        </div>
-    </section>
-    <hr class="row"/>
diff --git a/site/src/site/html/they-use-groovy.html b/site/src/site/html/they-use-groovy.html
deleted file mode 100644
index 69124ed..0000000
--- a/site/src/site/html/they-use-groovy.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<div id="they-use-groovy" class="orange-band">
-    <div class="row">
-        <div class="item">
-            <h1><strong>They all use Apache Groovy!</strong></h1>
-            <div id='logos-holder'>
-                <div class='logo' style='background-image:url(img/logos/netflix.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/amadeus.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/bestbuy.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/carfax.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/carriots.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/cisco.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/mutual-of-omaha.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/credit-suisse.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/airbusgroup.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/energy-transfer.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/epo.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/fanniemae.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/google.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/hypoport.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/ibm.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/jpmorganchase.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/linkedin.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/mastercard.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/mtv.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/commerzbank.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/national-cancer-institute.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/nestle.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/oracle.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/paterson-cancer-institute.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/roche.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/sas.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/sky.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/sony.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/smartthings.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/target.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/thales.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/ubs.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/vodafone.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/voyages-sncf.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/walmart.png)'></div>
-                <div class='logo' style='background-image:url(img/logos/wells-fargo.png)'></div>
-            </div>
-        </div>
-    </div>
-</div>
diff --git a/site/src/site/html/twittersearch.html b/site/src/site/html/twittersearch.html
deleted file mode 100644
index e4897de..0000000
--- a/site/src/site/html/twittersearch.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<a width="100%" height="450" class="twitter-timeline" href="https://twitter.com/groovylang" data-widget-id="484358291535851520" data-link-color="#db4800" data-screen-name="ApacheGroovy">Tweets by @ApacheGroovy</a>
-<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
diff --git a/site/src/site/includes/bottommenu.groovy b/site/src/site/includes/bottommenu.groovy
deleted file mode 100644
index 828f23a..0000000
--- a/site/src/site/includes/bottommenu.groovy
+++ /dev/null
@@ -1,29 +0,0 @@
-
-// footer
-footer(id: 'footer') {
-    div(class: 'row') {
-        div(class: 'colset-3-footer') {
-            menu.entrySet().eachWithIndex { entry, i ->
-                def (name, menu) = [entry.key, entry.value]
-                div(class: "col-${i+1}") {
-                    h1(name)
-                    ul {
-                        menu.each { menuItem ->
-                            li { a(href: relative(menuItem.link), menuItem.name) }
-                        }
-                    }
-                }
-            }
-            div(class: 'col-right') {
-                p {
-                    yield "The Groovy programming language is supported by the " 
-                    a href: 'http://www.apache.org', 'Apache Software Foundation'
-                    yield " and the Groovy community"
-                }
-                img(src: 'img/asf_logo.png', title: 'The Apache Software Foundation', alt: 'The Apache Software Foundation', class:'img-responsive')
-            }
-        }
-        div(class: 'clearfix', "&copy; 2003-${Calendar.instance[Calendar.YEAR]} the Apache Groovy project &mdash; " +
-                "Groovy is Open Source, ${$a(href: 'http://www.apache.org/licenses/LICENSE-2.0.html', 'Apache 2 License')}")
-    }
-}
diff --git a/site/src/site/includes/community-navbar.groovy b/site/src/site/includes/community-navbar.groovy
deleted file mode 100644
index 86a3474..0000000
--- a/site/src/site/includes/community-navbar.groovy
+++ /dev/null
@@ -1,22 +0,0 @@
-
-ul(class: 'nav-sidebar') {
-    [
-            'community': 'Community',
-            'contribute': 'Contribute',
-            'thanks': 'Thanks',
-            'mailing-lists': 'Mailing-lists',
-            'events': 'Events',
-            'usergroups': 'User groups',
-            'groovy-weekly': 'Groovy newsletter'
-    ].each { page, label ->
-        if (currentPage == page) {
-            li(class: 'active') { a(href: relative("${page}.html")) { strong(label) } }
-        } else {
-            li { a(href: "${page}.html", label) }
-        }
-    }
-    li { a(href: relative("groovy-weekly.html#subscribe"), class: 'anchor-link', 'Subscribe') }
-    li { a(href: relative("groovy-weekly.html#archives"), class: 'anchor-link', 'Archive') }
-}
-br()
-include unescaped: 'html/twittersearch.html'
diff --git a/site/src/site/includes/contribute-button.groovy b/site/src/site/includes/contribute-button.groovy
deleted file mode 100644
index 41729e8..0000000
--- a/site/src/site/includes/contribute-button.groovy
+++ /dev/null
@@ -1,7 +0,0 @@
-div(id: 'contribute-btn') {
-    button(type: 'button', class: 'btn btn-default',
-            onclick: "window.location.href=\"https://github.com/groovy/groovy-website/tree/master/site/src/site/pages/${currentPage}.groovy\"") {
-        i(class: 'fa fa-pencil-square-o') {}
-        yield ' Improve this doc'
-    }
-}
\ No newline at end of file
diff --git a/site/src/site/includes/topmenu.groovy b/site/src/site/includes/topmenu.groovy
deleted file mode 100644
index 2d5fc1d..0000000
--- a/site/src/site/includes/topmenu.groovy
+++ /dev/null
@@ -1,31 +0,0 @@
-div(class: 'navbar navbar-default navbar-static-top', role: 'navigation') {
-    div(class: 'container') {
-        div(class: 'navbar-header') {
-            button(type: 'button', class: 'navbar-toggle', 'data-toggle': 'collapse', 'data-target': '.navbar-collapse') {
-                span(class: 'sr-only') {}
-                span(class: 'icon-bar') {}
-                span(class: 'icon-bar') {}
-                span(class: 'icon-bar') {}
-            }
-            a(class: 'navbar-brand', href: relative('index.html')) {
-                i(class: 'fa fa-star') {}
-                yield ' Apache Groovy'
-            }
-        }
-        div(class: 'navbar-collapse collapse') {
-            ul(class: 'nav navbar-nav navbar-right') {
-                menu['Groovy'].each { menuItem ->
-                    li(class: category == menuItem.name ? 'active' : '') { a(href: relative(menuItem.link), menuItem.name) }
-                }
-                li {
-                    a('data-effect': 'st-effect-9', class: 'st-trigger', href: '#', 'Socialize')
-                }
-                li(class: (category == 'Search') ? 'active' : '') {
-                    a(href: relative('search.html')) {
-                        i(class: 'fa fa-search') {}
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/site/src/site/layouts/iframedoc.groovy b/site/src/site/layouts/iframedoc.groovy
deleted file mode 100644
index fb528fd..0000000
--- a/site/src/site/layouts/iframedoc.groovy
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- * This layout accepts the following parameters:
- *
- * @param menu the navigation menu
- * @param pageTitle the page title
- * @param extraStyles , a list of CSS files to be added in the header
- * @param scripts , a list of scripts to be imported
- * @param iframeTarget , the URL of the page to be included as an iframe
- */
-layout 'layouts/page.groovy', true,
-        mainContent: contents {
-            div {
-                include template: 'includes/topmenu.groovy'
-            }
-            iframe(class: 'doc-embed', frameborder: '0', height: '100%', width: '100%', src: iframeTarget) {}
-        }
diff --git a/site/src/site/layouts/main.groovy b/site/src/site/layouts/main.groovy
deleted file mode 100644
index 2f4626c..0000000
--- a/site/src/site/layouts/main.groovy
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * This layout accepts the following parameters:
- *
- * @param menu the navigation menu
- * @param pageTitle the page title
- * @param extraStyles , a list of CSS files to be added in the header
- * @param scripts , a list of scripts to be imported
- * @param extraFooter , a section to be added before closing body
- */
-layout 'layouts/page.groovy', true,
-        mainContent: contents {
-            // 'Content'
-            div {
-                include template: 'includes/topmenu.groovy'
-
-                // main contents goes here!
-                mainContent()
-
-                include template: 'includes/bottommenu.groovy'
-            }
-        }
diff --git a/site/src/site/layouts/page.groovy b/site/src/site/layouts/page.groovy
deleted file mode 100644
index bff19e9..0000000
--- a/site/src/site/layouts/page.groovy
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
- * This layout accepts the following parameters:
- *
- * @param pageTitle the page title
- * @param extraStyles , a list of CSS files to be added in the header
- * @param scripts , a list of scripts to be imported
- * @param contents the main page contents
- * @param extraFooter, a section to be added before closing body
- */
-
-// main layout
-yieldUnescaped '''<!DOCTYPE html>
-<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
-<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
-<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
-<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->'''
-
-head {
-    meta charset: 'utf-8'
-    meta 'http-equiv': 'X-UA-Compatible', content: 'IE=edge'
-    meta name: 'viewport', content: "width=device-width, initial-scale=1"
-    title(pageTitle)
-    link(href: relative("img/favicon.ico"), type: "image/x-ico", rel: "icon")
-    def styles = extraStyles ?: []
-    ['bootstrap.css', 'font-awesome.min.css', 'style.css', *styles].each {
-        link rel: 'stylesheet', type: 'text/css', href:
-                it.startsWith('http')?it:relative("css/$it")
-    }
-}
-
-body {
-    div(id: 'fork-me') {
-        a(href: 'https://github.com/apache/groovy') {
-            img(
-                    style: "position: fixed; top: -14px; right: -14px; border: 0; z-index: 100",
-                    src: 'https://camo.githubusercontent.com/365986a132ccd6a44c23a9169022c0b5c890c387/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f7265645f6161303030302e706e67', alt: 'Fork me on GitHub', 'data-canonical-src': 'https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png'
-            )
-        }
-    }
-
-    div(id: 'st-container', class: "st-container st-effect-9") {
-        nav(class: "st-menu st-effect-9", id: "menu-12") {
-            h2(class: "icon icon-lab", 'Socialize')
-            ul {
-                menu['Socialize'].each {
-                    def (text,url, style) = [it.name, it.link, it.style ]
-                    li {
-                        a(href: relative(url), class: 'icon') { yieldUnescaped "<span class='fa $style'></span> $text" }
-                    }
-                }
-            }
-        }
-
-        // 'content push wrapper'
-
-        div(class: 'st-pusher') {
-            div(class: 'st-content') {
-                div(class: 'st-content-inner') {
-                    yieldUnescaped '''<!--[if lt IE 7]>
-                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
-                <![endif]-->'''
-                    if (mainContent) {
-                        mainContent()
-                    }
-                }
-            }
-        }
-    }
-
-    def scripts = extraScripts ?: []
-    ['vendor/jquery-1.10.2.min.js', 'vendor/classie.js', 'vendor/bootstrap.js', 'vendor/sidebarEffects.js', 'vendor/modernizr-2.6.2.min.js','plugins.js', *scripts].each {
-        yieldUnescaped "<script src='${it.startsWith('http')?it:relative('js/'+it)}' defer></script>"
-    }
-
-    if (extraFooter) {
-        extraFooter()
-    }
-
-    script '''
-          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
-          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
-          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
-          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
-
-          ga('create', 'UA-257558-10', 'auto');
-          ga('send', 'pageview');
-    '''
-}
-
-yieldUnescaped '</html>'
\ No newline at end of file
diff --git a/site/src/site/pages/404.groovy b/site/src/site/pages/404.groovy
deleted file mode 100644
index 283d3b6..0000000
--- a/site/src/site/pages/404.groovy
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * Ths template is generating the 404 page
- */
-
-layout 'layouts/main.groovy', true,
-        pageTitle: 'The Apache Groovy programming language - 404',
-        mainContent: contents {
-            div(id: 'content', class: 'page-1') {
-                div(class: 'row') {
-                    div(class: 'row-fluid') {
-                        div(class: 'panel panel-danger') {
-                            div(class: 'panel-heading', 'Oops! The page you are looking for does not exist!')
-                            div(class: 'panel-body') {
-                                p 'We could not find the page you are looking for. Maybe you are looking for one of those?'
-                                ul {
-                                    li("The ${$a(href: latestDocURL('documentation'), 'reference documentation')} of the Groovy language.")
-                                    li("The latest ${$a(href: latestDocURL('api'), 'Javadocs')} of the language.")
-                                    li("The latest ${$a(href: latestDocURL('gapi'), 'Groovdocs')} of the language.")
-                                    li("Description of ${$a(href: latestDocURL('groovy-jdk'), 'the Groovy development kit APIs')}.")
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
diff --git a/site/src/site/pages/api.groovy b/site/src/site/pages/api.groovy
deleted file mode 100644
index ec42398..0000000
--- a/site/src/site/pages/api.groovy
+++ /dev/null
@@ -1,2 +0,0 @@
-layout 'layouts/iframedoc.groovy', true,
-        pageTitle: "The Apache Groovy programming language - Groovy Development Kit"
diff --git a/site/src/site/pages/buildstatus.groovy b/site/src/site/pages/buildstatus.groovy
deleted file mode 100644
index 3cf930c..0000000
--- a/site/src/site/pages/buildstatus.groovy
+++ /dev/null
@@ -1,77 +0,0 @@
-layout 'layouts/main.groovy', true,
-        pageTitle: 'The Apache Groovy programming language - Continuous integration',
-        mainContent: contents {
-            div(id: 'content', class: 'page-1') {
-                div(class: 'row') {
-                    div(class: 'row-fluid') {
-                        div(class: 'col-lg-3') {
-                            include template: 'includes/community-navbar.groovy'
-                        }
-
-                        div(class: 'col-lg-8 col-lg-pull-0') {
-                            include template: 'includes/contribute-button.groovy'
-                            h1 {
-                                i(class: 'fa fa-circle-o-notch') {}
-                                yield ' Continuous integration'
-                            }
-                            article {
-                                p """
-                                    Our ${
-                                    $a(href: 'http://ci.groovy-lang.org?guest=1', 'continuous integration server')
-                                },
-                                    sponsored by ${$a(href: 'http://www.jetbrains.com', 'JetBrains')},
-                                    builds Groovy against multiple JDK versions, as well as some projects from the community tested
-                                    against development versions of Groovy:
-                                """
-                                hr(class: 'divider')
-
-                                h2 'Groovy builds'
-
-                                def renderBuilds = { Map builds ->
-                                    table(class: 'table table-stripped') {
-                                        thead {
-                                            tr {
-                                                th('Build name')
-                                                th('Status')
-                                            }
-                                        }
-                                        tbody {
-                                            builds.each { name, ref ->
-                                                def (id, branch) = ref
-                                                tr {
-                                                    td(name)
-                                                    td {
-                                                        a(href: "http://ci.groovy-lang.org/viewType.html?buildTypeId=$id&branch=$branch&tab=buildTypeStatusDiv&guest=1") {
-                                                            img(src: """http://ci.groovy-lang.org:8111/app/rest/builds/buildType:(id:$id)${branch?",branch:$branch":''}/statusIcon""")
-                                                        }
-                                                    }
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-                                renderBuilds(['Groovy master, JDK 7': ['Groovy_Jdk7Build', 'master'],
-                                        'Groovy master, JDK 8': ['Groovy_Jdk8Build_2', 'master'],
-                                        'Groovy master, JDK 9': ['Groovy_Jdk9Build', 'master'],
-                                        'Groovy 2.4.X, JDK 6': ['Groovy_Jdk6Build', 'GROOVY_2_4_X'],
-                                        'Groovy 2.4.X, JDK 7': ['Groovy_Jdk7Build', 'GROOVY_2_4_X']
-                                        ])
-
-                                hr(class: 'divider')
-
-                                h2 'Community joint builds'
-                                renderBuilds(['Nextflow master, Groovy 2.4.X': ['JointBuilds_Nextflow_Groovy24xJointBuild', ''],
-                                              'Ratpack master, Groovy 2.4.X': ['JointBuilds_Ratpac_RatpackGroovy24x', '']
-                                ])
-
-                                p """
-                                    The Groovy development team is willing to test Groovy development versions against important
-                                    ecosystem projects. If you want your project to be added to the list, please contact
-                                    us on the ${$a(href:'mailing-lists.html','development mailing list')}.
-                                """
-                            }
-                        }
-                    }
-                }
-            }
-        }
diff --git a/site/src/site/pages/changelog.groovy b/site/src/site/pages/changelog.groovy
deleted file mode 100644
index dfbdf09..0000000
--- a/site/src/site/pages/changelog.groovy
+++ /dev/null
@@ -1,39 +0,0 @@
-layout 'layouts/main.groovy', true,
-        pageTitle: "The Apache Groovy programming language - Groovy $groovyVersion Changelog",
-        mainContent: contents {
-            def issueMap = issues.groupBy { it.type }
-            def issueTypes = issueMap.keySet().sort()
-
-            div(id: 'content', class: 'page-1') {
-                div(class: 'row') {
-                    div(class: 'row-fluid') {
-                        div(class: 'col-lg-3') {
-                            ul(class: 'nav-sidebar') {
-                                li(class:'active') {
-                                    a(href: '#changelog', "Changelog for Groovy $groovyVersion")
-                                }
-                                issueTypes.eachWithIndex { type, i ->
-                                    li { a(href: "#type$i", class: 'anchor-link', type) }
-                                }
-                            }
-                        }
-
-                        div(class: 'col-lg-8 col-lg-pull-0') {
-                            a(name:"changelog"){}
-                            h1("Changelog for Groovy $groovyVersion")
-                            issueTypes.eachWithIndex { type,i ->
-                                def list = issueMap[type]
-                                a(name:"type$i"){}
-                                h2("$type")
-                                ul {
-                                    list.each { issue ->
-                                        li("[${$a(href: 'https://issues.apache.org/jira/browse/' + issue.id, issue.id)}] - ${issue.description}")
-                                    }
-                                }
-
-                            }
-                        }
-                    }
-                }
-            }
-        }
diff --git a/site/src/site/pages/changelogs.groovy b/site/src/site/pages/changelogs.groovy
deleted file mode 100644
index 3d8cd8e..0000000
--- a/site/src/site/pages/changelogs.groovy
+++ /dev/null
@@ -1,43 +0,0 @@
-layout 'layouts/main.groovy', true,
-        pageTitle: "The Apache Groovy programming language - Changelogs",
-        mainContent: contents {
-            def majorize = { it.split(/\.|-/)[0..1].join('.')}
-
-            def major = versions.collect([] as Set) { majorize(it) }
-
-            div(id: 'content', class: 'page-1') {
-                div(class: 'row') {
-                    div(class: 'row-fluid') {
-                        div(class: 'col-lg-3') {
-                            ul(class: 'nav-sidebar') {
-                                li(class:'active') {
-                                    a(href: '#changelog', "Changelogs")
-                                }
-                                major.each { v ->
-                                    li { a(href: "#changelog$v", class: 'anchor-link', "Groovy $v") }
-                                }
-                            }
-                        }
-
-                        div(class: 'col-lg-8 col-lg-pull-0') {
-                            h1('Changelogs for Groovy')
-                            p 'Here you can find the changelogs for the past Groovy releases.'
-                            versions.groupBy { majorize(it) }.each {
-                                String mj = it.key
-                                List<String> minor = it.value
-                                a(name: "changelog$mj") {}
-                                h2("Groovy $mj")
-                                ul {
-                                    minor.each { v->
-                                        li {
-                                            yieldUnescaped "Changelog for "
-                                            a(href: "changelogs/changelog-${v}.html", "Groovy $v")
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
diff --git a/site/src/site/pages/community.groovy b/site/src/site/pages/community.groovy
deleted file mode 100644
index efb44ac..0000000
--- a/site/src/site/pages/community.groovy
+++ /dev/null
@@ -1,58 +0,0 @@
-layout 'layouts/main.groovy', true,
-        pageTitle: 'The Apache Groovy programming language - Community',
-        mainContent: contents {
-            div(id: 'content', class: 'page-1') {
-                div(class: 'row') {
-                    div(class: 'row-fluid') {
-                        div(class: 'col-lg-3') {
-                            include template: 'includes/community-navbar.groovy'
-                        }
-
-                        div(class: 'col-lg-8 col-lg-pull-0') {
-                            include template: 'includes/contribute-button.groovy'
-                            h1 {
-                                i(class: 'fa fa-users') {}
-                                yield ' Community'
-                            }
-                            article {
-                                p {
-                                    yield '''
-                                        Groovy would not be the successful Open Source project it is today,
-                                        without the help of its users, forming the base of a wider Groovy community
-                                        and '''
-                                    a(href: 'ecosystem.html', 'ecosystem')
-                                    yield ' of projects using Groovy.'
-                                }
-                                p 'In this section of the website, you can find useful links and information about: '
-                                ul {
-                                    li "how you can ${$a(href: 'contribute.html', 'contribute')} to the project, its codebase, its documentation,"
-                                    li "how to raise issues in our ${$a(href: 'contribute.html#reporting-issues', 'bug tracker')},"
-                                    li "how to interact with other Groovy users and developers through the ${$a(href: 'mailing-lists.html', 'mailing-lists')} or ${$a(href: 'https://groovycommunity.com/', 'Slack')}. The Slack channel is not endorsed by the Apache Software Foundation, It's run by Groovy enthusiasts in the community for casual conversations and Q&A. Official discussions must happen on the mailing lists only,"
-                                    li "the upcoming ${$a(href: 'events.html', 'events and conferences')} you might want to attend to learn more about Groovy and to share your experience with others,"
-                                    li "the list of ${$a(href: 'usergroups.html', 'user groups')} you can attend and where to meet other Groovy users."
-                                }
-                                p '''
-                                    If you click on the socialize link in the menu, you will also find other ways to interact
-                                    with the Groovy community, and follow the news around the ecosystem:
-                                '''
-                                ul {
-                                    li {
-                                        a(href: 'groovy-weekly.html', 'Groovy newsletter')
-                                        yieldUnescaped ' &mdash; links to articles, presentations, tweets, podcasts, etc.'
-                                    }
-                                    li {
-                                        a(href: 'https://google.com/+groovy', 'Google+ Groovy page')
-                                        yieldUnescaped ' &mdash; for sharing news and articles'
-                                    }
-                                    li {
-                                        a(href: 'http://bit.ly/g-community', 'Google+ Groovy community')
-                                        yieldUnescaped ' &mdash; for discussing and exchanging with other Groovy users'
-                                    }
-                                }
-                            }
-                            hr(class: 'divider')
-                        }
-                    }
-                }
-            }
-        }
diff --git a/site/src/site/pages/contribute.groovy b/site/src/site/pages/contribute.groovy
deleted file mode 100644
index 89eb478..0000000
--- a/site/src/site/pages/contribute.groovy
+++ /dev/null
@@ -1,197 +0,0 @@
-layout 'layouts/main.groovy', true,
-        pageTitle: 'The Apache Groovy programming language - Contribute',
-        mainContent: contents {
-            div(id: 'content', class: 'page-1') {
-                div(class: 'row') {
-                    div(class: 'row-fluid') {
-                        div(class: 'col-lg-3') {
-                            include template: 'includes/community-navbar.groovy'
-                        }
-
-                        div(class: 'col-lg-8 col-lg-pull-0') {
-                            include template: 'includes/contribute-button.groovy'
-                            h1 {
-                                i(class: 'fa fa-pencil-square-o') {}
-                                yield ' Contribute'
-                            }
-                            article {
-                                p '''
-                                    Would you like to help us make the Groovy programming language even better? 
-                                    There are many ways in which you can get involved, make a difference and help the Groovy development team to make Groovy even, well, groovier? 
-                                    We really appreciate and welcome contributions and you can help us by:
-
-                                '''
-                                ul {
-                                    li {
-                                        yield 'helping other users on the '
-                                        a(href: 'mailing-lists.html', 'mailing-lists')
-                                    }
-                                    li {
-                                        a(href: '#reporting-issues', 'reporting issues')
-                                        yield ' you encounter in our '
-                                        a(href: 'https://issues.apache.org/jira/browse/GROOVY', 'bug tracker')
-                                    }
-                                    li {
-                                        a(href: '#documenting', 'documenting')
-                                        yield ' various aspects of the language or its APIs'
-                                    }
-                                    li {
-                                        yield 'improving this '
-                                        a(href: 'https://github.com/groovy/groovy-website', 'website')
-                                    }
-                                    li 'covering the code base with more tests to avoid future regressions, '
-                                    li {
-                                        yield 'and of course, by '
-                                        a(href: '#code', 'contributing bug fixes or new features')
-                                    }
-                                }
-                                hr(class: 'divider')
-
-                                h2 'Discussing on the mailing-lists'
-                                p {
-                                    yield '''
-                                        If you encounter a problem, want to discuss a new feature,
-                                        share interesting findings, and more, then the '''
-                                    a(href: 'mailing-lists.html', 'mailing-lists')
-                                    yield ' are the place to go to start a conversation with the Groovy developers and other Groovy users.'
-                                }
-                                hr(class: 'divider')
-
-                                a(name: 'reporting-issues') {}
-                                h2 'Reporting issues'
-                                p {
-                                    yield 'The Groovy project is using the '
-                                    a(href: 'https://issues.apache.org/jira/browse/GROOVY/', 'JIRA bug tracker')
-                                    yield '''
-                                        to report and track issues, feature enhancements, and new features.
-                                        Be sure to be signed-up and logged-in, before proceeding.
-                                    '''
-                                }
-                                p {
-                                    button(type: 'button', class: 'btn btn-default', 'Report an issue',
-                                            onclick: 'window.location.href="https://issues.apache.org/jira/browse/GROOVY"')
-                                }
-
-                                hr(class: 'divider')
-
-                                a(name: 'documenting') {}
-                                h2 'Improving the documentation'
-                                p 'The documentation of the Groovy programming language comes in various forms:'
-                                ul {
-                                    li {
-                                        yield 'the '
-                                        a(href: 'single-page-documentation.html', 'reference documentation')
-                                        yield ' covering the language specification, the user guides, getting started, and more.'
-                                    }
-                                    li {
-                                        yield 'the '
-                                        a(href: 'api.html', 'GroovyDoc APIs')
-                                        yield ' documenting the classes of the Groovy code base'
-                                    }
-                                    li {
-                                        yield 'the '
-                                        a(href: 'gdk.html', 'Groovy GDK')
-                                        yield ' documentation, explaining how Groovy enriches the JDK APIs'
-                                    }
-                                    li {
-                                        yield 'this '
-                                        a(href: 'https://github.com/groovy/groovy-website', 'website')
-                                    }
-                                }
-                                p {
-                                    yield 'To contribute to the Groovy reference documentation, this '
-                                    a(href: 'http://blog.cacoethes.co.uk/groovyandgrails/contributing-to-the-groovy-documentation', 'blog post')
-                                    yield ' gives all the details on how you can work on that documentation.'
-                                }
-                                p {
-                                    yield 'All the above is stored in our code '
-                                    a(href: 'https://github.com/groovy', 'repositories on Github')
-                                    yield ', so having an account on Github would be ideal.'
-                                }
-                                p """
-                                    Contributing to this website is fairly easy, if you have a Github account already,
-                                    as you can click on the ${$em('Improve this doc')} buttons that you can see on all the pages of this website.
-                                    So don't hesitate to help us improve it, fix typos, broken language, clarify complicated sections,
-                                    add new material, etc.
-                                """
-                                p 'Please check the following section for more information on how to contribute to our codebase.'
-                                hr(class: 'divider')
-
-                                a(name: 'code') {}
-                                h2 'Contributing code'
-                                p {
-                                    yield '''
-                                        If you know the area you want to contribute to, this is great, but if you are looking for
-                                        some first contributions, the Groovy development team tries to maintain a '''
-                                    a(href: 'https://issues.apache.org/jira/secure/IssueNavigator%21executeAdvanced.jspa?jqlQuery=project%3DGROOVY+and+labels+%3D+contrib+AND+resolution%3DUnresolved&runQuery=true&clear=true', 'list of tickets')
-                                    yield '''
-                                        of possible easy contributions that could get you started on your journey
-                                        to become a Groovy committer. Just raise your hand on the Groovy developer '''
-                                    a(href: 'mailing-lists.html', 'mailing-list')
-                                    yield ''' to tell us about your desire to work on that ticket.'''
-                                }
-                                p '''
-                                    For more complicated tasks, the best approach is also to bring that to the attention of the Groovy developers,
-                                    so they can give you some guidance on how best to tackle a particular problem, discuss implementation ideas
-                                    and the semantics or scope of the proposed change.
-                                '''
-
-                                h3 'Cloning the code base'
-                                p {
-                                    yield 'To work on the Groovy code base, you should be proficient enough in '
-                                    a(href: 'http://git-scm.com/', 'git')
-                                    yield ' and you should have an account on '
-                                    a(href: 'https://github.com/', 'Github')
-                                    yield ' to be able to create '
-                                    a(href: 'https://help.github.com/articles/creating-a-pull-request', 'pull requests')
-                                    yield ' with your changes.'
-                                }
-                                p { 
-                                    yield 'Please fork '
-                                    a(href: 'https://github.com/apache/groovy', 'https://github.com/apache/groovy')
-                                    yield ' and create a local clone of your fork as explained in '
-                                    a(href: 'https://help.github.com/articles/fork-a-repo/', 'fork a repo')
-                                    yield '.'
-                                }
-                                p 'Make sure you configure Git appropriately with the same email that you registered with on Github:'
-                                pre { code 'git config --global user.name "YOUR NAME"\n' +
-                                        'git config --global user.email "YOUR EMAIL"' }
-                                p 'You can verify these are configured appropriately by running:'
-                                pre { code 'git config --list' }
-
-                                h3 'Working on the code base'
-                                p {
-                                    yield 'If you are working with the IntelliJ IDEA development environment, this '
-                                    a(href: 'http://melix.github.io/blog/2014/06/contribute-groovy-ide.html', 'screencast')
-                                    yield ' gives lots of details on how to setup your IDE.'
-                                }
-                                p {
-                                    yield 'Then, to work on the Groovy code base, to build and test Groovy, you can follow the '
-                                    a(href: 'https://github.com/apache/groovy/blob/master/README.adoc', 'instructions')
-                                    yield ' from the readme file in the Groovy repository.'
-                                }
-                                p 'The most important command you will have to run before sending your changes is the test command:'
-                                pre { code './gradlew test' }
-                                p 'For a successful contribution, all tests should be green!'
-
-                                h3 'Creating a pull request'
-                                p 'Once you are satisfied with your changes:'
-                                ul {
-                                    li 'commit your changes in your local branch'
-                                    li 'push your changes to your remote branch on Github'
-                                    li {
-                                        yield 'send us a '
-                                        a(href: 'https://help.github.com/articles/creating-a-pull-request', 'pull requests')
-                                    }
-                                }
-                            }
-                            hr(class: 'divider')
-
-                            h2('Build status')
-
-                            p "The Groovy sources are tested thanks to our ${$a(href:'buildstatus.html','continuous integration server')}."
-                        }
-                    }
-                }
-            }
-        }
diff --git a/site/src/site/pages/docpage.groovy b/site/src/site/pages/docpage.groovy
deleted file mode 100644
index b15e3df..0000000
--- a/site/src/site/pages/docpage.groovy
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * This layout accepts the following parameters:
- *
- * @param menu the navigation menu
- * @param pageTitle the page title
- * @param extraStyles , a list of CSS files to be added in the header
- * @param scripts , a list of scripts to be imported
- * @param iframeTarget , the URL of the page to be included as an iframe
- */
-layout 'layouts/main.groovy', true,
-        pageTitle: "The Apache Groovy programming language - $title",
-        extraStyles: ['docstyle.css','https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.css'],
-        extraFooter: contents {
-            script(src: 'https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js') {}
-            script { yieldUnescaped "document.addEventListener('DOMContentLoaded',prettyPrint)" }
-        },
-        mainContent: contents {
-            div(id: 'content', class: 'page-1') {
-                div(class: 'row') {
-                    div(class: 'row-fluid') {
-                        div(class: 'col-lg-3') {
-                            ul(class: 'nav-sidebar') {
-                                li(class: 'active') {
-                                    a(href: '#') { strong('Table of contents') }
-                                }
-                                yieldUnescaped page.toc
-                            }
-                        }
-
-                        div(class: 'col-lg-8 col-lg-pull-0') {
-                            h1(title)
-                            yieldUnescaped(page.content)
-                        }
-                    }
-                }
-            }
-        }
diff --git a/site/src/site/pages/documentation.groovy b/site/src/site/pages/documentation.groovy
deleted file mode 100644
index 08fd3af..0000000
--- a/site/src/site/pages/documentation.groovy
+++ /dev/null
@@ -1,79 +0,0 @@
-layout 'layouts/main.groovy', true,
-        pageTitle: 'The Apache Groovy programming language - Documentation',
-        mainContent: contents {
-            div(id: 'content', class: 'page-1') {
-                div(class: 'row') {
-                    div(class: 'row-fluid') {
-                        div(class: 'col-lg-3') {
-                            ul(class: 'nav-sidebar') {
-                                li(class: 'active') {
-                                    a(href: '#') { strong('Documentation') }
-                                }
-                                docSections.each { section ->
-                                    li { a(href: "#${section.anchor}", class: 'anchor-link', section.name) }
-                                }
-                                li {
-                                    a(href: "#all-versions", class: 'anchor-link', 'Documentation for other versions')
-                                }
-                                li {
-                                    a(href: 'faq.html', 'FAQ')
-                                }
-                            }
-                        }
-
-                        div(class: 'col-lg-8 col-lg-pull-0') {
-                            include template: 'includes/contribute-button.groovy'
-                            h1 {
-                                i(class: 'fa fa-university') {}
-                                yield ' Documentation'
-                            }
-                            p {
-                                yield 'The documentation is available as a '
-                                a(href: "single-page-documentation.html", 'single-page document')
-                                yield ', or feel free to pick at a direct section below.'
-                            }
-                            p "You can also browse ${$a(href: '#all-versions', 'documentation for other versions')}."
-                            hr(class: 'divider')
-
-                            // group sections by 2, for 2 columns
-                            def rows = docSections.collate(2)
-                            rows.each { row ->
-                                div(class: 'row-fluid') {
-                                    article {
-                                        row.each { section ->
-                                            div(class: 'col-md-6') {
-                                                a(name: section.anchor) {}
-                                                h2 {
-                                                    i(class: "fa ${section.icon}", " $section.name")
-                                                }
-                                                ul {
-                                                    section.getItems().each { item ->
-                                                        li { a(href: "${item.targetFilename}.html", item.name) }
-                                                    }
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-                            }
-                            div(class: 'col-md-12') {
-                                hr(class: 'divider')
-
-                                a(name: 'all-versions') {}
-                                article {
-                                    h2 'Documentation for all Groovy versions'
-                                    p 'You can browse the documentation of a particular version of Groovy (since Groovy 1.7):'
-                                    def allVersions =  [*allDocVersions, 'Select a version'].reverse()
-
-                                    select(class: 'form-control', onchange: "window.location.href='http://docs.groovy-lang.org/docs/groovy-' + this.value + '/html/'") {
-                                        allVersions.each { String version ->
-                                            option version
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
diff --git a/site/src/site/pages/download.groovy b/site/src/site/pages/download.groovy
deleted file mode 100644
index 28c4842..0000000
--- a/site/src/site/pages/download.groovy
+++ /dev/null
@@ -1,323 +0,0 @@
-layout 'layouts/main.groovy', true,
-        pageTitle: 'The Apache Groovy programming language - Download',
-        mainContent: contents {
-            div(id: 'content', class: 'page-1') {
-                div(class: 'row') {
-                    div(class: 'row-fluid') {
-                        div(class: 'col-lg-3') {
-                            ul(class: 'nav-sidebar') {
-                                li(class: 'active') {
-                                    a(href: 'download.html') { strong('Download Groovy') }
-                                }
-                                li {
-                                    a(href: '#distro', class: 'anchor-link', 'Distributions')
-                                }
-                                li {
-                                    a(href: '#sdkman', class: 'anchor-link', 'Through SDKMAN!')
-                                }
-                                li {
-                                    a(href: '#buildtools', class: 'anchor-link', 'From your build tools')
-                                }
-                                li {
-                                    a(href: '#otherways', class: 'anchor-link', 'Other ways to get Groovy')
-                                }
-                                li {
-                                    a(href: '#requirements', class: 'anchor-link', 'System requirements')
-                                }
-                                li {
-                                    a(href: 'versioning.html', 'Groovy version scheme')
-                                }
-                                li {
-                                    a(href: 'indy.html', 'Invoke dynamic support')
-                                }
-                                li {
-                                    a(href: 'releases.html', 'Release notes')
-                                }
-                            }
-                        }
-
-                        div(class: 'col-lg-8 col-lg-pull-0') {
-                            include template: 'includes/contribute-button.groovy'
-                            h1 {
-                                i(class: 'fa fa-cloud-download') {}
-                                yield ' Download'
-                            }
-                            def linkVersionToDownload = distributions.collect { it.packages }.flatten().find { it.stable }.version
-                            button(id: 'big-download-button', type: 'button', class: 'btn btn-default',
-                                    title: "Download Groovy ${linkVersionToDownload}",
-                                    onclick: "window.location.href=\"https://dl.bintray.com/groovy/maven/apache-groovy-sdk-${linkVersionToDownload}.zip\"") {
-                                i(class: 'fa fa-download') {}
-                                yield ' Download'
-                            }
-                            article {
-                                p {
-                                    yield 'In this download area, you will be able to download the '
-                                    a(href: '#distro', 'distribution')
-                                    yield ' (binary and source), the Windows installer (for some of the versions) and the documentation for Groovy.'
-                                }
-                                p {
-                                    yield 'All downloads (except the source download) are hosted in '
-                                    a(href: 'http://bintray.com/groovy/', 'Bintray\'s Groovy repository')
-                                    yield '. Registering on Bintray allows you to rate, review, and register for new version notifications.'
-                                    a(href: 'https://dl.bintray.com/groovy/maven/', '[direct link to the downloads]')
-                                }
-                                p {
-                                    yield 'For a quick and effortless start on Mac OSX, Linux or Cygwin, you can use '
-                                    a(href: 'http://sdkman.io/', 'SDKMAN! (The Software Development Kit Manager)')
-                                    yield ' to download and configure any Groovy version of your choice. Basic '
-                                    a(href: '#sdkman', 'instructions')
-                                    yield ' can be found below. '
-                                    br()
-                                    yield 'Windows users can use '
-                                    a(href: 'https://github.com/flofreud/posh-gvm', 'Posh-GVM')
-                                    yield ' (POwerSHell Groovy enVironment Manager), a PowerShell clone of the GVM CLI.'
-                                }
-                            }
-                            hr(class: 'divider')
-
-                            a(name: 'distro') {}
-                            article {
-                                h1 'Distributions'
-                                p 'You can download a binary, a source or a documentation bundle, as well as a bundle of all three.'
-
-                                distributions.each { dist ->
-                                    h2 {
-                                        i(class: 'fa fa-star') {}
-                                        yield " ${dist.name}"
-                                    }
-                                    if (dist.description) {
-                                        p {
-                                            dist.description.rehydrate(this, this, this)()
-                                        }
-                                    }
-                                    dist.packages.each { pkg ->
-                                        h3 "${pkg.version} distributions"
-                                        table(width: '100%', class: 'download-table') {
-                                            tr {
-                                                td {
-                                                    a(href: "https://dl.bintray.com/groovy/maven/apache-groovy-binary-${pkg.version}.zip") {
-                                                        i(class: 'fa fa-gears fa-4x') {}
-                                                        br()
-                                                        yield 'binary'
-                                                    }
-                                                }
-                                                td {
-                                                    a(href: "http://www.apache.org/dyn/closer.cgi/groovy/${pkg.version}/sources/apache-groovy-src-${pkg.version}.zip") {
-                                                        i(class: 'fa fa-code fa-4x') {}
-                                                        br()
-                                                        yield ' source'
-                                                    }
-                                                }
-                                                td {
-                                                    a(href: "https://dl.bintray.com/groovy/maven/apache-groovy-docs-${pkg.version}.zip") {
-                                                        i(class: 'fa fa-file-text fa-4x') {}
-                                                        br()
-                                                        yield ' documentation'
-                                                    }
-                                                }
-                                                td {
-                                                    a(href: "https://dl.bintray.com/groovy/maven/apache-groovy-sdk-${pkg.version}.zip") {
-                                                        i(class: 'fa fa-file-zip-o fa-4x') {}
-                                                        br()
-                                                        yield ' SDK bundle'
-                                                    }
-                                                }
-                                                if (pkg.windowsInstaller) {
-                                                    td {
-                                                        a(href: pkg.windowsInstaller) {
-                                                            i(class: 'fa fa-windows fa-4x') {}
-                                                            br()
-                                                            yield ' Windows installer'
-                                                        }
-                                                    }
-                                                }
-                                            }
-                                        }
-                                        p {
-                                            yield 'Please consult the '
-                                            a(href: "changelogs/changelog-${pkg.version}.html", ' change log')
-                                            yield ' for details. Please read the '
-                                            a(href: "indy.html", 'invoke dynamic support information')
-                                            yield ' if you like to use Groovy on JDK 7+.'
-                                        }
-                                    }
-                                }
-                                article {
-                                    h3 'Changelog'
-
-                                    p {
-                                        yield 'You can also read the changelogs for '
-                                        a(href: "changelogs.html", 'other versions')
-                                        yield '.'
-                                    }
-                                }
-                            }
-
-                            hr(class: 'divider')
-
-                            a(name: 'sdkman') {}
-                            article {
-                                h1 'SDKMAN! (The Software Development Kit Manager)'
-                                p {
-                                    yield 'This tool makes installing Groovy on any Bash platform (Mac OSX, Linux, Cygwin, Solaris or FreeBSD) very easy.'
-                                    br()
-                                    yield 'Simply open a new terminal and enter:'
-                                }
-                                pre { code '$ curl -s get.sdkman.io | bash' }
-                                p {
-                                    yield 'Follow the instructions on-screen to complete installation.'
-                                    br()
-                                    yield 'Open a new terminal or type the command:'
-                                }
-                                pre { code '$ source "$HOME/.sdkman/bin/sdkman-init.sh"' }
-                                p 'Then install the latest stable Groovy:'
-                                pre { code '$ sdk install groovy' }
-                                p 'After installation is complete and you\'ve made it your default version, test it with:'
-                                pre { code '$ groovy -version' }
-                                p 'That\'s all there is to it!'
-                            }
-                            hr(class: 'divider')
-
-                            a(name: 'buildtools') {}
-                            article {
-                                h1 'From your build tools'
-                                p 'If you wish to add Groovy as a dependency in your projects, you can refer to the Groovy JARs in the dependency section of your project build file descriptor:'
-                                table(class: 'table') {
-                                    thead {
-                                        tr {
-                                            th 'Gradle'
-                                            th 'Maven'
-                                            th 'Explanation'
-                                        }
-                                    }
-                                    tbody {
-                                        tr {
-                                            td {
-                                                code 'org.codehaus.groovy:groovy:x.y.z'
-                                            }
-                                            td {
-                                                code '&lt;groupId&gt;org.codehaus.groovy&lt;/groupId&gt;'
-                                                br()
-                                                code '&lt;artifactId&gt;groovy&lt;/artifactId&gt;'
-                                                br()
-                                                code '&lt;version&gt;x.y.z&lt;/version&gt;'
-                                            }
-                                            td 'Just the core of Groovy without the modules (see below). Also includes jarjar\'ed versions of Antlr, ASM, and Commons-CLI.'
-                                        }
-                                        tr {
-                                            td {
-                                                code 'org.codehaus.groovy:groovy-$module:x.y.z'
-                                            }
-                                            td {
-                                                code '&lt;groupId&gt;org.codehaus.groovy&lt;/groupId&gt;'
-                                                br()
-                                                code '&lt;artifactId&gt;groovy-$module&lt;/artifactId&gt;'
-                                                br()
-                                                code '&lt;version&gt;x.y.z&lt;/version&gt;'
-                                            }
-                                            td {
-                                                code '"$module"'
-                                                yield ' stands for the different optional groovy modules "ant", "bsf", "console", "docgenerator", "groovydoc", "groovysh", "jmx", "json", "jsr223", "nio", "servlet", "sql", "swing", "test", "templates", "testng" and "xml".'
-                                                br()
-                                                yield 'Example: '
-                                                code '&lt;artifactId&gt;groovy-sql&lt;/artifactId&gt;'
-                                            }
-                                        }
-                                        tr {
-                                            td {
-                                                code 'org.codehaus.groovy:groovy-all:x.y.z'
-                                            }
-                                            td {
-                                                code '&lt;groupId&gt;org.codehaus.groovy&lt;/groupId&gt;'
-                                                br()
-                                                code '&lt;artifactId&gt;groovy-all&lt;/artifactId&gt;'
-                                                br()
-                                                code '&lt;version&gt;x.y.z&lt;/version&gt;'
-                                            }
-                                            td 'The core plus all the modules. Also includes <em>jarjar\'ed</em> versions of Antlr, ASM, Commons-CLI.\n' +
-                                                    'Optional dependencies are marked as optional.\n' +
-                                                    'You may need to include some of the optional dependencies to use some features of Groovy, e.g. AntBuilder, GroovyMBeans...'
-                                        }
-                                    }
-                                }
-                                h3 'Maven repositories'
-                                p "Groovy releases are downloadable from ${$a(href:'http://repo1.maven.org/maven2/org/codehaus/groovy/','Maven Central')} or ${$a(href:'http://jcenter.bintray.com/org/codehaus/groovy/','JCenter')}."
-                                p "Groovy snapshots are downloadable from ${$a(href:'https://oss.jfrog.org/oss-snapshot-local/org/codehaus/groovy','JFrog OpenSource Snapshots repository')}."
-                            }
-                            hr(class: 'divider')
-
-                            a(name: 'otherways') {}
-                            article {
-                                h1 'Other ways to get Groovy'
-                                p {
-                                    yield 'If you\'re on MacOS and have '
-                                    a(href: 'http://brew.sh/', 'Homebrew')
-                                    yield ' installed, you can install Groovy with:'
-                                    pre { code 'brew install groovy' }
-                                    yield 'If you\'re on MacOS and have '
-                                    a(href: 'http://www.macports.org/', 'MacPorts')
-                                    yield ' installed, you can install Groovy with:'
-                                    pre { code 'sudo port install groovy' }
-                                    yield 'If you\'re using Docker, Groovy is available on '
-                                    a(href: 'https://hub.docker.com/_/groovy/', 'Docker Hub')
-                                    yield '.'
-                                    br()
-                                    yield 'If you prefer to live on the bleeding edge, you can also grab the '
-                                    a(href: 'https://github.com/apache/groovy', 'source code from GitHub')
-                                    yield '.'
-                                    br()
-                                    yield 'If you are an IDE user, you can just grab the latest '
-                                    a(href: 'ides.html', 'IDE plugin')
-                                    yield ' and follow the plugin installation instructions.'
-                                }
-                            }
-                            a(name: 'requirements') {}
-                            article {
-                                h1 'System requirements'
-                                p {
-                                    table(class: 'table') {
-                                        thead {
-                                            tr {
-                                                th 'Groovy'
-                                                th 'JVM Required (non-indy)'
-                                                th 'JVM Required (indy) *'
-                                            }
-                                        }
-                                        tbody {
-                                            tr {
-                                                td { b '2.5 - current' }
-                                                td '1.7+'
-                                                td '1.7+'
-                                            }
-                                            tr {
-                                                td { b '2.3 - 2.4' }
-                                                td '1.6+'
-                                                td '1.7+'
-                                            }
-                                            tr {
-                                                td { b '2.0 - 2.2' }
-                                                td '1.5+'
-                                                td '1.7+'
-                                            }
-                                            tr {
-                                                td { b '1.6 - 1.8' }
-                                                td '1.5+'
-                                                td 'N/A'
-                                            }
-                                            tr {
-                                                td { b '1.0 - 1.5' }
-                                                td '1.4+'
-                                                td 'N/A'
-                                            }
-                                        }
-                                    }
-                                    yield '* If you plan to use invoke dynamic support, please read the '
-                                    a(href: "indy.html", 'support information')
-                                    yield '.'
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
diff --git a/site/src/site/pages/ecosystem.groovy b/site/src/site/pages/ecosystem.groovy
deleted file mode 100644
index 18fda88..0000000
--- a/site/src/site/pages/ecosystem.groovy
+++ /dev/null
@@ -1,59 +0,0 @@
-layout 'layouts/main.groovy', true,
-        pageTitle: 'The Apache Groovy programming language - Ecosystem',
-        mainContent: contents {
-            div(id: 'content', class: 'page-1') {
-                section(class: 'row') {
-                    div(class: 'row-fluid') {
-                        div(class: 'col-lg-3') {
-                            ul(class: 'nav-sidebar') {
-                                li(class: 'active') { a(href: 'ecosystem.html') { strong('Ecosystem') } }
-                                ecosys.keySet().each { name ->
-                                    li { a(href: "#$name", class: 'anchor-link', name) }
-                                }
-                            }
-                        }
-                        div(class: 'col-lg-8 col-lg-pull-0') {
-                            include template: 'includes/contribute-button.groovy'
-                            h1 {
-                                i(class: 'fa fa-leaf') {}
-                                yield ' Ecosystem'
-                            }
-                            p {
-                                yield '''
-                                        Beside the language and its API, Groovy gave birth to a fruitful ecosystem of projects around it,
-                                        on various themes such as web frameworks, desktop application framework, concurrency, testing, and more.
-                                        In this section, we'll highlight a few of the most well-known and successful projects,
-                                        which leverage Groovy at their core.
-                            '''
-                            }
-                            hr(class: 'divider')
-
-                            ecosys.eachWithIndex { e, index ->
-                                def (name, item) = [e.key, e.value]
-                                article {
-                                    a(name: "${name}") {}
-                                    div(class:"content-heading clearfix media") {
-                                        div {
-                                            if (item.logo) {
-                                                img class: "pull-${(index % 2 == 0) ? 'left' : 'right'}", src: item.logo, alt: name, hspace: '20px'
-                                            } else {
-                                                h2(name)
-                                            }
-                                            p(item.description)
-                                        }
-                                        a(href: item.url, target:'_blank', "Learn more...")
-                                    }
-                                }
-                                hr(class: 'divider')
-                            }
-                            article {
-                                p """
-                                    There are of course many other projects using or built with the Groovy programming language.
-                                    For instance, you can find some more by having a look at the ${$a(href:'https://github.com/trending?l=groovy', 'trending Groovy projects')} on Github.
-                                """
-                            }
-                        }
-                    }
-                }
-            }
-        }
diff --git a/site/src/site/pages/events.groovy b/site/src/site/pages/events.groovy
deleted file mode 100644
index 071a86a..0000000
--- a/site/src/site/pages/events.groovy
+++ /dev/null
@@ -1,61 +0,0 @@
-import model.Event
-
-/**
- * This template is generating the events page.
- * If you want to add a new event, please edit the "allEvents" section in src/site/sitemap.groovy
- */
-
-layout 'layouts/main.groovy', true,
-        pageTitle: 'The Apache Groovy programming language - Events',
-        mainContent: contents {
-            div(id: 'content', class: 'page-1') {
-                div(class: 'row') {
-                    div(class: 'row-fluid') {
-                        div(class: 'col-lg-3') {
-                            include template: 'includes/community-navbar.groovy'
-                        }
-
-                        div(class: 'col-lg-8 col-lg-pull-0') {
-                            include template: 'includes/contribute-button.groovy'
-                            h1 {
-                                i(class: 'fa fa-calendar') {}
-                                yield ' Events'
-                            }
-                            article {
-                                p '''
-                                    Groovy and its ecosystem are often represented at various Java-oriented conferences,
-                                    but there are also events fully dedicated to the Groovy ecosystem.
-                                    Here are upcoming ones you might be interested in learning about.
-                                '''
-                                hr(class: 'divider')
-                                allEvents.each {
-                                    String eventName = it.key
-                                    Event event = it.value
-                                    div(class: 'event-logo') {
-                                        img(src: "${event.logo}", class:'event-logo', alt:"${eventName}")
-                                    }
-                                    h2 {
-                                        a(href: event.url, eventName)
-                                    }
-
-                                    h3 {
-                                        i(class: 'fa fa-globe') {}
-                                        yieldUnescaped " &nbsp;${event.location} &nbsp; &mdash; &nbsp; "
-                                        i(class: 'fa fa-calendar') {}
-                                        yieldUnescaped " &nbsp;"
-                                        em event.date
-                                    }
-                                    div {
-                                        yieldUnescaped event.description
-                                    }
-                                    hr(class: 'divider')
-                                }
-                            }
-
-                        }
-                    }
-                }
-            }
-        }
-
-
diff --git a/site/src/site/pages/faq.groovy b/site/src/site/pages/faq.groovy
deleted file mode 100644
index c69ae66..0000000
--- a/site/src/site/pages/faq.groovy
+++ /dev/null
@@ -1,52 +0,0 @@
-layout 'layouts/main.groovy', true,
-        pageTitle: 'The Apache Groovy programming language - FAQ - Frequently Asked Questions',
-        mainContent: contents {
-            div(id: 'content', class: 'page-1') {
-                div(class: 'row') {
-                    div(class: 'row-fluid') {
-                        div(class: 'col-lg-3') {
-                            ul(class: 'nav-sidebar') {
-                                li {
-                                    a(href: 'documentation.html', 'Documentation')
-                                }
-                                docSections.each { section ->
-                                    li { a(href: "documentation.html#${section.anchor}", class: 'anchor-link', section.name) }
-                                }
-                                li {
-                                    a(href: "documentation.html#all-versions", class: 'anchor-link', 'Documentation for other versions')
-                                }
-                                li(class: 'active') {
-                                    a(href: 'faq.html') { strong('FAQ') }
-                                }
-                            }
-                        }
-
-                        div(class: 'col-lg-8 col-lg-pull-0') {
-                            include template: 'includes/contribute-button.groovy'
-                            h1 {
-                                i(class: 'fa fa-question-circle') {}
-                                yieldUnescaped ' Frequently Asked Questions'
-                            }
-                            hr(class: 'divider')
-                            article {
-                                h2 'Is Groovy an Open Source project?'
-                                p {
-                                    yield 'Yes, Groovy is an Open Source programming language project, licensed under the '
-                                    a(href: 'http://www.apache.org/licenses/LICENSE-2.0', 'Apache License v2')
-                                    yield '. You can see the license header in all the source files of the project, as well as a '
-                                    a(href: 'https://github.com/apache/groovy/blob/master/LICENSE', 'license file')
-                                    yield ' at the root of the project'
-                                }
-
-                                h2 'What are the differences between Groovy and Java?'
-                                p {
-                                    yield 'Learn more about the '
-                                    a(href: 'differences.html', 'differences between Groovy and Java')
-                                    yield '.'
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
diff --git a/site/src/site/pages/gdk.groovy b/site/src/site/pages/gdk.groovy
deleted file mode 100644
index 8895762..0000000
--- a/site/src/site/pages/gdk.groovy
+++ /dev/null
@@ -1,2 +0,0 @@
-layout 'layouts/iframedoc.groovy', true,
-        pageTitle: "The Apache Groovy programming language - Groovy APIs"
diff --git a/site/src/site/pages/groovy-weekly.groovy b/site/src/site/pages/groovy-weekly.groovy
deleted file mode 100644
index 20d373a..0000000
--- a/site/src/site/pages/groovy-weekly.groovy
+++ /dev/null
@@ -1,103 +0,0 @@
-layout 'layouts/main.groovy', true,
-        pageTitle: 'The Apache Groovy programming language - Groovy newsletter',
-        mainContent: contents {
-            div(id: 'content', class: 'page-1') {
-                div(class: 'row') {
-                    div(class: 'row-fluid') {
-                        div(class: 'col-lg-3') {
-                            include template: 'includes/community-navbar.groovy'
-                        }
-
-                        div(class: 'col-lg-8 col-lg-pull-0') {
-                            include template: 'includes/contribute-button.groovy'
-                            h1 {
-                                i(class: 'fa fa-envelope-o') {}
-                                yield ' Groovy Newsletter '
-                            }
-                            article {
-                                p 'Once in a while, receive a newsletter, directly in your inbox, with all the news ' +
-                                        'of the Groovy ecosystem: the latest releases, interesting articles, interviews, ' +
-                                        'presentations, relevant tweets or Google+ posts, links to podcasts or screencasts, ' +
-                                        'code snippets, books, upcoming events, and more.'
-                                p 'The Groovy newsletter is the best way to stay up-to-date with all things Groovy!'
-                                p {
-                                    yield 'This newsletter is powered by '
-                                    a(href: "http://eepurl.com/XXyCD", 'MailChimp')
-                                    yield '.'
-                                }
-                            }
-                            hr(class: 'divider')
-
-                            a(name: 'subscribe') {}
-                            h2 {
-                                i(class: 'fa fa-envelope') {}
-                                yield ' Subscribe to the newsletter'
-                            }
-                            article {
-                                p 'To subscribe to the newsletter, please fill in the form below.'
-                                p 'Please note that all fields are required.'
-                            }
-                            div(id: 'mc_embed_signup') {
-                                form(action: 'http://appspot.us4.list-manage2.com/subscribe/post?u=cb8b56e9d6a1cb1696cecc673&amp;id=1a76961630',
-                                        method: 'post', id: 'mc-embedded-subscribe-form', name: 'mc-embedded-subscribe-form',
-                                        class: 'validate', target: '_blank', novalidate: true, role: 'form') {
-                                    div(class: 'form-group') {
-                                        label(for: 'mce-EMAIL', 'Email address')
-                                        input(type: 'email', value: '', class: 'required email form-control', id: 'mce-EMAIL')
-                                    }
-                                    div(class: 'form-group') {
-                                        label(for: 'mce-MNAME', 'First name')
-                                        input(type: 'text', value: '', class: 'required required email form-control', id: 'mce-FNAME')
-                                    }
-                                    div(class: 'form-group') {
-                                        label(for: 'mce-LNAME', 'Last name')
-                                        input(type: 'text', value: '', class: 'required required email form-control', id: 'mce-LNAME')
-                                    }
-                                    div(class: 'form-group') {
-                                        label(for: 'mce-COMPANY', 'Company')
-                                        input(type: 'text', value: '', class: 'required required email form-control', id: 'mce-COMPANY')
-                                    }
-                                    div(class: 'form-group radio') {
-                                        div {
-                                            strong 'Email format '
-                                        }
-                                        label(class: 'radio-inline') {
-                                            input(type: 'radio', value: 'html', name: 'EMAILTYPE', id: 'mce-EMAILTYPE-0', checked: 'checked')
-                                            span 'html'
-                                        }
-                                        label(class: 'radio-inline') {
-                                            input(type: 'radio', value: 'text', name: 'EMAILTYPE', id: 'mce-EMAILTYPE-1')
-                                            span 'text'
-                                        }
-                                    }
-                                    div(id: 'mce-responses', class: 'clear') {
-                                        div(class: 'response', id: 'mce-error-response', style: 'display-none') {}
-                                        div(class: 'response', id: 'mce-success-response', style: 'display-none') {}
-                                    }
-                                    div(style: 'position: absolute; left: -5000px') {
-                                        input(type: 'text', name: 'b_cb8b56e9d6a1cb1696cecc673_1a76961630', tabindex: '-1', value: '')
-                                    }
-                                    br()
-                                    div(class: 'clear form-group') {
-                                        input(type: 'submit', value: 'Subscribe', name: 'subscribe', id: 'mc-embedded-subscribe', class: 'btn btn-default')
-                                    }
-                                }
-                            }
-                            hr(class: 'divider')
-
-                            a(name: 'archives') {}
-                            h2 {
-                                i(class: 'fa fa-archive') {}
-                                yield ' Archives'
-                            }
-                            article {
-                                p {
-                                    a(href: 'http://us4.campaign-archive2.com/home/?u=cb8b56e9d6a1cb1696cecc673&id=1a76961630',
-                                            'View past editions of the Groovy newsletter.')
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
diff --git a/site/src/site/pages/index.groovy b/site/src/site/pages/index.groovy
deleted file mode 100644
index 5775562..0000000
--- a/site/src/site/pages/index.groovy
+++ /dev/null
@@ -1,44 +0,0 @@
-import model.Event
-
-layout 'layouts/main.groovy', true,
-        pageTitle: 'The Apache Groovy programming language',
-        mainContent: contents {
-            div(id: 'band', class: 'band') {
-
-            }
-            div(id: 'content') {
-                include unescaped: 'html/index.html'
-
-                def firstTreeEvents = allEvents.keySet().take(3)
-                section(class: 'row colset-3-article first-event-row') {
-                    h1 { strong "Groovy and Grails events you shouldn't miss!" }
-                    firstTreeEvents.each { String eventName ->
-                        Event event = allEvents[eventName]
-                        article {
-                            div(class: 'content') {
-                                // Note that the event image should be 257x180 to look nice
-                                div(class: 'event-img', style: "background-image: url(${event.logo})") {}
-                                h1 {
-                                    a(href: event.url) {
-                                        strong eventName
-                                        br()
-                                        em event.location
-                                    }
-                                }
-                                time event.date
-                                yieldUnescaped event.description
-                            }
-                        }
-                    }
-                }
-                section(class: 'row  last-event-row') {
-                    p(class: 'text-center') {
-                        yield "For more events see the "
-                        a(href: relative("events.html")) { strong('Events') }
-                        yield " page"
-                    }
-                }
-
-            }
-            include unescaped: 'html/they-use-groovy.html'
-        }
diff --git a/site/src/site/pages/indy.groovy b/site/src/site/pages/indy.groovy
deleted file mode 100644
index 2d3aedc..0000000
--- a/site/src/site/pages/indy.groovy
+++ /dev/null
@@ -1,174 +0,0 @@
-layout 'layouts/main.groovy', true,
-        pageTitle: 'The Apache Groovy programming language - Versioning',
-        mainContent: contents {
-            div(id: 'content', class: 'page-1') {
-                div(class: 'row') {
-                    div(class: 'row-fluid') {
-                        div(class: 'col-lg-3') {
-                            ul(class: 'nav-sidebar') {
-                                li {
-                                    a(href: 'download.html', 'Download Groovy')
-                                }
-                                li {
-                                    a(href: 'download.html#distro', class: 'anchor-link', 'Distributions')
-                                }
-                                li {
-                                    a(href: 'download.html#sdkman', class: 'anchor-link', 'Through SDKMAN!')
-                                }
-                                li {
-                                    a(href: 'download.html#buildtools', class: 'anchor-link', 'From your build tools')
-                                }
-                                li {
-                                    a(href: 'download.html#otherways', class: 'anchor-link', 'Other ways to get Groovy')
-                                }
-                                li {
-                                    a(href: 'versioning.html', 'Groovy version scheme')
-                                }
-                                li(class: 'active') {
-                                    a(href: 'indy.html') {
-                                        strong 'Invoke dynamic support'
-                                    }
-                                }
-                            }
-                        }
-
-                        div(class: 'col-lg-8 col-lg-pull-0') {
-                            include template: 'includes/contribute-button.groovy'
-                            h1 {
-                                i(class: 'fa fa-gear') {}
-                                yield ' Invoke dynamic support'
-                            }
-                            article {
-                                h2 'Introduction'
-                                p '''
-                                    Since Groovy 2.0, we added support for the JVM invokedynamic instruction.
-                                    This instruction is supported since Java 7 and is a new bytecode instruction in the JVM
-                                    that allows easier implementation of dynamic languages.
-                                    This instruction is used internally, by the JVM, for the lambda support in Java 8.
-                                '''
-                                p '''
-                                    This means that unlike APIs, AST transformations or syntactic sugar,
-                                    this feature is not visible to the developer or the end user.
-                                    It is a compilation and runtime feature only.
-                                    This means that given two programs written in Groovy,
-                                    you have the choice to compile it with or without invokedynamic support.
-                                    Whatever you choose, it comes with pros and cons.
-                                '''
-                                ul {
-                                    li {
-                                        yield 'classes compiled with invokedynamic can only be used on JDK 1.7+'
-                                        ul {
-                                            li 'without invokedynamic, Groovy classes are still compatible with JDK 1.5+'
-                                        }
-                                    }
-                                    li 'call site caching, as implemented in "normal" Groovy is replaced with invokedynamic since Groovy 2.1'
-                                    li 'it is possible to mix classes compiled with and without invokedynamic in the same project, as long as you run JDK 1.7+'
-                                    li 'depending on the JVM (even different minor versions of the JVM), you can target close to Java performance for dynamic Groovy with invokedynamic support activated'
-                                }
-
-                                h2 'JDK version'
-                                p '''
-                                    All JDK 7 versions ranging from 7u21 to 7u55 are buggy with regards to invokedynamic.
-                                    If you plan to use invokedynamic support, make sure you either use 7u60 or JDK 8.
-                                '''
-
-                                h2 'The distributions'
-                                h3 'Two JARs'
-                                p 'The Groovy distribution comes with two jars:'
-                                ul {
-                                    li {
-                                        code 'groovy-x.y.z.jar'
-                                        yield ': compatible with JDK 1.5+, makes use of call site caching'
-                                    }
-                                    li {
-                                        code 'groovy-x-y-z-indy.jar'
-                                        yield ': compatible with JDK 1.7+ only, has invokedynamic support bundled, old call site caching still possible'
-                                    }
-                                }
-                                p '''
-                                    The first jar is Groovy compiled without invokedynamic support, while the second one has invokedynamic support bundled.
-                                    As Groovy core and the groovy modules are sometimes written in Groovy, we currently have no choice but issuing two distinct versions of Groovy.
-                                    This means that if you pick the "normal" jar, the groovy classes of groovy itself are compiled with call site caching (1.5+),
-                                    while if you use the "indy" jar, the groovy classes of groovy itself are compiled using invokedynamic.
-                                    This means that the invokedynamic version of Groovy doesn't make use of the old call site caching mechanism.
-                                '''
-                                p 'Both jars contain a fully working groovy implementation. They are mutually exclusive (don\'t put both on classpath).'
-
-                                h3 'Command-line and indy'
-                                p '''
-                                    If you download the distribution and that you use the command line,
-                                    it's always the "normal" version of Groovy which is picked up in classpath.
-                                    This means that whatever command you use (groovy, groovyc, groovysh or groovyConsole), invokedynamic support is not available out of the box.
-                                    To use the invokedynamic version, you have to switch the jars manually.
-                                    The distribution makes use of the jars in the lib directory, while the indy jars are available in the indy directory.
-                                    You have three things to do:
-                                '''
-                                ul {
-                                    li 'remove or rename the groovy-*.jar files in the lib directory'
-                                    li 'replace them with the indy version from the indy directory'
-                                    li 'remove the -indy classifier from jar names'
-                                }
-                                p "Here's a bash script that would do it all at once:"
-                                pre { code '$ for f in `ls lib/groovy*.jar | cut -d/ -f2`;do k=`basename $f .jar`; mv lib/$k.jar lib/$k.jar.old; cp indy/$k-indy.jar lib/$k.jar ; done' }
-
-                                h3 'Running groovy script from command line'
-                                p '''
-                                    The usual way to run a script from the command line is by "groovy foo.groovy", where foo.groovy is the groovy program in source form.
-                                    To use indy for this you have to use the indy distribution and "groovy --indy foo.groovy".
-                                    Doing this without the indy distribution will result in an error message.
-                                '''
-
-                                h3 'The compilation flag'
-                                p '''
-                                    Independently of the jar version that you use (and after having exchanged the jars as described), invokedynamic support requires a specific compilation flag (indy).
-                                    If you want to compile your classes with invokedynamic support, this flag must be set at compile time.
-                                    The following tables show you what happens with user compiled classes and groovy core classes depending on the jar you use and the compilation flag:
-                                '''
-                                p 'For user compiled classes:'
-                                table(class: 'table') {
-                                    tr {
-                                        th 'indy flag'
-                                        th 'off'
-                                        th 'on'
-                                    }
-                                    tr {
-                                        td 'normal jar'
-                                        td 'call site caching'
-                                        td 'N/A'
-                                    }
-                                    tr {
-                                        td 'indy jar'
-                                        td 'call site caching'
-                                        td 'invokedynamic'
-                                    }
-                                }
-
-                                p 'For core Groovy classes:'
-                                table(class: 'table') {
-                                    tr {
-                                        th 'indy flag'
-                                        th 'off'
-                                        th 'on'
-                                    }
-                                    tr {
-                                        td 'normal jar'
-                                        td 'call site caching'
-                                        td 'N/A'
-                                    }
-                                    tr {
-                                        td 'indy jar'
-                                        td 'invokedynamic'
-                                        td 'invokedynamic'
-                                    }
-                                }
-                                p '''
-                                    So even if you use the indy jar, if you don't use the invokedynamic flag at compile time,
-                                    then the compiled classes will use the "old" format, meaning they will use the JDK1.5+ classes without invokedynamic.
-                                '''
-                            }
-                            hr(class: 'divider')
-                        }
-                    }
-                }
-            }
-        }
diff --git a/site/src/site/pages/learn.groovy b/site/src/site/pages/learn.groovy
deleted file mode 100644
index 70858ce..0000000
--- a/site/src/site/pages/learn.groovy
+++ /dev/null
@@ -1,193 +0,0 @@
-import model.Book
-import model.Video
-import model.Course
-
-layout 'layouts/main.groovy', true,
-        pageTitle: 'The Apache Groovy programming language - Learn',
-        extraStyles: ['book.css'],
-        mainContent: contents {
-            div(id: 'content', class: 'page-1') {
-                div(class: 'row') {
-                    div(class: 'row-fluid') {
-                        div(class: 'col-lg-3') {
-                            ul(class: 'nav-sidebar') {
-                                li(class: 'active') {
-                                    a(href: '#') { strong('Learn') }
-                                }
-                                li {
-                                    a(href: '#books', class: 'anchor-link', 'Books')
-                                }
-                                li {
-                                    a(href: '#videos', class: 'anchor-link', 'Presentations')
-                                }
-                                li {
-                                    a(href: '#courses', class: 'anchor-link', 'Courses')
-                                }
-                            }
-                        }
-
-                        div(class: 'col-lg-8 col-lg-pull-0') {
-                            include template: 'includes/contribute-button.groovy'
-                            h1 {
-                                i(class: 'fa fa-graduation-cap') {}
-                                yield ' Learn'
-                            }
-                            article {
-                                p 'Welcome to the learning section of the Groovy website.'
-                                p """
-                                    First of all, you will need to ${$a(href: 'documentation.html#gettingstarted', 'get started')}
-                                    by installing Groovy on your system or project.
-                                """
-                                p """
-                                    Once all set up, we invite you to have a look at the Groovy
-                                    ${$a(href: 'documentation.html', 'documentation')}, which explains all the
-                                    ${$a(href: 'documentation.html#languagespecification', 'details of the language')}, such as how to use the
-                                    ${$a(href: 'documentation.html#tools', 'tools')}
-                                    that come with a Groovy installation, and how to tackle more complex tasks with the various
-                                    ${$a(href: 'documentation.html#groovymoduleguides', 'module user guides')}.
-                                """
-                                p """
-                                    But there are other ways to learn more about Groovy, thanks to ${$a(href: '#books', 'books')}
-                                    and ${$a(href: '#videos', 'presentations')} given about Groovy at conferences.
-                                """
-                                hr(class: 'divider')
-
-                                a(name: 'books') {}
-                                h2 {
-                                    i(class: 'fa fa-book') {}
-                                    yield ' Books'
-                                }
-                                p '''
-                                    Another great approach to learning Groovy is to read the various books published
-                                    on the language:'''
-
-                                allBooks.each {
-                                    String title = it.key
-                                    Book book = it.value
-
-                                    figure(class: 'book') {
-                                        ul(class: 'hardcover_front') {
-                                            li {
-                                                img(src: book.cover, width: '100%', height: '100%')
-                                            }
-                                            li {}
-                                        }
-                                        ul(class: 'page') {
-                                            li {}
-                                            li {
-                                                a(class: 'book-btn', href: book.url, target: '_blank', 'More info')
-                                            }
-                                            3.times { li {} }
-                                        }
-                                        ul(class: 'hardcover_back') {
-                                            2.times { li {} }
-                                        }
-                                        ul(class: 'book_spine') {
-                                            2.times { li {} }
-                                        }
-                                        figcaption {
-                                            h1 { a(href: book.url, book.title) }
-                                            span "By ${book.authors}"
-                                            p book.description
-                                        }
-                                    }
-                                }
-
-                                hr(class: 'divider')
-
-                                a(name: 'videos') {}
-                                h2 {
-                                    i(class: 'fa fa-film') {}
-                                    yield ' Presentations'
-                                }
-                                p """
-                                    Many Groovy-related presentations have been recorded at ${$a(href: 'events.html', 'conferences')}
-                                    that you might wish to have a look at, to learn more about Groovy, delve into particular topics, and more.
-                                """
-                                p """
-                                    Below are a few selected presentations given at the
-                                    ${$a(href: 'http://springone2gx.com/', 'SpringOne2GX')},
-                                    ${$a(href: 'http://gr8conf.eu/', 'GR8Conf')} and
-                                    ${$a(href: 'http://greach.es/', 'Greach')} conferences.
-                                """
-
-                                videos.each { Video video ->
-                                    div(class: 'presentations') {
-                                        a(href: video.videoUrl) {
-                                            img(class: 'screenshot', src: "img/videos/${video.pictureUrl}")
-                                        }
-                                        div(class: 'metadata') {
-                                            a(href: video.videoUrl) {
-                                                h1(class: 'title', video.title)
-                                            }
-                                            span(class: 'speaker', "By ${video.speaker}")
-                                            if(video.slidesUrl || video.codeUrl) {
-                                                p(class: 'urls') {
-                                                    if (video.slidesUrl) {
-                                                        i(class: 'fa fa-photo') {}
-                                                        yield ' '
-                                                        a(href: video.slidesUrl, 'slides')
-                                                    }
-                                                    if (video.slidesUrl && video.codeUrl) yield ' | '
-                                                    if (video.codeUrl) {
-                                                        i(class: 'fa fa-code') {}
-                                                        yield ' '
-                                                        a(href: video.codeUrl, 'source code')
-                                                    }
-                                                }
-                                            }
-                                            div(class: 'summary') {
-                                                yieldUnescaped video.summary
-                                            }
-                                        }
-                                    }
-                                }
-
-                                p "You can find more presentations:"
-                                ul {
-                                    li {
-                                        a(href: 'https://www.youtube.com/channel/UCJXNOMywewNmau4hzAy4LjA/videos', 'GR8Conf YouTube channel')
-                                    }
-                                    li {
-                                        a(href: 'https://www.youtube.com/user/GR8ConfUS/videos', 'GR8Conf US YouTube channel')
-                                    }
-                                    li {
-                                        a(href: 'https://www.youtube.com/user/TheGreachChannel/videos', 'Greach YouTube channel')
-                                    }
-                                }
-
-                                hr(class: 'divider')
-
-                                a(name: 'courses') {}
-                                h2 {
-                                    i(class: 'fa fa-film') {}
-                                    yield ' Courses'
-                                }
-                                p '''
-                                    Another great resource for learning Groovy is by watching a course. You could spend time hunting down
-                                    various videos on the web but these courses have all the information you need packed into one place.
-                                  '''
-
-                                courses.each { Course course ->
-                                    div(class: 'courses') {
-                                        a(href: course.url, target: "_blank") {
-                                            img(class: 'screenshot', src: "img/courses/${course.cover}")
-                                        }
-                                        div(class: 'metadata') {
-                                            a(href: course.url, target: '_blank') {
-                                                h1(class: 'title', course.title)
-                                            }
-                                            span(class: 'instructor', "By ${course.instructor}")
-                                            div(class: 'description') {
-                                                yieldUnescaped course.description
-                                            }
-                                        }
-                                    }
-                                }
-
-                            }
-                        }
-                    }
-                }
-            }
-        }
diff --git a/site/src/site/pages/mailing-lists.groovy b/site/src/site/pages/mailing-lists.groovy
deleted file mode 100644
index d22d906..0000000
--- a/site/src/site/pages/mailing-lists.groovy
+++ /dev/null
@@ -1,76 +0,0 @@
-layout 'layouts/main.groovy', true,
-        pageTitle: 'The Apache Groovy programming language - Mailing-lists',
-        mainContent: contents {
-            div(id: 'content', class: 'page-1') {
-                div(class: 'row') {
-                    div(class: 'row-fluid') {
-                        div(class: 'col-lg-3') {
-                            include template: 'includes/community-navbar.groovy'
-                        }
-
-                        div(class: 'col-lg-8 col-lg-pull-0') {
-                            include template: 'includes/contribute-button.groovy'
-                            h1 {
-                                i(class: 'fa fa-envelope-o') {}
-                                yield ' Mailing-lists'
-                            }
-                            p '''The Groovy mailing-lists is the main means of interaction with the Groovy developers and Groovy users.'''
-                            hr(class: 'divider')
-
-                            article {
-                                h1 'Available lists'
-                                table(class: 'table') {
-                                    tr {
-                                        td {
-                                            strong 'users@groovy.apache.org'
-                                        }
-                                        td 'high volume list for questions and general discussion about Groovy'
-                                        td { a(href: 'mailto:users-subscribe@groovy.apache.org', 'Subscribe') }
-                                        td { a(href: 'http://mail-archives.apache.org/mod_mbox/groovy-users/', 'Archive') }
-                                        td { a(href: 'mailto:users-unsubscribe@groovy.apache.org', 'Unsubscribe') }
-                                    }
-                                    tr {
-                                        td {
-                                            strong 'dev@groovy.apache.org'
-                                        }
-                                        td 'medium volume list useful for those interested in ongoing developments'
-                                        td { a(href: 'mailto:dev-subscribe@groovy.apache.org', 'Subscribe') }
-                                        td { a(href: 'http://mail-archives.apache.org/mod_mbox/groovy-dev/', 'Archive') }
-                                        td { a(href: 'mailto:dev-unsubscribe@groovy.apache.org', 'Unsubscribe') }
-                                    }
-                                    tr {
-                                        td {
-                                            strong 'commits@groovy.apache.org'
-                                        }
-                                        td 'medium volume list that logs commits'
-                                        td { a(href: 'mailto:commits-subscribe@groovy.apache.org', 'Subscribe') }
-                                        td { a(href: 'http://mail-archives.apache.org/mod_mbox/groovy-commits/', 'Archive') }
-                                        td { a(href: 'mailto:commits-unsubscribe@groovy.apache.org', 'Unsubscribe') }
-                                    }
-                                    tr {
-                                        td {
-                                            strong 'notifications@groovy.apache.org'
-                                        }
-                                        td 'high volume list for JIRA and Github notifications'
-                                        td { a(href: 'mailto:notifications-subscribe@groovy.apache.org', 'Subscribe') }
-                                        td { a(href: 'http://mail-archives.apache.org/mod_mbox/groovy-notifications/', 'Archive') }
-                                        td { a(href: 'mailto:notifications-unsubscribe@groovy.apache.org', 'Unsubscribe') }
-                                    }
-                                }
-                                hr(class: 'divider')
-
-                                h2 'Mailing-lists archive on Nabble'
-                                p """
-                                    The mailing-lists are archived on ${$a(href: 'http://www.nabble.com/', 'Nabble')}.
-                                    Below you can see the archives of the lists.
-                                    Even if you can post messages to the mailing-lists through Nabble,
-                                    you first need to be registered to the Apache Groovy mailing-lists!
-                                """
-                                a(id: 'nabblelink', href: 'http://groovy.329449.n5.nabble.com/', 'Nabble forum')
-                                script(src: 'http://groovy.329449.n5.nabble.com/embed/f329449') {}
-                            }
-                        }
-                    }
-                }
-            }
-        }
diff --git a/site/src/site/pages/release-notes.groovy b/site/src/site/pages/release-notes.groovy
deleted file mode 100644
index d5f2447..0000000
--- a/site/src/site/pages/release-notes.groovy
+++ /dev/null
@@ -1,48 +0,0 @@
-import generator.DocUtils
-
-modelTypes = {
-    String groovyVersion
-    String notes
-}
-
-layout 'layouts/main.groovy', true,
-        pageTitle: "The Apache Groovy programming language - Groovy $groovyVersion release notes",
-        extraStyles: ['https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.css'],
-        extraFooter: contents {
-            script(src:'https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js') { }
-            script { yieldUnescaped "document.addEventListener('DOMContentLoaded',prettyPrint)" }
-        },
-        mainContent: contents {
-            Map options = [attributes:[DOCS_BASEURL:DocUtils.DOCS_BASEURL]]
-            def notesAsHTML = asciidocText(notes,options)
-            def matcher = notesAsHTML =~ /<h2 id="(.+?)">(.+?)<\/h2>/
-            def sections = [:]
-            while (matcher.find()) {
-                sections[matcher.group(1)] = matcher.group(2)
-            }
-
-            div(id: 'content', class: 'page-1') {
-                div(class: 'row') {
-                    div(class: 'row-fluid') {
-                        div(class: 'col-lg-3') {
-                            ul(class: 'nav-sidebar') {
-                                li(class:'active') {
-                                    a(href: '#releasenotes', "Release notes for Groovy $groovyVersion")
-                                }
-                                sections.each { k,v ->
-                                    li {
-                                        a(href:"#$k", class: 'anchor-link', v)
-                                    }
-                                }
-                            }
-                        }
-
-                        div(class: 'col-lg-8 col-lg-pull-0') {
-                            a(name:"releasenotes"){}
-                            h1("Release notes for Groovy $groovyVersion")
-                            yieldUnescaped notesAsHTML
-                        }
-                    }
-                }
-            }
-        }
diff --git a/site/src/site/pages/releases.groovy b/site/src/site/pages/releases.groovy
deleted file mode 100644
index bf6abfa..0000000
--- a/site/src/site/pages/releases.groovy
+++ /dev/null
@@ -1,36 +0,0 @@
-layout 'layouts/main.groovy', true,
-        pageTitle: "The Apache Groovy programming language - Release notes",
-        mainContent: contents {
-
-            div(id: 'content', class: 'page-1') {
-                div(class: 'row') {
-                    div(class: 'row-fluid') {
-                        div(class: 'col-lg-3') {
-                            ul(class: 'nav-sidebar') {
-                                li(class: 'active') {
-                                    a(href: '#notes', "Release notes")
-                                }
-                                versions.each { v ->
-                                    li { a(href: "#notes$v", class: 'anchor-link', "Groovy $v") }
-                                }
-                            }
-                        }
-
-                        div(class: 'col-lg-8 col-lg-pull-0') {
-                            h1('Release notes for Groovy')
-                            p '''Here you can find the release notes for the past Groovy releases, describing
-thoroughly what are the novelties and bug fixes of each version.'''
-                            ul {
-                                versions.each { mj ->
-                                    li {
-                                        a(name: "notes$mj") {}
-                                        yieldUnescaped "Release notes for "
-                                        a(href: "releasenotes/groovy-${mj}.html", "Groovy $mj")
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
diff --git a/site/src/site/pages/search.groovy b/site/src/site/pages/search.groovy
deleted file mode 100644
index 6a6d061..0000000
--- a/site/src/site/pages/search.groovy
+++ /dev/null
@@ -1,113 +0,0 @@
-layout 'layouts/main.groovy', true,
-        pageTitle: 'The Apache Groovy programming language - Search',
-        mainContent: contents {
-            div(id: 'content', class: 'page-1') {
-                div(class: 'row') {
-                    div(class: 'row-fluid') {
-                        div(class: 'col-lg-3') {}
-
-                        div(class: 'col-lg-8 col-lg-pull-0') {
-                            include template: 'includes/contribute-button.groovy'
-                            h1 {
-                                i(class: 'fa fa-search') {}
-                                yield ' Search'
-                            }
-                            p '''
-                                You can search the Groovy website, the Groovy documentation, and the Groovy APIs,
-                                with the Google Custom Search box below. Please type your search query, and hit enter:'''
-                            div {
-                                script '''
-                                  (function() {
-                                    var cx = '013939896723962546743:hbhn__olhii';
-                                    var gcse = document.createElement('script');
-                                    gcse.type = 'text/javascript';
-                                    gcse.async = true;
-                                    gcse.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') +
-                                        '//www.google.com/cse/cse.js?cx=' + cx;
-                                    var s = document.getElementsByTagName('script')[0];
-                                    s.parentNode.insertBefore(gcse, s);
-                                  })();
-                                '''
-                                'gcse:search'(linkTarget: '_blank'){}
-                                style '''
-                                    .gsc-input-box {
-                                        height: 30px;
-                                    }
-                                    input.gsc-search-button, input.gsc-search-button-v2 {
-                                        height: 30px;
-                                        display: none;
-                                    }
-                                    .gs-title {
-                                        line-height: 20px;
-                                        font-weight: bold;
-                                    }
-                                    .gs-snippet {
-                                        margin-left: 8px;
-                                        line-height: 18px;
-                                        font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
-                                    }
-                                    .gsc-cursor-page {
-                                        margin: 4px;
-                                        padding: 4px;
-                                        padding-left: 8px;
-                                        padding-right: 8px;
-                                        border: 1px solid gray;
-                                    }
-                                    .gsc-cursor-page:hover {
-                                        color: white !important;
-                                        background-color: #db4800 !important;
-                                        text-decoration: none !important;
-                                    }
-                                    .gsc-cursor-current-page {
-                                        background-color: #F2F2F2 !important;
-                                        color: black !important;
-                                    }
-                                    .gsc-selected-option-container {
-                                        width: 120px !important;
-                                    }
-                                    td.gsc-search-button {
-                                        padding-top: 6px;
-                                    }
-                                    td.gsc-orderby-container {
-                                        padding-right: 20px;
-                                    }
-                                    .gs-no-results-result .gs-snippet {
-                                        font-weight: bold;
-                                        color: #db4800;
-                                        background-color: white;
-                                        border: 0px;
-                                    }
-                                    .gsc-webResult, .gsc-result {
-                                        font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
-                                    }
-                                    .gsst_a, .gscb_a {
-                                        margin-top: 3px;
-                                    }
-                                    .gs-per-result-labels {
-                                        margin-left: 8px;
-                                        margin-top: 4px;
-                                    }
-                                    .gs-per-result-labels:before {
-                                        font-family: FontAwesome;
-                                        content: '\\f02c';
-                                        margin-right: 8px;
-                                    }
-                                    .gsc-tabHeader.gsc-tabhActive {
-                                        border-color: #CCCCCC;
-                                        border-bottom-color: #F2F2F2;
-                                        background-color: #F2F2F2;
-                                    }
-                                    .gsc-tabsArea {
-                                        border-bottom: 0;
-                                    }
-                                    a.gs-label, img.gs-image {
-                                        margin-left: 5px;
-                                    }
-                                '''
-                            }
-                            hr(class: 'divider')
-                        }
-                    }
-                }
-            }
-        }
diff --git a/site/src/site/pages/security.groovy b/site/src/site/pages/security.groovy
deleted file mode 100644
index 67815e5..0000000
--- a/site/src/site/pages/security.groovy
+++ /dev/null
@@ -1,150 +0,0 @@
-layout 'layouts/main.groovy', true,
-        pageTitle: "The Apache Groovy programming language - Security",
-        mainContent: contents {
-
-            div(id: 'content', class: 'page-1') {
-                div(class: 'row') {
-                    div(class: 'row-fluid') {
-                        div(class: 'col-lg-3') {
-                            ul(class: 'nav-sidebar') {
-                                li(class: 'active') {
-                                    a(href: '#security', "Security updates")
-                                }
-                            }
-                        }
-
-                        div(class: 'col-lg-8 col-lg-pull-0') {
-                            a(name: 'security') {}
-                            h1('Security updates')
-                            p '''Here you can find information about security patches or updates released for Apache Groovy. Note that unless specified otherwise,
-no binary or source patches are available. To obtain a security fix, you need to upgrade to the latest maintained version of Apache Groovy.'''
-                            p '''Releases prior to 2.4.4 were not released under Apache so no official patches for security updates are available for older versions.'''
-                            ul {
-                                li {
-                                    h2 "Groovy 2.4.x vulnerabilities"
-                                    h3 'CVE-2015-3253 Apache Groovy Information Disclosure'
-                                    asciidoc '''
-Severity: Important
-
-Vendor: The Apache Software Foundation
-
-Versions Affected:
-
-* Unsupported Codehaus versions of Groovy from 1.7.0 to 2.4.3
-* Fixed in version 2.4.4
-
-Impact:
-
-Remote execution of untrusted code, DoS
-
-Description:
-
-When an application has Groovy on the classpath and uses standard Java serialization mechanisms to communicate between servers, or to store local data, it is possible for an attacker to bake a special serialized object that will execute code directly when deserialized. All applications which rely on serialization and do not isolate the code which deserializes objects are subject to this vulnerability.
-
-Mitigation:
-
-Apache Groovy 2.4.4 is the first supported release under the Apache Software Foundation. It is strongly recommended that all users using serialization upgrade to this version.
-If you cannot upgrade or rely on an older, unsupported version of Groovy, you can apply the following patch on the `MethodClosure` class (`src/main/org/codehaus/groovy/runtime/MethodClosure.java`):
-
-```
- public class MethodClosure extends Closure {
-+    private Object readResolve() {
-+        throw new UnsupportedOperationException();
-+    }
-```
-
-Alternatively, you should make sure to use a custom security policy file (using the standard Java security manager) or make sure that you do not rely on serialization to communicate remotely.
-
-Credit:
-
-This vulnerability was discovered by:
-
-* cpnrodzc7 working with HP's Zero Day Initiative
-
-References:
-
-* http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-3253[CVE-2015-3253: Remote execution of untrusted code]
-* http://groovy-lang.org/security.html
-
-'''
-                                    h3 'CVE-2016-6814 Apache Groovy Information Disclosure'
-                                    asciidoc '''
-Severity: Important
-
-Vendor: The Apache Software Foundation
-
-Versions Affected:
-
-* Unsupported Codehaus versions of Groovy from 1.7.0 to 2.4.3
-* Apache Groovy 2.4.4 to 2.4.7
-* Fixed in version 2.4.8
-
-Impact:
-
-Remote execution of untrusted code, DoS
-
-Description:
-
-When an application with Groovy on classpath uses standard
-Java serialization mechanisms, e.g. to communicate between servers
-or to store local data, it is possible for an attacker to bake a special
-serialized object that will execute code directly when deserialized.
-All applications which rely on serialization and do not isolate the
-code which deserializes objects are subject to this vulnerability.
-This is similar to CVE-2015-3253 but this exploit involves extra
-wrapping of objects and catching of exceptions which are now safe
-guarded against.
-
-Mitigation:
-
-Users of Groovy relying on (de)serialization with the affected versions
-should apply one of the following mitigations:
-
-* Isolate the code doing the (de)serialization
-* Upgrade to Apache Groovy 2.4.8 or later
-* Users of older versions of Groovy can apply the following patch to the
-`MethodClosure` class (`src/main/org/codehaus/groovy/runtime/MethodClosure.java`):
-
-```
-public class MethodClosure extends Closure {
-+    private void readObject(java.io.ObjectInputStream stream) throws
-IOException, ClassNotFoundException {
-+        if (ALLOW_RESOLVE) {
-+            stream.defaultReadObject();
-+        }
-+        throw new UnsupportedOperationException();
-+    }
-```
-
-Credit:
-
-This vulnerability was discovered by:
-
-* Sam Thomas of Pentest Limited working with Trend Micro's Zero Day Initiative
-
-History:
-
-* 2016-09-20 Original advisory
-* 2017-01-12 Updated information on affected versions
-
-References:
-
-* http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-6814[CVE-2016-6814: Remote execution of untrusted code]
-* http://groovy-lang.org/security.html
-
-'''
-                                }
-                                li {
-                                    h2 "Reporting problems"
-                                    p """The Apache Software Foundation takes a very active stance in eliminating security problems in its software products.
-If you have questions about how to configure or use Groovy securely, you should send them to the users ${$a(href: 'mailing-lists.html', 'mailing list')}.
-If you find any security problems due to bugs in Groovy software, you should raise issues in the ${$a(href: 'contribute.html#reporting-issues', 'bug tracker')}.
-The Apache Software Foundation has a dedicated ${$a(href: 'http://www.apache.org/security/', 'security team')} which you may contact should the need arise.
-"""
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
diff --git a/site/src/site/pages/singlepagedocumentation.groovy b/site/src/site/pages/singlepagedocumentation.groovy
deleted file mode 100644
index 5443050..0000000
--- a/site/src/site/pages/singlepagedocumentation.groovy
+++ /dev/null
@@ -1,2 +0,0 @@
-layout 'layouts/iframedoc.groovy', true,
-        pageTitle: "The Apache Groovy programming language - Groovy reference documentation"
diff --git a/site/src/site/pages/thanks.groovy b/site/src/site/pages/thanks.groovy
deleted file mode 100644
index 2b62596..0000000
--- a/site/src/site/pages/thanks.groovy
+++ /dev/null
@@ -1,51 +0,0 @@
-layout 'layouts/main.groovy', true,
-        pageTitle: 'The Apache Groovy programming language - Thanks',
-        mainContent: contents {
-            div(id: 'content', class: 'page-1') {
-                div(class: 'row') {
-                    div(class: 'row-fluid') {
-                        div(class: 'col-lg-3') {
-                            include template: 'includes/community-navbar.groovy'
-                        }
-
-                        div(class: 'col-lg-8 col-lg-pull-0') {
-                            include template: 'includes/contribute-button.groovy'
-                            h1 {
-                                i(class: 'fa fa-building-o') {}
-                                yield ' Thanks'
-                            }
-                            article {
-                                p "The Apache Groovy team would like to thank:"
-                                ul {
-                                    li """
-                                        ${$a(href: 'http://www.apache.org', 'The Apache Software Foundation')} which owns
-                                        the project. We want to ${$a(href: 'http://www.apache.org/foundation/thanks.html', 'thank')} the Apache
-                                        Software Foundation and its sponsors for providing support for the Apache Community of open-source software projects.
-                                     """
-                                    li """
-                                        ${$a(href: 'http://www.jetbrains.com/', 'JetBrains')} cover the cost of our server
-                                        which runs our continuous integration server, hosts our documentation and website,
-                                        and they are also offering free licenses for
-                                        the ${$a(href: 'http://www.jetbrains.com/teamcity/', 'TeamCity')} integration server and
-                                        the ${$a(href: 'http://www.jetbrains.com/idea/', 'IntelliJ IDEA')} development environment.
-                                    """
-                                    li """
-                                        ${$a(href: 'http://www.jfrog.com/', 'JFrog')} provide the infrastructure
-                                        for deploying and hosting our snapshots and releases,
-                                        thanks to the ${$a(href: 'https://bintray.com/', 'Bintray')} social platform for distribution,
-                                        and the OSS ${$a(href: 'http://www.jfrog.com/home/v_artifactory_opensource_overview', 'Artifactory')} repository.
-                                    """
-                                }
-                                p """
-                                    Sponsors are a key ingredient of the success of the Apache projects.
-                                    If you consider helping the project in any way,
-                                    please don't hesitate to contact the Groovy development team.
-                                    Your help will be most appreciated.
-                                """
-                            }
-                            hr(class: 'divider')
-                        }
-                    }
-                }
-            }
-        }
diff --git a/site/src/site/pages/usergroups.groovy b/site/src/site/pages/usergroups.groovy
deleted file mode 100644
index 9df11c1..0000000
--- a/site/src/site/pages/usergroups.groovy
+++ /dev/null
@@ -1,66 +0,0 @@
-import model.UserGroup
-
-/**
- * Ths template is generating the user groups page.
- * If you want to add a user group, please edit the "usergroups" section in src/site/sitemap.groovy
- */
-
-layout 'layouts/main.groovy', true,
-        pageTitle: 'The Apache Groovy programming language - User groups',
-        mainContent: contents {
-            div(id: 'content', class: 'page-1') {
-                div(class: 'row') {
-                    div(class: 'row-fluid') {
-                        div(class: 'col-lg-3') {
-                            include template: 'includes/community-navbar.groovy'
-                        }
-
-                        div(class: 'col-lg-8 col-lg-pull-0') {
-                            include template: 'includes/contribute-button.groovy'
-                            h1 {
-                                i(class: 'fa fa-users') {}
-                                yield ' User groups'
-                            }
-                            article {
-                                p '''
-                                    We're living in a virtual world, but it's great from time to time to be able to meet in real life,
-                                    chat with other Groovy users, discover new aspects of the language or platform,
-                                    attend presentations about special features or ecosystem projects, and more.
-                                    Groovy user groups are there for you to exchange with others about your favorite language.
-                                '''
-
-                                Map groups = userGroups.groupBy { UserGroup g -> g.locationParts[0] }.sort { it.key }
-                                def groupAnchor = { groupName -> groupName.toLowerCase().replaceAll('[^a-zA-Z]', '') }
-
-                                // anchors for continents
-                                ul {
-                                    groups.keySet().each { group ->
-                                        li { a(href: "#${groupAnchor(group)}", group) }
-                                    }
-                                }
-
-                                // iterate on each top region
-                                groups.each { name, list ->
-                                    hr(class: 'divider')
-                                    a(name: groupAnchor(name)) {}
-                                    h2(name)
-                                    Map split = list.groupBy { UserGroup g -> g.locationParts[1] }.sort { it.key }
-                                    split.each { subregion, items ->
-                                        h3(subregion)
-                                        ul {
-                                            items.each { g ->
-                                                if (g.url) {
-                                                    li { a(href: g.url, g.name) }
-                                                } else {
-                                                    li(g.name)
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
diff --git a/site/src/site/pages/versioning.groovy b/site/src/site/pages/versioning.groovy
deleted file mode 100644
index f33b32a..0000000
--- a/site/src/site/pages/versioning.groovy
+++ /dev/null
@@ -1,69 +0,0 @@
-layout 'layouts/main.groovy', true,
-        pageTitle: 'The Apache Groovy programming language - Versioning',
-        mainContent: contents {
-            div(id: 'content', class: 'page-1') {
-                div(class: 'row') {
-                    div(class: 'row-fluid') {
-                        div(class: 'col-lg-3') {
-                            ul(class: 'nav-sidebar') {
-                                li {
-                                    a(href: 'download.html', 'Download Groovy')
-                                }
-                                li {
-                                    a(href: 'download.html#distro', class: 'anchor-link', 'Distributions')
-                                }
-                                li {
-                                    a(href: 'download.html#sdkman', class: 'anchor-link', 'Through SDKMAN!')
-                                }
-                                li {
-                                    a(href: 'download.html#buildtools', class: 'anchor-link', 'From your build tools')
-                                }
-                                li {
-                                    a(href: 'download.html#otherways', class: 'anchor-link', 'Other ways to get Groovy')
-                                }
-                                li(class: 'active') {
-                                    a(href: 'versioning.html') {
-                                        strong 'Groovy version scheme'
-                                    }
-                                }
-                                li {
-                                    a(href: 'indy.html', 'Invoke dynamic support')
-                                }
-                            }
-                        }
-
-                        div(class: 'col-lg-8 col-lg-pull-0') {
-                            include template: 'includes/contribute-button.groovy'
-                            h1 {
-                                i(class: 'fa fa-copy') {}
-                                yield ' Groovy version scheme'
-                            }
-                            article {
-                                h2 'Since Groovy 2.0.0'
-                                p "Since Groovy 2.0.0 we follow the ${$a(href: "http://semver.org/", 'semantic version scheme')}. This means the next minor version after 2.0.0 is 2.1.0, the first bugfix version after 2.0 is 2.0.1 and the next major version will be 3.0.0."
-
-                                h2 'Before Groovy 2.0.0'
-                                p 'Before Groovy 2.0.0 we followed a version scheme where we had X.Y.Z, where X.Y was the major version, and Z the minor version.\n' +
-                                        'Bugfix versions where not really done, you had to upgrade to the next minor version for that.\n' +
-                                        'Since Groovy 1.0 we incremented only the Y for a new major version.\n' +
-                                        'The increment of X we wanted to leave for a very big breaking change, like a new Meta-Object Protocol.\n' +
-                                        'The last major version in these scheme is 1.8(.0), 1.8.1 is the first minor and bugfix version.\n' +
-                                        'The major versions in the past using this scheme are: 1.8, 1.7, 1.6, 1.5, 1.0. Each of them having around 10 minor/bugfix versions.'
-
-                                h2 'Official Major Version'
-                                p 'The official major version is the current major version that should/can be used by the developers if they are not bound to a specific major version.'
-
-                                h2 'Maintenance Release Branch'
-                                p 'Here we indicate a former major version\'s bugfix release.'
-
-                                h2 'How long is a major version maintained?'
-                                p 'That depends on the users. Let\'s say we have X in maintenance and Y is the official major version, ' +
-                                        'then if a new major version Z is released, Y goes into maintenance. Usually we make one or two more bugfix releases for X and then we discontinue it, ' +
-                                        'unless there are strong requests to have certain things fixed for users that can absolutely not upgrade.'
-                            }
-                            hr(class: 'divider')
-                        }
-                    }
-                }
-            }
-        }
diff --git a/site/src/site/pages/wiki.groovy b/site/src/site/pages/wiki.groovy
deleted file mode 100644
index 336c960..0000000
--- a/site/src/site/pages/wiki.groovy
+++ /dev/null
@@ -1,68 +0,0 @@
-import generator.DocUtils
-import org.asciidoctor.ast.DocumentHeader
-
-modelTypes = {
-    DocumentHeader header
-    String title
-    String notes
-}
-
-title = header.documentTitle.main
-
-layout 'layouts/main.groovy', true,
-        pageTitle: "The Apache Groovy programming language - Developer docs - $title",
-        extraStyles: ['https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.css'],
-        extraFooter: contents {
-            script(src:'https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js') { }
-            script { yieldUnescaped "document.addEventListener('DOMContentLoaded',prettyPrint)" }
-        },
-        mainContent: contents {
-            Map options = [attributes:[DOCS_BASEURL:DocUtils.DOCS_BASEURL]]
-            def notesAsHTML = asciidocText(notes,options)
-            def matcher = notesAsHTML =~ /<h2 id="(.+?)">(.+?)<\/h2>/
-            def sections = [:]
-            while (matcher.find()) {
-                sections[matcher.group(1)] = matcher.group(2)
-            }
-
-            div(id: 'content', class: 'page-1') {
-                div(class: 'row') {
-                    div(class: 'row-fluid') {
-                        div(class: 'col-lg-3') {
-                            ul(class: 'nav-sidebar') {
-                                li(class:'active') {
-                                    a(href: '#doc', title)
-                                }
-                                sections.each { k,v ->
-                                    li {
-                                        a(href:"#$k", class: 'anchor-link', v)
-                                    }
-                                }
-                            }
-                        }
-
-                        div(class: 'col-lg-8 col-lg-pull-0') {
-                            a(name:"doc"){}
-                            h1(title)
-                            if (header.author) {
-                                p {
-                                    yield 'Author: '
-                                    i(header.author.fullName)
-                                }
-                            } else {
-                                p {
-                                    yield 'Authors: '
-                                    i(header.authors*.fullName.join(', '))
-                                }
-
-                            }
-                            if (header.revisionInfo?.date) {
-                                p("Last update: ${header.revisionInfo.date} (${header.revisionInfo.remark?:'no comment'})")
-                            }
-                            hr()
-                            yieldUnescaped notesAsHTML
-                        }
-                    }
-                }
-            }
-        }
diff --git a/site/src/site/releasenotes/groovy-1.5.adoc b/site/src/site/releasenotes/groovy-1.5.adoc
deleted file mode 100644
index ab32a83..0000000
--- a/site/src/site/releasenotes/groovy-1.5.adoc
+++ /dev/null
@@ -1,858 +0,0 @@
-Groovy, the Java-like dynamic language for
-the JVM, matures over time like good wines. After the successful release
-of Groovy 1.0 in January 2007, the next major milestone with the 1.5
-label already hits the shelves. With it, come several interesting
-novelties that we will examine in this article. The major addition to
-the language is the support of Java 5 features with annotations,
-generics and enums, making Groovy *the sole alternative dynamic language
-for the JVM fully supporting frameworks like Spring, Hibernate, JPA*,
-Google Guice, or TestNG. Apart from the new Java 5 features, a few
-syntax enhancements find their way in the language, as well as a more
-powerful dynamic behavior customization, a Swing UI builder on steroids,
-and improved tooling support.
-
-[[Groovy15releasenotes-AgroovierGroovyandwhyitmatters]]
-== A groovier Groovy and why it matters
-
-Groovy’s key selling point has always been its *seamless integration
-with Java*. You can mix and match Groovy and Java classes together in
-very easy ways: You may have a Groovy class extending a Java class
-implementing a Groovy interface, and vice versa. Most of the other
-alternative JVM languages unfortunately won’t let you seamlessly
-interchange classes of two different languages. So if you want to use
-the best language for the job without compromising your nice class
-hierarchy, you won’t have many options to choose from, and Groovy gives
-you all the freedom for integrating both languages in the most
-transparent way.
-
-Groovy shares the same libraries, the same object model, the same
-threading model, and the same security model as Java. In a way, you can
-consider Groovy as an implementation detail of your Java
-project, *without having to bear problematic impedance mismatch issues*.
-
-Groovy is Java, and Groovy makes Java groovier. Compared with other
-languages, Groovy is certainly the language that provides the *flattest
-learning curve to Java developers*, thanks to a very similar syntax.
-
-This is even more important to keep in mind that Groovy generates normal
-Java bytecode and uses the usual JDK libraries, so you won’t need to
-learn whole new APIs or have complex integration mechanisms: out of the
-box, Groovy and Java are interchangeable. The added benefit is that you
-can *protect the investment*you made in Java *skills for your
-developers*, or in *costly application servers*, or third party
-or *home-grown libraries*, as you can reuse all of them without a
-problem from Groovy.
-
-Speaking of calling into JDK, third party, or in-house libraries,
-alternative languages which don’t support strong typing, can’t always
-call all Java methods because of the fact they can’t choose a certain
-polymorphic variation of the same method. When choosing an alternative
-language to improve your productivity or make your code more readable,
-if you need to call other Java classes, you will have to be very careful
-to the choice of language you will make, as you may encounter some road
-blocks along the way.
-
-These days, all major Enterprise frameworks require the use of features
-like annotations, enums or generics, to be leveraged at their fullest
-extent. Fortunately, with Groovy 1.5, developers can benefit from the
-support of all these Java 5 features in their projects. Let’s see how
-annotations, enums and generics can be used from Groovy.
-
-[[Groovy15releasenotes-Java5additions]]
-== Java 5 additions
-
-The Groovy compiler always generates Java bytecode which is compatible
-with older Java VMs, but relies on JDK 1.4 for the core libraries it is
-using. However, for certain of these Java 5 additions, using Java 5
-bytecode was required, so that, for example, the generated classes may
-contain the bytecode information representing annotations with runtime
-retention policy. So although Groovy 1.5 can run on JDK 1.4, certain of
-these features will only be usable on JDK 5 - when this is the case, it
-will be mentioned in this article.
-
-[[Groovy15releasenotes-Variablearguments]]
-=== Variable arguments
-
-In Java 5, the ellipsis notation was created to denote methods with
-variable length arguments. With those little triple dots, Java lets
-users put as many parameters of the same type at the end of a method -
-actually, the vararg parameter is just an array of elements of that
-type. Varargs were already present in Groovy 1.0 - and still work with a
-JDK 1.4 runtime, but it is good to show how you can use them. Basically,
-whenever the last argument of a method is an array of objects, or a
-parameter declaration with a triple dot, you can pass multiple
-parameters to this method.
-
-A first example will show the usage of varargs in Groovy with the
-ellipsis:
-
-[source,groovy]
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-int sum(int... someInts) {
-    def total = 0
-    for (int i = 0; i < someInts.size(); i++) total += someInts[i]
-    return total
-}
-assert sum(1) == 1
-assert sum(1, 2) == 3
-assert sum(1, 2, 3) == 6
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-The assertions used in this example show how we can pass as many ints as
-desired. It is also interesting to see that, for more syntax
-compatibility with Java, the classical for loop has been added into
-Groovy - despite the presence of the groovier version with the in
-keyword that can also transparently iterate over various array or
-collection types.
-
-Note that it is possible to have varargs support even with an array as
-last parameter by declaring the method as follows:
-
-[source,groovy]
----------------------------------
-int sum(int[] someInts) { /* */ }
----------------------------------
-
-This snippet is really trivial, and there are obviously more expressive
-ways of calculating a sum. For instance, if you have a list of numbers,
-you can sum all of them in a single line of code:
-
-[source,groovy]
----------------------------
-assert [1, 2, 3].sum() == 6
----------------------------
-
-Varargs in Groovy don’t require JDK 5 as the underlying Java runtime,
-unlike annotations that we are now going to look at in the following
-section.
-
-[[Groovy15releasenotes-Annotations]]
-=== Annotations
-
-As shown in
-the http://docs.jboss.com/seam/1.3.0.ALPHA/reference/en/html/ch10.html[documentation
-of JBoss Seam] which supports Groovy for writing its entities,
-controllers and components, annotations like *@Entity, @Id,
-@Override* and others can be used to decorate your beans:
-
-[source,groovy]
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-@Entity
-@Name("hotel")
-class Hotel implements Serializable {
-   @Id @GeneratedValue Long id
-   @Length(max=50) @NotNull String name
-   @Length(max=100) @NotNull String address
-   @Length(max=40) @NotNull String city
-   @Length(min=2, max=10) @NotNull String state
-   @Length(min=4, max=6) @NotNull String zip
-   @Length(min=2, max=40) @NotNull String country
-   @Column(precision=6, scale=2) BigDecimal price
-   @Override
-   String toString() {
-      return "Hotel(${name}, ${address}, ${city}, ${zip})"
-   }
-}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-The Hotel entity is marked with the @Entity annotation, and it’s given a
-name through @Name. Different parameters can be passed to your
-annotations like in the @Length annotation constraint where different
-upper and lower bound can be set for validation purpose. You can also
-notice *Groovy properties* in action: Where are all the getters and
-setters? Where are the public or private modifiers? You don’t have to
-wait for Java 7 or 8 to get properties! By convention, defining a
-property is as simple as String country: a private country field will be
-auto-generated, as well as a public getter and setter. *Your code
-becomes naturally more concise and readable*.
-
-Annotations can be used on classes, fields, methods and method
-parameters, like in Java. There are, however, two gotchas to be aware
-of. Firstly, you can use annotations in Groovy, but you cannot yet
-define them - however, it will be possible in an upcoming version of
-Groovy. Secondly, although the syntax is almost 100% the same as in
-Java, there is a little difference when an array of values is passed in
-parameter of the annotation: instead of curly braces to surround the
-elements, Groovy requires the use of square brackets to offer a more
-homogeneous syntax - since Groovy lists and arrays use square brackets
-to surround their elements as well.
-
-With annotations in Groovy 1.5, you can easily define your JPA or
-Hibernate annotated beans
-in Groovy, add an `@Transactional` annotation on your Spring services,
-test your Swing UI with TestNG and Fest
-(http://www.jroller.com/aalmiray/entry/testing_groovy_uis_with_fest).
-All the useful and powerful enterprise frameworks leveraging annotations
-can be used from your Groovy-powered projects.
-
-[[Groovy15releasenotes-Enums]]
-=== Enums
-
-Whenever you need a fixed set of constants of a same type, Enums come in
-handy. Say you need a clean way to define constants for days without
-resorting to using integer constants? Then Enums are your friend. The
-following snippet shows how to define the days of the week:
-
-[source,groovy]
-----------------------------------------------------------------------------------
-enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY }
-----------------------------------------------------------------------------------
-
-Once you have defined your enum, you can use it as in Java with the
-usual notation *Day.MONDAY* and you can spice up your switch / case
-statements with it as well:
-
-[source,groovy]
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-def today = Day.SATURDAY
-switch (today) {
-     // Saturday or Sunday
-     case [Day.SATURDAY, Day.SUNDAY]: println "Weekends are cool"
-              break
-     // a day between Monday and Friday
-     case Day.MONDAY..Day.FRIDAY: println "Boring work day"
-              break
-     default: println "Are you sure this is a valid day?"
-}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-Notice that Groovy’s switch is a bit more powerful than C-like languages
-switches in that it is possible to use any kind of object in the switch
-and case. Instead of stacking up seven different case block with each
-enumerated value, you can regroup them in lists or ranges: whenever the
-value is in the list or the range, the case will be true and its
-associated instructions will be executed.
-
-A more complex example inspired by the Java tutorial takes a more
-astronomical perspective on enums, and shows how your enums can have
-properties, constructors and methods:
-
-[source,groovy]
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-enum Planet {
-   MERCURY (3.303e+23, 2.4397e6),
-   VENUS   (4.869e+24, 6.0518e6),
-   EARTH   (5.976e+24, 6.37814e6),
-   MARS    (6.421e+23, 3.3972e6),
-   JUPITER (1.9e+27,   7.1492e7),
-   SATURN  (5.688e+26, 6.0268e7),
-   URANUS  (8.686e+25, 2.5559e7),
-   NEPTUNE (1.024e+26, 2.4746e7)
-   double mass
-   double radius
-   Planet(double mass, double radius) {
-      this.mass = mass;
-      this.radius = radius;
-   }
-   void printMe() {
-      println "${name()} has a mass of ${mass} " +
-              "and a radius of ${radius}"
-   }
-}
-Planet.EARTH.printMe()
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-Like annotations, enums in Groovy require a JDK 5+ to run on, as Java 5
-bytecode is generated.
-
-[[Groovy15releasenotes-Staticimports]]
-=== Static imports
-
-In our previous examples of enums, we always had to prefix the
-enumerated value with its parent enum class, but thanks to static
-imports (which work even on a JDK 1.4 runtime) we can save some
-characters by dropping the Planet prefix:
-
-[source,groovy]
---------------------------------------
-import static Planet.*SATURN.printMe()
---------------------------------------
-
-No more Planet prefix. But of course, static imports aren’t only
-available for enums, but also work for other classes and static fields.
-What about doing some math?
-
-[source,groovy]
--------------------------------------------------------------------
-import static java.lang.Math.*assert sin(PI / 6) + cos(PI / 3) == 1
--------------------------------------------------------------------
-
-Both the static methods of *java.lang.Math* and its static constants
-were statically imported to make the expression more concise. But if the
-abbreviations of sine and cosine are not readable for you, you can use
-aliasing in Groovy with the as keyword:
-
-[source,groovy]
-----------------------------------------------------------------------------------------------------------------------------------------------------------
-import static java.lang.Math.PI
-import static java.lang.Math.sin as sine
-import static java.lang.Math.cos as cosine
-assert sine(PI / 6) + cosine(PI / 3) == 1
-----------------------------------------------------------------------------------------------------------------------------------------------------------
-
-Aliasing also works with normal imports too, not just static imports,
-and it can be pretty handy for adding some shortcut notation to very
-long class names as found in many frameworks, or for renaming methods or
-constants with non-obvious names, or not following your naming
-convention standards.
-
-[[Groovy15releasenotes-Generics]]
-=== Generics
-
-A somewhat more controversial feature of Java 5 also finds its way in
-the latest release of Groovy 1.5 with Generics. Initially, it may feel
-odd to add even more typing information to a dynamic language, after
-all. Java developers usually believe that because of type erasure (for
-backward compatibility reasons with older versions of Java) no
-information is left in the class bytecode to represent the generic type.
-However, this is wrong, since through the reflection API, you are able
-to introspect a class to discover the types of its fields or of its
-methods arguments with the generics details.
-
-So for instance, when you declare of field of type *List<String>*,
-somewhere in the bytecode, this information is kept in the form of some
-meta-information, although this field is really just of type *List*.
-This kind of reflexive information is used by enterprise frameworks like
-JPA or Hibernate to be able to relate a collection of elements from an
-entity to the entity representing the type of these elements.
-
-To put this into practice, let us check if the generics information is
-kept on class fields:
-
-[source,groovy]
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-class Talk { String title }
-class Speaker {
-   String name
-   List<Talk> talks = []
-}
-def me = new Speaker(name: 'Guillaume Laforge',
-   talks: [new Talk(title: 'Groovy'),new Talk(title: 'Grails')])
-def talksField =  me.class.getDeclaredField('talks')
-assert talksField.genericType.toString() ==    'java.util.List<Talk>'
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-We defined two classes: a Speaker class giving Talks at conferences. In
-the Speaker class, the talks property is of type *List<Talk>*. Then, we
-create a Speaker instance with two nice shortcuts for initializing the
-name and talks properties, and for creating a list of Talk instances.
-Once this setup code is ready, we retrieve the field representing the
-talks, and we check that the generic type information is correct:
-yes, *talks* is a *List*, but a *List* of *Talks*.
-
-[[Groovy15releasenotes-Covariantreturntypes]]
-=== Covariant return types
-
-In Java 5, if you have a method in a subclass with the same name and
-parameter types as in a parent class, but with a return type derived
-from the parent method’s return type, then we can override the parent
-method. In Groovy 1.0, covariant return types were not supported. But in
-Groovy 1.5, you can use them. Additionally, if you are trying to
-override a method with a return type not deriving from the parent class
-method’s return type, a compilation error will be thrown. Covariant
-return types also work with parameterized types.
-
-Beyond the support of Java 5 features which brought a few additions to
-the language, a few other syntax enhancements have been introduced in
-Groovy 1.5, and we are going to discover them in the following section.
-
-[[Groovy15releasenotes-Syntaxadditions]]
-== Syntax additions
-
-[[Groovy15releasenotes-Elvisoperator]]
-=== Elvis operator
-
-Apart from the Java 5 features that brought annotations, generics and
-enums into Groovy, a new operator finds its way into the language: ?:
-the Elvis operator. When you see the operator in question, you will
-easily guessed why it was nicknamed that way - if not, think in terms of
-Smiley. This new operator is, in fact, a shortcut notation for the
-ternary operator. How many times are you using the ternary operator to
-change the value of a variable if its content is null to assign it some
-default value? The typical case in Java is as follows:
-
-[source,groovy]
--------------------------------------------------------------------------------
-String name = "Guillaume";
-String displayName = name != null ? name : "Unknown";
--------------------------------------------------------------------------------
-
-In Groovy, since the language is able to ``coerce'' types to boolean
-values as needed (for instance where conditional expressions are
-required like in if or while constructs), in this statement, we can omit
-the comparison to null, because when a String is null, it is coerced to
-false, so in Groovy, the statement would become:
-
-[source,groovy]
----------------------------------------------------------------------
-String name = "Guillaume"
-String displayName = name ? name : "Unknown"
----------------------------------------------------------------------
-
-However, you will still notice the repetition of the name variable,
-which would violate the DRY principle (Don’t Repeat Yourself). As this
-construct is pretty common, the Elvis operator was introduced to
-simplify such recurring cases, and the statements become:
-
-[source,groovy]
-----------------------------------------------------------------
-String name = "Guillaume"
-String displayName = name ?: "Unknown"
-----------------------------------------------------------------
-
-The second occurrence of the name variable is simply omitted and the
-ternary operator is no more ternary and is shortened to this more
-concise form.
-
-It is also worth noticing that there are no side effects to this new
-construct, since the first element (here the name) is not evaluated
-twice as it would be the case with the ternary operator, so there’s no
-need to introduce some intermediate temporary value to hold the result
-of the first evaluation of the first element of the ternary operator.
-
-[[Groovy15releasenotes-Classicalforloop]]
-=== Classical for loop
-
-Although Groovy is not strictly speaking a 100% superset of Java, the
-Groovy syntax comes closer to the Java syntax after each release, and
-more and more Java code is also valid Groovy. The net benefit of this is
-that when you begin with Groovy, you can copy and paste Java code in
-your Groovy classes, and this should just work as expected. Then, over
-time, as you learn the language, you start throwing away the semi-colons
-which are not mandatory in Groovy, using GStrings (interpolated
-strings), or closures, etc. Groovy offers a rather flat learning curve
-to Java developers.
-
-However, there was one omission to this Java-syntax compatibility in the
-fact the classical for loop inherited from Java’s C background wasn’t
-allowed in Groovy. Initially, the Groovy developers thought it was not
-the nicest syntax of all and preferred using the for / in construct
-which was more readable. But as the Groovy users regularly asked for
-this old construct to be also part of Groovy, the team decided to bring
-it back to Groovy.
-
-With Groovy 1.5, you can either chose the Groovy for / in, or prefer the
-classical for loop:
-
-[source,groovy]
------------------------------------------------------------------------
-for (i in 0..9) println i
-for (int i = 0; i < 10; i++) println i
------------------------------------------------------------------------
-
-At the end of the day, it is probably more a matter of taste, and long
-time Groovy users usually prefer the most concise syntax with the for /
-in loop instead.
-
-[[Groovy15releasenotes-Namedparameterswithoutparenthesis]]
-=== Named parameters without parenthesis
-
-With its malleable and concise syntax, and its advanced dynamic
-capabilities, *Groovy is an ideal choice for implementing internal
-Domain-Specific Languages*. When you want to share a common metaphor
-between subject matter experts and developers, you can leverage Groovy
-to create a dedicated business language which models the key concept and
-business rules of your application. An important aspect of these DSLs is
-to make the code very readable, and also easier to write by
-non-technical persons. To achieve this goal even further, the grammar of
-the language was tweaked to allow us to use named parameters without the
-surrounding parenthesis.
-
-First of all, in Groovy, named parameters look like this:
-
-[source,groovy]
--------------------------------------------------------------------------------------------
-fund.compare(to: benchmarkFund, in: euros)
-compare(fund: someFund, to: benchmark, in: euros)
--------------------------------------------------------------------------------------------
-
-By adding new properties to numbers - which is possible in Groovy but
-beyond the scope of this article - we can also write code like this:
-
-[source,groovy]
----------------------------------------
-monster.move(left: 3.meters, at: 5.mph)
----------------------------------------
-
-Now by omitting parenthesis, the code can become a little clearer as
-shown below:
-
-[source,groovy]
--------------------------------------------------------------------------------------------------------------------------------
-fund.compare to: benchmarkFund, in: euros
-compare fund: someFund, to: benchmark, in: euros
-monster.move left: 3.meters, at: 5.mph
--------------------------------------------------------------------------------------------------------------------------------
-
-Obviously, this is not a big difference, but each statement becomes
-closer to real plain English sentences, and removes the usual
-boiler-plate technical code of the host language. This little
-enhancement of the grammar of the Groovy language gives more options to
-the designers of the business DSL.
-
-[[Groovy15releasenotes-Improvedtoolingsupport]]
-== Improved tooling support
-
-A common show-stopper when Groovy was a young language, was the lack of
-good tooling support: both the tool chain and the IDE support weren’t up
-to the task. Fortunately, with the maturity and success of Groovy and
-the Grails web framework, this situation has changed.
-
-[[Groovy15releasenotes-Introductionofthejointcompiler]]
-== Introduction of the joint compiler
-
-Groovy is well-known for its transparent and seamless integration with
-Java. But this is not just about being able to call Java methods from
-Groovy scripts, no, the integration between both languages goes well
-beyond that. For instance, it is totally possible to have a Groovy class
-extending a Java class which in turns implements a Groovy interface, or
-vice versa. This is something other alternative languages don’t alway
-support, unfortunately. However, when mixing Groovy and Java classes
-together, so far, you had to be careful when compiling both type of
-classes by cleverly choosing the order of compilation, and when cyclic
-dependencies were spanning both languages, you may have hit a ``chicken
-and egg'' problem. Fortunately with Groovy 1.5, this is not the case
-anymore, and thanks to a contribution from JetBrains, the makers of the
-award winning http://www.jetbrains/idea/[Java IDE IntelliJ IDEA], a
-``joint'' compiler is available with which you can compile both Groovy
-and Java sources together in one go without having to think about
-dependencies between classes.
-
-If you want to use the joint compiler from the command-line, you can
-call the groovyc command as usual, but specify the -j flag which will
-enable the joint compilation:
-
-----------------------------------------------------
-groovyc *.groovy *.java -j -Jsource=1.4 -Jtarget=1.4
-----------------------------------------------------
-
-For passing parameters to the underlying javac command, you can prefix
-the flags with the J prefix. You can also use the joint compiler through
-its Ant task from you Ant or Maven build files:
-
-[source,xml]
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-<taskdef name="groovyc" classname="org.codehaus.groovy.ant.Groovyc" classpathref="my.classpath"/>
-<groovyc srcdir="${mainSourceDirectory}"
-         destdir="${mainClassesDirectory}"
-         classpathref="my.classpath"
-         jointCompilationOptions="-j -Jsource=1.4 -Jtarget=1.4" />
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-[[Groovy15releasenotes-MavenpluginforGroovy]]
-=== Maven plugin for Groovy
-
-For the Maven users, there is also a fully featured Maven plugin hosted
-at Codehaus which allows you to build your Java / Groovy applications:
-compile your Groovy and Java code, generate documentation from the
-JavaDoc tags, or it even lets you write your own Maven plugins in
-Groovy. There is also a Maven archetype to bootstrap your Groovy project
-more rapidly.
-
-[[Groovy15releasenotes-TheGroovyDocdocumentationtool]]
-=== The GroovyDoc documentation tool
-
-As a Java developer, you are used to documenting your code through
-JavaDoc tags in the comments of your classes, interfaces, fields, or
-methods. In Groovy, you can also use such tags in your comments, and
-have them being used by a tool called GroovyDoc to generate the
-equivalent JavaDoc documentation for all your Groovy classes.
-
-There’s an Ant task you can define then use to generate the
-documentation as follows:
-
-[source,xml]
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-<taskdef name="groovydoc"
-         classname="org.codehaus.groovy.ant.Groovydoc">
-   <classpath>
-      <path path="${mainClassesDirectory}"/>
-      <path refid="compilePath"/>
-   </classpath>
-</taskdef>
-
-<groovydoc destdir="${docsDirectory}/gapi"
-     sourcepath="${mainSourceDirectory}"
-     packagenames="**.*" use="true"
-     windowtitle="Groovydoc"
-     private="false"/>
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-[[Groovy15releasenotes-NewinteractiveshellandtheSwingconsole]]
-== New interactive shell and the Swing console
-
-Groovy distributions always contained two different shells: a
-command-line shell as well as a Swing console. Groovysh, the
-command-line shell, has never been very friendly in terms of
-interactions with its user: whenever you wanted to execute a statement,
-you had to type `go' or `execute' after each one, so that it got
-executed. For quick prototyping or playing with some new API, typing
-`go' each time was very cumbersome. The situation has changed in Groovy
-1.5, since a new interactive shell is born. No need to type `go'
-anymore.
-
-This new shell features several enhancements, such as the use of the
-JLine library which provides ANSI coloring, tab completion for commands,
-line editing capabilities. You can work with different script buffers,
-remember already imported classes, load existing scripts, save the
-current script to a file, browse the history, etc. For detailed
-explanations of the supported features, please have a look at
-the http://www.groovy-lang.org/groovysh.html[documentation].
-
-The command-line shell isn’t the only one that received some care, the
-Swing console has also been improved, with a new toolbar, with advanced
-undo capabilities, the possibility to increase or decrease the font
-size, syntax highlighting. A lot of polishing has been applied to the
-console.
-
-[[Groovy15releasenotes-IntelliJIDEAJetGroovyplugin]]
-=== IntelliJ IDEA JetGroovy plugin
-
-I will save the best of tooling support till the end of this section by
-mentioning the JetGroovy plugin: a free and Open Source IntelliJ IDEA
-plugin dedicated to the support of both Groovy and Grails. This plugin
-has been developed by JetBrains themselves, and provides unmatched
-support for both the language and the web framework.
-
-To list a few of the available features of the Groovy support:
-
-* *Syntax highlighting* for all the syntax, plus different warnings for
-types not recognized, or when static type information is not known to
-help spot potential errors.
-* Ability to *run Groovy classes, scripts and JUnit test cases written
-in Groovy*.
-* *Debugger*: You can debug step by step across your Java and Groovy
-code, set breakpoints, show variables, the current stack, etc.
-* Joint compiler: the compiler *compiles both Groovy and Java* classes
-together and is able to resolve dependencies between both languages.
-* *Code completion* for packages, classes, properties, fields,
-variables, methods, keywords, and even specific support for the Swing UI
-builder.
-* Advanced class search and find usage.
-* *Refactorings*: most of the usual refactorings you’ve come to love in
-Java are available as well and work across Java and Groovy, like
-``surround with'', introduce, inline or rename a variable, renaming for
-packages, classes, methods, and fields.
-* *Imports optimizations and code formatting*.
-* Structure view: to have a bird’s eye view of your classes.
-
-At the end of the day, you won’t even notice whether you’re developing a
-class in Groovy or in Java, considering the level of interplay and
-support offered inside IntelliJ IDEA. This is definitely a plugin to
-install if you’re considering adding some dose of Groovy in your Java
-project, or if you plan to develop Grails applications.
-
-More information can be found
-on http://www.jetbrains.net/confluence/display/GRVY/Groovy+Home[JetBrains
-website].
-
-Although I’m only mentioning the plugin for IntelliJ IDEA, for your
-Groovy developments, you don’t have to change your habits. You can also
-use the Eclipse plugin which is regularly improved by the IBM Project
-Zero developers, or Sun’s brand new support of Groovy and Grails in
-NetBeans.
-
-[[Groovy15releasenotes-Performanceimprovements]]
-== Performance improvements
-
-Along with new features, this new release of Groovy brings noticeable
-performance improvements as well as lower memory consumption, compared
-to previous versions. In our informal benchmarks measuring the duration
-of all our test suites, we noticed speed improvements between 15% to 45%
-compared with our beta versions of Groovy 1.5 - and certainly higher
-figures can be expected by comparing with the now old Groovy 1.0. More
-formal benchmarks have yet to be developed, but those figures have also
-been confirmed by developers from an insurance company that is using
-Groovy to write the business rules of their policy risk calculation
-engine, and from another company who ran several tests on highly
-parallel machines. Overall, Groovy 1.5 should be faster and leaner in
-most situations. Your mileage may vary depending on your own context of
-usage of Groovy.
-
-[[Groovy15releasenotes-Enhanceddynamiccapabilities]]
-== Enhanced dynamic capabilities
-
-Through the symbiotic relationships between the Groovy and Grails
-projects, new dynamic capabilities have been introduced in Groovy, after
-having matured in the heart of Grails.
-
-Groovy is a dynamic language: put simply, it means that certain things
-like method dispatch happens at runtime, instead of at compile-time as
-it is the case of Java and other languages. There is a specific runtime
-system, called the MOP (stands for Meta-Object Protocol) that is
-responsible for the dispatching logic. Fortunately, this runtime system
-is open enough so that people can hook into the system and change its
-usual behavior. For each Java class and for each Groovy instance, there
-is an associated meta-class which represents this runtime behavior of
-your objects. Groovy offered various ways to interact with the MOP by
-defining custom meta-classes by extending some base class, but thanks to
-the contribution from the Grails project, a groovier kind of meta-class
-is available: the expando meta-class.
-
-Again,code samples are easier to help us understand the concept. In the
-following example, the msg String instance has got a meta-class that we
-can access through the metaClass property. Then we change the meta-class
-of the *String* class to add a new method called up to the String class,
-to have a shortcut notation for the *toUpperCase()* method. To do so, we
-assign a closure to the up property of the meta-class which is created
-as we assign it the closure. This closure takes no argument (hence why
-it starts with an arrow), and we call the *toUpperCase()* method on the
-delegate of the closure, which is a special closure variable which
-represents the real object (here the String instance).
-
-[source,groovy]
-----------------------------------------------------------------------------------------------------------------------
-def msg = "Hello!"
-println msg.metaClass
-String.metaClass.up = { -> delegate.toUpperCase() }
-assert "HELLO!" == msg.up()
-----------------------------------------------------------------------------------------------------------------------
-
-Through this meta-class, you can query the methods and/or properties
-which are available:
-
-[source,groovy]
---------------------------------------------------------------------------------------------------------------------------------------------------
-// print all the methods
-obj.metaClass.methods.each { println it.name }
-
-// print all the properties
-obj.metaClass.properties.each { println it.name }
---------------------------------------------------------------------------------------------------------------------------------------------------
-
-You can even check that a certain method or property is available, with
-a finer granularity than through any instanceof check:
-
-[source,groovy]
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-def msg = 'Hello!'
-if (msg.metaClass.respondsTo(msg, 'toUpperCase')) {
-   println msg.toUpperCase()
-}
-if (msg.metaClass.hasProperty(msg, 'bytes')) {
-   println  foo.bytes.encodeBase64()
-}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-These mechanisms are extensively used in the Grails web framework for
-instance to create dynamic finders: no need for DAOs in most
-circumstances, as you are able to call a *findByTitle()* dynamic method
-on a Book domain class. Through meta-classes, Grails automatically
-decorates the domain classes with such methods. Furthermore, if the
-method doesn’t exist yet, it will be created and cached on first use.
-This can be accomplished by other advanced hooks as explained below.
-
-Beyond those examples we’ve seen so far, expando meta-classes also
-provide some complementary hooks. Four other kind of methods can be
-added to an expando meta-class:
-
-* *invokeMethod()* lets you intercept all methods calls,
-* while *methodMissing()* will be called on last resort only of no other
-method is found.
-* *get/setProperty()* intercepts access to all properties,
-* whereas *propertyMissing()* is called when no property can be found.
-
-With expando meta-classes, customizing the behavior of the types of your
-application becomes easier and can save precious time of development
-compared with the previous version of Groovy. Obviously, not everybody
-needs to use those techniques, but they can be handy in a number of
-situations where you want to apply some AOP (Aspect Oriented Techniques)
-to decorate your classes, and when you want to simplify and make more
-readable the business code of your application, by removing some
-unnecessary boiler-plate code.
-
-[[Groovy15releasenotes-Swingonsteroids]]
-== Swing on steroids
-
-The Groovy project has the chance to have a team of talented Swing
-developers who worked hard to enhance the capabilities of Groovy to
-build user interfaces in Swing. The basic brick for building Swing UIs
-in Groovy is the SwingBuilder class: at a syntactical level in your
-source, you can visually see how Swing components are nested within each
-other. A simplistic example from the Groovy website shows how to simply
-create a little GUI:
-
-[source,groovy]
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-import groovy.swing.SwingBuilder
-import java.awt.BorderLayout
-import groovy.swing.SwingBuilder
-import java.awt.BorderLayout as BL
-
-def swing = new SwingBuilder()
-count = 0
-def textlabel
-def frame = swing.frame(title:'Frame', size:[300,300]) {
-   borderLayout()
-   textlabel = label(text:"Clicked ${count} time(s).", constraints: BL.NORTH)
-   button(text:'Click Me', actionPerformed: { count++; textlabel.text = "Clicked ${count} time(s)."; println "clicked"},
-      constraints:BorderLayout.SOUTH)
-}
-frame.pack()
-frame.show()
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-In the novelties, the Swing builder concept has been extend to provide
-custom component factories. There are additional modules, not bundled
-with Groovy by default, which integrates the Swing components from JIDE
-or from the SwingX project into the usual Swing builder code.
-
-Although this topic would deserve a full article, I’m only going to list
-some of the other improvements in this release, for instance, the bind()
-method. Inspired by the beans binding JSR (JSR-295), you can easily bind
-components or beans together to have them react upon changes made on
-each other. In the following example, the size of the insets of the
-button will be changed according to the value of the slider component:
-
-[source,groovy]
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-import groovy.swing.SwingBuilder
-import java.awt.Insets
-
-swing = new SwingBuilder()
-frame = swing.frame {
-   vbox {
-      slider(id: 'slider', value:5)
-      button('Big Button?!', margin: bind(source: slider, sourceProperty:'value', converter: { [it, it, it, it] as Insets }))
-   }
-}
-frame.pack()
-frame.size = [frame.width + 200, frame.height + 200]
-frame.show()
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-Binding components together is such a common task when building user
-interfaces, that this task has been simplified through this binding
-mechanism. There are also some other automatic binding options that can
-be used, but again, a dedicated article would probably be better.
-
-In other new and noteworthy features, a few handy new methods have been
-added which leverage closures to call the infamous SwingUtilities class,
-and to start new threads: edt() will call _invokeAndWait()_,
-while *doLater()* will call *invokeLater()*, and *doOutside()* will just
-launch a closure in a new thread. No more ugly anonymous inner classes:
-just use closures through those shortcut methods!
-
-Last but not least, separating the description of the view and its
-associated behavior logic has never been easier, thanks to the build()
-method on SwingBuilder. You can create a separate script which only
-contains the view, while the interactions or bindings between components
-are in the main class, making a clearer separation in the MVC model.
-
-[[Groovy15releasenotes-Summary]]
-== Summary
-
-In this article, the new and noteworthy features have been outlined, but
-we have barely scratched the surface of this new version of Groovy. The
-big highlights are mainly around the new Java 5 features, such as
-annotations, enums or generics: it makes Groovy perfectly capable of
-being integrated nicely and seamlessly with Enterprise frameworks such
-as Spring, Hibernate, or JPA. With the improvements in the syntax and
-with the enhanced dynamic capabilities, Groovy will let you customize
-your business logic by creating embedded Domain-Specific Languages, that
-you can easily integrate at the extension points of your application.
-The developer experience has progressed significantly through the work
-poured in the tooling support, this is no more a show stopper to the
-adoption of Groovy. Overall, with Groovy 1.5, the goal of simplifying
-the life of developers has never been so well fulfilled, and Groovy
-should definitely be part of all the Java developers’ toolbox.
\ No newline at end of file
diff --git a/site/src/site/releasenotes/groovy-1.6.adoc b/site/src/site/releasenotes/groovy-1.6.adoc
deleted file mode 100644
index cf4e2c1..0000000
--- a/site/src/site/releasenotes/groovy-1.6.adoc
+++ /dev/null
@@ -1,1436 +0,0 @@
-== Overview of Groovy 1.6
-
-As we shall see in this article, the main highlights of this Groovy 1.6
-release are:
-
-* *Greater compile-time and runtime performance improvements*
-* Multiple assignments
-* Optional return in `if`/`else` and `try`/`catch` blocks
-* Java 5 annotation definition
-* *AST transformations* and all the provided transformation annotations
-like`@Singleton`, `@Lazy`, `@Immutable`, `@Delegate` and friends
-* The Grape module and dependency system and its `@Grab` transformation
-* Various Swing builder improvements, thanks to the Swing
-/ link:http://griffon-framework.org/[Griffon] team, as well as several Swing
-console improvements
-* The integration of *JMX builder*
-* Various *metaprogramming improvements*, like the EMC DSL, per-instance
-metaclasses even for POJOs, and runtime mixins
-* *JSR-223* scripting engine built-in
-* Out-of-the-box *OSGi readiness*
-
-All those improvements and new features serve one goal: *helping
-developers be more productive and more agile*, by:
-
-* Focusing more on the task at hand than on boiler-plate technical code
-* Leveraging existing Enterprise APIs rather than reinventing the wheel
-* Improving the overal performance and quality of the language
-* Enabling developers to customize the language at will to derive their
-own Domain-Specific Languages
-
-But beyond all these important aspects, *Groovy is not just a language,
-it’s a whole ecosystem*.
-
-The improvements in Groovy’s generated bytecode information helps
-capable tools coverage
-like link:http://cobertura.github.io/cobertura/[Cobertura] and
-its Groovy support, or pave the way for new utilities
-like link:http://codenarc.sourceforge.net/[CodeNarc] for static code analysis
-for Groovy.
-
-The malleability of the syntax of the language and its metaprogramming
-capabilities give birth to advanced testing tools such as
-the link:http://easyb.org/[Easyb] Behavior-Driven-Development project,
-the link:http://code.google.com/p/gmock/[GMock] mocking library or
-the link:http://code.google.com/p/spock/[Spock] testing and specification
-framework.
-
-Again, Groovy’s flexibility and expressivity and its scripting
-capabilities open the doors to advanced build scripting or
-infrastructure systems for your continuous integration practices and
-project build solutions, such
-as link:https://gant.github.io/[Gant] and link:http://www.gradle.org/[Gradle].
-
-At the tooling level, Groovy also progresses, for instance with
-its `groovydoc` Ant task to let you generate proper JavaDoc covering,
-documenting and interlinking both your Groovy and Java source files for
-your Groovy/Java mixed projects.
-
-And at the same time, IDE makers improve their support for Groovy, by
-giving users powerful weapons such as cross-language code refactoring,
-profound understanding of dynamic language idioms, code completion, and
-more, to make developers productive when using Groovy in their projects.
-
-Now, armed with this knowledge of the Groovy world, it’s time to dive
-into the novelties of Groovy 1.6!
-
-[[Groovy16releasenotes-Performanceimprovements]]
-== Performance improvements
-
-A lot of care has been taken to improve both the compile-time and
-runtime performance of Groovy, compared to previous releases.
-
-The *compiler is 3 to 5 times faster* than in previous releases. This
-improvement has also been backported in the 1.5.x branch, so that both
-the old maintenance branch and the current stable branch benefit from
-this work. Thanks to class lookup caches, the bigger the project, the
-faster the compilation will be.
-
-However, the most noticeable changes will be in the general runtime
-performance improvements of Groovy. We used several benchmarks from
-the link:http://shootout.alioth.debian.org/[Great Language Shootout] to
-measure our progress. On those we selected, compared to the old Groovy
-1.5.x line, the*performance improvements ranged from 150% to 460%*.
-Micro-benchmarks obviously rarely reflect the kind of code you have in
-your own projects, but the overal performance of your projects should
-improve significantly.
-
-[[Groovy16releasenotes-Multipleassignments]]
-== Multiple assignments
-
-In Groovy 1.6, there is only one syntax addition for being able to
-define and assign several variables at once:
-
-[source,groovy]
--------------------
-def (a, b) = [1, 2]
-
-assert a == 1
-assert b == 2
--------------------
-
-A more meaninful example may be methods returning longitute and latitude
-coordinates. If these coordinates are represented as a list of two
-elements, you can easily get back to each element as follows:
-
-[source,groovy]
----------------------------------------------------------------------
-def geocode(String location) {
-    // implementation returns [48.824068, 2.531733] for Paris, France
-}
-
-def (lat, long) = geocode("Paris, France")
-
-assert lat == 48.824068
-assert long == 2.531733
----------------------------------------------------------------------
-
-And you can also define the types of the variables in one shot as
-follows:
-
-[source,groovy]
--------------------------------------
-def (int i, String s) = [1, 'Groovy']
-
-
-assert i == 1
-assert s == 'Groovy'
--------------------------------------
-
-For the assignment (with prior definition of the variables), just omit
-the `def` keyword:
-
-[source,groovy]
-------------------------------------------------------
-def firstname, lastname
-
-
-(firstname, lastname) = "Guillaume Laforge".tokenize()
-
-
-assert firstname == "Guillaume"
-assert lastname == "Laforge"
-------------------------------------------------------
-
-If the list on the right-hand side contains more elements than the
-number of variables on the left-hand side, only the first elements will
-be assigned in order into the variables. Also, when there are less
-elements than variables, the extra variables will be assigned null.
-
-So for the case with more variables than list elements, here, `c` will
-be `null`:
-
-[source,groovy]
-------------------------
-def elements = [1, 2]
-def (a, b, c) = elements
-
-
-assert a == 1
-assert b == 2
-assert c == null
-------------------------
-
-Whereas in the case where there are more list elements than variables,
-we’ll get the following expectations:
-
-[source,groovy]
----------------------------
-def elements = [1, 2, 3, 4]
-def (a, b, c) = elements
-
-
-assert a == 1
-assert b == 2
-assert c == 3
----------------------------
-
-For the curious minds, supporting multiple assignments also means we can
-do the standard school swap case in one line:
-
-[source,groovy]
------------------------------
-// given those two variables
-def a = 1, b = 2
-
-
-// swap variables with a list
-(a, b) = [b, a]
-
-
-assert a == 2
-assert b == 1
------------------------------
-
-[[Groovy16releasenotes-Annotationdefinition]]
-== Annotation definition
-
-Actually, when I said that multiple assignments were the sole syntax
-addition, it’s not entirely true. Groovy supported the syntax for
-annotation definition even in Groovy 1.5, but we had not implemented the
-feature completely. Fortunately, this is now fixed, and it wraps up all
-the Java 5 features supported by Groovy, such as *static
-imports*, *generics*, *annotations*, and *enums*, making Groovy
-the *sole alternative dynamic language for the JVM supporting all those
-Java 5 features*, which is critical for a seamless Java integration
-story, and for the usage in Enterprise frameworks relying on
-annotations, generics and more, like JPA, EJB3, Spring, TestNG, etc.
-
-[[Groovy16releasenotes-Optionalreturnforifelseandtrycatchfinallyblocks]]
-== Optional return for if/else and try/catch/finally blocks
-
-It is now possible for `if/else` and `try/catch/finally` blocks to
-return a value when they are the last expression in a method or a
-closure. No need to explicitly use the `return` keyword inside these
-constructs, as long as they are the latest expression in the block of
-code.
-
-As an example, the following method will return `1`, although
-the `return` keyword was omitted.
-
-[source,groovy]
-----------------------
-def method() {
-    if (true) 1 else 0
-}
-
-
-assert method() == 1
-----------------------
-
-For `try/catch/finally` blocks, the last expression evaluated is the one
-being returned. If an exception is thrown in the `try` block, the last
-expression in the `catch` block is returned instead. Note
-that `finally` blocks don’t return any value.
-
-[source,groovy]
---------------------------------------------
-def method(bool) {
-    try {
-        if (bool) throw new Exception("foo")
-        1
-    } catch(e) {
-        2
-    } finally {
-        3
-    }
-}
-
-
-assert method(false) == 1
-assert method(true) == 2
---------------------------------------------
-
-[[Groovy16releasenotes-ASTTransformations]]
-== AST Transformations
-
-Although at times, it may sound like a good idea to extend the syntax of
-Groovy to implement new features (like this is the case for instance for
-multiple assignments), most of the time, we can’t just add a new keyword
-to the grammar, or create some new syntax construct to represent a new
-concept. However, with the idea of AST (Abstract Syntax Tree)
-Transformations, we are able to tackle new and innovative ideas without
-necessary grammar changes.
-
-When the Groovy compiler compiles Groovy scripts and classes, at some
-point in the process, the source code will end up being represented in
-memory in the form of a Concrete Syntax Tree, then transformed into an
-Abstract Syntax Tree. The purpose of AST Transformations is to let
-developers hook into the compilation process to be able to modify the
-AST before it is turned into bytecode that will be run by the JVM.
-
-*AST Transformations provides Groovy with improved compile-time
-metaprogramming capabilities* allowing powerful flexibility at the
-language level, without a runtime performance penalty.
-
-There are two kinds of transformations: global and local
-transformations.
-
-* Global transformations are applied to by the compiler on the code
-being compiled, wherever the transformation apply. A JAR added to the
-classpath of the compiler should contain a service locator file
-at `META-INF/services/org.codehaus.groovy.transform.ASTTransformation` with
-a line with the name of the transformation class. The transformation
-class must have a no-args constructor and implement
-the `org.codehaus.groovy.transform.ASTTransformation`interface. It will
-be run against every source in the compilation, so be sure to not create
-transformations which scan all the AST in an expansive and
-time-consuming manner, to keep the compiler fast.
-* Local transformations are transformations applied locally by
-annotating code elements you want to transform. For this, we reuse the
-annotation notation, and those annotations should
-implement `org.codehaus.groovy.transform.ASTTransformation`. The
-compiler will discover them and apply the transformation on these code
-elements.
-
-Groovy 1.6 provides several local transformation annotations, in the
-Groovy Swing Builder for data binding (`@Bindable` and `@Vetoable`), in
-the Grape module system for adding script library dependencies
-(`@Grab`), or as general language features without requiring any syntax
-change to support them
-(`@Singleton`, `@Immutable`, `@Delegate`, `@Lazy`, `@Newify`, `@Category`, `@Mixin` and `@PackageScope`).
-Let’s have a look at some of these transformations
-(`@Bindable` and `@Vetoable` will be covered in the section related to
-the Swing enhancements, and `@Grab` in the section about Grape).
-
-[[Groovy16releasenotes-Singleton]]
-=== @Singleton
-
-Whether the singleton is pattern or an anti-pattern, there are still
-some cases where we need to create singletons. We’re used to create a
-private constructor, a `getInstance()` method for a static field or even
-an initialized `public static final` field. So instead of writing code
-like this in Java:
-
-[source,groovy]
----------------------------------------------
-public class T {
-    public static final T instance = new T();
-    private T() {}
-}
----------------------------------------------
-
-You just need to annotate your type with the `@Singleton` annotation:
-
-[source,groovy]
----------------------
-@Singleton class T {}
----------------------
-
-The singleton instance can then simply be accessed
-with `T.instance` (direct public field access).
-
-You can also have the lazy loading approach with an additional
-annotation parameter:
-
-[source,groovy]
-----------------------------------
-@Singleton(lazy = true) class T {}
-----------------------------------
-
-Would become more or less equivalent to this Groovy class:
-
-[source,groovy]
----------------------------------------
-class T {
-    private static volatile T instance
-    private T() {}
-    static T getInstance () {
-        if (instance) {
-            instance
-        } else {
-            synchronized(T) {
-                if (instance) {
-                    instance
-                } else {
-                    instance = new T ()
-                }
-            }
-        }
-    }
-}
----------------------------------------
-
-Lazy or not, once again, to access the instance, simply
-do `T.instance` (property access, shorcut for `T.getInstance()`).
-
-[[Groovy16releasenotes-Immutable]]
-=== @Immutable
-
-Immutable objects are ones which don’t change after initial creation.
-Such objects are frequently desirable because they are simple and can be
-safely shared even in multi-threading contexts. This makes them great
-for functional and concurrent scenarios. The rules for creating such
-objects are well-known:
-
-* No mutators (methods that modify internal state)
-* Class must be final
-* Fields must be private and final
-* Defensive copying of mutable components
-* `equals()`, `hashCode()` and `toString()` must be implemented in terms
-of the fields if you want to compare your objects or use them as keys in
-e.g. maps
-
-Instead of writing a very long Java or Groovy class mimicking this
-immutability behavior, Groovy lets you just write an immutable class as
-follow:

-[source,groovy]
-------------------------------------------------------------------
-@Immutable final class Coordinates {
-    Double latitude, longitude
-}
-
-
-def c1 = new Coordinates(latitude: 48.824068, longitude: 2.531733)
-def c2 = new Coordinates(48.824068, 2.531733)
-
-
-assert c1 == c2
-------------------------------------------------------------------
-
-All the boiler-plate code is generated at compile-time for you! The
-example shows that to instantiate such immutable coordinates, you can
-use one of the two constructors created by the transformation, one
-taking a map whose keys are the properties to set to the values
-associated with those keys, and the other taking the values of the
-properties as parameters. The `assert` also shows that `equals()` was
-implemented and allows us to properly compare such immutable objects.
-
-You can have a look at
-the link:http://docs.groovy-lang.org/latest/html/gapi/groovy/transform/Immutable.html[details of the implementation] of this transformation. For the record, the Groovy
-example above using the`@Immutable` transformation is over 50 lines of
-equivalent Java code.
-
-[[Groovy16releasenotes-Lazy]]
-=== @Lazy
-
-Another transformation is `@Lazy`. Sometimes, you want to handle the
-initialization of a field of your clas lazily, so that its value is
-computed only on first use, often because it may be time-consuming or
-memory-expensive to create. The usual approach is to customize the
-getter of said field, so that it takes care of the initialization when
-the getter is called the first time. But in Groovy 1.6, you can now use
-the `@Lazy` annotation for that purpose:
-
-[source,groovy]
----------------------------------------
-class Person {
-    @Lazy pets = ['Cat', 'Dog', 'Bird']
-}
-
-
-def p = new Person()
-assert !(p.dump().contains('Cat'))
-
-assert p.pets.size() == 3
-assert p.dump().contains('Cat')
----------------------------------------
-
-In the case of complex computation for initializing the field, you may
-need to call some method for doing the work, instead of a value like our
-pets list. This is then possible to have the lazy evaluation being done
-by a closure call, as the following example shows:
-
-[source,groovy]
-----------------------------------------------------------
-class Person {
-    @Lazy List pets = { /* complex computation here */ }()
-}
-----------------------------------------------------------
-
-There is also an option for leveraging Soft references for garbage
-collection friendliness for expensive data structures that may be
-contained by such lazy fields:
-
-[source,groovy]
----------------------------------------------------------
-class Person {
-    @Lazy(soft = true) List pets = ['Cat', 'Dog', 'Bird']
-}
-
-
-def p = new Person()
-assert p.pets.contains('Cat')
----------------------------------------------------------
-
-The internal field created by the compiler for `pets` will actually be a
-Soft reference, but accessing `p.pets` directly will return the value
-(ie. the list of pets) held by that reference, making the use of the
-soft reference transparent to the user of that class.
-
-[[Groovy16releasenotes-Delegate]]
-=== @Delegate
-
-Java doesn’t provide any built-in delegation mechanism, and so far
-Groovy didn’t either. But with the `@Delegate` transformation, a class
-field or property can be annotated and become an object to which method
-calls are delegated. In the following example, an `Event` class has a
-date delegate, and the compiler will delegate all of `Date`’s methods
-invoked on the `Event` class to the `Date` delegate. As shown in the
-latest `assert`, the `Event` class has got a `before(Date)` method, and
-all of `Date`’s methods.
-
-[source,groovy]
---------------------------------------------------------------
-import java.text.SimpleDateFormat
-
-
-class Event {
-    @Delegate Date when
-    String title, url
-}
-
-
-def df = new SimpleDateFormat("yyyy/MM/dd")
-
-
-def gr8conf = new Event(title: "GR8 Conference",
-                          url: "http://www.gr8conf.org",
-                         when: df.parse("2009/05/18"))
-def javaOne = new Event(title: "JavaOne",
-                          url: "http://java.sun.com/javaone/",
-                         when: df.parse("2009/06/02"))
-
-assert gr8conf.before(javaOne.when)
---------------------------------------------------------------
-
-The Groovy compiler adds all of `Date`’s methods to the `Event` class,
-and those methods simply delegate the call to the `Date` field. If the
-delegate is not a final class, it is even possible to make
-the `Event` class a subclass of `Date` simply by extending `Date`, as
-shown below. No need to implement the delegation ourselves by adding
-each and every `Date` methods to our `Event` class, since the compiler
-is friendly-enough with us to do the job itself.
-
-[source,groovy]
---------------------------
-class Event extends Date {
-    @Delegate Date when
-    String title, url
-}
---------------------------
-
-In the case you are delegating to an interface, however, you don’t even
-need to explictely say you implement the interface of the delegate.
-The `@Delegate` transformation will take care of this and implement that
-interface. So the instances of your class will automatically
-be `instanceof` the delegate’s interface.
-
-[source,groovy]
------------------------------------------------------
-import java.util.concurrent.locks.*
-
-
-class LockableList {
-    @Delegate private List list = []
-    @Delegate private Lock lock = new ReentrantLock()
-}
-
-
-def list = new LockableList()
-
-
-list.lock()
-try {
-    list << 'Groovy'
-    list << 'Grails'
-    list << 'Griffon'
-} finally {
-    list.unlock()
-}
-
-
-assert list.size() == 3
-assert list instanceof Lock
-assert list instanceof List
------------------------------------------------------
-
-In this example, our `LockableList` is now a composite of a list and a
-lock and is `instanceof` of `List` and `Lock`. However, if you didn’t
-intend your class to be implementing these interfaces, you would still
-be able to do so by specifying a parameter on the annotation:
-
-[source,groovy]
-----------------------------------------------------
-@Delegate(interfaces = false) private List list = []
-----------------------------------------------------
-
-[[Groovy16releasenotes-Newify]]
-=== @Newify
-
-The `@Newify` transformation proposes two new ways of instantiating
-classes. The first one is providing Ruby like approach to creating
-instances with a `new()` class method:
-
-[source,groovy]
---------------------------------
-@Newify rubyLikeNew() {
-    assert Integer.new(42) == 42
-}
-
-
-rubyLikeNew()
---------------------------------
-
-But it is also possible to follow the Python approach with omitting
-the `new` keyword. Imagine the following tree creation:
-
-[source,groovy]
------------------------------------------------------------------
-class Tree {
-    def elements
-    Tree(Object... elements) { this.elements = elements as List }
-}
-
-
-class Leaf {
-    def value
-    Leaf(value) { this.value = value }
-}
-
-
-def buildTree() {
-    new Tree(new Tree(new Leaf(1), new Leaf(2)), new Leaf(3))
-}
-
-
-buildTree()
------------------------------------------------------------------
-
-The creation of the tree is not very readable because of all
-those `new` keywords spread across the line. The Ruby approach wouldn’t
-be more readable, since a `new()` method call for creating each element
-is needed. But by using `@Newify`, we can improve our tree building
-slightly to make it easier on the eye:
-
-[source,groovy]
------------------------------------------
-@Newify([Tree, Leaf]) buildTree() {
-    Tree(Tree(Leaf(1), Leaf(2)), Leaf(3))
-}
------------------------------------------
-
-You’ll also notice that we just allowed `Tree` and `Leaf` to
-be _newified_. By default, under the scope which is annotated, all
-instantiations are_newified_, but you can limit the reach by specifying
-the classes you’re interested in. Also, note that for our example,
-perhaps a Groovy builder may have been more appropriate, since its
-purpose is to indeed create any kind of hierarchical / tree strucutre.
-
-If we take another look at our coordinates example from a few sections
-earlier, using both `@Immutable` and `@Newify` can be interesting for
-creating a path with a concise but type-safe manner:
-
-[source,groovy]
------------------------------------------
-@Immutable final class Coordinates {
-    Double latitude, longitude
-}
-
-
-@Immutable final class Path {
-    Coordinates[] coordinates
-}
-
-
-@Newify([Coordinates, Path])
-def build() {
-    Path(
-        Coordinates(48.824068, 2.531733),
-        Coordinates(48.857840, 2.347212),
-        Coordinates(48.858429, 2.342622)
-    )
-}
-
-
-assert build().coordinates.size() == 3
------------------------------------------
-
-A closing remark here: since a `Path(Coordinates[] coordinates)` was
-generated, we can use that constructor in a _varargs way_ in Groovy,
-just as if it had been defined as `Path(Coordinates... coordinates)`.
-
-[[Groovy16releasenotes-CategoryandMixin]]
-=== @Category and @Mixin
-
-If you’ve been using Groovy for a while, you’re certainly familiar with
-the concept of Categories. It’s a mechanism to extend existing types
-(even final classes from the JDK or third-party libraries), to add new
-methods to them. This is also a technique which can be used when writing
-Domain-Specific Languages. Let’s consider the example below:
-
-[source,groovy]
---------------------------------------------
-final class Distance {
-    def number
-    String toString() { "${number}m" }
-}
-
-
-class NumberCategory {
-    static Distance getMeters(Number self) {
-        new Distance(number: self)
-    }
-}
-
-
-use(NumberCategory) {
-    def dist = 300.meters
-
-
-    assert dist instanceof Distance
-    assert dist.toString() == "300m"
-}
---------------------------------------------
-
-We have a simplistic and fictive `Distance` class which may have been
-provided by a third-party, who had the bad idea of making the
-class`final` so that nobody could ever extend it in any way. But thanks
-to a Groovy Category, we are able to decorate the `Distance` type with
-additional methods. Here, we’re going to add a `getMeters()` method to
-numbers, by actually decorating the `Number` type. By adding a getter to
-a number, you’re able to reference it using the nice property syntax of
-Groovy. So instead of writing `300.getMeters()`, you’re able to
-write `300.meters`.
-
-The downside of this category system and notation is that to add
-instance methods to other types, you have to create `static` methods,
-and furthermore, there’s a first argument which represents the instance
-of the type we’re working on. The other arguments are the normal
-arguments the method will take as parameters. So it may be a bit less
-intuitive than a normal method definition we would have added
-to `Distance`, should we have had access to its source code for
-enhancing it. Here comes the `@Category` annotation, which transforms a
-class with instance methods into a Groovy category:
-
-[source,groovy]
-----------------------------------
-@Category(Number)
-class NumberCategory {
-    Distance getMeters() {
-        new Distance(number: this)
-    }
-}
-----------------------------------
-
-No need for declaring the methods `static`, and the `this` you use here
-is actually the number on which the category will apply, it’s not the
-real `this` of the category instance should we create one. Then to use
-the category, you can continue to use the `use(Category) {}`construct.
-What you’ll notice however is that these kind of categories only apply
-to one single type at a time, unlike classical categories which can be
-applied to any number of types.
-
-Now, pair `@Category` extensions to the `@Mixin` transformation, and you
-can mix in various behavior in a class, with an approach similar to
-multiple inheritance:
-
-[source,groovy]
--------------------------------------------------
-@Category(Vehicle) class FlyingAbility {
-    def fly() { "I'm the ${name} and I fly!" }
-}
-
-
-@Category(Vehicle) class DivingAbility {
-    def dive() { "I'm the ${name} and I dive!" }
-}
-
-
-interface Vehicle {
-    String getName()
-}
-
-
-@Mixin(DivingAbility)
-class Submarine implements Vehicle {
-    String getName() { "Yellow Submarine" }
-}
-
-
-@Mixin(FlyingAbility)
-class Plane implements Vehicle {
-    String getName() { "Concorde" }
-}
-
-
-@Mixin([DivingAbility, FlyingAbility])
-class JamesBondVehicle implements Vehicle {
-    String getName() { "James Bond's vehicle" }
-}
-
-
-assert new Plane().fly() ==
-       "I'm the Concorde and I fly!"
-assert new Submarine().dive() ==
-       "I'm the Yellow Submarine and I dive!"
-
-
-assert new JamesBondVehicle().fly() ==
-       "I'm the James Bond's vehicle and I fly!"
-assert new JamesBondVehicle().dive() ==
-       "I'm the James Bond's vehicle and I dive!"
--------------------------------------------------
-
-You don’t inherit from various interfaces and inject the same behavior
-in each subclass, instead you mixin the categories into your class.
-Here, our marvelous James Bond vehicle gets the flying and diving
-capabilities through mixins.
-
-An important point to make here is that unlike `@Delegate` which
-can _inject_ interfaces into the class in which the delegate is
-declared,`@Mixin` just does runtime mixing — as we shall see in the
-metaprogramming enhancements further down in this article.
-
-[[Groovy16releasenotes-PackageScope]]
-=== @PackageScope
-
-Groovy’s convention for properties is that any _field_ without any
-visibility modifier is exposed as a property, with a getter and a setter
-transparently generated for you. For instance, this `Person` class
-exposes a getter `getName()` and a setter `setName()` for a
-private `name` field:
-
-[source,groovy]
----------------
-class Person {
-    String name
-}
----------------
-
-Which is equivalent to this Java class:
-
-[source,groovy]
----------------------------------------------------
-public class Person {
-    private String name;
-    public String getName() { return name; }
-    public void setName(name) { this.name = name; }
-}
----------------------------------------------------
-
-That said, this approach has one drawback in that you don’t have the
-possibility to define a field with package-scope visibility. To be able
-to expose a field with package-scope visibility, you can now annotate
-your field with the `@PackageScope` annotation.
-
-[[Groovy16releasenotes-GrapetheGroovyAdaptableAdvancedPackagingEngine]]
-== Grape, the Groovy Adaptable / Advanced Packaging Engine
-
-To continue our overview of the AST transformations, we’ll now learn
-more about Grape, a mechanism to add and leverage dependencies in your
-Groovy scripts. Groovy scripts can require certain libraries: by
-explicitly saying so in your script with the *@Grab* transformation or
-with the *Grape.grab()* method call, the runtime will find the needed
-JARs for you. With Grape, you can easily distribute scripts without
-their dependencies, and have them downloaded on first use of your script
-and cached. Under the hood, Grape uses Ivy and Maven repositories
-containing the libraries you may need in your scripts.
-
-Imagine you want to get the links of all the PDF documents referenced by
-the Java 5 documentation. You want to parse the HTML page as if it were
-an XML-compliant document (which it is not) with the Groovy `XmlParser`,
-so you can use the TagSoup SAX-compliant parser which transforms HTML
-into well-formed valid XML. You don’t even have to mess up with your
-classpath when running your script, just_grab_ the TagSoup library
-through Grape:
-
-[source,groovy]
-------------------------------------------------------------------------
-import org.ccil.cowan.tagsoup.Parser
-
-
-// find the PDF links in the Java 1.5.0 documentation
-@Grab(group='org.ccil.cowan.tagsoup', module='tagsoup', version='0.9.7')
-def getHtml() {
-    def tagsoupParser = new Parser()
-    def parser = new XmlParser(tagsoupParser)
-    parser.parse("http://java.sun.com/j2se/1.5.0/download-pdf.html")
-}
-
-html.body.'**'.a.@href.grep(~/.*\.pdf/).each{ println it }
-------------------------------------------------------------------------
-
-For the pleasure of giving another example: let’s use
-the link:http://eclipse.org/jetty/[Jetty servlet container] to
-expose link:{DOCS_BASEURL}/html/documentation/template-engines.html[Groovy templates] in
-a few lines of code:
-
-[source,groovy]
---------------------------------------------------------------------------------
-import org.mortbay.jetty.Server
-import org.mortbay.jetty.servlet.*
-import groovy.servlet.*
-
-
-@Grab(group = 'org.mortbay.jetty', module = 'jetty-embedded', version = '6.1.0')
-def runServer(duration) {
-    def server = new Server(8080)
-    def context = new Context(server, "/", Context.SESSIONS);
-    context.resourceBase = "."
-    context.addServlet(TemplateServlet, "*.gsp")
-    server.start()
-    sleep duration
-    server.stop()
-}
-
-
-runServer(10000)
---------------------------------------------------------------------------------
-
-Grape will download Jetty and its dependencies on first launch of this
-script, and cache them. We’re creating a new Jetty `Server` on port
-8080, then expose Groovy’s `TemplateServlet` at the root of the context
-— Groovy comes with its own powerful template engine mechanism. We start
-the server and let it run for a certain duration. Each time someone will
-hit +http://localhost:8080/somepage.gsp+, it will display
-the `somepage.gsp` template to the user — those template pages should be
-situated in the same directory as this server script.
-
-Grape can also be used as a method call instead of as an annotation. You
-can also install, list, resolve dependencies from the command-line using
-the `grape` command. For link:../grape.html[more information on Grape], please refer to the documentation.
-
-[[Groovy16releasenotes-Swingbuilderimprovements]]
-== Swing builder improvements
-
-To wrap up our overview of AST transformations, let’s finish by speaking
-about two transformations very useful to Swing
-developers:`@Bindable` and `@Vetoable`. When creating Swing UIs, you’re
-often interested in monitoring the changes of value of certain UI
-elements. For this purpose, the usual approach is to use
-JavaBeans `PropertyChangeListener`s to be notified when the value of a
-class field changes. You then end up writing this very common
-boiler-plate code in your Java beans:
-
-[source,groovy]
-------------------------------------------------------------------------
-import com.googlecode.openbeans.PropertyChangeSupport;
-import com.googlecode.openbeans.PropertyChangeListener;
-
-
-public class MyBean {
-    private String prop;
-
-
-    PropertyChangeSupport pcs = new PropertyChangeSupport(this);
-
-
-    public void addPropertyChangeListener(PropertyChangeListener l) {
-        pcs.add(l);
-    }
-
-
-    public void removePropertyChangeListener(PropertyChangeListener l) {
-        pcs.remove(l);
-    }
-
-
-    public String getProp() {
-        return prop;
-    }
-
-
-    public void setProp(String prop) {
-        pcs.firePropertyChanged("prop", this.prop, this.prop = prop);
-    }
-
-}
-------------------------------------------------------------------------
-
-Fortunately, with Groovy and the `@Bindable` annotation, this code can
-be greatly simplified:
-
-[source,groovy]
--------------------------
-class MyBean {
-    @Bindable String prop
-}
--------------------------
-
-Now pair that with Groovy’s Swing builder new `bind()` method, define a
-text field and bind its value to a property of your data model:
-
-[source,groovy]
---------------------------------------------------------------------
-textField text: bind(source: myBeanInstance, sourceProperty: 'prop')
---------------------------------------------------------------------
-
-Or even:
-
-[source,groovy]
---------------------------------------------
-textField text: bind { myBeanInstance.prop }
---------------------------------------------
-
-The binding also works with simple expressions in the closure, for
-instance something like this is possible too:
-
-[source,groovy]
---------------------------------------------
-bean location: bind { pos.x + ', ' + pos.y }
---------------------------------------------
-
-You may also be interested in having a look
-at link:{DOCS_BASEURL}/html/api/groovy/util/ObservableMap.html[ObservableMap] and link:{DOCS_BASEURL}/html/api/groovy/util/ObservableList.html[ObservableList],
-for a similar mechanism on maps and lists.
-
-Along with `@Bindable`, there’s also a `@Vetoable` transformation for
-when you need to be able to veto some property change. Let’s consider
-a `Trompetist` class, where the performer’s name is not allowed to
-contain the letter `z':
-
-[source,groovy]
----------------------------------------------------------------------------------------
-import com.googlecode.openbeans.*
-import groovy.beans.Vetoable
-
-
-class Trumpetist {
-    @Vetoable String name
-}
-
-
-def me = new Trumpetist()
-me.vetoableChange = { PropertyChangeEvent pce ->
-    if (pce.newValue.contains('z'))
-        throw new PropertyVetoException("The letter 'z' is not allowed in a name", pce)
-}
-
-
-me.name = "Louis Armstrong"
-
-
-try {
-    me.name = "Dizzy Gillespie"
-    assert false: "You should not be able to set a name with letter 'z' in it."
-} catch (PropertyVetoException pve) {
-    assert true
-}
----------------------------------------------------------------------------------------
-
-Looking at a more thorough Swing builder example with binding:
-
-[source,groovy]
-----------------------------------------------------------------------------
-import groovy.swing.SwingBuilder
-import groovy.beans.Bindable
-import static javax.swing.JFrame.EXIT_ON_CLOSE
-
-
-class TextModel {
-    @Bindable String text
-}
-
-
-def textModel = new TextModel()
-
-
-SwingBuilder.build {
-    frame( title: 'Binding Example (Groovy)', size: [240,100], show: true,
-          locationRelativeTo: null, defaultCloseOperation: EXIT_ON_CLOSE ) {
-        gridLayout cols: 1, rows: 2
-        textField id: 'textField'
-        bean textModel, text: bind{ textField.text }
-        label text: bind{ textModel.text }
-    }
-}
-----------------------------------------------------------------------------
-
-Running this script shows up the frame below with a text field and a
-lable below, and the label’s text is bound on the text field’s content.
-
-image:http://www.infoq.com/resource/articles/groovy-1-6/en/resources/bindable-example.png[image]
-
-SwingBuilder has evolved so nicely in the past year that the Groovy
-Swing team decided to launch a new project based on it, and on the
-Grails foundations: project link:http://griffon-framework.org/[Griffon] was
-born. Griffon proposes to bring the _Convention over
-Configuration_ paradigm of Grails, as well as all its project structure,
-plugin system, gant scripting capabilities, etc.
-
-If you are developing Swing rich clients, make sure to have a look
-at link:http://griffon-framework.org/[Griffon].
-
-[[Groovy16releasenotes-Swingconsoleimprovements]]
-== Swing console improvements
-
-Swinging along the topic of UIs, the Swing console has also evolved:
-
-* The console can be run as an Applet (`groovy.ui.ConsoleApplet`).
-* Beyond syntax highlighting, the editor also supports code indentation.
-* Drag’n droping a Groovy script over the text area will open the file.
-* You can modify the classpath with which the script in the console is
-being run, by adding a new JAR or a directory to the classpath as shown
-in the screenshot below.
-+
-+
-image:http://www.infoq.com/resource/articles/groovy-1-6/en/resources/sc-add-jar.png[image]
-+
-* A couple options have been added to the view menu item: for showing
-the script being run in the output area, and for visualizing the
-execution results.
-+
-+
-image:http://www.infoq.com/resource/articles/groovy-1-6/en/resources/sc-options.png[image]
-+
-* When an exception is thrown in your script, the lines of the
-stacktrace relative to your script are clickable, for easy navigation to
-the point where the error occurred.
-+
-+
-image:http://www.infoq.com/resource/articles/groovy-1-6/en/resources/sc-click-stack.png[image]
-+
-* Also, when your script contains compilation errors, the error messages
-are clickable too.
-+
-+
-image:http://www.infoq.com/resource/articles/groovy-1-6/en/resources/sc-click-comp-error.png[image]
-+
-
-Back on the visualization of the results in the script output area, a
-fun system was added to let you customize how certain results are
-rendered. When you execute a script returning a map of Jazz musicians,
-you may see something like this in your console:
-
-image:http://www.infoq.com/resource/articles/groovy-1-6/en/resources/sc-without-visu.png[image]
-
-What you see here is the usual textual representation of a `Map`. But,
-what if we enabled custom visualization of certain results? The Swing
-console allows you to do just that. First of all, you have to ensure
-that the visualization option is
-ticked: `View -> Visualize Script Results` — for the record, all
-settings of the Groovy Console are stored and remembered thanks to the
-Preference API. There are a few result visualizations built-in: if the
-script returns a `java.awt.Image`, a `javax.swing.Icon`, or
-a `java.awt.Component` with no parent, the object is displayed instead
-of its `toString()` representation. Otherwise, everything else is still
-just represented as text. Now, create the following Groovy script
-in `~/.groovy/OutputTransforms.groovy`:
-
-[source,groovy]
----------------------------------------------------------
-import javax.swing.*
-
-transforms << { result ->
-    if (result instanceof Map) {
-        def table = new JTable(
-            result.collect{ k, v -<
-                [k, v?.inspect()] as Object[]
-            } as Object[][],
-            ['Key', 'Value'] as Object[])
-        table.preferredViewportSize = table.preferredSize
-        return new JScrollPane(table)
-    }
-}
----------------------------------------------------------
-
-The Groovy Swing console will execute that script on startup, injecting
-a `transforms` list in the binding of the script, so that you can add
-your own script results representations. In our case, we transform
-the `Map` into a nice-looking Swing `JTable`. And we’re now able to
-visualize maps in a friendly and attractive fashion, as the screenshot
-below
-shows:image:http://www.infoq.com/resource/articles/groovy-1-6/en/resources/sc-with-visu.png[image]
-
-The Swing console is obviously not to be confused with a real full-blown
-IDE, but for daily scripting tasks, the console is a handy tool in your
-toolbox.
-
-[[Groovy16releasenotes-Metaprogrammingenhancements]]
-== Metaprogramming enhancements
-
-What makes Groovy a dynamic language is its Meta-Object Protocol and its
-concept of metaclasses which represent the runtime behavior of your
-classes and instances. In Groovy 1.6, we continue improving this dynamic
-runtime system, bringing several new capabilities into the mix.
-
-[[Groovy16releasenotes-PerinstancemetaclassevenforPOJOs]]
-=== Per instance metaclass even for POJOs
-
-So far, Groovy POGOs (Plain Old Groovy Objects) could have a
-per-instance metaclass, but POJOs could only have one metaclass for all
-instances (ie. a per-class metaclass). This is now not the case anymore,
-as POJOs can have a per-instance metaclass too. Also, setting the
-metaclass property to null will restore the default metaclass.
-
-[[Groovy16releasenotes-ExpandoMetaClassDSL]]
-=== ExpandoMetaClass DSL
-
-Initially developed under the link:http://grails.org/[Grails] umbrella and
-integrated back into Groovy 1.5, ExpandoMetaClass is a very handy way
-for changing the runtime behavior of your objects and classes, instead
-of writing full-blow `MetaClass` classes. Each time, we want to add /
-change several properties or methods of an existing type, there is too
-much of a repetition of `Type.metaClass.xxx`. Take for example this
-extract of
-a link:http://groovy.dzone.com/news/domain-specific-language-unit-[Unit
-manipulation DSL] dealing with operator overloading:
-
-[source,groovy]
----------------------------------------------------------------------------------
-Number.metaClass.multiply = { Amount amount -> amount.times(delegate) }
-Number.metaClass.div =      { Amount amount -> amount.inverse().times(delegate) }
-
-
-Amount.metaClass.div =      { Number factor -> delegate.divide(factor) }
-Amount.metaClass.div =      { Amount factor -> delegate.divide(factor) }
-Amount.metaClass.multiply = { Number factor -> delegate.times(factor) }
-Amount.metaClass.power =    { Number factor -> delegate.pow(factor) }
-Amount.metaClass.negative = { -> delegate.opposite() }
----------------------------------------------------------------------------------
-
-The repetition, here, looks obvious. But with the ExpandoMetaClass DSL,
-we can streamline the code by regrouping the operators per type:
-
-[source,groovy]
-------------------------------------------------------------------
-Number.metaClass {
-    multiply { Amount amount -> amount.times(delegate) }
-    div      { Amount amount -> amount.inverse().times(delegate) }
-}
-
-
-Amount.metaClass {
-    div <<   { Number factor -> delegate.divide(factor) }
-    div <<   { Amount factor -> delegate.divide(factor) }
-    multiply { Number factor -> delegate.times(factor) }
-    power    { Number factor -> delegate.pow(factor) }
-    negative { -> delegate.opposite() }
-}
-------------------------------------------------------------------
-
-A `metaClass()` method takes a closure as single argument, containing
-the various definitions of the methods and properties, instead of
-repeating the `Type.metaClass` on each line. When there is just one
-method of a given name, use the pattern `methodName { /* closure */ }`,
-but when there are several, you should use the append operator and
-follow the patten `methodName << { /* closure */ }`. Static methods can
-also be added through this mechanism, so instead of the classical
-approach:
-
-[source,groovy]
----------------------------------------------------------
-// add a fqn() method to Class to get the fully
-// qualified name of the class (ie. simply Class#getName)
-Class.metaClass.static.fqn = { delegate.name }
-
-
-assert String.fqn() == "java.lang.String"
----------------------------------------------------------
-
-You can now do:
-
-[source,groovy]
------------------------------
-Class.metaClass {
-    'static' {
-        fqn { delegate.name }
-    }
-}
------------------------------
-
-Note here that you have to quote the `static` keyword, to avoid this
-construct to look like a static initializer. For one off method
-addition, the classical approach is obviously more concise, but when you
-have several methods to add, the EMC DSL makes sense.
-
-The usual approach for adding properties to existing classes through
-ExpandoMetaClass is to add a getter and a setter as methods. For
-instance, say you want to add a method that counts the number of words
-in a text file, you could try this:
-
-[source,groovy]
-------------------------------------
-File.metaClass.getWordCount = {
-    delegate.text.split(/\w/).size()
-}
-
-
-new File('myFile.txt').wordCount
-------------------------------------
-
-When there is some logic inside the getter, this is certainly the best
-approach, but when you just want to have new properties holding simple
-values, through the ExpandoMetaClass DSL, it is possible to define them.
-In the following example, a `lastAccessed` property is added to
-a `Car` class — each instance will have its property. Whenever a method
-is called on that car, this property is updated with a newer timestamp.
-
-[source,groovy]
-------------------------------------------------------------------------
-class Car {
-    void turnOn() {}
-    void drive() {}
-    void turnOff() {}
-}
-
-
-Car.metaClass {
-    lastAccessed = null
-    invokeMethod = { String name, args ->
-        def metaMethod = delegate.metaClass.getMetaMethod(name, args)
-        if (metaMethod) {
-            delegate.lastAccessed = new Date()
-            metaMethod.doMethodInvoke(delegate, args)
-        } else {
-            throw new MissingMethodException(name, delegate.class, args)
-        }
-    }
-}
-
-
-
-def car = new Car()
-println "Last accessed: ${car.lastAccessed ?: 'Never'}"
-
-
-car.turnOn()
-println "Last accessed: ${car.lastAccessed ?: 'Never'}"
-
-
-car.drive()
-sleep 1000
-println "Last accessed: ${car.lastAccessed ?: 'Never'}"
-
-
-sleep 1000
-car.turnOff()
-println "Last accessed: ${car.lastAccessed ?: 'Never'}"
-------------------------------------------------------------------------
-
-In our example, in the DSL, we access that property through
-the `delegate` of the closure,
-with `delegate.lastAccessed = new Date()`. And we intercept any method
-call thanks to `invokeMethod()`, delegating to the original method for
-the call, and throwing an exception in case the method doesn’t exist.
-Later on, you can see by executing this script that `lastAccessed` is
-updated as soon as we call a method on our instance.
-
-[[Groovy16releasenotes-Runtimemixins]]
-=== Runtime mixins
-
-Last metaprogramming feature we’ll cover today: runtime
-mixins. `@Mixin` allowed you to mixin new behavior to classes you owned
-and were designing. But you could not mixin anything to types you didn’t
-own. Runtime mixins propose to fill that gap by letting you add a mixin
-on any type at runtime. If we think again about our example of vehicles
-with some mixed-in capabilities, if we didn’t _own_ James Bond’s vehicle
-and give it some diving ability, we could use this mechanism:
-
-[source,groovy]
----------------------------------------------------
-// provided by a third-party
-interface Vehicle {
-    String getName()
-}
-
-
-// provided by a third-party
-class JamesBondVehicle implements Vehicle {
-    String getName() { "James Bond's vehicle" }
-}
-
-
-JamesBondVehicle.mixin DivingAbility, FlyingAbility
-
-
-assert new JamesBondVehicle().fly() ==
-       "I'm the James Bond's vehicle and I fly!"
-assert new JamesBondVehicle().dive() ==
-       "I'm the James Bond's vehicle and I dive!"
----------------------------------------------------
-
-One or more mixins can be passed as argument to the
-static `mixin()` method added by Groovy on `Class`.
-
-[[Groovy16releasenotes-JSR-223GroovyScriptingEngine]]
-== JSR-223 Groovy Scripting Engine
-
-Before Groovy 1.6, if you wanted to integrate Groovy in your Java
-projects through JSR-223 / `javax.script.*`, you had to download a
-Groovy script engine implementation from java.net, and put the JAR in
-your classpath. This additional step wasn’t very developer friendly,
-requiring some additional work — the JAR wasn’t even provided in the
-Groovy distribution. Thankfully, 1.6 comes with an implementation of
-the `javax.script.*` APIs.
-
-Below, you’ll find an example evaluating Groovy expressions (the code is
-in Groovy, but it’s straightforward to convert it back to Java):
-
-[source,groovy]
-----------------------------------------------
-import javax.script.*
-
-
-def manager = new ScriptEngineManager()
-def engine = manager.getEngineByName("groovy")
-
-
-assert engine.evaluate("2 + 3") == 5
-----------------------------------------------
-
-Please note that the `javax.script.*` APIs are available only on Java 6.
-
-[[Groovy16releasenotes-JMXBuilder]]
-== JMX Builder
-
-Originiating as an link:http://code.google.com/p/groovy-jmx-builder/[external
-Open-Source project] hosted on Google Code, JMX Builder has been
-integrated in Groovy 1.6, to simplify the life of developers needing to
-interact or expose JMX services. JMX Builder features:
-
-* Domain Specific Language (DSL) for JMX API using Builder pattern
-* Simplified JMX API’s programmability
-* Declaratively expose Java/Groovy objects as JMX managed MBeans
-* Support class-embedded or explicit descriptors
-* Inherent support for JMX’s event model
-* Seamlessly create JMX event broadcasters
-* Attach event listeners as inline closures
-* Use Groovy’s dynamic nature to easily react to JMX events
-notifications
-* Provides a flexible registration policy for MBean
-* No special interfaces or class path restrictions
-* Shields developer from complexity of JMX API
-* Exposes attribute, constructors, operations, parameters, and
-notifications
-* Simplifies the creation of connector servers and connector clients
-* Support for exporting JMX timers
-
-You can find link:../jmx.html[more information on JMX Builder] and its very extensive coverage of the JMX
-system. Lots of examples will show you how to create a JMX connector
-server or client, how to easily export POGOs as JMX managed beans, how
-to listen to JMX events, and much more.
-
-[[Groovy16releasenotes-ImprovedOSGisupport]]
-== Improved OSGi support
-
-The Groovy jar files are released with correct OSGi metadata, so they
-can be loaded as a bundle into any OSGi compliant container, such as
-Eclipse Equinox or Apache Felix.
-
-[[Groovy16releasenotes-Summary]]
-== Summary
-
-Groovy continues its march towards the goal of *simplifying the life of
-developers*, providing various new features and improvements in this new
-release: AST transformations reducing dramatically the number of lines
-of code to express certain concerns and patterns and opening the
-language to developers for further extension, several *metaprogramming
-enhancements to streamline your code* and let you write *more expressive
-business rules*, and *support for common enterprise APIs* such as Java
-6’s scripting APIs, JMX management system, or OSGi’s programming model.
-All of this is done obviously *without compromising on the seamless
-integration with Java*, and furthermore, with a *level of performance
-way higher than previous releases*.
\ No newline at end of file
diff --git a/site/src/site/releasenotes/groovy-1.7.adoc b/site/src/site/releasenotes/groovy-1.7.adoc
deleted file mode 100644
index cf401a0..0000000
--- a/site/src/site/releasenotes/groovy-1.7.adoc
+++ /dev/null
@@ -1,433 +0,0 @@
-[[Groovy17releasenotes-IDESupport]]
-== IDE Support
-
-Before diving directly into the new features in Groovy 1.7, please let
-me mention the great progress made in terms of IDE support for Groovy
-(and also for http://griffon-framework.org/[Griffon],
-http://gradle.org/[Gradle], https://gant.github.io/[Gant] or
-http://grails.org/[Grails]). All the major IDEs (Eclipse,
-http://www.jetbrains.com/idea/features/groovy_grails.html[IntelliJ
-IDEA], http://wiki.netbeans.org/Groovy[NetBeans]) provide an excellent
-level of support for the language. Initially, the Eclipse support was
-the one lacking the most, but thanks to the hard work of the
-SpringSource Eclipse team, we now have a great environment for
-developing mixed Java / Groovy applications with features like
-cross-language refactoring, Groovy-specific code completion, and more.
-
-New and Improved Eclipse pluginFor more information on the Eclipse
-support, please have a look at the Groovy Eclipse plugin home page, as
-well as the notes for the M1 release and M2 release.
-
-[[Groovy17releasenotes-Newfeatures]]
-== New features
-
-[[Groovy17releasenotes-AnonymousInnerClassesandNestedClasses]]
-=== Anonymous Inner Classes and Nested Classes
-
-Although oftentimes closures and maps coercion suffice, there are still
-areas where the lack of Anonymous Inner Classes (AIC) and Nested Classes
-(NC) can be problematic. That’s why we decided to eventually implement
-AIC and NC in Groovy 1.7.
-
-Be CarefulThe implementation of AIC and NC follows the Java lead, but
-you should not take out the Java Language Spec and keep shaking the head
-about things that are different. The implementation done looks much like
-what we do for groovy.lang.Closure, with some benefits and some
-differences. Accessing private fields and methods for example can become
-a problem, but on the other hand local variables don’t have to be final.
-
-[[Groovy17releasenotes-NestedStaticClasses]]
-==== Nested Static Classes
-
-Here’s an example of Nested Static Classes:
-
-[source,groovy]
----------------------
-class A {
-    static class B {}
-}
-
-new A.B()
----------------------
-
-The usage of static nested classes is the best supported one. If you
-absolutely need an inner class, you should make it a static one.
-
-[[Groovy17releasenotes-AnonymousInnerClasses]]
-==== Anonymous Inner Classes
-
-Some other examples, this time for Anonymous Inner Classes:
-
-[source,groovy]
---------------------------------
-boolean called = false
-
-Timer timer = new Timer()
-timer.schedule(new TimerTask() {
-    void run() {
-        called = true
-    }
-}, 0)
-sleep 100
-
-assert called
---------------------------------
-
-More informationIf you want to learn a bit more about the cases which
-are currently supported in 1.7, you can have a look at one of our unit
-tests covering this new feature.
-
-[[Groovy17releasenotes-AccessingtheOuterContextfromaNestedClass]]
-==== Accessing the Outer Context from a Nested Class
-
-If you are in a nested class Y and the surrounding class is X, then you
-can access the variable v of X in Java by X.this.v. Groovy does not
-support this syntax.
-
-[[Groovy17releasenotes-CreatingInstancesofNon-StaticInnerClasses]]
-==== Creating Instances of Non-Static Inner Classes
-
-In Java you can do this:
-
-[source,java]
-----------------------------------
-public class Y {
-    public class X {}
-    public X foo() {
-        return new X();
-    }
-    public static X createX(Y y) {
-        return y.new X();
-    }
-}
-----------------------------------
-
-It should be noted that the nested class X needs a reference to the
-outer class instance of Y. For this Java will create a constructor that
-takes Y as first parameter in X. This constructor is synthetic, so it
-won’t appear in any code completion. +
- In case of new X(), like you have it in method foo(), then compiler
-will then create new X(this) instead. In case of createX the compiler
-will create new X(y). Groovy does not support this.
-
-Instead Groovy supports giving the instance in like the compiler would
-do it. That means the code above has to be rewritten as
-
-[source,groovy]
-----------------------------------
-public class Y {
-    public class X {}
-    public X foo() {
-        return new X(this);
-    }
-    public static X createX(Y y) {
-        return new X(y);
-    }
-}
-----------------------------------
-
-CautionCaution though, Groovy supports calling methods with one
-parameter without giving an argument. The parameter will then have the
-value null. Basically the same rules apply to calling a constructor.
-There is a danger that you will write new X() instead of new X(this) for
-example. Since this might also be the regular way we have not yet found
-a good way to prevent this problem.
-
-[[Groovy17releasenotes-Annotations]]
-=== Annotations
-
-Groovy’s support of annotations is identical to Java 5 annotations, but
-we felt that in some cases it would be interesting to be able to add
-annotations in other places than the usual places (types, fields,
-methods, parameters, etc.). For instance, in Java, it is impossible to
-add annotations on imports or packages. Groovy does go beyond and adds
-support for annotation on imports, packages and variable declarations.
-We’ll take a look at the usage of those extended annotations on Grape.
-
-[[Groovy17releasenotes-Grape]]
-==== Grape
-
-The Grape dependency system lets you request dependencies in your
-scripts, without having to deal with downloading, packaging, or
-specifying the classpath yourself. To use Grape, we had to use the @Grab
-annotation to ``grab'' a dependency from a repository (Maven’s central
-repository, for example). The problem was that annotation had to be
-attached to some allowed elements, ie. the places where annotations can
-be put in Java. Now, we can put annotations on imports:
-
-[source,groovy]
-------------------------------------------------------------------------------------
-@Grab(group='net.sf.json-lib', module='json-lib', version='2.3', classifier='jdk15')
-import net.sf.json.groovy.*
-
-assert new JsonSlurper().parseText(
-    new JsonGroovyBuilder().json {
-        book(title: "Groovy in Action", author:"Dierk König et al")
-    }.toString()
-).book.title == 'Groovy in Action'
-------------------------------------------------------------------------------------
-
-Another example with @Grab on variable declarations:
-
-[source,groovy]
---------------------------------------------------------------------------------------------------------
-@Grab('net.sf.json-lib:json-lib:2.3:jdk15')
-def builder = new net.sf.json.groovy.JsonGroovyBuilder()
-
-def books = builder.books {
-    book(title: "Groovy in Action", author: "Dierk Koenig")
-}
-
-assert books.toString() == '''{"books":{"book":{"title":"Groovy in Action","author":"Dierk Koenig"}}}'''
---------------------------------------------------------------------------------------------------------
-
-RemarkPlease note on this one an improvement in the @Grab annotation: we
-provide a shorter version taking just a String as value parameter
-representing the dependency, in addition to the more verbose example in
-the previous example. You simply append the group, module, version and
-classifier together, joined by colons.
-
-A Grape *resolver* was added, so you can specify a remote location where
-grapes are downloaded from:
-
-[source,groovy]
-------------------------------------------------------------------
-@GrabResolver(name='restlet.org', root='http://maven.restlet.org')
-@Grab(group='org.restlet', module='org.restlet', version='1.1.6')
-import org.restlet.Restlet
-// ...
-------------------------------------------------------------------
-
-[[Groovy17releasenotes-PowerAsserts]]
-=== Power Asserts
-
-Groovy’s ``assert'' keyword has sometimes been criticized as it’s, in a
-way, limited, as it just checks that the expression it’s being passed is
-true or false. Unlike with testing frameworks such as JUnit/TestNG and
-the various additional assertion utilities, where you get nicer and more
-descriptive messages, Groovy’s assert would just tell you the expression
-was false, and would give the value of variables used in the expression,
-but nothing more. With Power Asserts, initially developed in the
-http://spockframework.org/[Spock Framework], the output of the assert is
-now much nicer and provides a visual representation of the value of each
-sub-expressions of the expression being asserted. For example:
-
-[source,groovy]
------------------------------------------------------
-assert new File('foo.bar') == new File('example.txt')
------------------------------------------------------
-
-Will yield:
-
-[source,groovy]
------------------------------------------------------
-Caught: Assertion failed:
-
-assert new File('foo.bar') == new File('example.txt')
-       |                   |  |
-       foo.bar             |  example.txt
-                           false
------------------------------------------------------
-
-[[Groovy17releasenotes-AST]]
-=== AST
-
-With Groovy 1.6, we introduced AST Transformations, for letting
-developers do compile-time metaprogramming, by modifying the Abstract
-Syntax Tree before it is transformed into bytecode. In Groovy 1.6,
-several such transformations were added, especially ``local''
-transformations triggered by annotations (such as @Delegate, @Singleton,
-@Bindable and friends). However powerful this feature is, writing AST
-transformation has always been a bit tedious. Groovy 1.7 features two
-new features which should help simplify the work of AST transformation
-writers: an AST viewer and an AST builder.
-
-[[Groovy17releasenotes-ASTViewer]]
-==== AST Viewer
-
-The following screenshot shows a new window that can be launched from
-the Groovy Swing Console. You can visualize the AST of a script you’re
-working on in the console: for instance, writing the code you’d like to
-create in your AST transformation. The AST viewer greatly help with
-figuring out how Groovy builds its AST when compiling your Groovy
-code. +
- image:attachments/126320769/134184968.png[image]
-
-[[Groovy17releasenotes-ASTBuilder]]
-==== AST Builder
-
-Visualizing the AST is one thing, but we also need a mechanism to create
-and modify ASTs more easily. The introduction of the AST builder
-simplifies the authoring of AST transformations, by giving you three
-different approaches for working on the AST:
-
-* building from string
-* building from code
-* building from specification
-
-Before the AST builder, one had to create and instantiate manually all
-the various AST nodes. Let’s see how those three forms help with this,
-for instance for creating a node representing a constant string.
-
-[[Groovy17releasenotes-Buildingfromstring]]
-===== Building from string
-
-[source,groovy]
------------------------------------------------------------------------
-List<ASTNode> nodes = new AstBuilder().buildFromString(''' "Hello" ''')
------------------------------------------------------------------------
-
-[[Groovy17releasenotes-Buildingfromcode]]
-===== Building from code
-
-[source,groovy]
-----------------------------------------------------------------
-List<ASTNode> nodes = new AstBuilder().buildFromCode { "Hello" }
-----------------------------------------------------------------
-
-[[Groovy17releasenotes-Buildingfromspecification]]
-====== Building from specification
-
-[source,groovy]
-------------------------------------------------------
-List<ASTNode> nodes = new AstBuilder().buildFromSpec {
-    block {
-        returnStatement {
-            constant "Hello"
-        }
-    }
-}
-------------------------------------------------------
-
-For more informationPlease have a look at the documentation on the AST
-Builder. You’ll discover the advantages and inconveniences of the
-various forms, and why all three are needed depending on what you want
-to achieve with the AST.
-
-[[Groovy17releasenotes-Otherminorenhancements]]
-Other minor enhancements
-------------------------
-
-[[Groovy17releasenotes-AbilitytocustomizetheGroovyTruth]]
-=== Ability to customize the Groovy Truth
-
-In Groovy, booleans aren’t the sole things which can be evaluated to
-true or false, but for instance, null, empty strings or collections are
-evaluated to false or true if of length > 0 or non-empty. This notion of
-'truth' was coined 'Groovy Truth' in the
-http://www.manning.com/koenig/[Groovy in Action] book. With Groovy
-Truth, instead of doing frequent null checks, you could simply write:
-
-[source,groovy]
---------------------------------------------------------------
-def string = "more than one character"
-if (string) { println "the String is neither null nor empty" }
---------------------------------------------------------------
-
-Up until Groovy 1.7, only a small set of classes had a certain meaning
-with regards to how they were coerced to a boolean value, but now it is
-possible to provide a method for coercion to boolean in your own
-classes. For example, the following Predicate class offers the ability
-to coerce Predicate instances to true or false, thanks to the
-implementation of the boolean asBoolean() method:
-
-[source,groovy]
------------------------------------
-class Predicate {
-    boolean value
-    boolean asBoolean() { value }
-}
-
-assert new Predicate(value: true)
-assert !new Predicate(value: false)
------------------------------------
-
-Is is also possible to use categories or ExpandoMetaClass to inject an
-asBoolean() method, or to override an existing one (even one on the
-small set of classes with special Groovy truth behavior).
-
-[[Groovy17releasenotes-Dependencyupgrades]]
-=== Dependency upgrades
-
-Some of the dependencies of Groovy have been upgraded to newer versions.
-
-For instance, Groovy now uses the latest ASM version, which is
-``invokedynamic''-ready. So as we progress towards the inclusion of
-JSR-292 / invokedynamic, we’ll be ready and be using the latest version
-of ASM. We also use the latest version of Ivy which is used by the Grape
-dependency module.
-
-[[Groovy17releasenotes-RewriteoftheGroovyScriptEngine]]
-=== Rewrite of the GroovyScriptEngine
-
-The GroovyScriptEngine (which is also used by Groovlets) has been
-rewritten to solve various dependency issues it was suffering from, and
-the outcome of this is that it should also now be much faster overall.
-
-The new logic uses additional phase operations to track dependencies. As
-a result the error-prone class loader technique to track them is gone
-now. These operations ensure that every script file will be tracked, its
-dependencies recorded during compilation and all transitive dependencies
-will be calculated. And only scripts will be recorded as dependency, no
-classes. The new GroovyScriptEngine also uses only one compilation
-``process'' for script compilation which solves the problem of circular
-or mutual dependencies, that caused stack overflows in the past. As a
-result the new engine can reliably handle dependencies and should be
-much faster. 
-
-[[Groovy17releasenotes-Groovyconsolepreferences]]
-=== Groovy console preferences
-
-A small annoyance, especially for developers using big LCD screens: the
-Groovy Console didn’t remember preferences of position of the separator
-between the coding area and output view, or the font size being used.
-This is now fixed, as the console remembers such settings. You won’t
-need anymore to adjust the console to your liking each time you run it,
-it should now have some more brain cells to remember your preferences.
-
-[[Groovy17releasenotes-NewoutputwindowfortheGroovyconsole]]
-=== New output window for the Groovy console
-
-There is a new visualization option for the results of the execution of
-your scripts in your Groovy Console. Instead of displaying the results
-in the bottom output pane, it’s now possible to use an external window
-for viewing those results. Run your script with CTRL-R or CMD-R, you
-will see something like the following screenshot. You can then dismiss
-the window by hitting Escape, CTRL-W (CMD-W on Macs) or Enter.
-image:attachments/126320769/135528463.png[image] +
- You will also notice the addition of line numbers in the gutter of the
-editor area.
-
-[[Groovy17releasenotes-SQLbatchupdatesandtransactions]]
-=== SQL batch updates and transactions
-
-[[Groovy17releasenotes-Batchupdates]]
-==== Batch updates
-
-The Groovy Sql class now features batch updates, thanks to its new
-withBatch() method, taking a closure and a statement instance:
-
-[source,groovy]
-----------------------------------------------------------------
-sql.withBatch { stmt ->
-    ["Paul", "Jochen", "Guillaume"].each { name ->
-        stmt.addBatch "insert into PERSON (name) values ($name)"
-    }
-}
-----------------------------------------------------------------
-
-[[Groovy17releasenotes-Transactions]]
-==== Transactions
-
-Similarly, there’s a withTransaction() method added to Sql, which works
-also with datasets:
-
-[source,groovy]
------------------------------------
-def persons = sql.dataSet("person")
-sql.withTransaction {
-    persons.add name: "Paul"
-    persons.add name: "Jochen"
-    persons.add name: "Guillaume"
-}
------------------------------------
diff --git a/site/src/site/releasenotes/groovy-1.8.adoc b/site/src/site/releasenotes/groovy-1.8.adoc
deleted file mode 100644
index 25f96d6..0000000
--- a/site/src/site/releasenotes/groovy-1.8.adoc
+++ /dev/null
@@ -1,1554 +0,0 @@
-The 1.8 release of Groovy comes with many new features that greatly
-enhance
-
-* the dynamic expressiveness of Groovy, specifically for defining DSLs
-* runtime performance
-* concurrent and parallel execution
-* design by contract
-* functional programming style
-* first-class JSON support
-* compile-time meta programming
-* and more helpers and library additions
-
-These features have undergone the Groovy developer process with formal
-descriptions, discussion, and voting (GEP - Groovy Enhancement Proposal)
-for core parts and less formal developer discussions and JIRA voting for
-additional parts.
-
-Our goal has stayed the same, though: to give the Java developer a tool
-that makes him more productive, allows him to achieve his goals faster
-and with a smaller margin of error, and extend the scalability of the
-Java platform from full-blown enterprise projects to everyday "getting
-things done" tasks.
-
-[[Groovy18releasenotes-CommandchainsfornicerDomain-SpecificLanguages]]
-== Command chains for nicer Domain-Specific Languages
-
-Thanks to its flexible syntax and its compile-time and runtime
-metaprogramming capabilities, Groovy is well known for its
-Domain-Specific Language capabilities. However, we felt that we could
-improve upon the syntax further by removing additional punctuation
-symbols when users chain method calls. This allows DSL implementors to
-develop command descriptions that read almost like natural sentences.
-
-Before Groovy 1.8, we could omit parentheses around the arguments of a
-method call for top-level statements. But we couldn’t chain method
-calls. The new `command chain` feature allows us to chain such
-parentheses-free method calls, requiring neither parentheses around
-arguments, nor dots between the chained calls. The general idea is that
-a call like `a b c d` will actually be equivalent to `a(b).c(d)`. This
-also works with multiple arguments, closure arguments, and even named
-arguments. Furthermore, such command chains can also appear on the
-right-hand side of assignments. Let’s have a look at some examples
-supported by this new syntax:
-
-[source,groovy]
----------------------------------------------------------------------------------------------------------------
-turn left then right                           // equivalent to: turn(left).then(right)
-take 2.pills of chloroquinine after 6.hours    // equivalent to: take(2.pills).of(chloroquinine).after(6.hours)
-paint wall with red, green and yellow          // equivalent to: paint(wall).with(red, green).and(yellow)
-
-// with named parameters too
-check that: margarita tastes good             // equivalent to: check(that: margarita).tastes(good)
-
-// with closures as parameters
-given { } when { } then { }                    // equivalent to: given({}).when({}).then({})
----------------------------------------------------------------------------------------------------------------
-
-It is also possible to use methods in the chain which take no arguments,
-but in that case, the parentheses are needed:
-
-[source,groovy]
--------------------------------------------------------------------------------------------------
-select all unique() from names                 // equivalent to: select(all).unique().from(names)
--------------------------------------------------------------------------------------------------
-
-If your command chain contains an odd number of elements, the chain will
-be composed of method / arguments, and will finish by a final property
-access:
-
-[source,groovy]
--------------------------------------------------------------------------------------
-take 3 cookies                                 // equivalent to: take(3).cookies
-                                               // and also this: take(3).getCookies()
--------------------------------------------------------------------------------------
-
-This new command chain approach opens up interesting possibilities in
-terms of the much wider range of DSLs which can now be written in
-Groovy. This new feature has been developed thanks to the Google Summer
-of Code program, where our student, Lidia, helped us modify the Groovy
-Antlr grammar to extend top-level statements to accept that command
-chain syntax.
-
-The above examples illustrate using a command chain based DSL but not
-how to create one. You will be able to find some
-http://groovyconsole.appspot.com/tag/gep3[further examples] of `command chains`
-on the Groovy Web Console but to illustrate creating such a
-DSL, we will show just a couple of examples - first using maps and
-Closures:
-
-[source,groovy]
-------------------------------------------------------------------------------------------------------
-show = { println it }
-square_root = { Math.sqrt(it) }
-
-def please(action) {
-  [the: { what ->
-    [of: { n -> action(what(n)) }]
-  }]
-}
-
-please show the square_root of 100             // equivalent to: please(show).the(square_root).of(100)
-// ==> 10.0
-------------------------------------------------------------------------------------------------------
-
-Or if you prefer Japanese and a metaprogramming style (see
-http://d.hatena.ne.jp/uehaj/20100919/1284906117[here] for more details):
-
-[source,groovy]
-----------------------------------------------------------
-// Japanese DSL using GEP3 rules
-Object.metaClass.を =
-Object.metaClass.の = { clos -> clos(delegate) }
-
-まず = { it }
-表示する = { println it }
-平方根 = { Math.sqrt(it) }
-
-まず 100 の 平方根 を 表示する  // First, show the square root of 100
-// => 10.0
-----------------------------------------------------------
-
-As a second example, consider how you might write a DSL for simplifying
-one of your existing APIs. Maybe you need to put this code in front of
-customers, business analysts or testers who might be not hard-core Java
-developers. We’ll use the `Splitter` from the Google
-http://code.google.com/p/guava-libraries/[Guava libraries] project as it
-already has a nice Fluent API. Here is how we might use it out of the
-box:
-
-[source,groovy]
-----------------------------------------------------------------------------------------------------------------
-@Grab('com.google.guava:guava:r09')
-import com.google.common.base.*
-def result = Splitter.on(',').trimResults(CharMatcher.is('_' as char)).split("_a ,_b_ ,c__").iterator().toList()
-assert result == ['a ', 'b_ ', 'c']
-----------------------------------------------------------------------------------------------------------------
-
-It reads fairly well for a Java developer but if that is not your target
-audience or you have many such statements to write, it could be
-considered a little verbose. Again, there are many options for writing a
-DSL. We’ll keep it simple with Maps and Closures. We’ll first write a
-helper method:
-
-[source,groovy]
-------------------------------------------------------------------------------------------------------
-def split(string) {
-  [on: { sep ->
-    [trimming: { trimChar ->
-      Splitter.on(sep).trimResults(CharMatcher.is(trimChar as char)).split(string).iterator().toList()
-    }]
-  }]
-}
-------------------------------------------------------------------------------------------------------
-
-now instead of this line from our original example:
-
-[source,groovy]
-----------------------------------------------------------------------------------------------------------------
-def result = Splitter.on(',').trimResults(CharMatcher.is('_' as char)).split("_a ,_b_ ,c__").iterator().toList()
-----------------------------------------------------------------------------------------------------------------
-
-we can write this:
-
-[source,groovy]
------------------------------------------------------
-def result = split "_a ,_b_ ,c__" on ',' trimming '_'
------------------------------------------------------
-
-[[Groovy18releasenotes-Performanceimprovements]]
-== Performance improvements
-
-Groovy’s flexible metaprogramming model involves numerous decision
-points when making method calls or accessing properties to determine
-whether any metaprogamming hooks are being utilized. During complex
-expression calculations, such decision points involved identical checks
-being executed numerous times. Recent performance improvements allow
-some of these checks to be bypassed during an expression calculation
-once certain initial assumptions have been checked. Basically if certain
-preconditions hold, some streamlining can take place.
-
-Groovy 1.8.0 contains two main streams of optimization work:
-
-* There are several optimizations for basic operations on integers like
-plus, minus, multiply, increment, decrement and comparisons. This
-version doesn’t support the mixed usage of different types. If an
-expression contains different types, then it falls back to the classical
-way of performing the operation, i.e. no streamlining occurs.
-* There is also an optimization for direct method calls. Such a method
-call is done directly if it is done on `this` and if the argument
-types are a direct match with the parameter types of the method we may
-call. Since this is an operation that does not behave too well with a
-method call logic based on runtime types we select only methods where
-the primitive types match, the parameter types are final or for methods
-that take no arguments. Currently methods with a variable parameter list
-are not matched in general, unless a fitting array is used for the
-method call.
-
-Those two areas of optimization are only the beginning of further
-similar improvements. Upcoming versions of the Groovy 1.8.x branch will
-see more optimizations coming. In particular, primitive types other than
-integers should be expected to be supported shortly.
-
-[[Groovy18releasenotes-GParsbundledwithintheGroovydistribution]]
-== GPars bundled within the Groovy distribution
-
-The http://gpars.github.io[GPars] project offers developers new
-intuitive and safe ways to handle Java or Groovy tasks concurrently,
-asynchronously, and distributed by utilizing the power of the Java
-platform and the flexibility of the Groovy language. Groovy 1.8 now
-bundles GPars 0.11 in the libraries of the Groovy installation, so that
-you can leverage all the features of the library for +
- Fork/Join, Map/Filter/Reduce, DataFlow, Actors, Agents, and more with
-all the Groovy goodness.
-
-To learn more about GPars, head over to the
-http://gpars.github.io/[GPars website], read the
-http://gpars.org/guide/index.html[detailed online user guide], or check
-out chapter 17 of http://www.manning.com/koenig2[Groovy in Action, 2nd
-Edition (MEAP)].
-
-[[Groovy18releasenotes-Closureenhancements]]
-== Closure enhancements
-
-Closures are a central and essential piece of the Groovy programming
-language and are used in various ways throughout the Groovy APIs. In
-Groovy 1.8, we introduce the ability to use closures as annotation
-parameters. Closures are also a key part of what gives Groovy its
-functional flavor.
-
-[[Groovy18releasenotes-Closureannotationparameters]]
-=== Closure annotation parameters
-
-In Java, there’s a limited set of types you can use as annotation
-parameters (String, primitives, annotations, classes, and arrays of
-these). But in Groovy 1.8, we’re going further and let you use closures
-as annotation parameters – which are actually transformed into a class
-parameter for compatibility reasons.
-
-[source,groovy]
-------------------------------------------------
-import java.lang.annotation.*
-
-@Retention(RetentionPolicy.RUNTIME)
-@interface Invariant {
-    Class value() // will hold a closure class
-}
-
-@Invariant({ number >= 0 })
-class Distance {
-    float number
-    String unit
-}
-
-def d = new Distance(number: 10, unit: "meters")
-
-def anno = Distance.getAnnotation(Invariant)
-def check = anno.value().newInstance(d, d)
-
-assert check(d)
-------------------------------------------------
-
-Closure annotation parameters open up some interesting possibilities for
-framework authors! As an example, the
-https://github.com/andresteingress/gcontracts/wiki/[GContracts] project,
-which brings the `Design by Contract` paradigm to Groovy makes heavy
-use of annotation parameters to allow preconditions, postconditions and
-invariants to be declared.
-
-[[Groovy18releasenotes-Closurefunctionalflavors]]
-=== Closure functional flavors
-
-[[Groovy18releasenotes-Closurecomposition]]
-==== Closure composition
-
-If you recall your math lessons, function composition may be a concept
-you’re familiar with. And in turn, *Closure composition* is about that:
-the ability to compose Closures together to form a new Closure which
-chains the call of those Closures. Here’s an example of composition in
-action:
-
-[source,groovy]
----------------------------------------------
-def plus2  = { it + 2 }
-def times3 = { it * 3 }
-
-def times3plus2 = plus2 << times3
-assert times3plus2(3) == 11
-assert times3plus2(4) == plus2(times3(4))
-
-def plus2times3 = times3 << plus2
-assert plus2times3(3) == 15
-assert plus2times3(5) == times3(plus2(5))
-
-// reverse composition
-assert times3plus2(3) == (times3 >> plus2)(3)
----------------------------------------------
-
-To see more examples of Closure composition and reverse composition,
-please have a look at our
-https://github.com/apache/groovy/blob/master/src/test/groovy/ClosureComposeTest.groovy[test
-case].
-
-[[Groovy18releasenotes-Closuretrampoline]]
-==== Closure trampoline
-
-When writing recursive algorithms, you may be getting the infamous stack
-overflow exceptions, as the stack starts to have a too high depth of
-recursive calls. An approach that helps in those situations is by using
-Closures and their new
-http://en.wikipedia.org/wiki/Tail_call#Through_trampolining[trampoline]
-capability.
-
-Closures are wrapped in a `TrampolineClosure`. Upon calling, a
-trampolined Closure will call the original Closure waiting for its
-result. If the outcome of the call is another instance of a
-`TrampolineClosure`, created perhaps as a result to a call to the
-`trampoline()` method, the Closure will again be invoked. This
-repetitive invocation of returned trampolined Closures instances will
-continue until a value other than a trampolined Closure is returned.
-That value will become the final result of the trampoline. That way,
-calls are made serially, rather than filling the stack.
-
-Here’s an example of the use of `trampoline()` to implement the
-factorial function:
-
-[source,groovy]
-------------------------------------------------------------------
-def factorial
-factorial = { int n, def accu = 1G ->
-    if (n < 2) return accu
-    factorial.trampoline(n - 1, n * accu)
-}
-factorial = factorial.trampoline()
-
-assert factorial(1)    == 1
-assert factorial(3)    == 1 * 2 * 3
-assert factorial(1000) == 402387260... // plus another 2560 digits
-------------------------------------------------------------------
-
-[[Groovy18releasenotes-Closurememoization]]
-==== Closure memoization
-
-Another improvement to Closures is the ability to
-http://en.wikipedia.org/wiki/Memoization[memoize] the outcome of
-previous (ideally side-effect free) invocations of your Closures. The
-return values for a given set of Closure parameter values are kept in a
-cache, for those memoized Closures. That way, if you have an expensive
-computation to make that takes seconds, you can put the return value in
-cache, so that the next execution with the same parameter will return
-the same result – again, we assume results of an invocation are the same
-given the same set of parameter values.
-
-There are three forms of memoize functions:
-
-* the standard `memoize()` which caches all the invocations
-* `memoizeAtMost(max)` call which caches a maximum number of invocations
-* `memoizeAtLeast(min)` call which keeps at least a certain number of
-invocation results
-* and `memoizeBetween(min, max)` which keeps a range results (between a
-minimum and a maximum)
-
-Let’s illustrate that:
-
-[source,groovy]
---------------------------------------------------
-def plus = { a, b -> sleep 1000; a + b }.memoize()
-assert plus(1, 2) == 3 // after 1000ms
-assert plus(1, 2) == 3 // return immediately
-assert plus(2, 2) == 4 // after 1000ms
-assert plus(2, 2) == 4 // return immediately

-// other forms:
-
-// at least 10 invocations cached
-def plusAtLeast = { ... }.memoizeAtLeast(10)
-
-// at most 10 invocations cached
-def plusAtMost = { ... }.memoizeAtMost(10)
-
-// between 10 and 20 invocations cached
-def plusAtLeast = { ... }.memoizeBetween(10, 20)
---------------------------------------------------
-
-[[Groovy18releasenotes-Curryingimprovements]]
-=== Currying improvements
-
-Currying improvements have also been backported to recent releases of
-Groovy 1.7, but it’s worth outlining here for reference. Currying used
-to be done only from left to right, but it’s also possible to do it from
-right to left, or from a given index, as the following examples
-demonstrate:
-
-[source,groovy]
-------------------------------------------
-// right currying
-def divide = { a, b -> a / b }
-def halver = divide.rcurry(2)
-assert halver(8) == 4

-// currying n-th parameter
-def joinWithSeparator = { one, sep, two ->
-    one + sep + two
-}
-def joinWithComma =
-    joinWithSeparator.ncurry(1, ', ')
-assert joinWithComma('a', 'b') == 'a, b'
-------------------------------------------
-
-[[Groovy18releasenotes-NativeJSONsupport]]
-== Native JSON support
-
-With the ubiquity of JSON as an interchange format for our applications,
-it is natural that Groovy added support for JSON, in a similar fashion
-as the support Groovy’s always had with XML. So Groovy 1.8 introduces a
-JSON builder and parser.
-
-[[Groovy18releasenotes-ReadingJSON]]
-=== Reading JSON
-
-A `JsonSlurper` class allows you to parse JSON payloads, and access the
-nested Map and List data structures representing that content. JSON
-objects and arrays are indeed simply represented as Maps and Lists,
-giving you access to all the GPath expression benefits
-(subscript/property notation, find/findAll/each/inject/groupBy/etc.).
-Here’s an example showing how to find all the recent commit messages on
-the Grails project:
-
-[source,groovy]
---------------------------------------------------------------------------------------------------
-import groovy.json.*
-
-def payload = new URL("http://github.com/api/v2/json/commits/list/grails/grails-core/master").text
-
-def slurper = new JsonSlurper()
-def doc = slurper.parseText(payload)
-
-doc.commits.message.each { println it }
---------------------------------------------------------------------------------------------------
-
-If you want to see some more examples of the usage of the JSON parser,
-you can have a look at the
-https://github.com/apache/groovy/blob/master/subprojects/groovy-json/src/test/groovy/groovy/json/JsonSlurperTest.groovy[JsonSlurper
-tests] in our code base.
-
-[[Groovy18releasenotes-JSONbuilder]]
-=== JSON builder
-
-Parsing JSON data structures is one thing, but we should also be able to
-produce JSON content just like we create markup with the
-`MarkupBuilder`. The following example:
-
-[source,groovy]
-----------------------------
-import groovy.json.*
-
-def json = new JsonBuilder()
-
-json.person {
-    name "Guillaume"
-    age 33
-    pets "Hector", "Felix"
-}
-
-println json.toString()
-----------------------------
-
-Will create the JSON output:
-
-[source,groovy]
-------------------------------------------------------------------
-{"person":{"name":"Guillaume","age":33,"pets":["Hector","Felix"]}}
-------------------------------------------------------------------
-
-You can find some more usages of the JSON builder in our
-https://github.com/apache/groovy/blob/master/subprojects/groovy-json/src/test/groovy/groovy/json/JsonBuilderTest.groovy[JsonBuilder
-tests].
-
-[[Groovy18releasenotes-PrettyprintingJSONcontent]]
-=== Pretty printing JSON content
-
-When given a JSON data structure, you may wish to pretty-print it, so
-that you can more easily inspect it, with a more friendly layout. So for
-instance, if you want to pretty print the result of the previous
-example, you could do:
-
-[source,groovy]
---------------------------------------------------------------------------------------------------------------------
-import groovy.json.*
-
-println JsonOutput.prettyPrint('''{"person":{"name":"Guillaume","age":33,"pets":["Hector","Felix"]}}''')​​​​​​​​​​​​
---------------------------------------------------------------------------------------------------------------------
-
-Which would result in the following pretty-printed output:
-
-[source,groovy]
-----------------------------
-{
-    "person": {
-        "name": "Guillaume",
-        "age": 33,
-        "pets": [
-            "Hector",
-            "Felix"
-        ]
-    }
-}
-----------------------------
-
-[[Groovy18releasenotes-NewASTTransformations]]
-== New AST Transformations
-
-The Groovy compiler reads the source code, builds an Abstract Syntax
-Tree (AST) from it, and then puts the AST into bytecode. With AST
-transformations, the programmer can hook into this process. A general
-description of this process, an exhaustive description of all available
-transformations, and a guide of how to write you own ones can be found
-for example in http://www.manning.com/koenig2[Groovy in Action, 2nd
-Edition (MEAP)], chapter 9.
-
-Below is a list of all new transformations that come with Groovy 1.8.
-They save you from writing repetitive code and help avoiding common
-errors.
-
-[[Groovy18releasenotes-Log]]
-=== @Log
-
-You can annotate your classes with the @Log transformation to
-automatically inject a logger in your Groovy classes, under the `log`
-property. Four kind of loggers are actually available:
-
-* `@Log` for java.util.logging
-* `@Commons` for Commons-Logging
-* `@Log4j` for Log4J
-* `@Slf4j` for SLF4J
-
-Here’s a sample usage of the @Log transformation:
-
-[source,groovy]
-----------------------------------
-import groovy.util.logging.*
-
-@Log
-class Car {
-    Car() {
-        log.info 'Car constructed'
-    }
-}
-
-def c = new Car()
-----------------------------------
-
-You can change the name of the logger by specifying a different name,
-for instance with `@Log('myLoggerName')`.
-
-Another particularity of these logger AST transformations is that they
-take care of wrapping and safe-guarding logger calls with the usual
-`isSomeLevelEnabled()` calls. So when you write
-`log.info 'Car constructed'`, the generated code is actually equivalent
-to:
-
-[source,groovy]
----------------------------------
-if (log.isLoggable(Level.INFO)) {
-    log.info 'Car constructed'
-}
----------------------------------
-
-[[Groovy18releasenotes-Field]]
-=== @Field
-
-When defining variables in a script, those variables are actually local
-to the script’s run method, so they are not accessible from other
-methods of the script. A usual approach to that problem has been to
-store variables in the binding, by not def’ining those variables and by
-just assigning them a value. Fortunately, the `@Field` transformation
-provides a better alternative: by annotating your variables in your
-script with this annotation, the annotated variable will become a
-private field of the script class.
-
-More concretely, you’ll be able to do as follows:
-
-[source,groovy]
----------------------------
-@Field List awe = [1, 2, 3]
-def awesum() { awe.sum() }
-assert awesum() == 6
----------------------------
-
-[[Groovy18releasenotes-PackageScopeenhancements]]
-=== @PackageScope enhancements
-
-The @PackageScope annotation can be placed on classes, methods or fields
-and is used for turning off Groovy’s visibility conventions and
-reverting back to Java conventions. This ability is usually only needed
-when using 3rd party libraries which rely on the package scope
-visibility. When adding the `@PackageScope` annotation to a field,
-Groovy will assign package scope access to the field rather than
-automatically treating it as a property (and adding setters/getters).
-Annotating a class or method with `@PackageScope` will cause Groovy to
-revert to Java’s convention of leaving the class/method as package
-scoped rather than automatically promoting it to public scope. The class
-variant can also take one or more parameters to allow nested setting of
-visibility of attributes within the class - see the Javadoc for more
-details. Recent releases of Groovy 1.7 have had a more limited version
-of this annotation.
-
-[[Groovy18releasenotes-AutoClone]]
-=== @AutoClone
-
-The `@AutoClone` annotation is placed on classes which you want to be
-`Cloneable`. The annotation instructs the compiler to execute an AST
-transformation which adds a public `clone()` method and adds `Cloneable`
-to the classes implements list of interfaces. Because the JVM doesn’t
-have a one-size-fits-all cloning strategy, several customizations exist
-for the cloning implementation:
-
-* By default, the `clone()` method will call `super.clone()` before
-calling `clone()` on each `Cloneable` property of the class. Example
-usage:
-
-[source,groovy]
----------------------------------
-import groovy.transform.AutoClone
-
-@AutoClone
-class Person {
-    String first, last
-    List favItems
-    Date since
-}
----------------------------------
-
-Which will create a class of the following form:
-
-[source,groovy]
--------------------------------------------------------------
-class Person implements Cloneable {
-    ...
-    public Object clone() throws CloneNotSupportedException {
-        Object result = super.clone()
-        result.favItems = favItems.clone()
-        result.since = since.clone()
-        return result
-    }
-    ...
-}
--------------------------------------------------------------
-
-
-* Another popular cloning strategy is known as the copy constructor
-pattern. If any of your fields are `final` and `Cloneable` you should
-set `style=COPY_CONSTRUCTOR` which will then use the copy constructor
-pattern.
-* As a final alternative, if your class already implements the
-`Serializable` or `Externalizable` interface, you might like to set
-`style=SERIALIZATION` which will then use serialization to do the
-cloning.
-
-See the Javadoc for `AutoClone` for further details.
-
-[[Groovy18releasenotes-AutoExternalizable]]
-=== @AutoExternalizable
-
-The `@AutoExternalizable` class annotation is used to assist in the
-creation of `Externalizable` classes. The annotation instructs the
-compiler to execute an AST transformation which adds `writeExternal()`
-and `readExternal()` methods to a class and adds `Externalizable` to the
-interfaces which the class implements. The `writeExternal()` method
-writes each property (or field) for the class while the `readExternal()`
-method will read each one back in the same order. Properties or fields
-marked as `transient` are ignored. Example usage:
-
-[source,groovy]
--------------------------
-import groovy.transform.*
-
-@AutoExternalize
-class Person {
-    String first, last
-    List favItems
-    Date since
-}
--------------------------
-
-Which will create a class of the following form:
-
-[source,groovy]
--------------------------------------------------------------
-class Person implements Externalizable {
-    ...
-    void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject(first)
-        out.writeObject(last)
-        out.writeObject(favItems)
-        out.writeObject(since)
-    }
-
-    void readExternal(ObjectInput oin) {
-        first = oin.readObject()
-        last = oin.readObject()
-        favItems = oin.readObject()
-        since = oin.readObject()
-    }
-    ...
-}
--------------------------------------------------------------
-
-[[Groovy18releasenotes-Controllingtheexecutionofyourcode]]
-=== Controlling the execution of your code
-
-When integrating user-provided Groovy scripts and classes in your Java
-application, you may be worried about code that would eat all your CPU
-with infinite loops, or that call methods like `System.exit(0)` (for the
-latter, check the section on compiler customizers, and particularly the
-`SecureASTCustomizer`). It would be interesting to have a wait to
-control the execution of that Groovy code, to be able to interrupt its
-execution when the thread is interrupted, when a certain duration has
-elapsed, or when a certain condition is met (lack of resources, etc).
-
-Groovy 1.8 introduces three transformations for those purposes, as we
-shall see in the following sections. By default, the three
-transformations add some checks in at the beginning of each method body,
-and each closure body, to check whether a condition of interruption is
-met or not.
-
-Note that those transformations are local (triggered by an annotation).
-If you want to apply them transparently, so that the annotation doesn’t
-show up, I encourage you to have a look at the
-`ASTTransformationCustomizer` explained at the end of this article.
-
-Cédric Champeau, our most recent Groovy committer, who implemented those
-features, has a
-http://www.jroller.com/melix/entry/upcoming_groovy_goodness_automatic_thread[very
-nice blog post] covering those code interruption transformations.
-
-[[Groovy18releasenotes-ThreadInterrupt]]
-==== @ThreadInterrupt
-
-You don’t need to write checks in your scripts for whether the current
-thread of execution has been interrupted or not, by default, the
-transformation will add those checks for you for scripts and classes, at
-the beginning of each method body and closure body:
-
-[source,groovy]
----------------------------------------
-@ThreadInterrupt
-import groovy.transform.ThreadInterrupt
-
-while (true) {
-    // eat lots of CPU
-}
----------------------------------------
-
-You can specify a `checkOnMethodStart` annotation parameter (defaults to
-true) to customize where checks are added by the transformation (adds an
-interrupt check by default as the first statement of a method body). And
-you can also specify the `applyToAllClasses` annotation parameter
-(default to true) if you want to specify whether only the current class
-or script should have this interruption logic applied or not.
-
-[[Groovy18releasenotes-TimedInterrupt]]
-==== @TimedInterrupt
-
-With `@TimedInterrupt`, you can interrupt the script after a certain
-amount of time:
-
-[source,groovy]
---------------------------------------
-@TimedInterrupt(10)
-import groovy.transform.TimedInterrupt
-
-while (true) {
-    // eat lots of CPU
-}
---------------------------------------
-
-In addition to the previous annotation parameters we mentioned for
-`@ThreadInterrupt`, you should specify `value`, the amount of time to
-wait, and `unit` (defaulting to `TimeUnit.SECONDS`) to specify the unit
-of time to be used.
-
-[[Groovy18releasenotes-ConditionalInterrupt]]
-==== @ConditionalInterrupt
-
-An example of `@ConditionalInterrupt` which leverages the closure
-annotation parameter feature, and the `@Field` transformation as well:
-
-[source,groovy]
---------------------------------------------
-@ConditionalInterrupt({ counter++ > 2 })
-import groovy.transform.ConditionalInterrupt
-import groovy.transform.Field
-
-@Field int counter = 0
-
-100.times {
-    println 'executing script method...'
-}
---------------------------------------------
-
-You can imagine defining any kind of condition: on counters, on resource
-availability, on resource usage, and more.
-
-[[Groovy18releasenotes-ToString]]
-=== @ToString
-
-Provides your classes with a default `toString()` method which prints
-out the values of the class’ properties (and optionally the property
-names and optionally fields). A basic example is here:
-
-[source,groovy]
------------------------------------------
-import groovy.transform.ToString
-
-@ToString
-class Person {
-    String name
-    int age
-}
-
-println new Person(name: 'Pete', age: 15)
-// => Person(Pete, 15)
------------------------------------------
-
-And here’s another example using a few more options:
-
-[source,groovy]
-----------------------------------------------------
-@ToString(includeNames = true, includeFields = true)
-class Coord {
-    int x, y
-    private z = 0
-}
-println new Coord(x:20, y:5)
-// => Coord(x:20, y:5, z:0)
-----------------------------------------------------
-
-[[Groovy18releasenotes-EqualsAndHashCode]]
-=== @EqualsAndHashCode
-
-Provides your classes with `equals()` and `hashCode()` methods based on
-the values of the class’ properties (and optionally fields and
-optionally super class values for `equals()` and `hashCode()`).
-
-[source,groovy]
------------------------------------------
-import groovy.transform.EqualsAndHashCode
-
-@EqualsAndHashCode
-class Coord {
-    int x, y
-}
-
-def c1 = new Coord(x:20, y:5)
-def c2 = new Coord(x:20, y:5)
-
-assert c1 == c2
-assert c1.hashCode() == c2.hashCode()
------------------------------------------
-
-[[Groovy18releasenotes-TupleConstructor]]
-=== @TupleConstructor
-
-Provides a tuple (ordered) constructor. For POGOs (plain old Groovy
-objects), this will be in addition to Groovy’s default `named-arg`
-constructor.
-
-[source,groovy]
----------------------------------------------------------
-import groovy.transform.TupleConstructor
-
-@TupleConstructor
-class Person {
-    String name
-    int age
-}
-
-def p1 = new Person(name: 'Pete', age: 15) // map-based
-def p2 = new Person('Pete', 15)            // tuple-based
-
-assert p1.name == p2.name
-assert p1.age == p2.age
----------------------------------------------------------
-
-[[Groovy18releasenotes-Canonical]]
-=== @Canonical
-
-Allows you to combine `@ToString`, `@EqualsAndHashCode` and
-`@TupleConstructor`. For those familiar with Groovy’s `@Immutable`
-transform, this provides similar features but for mutable objects.
-
-[source,groovy]
---------------------------------------------
-import groovy.transform.Canonical
-
-@Canonical
-class Person {
-    String name
-    int age
-}
-
-def p1 = new Person(name: 'Pete', age: 15)
-def p2 = new Person('Paul', 15)
-
-p2.name = 'Pete'
-println "${p1.equals(p2)} $p1 $p2"
-// => true Person(Pete, 15) Person(Pete, 15)
---------------------------------------------
-
-By default, `@Canonical` gives you vanilla versions for each of the
-combined annotations. If you want to use any of the special features
-that the individual annotations give you, simply include the individual
-annotation as well.
-
-[source,groovy]
------------------------------------------
-import groovy.transform.*
-
-@Canonical
-@ToString(includeNames = true)
-class Person {
-    String name
-    int age
-}
-
-def p = new Person(name: 'Pete', age: 15)
-println p
-// => Person(name:Pete, age:15)
------------------------------------------
-
-You will find a great
-http://prystash.blogspot.com/2011/04/groovy-18-playing-with-new-canonical.html[write-up
-on @Canonical, @ToString, @EqualsAndHashCode and @TupleConstructor] on
-John Prystash’s weblog.
-
-[[Groovy18releasenotes-InheritConstructors]]
-=== @InheritConstructors
-
-Sometimes, when you want to subclass certain classes, you also need to
-override all the constructors of the parent, even if only to call the
-super constructor. Such a case happens for instance when you define your
-own exceptions, you want your exceptions to also have the constructors
-taking messages and throwable as parameters. But instead of writing this
-kind of boilerplate code each time for your exceptions:
-
-[source,groovy]
---------------------------------------------------------------
-class CustomException extends Exception {
-    CustomException() { super() }
-    CustomException(String msg) { super(msg) }
-    CustomException(String msg, Throwable t) { super(msg, t) }
-    CustomException(Throwable t) { super(t) }
-}
---------------------------------------------------------------
-
-Simply use the @InheritConstructors transformation which takes care of
-overriding the base constructors for you:
-
-[source,groovy]
-------------------------------------------
-import groovy.transform.*
-
-@InheritConstructors
-class CustomException extends Exception {}
-------------------------------------------
-
-[[Groovy18releasenotes-WithReadLockandWithWriteLock]]
-=== @WithReadLock and @WithWriteLock
-
-Those two transformations, combined together, simplify the usage of
-`java.util.concurrent.locks.ReentrantReadWriteLock`, are safer to use
-than the `synchronized` keyword, and improve upon the `@Synchronized`
-transformation with a more granular locking.
-
-More concretely, with an example, the following:
-
-[source,groovy]
-------------------------------------------------------------
-import groovy.transform.*
-
-class ResourceProvider {
-    private final Map<String, String> data = new HashMap<>()
-
-    @WithReadLock
-    String getResource(String key) {
-        return data.get(key)
-    }
-
-    @WithWriteLock
-    void refresh() {
-        //reload the resources into memory
-    }
-}
-------------------------------------------------------------
-
-Will generate code as follows:
-
-[source,groovy]
------------------------------------------------------------------------------
-import java.util.concurrent.locks.ReentrantReadWriteLock
-import java.util.concurrent.locks.ReadWriteLock
-
-class ResourceProvider {
-    private final ReadWriteLock $reentrantlock = new ReentrantReadWriteLock()
-    private final Map<String, String> data = new HashMap<String, String>()
-
-    String getResource(String key) {
-        $reentrantlock.readLock().lock()
-        try {
-            return data.get(key)
-        } finally {
-            $reentrantlock.readLock().unlock()
-        }
-    }
-
-    void refresh() throws Exception {
-        $reentrantlock.writeLock().lock()
-        try {
-            //reload the resources into memory
-        } finally {
-            $reentrantlock.writeLock().unlock()
-        }
-    }
-}
------------------------------------------------------------------------------
-
-[[Groovy18releasenotes-ListenerList]]
-=== @ListenerList
-
-If you annotate a Collection type field with @ListenerList, it generates
-everything that is needed to follow the bean event pattern. This is kind
-of an EventType independent version of what @Bindable is for
-PropertyChangeEvents.
-
-This example shows the most basic usage of the @ListenerList annotation.
-The easiest way to use this annotation is to annotate a field of type
-List and give the List a generic type. In this example we use a List of
-type MyListener. MyListener is a one method interface that takes a
-MyEvent as a parameter. The following code is some sample source code
-showing the simplest scenario.
-
-[source,groovy]
------------------------------------------
-interface MyListener {
-    void eventOccurred(MyEvent event)
-}
-
-class MyEvent {
-    def source
-    String message
-
-    MyEvent(def source, String message) {
-        this.source = source
-        this.message = message
-    }
-}
-class MyBeanClass {
-    @ListenerList
-    List<MyListener> listeners
-}
------------------------------------------
-
-* + addMyListener(MyListener) : void - This method is created based on
-the generic type of your annotated List field. The name and parameter
-type is are based on the List field’s generic parameter.
-* + removeMyListener(MyListener) : void- This method is created based on
-the generic type of your annotated List field. The name and parameter
-type is are based on the List field’s generic parameter.
-* + getMyListeners() : MyListener[] - This method is created based on
-the generic type of your annotated List field.The name is the plural
-form of the List field’s generic parameter, and the return type is an
-array of the generic parameter.
-* + fireEventOccurred(MyEvent) : void - This method is created based on
-the type that the List’s generic type points to. In this case,
-MyListener is a one method interface with an eventOccurred(MyEvent)
-method. The method name is fire[MethodName of the interface] and the
-parameter is the parameter list from the interface. A fireX method will
-be generated for each public method in the target class, including
-overloaded methods. 
-
-[[Groovy18releasenotes-AlignmentswithJDK7]]
-== Alignments with JDK 7
-
-Groovy 1.9 will be the version which will align as much as possible with
-the upcoming JDK 7, so beyond those aspects already covered in Groovy
-(like strings in switch and others), most of those `Project Coin`
-proposals will be in 1.9, except the `diamond operator` which was
-added in 1.8, as explained in the following paragraph.
-
-[[Groovy18releasenotes-Diamondoperator]]
-=== Diamond operator
-
-Java 7 will introduce the `diamond` operator in generics type
-information, so that you can avoid the usual repetition of the
-parameterized types. Groovy decided to adopt the notation before JDK 7
-is actually released. So instead of writing:
-
-[source,groovy]
---------------------------------------------------------
-List<List<String>> list1 = new ArrayList<List<String>>()
---------------------------------------------------------
-
-You can _omit_ the parameterized types and just use the pointy
-brackets, which now look like a diamond:
-
-[source,groovy]
---------------------------------------------
-List<List<String>> list1 = new ArrayList<>()
---------------------------------------------
-
-[[Groovy18releasenotes-NewDGMmethods]]
-== New DGM methods
-
-* count Closure variants
-
-[source,groovy]
----------------------------------------------
-def isEven = { it % 2 == 0 }
-assert [2,4,2,1,3,5,2,4,3].count(isEven) == 5
----------------------------------------------
-
-* countBy
-
-[source,groovy]
-----------------------------------------------------------------------
-assert [0:2, 1:3] == [1,2,3,4,5].countBy{ it % 2 }
-assert [(true):2, (false):4] == 'Groovy'.toList().countBy{ it == 'o' }
-----------------------------------------------------------------------
-
-* plus variants specifying a starting index
-
-[source,groovy]
--------------------------------------------------------
-assert [10, 20].plus(1, 'a', 'b') == [10, 'a', 'b', 20]
--------------------------------------------------------
-
-* equals for Sets and Maps now do flexible numeric comparisons (on
-values for Maps)
-
-[source,groovy]
-----------------------------------------
-assert [1L, 2.0] as Set == [1, 2] as Set
-assert [a:2, b:3] == [a:2L, b:3.0]
-----------------------------------------
-
-* toSet for primitive arrays, Strings and Collections
-
-[source,groovy]
------------------------------------------------------------
-assert [1, 2, 2, 2, 3].toSet() == [1, 2, 3] as Set
-assert 'groovy'.toSet() == ['v', 'g', 'r', 'o', 'y'] as Set
------------------------------------------------------------
-
-* min / max methods for maps taking closures +
- (also available in Groovy 1.7)
-
-[source,groovy]
-----------------------------------------------
-def map = [a: 1, bbb: 4, cc: 5, dddd: 2]
-
-assert map.max { it.key.size() }.key == 'dddd'
-assert map.min { it.value }.value == 1
-----------------------------------------------
-
-* map withDefault\{} +
- Oftentimes, when using a map, for example for counting the frequency of
-words in a document, you need to check that a certain key exists, before
-doing something with the associating value (like incrementing it).
-Nothing really complex, but we could improve upon that with a new
-method, called `withDefault`. So instead of writing code like below:
-
-[source,groovy]
----------------------------------------------------
-def words = "one two two three three three".split()
-def freq = [:]
-words.each {
-    if (it in freq)
-        freq[it] += 1
-    else
-        freq[it] = 1
-}
----------------------------------------------------
-
-Thanks to the new method (also backported to 1.7), you can write the
-example as follows:
-
-[source,groovy]
----------------------------------------------------
-def words = "one two two three three three".split()
-def freq = [:].withDefault { k -> 0 }
-words.each {
-        freq[it] += 1
-}
----------------------------------------------------
-
-[[Groovy18releasenotes-Miscellaneous]]
-== Miscellaneous
-
-[[Groovy18releasenotes-Slashystrings]]
-=== Slashy strings
-
-Slashy strings are now multi-line:
-
-[source,groovy]
------------------------------------
-def poem = /
-to be
-or
-not to be
-/
-
-assert poem.readLines().size() == 4
------------------------------------
-
-This is particularly useful for multi-line regexs when using the regex
-free-spacing comment style (though you would still need to escape
-slashes):
-
-[source,groovy]
--------------------------------------------------------------------------------------------
-// match yyyy-mm-dd from this or previous century
-def dateRegex = /(?x)     # enable whitespace and comments
-((?:19|20)\d\d)           # year (group 1) (non-capture alternation for century)
--                         # seperator
-(0[1-9]|1[012])           # month (group 2)
--                         # seperator
-(0[1-9]|[12][0-9]|3[01])  # day (group 3)
-/
-
-assert '04/04/1988' == '1988-04-04'.find(dateRegex) { all, y, m, d -> [d, m, y].join('/') }
--------------------------------------------------------------------------------------------
-
-[[Groovy18releasenotes-Dollarslashystrings]]
-=== Dollar slashy strings
-
-A new string notation has been introduced: the `dollar slashy` string.
-This is a multi-line GString similar to the slashy string, but with
-slightly different escaping rules. You are no longer required to escape
-slash (with a preceding backslash) but you can use `$$' to escape a `$'
-or `$/' to escape a slash if needed. Here’s an example of its usage:
-
-[source,groovy]
-------------------------
-def name = "Guillaume"
-def date = "April, 21st"
-
-def dollarSlashy = $/
-    Hello $name,
-    today we're ${date}
-    $ dollar-sign
-    $$ dollar-sign
-    \ backslash
-    / slash
-    $/ slash
-/$
-
-println dollarSlashy
-------------------------
-
-This form of string is typically used when you wish to embed content
-that may naturally contains slashes or backslashes and you don’t want to
-have to rework the content to include all of the necessary escaping.
-Some examples are shown below:
-
-* Embedded XML fragments with backslashes:
-
-[source,groovy]
--------------------------------------------
-def tic = 'tic'
-
-def xml = $/
-  <xml>
-  $tic\tac
-  </xml>
-/$
-
-assert "\n<xml>\ntic\\tac\n</xml>\n" == xml
--------------------------------------------
-
-Better than a normal (now multi-line) slashy string where you would have
-to escape the slashes or a triple quote (``'''``) GString where you would
-have to escape the backslashes.
-
-* Or windows pathnames containing a slash at the end:
-
-[source,groovy]
-----------------------
-def dir = $/C:\temp\/$
-----------------------
-
-Previously, triple quote (`'''`) GString required extra escaping, and
-the above sequence was illegal for a normal slashy string. Now, ugly
-workarounds are not needed.
-
-* Embedding multi-line regexs when using the regex free-spacing comment
-style (particularly ones which contain slashes):
-
-[source,groovy]
--------------------------------------------------------------------------------------------
-// match yyyy-mm-dd from current or previous century
-def dateRegex = $/(?x)    # enable whitespace and comments
-((?:19|20)\d\d)           # year (group 1) (non-capture alternation for century)
-[- /.]                    # seperator
-(0[1-9]|1[012])           # month (group 2)
-[- /.]                    # seperator
-(0[1-9]|[12][0-9]|3[01])  # day (group 3)
-/$
-
-assert '04/04/1988' == '1988-04-04'.find(dateRegex) { all, y, m, d -> [d, m, y].join('/') }
-assert '10-08-1989' == '1989/08/10'.find(dateRegex) { all, y, m, d -> [d, m, y].join('-') }
--------------------------------------------------------------------------------------------
-
-So, you can cut and paste most PERL regex examples without further
-escaping.
-
-* Or Strings which are themselves Groovy code fragments containing
-slashes:
-
-[source,groovy]
------------------------------------
-def alphabet = ('a'..'z').join('')
-def code = $/
-    def normal = '\b\t\n\r'
-    def slashy = /\b\t\n\r/
-    assert '$alphabet'.size() == 26
-    assert normal.size() == 4
-    assert slashy.size() == 8
-/$
-println code
-Eval.me(code)
------------------------------------
-
-Again allowing you to cut and paste many slashy string Groovy examples
-and have them embedded within dollar slashy strings without further
-escaping.
-
-[[Groovy18releasenotes-Compilationcustomizers]]
-=== Compilation customizers
-
-The compilation of Groovy code can be configured through the
-`CompilerConfiguration` class, for example for setting the encoding of
-your sources, the base script class, the recompilation parameters, etc).
-`CompilerConfiguration` now has a new option for setting _compilation
-customizers_ (belonging to the `org.codehaus.groovy.control.customizers`
-package). Those customizers allow to customize the compilation process
-in three ways:
-
-* adding default imports with the `ImportCustomizer`: so you don’t have
-to always add the same imports all over again
-* securing your scripts and classes with the `SecureASTCustomizer`: by
-allowing/disallowing certain classes, or special AST nodes (Abstract
-Syntax Tree), filtering imports, you can secure your scripts to avoid
-malicious code or code that would go beyond the limits of what the code
-should be allowed to do.
-* applying AST transformations with the `ASTTransformationCustomizer`:
-lets you apply transformations to all the class nodes of your
-compilation unit.
-
-For example, if you want to apply the @Log transformation to all the
-classes and scripts, you could do:
-
-[source,groovy]
------------------------------------------------------------------------------
-import org.codehaus.groovy.control.CompilerConfiguration
-import org.codehaus.groovy.control.customizers.*
-import groovy.util.logging.Log
-
-def configuration = new CompilerConfiguration()
-configuration.addCompilationCustomizers(new ASTTransformationCustomizer(Log))
-
-def shell = new GroovyShell(configuration)
-shell.evaluate("""
-    class Car {
-        Car() {
-            log.info 'Car constructed'
-        }
-    }
-
-    log.info 'Constructing a car'
-    def c = new Car()
-""")
------------------------------------------------------------------------------
-
-This will log the two messages, the one from the script, and the one
-from the Car class constructor, through java.util.logging. No need to
-apply the @Log transformation manually to both the script and the class:
-the transformation is applied to all class nodes transparently. This
-mechanism can also be used for adding global transformations, just for
-the classes and scripts that you compile, instead of those global
-transformations being applied to all scripts and classes globally.
-
-If you want to add some default imports (single import, static import,
-star import, star static imports, and also aliased imports and static
-imports), you can use the import customizer as follows:
-
-[source,groovy]
---------------------------------------------------------
-import org.codehaus.groovy.control.CompilerConfiguration
-import org.codehaus.groovy.control.customizers.*
-
-def configuration = new CompilerConfiguration()
-def custo = new ImportCustomizer()
-custo.addStaticStar(Math.name)
-configuration.addCompilationCustomizers(custo)
-
-def shell = new GroovyShell(configuration)
-shell.evaluate("""
-    cos PI/3
-""")
---------------------------------------------------------
-
-When you want to evaluate Math expressions, you don’t need anymore to
-use the `import static java.lang.Math.*` star static import to import
-all the Math constants and static functions.
-
-[[Groovy18releasenotes-GStringtoEnumcoercion]]
-=== (G)String to Enum coercion
-
-Given a String or a GString, you can coerce it to Enum values bearing
-the same name, as the sample below presents:
-
-[source,groovy]
------------------------------
-enum Color {
-    red, green, blue
-}
-
-// coercion with as
-def r = "red" as Color
-
-// implicit coercion
-Color b = "blue"
-
-// with GStrings too
-def g = "${'green'}" as Color
------------------------------
-
-[[Groovy18releasenotes-MapssupportisCase]]
-=== Maps support isCase()
-
-Maps now support `isCase()`, so you can use maps in your switch/case
-statements, for instance:
-
-[source,groovy]
-----------------------------------------------
-def m = [a: 1, b: 2]
-def val = 'a'
-
-switch (val) {
-    case m: "key in map"; break
-    // equivalent to // case { val in m }: ...
-    default: "not in map"
-}
-----------------------------------------------
-
-[[Groovy18releasenotes-GrapeGrabImprovements]]
-=== Grape/Grab Improvements
-
-[[Groovy18releasenotes-ShorternotationforGrabResolver]]
-==== Shorter notation for @GrabResolver
-
-When you need to specify a special grab resolver, for when the artifacts
-you need are not stored in Maven central, you could use:
-
-[source,groovy]
-----------------------------------------------------------------------
-@GrabResolver(name = 'restlet.org', root = 'http://maven.restlet.org')
-@Grab('org.restlet:org.restlet:2.0.6')
-import org.restlet.Restlet
-----------------------------------------------------------------------
-
-Groovy 1.8 adds a shorter syntax as well:
-
-[source,groovy]
------------------------------------------
-@GrabResolver('http://maven.restlet.org')
-@Grab('org.restlet:org.restlet:2.0.6')
-import org.restlet.Restlet
------------------------------------------
-
-[[Groovy18releasenotes-CompactformforoptionalGrabattributes]]
-==== Compact form for optional Grab attributes
-
-The `@Grab` annotation has numerous options. For example, to download
-the Apache commons-io library (where you wanted to set the `transitive`
-and `force` attributes - not strictly needed for this example but see
-the Grab or Ivy documentation for details on what those attributes do)
-you could use a grab statement similar to below:
-
-[source,groovy]
----------------------------------------------------------------------------------------------
-@Grab(group='commons-io', module='commons-io', version='2.0.1', transitive=false, force=true)
----------------------------------------------------------------------------------------------
-
-The compact form for grab which allows the artifact information to be
-represented as a string now supports specifying additional attributes.
-As an example, the following script will download the commons-io jar and
-the corresponding javadoc jar before using one of the commons-io
-methods.
-
-[source,groovy]
-----------------------------------------------------------------
-@Grab('commons-io:commons-io:2.0.1;transitive=false;force=true')
-@Grab('commons-io:commons-io:2.0.1;classifier=javadoc')
-import static org.apache.commons.io.FileSystemUtils.*
-assert freeSpaceKb() > 0
-----------------------------------------------------------------
-
-[[Groovy18releasenotes-Sqlimprovements]]
-=== Sql improvements
-
-The `eachRow` and `rows` methods in the `groovy.sql.Sql` class now
-support paging. Here’s an example:
-
-[source,groovy]
----------------------------------------------------
-sql.eachRow('select * from PROJECT', 2, 2) { row ->
-  println "${row.name.padRight(10)} ($row.url)"
-}
----------------------------------------------------
-
-Which will start at the second row and return a maximum of 2 rows.
-Here’s an example result from a database containing numerous projects
-with their URLs:
-
-----------------------------------------
-Grails     (http://grails.org)
-Griffon    (http://griffon-framework.org)
-----------------------------------------
-
-[[Groovy18releasenotes-StoringASTnodemetadata]]
-=== Storing AST node metadata
-
-When developing AST transformations, and particularly when using a
-visitor to navigate the AST nodes, it is sometimes tricky to keep track
-of information as you visit the tree, or if a combination of transforms
-need to be sharing some context. The `ASTNode` base class features 4
-methods to store node metadata:
-
-* `public Object getNodeMetaData(Object key)`
-* `public void copyNodeMetaData(ASTNode other)`
-* `public void setNodeMetaData(Object key, Object value)`
-* `public void removeNodeMetaData(Object key)`
-
-[[Groovy18releasenotes-AbilitytocustomizetheGroovyDoctemplates]]
-=== Ability to customize the GroovyDoc templates
-
-GroovyDoc uses hard-coded templates to create the JavaDoc for your
-Groovy classes. Three templates are used: top-level templates, a
-package-level template, a class template. If you want to customize these
-templates, you can subclass the `Groovydoc` Ant task and override the
-`getDocTemplates()`, `getPackageTemplates()`, and `getClassTemplates()`
-methods pointing at your own templates. Then you can use your custom
-GroovyDoc Ant task in lieu of Groovy’s original one.
diff --git a/site/src/site/releasenotes/groovy-2.0.adoc b/site/src/site/releasenotes/groovy-2.0.adoc
deleted file mode 100644
index 0cbf311..0000000
--- a/site/src/site/releasenotes/groovy-2.0.adoc
+++ /dev/null
@@ -1,886 +0,0 @@
-The newly released Groovy 2.0 brings key static features to the language
-with static type checking and static compilation, adopts JDK 7 related
-improvements with Project Coin syntax enhancements and the support of
-the new `invokedynamic` JVM instruction, and becomes more modular
-than before. In this article, we’re going to look into those new
-features in more detail.
-
-[[Groovy20releasenotes-Astaticthemeforadynamiclanguage]]
-== A static theme for a dynamic language
-
-[[Groovy20releasenotes-Statictypechecking]]
-=== Static type checking
-
-Groovy, by nature, is and will always be a dynamic language. However,
-Groovy is often used as a "Java scripting language", or as a "better
-Java" (ie. a Java with less boilerplate and more power features). A lot
-of Java developers actually use and embed Groovy in their Java
-applications as an extension language, to author more expressive
-business rules, to further customize the application for different
-customers, etc. For such Java-oriented use cases, developers don’t need
-all the dynamic capabilities offered by the language, and they usually
-expect the same kind of feedback from the Groovy compiler as the one
-given by javac. In particular, they want to get compilation errors
-(rather than runtime errors) for things like typos on variable or method
-names, incorrect type assignments and the like. That’s why Groovy 2
-features static type checking support.** +
-**
-
-[[Groovy20releasenotes-Spottingobvioustypos]]
-==== Spotting obvious typos
-
-The static type checker is built using Groovy’s existing powerful AST
-(Abstract Syntax Tree) transformation mechanisms but for those not
-familiar with these mechanisms you can think of it as an optional
-compiler plugin triggered through an annotation. Being an optional
-feature, you are not forced to use it if you don’t need it. To trigger
-static type checking, just use the @TypeChecked annotation on a method
-or on a class to turn on checking at your desired level of granularity.
-Let’s see that in action with a first example:
-
-[source,groovy]
--------------------------------------------------
-import groovy.transform.TypeChecked
-
-void someMethod() {}
-
-@TypeChecked
-void test() {
-    // compilation error:
-    // cannot find matching method sommeeMethod()
-    sommeeMethod()
-
-    def name = "Marion"
-    // compilation error:
-    // the variable naaammme is undeclared
-    println naaammme
-}
--------------------------------------------------
-
-We annotated the test() method with the @TypeChecked annotation, which
-instructs the Groovy compiler to run the static type checking for that
-particular method at compilation time. We’re trying to call someMethod()
-with some obvious typos, and to print the name variable again with
-another typo, and the compiler will throw two compilation errors because
-respectively, the method and variable are not found or declared.** +
-**
-
-[[Groovy20releasenotes-Checkyourassignmentsandreturnvalues]]
-==== Check your assignments and return values
-
-The static type checker also verifies that the return types and values
-of your assignments are coherent:
-
-[source,groovy]
------------------------------------------
-import groovy.transform.TypeChecked
-
-@TypeChecked
-Date test() {
-    // compilation error:
-    // cannot assign value of Date
-    // to variable of type int
-    int object = new Date()
-
-    String[] letters = ['a', 'b', 'c']
-
-    // compilation error:
-    // cannot assign value of type String
-    // to variable of type Date
-    Date aDateVariable = letters[0]
-
-    // compilation error:
-    // cannot return value of type String
-    // on method returning type Date
-    return "today"
-}
------------------------------------------
-
-In this example, the compiler will complain about the fact you cannot
-assign a Date in an int variable, nor can you return a String instead of
-a Date value specified in the method signature. The compilation error
-from the middle of the script is also interesting, as not only does it
-complain of the wrong assignment, but also because it shows type
-inference at play, because the type checker, of course, knows that
-letters[0] is of type String, because we’re dealing with an array of
-Strings.** +
-**
-
-[[Groovy20releasenotes-Moreontypeinference]]
-==== More on type inference
-
-Since we’re mentioning type inference, let’s have a look at some other
-occurrences of it. We mentioned the type checker tracks the return types
-and values:
-
-[source,groovy]
---------------------------------------------
-import groovy.transform.TypeChecked
-
-@TypeChecked
-int method() {
-   if (true) {
-       // compilation error:
-       // cannot return value of type String
-       // on method returning type int
-       'String'
-   } else {
-       42
-   }
-} 
---------------------------------------------
-
-Given a method returning  a value of primitive type int, the type
-checker is able to also check the values returned from different
-constructs like if / else branches, try / catch blocks or switch / case
-blocks. Here, in our example, one branch of the if / else blocks tries
-to return a String value instead of a primitive int, and the compiler
-complains about it.** +
-**
-
-[[Groovy20releasenotes-Commontypeconversionsstillallowed]]
-==== Common type conversions still allowed
-
-The static type checker, however, won’t complain for certain automatic
-type conversions that Groovy supports. For instance, for method
-signatures returning String, boolean or Class, Groovy converts return
-values to these types automatically:
-
-[source,groovy]
-----------------------------------------------------------
-import groovy.transform.TypeChecked
-
-@TypeChecked
-boolean booleanMethod() {
-   "non empty strings are evaluated to true"
-}
-
-assert booleanMethod() == true
-
-@TypeChecked
-String stringMethod() {
-   // StringBuilder converted to String calling toString()
-   new StringBuilder() << "non empty string"
-}
-
-assert stringMethod() instanceof String
-
-@TypeChecked
-Class classMethod() {
-   // the java.util.List class will be returned
-   "java.util.List"
-}
-
-assert classMethod() == List 
-----------------------------------------------------------
-
-The static type checker is also clever enough to do type inference:
-
-[source,groovy]
-------------------------------------------------
-import groovy.transform.TypeChecked
-
-@TypeChecked
-void method() {
-   def name = "  Guillaume  "
-
-   // String type inferred (even inside GString)
-   println "NAME = ${name.toUpperCase()}"
-
-   // Groovy GDK method support
-   // (GDK operator overloading too)
-   println name.trim()
-
-   int[] numbers = [1, 2, 3]
-   // Element n is an int
-   for (int n in numbers) {
-       println n
-   }
-}
-------------------------------------------------
-
-Although the name variable was defined with def, the type checker
-understands it is of type String. Then, when this variable is used in
-the interpolated string, it knows it can call String’s toUpperCase()
-method, or the trim() method later one, which is a method added by the
-Groovy Development Kit decorating the String class. Last, when iterating
-over the elements of an array of primitive ints, it also understands
-that an element of that array is obviously an int.** +
-**
-
-[[Groovy20releasenotes-Mixingdynamicfeaturesandstaticallytypedmethods]]
-==== Mixing dynamic features and statically typed methods
-
-An important aspect to have in mind is that using the static type
-checking facility restricts what you are allowed to use in Groovy. Most
-runtime dynamic features are not allowed, as they can’t be statically
-type checked at compilation time. So adding a new method at runtime
-through the type’s metaclasses is not allowed. But when you need to use
-some particular dynamic feature, like Groovy’s builders, you can opt out
-of static type checking should you wish to.  +
-  +
-The @TypeChecked annotation can be put at the class level or at the
-method level. So if you want to have a whole class type checked, put the
-annotation on the class, and if you want only a few methods type
-checked, put the annotation on just those methods. Also, if you want to
-have everything type checked, except a specific method, you can annotate
-the latter with @TypeChecked(TypeCheckingMode.SKIP) — or
-@TypeChecked(SKIP) for short, if you statically import the associated
-enum. Let’s illustrate the situation with the following script, where
-the greeting() method is type checked, whereas the generateMarkup()
-method is not:
-
-[source,groovy]
------------------------------------------------------------
-import groovy.transform.TypeChecked
-import groovy.xml.MarkupBuilder
-
-// this method and its code are type checked
-@TypeChecked
-String greeting(String name) {
-   generateMarkup(name.toUpperCase())
-}
-
-// this method isn't type checked
-// and you can use dynamic features like the markup builder
-String generateMarkup(String name) {
-   def sw = new StringWriter()
-   new MarkupBuilder(sw).html {
-       body {
-           div name
-       }
-   }
-   sw.toString()
-}
-
-assert greeting("Cédric").contains("CÉDRIC")
------------------------------------------------------------
-
-[[Groovy20releasenotes-Typeinferenceandinstanceofchecks]]
-==== Type inference and instanceof checks
-
-Current production releases of Java don’t support general type
-inference; hence we find today many places where code is often quite
-verbose and cluttered with boilerplate constructs. This obscures the
-intent of the code and without the support of powerful IDEs is also
-harder to write. This is the case with instanceof checks: You often
-check the class of a value with instanceof inside an if condition, and
-afterwards in the if block, you must still use casts to be able to use
-methods of the value at hand. In plain Groovy, as well as in the new
-static type checking mode, you can completely get rid of those casts.
-
-[source,groovy]
------------------------------------------------------
-import groovy.transform.TypeChecked
-import groovy.xml.MarkupBuilder
-
-@TypeChecked
-String test(Object val) {
-   if (val instanceof String) {
-       // unlike Java:
-       // return ((String)val).toUpperCase()
-       val.toUpperCase()
-   } else if (val instanceof Number) {
-       // unlike Java:
-       // return ((Number)val).intValue().multiply(2)
-       val.intValue() * 2
-   }
-}
-
-assert test('abc') == 'ABC'
-assert test(123)   == '246'
------------------------------------------------------
-
-In the above example, the static type checker knows that the val
-parameter is of type String inside the if block, and of type Number in
-the else if block, without requiring any cast.** +
-**
-
-[[Groovy20releasenotes-LowestUpperBound]]
-==== Lowest Upper Bound
-
-The static type checker goes a bit further in terms of type inference in
-the sense that it has a more granular understanding of the type of your
-objects. Consider the following code:
-
-[source,groovy]
-----------------------------------------------------------
-import groovy.transform.TypeChecked
-
-// inferred return type:
-// a list of numbers which are comparable and serializable
-@TypeChecked test() {
-   // an integer and a BigDecimal
-   return [1234, 3.14]
-} 
-----------------------------------------------------------
-
-In this example, we return, intuitively, a list of numbers: an Integer
-and a BigDecimal. But the static type checker computes what we call a
-"lowest upper bound", which is actually a list of numbers which are
-also serializable and comparable. It’s not possible to denote that type
-with the standard Java type notation, but if we had some kind of
-intersection operator like an ampersand, it could look like List<Number
-& Serializable & Comparable>.** +
-**
-
-[[Groovy20releasenotes-Flowtyping]]
-==== Flow typing
-
-Although this is not really recommended as a good practice, sometimes
-developers use the same untyped variable to store values of different
-types. Look at this method body:
-
-[source,groovy]
------------------------------------------------------------
-import groovy.transform.TypeChecked
-
-@TypeChecked test() {
-   def var = 123             // inferred type is int
-   var = "123"               // assign var with a String
-
-   println var.toInteger()   // no problem, no need to cast
-
-   var = 123
-   println var.toUpperCase() // error, var is int!
-} 
------------------------------------------------------------
-
-The var variable is initialized with an int. Then, a String is assigned.
-The "flow typing" algorithm follows the flow of assignment and
-understands that the variable now holds a String, so the static type
-checker will be happy with the toInteger() method added by Groovy on top
-of String. Next, a number is put back in the var variable, but then,
-when calling toUpperCase(), the type checker will throw a compilation
-error, as there’s no toUpperCase() method on Integer. +
-  +
-There are some special cases for the flow typing algorithm when a
-variable is shared with a closure which are interesting. What happens
-when a local variable is referenced in a closure inside a method where
-that variable is defined? Let’s have a look at this example:
-
-[source,groovy]
--------------------------------------------------------
-import groovy.transform.TypeChecked
-
-@TypeChecked test() {
-   def var = "abc"
-   def cl = {
-       if (new Random().nextBoolean()) var = new Date()
-   }
-   cl()
-   var.toUpperCase() // compilation error!
-} 
--------------------------------------------------------
-
-The var local variable is assigned a String, but then, var might be
-assigned a Date if some random value is true. Typically, it’s only at
-runtime that we really know if the condition in the if statement of the
-closure is made or not. Hence, at compile-time, there’s no chance the
-compiler can know if var now contains a String or a Date. That’s why the
-compiler will actually complain about the toUpperCase() call, as it is
-not able to infer that the variable contains a String or not. This
-example is certainly a bit contrived, but there are some more
-interesting cases:
-
-[source,groovy]
---------------------------------------------
-import groovy.transform.TypeChecked
-
-class A           { void foo() {} }
-class B extends A { void bar() {} }
-
-@TypeChecked test() {
-   def var = new A()
-   def cl = { var = new B() }
-   cl()
-   // var is at least an instance of A
-   // so we are allowed to call method foo()
-   var.foo()
-} 
---------------------------------------------
-
-In the test() method above, var is assigned an instance of A, and then
-an instance of B in the closure which is call afterwards, so we can at
-least infer that var is of type A. +
-  +
-All those checks added to the Groovy compiler are done at compile-time,
-but the generated bytecode is still the same dynamic code as usual — no
-changes in behavior at all.  +
-  +
-Since the compiler now knows a lot more about your program in terms of
-types, it opens up some interesting possibilities: what about compiling
-that type checked code statically? The obvious advantage will be that
-the generated bytecode will more closely resemble the bytecode created
-by the javac compiler itself, making statically compiled Groovy code as
-fast as plain Java, among other advantages. In the next section, we’ll
-learn more about Groovy’s static compilation.** +
-**
-
-[[Groovy20releasenotes-Staticcompilation]]
-=== Static compilation
-
-As we shall see in the following chapter about the JDK 7 alignments,
-Groovy 2.0 supports the new `invokedynamic` instruction of the JVM
-and its related APIs, facilitating the development of dynamic languages
-on the Java platform and bringing some additional performance to
-Groovy’s dynamic calls. However, unfortunately shall I say, JDK 7 is not
-widely deployed in production at the time of this writing, so not
-everybody has the chance to run on the latest version. So developers
-looking for performance improvements would not see much changes in
-Groovy 2.0, if they aren’t able to run on JDK 7. Luckily, the Groovy
-development team thought those developers could get interesting
-performance boost, among other advantages, by allowing type checked code
-to be compiled statically. +
-  +
-Without further ado, let’s dive in and use the new @CompileStatic
-transform:
-
-[source,groovy]
--------------------------------------
-import groovy.transform.CompileStatic
-
-@CompileStatic
-int squarePlusOne(int num) {
-   num * num + 1
-}
-
-assert squarePlusOne(3) == 10 
--------------------------------------
-
-This time, instead of using @TypeChecked, use @CompileStatic, and your
-code will be statically compiled, and the bytecode generated here will
-look like javac’s bytecode, running just as fast. Like the @TypeChecked
-annotation, @CompileStatic can annotate classes and methods, and
-@CompileStatic(SKIP) can bypass static compilation for a specific
-method, when its class is marked with @CompileStatic. +
-  +
-Another advantage of the javac-like bytecode generation is that the size
-of the bytecode for those annotated methods will be smaller than the
-usual bytecode generated by Groovy for dynamic methods, since to support
-Groovy’s dynamic features, the bytecode in the dynamic case contains
-additional instructions to call into Groovy’s runtime system. +
-  +
-Last but not least, static compilation can be used by framework or
-library code writers to help avoid adverse interactions when dynamic
-metaprogramming is in use in several parts of the codebase. The dynamic
-features available in languages like Groovy are what give developers
-incredible power and flexibility but if care is not taken, different
-assumptions can exist in different parts of the system with regards to
-what metaprogramming features are in play and this can have unintended
-consequences. As a slightly contrived example, consider what happens if
-you are using two different libraries, both of which add a similarly
-named but differently implemented method to one of your core classes.
-What behaviour is expected? Experienced users of dynamic languages will
-have seen this problem before and probably heard it referred to as
-"monkey patching". Being able to statically compile parts of your code
-base — those parts that don’t need dynamic features — shields you from
-the effects of monkey patching, as the statically compiled code doesn’t
-go through Groovy’s dynamic runtime system. Although dynamic runtime
-aspects of the language are not allowed in a static compilation context,
-all the usual AST transformation mechanisms work just as well as before,
-since most AST transforms perform their magic at compilation time. +
-  +
-In terms of performance, Groovy’s statically compiled code is usually
-more or less as fast as javac’s. In the few micro-benchmarks the
-development team used, performance is identical in several cases, and
-sometimes it’s slightly slower. +
-  +
-Historically, thanks to the transparent and seamless integration of Java
-and Groovy, we used to advise developers to optimize some hotspot
-routines in Java for further performance gains, but now, with this
-static compilation option, this is no longer the case, and people
-wishing to develop their projects in full Groovy can do so.** +
-**
-
-[[Groovy20releasenotes-TheJava7andJDK7theme]]
-== The Java 7 and JDK 7 theme
-
-The grammar of the Groovy programming language actually derives from the
-Java grammar itself, but obviously, Groovy provides additional nice
-shortcuts to make developers more productive. This familiarity of syntax
-for Java developers has always been a key selling point for the project
-and its wide adoption, thanks to a flat learning curve. And of course,
-we expect Groovy users and newcomers to also want to benefit from the
-few syntax refinements offered by Java 7 with its "Project Coin"
-additions. +
-  +
-Beyond the syntax aspects, JDK 7 also brings interesting novelties to
-its APIs, and for a first time in a long time, even a new bytecode
-instruction called `invoke dynamic`, which is geared towards helping
-implementors develop their dynamic languages more easily and benefit
-from more performance.** +
-**
-
-[[Groovy20releasenotes-ProjectCoinsyntaxenhancements]]
-=== Project Coin syntax enhancements
-
-Since day 1 (that was back in 2003 already!) Groovy has had several
-syntax enhancements and features on top of Java. One can think of
-closures, for example, but also the ability to put more than just
-discrete values in switch / case statements, where Java 7 only allows
-Strings in addition. So some of the Project Coin syntax enhancements,
-like Strings in switch, were already present in Groovy. However, some of
-the enhancements are new, such as binary literals, underscore in number
-literals, or the multi catch block, and Groovy 2 supports them. The sole
-omission from the Project Coin enhancements is the "try with
-resources" construct, for which Groovy already provides various
-alternatives through the rich API of the Groovy Development Kit.
-
-[[Groovy20releasenotes-Binaryliterals]]
-==== Binary literals
-
-In Java 6 and before, as well as in Groovy, numbers could be represented
-in decimal, octal and hexadecimal bases, and with Java 7 and Groovy 2,
-you can use a binary notation with the `0b` prefix:
-
-[source,groovy]
-------------------------------
-int x = 0b10101111
-assert x == 175
-
-byte aByte = 0b00100001
-assert aByte == 33
-
-int anInt = 0b1010000101000101
-assert anInt == 41285
-------------------------------
-
-[[Groovy20releasenotes-Underscoreinnumberliterals]]
-==== Underscore in number literals
-
-When writing long literal numbers, it’s harder on the eye to figure out
-how some numbers are grouped together, for example with groups of
-thousands, of words, etc. By allowing you to place underscore in number
-literals, it’s easier to spot those groups:
-
-[source,groovy]
---------------------------------------------------
-long creditCardNumber = 1234_5678_9012_3456L
-long socialSecurityNumbers = 999_99_9999L
-double monetaryAmount = 12_345_132.12
-long hexBytes = 0xFF_EC_DE_5E
-long hexWords = 0xFFEC_DE5E
-long maxLong = 0x7fff_ffff_ffff_ffffL
-long alsoMaxLong = 9_223_372_036_854_775_807L
-long bytes = 0b11010010_01101001_10010100_10010010
---------------------------------------------------
-
-[[Groovy20releasenotes-Multicatchblock]]
-==== Multicatch block
-
-When catching exceptions, we often replicate the catch block for two or
-more exceptions as we want to handle them in the same way. A workaround
-is either to factor out the commonalities in its own method, or in a
-more ugly fashion to have a catch-all approach by catching Exception, or
-worse, Throwable. With the multi catch block, we’re able to define
-several exceptions to be catch and treated by the same catch block:
-
-[source,groovy]
------------------------------------------------
-try {
-   /* ... */
-} catch(IOException | NullPointerException e) {
-   /* one block to handle 2 exceptions */
-}
------------------------------------------------
-
-[[Groovy20releasenotes-InvokeDynamicsupport]]
-=== Invoke Dynamic support
-
-As we mentioned earlier in this article, JDK 7 came with a new bytecode
-instruction called `invokedynamic`, as well as with its associated
-APIs. Their goal is to help dynamic language implementors in their job
-of crafting their languages on top of the Java platform, by simplifying
-the wiring of dynamic method calls, by defining "call sites" where
-dynamic method call section can be cached, "method handles" as method
-pointers, "class values" to store any kind of metadata along class
-objects, and a few other things. One caveat though, despite promising
-performance improvements, `invokedynamic` hasn’t yet fully been
-optimized inside the JVM, and doesn’t yet always deliver the best
-performance possible, but update after update, the optimizations are
-coming. +
-  +
-Groovy brought its own implementation techniques, to speed up method
-selection and invocation with "call site caching", to store
-metaclasses (the dynamic runtime equivalent of classes) with its
-metaclass registry, to perform native primitive calculations as fast as
-Java, and much more. But with the advent of `invokedynamic`, we can
-rebase the implementation of Groovy on top of these APIs and this JVM
-bytecode instruction, to gain performance improvements and to simplify
-our code base. +
-  +
-If you’re lucky to run on JDK 7, you’ll be able to use a new version of
-the Groovy JARs which has been compiled with the `invokedynamic`
-support. Those JARs are easily recognizable as they use the `-indy`
-classifier in their names.**  +
-**
-
-[[Groovy20releasenotes-Enablinginvokedynamicsupport]]
-==== Enabling invoke dynamic support
-
-Using the `indy` JARs is not enough, however, to compile your Groovy
-code so that it leverages the `invokedynamic` support. For that,
-you’ll have to use the –indy flag when using the `groovyc` compiler or
-the `groovy` command. This also means that even if you’re using the
-indy JARs, you can still target JDK 5 or 6 for compilation.  +
-  +
-Similarly, if you’re using the groovyc Ant task for compiling your
-projects, you can also specify the indy attribute:
-
-[source,xml]
--------------------------------------------------------------
-...
-<taskdef name="groovyc"
-        classname="org.codehaus.groovy.ant.Groovyc"
-        classpathref="cp"/>
-...
-<groovyc srcdir="${srcDir}" destdir="${destDir}" indy="true">
-   <classpath>
-...
-   </classpath>
-</groovyc>
-... 
--------------------------------------------------------------
-
-The Groovy Eclipse Maven compiler plugin hasn’t yet been updated with
-the support of Groovy 2.0 but this will be the case shortly. For GMaven
-plugin users, although it’s possible to configure the plugin to use
-Groovy 2.0 already, there’s currently no flag to enable the invoke
-dynamic support. Again, GMaven will also be updated soon in that
-regard. +
-  +
-When integrating Groovy in your Java applications, with GroovyShell, for
-example, you can also enable the invoke dynamic support by passing a
-CompilerConfiguration instance to the GroovyShell constructor on which
-you access and set the optimization options:
-
-[source,groovy]
------------------------------------------------------------
-CompilerConfiguration config = new CompilerConfiguration();
-config.getOptimizationOptions().put("indy", true);
-config.getOptimizationOptions().put("int", false);
-GroovyShell shell = new GroovyShell(config); 
------------------------------------------------------------
-
-As invokedynamic is supposed to be a full replacement to dynamic method
-dispatch, it is also necessary to disable the primitive optimizations
-which generate extra bytecode that is here to optimize edge cases. Even
-if it is in some cases slower than with primitive optimizations
-activated, future versions of the JVM will feature an improved JIT which
-will be capable of inlining most of the calls and remove unnecessary
-boxings.
-
-[[Groovy20releasenotes-Promisingperformanceimprovements]]
-==== Promising performance improvements
-
-In our testing, we noticed some interesting performance gains in some
-areas, whereas other programs could run slower than when not using the
-invoke dynamic support. The Groovy team has further performance
-improvements in the pipeline for Groovy 2.1 however, but we noticed the
-JVM isn’t yet finely tuned and still has a long way to go to be fully
-optimized. But fortunately, upcoming JDK 7 updates (in particular update
-8) should already contain such improvements, so the situation can only
-improve. Furthermore, as invoke dynamic is used for the implementation
-of JDK 8 Lambdas, we can be sure more improvements are forthcoming.** +
-**
-
-[[Groovy20releasenotes-AmoremodularGroovy]]
-== A more modular Groovy
-
-We’ll finish our journey through the new features of Groovy 2.0 by
-speaking about modularity. Just like Java, Groovy is not just a
-language, but it’s also a set of APIs serving various purposes:
-templating, Swing UI building, Ant scripting, JMX integration, SQL
-access, servlet serving, and more. The Groovy deliverables were bundling
-all these features and APIs inside a single big JAR. However, not
-everybody needs everything at all times in their own applications: you
-might be interested in the template engine and the servlets if you’re
-writing some web application, but you might only need the Swing builder
-when working on a rich desktop client program.**  +
-**
-
-[[Groovy20releasenotes-Groovymodules]]
-=== Groovy modules
-
-So the first goal of the modularity aspect of this release is to
-actually split the original Groovy JAR into smaller modules, smaller
-JARs. The core Groovy JAR is now twice as small, and we have the
-following feature modules available:** +
-  +
-**
-
-* Ant: for scripting Ant tasks for automating administration tasks
-* BSF: for integrating Groovy in your Java applications with the old
-Apache Bean Scripting Framework
-* Console: module containing the Groovy Swing console
-* GroovyDoc: for documenting your Groovy and Java classes
-* Groovysh: module corresponding to the Groovysh command-line shell
-* JMX: for exposing and consuming JMX beans
-* JSON: for producing and consuming JSON payloads
-* JSR-223: for integrating Groovy in your Java applications with the JDK
-6+ javax.scripting APIs
-* Servlet: for writing and serving Groovy script servlets and templates
-* SQL: for querying relational databases
-* Swing: for building Swing UIs
-* Templates: for using the template engine
-* Test: for some test support, like the GroovyTestCase, mocking, and
-more
-* TestNG: for writing TestNG tests in Groovy
-* XML: for producing and consuming XML documents
-
-With Groovy 2, you’re now able to just pick up the modules you’re
-interested in, rather than bringing everything on your classpath.
-However, we still provide the `all` JAR which contains everything, if
-you don’t want to complicate your dependencies for just a few megabytes
-of saved space. We also provide those JARs compiled with the `invokedynamic`
-support as well, for those running on JDK 7.
-
-[[Groovy20releasenotes-Extensionmodules]]
-=== Extension modules
-
-The work on making Groovy more modular also yielded an interesting new
-feature: extension modules. By splitting Groovy into smaller modules, a
-mechanism for modules to contribute extension methods has been created.
-That way, extension modules can provide instance and static methods to
-other classes, including the ones from the JDK or third-party libraries.
-Groovy uses this mechanism to decorate classes from the JDK, to add new
-useful methods to classes like String, File, streams, and many more —
-for example, a getText() method on URL allows you to retrieve the
-content of a remote URL through an HTTP get. Notice also that those
-extension methods in your modules are also understood by the static type
-checker and compiler. But let’s now have a look at how you can add new
-methods to existing types.** +
-**
-
-[[Groovy20releasenotes-Contributinganinstancemethod]]
-==== Contributing an instance method
-
-To add new methods to an existing type, you’ll have to create a helper
-class that will contain those methods. Inside that helper class, all the
-extension methods will actually be public (the default for Groovy but
-required if implementing in Java) and static (although they will be
-available on instances of that class). They will always take a first
-parameter which is actually the instance on which this method will be
-called. And then following parameters will be the parameters passed when
-calling the method. This is the same convention use for Groovy
-categories. +
-  +
-Say we want to add a greets() method on String, that would greet the
-name of the person passed in parameters, so that you could that method
-as follow:
-
-[source,groovy]
--------------------------------------------------------------
-assert "Guillaume".greets("Paul") == "Hi Paul, I'm Guillaume"
--------------------------------------------------------------
-
-To accomplish that, you will create a helper class with an extension
-method like so:
-
-[source,groovy]
----------------------------------------------------

-package com.acme
-
-class MyExtension {
-   static String greets(String self, String name) {
-       "Hi ${name}, I'm ${self}"
-   }
-}
----------------------------------------------------
-
-[[Groovy20releasenotes-Contributingastaticmethod]]
-==== Contributing a static method
-
-Static extension methods are defined using the same mechanism, but have
-to be declared in a separate class. The extension module descriptor then
-determines whether the class provides instance or static methods. Let’s
-add a new static method to Random to get a random integer between two
-values, you could proceed as in this class:
-
-[source,groovy]
----------------------------------------------------------------
-package com.acme
-
-class MyStaticExtension {
-   static String between(Random selfType, int start, int end) {
-       new Random().nextInt(end - start + 1) + start
-   }
-} 
----------------------------------------------------------------
-
-That way, you are able to use that extension method as follows:
-
-[source,groovy]
---------------------
-Random.between(3, 4)
---------------------
-
-[[Groovy20releasenotes-Extensionmoduledescriptor]]
-==== Extension module descriptor
-
-Once you’ve coded your helper classes (in Groovy or even in Java)
-containing the extension methods, you need to create a descriptor for
-your module. You must create a file called
-org.codehaus.groovy.runtime.ExtensionModule in the META-INF/services
-directory of your module archive. Four essential fields can be defined,
-to tell the Groovy runtime about the name and version of your module, as
-well as to point at your helper classes for extension methods with a
-comma-separated list of class names. Here is what our final module
-descriptor looks like:
-
----------------------------------------------------
-moduleName = MyExtension
-moduleVersion = 1.0
-extensionClasses = com.acme.MyExtension
-staticExtensionClasses = com.acme.MyStaticExtension
----------------------------------------------------
-
-With this extension module descriptor on the classpath, you are now able
-to use those extension methods in your code, without needing an import
-or anything else, as those extension methods are automatically
-registered.** +
-**
-
-[[Groovy20releasenotes-Grabbinganextension]]
-==== Grabbing an extension
-
-With the @Grab annotation in your scripts, you can fetch dependencies
-from Maven repositories like Maven Central. With the addition of the
-@GrabResolver annotation, you can specify your own location for your
-dependencies as well. If you are "grabbing" an extension module
-dependency through this mechanism, the extension method will also be
-installed automatically. Ideally, for consistency, your module name and
-version should be coherent with the artifact id and version of your
-artifact.** +
-**
-
-[[Groovy20releasenotes-Summary]]
-== Summary
-
-Groovy is very popular among Java developers and offers them a mature
-platform and ecosystem for their application needs. But without resting
-still, the Groovy development team continues to further improve the
-language and its APIs to help its users increase their productivity on
-the Java platform.  +
-  +
-Groovy 2.0 responds to three key themes:** +
-**
-
-* More performance: with the support of JDK 7 Invoke Dynamic to speed up
-Groovy for those lucky to have JDK 7 already in production, but also
-with static compilation for JDK 5 and beyond for everyone, and
-particularly those ready to abandon some aspects of dynamicity to shield
-themselves from the reach of "monkey patching" and to gain the same
-speed as Java.
-* More Java friendliness: with the support of the Java 7 Project Coin
-enhancements to keep Groovy and Java as close syntax cousins as ever,
-and with the static type checker to have the same level of  feedback and
-type safety as provided by the javac compiler for developers using
-Groovy as a Java scripting language
-* More modularity: with a new level of modularity, Groovy opens the
-doors for smaller deliverables, for example for integration in mobile
-applications on Android, and allowing the Groovy APIs to grow and evolve
-with newer versions and newer extension modules, as well as allowing
-users to contribute extension methods to existing types.
diff --git a/site/src/site/releasenotes/groovy-2.1.adoc b/site/src/site/releasenotes/groovy-2.1.adoc
deleted file mode 100644
index 187eb20..0000000
--- a/site/src/site/releasenotes/groovy-2.1.adoc
+++ /dev/null
@@ -1,963 +0,0 @@
-With this new 2.1 release, Groovy:
-
-* has *full support for the JDK 7 `invoke dynamic`* instruction and
-API,
-* goes beyond conventional static type checking capabilities with a
-*special annotation for closure delegate based Domain-Specific
-Languages* and *static type checker extensions*,
-* provides *additional compilation customization* options,
-* and features a *meta-annotation facility* for combining annotations
-elegantly.
-
-[[Groovy21releasenotes-Fullinvokedynamicsupport]]
-== Full invoke dynamic support
-
-With Groovy 2.0, we introduced support for JDK 7’s `invoke dynamic`
-bytecode instruction and API to benefit from the dedicated support and
-performance improvements for dynamic languages starting with JDK
-7. Groovy 2.1 brings *full support for `invokedynamic`* (aka
-`indy`), completing the work introduced in 2.0. 
-
-In Groovy 2.0, most method calls were using the `invokedynamic`
-instruction, but there have been exceptions: constructor calls
-or "spread calls" (where you pass arguments with the "spread
-operator"). Groovy 2.1 completes the implementation started in 2.0.
-Now, code compiled with the `invokedynamic` JAR on JDK 7 will not be
-using the old "call site caching" code which served us well for
-getting good performance for Groovy prior to JDK 7. If you are lucky
-enough to be using JDK 7 in production, be sure to use the Groovy 2.1
-`indy` JAR to benefit from the full `invokedynamic` support. The
-`indy` version is bundled with the binary download package and can be
-obtained via Maven (all JARs with `invokedynamic` support are
-postfixed with `-indy`).
-
-You can link:../indy.html[learn more about the invoke dynamic support].
-
-[[Groovy21releasenotes-GPars10]]
-== GPars 1.0
-
-Groovy 2.1’s distribution *bundles the recently released GPars 1.0*, the
-one-stop shop for all your concurrency needs. This new version comes
-with various enhancements in the asynchronous
-functions, link:http://www.jroller.com/vaclav/entry/broken_promises[promises],
-parallel collections, actors, dataflow
-support, link:http://www.jroller.com/vaclav/entry/gpars_actors_and_dataflow_for[Google App Engine support], etc.
-
-Be sure to check
-the link:http://www.jroller.com/vaclav/entry/i_like_the_smell_of[release announcement] and read the “what’s new section”
-of the GPars user guide.
-You can also have a look at the
-detailed link:https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12318123&version=17007[JIRA release notes].
-
-[[Groovy21releasenotes-DelegatesToannotation]]
-== @DelegatesTo annotation
-
-Authoring Domain-Specific Languages (DSLs) has always been a sweet spot
-for Groovy, and the availability of closures and the malleable syntax of
-the language has allowed DSL implementors to build nice mini-languages
-like "builders", to represent configuration or hierarchical data.
-
-Thanks to the various delegation strategies of
-the `groovy.lang.Closure` class, a range of very powerful techniques can
-be used when building DSLs. Due to different implementation techniques,
-inferring type information within the DSL has not been straightforward.
-This is especially an issue when DSLs should have proper IDE support
-(e.g. code completion).
-
-The very popular and powerful link:http://www.gradle.org[Gradle] build
-automation system uses its own DSL for build script specifications. On
-the DSL implementation layer are various methods taking closures as
-arguments, and with special delegation strategies delegating to some
-other parameter passed to them. Providing good IDE support for Groovy
-DSLs — like the one in Gradle — has presented a few challenges. Hence
-the need for the `@DelegatesTo` annotation.
-
-Groovy 2.1 introduces the *`@groovy.lang.DelegatesTo` annotation* as
-a *documentation mechanism* for DSL users and maintainers, as an *IDE
-hint for providing better coding assistance*, and as additional
-information that can be *taken into account by the static type checker
-and static compilation* introduced in Groovy 2.0. Let’s see that in
-action with some examples.
-
-A closure delegate based method usage might look like the following:
-
-[source,groovy]
-------------
-exec {
-    launch()
-}
-------------
-
-The `exec()` method takes a closure as parameter, and the
-actual `launch()` call inside that closure is delegated to some
-particular object (the closure delegate), instead of being dispatched to
-the enclosing class. The above code would only fail at runtime (not at
-compile-time!), as the `launch()` method can not be found in the closure
-context. In order to delegate method calls within the closure’s code
-block to another object instance, we need to set the closure delegate.
-
-Setting a closure delegate is as easy as
-invoking `Closure#setDelegate(Object)`: 
-
-[source,groovy]
--------------------------------
-void exec(Closure c) {
-    c.delegate = new Executor()
-    c()
-}
--------------------------------
-
-The delegate can be set to an arbitrary object instance (here, an
-instance of an `Executor` class that has a `launch()` method). When the
-delegate is set accordingly, we can execute the closure code.
-
-Note that usually, to avoid odd behavior if the closure is used in
-multiple threads, we tend to clone that closure.
-
-The problem with delegate objects are IDEs not knowing about them. Given
-our example, most IDEs will underline the `launch()` method as being an
-unknown method in this context.
-
-This is where `@DelegatesTo` comes into play. By adding
-the `@DelegatesTo` annotation to DSL methods like `exec(Closure)`, IDEs
-get the actual delegate type and other meta-data.
-
-A future update might let GroovyDoc show the details about the
-annotation usage to help users know what methods they can call, what
-properties they can access, etc.
-
-Here’s what your `exec()` method will look like with the annotation:
-
-[source,groovy]
----------------------------------------------
-void exec(@DelegatesTo(Executor) Closure c) {
-    c.delegate = new Executor()
-    c()
-}
----------------------------------------------
-
-Besides specifying the actual delegate type, `@DelegatesTo`  can be used
-to hint at the actual resolve strategy. The resolve strategy determines
-the order in which non-closure method / property calls are looked up. In
-our example, `Closure.DELEGATE_FIRST` will be used. This indicates the
-closure will attempt to resolve against the given delegate object in
-first place, followed by the owner object:
-
-[source,groovy]
---------------------------------------------------------------------------------
-import static groovy.lang.Closure.*
-// ...
-void exec(@DelegatesTo(strategy = DELEGATE_FIRST, value = Executor) Closure c) {
-    c.delegate = new Executor()
-    c.resolveStrategy = DELEGATE_FIRST
-    c()
-}
---------------------------------------------------------------------------------
-
-IDE support is not the only reason to use `@DelegatesTo`. The *static
-type checker and static compiler take the additional meta-data specified
-by the @DelegatesTo annotation into account*. If there is a typo in the
-closure code block, the type checker will complain. And if you use the
-static compilation capability introduced in Groovy 2.0, the calls will
-be compiled statically.
-
-Let’s say we wouldn’t call `launch()` but `launchr()` in the closure
-code block, we would get a message like:
-
-----------------------------------------------------------------------------------
-[Static type checking] - Cannot find matching method DelegatesToSamples#launchr().
-Please check if the declared type is right and if the method exists.
-----------------------------------------------------------------------------------
-
-*Static type checks for custom Domain-Specific Languages* is a very
-convenient feature in Groovy 2.1!
-
-In addition, Groovy 2.1 features other abilities for even further type
-checking your DSLs, as you shall see in the following section.
-
-Before moving on, let’s mention a few closing details
-about `@DelegatesTo`.
-
-`@DelegatesTo` allows to specify the receiver calls are delegated to.
-For instance, when a delegate calls a method or property on another
-method parameter. Imagine our `exec()` method taking
-the `Executor` argument instance as delegate:
-
-[source,groovy]
-----------------------------------------------------------
-void exec(Executor ex, @DelegatesTo(Executor) Closure c) {
-    c.delegate = ex
-    c()
-}
-----------------------------------------------------------
-
-In this example, the information is lost that the call is delegated to
-the `ex` parameter. Thanks to the `@DelegatesTo.Target` annotation we
-can specify ex as target for being the delegate object:
-
-[source,groovy]
---------------------------------------------------------------------
-void exec(@DelegatesTo.Target Executor ex, @DelegatesTo Closure c) {
-    c.delegate = ex
-    c()
-}
---------------------------------------------------------------------
-
-What if we had several `Executor` parameters, how would we differentiate
-which one we’re targeting?
-
-[source,groovy]
-------------------------------------------------------
-void exec(
-    @DelegatesTo.Target('param1') Executor ex,
-    @DelegatesTo(target = 'param1') Closure c) { ... }
-------------------------------------------------------
-
-The delegation "target" can be specified with an arbitrary id. In the
-example above it is `param1`.
-
-One last very nice little feature: if you are using static type
-checking, you can omit the type of the parameter
-and `@DelegatesTo` combined with "flow typing" (the ability of
-following the current type of an untyped variable) would still know if
-method calls are valid:
-
-[source,groovy]
------------------------------------------------------------
-void exec(@DelegatesTo.Target ex, @DelegatesTo Closure c) {
-    c.delegate = ex
-    c()
-}
-
-class Executor {
-    void launch() {}
-}
-
-def ex = new Executor()
-
-exec(ex) {
-    launch()
-}
------------------------------------------------------------
-
-We’ve seen that the `@DelegatesTo` helps documenting, tooling, and
-checking Domain-Specific Languages in the specific context of closure
-delegate based methods, but we hinted at the fact we can go beyond, in
-terms of static type checking for your DSLs.
-
-For more details take a look at
-the link:{DOCS_BASEURL}/html/documentation/#__code_delegatesto_code[@DelegatesTo documentation].
-
-[[Groovy21releasenotes-Typecheckerextensions]]
-== Type checker extensions
-
-Static type checking was introduced in Groovy 2.0, but Groovy 2.1 goes
-beyond built-in type checks and offers a way to *create type checker
-extensions*. This is great news for Groovy scripts, configuration files,
-or Domain-Specific Languages implementations as they can can be "type
-checked" with more advanced, domain-specific rules. As an example, it
-would be possible to create a custom DSL type checker that throws
-compilation errors when certain verbs of the DSL are not recognized, or
-tells this other noun is allowed even if it’s a dynamic name bound at
-runtime, or type checks literal strings containing SQL code to see if
-the syntax is correct, and more.
-
-Imagine a script, where we define a small robot class and instantiate
-it:
-
-[source,groovy]
-----------------------------------------------------
-class Robot {
-    void move(String dist) { println "Moved $dist" }
-}
-
-robot = new Robot()
-----------------------------------------------------
-
-And we want to operate our robot in the `operate()` method, but we want
-this method to be type checked:
-
-[source,groovy]
------------------------------
-@groovy.transform.TypeChecked
-void operate() {
-    robot.move "left"
-}
-
-operate()
------------------------------
-
-The static type checker will complain as it doesn’t understand where the
-`robot` variable is coming from, as it’s going through the binding of
-the script — note that we could teach the type checker to figure out
-binding-bound variables. It will throw an error telling us that
-the robot variable was undeclared.
-
-But by utilizing type checker extensions, we can hook into the type
-checking process to teach it how to handle unresolved variables! In
-order to do that, we’ll specify an extension script through the newly
-introduced `extensions` annotation parameter of
-the `@TypeChecked` annotation:
-
-[source,groovy]
----------------------------------------------
-@TypeChecked(extensions = 'RobotMove.groovy')
-void operate() {
-    robot.move "left"
-}
----------------------------------------------
-
-Now it’s time to define the type checker extension script
-called `RobotMove.groovy`. The type checker extension script is written
-by applying a new DSL — the "type checking DSL". The DSL provides
-various hooks for type checker extensions to register to. Going back to
-the example above, we register for unresolved variables using
-the `unresolvedVariable` hook:
-
-[source,groovy]
--------------------------------------------------------------------------------
-unresolvedVariable { VariableExpression var ->
-    if ('robot' == var.name) {
-        def robotClass = context.source.AST.classes.find { it.name == 'Robot' }
-        storeType(var, robotClass)
-        handled = true
-    }
-}
--------------------------------------------------------------------------------
-
-The type checker extension script needs to be on the classpath. If this
-is the case, the script gets notified during compile-time when the
-static type checker encounters an unresolved variable. The unresolved
-variable closure is handed over a `VariableExpression`.
-
-The `VariableExpression` is an object directly from Groovy’s AST
-(Abstract Syntax Tree). It is a representation of the unresolved
-variable expression. The script checks if the variable is named `robot`,
-if this is the case, we lookup a `ClassNode` representing
-the `Robot` class, and store the type of that variable back in the AST.
-At the end, the `handled` property is set to true, to indicate the type
-checker already managed that variable. As a consequence, you won’t get
-the compilation error about that undeclared variable.
-
-To continue the journey, let’s consider the case where the user enters a
-wrong direction string. We could of course use an enum or some other
-class containing direction constants, but for the sake of the example,
-we’ll have a look at how we can teach the type checker to inspect
-strings and how you can actually throw your own compilation errors.
-
-For that purpose, let’s say a robot can only move left, right, forward
-and backward. And now, let’s change our robot move instruction to:
-
-[source,groovy]
----------------------
-robot.move "sideways"
----------------------
-
-The robot is not allowed to move sideways, so we should instruct the
-type checker to throw a compilation error if it encounters a direction
-the robot will not be able to understand. Here’s how we can achieve our
-goal, by adding a new event handler to our `RobotMove.groovy` script:
-
-[source,groovy]
----------------------------------------------------------------------------------------
-afterMethodCall { MethodCall mc ->
-    def method = getTargetMethod(mc)
-    if (mc.objectExpression.name == 'robot' && method.name == 'move') {
-        def args = getArguments(mc)
-        if (args && isConstantExpression(args[0]) && args[0].value instanceof String) {
-            def content = args[0].text
-            if (!(content in ['left', 'right', 'backward', 'forward'])) {
-                addStaticTypeError("'${content}' is not a valid direction", args[0])
-            }
-        }
-    }
-}
----------------------------------------------------------------------------------------
-
-This handler receives a `MethodCall` expression. We are using
-the `getTargetMethod()` utility method to retrieve the
-corresponding `MethodNode`. We check that the method call is a call to
-our `robot`, and that the name of the method corresponds to
-themove method. Then, we fetch the arguments passed to that method call,
-and if we’re passed a direction in the form of a string constant, we are
-checking that the direction is an actual allowed direction. If this is
-not the case, we are adding a new static typing compilation error into
-the mix, so that the compiler will yell at the poor user because he used
-a direction which is forbidden and not understood by our robot.
-
-This second example is also interesting in a way that it shows how you
-can even add compilation checks on things like literal strings on a
-domain-specific level, paving the way for possible checks on sprintf
-strings, on SQL or HQL code in strings, etc, allowing you to go even
-further that what the Java compiler actually checks.
-
-The extension script can make use of various event oriented extension
-points and utility methods coming from the `TypeCheckingExtension` class
-from Groovy, such as:
-
-* unresolvedVariable
-* unresolvedProperty
-* unresolvedAttribute
-* methodNotFound
-* incompatibleAssignment
-* beforeVisitMethod
-* afterVisitMethod
-* beforeVisitClass
-* afterVisitClass
-* beforeMethodCall
-* afterMethodCall
-* onMethodSelection
-* setup
-* finish
-
-The two examples are just the tip of the iceberg, but we will work out
-more complete documentation of the various extension points and utility
-methods going forward.
-
-For more details take a look at
-the link:http://docs.groovy-lang.org/latest/html/documentation/type-checking-extensions.html[type checking extensions documentation].
-
-[[Groovy21releasenotes-Compile-time-Meta-annotations]]
-== Compile-time Meta-annotations
-
-Annotations are a great way to add supplementary meta-data to classes,
-methods, fields, and other source code elements, thus frameworks,
-libraries, and even Groovy’s homegrown AST transformations can take
-advantage of them to do some special treatments to the corresponding AST
-nodes. Every now and then the use case arises to reuse a combination of
-annotations, potentially at the expense of a galore of at-signs that
-obscure the general intent of that particular combination.
-
-To group annotations together, to make the intent clearer or to
-streamline your code, Groovy 2.1 offers a *meta-annotation system, which
-allows to combine other annotations into one "alias" annotation*.
-
-Imagine we are using some annotations defining constraints on properties
-of your class, like `@NotNull`, `@Length`, or `@Pattern`, which could be
-defined as follows:
-
-[source,groovy]
--------------------------------
-@interface NotNull {}
-
-@interface Length {
-    int value() default 0
-}
-
-@interface Pattern {
-    String value() default ".*"
-}
--------------------------------
-
-An example of how to annotate an `ISBN` property with those annotations
-could look like this:
-
-[source,groovy]
----------------------------
-class Book {
-    @NotNull
-    @Length(10)
-    @Pattern(/\d{9}(\d|X)/)
-    String isbn10
-}
----------------------------
-
-For a single property, that’s quite a bit of annotation overload! And it
-could be the case of other domain classes with properties having the
-same validation rules as the ISBN property, where we would need to
-duplicate that pattern.
-
-As of Groovy 2.1, `@groovy.transform.AnnotationCollector` can be used to
-solve code duplication for this use case. `@AnnotationCollector` can be
-specified on annotation types and acts as meta-annotation. Whenever an
-annotation marked with it is found, it is replaced with its own
-annotations. Let’s illustrate this with our ISBN example.
-
-We will create a new annotation combination for the 13-digit ISBN
-standard, but this time, using
-the `@AnnotationCollector` meta-annotation:
-
-[source,groovy]
--------------------------------------
-@NotNull
-@Length(13)
-@Pattern(/\d{12}(\d|X)/)
-@groovy.transform.AnnotationCollector
-@interface ISBN13 {}
--------------------------------------
-
-`@ISBN13` as a single annotation can now be applied on code elements,
-instead of applying the entire annotation gang::
-
-[source,groovy]
------------------
-class Book {
-    // ...
-    @ISBN13
-    String isbn13
-}
------------------
-
-What is particularly interesting with such *meta-annotations* is that
-they are actually *replaced at compilation time with
-the _real_ annotations*. So if you counted the number of annotations on
-the `isbn13` property, you would count 3
-(`@NotNull`, `@Length` and `@Pattern`). Thus, your underlying framework
-doesn’t need to know about that meta-annotation solution and act
-accordingly.
-
-[[Groovy21releasenotes-Alternatenotation]]
-=== Alternate notation
-
-In our example above, we annotated our meta-annotation with the
-annotations that are then combined together. But for annotations for
-which you don’t need to specify arguments, you could have also passed
-the names of the annotations to combine as parameters to the annotation
-collector:
-
-[source,groovy]
-------------------------------------------------------------
-import groovy.transform.*
-@groovy.transform.AnnotationCollector([ToString, Singleton])
-@interface ChattySingleton {}
-------------------------------------------------------------
-
-In the above case, we combine
-the `@Singleton` and `@ToString` transformation into a meta-annotation
-called `@ChattySingleton`.
-
-[[Groovy21releasenotes-Passingparameters]]
-=== Passing parameters
-
-If you need to pass some specific parameter to one of the underlying
-annotations which are combined, you can still do so by passing the
-parameter to the meta-annotation.
-
-Let’s assume we need to combine the following annotations:
-
-[source,groovy]
--------------------------------------------
-@interface Service {}
-
-@interface Transactional {
-    String propagation() default "required"
-}
--------------------------------------------
-
-We define the meta-annotation combining both the above annotations:
-
-[source,groovy]
----------------------------------------------------------------
-@groovy.transform.AnnotationCollector([Service, Transactional])
-@interface TransactionalService {}
----------------------------------------------------------------
-
-But we want to change the propagation strategy for the
-underlying `@Transactional` annotation, we do so by passing the
-parameter to the meta-annotation:
-
-[source,groovy]
-------------------------------------------------
-@TransactionalService(propagation = "mandatory")
-class BankingService { }
-------------------------------------------------
-
-Note that if two combined annotations share the same parameter name, the
-last annotation declared wins and gets the parameter passed to the
-meta-annotation.
-
-[[Groovy21releasenotes-Customprocessor]]
-=== Custom processor
-
-If you need even more flexibility, meta-annotations allow you to define
-custom processors. The role of the custom processor is to go beyond the
-simple exchange of the meta-annotation with the combined annotations, to
-further customize the logic of that transformation.
-
-Custom processors must be precompiled to take action, so we’ll create
-our processor, and then evaluate our final example with `GroovyShell`,
-but first, let’s talk about the use case.
-
-We have two validation annotations for defining a minimum and maximum
-value for an integer property:
-
-[source,groovy]
----------------------------
-@interface Min {
-    int value() default 0
-}
-
-@interface Max {
-    int value() default 100
-}
----------------------------
-
-If we want to define a range of values, with a lower and an upper bound,
-we could define a new annotation and implement the associated validation
-logic, or we could use custom meta-annotation processors to replace a
-range annotation with a minimum and a maximum one.
-
-So instead of writing:
-
-[source,groovy]
------------------------
-class Room {
-    @Min(1)
-    @Max(4)
-    int numberOfPersons
-}
------------------------
-
-We could write:
-
-[source,groovy]
-----------------------------
-class Room {
-    @Range(from = 1, to = 4)
-    int numberOfPersons
-}
-----------------------------
-
-With the normal replacement logic, there’s no way we can map the lower
-and upper bound values to the minimum and maximum annotation element
-default values. That is where custom processors come into play.
-
-Our meta-annotation definition will look like this:
-
-[source,groovy]
-------------------------------------------------------------
-@Min @Max
-@AnnotationCollector(processor = 'RangeAnnotationProcessor')
-@interface Range {}
-------------------------------------------------------------
-
-Notice how we specify that the `@Range` annotation is a combination
-of `@Min` and `@Max`, and more importantly, how we pass a processor
-parameter to the `@AnnotationCollector` to instruct it about our custom
-meta-annotation processing logic.
-
-In order to create a custom processor, you have to extend
-the `AnnotationCollectorTransform` class and override
-the `visit()` method:
-
-[source,groovy]
--------------------------------------------------------------------------------
-import org.codehaus.groovy.transform.AnnotationCollectorTransform
-import org.codehaus.groovy.ast.*
-import org.codehaus.groovy.control.SourceUnit
-
-class RangeAnnotationProcessor extends AnnotationCollectorTransform {
-    List<AnnotationNode> visit(AnnotationNode collector,
-                               AnnotationNode usage,
-                               AnnotatedNode annotated,
-                               SourceUnit src) {
-
-        def minExpr = usage.getMember('from')
-        def maxExpr = usage.getMember('to')
-
-        def (minAnno, maxAnno) = getTargetAnnotationList(collector, usage, src)
-
-        minAnno.addMember('value', minExpr)
-        maxAnno.addMember('value', maxExpr)
-
-        usage.members.remove('from')
-        usage.members.remove('to')
-
-        return [minAnno, maxAnno]
-    }
-}
--------------------------------------------------------------------------------
-
-A few words about the parameters : the `collector` corresponds to
-the `@Range` annotation definition, `usage` to the actual usage of
-the `@Range` annotation, `annotated` is the annotated class,
-and `src` is script being compiled.
-
-We start our implementation of the processor by retrieving the numeric
-expressions of the bounds defined as the from and to annotation
-parameters, because we’ll pass those values back to the
-underlying `@Min` and `@Max` combined annotations. In order to do that,
-we retrieve the `@Min` and `@Max` combined annotations thanks to
-the `getTargetAnnotationList()` method. We then set the values of
-the `@Min` and `@Max` annotations to the expressions we’ve retrieved
-before. We remove the from and to bounds from
-the `@Range` meta-annotation since those parameters
-aren’t really defined on a real annotation but on a meta-annotation. And
-last, we return the two `@Min` and `@Max` annotations. If you wanted the
-Groovy compiler to do its usual replacement logic, you could have also
-called `super.visit(...)`, but in our case it wasn’t needed.
-
-The full example can be found in this Gist on
-Github: https://gist.github.com/4563430
-
-Additional details can be found in the
-link:http://www.groovy-lang.org/objectorientation.html#_meta_annotations[meta-annotations documentation].
-
-[[Groovy21releasenotes-Compilationcustomization]]
-== Compilation customization
-
-[[Groovy21releasenotes-Custombasescriptclassflag]]
-=== Custom base script class flag
-
-When integrating and evaluating Groovy scripts in an application for
-business rules or Domain-Specific Languages, it is often valuable to
-define a base script class, in order to add various utility methods,
-properties, or interception mechanisms for missing methods or
-properties.
-
-The `CompilerConfiguration` object, that you can pass
-to `GroovyShell` and other integration mechanisms, allows you to specify
-a base script class with the `setScriptBaseClass()` method.
-
-As of Groovy 2.1, we introduce the ability to define a base script class
-reference for your scripts via an additional command-line option `-b` /
- `--basescript` for the `groovyc` command, as well as for
-the `groovy` command.
-
-Here’s an example using a script called `businessRule.groovy`:
-
-[source,groovy]
------------------------------------
-assert lookupRate(EUR, USD) == 1.33
------------------------------------
-
-In the above script, we notice two things: the usage of
-a `lookupRate()` method, and two undeclared variables: `EUR` and `USD`.
-Neither the method, nor the variables have been defined in our script.
-Instead, they are provided by a base script class, which can look like
-the following `ExchangeRateBaseScript.groovy` class:
-
-[source,groovy]
---------------------------------------------------------
-abstract class ExchangeRateBaseScript extends Script {
-    def lookupRate(String currency1, String currency2) {
-        if (currency1 == 'EUR' && currency2 == 'USD')
-            return 1.33
-        else return 1
-    }
-
-    def getProperty(String name) { name }
-}
---------------------------------------------------------
-
-The `lookupRate()` method used in our script is declared in the the base
-class, and the two currencies are retrieved via
-the `getProperty()` method.
-
-Now it’s time to wire them together, by instructing the groovyc compiler
-or the `groovy` command line launcher to use our base script class for
-all `groovy.lang.Script` descendants:
-
----------------------------------------------------------------------
-groovy --basescript ExchangeRateBaseScript.groovy businessRule.groovy
----------------------------------------------------------------------
-
-[[Groovy21releasenotes-Compilerconfigurationscript]]
-=== Compiler configuration script
-
-Similarly to the `--basescript` flag, there’s another new option for
-the `groovy` and `groovyc` commands: the `--configscript` flag. Its
-purpose is to let you further configure the compiler, in a configuration
-script, by parameterizing the `CompilerConfiguration` object used for
-the compilation.
-
-With a `CompilerConfiguration`, you can customize the various aspects of
-the Groovy compilation process. For example, you can specify various
-compilation customizers introduced in Groovy 1.8. Imagine you want to
-add a new default import to your classes, like importing
-all `java.lang.Math` functions and constants, so that your scripts and
-classes don’t have to prefix those functions and constants all the time,
-and to avoid having to do that import wherever needed. Here’s how you
-can proceed.
-
-At first, your script, `mathFormula.groovy`, contains the following
-lines:
-
-[source,groovy]
-------------------------------
-import static java.lang.Math.*
-
-assert sin(PI/2) == 1
-------------------------------
-
-For evaluating such math expressions, you wish to make the static import
-implicit, so that the final script will actually look like this:
-
-[source,groovy]
----------------------
-assert sin(PI/2) == 1
----------------------
-
-If you’d run it as is, you’d get an error message saying:
-
--------------------------------------------
-No such property: PI for class: mathFormula
--------------------------------------------
-
-We need to use `CompilerConfiguration` to do add an `ImportCustomizer`.
-We’ll create ai `mportConfigurer.groovy` script with the content below:
-
-[source,groovy]
----------------------------------------------------------------
-import org.codehaus.groovy.control.customizers.ImportCustomizer
-
-def importCustomizer = new ImportCustomizer()
-importCustomizer.addStaticStar('java.lang.Math')
-
-configuration.addCompilationCustomizers(importCustomizer)
----------------------------------------------------------------
-
-We import and then instantiate an `ImportCustomizer`, on which we ask
-for a static star import of the methods and constants of
-the `java.lang.Math` class. Eventually, we pass that customizer to
-the `configuration` variable, which is an instance
-of `CompilerConfiguration` that will be used for the compilation of your
-math formula.
-
-Now, we are able to execute your formula with the following
-command-line:
-
-----------------------------------------------------------------
-groovy --configscript importConfigurer.groovy mathFormula.groovy
-----------------------------------------------------------------
-
-[[Groovy21releasenotes-Source-awarecustomizer]]
-=== Source-aware customizer
-
-If you use the groovy compiler to compile all your classes, one drawback
-of the approach above is that the customization applies globally to all
-classes that are going to be compiled. You may want to add certain
-default imports only in certain classes (ie. scripts containing math),
-but you might want to do something different for other classes, like
-adding a `@ToString` transformation to all the domain classes of your
-application. For that purpose, a new customizer was created,
-the `SourceAwareCustomizer`, to let you filter which classes should be
-impacted by particular compilation customizations, such as filtering by
-class name, by file extension, or by a custom logic.
-
-Coming back to our previous example, let’s add the default import to
-our `mathFormula.groovy` script, but add a `@ToString` transformation to
-the `MyDomain.groovy` class:
-
-[source,groovy]
---------------------------------------------------------------------------
-import org.codehaus.groovy.control.customizers.*
-import groovy.transform.ToString
-
-def importCustomizer = new ImportCustomizer()
-importCustomizer.addStaticStar('java.lang.Math')
-
-configuration.addCompilationCustomizers(
-    new SourceAwareCustomizer(new ASTTransformationCustomizer(ToString)) {
-        boolean acceptBaseName(baseName) { baseName ==~ 'MyDomain' }
-    },
-    new SourceAwareCustomizer(importCustomizer) {
-        boolean acceptBaseName(baseName) { baseName ==~ 'mathFormula' }
-    })
---------------------------------------------------------------------------
-
-[[Groovy21releasenotes-Compilercustomizationbuilder]]
-=== Compiler customization builder
-
-The more complex the customization becomes, the more cumbersome the
-above configuration becomes to write too, that’s why Groovy 2.1 also
-provides a builder for building these types of configurations.
-
-The builder allows you to use a familiar declarative syntax and saves
-you from adding manually various imports. Let’s adapt our example above
-with the builder:
-
-[source,groovy]
----------------------------------------------------------------
-withConfig(configuration) {
-    source(basenameValidator: { it.endsWith('MyDomain') }) {
-        ast(ToString)
-    }
-    source(basenameValidator: { it.endsWith('mathFormula') }) {
-        imports {
-            staticStar 'java.lang.Math'
-        }
-    }
-}
----------------------------------------------------------------
-
-The configuration code is easier to read and maintain, thanks to the
-clarity brought by the builder approach. But we’ve only seen a couple
-examples of customization, and you should have a look at the other
-customizations available in the
-org.codehaus.groovy.control.customizers.builder package to learn more
-about them.
-
-More details can be found in the
-link:http://www.groovy-lang.org/dsls.html#compilation-customizers[compilation customizers documentation].
-
-[[Groovy21releasenotes-OtherMinorEnhancements]]
-== Other Minor Enhancements
-
-[[Groovy21releasenotes-AdditionalDGMmethods]]
-=== Additional DGM methods
-
-There are now `leftShift` and `withFormatter` methods for `Appendable`
-objects. +
-There are now methods for creating temporary directories and determining
-the total size of all files in a directory. +
-There is now a `collectMany` for maps (has been backported to earlier
-versions of Groovy too). +
-There is now a `closeStreams()` method for `Process` objects.
-
-[[Groovy21releasenotes-GroovyDoc]]
-=== GroovyDoc
-
-You can now explicitly set a file encoding.
-
-[[Groovy21releasenotes-Command-line]]
-=== Command-line
-
-There is support for using a `jar:` prefix when running a script from
-a URL, in addition to the `file:` and `http:`.
-
-[[Groovy21releasenotes-XMLProcessing]]
-=== XML Processing
-
-There is a method for escaping / encoding XML entities in Strings. +
-There is a convenience method for serializing `Elements` objects.  +
-You can now clone `Node` and `NodeList` objects.  +
-The name() method now works for all `Node` objects, not just `Element`
-objects. 
-
-[[Groovy21releasenotes-ConfigSlurper]]
-=== ConfigSlurper
-
-Multiple environments blocks are now supported and merged.
-
-[[Groovy21releasenotes-Delegate]]
-=== @Delegate
-
-Can now carry over annotations if desired for methods and method
-parameters.
-
-[[Groovy21releasenotes-ToString]]
-=== @ToString
-
-You can now cache the `toString` value. This is useful for immutable
-objects.
-
-[[Groovy21releasenotes-EqualsAndHashCode]]
-=== @EqualsAndHashCode
-
-You can now cache the calculated hashCode value. This is useful for
-immutable objects.
-
-[[Groovy21releasenotes-Immutable]]
-=== @Immutable
-
-You can now specify `knownImmutables`. This is useful when you know you
-are using an immutable object, but its type isn’t one of the known
-immutable types.
-
-[[Groovy21releasenotes-AutoClone]]
-=== @AutoClone
-
-There is now a `SIMPLE` `AutoCloneStyle` which avoids some annoyances
-with Java’s cloning behavior from `Object`. Those who need to clone
-Grails domain objects might find this useful.
diff --git a/site/src/site/releasenotes/groovy-2.2.adoc b/site/src/site/releasenotes/groovy-2.2.adoc
deleted file mode 100644
index 8afed88..0000000
--- a/site/src/site/releasenotes/groovy-2.2.adoc
+++ /dev/null
@@ -1,256 +0,0 @@
-[[Groovy2.2releasenotes-Implicitclosurecoercion]]
-== Implicit closure coercion
-
-Java 8 will feature lambdas, which are similar to Groovy’s closures. One
-particular aspect which is interesting with lambdas is how they are
-converted transparently by Java to interface types that contain one
-single abstract method. With Groovy closures, except for a few cases, we
-have to explicitly use the as operator to do the coercion. In Groovy
-2.2, we are allowing the
-same link:http://docs.groovy-lang.org/latest/html/documentation/core-semantics.html#closure-coercion[transparent closure coercion] 
-to happen, but without the explicit as type coercion,
-and furthermore, we make it possible to work as well with abstract
-classes as well.
-
-
-[source,groovy]
-----
-interface Predicate {
-   boolean test(obj)
-} 
-
-List filter(List list,Predicate pred) {
-   list.findAll { pred.test(it) }
-} 
-def input = [1, 2, 3, 4, 5] 
-def odd = filter(input) { it % 2 == 1 }
-assert odd == [1, 3, 5]
-----
-
-
-Notice how the closure is coerced into a Predicate instance. Without
-that new capabilities, we would have had to write the following instead:
-
-[source,groovy]
-----
-def odd = filter(input, { it % 2 == 1} as Predicate)
-----
-
-
-That way, Groovy closure coercion to SAM types is as concise as Java 8
-lambda closure conversion.
-
-Here’s another example using abstract classes, which are not supported
-by Java 8 lambda conversion:
-
-[[Groovy2.2releasenotes-MemoizedASTtransformationformethods]]
-== @Memoized AST transformation for methods
-
-Similarly to our Closure memoization capability, you can now annotate
-your methods with the
-new link:https://issues.apache.org/jira/browse/GROOVY-4993[@Memoized annotation].
-It will use the same underlying cache solution used for closures, and
-will cache the result of previous executions of the annotated method
-with the same entry parameters.
-
-[source,groovy]
-----
-import groovy.transform.Memoized 
-
-@Memoized
-int expensiveOp(int a, int b) {
-   sleep 1000    
-   return a + b
-}
-
-expensiveOp(1, 2) // one second to return
-expensiveOp(1, 2) // immediate result returned expensiveOp(1, 2)
-----
-
-
-[[Groovy2.2releasenotes-Bintray]]
-== Bintray’s JCenter repository 
-
-The default Grab configuration now use Bintray’s JCenter repository as
-the first in the chain of resolvers, as Bintray’s JCenter repository is
-noticeably faster and more responsive than Maven Central, offers
-dependencies always with their checksums, and stores and caches
-dependencies it wouldn’t have for faster delivery the next time a
-dependency is required. This should make your scripts relying on @Grab
-faster when downloading dependencies for the first time.
-
-[[Groovy2.2releasenotes-Definebasescriptclasseswithanannotation]]
-== Define base script classes with an annotation
-
-All scripts usually extend
-the link:http://docs.groovy-lang.org/latest/html/api/groovy/lang/Script.html[groovy.lang.Script] abstract
-class, but it’s possible to set up our own base script class extending
-Script
-through link:http://docs.groovy-lang.org/latest/html/api/org/codehaus/groovy/control/CompilerConfiguration.html[CompilerConfiguration].
-A new AST transformation is introduced in Groovy 2.2 which allows you to
-define the base script class as follows:
-
-[source,groovy]
-----
-import groovy.transform.BaseScript 
-
-abstract class DeclaredBaseScript extends Script {
-   int meaningOfLife = 42
-}
-
-@BaseScript DeclaredBaseScript baseScript 
-
-assert meaningOfLife == 42
-----
-
-[[Groovy2.2releasenotes-NewDelegatingScriptbaseclassforscripts]]
-== New DelegatingScript base class for scripts
-
-With the CompilerConfiguration class that you pass to GroovyShell (as
-well as GroovyClassLoader and others), you can define a base script
-class for the scripts that will be compiled with that shell. It’s handy
-to share common methods to all scripts.
-
-For DSL purposes, it’s interesting to actually delegate the method calls
-and unbound variable assignments to a different object than the script
-itself, thanks to the
-new link:https://issues.apache.org/jira/browse/GROOVY-6076[DelegatingScript].
-
-To make it more concrete, let’s have a look at the following
-configuration script:
-
-[source,groovy]
-----
-// import the CompilerConfiguration class// to configure the base script class
-import org.codehaus.groovy.control.CompilerConfiguration 
-
-// the script we want to compile
-def scriptContent = '''
-name = 'Guillaume'
-sayHi()'''
-
-// the class definition of the delegate
-class Person {
-   String name
-   void sayHi() {
-      println "Hi $name"
-   }
-} 
-
-// configure the base script class
-def cc = new CompilerConfiguration()
-cc.scriptBaseClass = DelegatingScript.class.name 
-
-// parse script with GroovyShell// and the
-configurationdef sh = new GroovyShell(cc)
-def script = sh.parse(scriptContent) 
-
-// set the delegate and run the script
-def p = new Person()
-script.setDelegate(p)
-script.run() // the name is set correctly
-
-// and the output will display "Hi Guillaume"
-assert p.name == 'Guillaume'
-----
-
-[[Groovy2.2releasenotes-NewLogvariantfortheLog4j2loggingframework]]
-== New @Log variant for the Log4j2 logging framework
-
-A new @Log variant has been added to support Log4j2, with the @Log4j2
-AST transformation:
-
-[source,groovy]
-----
-import groovy.util.logging.Log4j2
-
-@Log4j2
-class MyClass {
-   void doSomething() {
-      log.info 'did something groovy today!'
-   }
-}
-----
-
-[[Groovy2.2releasenotes-DelegatesTowithgenericstypetokens]]
-== @DelegatesTo with generics type tokens
-
-The @DelegatesTo annotation, introduced in Groovy 2.1 that helps the
-type checker, IDEs, tools, to provide better support for DSLs using
-closure delegation
-strategies, link:https://issues.apache.org/jira/browse/GROOVY-6134[works with generics token types] as well.
-You can tell Groovy that the delegatee is
-of the type of the generics component:
-
-[source,groovy]
-----
-import groovy.transform.*
-
-@InheritConstructors
-class MyList extends LinkedList<String> {} 
-
-public <T> Object map(
-    @DelegatesTo.Target List<T> target,
-    @DelegatesTo(genericTypeIndex = 0) Closure arg) {
-    arg.delegate = target.join('')
-    arg()
-}
-
-@TypeChecked
-def test() {
-   map(new MyList([’f', `o', `o'])) {
-      assert toUpperCase() == 'FOO'
-   }
-} 
-----
-
-Note the genericTypeIndex attribute of @DelegatesTo that points at the
-index of the generic component. Unfortunately, as the generic
-placeholders are not kept at the bytecode level, it’s impossible to just
-reference T, and we had to use an index to point at the right type.
-
-[[Groovy2.2releasenotes-Precompiledtypecheckingextensions]]
-== Precompiled type checking extensions
-
-The static type checking extensions introduced in Groovy 2.1 were
-working solely with non-compiled scripts. But with this beta, you can
-also specify a fully-qualified name of
-the link:https://issues.apache.org/jira/browse/GROOVY-6043[precompiled class implementing your extension]:
-
-[source,groovy]
-----
-@TypeChecked(extensions = 'com.enterprise.MyDslExtension')

-----
-
-Type checking extensions now also support two more
-events: link:https://issues.apache.org/jira/browse/GROOVY-6039[ambiguousMethods] and link:https://issues.apache.org/jira/browse/GROOVY-6044[incompatibleReturnType]. 
-
-[[Groovy2.2releasenotes-Groovyshenhancements]]
-== Groovysh enhancements
-
-Groovysh has been expanded with various enhancements:
-
-* support for link:https://issues.apache.org/jira/browse/GROOVY-6073[code completion] in various places, like imports, package names, class names,
-variable names, parameter names, keywords, etc.
-* a link:https://issues.apache.org/jira/browse/GROOVY-6150[doc command] allows you
-to open the relevant JavaDoc and Groovy GDK web pages to have more
-information for a given class, for example try in Groovysh: +
-----
-doc java.util.List
-----
-
-* you can link:https://issues.apache.org/jira/browse/GROOVY-6145[complete file names] inside strings, particularly handy for your scripting tasks where
-you want to open a file with `new File('data.|')` (where the pipe
-character is the position of your cursor), and then hit the TAB key to
-have the completion of the file name
-
-[[Groovy2.2releasenotes-OSGimanifestsfortheindyjar]]
-== OSGi manifests for the `invokedynamic` JARs
-
-If you’re using Groovy in the context of an OSGi container, the Groovy
-JARs contained the right OSGi metadata information in its manifest.
-However, it wasn’t the case for the `invokedynamic` JARs, as the
-underlying library used by the Gradle OSGi plugin wasn’t supporting JDK
-7 bytecode. Fortunately, this deficiency has been fixed, the Gradle OSGi
-plugin updated, and we’re now able to have our `indy` JARs work fine
-under OSGi has well.
\ No newline at end of file
diff --git a/site/src/site/releasenotes/groovy-2.3.adoc b/site/src/site/releasenotes/groovy-2.3.adoc
deleted file mode 100644
index ce0e923..0000000
--- a/site/src/site/releasenotes/groovy-2.3.adoc
+++ /dev/null
@@ -1,834 +0,0 @@
-Groovy 2.3 is the new major release of Groovy, featuring
-official *support for running Groovy on JDK 8*, *traits*, new and improved
-AST transformations like `@TailRecursive`, `@Builder` and `@Sortable`, a
-new _NIO2 module_ with `Path` support, *lightening fast JSON* parsing and
-building,*closure parameter type inference*, a new *markup template engine*,
-Groovysh and GroovyConsole ease of use improvements, a
-new `GroovyAssert` test utility, more `@BaseScript` class capabilities,
-and more.
-
-[[Groovy2.3releasenotes-OfficialsupportforrunningGroovyonJDK8]]
-== Official support for running Groovy on JDK 8
-
-This is the first version of Groovy to be officially compatible with JDK
-8.
-
-JDK 8 and its interface default methods introduced some
-incompatibilities with a few methods of the Groovy Development Kit, so
-we had to adapt to the situation, introducing minor breaking changes for
-the affected methods and their outcome.
-
-Note that we’re not planning to backport the changes to older versions
-of Groovy, so if you want to run Groovy on JDK 8, you’ll have to upgrade
-to the shiniest version of Groovy!
-
-Groovy 2.3 doesn’t support the new syntax constructs offered by Java 8
-(such as lambdas, method references, default methods in interfaces,
-etc), but you can very well already *use the new APIs offered by JDK
-8*, and even *use Groovy closures in lieu of Java 8 lambdas*.
-
-For reference, here are a couple of examples which use Java 8 streams,
-for iterating over a stream of ints, or over the lines of a file:
-
-[source,groovy]
-----
-IntStream.range(1, 100).forEach { println it }
-
-Files.lines(Paths.get('README.adoc'))
-     .map { it.toUpperCase() }
-     .forEach { println it }
-----
-
-
-In particular, in the two statements above, notice that we replaced Java
-8 lambdas with Groovy closures, as Groovy provides a closure coercion
-mechanism which transforms a Groovy closure into a functional interface
-— unlike Java, Groovy also provides that coercion mechanism for abstract
-classes containing a single abstract method.
-
-In future versions of Groovy, certain Java 8 syntax constructs, or
-particular Groovy methods decorating JDK 8 APIs might be added.
-
-[[Groovy2.3releasenotes-Traits]]
-== Traits
-
-A major highlight for Groovy 2.3 is the introduction of the *concept of traits*.
-
-link:{DOCS_BASEURL}/html/documentation/core-traits.html[Traits]
-are reusable components of behavior that your classes can implement, and
-are an additional Object-Oriented concept alongside classes and
-interfaces.
-
-Below, we create a trait with a concrete method `fly()` which returns a
-`String`.
-
-[source,groovy]
-----
-trait FlyingAbility {
-    String fly() { "I'm flying!" }
-}
-----
-
-Then we create a class, `Bird`, that implements that trait, and
-instantiate it:
-
-[source,groovy]
-----
-class Bird implements FlyingAbility {}
-def b = new Bird()
-----
-
-We can check that the Bird instance does have the new `fly()` method
-mixed-in:
-
-[source,groovy]
-----
-assert b.fly() == "I'm flying!"
-----
-
-Groovy traits are stateful (unlike Java 8 interface default methods).
-A trait can have Groovy properties like plain classes:
-
-[source,groovy]
-----
-trait Named {
-    String name
-}
-----
-
-This time, the `Bird` class implements that `Named` trait:
-
-[source,groovy]
-----
-class Bird implements Named {}
-----
-
-We can instantiate the Bird with the named-argument constructor shortcut
-provided by Groovy:
-
-[source,groovy]
-----
-def b = new Bird(name: 'Colibri')
-----
-
-We assert that the instantiated Bird does have the name property added
-to it:
-
-[source,groovy]
-----
-assert b.name == 'Colibri'
-----
-
-They allow the composition of behavior without going into the "diamond
-inheritance" problem allowing you to decide which behavior prevails
-upon conflict, either by convention (last trait declared wins) or by
-explicitly overriding the conflicting method:
-
-[source,groovy]
-----
-trait KiteSurfer { String surf() { 'kite' } }
-
-trait WebSurfer  { String surf() {  'web' } }
-
-class Person { String name }
-
-class Hipster extends Person
-           implements KiteSurfer, WebSurfer {}
-
-def h = new Hipster()
-assert h.surf() == 'web'
-----
-
-Above, the `surf()` method from `WebSurfer` wins, as it’s the last declared
-trait, but you can reverse the trait implementation order if you want
-kite to be returned. If you want to be more explicit, your `Hipster` class
-can override the `surf()` method itself, and call `WebSurfer.super.foo()` or
-`KiteSurfer.super.foo()` or do something entirely different.
-
-Traits support inheritance, thus a trait can extend another trait or
-implement an interface, as shown below:
-
-[source,groovy]
-----
-trait Named { String name }
-
-trait FlyingAbility extends Named {
-    String fly() { "I'm a flying ${name}!" }
-}
-
-class Bird implements FlyingAbility {}
-def b = new Bird(name: 'Colibri')
-
-assert b.name == 'Colibri'
-assert b.fly() == "I'm a flying Colibri!"
-----
-
-Traits are compatible with static type checking and compilation, as well
-as our usual dynamic behavior. Trait mixed-in methods are actually
-"real" methods (ie. visible from Java as well) and not just dynamic.
-Note however, that not all existing AST transformations are compatible
-with traits.
-
-Traits can also be implemented at runtime with `as` or with
-`withTraits` if you just want to add behavior of a trait to an object
-you’re instantiating, without having to create an intermediary
-artificial class just for that purpose (also called per-instance
-traits):
-
-[source,groovy]
-----
-trait Named { String name }
-
-trait Quacks {
-    String quack() { 'Quack!' }
-}
-
-class Animal {}
-
-def na = new Animal().withTraits Named, Quacks
-na.name = 'Daffy'
-assert na.name == 'Daffy'
-assert na.quack() == 'Quack!'
-----
-
-You can find more information on traits in the
-exhaustive link:{DOCS_BASEURL}/html/documentation/core-traits.html[traits documentation].
-
-[[Groovy2.3releasenotes-NewandupdatedASTtransformations]]
-== New and updated AST transformations
-
-[[Groovy2.3releasenotes-Newtransformations]]
-=== New transformations
-
-[[Groovy2.3releasenotes-TailRecursive]]
-==== @TailRecursive
-
-`@TailRecursive` on methods adds tail recursion to methods which are
-recursive and call themselves at the last operation of the method body,
-which helps avoid blowing up the stack with the recursive calls
-(link:https://issues.apache.org/jira/browse/GROOVY-6570[GROOVY-6570]).
-
-Here’s a slightly rewritten factorial implementation, that is friendly
-to tail-call transformation:
-
-[source,groovy]
-----
-import groovy.transform.TailRecursive
-
-@TailRecursive
-def fact(BigInteger n, accu = 1G) {
-    if (n < 2) accu
-    else fact(n - 1, n * accu)
-}
-
-assert fact(1000) > 10e2566
-----
-
-[[Groovy2.3releasenotes-Builder]]
-==== @Builder
-
-Recent Java APIs have adopted the builder pattern (not to be confused
-with Groovy’s builders) to instantiate complex objects, without
-requiring to multiply the number of constructors with variants taking
-various combination of parameters. Groovy 2.3 introduces a `@Builder`
-transformation to automate the creation of such builder APIs
-(link:https://issues.apache.org/jira/browse/GROOVY-6484[GROOVY-6484]).
-
-The `@Builder` transformation offers different implementation strategies
-that you can choose from:
-
-* a simple strategy for creating chained setters
-* an external strategy where you annotate an explicit builder class
-while leaving some buildee class being built untouched
-* a default strategy which creates a nested helper class for instance
-creation
-* and an initializer strategy which creates a nested helper class for
-instance creation which when used with `@CompileStatic` allows type-safe
-object creation
-
-Here’s an example with the default strategy:
-
-[source,groovy]
------
-import groovy.transform.builder.Builder
-
-@Builder
-class Person {
-    String firstName
-    String lastName
-    int age
-}
-
-def person = Person.builder()
-                   .firstName("Robert")
-                   .lastName("Lewandowski")
-                   .age(21)
-                   .build()
-
-assert person.firstName == "Robert"
-assert person.lastName == "Lewandowski"
-assert person.age == 21
------
-
-You can have a look at
-the link:{DOCS_BASEURL}/html/documentation/core-metaprogramming.html#xform-Builder[@Builder documentation]
-for the other builder variants.
-
-[[Groovy2.3releasenotes-Sortable]]
-==== @Sortable
-
-`@Sortable` on classes implements comparison methods for you (through
-implementing the `Comparable` interface), according to the declaration
-order of your properties
-(link:https://issues.apache.org/jira/browse/GROOVY-6649[GROOVY-6649]).
-
-For the following `Person` class, its instances will be sorted by last
-name, then by first name, and by age, in that order:
-
-[source,groovy]
-----
-import groovy.transform.*
-
-@Sortable
-@Canonical
-class Person {
-    String last
-    String first
-    int age
-}
-
-def folks = [
-    new Person('Simpson', 'Bart', 12),
-    new Person('Simpson', 'Homer', 40),
-    new Person('Kent', 'Clark', 36)
-]
-
-assert folks.sort()*.first == ['Clark', 'Bart', 'Homer']
-----
-
-Additionally, you can define included / excluded fields, access
-individual field comparators with methods like `comparatorByFirst()`.
-
-More details on
-the {DOCS_BASEURL}/html/documentation/core-metaprogramming.html#xform-Sortable[@Sortable documentation] page.
-
-[[Groovy2.3releasenotes-SourceURI]]
-==== @SourceURI
-
-With `@SourceURI`, you can annotate a `java.net.URI` or even a
-`java.lang.String` script variable or class field so that the variable or
-field are injected the URI of the Groovy file.
-
-If you evaluate or compile a Groovy script or class, the variable or
-field will contain a data URI, for example, for the following example:
-
-[source,groovy]
-----
-import groovy.transform.SourceURI
-
-@SourceURI String src
-
-println src
-----
-
-The `src` variable will contain the following data URI:
-
-----
-data:,import%20groovy.transform.SourceURI%0A%0A@SourceURI%20String%20src%0A%0Aprintln%20src
-----
-
-If you save the script in a file called `sourceuri.groovy` in `/tmp`, and
-run that script with the `groovy` command, you’ll see an absolute `File`
-path printed:
-
-----
-file:/tmp/sourceuri.groovy
-----
-
-As we mentioned above, you can also write `@SourceURI URI src`, if you want
-to have a `URI` instead of a `String`.
-
-[[Groovy2.3releasenotes-Updatedtransformations]]
-=== Updated transformations
-
-[[Groovy2.3releasenotes-Delegateimprovements]]
-==== @Delegate improvements
-
-`@Delegate` supports `includeTypes` and `excludeTypes` attributes to give you
-fine-grained control over which methods to include or exclude from
-delegation. Rather than just matching on name, this option matches on
-the name and parameter types expressed in an interface type
-(link:https://issues.apache.org/jira/browse/GROOVY-6329[GROOVY-6329]).
-
-[[Groovy2.3releasenotes-BaseScriptclassimprovements]]
-==== @BaseScript class improvements
-
-{DOCS_BASEURL}/html/gapi/groovy/transform/BaseScript.html[@BaseScript]
-is a fairly recent addition in Groovy, and it allowed to annotate a
-variable in your script to instruct the compiler to use a particular
-base script class for this script. Now we have another notation which is
-nicer as you can annotate an import or a package
-(link:https://issues.apache.org/jira/browse/GROOVY-6592[GROOVY-6592]) to indicate
-that base script class:
-
-[source,groovy]
-----
-@BaseScript(MyScript)
-import groovy.transform.BaseScript
-----
-
-Additionally, base script classes can now use any abstract method for
-the script body. This means that you can implement the `run()` method to
-implement specific behavior like setup and tear down in tests
-(link:https://issues.apache.org/jira/browse/GROOVY-6585[GROOVY-6585]
-and link:https://issues.apache.org/jira/browse/GROOVY-6615[GROOVY-6615]).
-
-Given the following custom base script class, where we implement the
-default `run()` method, we also create a new abstract method called
-`internalRun()`:
-
-[source,groovy]
-----
-abstract class CustomBase extends Script {
-    def run() {
-        before()
-        internalRun()
-        after()
-    }
-
-    abstract internalRun()
-
-    def before() { println 'before' }
-    def after()  { println 'after'  }
-}
-----
-
-We can then have the script below transparently implement the
-`internalRun()` method instead of the usual `run()` one:
-
-[source,groovy]
-----
-import groovy.transform.BaseScript
-@BaseScript CustomBase script
-
-println 'Hello'
-----
-
-[[Groovy2.3releasenotes-NewNIOmoduleforJava7]]
-== New NIO module for Java 7+
-
-On JDK 7 and beyond, you can benefit from the same methods as the ones
-of File but for the new NIO2 class `Path`.
-
-See link:https://issues.apache.org/jira/browse/GROOVY-6377[GROOVY-6377] and
-the link:https://github.com/groovy/groovy-core/pull/260/files[pull request]
-for some further hints of the new methods.
-
-You’ll find familiar methods of the Groovy GDK on `File` also available on
-`Path` like these ones:
-
-[source,groovy]
-----
-path.withReader { Reader r -> ... }
-path.eachLine { String line -> ... }
-path.eachFileRecurse { Path p -> ... }
-path << 'some content'
-path << bytes
-path.readLines()
-----
-
-[[Groovy2.3releasenotes-Performanceimprovements]]
-== Performance improvements
-
-[[Groovy2.3releasenotes-Miscellanousimprovements]]
-=== Miscellanous improvements
-
-Various minor *performance improvements across the board*, for static
-compilation, the `invokedynamic` backend, as well as "normal"
-dynamic Groovy, have been worked on.
-
-[[Groovy2.3releasenotes-DrasticJSONparsingandserializationperformanceimprovements]]
-=== Drastic JSON parsing and serialization performance improvements
-
-Groovy JSON support has been refactored and tailored towards
-performance, making Groovy 2.3’s JSON support usually
-*faster than all the JSON libraries* available in the Java ecosystem.
-
-Rick Hightower and Andrey Bleschestov covered the performance gains,
-both in parsing and seralization, in
-a link:http://rick-hightower.blogspot.fr/2014/04/groovy-and-boon-provide-fastest-json.html[benchmarks on Rick’s blog]
-and on link:https://github.com/bura/json-benchmarks[Andrey’s JSON benchmark project on Github].
-The results are impressive, as the *parsing is generally roughly 2x to 4x faster* with Groovy’s new
-parsers compared to existing libraries, and *~21x faster than pre-Groovy 2.3 parsing*.
-On the serialization front, Groovy’s
-new *serialization is also ~17x faster than before*, and at the same
-level as competing libraries.
-
-[[Groovy2.3releasenotes-JSONslurperandbuilderenhancements]]
-== JSON slurper and builder enhancements
-
-Beside the performance improvements of the JSON module, other updates
-have taken place.
-
-With link:{DOCS_BASEURL}/html/gapi/groovy/json/JsonSlurper.html[JsonSlurper],
-you’ll be able to set
-different link:{DOCS_BASEURL}/html/gapi/groovy/json/JsonParserType.html[parser types]
-depending on the kind of input you wish to parse, particularly if
-you know the size of the payload you expect to parse, or whether you
-want a more tolerant parser which accepts elements like comments which
-are not normally supported by the JSON specification.
-
-Here’s an example showing how to parse a non-conformant JSON payload:
-
-[source,groovy]
-----
-import groovy.json.*
-import static groovy.json.JsonParserType.*
-
-def parser = new JsonSlurper().setType(LAX)
-
-def conf = parser.parseText '''
-    // configuration file
-    {
-        // no quote for key, single quoted value
-        environment: 'production'
-        # pound-style comment
-        'server': 5
-    }
-'''
-
-assert conf.environment == 'production'
-assert conf.server == 5
-----
-
-[[Groovy2.3releasenotes-Closureparametertypeinference]]
-== Closure parameter type inference
-
-We closed a gap which forced you to type your closure parameters to get
-correct type inference with static type checking or static compilation
-enabled. In situations like the following, you would have to explicitly
-give the type of the parameter, but it’s no longer required:
-
-[source,groovy]
-----
-['a','b'].each { it.toUpperCase() }
-----
-
-In the signature of your methods taking closures as arguments, you’ll
-also be able to annotate the closure parameter
-with link:{DOCS_BASEURL}/html/gapi/groovy/transform/stc/ClosureParams.html[@ClosureParams]
-to give additional hints to the type checker to infer the type of the
-parameters passed to your closure.
-
-You can also find more about this in Cédric’s blog post
-on link:http://melix.github.io/blog/2014/01/closure_param_inference.html[closure parameter type inference].
-
-[[Groovy2.3releasenotes-Newmarkuptemplateengine]]
-== New markup template engine
-
-Groovy now has an additional template engine, in the form of the Markup
-template engine, which gives you a very fast template engine (thanks to
-static compilation), based on the familiar Markup builder approach and
-notation, but also offering formatting options (indentation, escaping),
-internationalization, includes, as well as proposing type checked
-templates and models.
-
-More details about the
-new link:{DOCS_BASEURL}/html/documentation/markup-template-engine.html[Markup template engine]
-in the documentation, as well as in Cédric’s link:http://melix.github.io/blog/[blog], if you want to learn more
-about the "behind the scenes" stories!
-
-To illustrate the basic usage, consider you have the following template:
-
-[source,groovy]
-----
-def tpl = '''
-    cars {
-        cars.each {
-            car(make: it.make, name: it.name)
-        }
-    }
-'''
-----
-
-And have the following model:
-
-[source,groovy]
-----
-model = [cars: [
-    new Car(make: 'Peugeot', name: '508'),
-    new Car(make: 'Toyota',  name: 'Prius')
-]]
-----
-
-You would generate the following XML (or HTML) output:
-
-[source,xml]
-----
-<cars>
-    <car make='Peugeot' name='508'/>
-    <car make='Toyota'  name='Prius'/>
-</cars>
-----
-
-By doing the following:
-
-[source,groovy]
-----
-import groovy.text.markup.*
-
-def config = new TemplateConfiguration()
-def engine = new MarkupTemplateEngine(config)
-def tmpl = engine.createTemplate(tpl)
-System.out << tmpl.make(model)
-----
-
-You have useful methods available to your templates, like for including
-other templates:
-
-[source,groovy]
-----
-// include another template
-include template: 'foo.tpl'
-
-// include raw content
-include unescaped: 'raw.txt'
-
-// escape & include
-include escaped: 'to_escape.txt'
-----
-
-And if you want to have your model be type checked, you can either
-define the model types inside the template like so:
-
-[source,groovy]
-----
-modelTypes = {
-    List<Car> cars
-}
-----
-
-Or by using the dedicated template creation method:
-
-[source,groovy]
-----
-def modelTypes = [cars: "List<Car>"]
-
-def tmpl = engine.createTypeCheckedModelTemplate(tpl, modelTypes)
-----
-
-Note that this template engine is super fast as it’s statically
-compiled.
-
-[[Groovy2.3releasenotes-JUnit4GroovyAssertclass]]
-== JUnit 4 GroovyAssert class
-
-The
-venerable link:{DOCS_BASEURL}/html/gapi/groovy/util/GroovyTestCase.html[GroovyTestCase]
-(JUnit 3 based approach) has often been used as a base class for your
-test classes — unless you’ve been using
-the link:http://www.spockframework.org/[Spock testing framework], of course.
-One of the drawback of this class is that your test classes can’t extend
-your own classes, but must derive from `GroovyTestCase` to benefit from
-the additional assertion methods.
-
-In earlier versions of Groovy we introduced the JUnit
-4-friendly link:{DOCS_BASEURL}/html/gapi/groovy/util/GroovyAssert.html[GroovyAssert],
-which is a convenient class offering the usual assertion methods of
-`GroovyTestCase`, but in the form of static methods that you can static
-import in your test class. In Groovy 2.3 we’ve enriched `GroovyAssert`
-with additional features. There should be no reason to move on from
-JUnit 3 if you haven’t already done so. We didn’t include all of the
-myriad of `assertEquals` methods from `GroovyTestCase` as they are typically
-less useful than Groovy’s built-in power assert, but it provides some
-handy `shouldFail()` and `assertScript()` methods
-(link:https://issues.apache.org/jira/browse/GROOVY-6588[GROOVY-6588]).
-
-For instance, if you want to leverage the `shouldFail(String)` and
-`assertScript(String)` methods, you can do so as follows:
-
-[source,groovy]
-----
-import static groovy.test.GroovyAssert.shouldFail
-
-
-import org.junit.Test
-
-class AssertTest {
-    @Test void checkBadAddition() {
-        shouldFail '''
-            groovy.test.GroovyAssert.assertScript 'assert 1 + 1 == 3'
-        '''
-    }
-}
-----
-
-[[Groovy2.3releasenotes-ConfigSlurper]]
-== ConfigSlurper
-
-ConfigSlurper has previously supported a single "environments"
-non-configurational conditional block, but you couldn’t define your own.
-With Groovy 2.3 you can also create your own such blocks. For instance
-if you wanted to support "flavors" like OS variants
-(link:https://issues.apache.org/jira/browse/GROOVY-6383[GROOVY-6383]).
-
-Concretely, instead of the familiar environments / production blocks in
-Grails, let’s register a flavors / prod pair: 
-
-[source,groovy]
-----
-def conf = '''
-    a.b.c = 1
-    flavors {
-        prod {
-            a.b.c = 2
-        }
-    }
-'''
-
-def slurper = new ConfigSlurper('prod')
-slurper.registerConditionalBlock('flavors', 'prod')
-
-def config = slurper.parse(conf)
-
-assert config.a.b.c == 2
-----
-
-In addition, the `isSet()` / `hasSet()` combo methods
-(link:https://issues.apache.org/jira/browse/GROOVY-4639[GROOVY-4639]) have been
-added so you can double check if a given node of your configuration has
-been defined. Before, whether the node wasn’t defined or containing
-`null`, you couldn’t differentiate either case easily.
-
-[[Groovy2.3releasenotes-Toolsenhancements]]
-== Tools enhancements
-
-[[Groovy2.3releasenotes-Groovysh]]
-=== Groovysh
-
-Along with a slightly reduced startup time, Groovysh has seen new
-improvements in its code-completion capabilities:
-
-* completion for keywords
-(link:https://issues.apache.org/jira/browse/GROOVY-6399[GROOVY-6399])
-* completion for properties
-(link:https://issues.apache.org/jira/browse/GROOVY-6395[GROOVY-6395])
-
-Commands are now prefixed with ``:''
-(link:https://issues.apache.org/jira/browse/GROOVY-6397).
-
-[[Groovy2.3releasenotes-GroovyConsole]]
-=== GroovyConsole
-
-It is now possible to configure the font used by the console
-(link:https://issues.apache.org/jira/browse/GROOVY-6303[GROOVY-6303], although
-without a UI dialog yet), and also to be able to run a selected snippet
-of code reusing the imports defined in your script making it easier to
-just run quick snippets of your script. The ability to comment or
-uncomment selected code by pressing `Ctrl +` was added
-with link:https://issues.apache.org/jira/browse/GROOVY-6459[GROOVY-6459].
-
-
-[[Groovy2.3releasenotes-Documentation]]
-== Documentation
-
-[[Groovy2.3releasenotes-Newdocumentation]]
-=== New documentation
-
-We are still working on the
-brand link:{DOCS_BASEURL}/html/documentation/[new documentation] for Groovy
-(in Asciidoc(tor) format), so you can already
-have a glimpse at what’s already covered or not.
-
-We’re looking forward to your help for fleshing out the various TBD ("To
-Be Done") sections of the documentation, as it’s a gigantic task to
-re-document each and every aspect of the language and its libraries! So
-please shout if you want to *contribute to the new documentation*! All
-help is warmly welcome!
-
-[[Groovy2.3releasenotes-RefreshedGroovyDocdocumentationstyle]]
-=== Refreshed GroovyDoc documentation style
-
-GroovyDoc has been updated with a new fresh and modern skin that will be
-part of the future visual identity of the Groovy website. Those style
-updates are also available by default for your own usage of GroovyDoc,
-making your own documentation nicer on the eye.
-
-You can have a look at
-the link:http://docs.groovy-lang.org/2.3.0/html/gapi/[GroovyDoc
-documentation for Groovy 2.3.0].
-
-[[Groovy2.3releasenotes-RefreshedGroovyGDKdocumentationstyle]]
-=== Refreshed Groovy GDK documentation style
-
-We also took the opportunity to apply the same stylesheet to our
-`DocGenerator` tool which is responsible for the generation of the GDK
-documentation, showing the methods the Groovy library adds on top of the
-JDK classes.
-
-Please also have a look at the
-new link:{DOCS_BASEURL}/html/groovy-jdk/[restyled GDK documentation].
-
-[[Groovy2.3releasenotes-Dependencyupgrades]]
-== Dependency upgrades
-
-The following dependencies have been upgraded:
-
-* *GPars 1.2* for all your concurrency, asynchronous or parallelism needs:
-** improvements in the dataflow area, such as lazy tasks and easy
-fork-and-join on Promises
-** actors and dataflow operators now use the Groovy `@DelegatesTo`
-annotation to allow for statically compiled bodies
-** GPars timers and thread-locals have been made more friendly towards
-managed environments and the GParsConfig class now allows GPars to be
-completely shutdown
-* *Gradle 1.10* for building Groovy
-* *ASM 5.0.1* library for generating our bytecode (also needed for our JDK 8 support)
-* *JLine 2.11* and *JANSI 1.11* library for Groovysh
-* *Ant 1.9.3* for the Ant builder
-* *TestNG 6.8.8* for the TestNG module
-
-[[Groovy2.3releasenotes-Breakingchanges]]
-== Breaking changes
-
-Groovy 2.3.0 introduces a limited list of breaking changes.
-
-First of all,*Groovy 2.3.0 now requires JDK 6* as its minimal JDK
-requirement. Some parts of Groovy 2.3.0 might still run under JDK 5 but
-no testing has been done on that platform and some parts are known not
-to work. We encourage everyone to move to at least JDK 6.
-
-In Groovy 2.3.0, we *reworked our implementation of generics handling*.
-Although we don’t know of any particular breakage so far, the static
-type checker might report new errors as it can be stricter than before.
-If ever you encounter such new errors in this area, please report them
-as soon as you encounter them.
-
-With the introduction of "traits" in Groovy 2.3, the `trait` keyword
-is an addition to the list of keyword of the languages, with the
-consequence that *variables or fields that would use `trait` as name
-with yield a compilation error*. So you would have to change the name of
-your variable and recompile your code.
-
-A few updates have been made to the *XML support around whitespace
-handling, and text node handling*:
-
-* https://issues.apache.org/jira/browse/GROOVY-6685[GROOVY-6685]
-* https://issues.apache.org/jira/browse/GROOVY-6683[GROOVY-6683]
-* https://issues.apache.org/jira/browse/GROOVY-6682[GROOVY-6682]
-* https://issues.apache.org/jira/browse/GROOVY-6678[GROOVY-6678]
-* https://issues.apache.org/jira/browse/GROOVY-6621[GROOVY-6621]
-
-With the new default methods on interfaces in JDK 8, there was
-particularly one,
-a link:https://issues.apache.org/jira/browse/GROOVY-6465[List#sort(Comparable) method], which *conflicted with one of the GDK*,
-so we had to remove ours to stay compliant with JDK 8.
-
-We fixed a link:https://issues.apache.org/jira/browse/GROOVY-6456[race condition in AbstractHttpServler#applyResourceNameMatcher]
-which incurred a small change in behavior. This feature is seldomly used and doesn’t seem to
-have impacted users of the Groovy servlet machinery so far.
-
-You can look at the list of
-the link:https://issues.apache.org/jira/browse/GROOVY-6685?jql=project%20%3D%20GROOVY%20AND%20fixVersion%20in%20%28%222.3.0-rc-3%22%2C%20%222.3.0-beta-1%22%2C%20%222.3.0-beta-2%22%2C%20%222.3.0-rc-1%22%2C%20%222.3.0-rc-2%22%29%20AND%20labels%20%3D%20breaking%20AND%20status%20in%20%28Resolved%2C%20Closed%29[breaking changes from our JIRA]
-issue tracker.
-
diff --git a/site/src/site/releasenotes/groovy-2.4.adoc b/site/src/site/releasenotes/groovy-2.4.adoc
deleted file mode 100644
index caaee43..0000000
--- a/site/src/site/releasenotes/groovy-2.4.adoc
+++ /dev/null
@@ -1,220 +0,0 @@
-[[Android]]
-== Android Support
-With Groovy 2.4, you can write Android applications in Groovy!
-
-A quick link:{DOCS_BASEURL}/html/documentation/tools-groovyc.html#section-android[getting
-started guide] is available on the Groovy website.
-
-To build your Android applications with the Groovy support, you’ll be
-able to use
-the link:https://github.com/groovy/groovy-android-gradle-plugin[Gradle Groovy Android plugin].
-
-The link:https://github.com/Arasthel/SwissKnife[SwissKnife] library builds
-upon the Groovy support to offer very useful AST transformations that
-kill the usual Android boilerplate code, for instance for dealing with
-UI events, with logic to be run in background threads, or make objects
-easily "parcelables", etc.
-
-To further understand the new Android support, you can read the
-following articles by Cédric Champeau:
-
-* Introduction: link:http://melix.github.io/blog/2014/06/grooid.html[http://melix.github.io/blog/2014/06/grooid.html]
-* Technical details: link:http://melix.github.io/blog/2014/06/grooid2.html[http://melix.github.io/blog/2014/06/grooid2.html]
-
-And discover presentations on the Android support:
-
-* link:https://speakerdeck.com/melix/groovy-and-android-a-winning-pair-1[Groovy and Android, a winning pair] by Cédric Champeau
-* link:https://speakerdeck.com/glaforge/groovy-on-android-groovy-grails-exchange-2014[Groovy on Android] by Guillaume Laforge
-
-The work on the Android support also lead to various optimizations in
-terms of bytecode generation, as explained further down, as well as, for
-instance, improving the handling of overloaded setters
-(link:https://issues.apache.org/jira/browse/GROOVY-2049[GROOVY-2049],link:https://issues.apache.org/jira/browse/GROOVY-6084[GROOVY-6084],
-link:https://issues.apache.org/jira/browse/GROOVY-2500[GROOVY-2500])
-which are frequent in the Android SDK.
-
-[[Groovy2.4releasenotes-Performanceimprovementsandreducedbytecode]]
-== Performance improvements and reduced bytecode
-
-This new major release of Groovy has seen various improvements across
-the board to reduce the quantity of bytecode produced, to lower memory
-consumption of internal data structures, fine tune bytecode for better
-performance.
-
-Here are some of the tickets related to the topic:
-
-* Cheaper comparison operations
-(link:https://issues.apache.org/jira/browse/GROOVY-7194[GROOVY-7194])
-* Reduced memory consumption for `respondsTo()`
-(link:https://issues.apache.org/jira/browse/GROOVY-7178[GROOVY-7178])
-* For fully statically compiled classes, MOP related generated methods
-are not needed
-(link:https://issues.apache.org/jira/browse/GROOVY-6990[GROOVY-6990])
-* Remove unneeded inner class distributor methods when no inner classes
-are present (link:https://issues.apache.org/jira/browse/GROOVY-6993[GROOVY-6993])
-* Removal of the timestamp in Groovy classes
-(link:https://issues.apache.org/jira/browse/GROOVY-6308[GROOVY-6308])
-* Optimization of primitive type conversions with the as operator
-(link:https://issues.apache.org/jira/browse/GROOVY-7140[GROOVY-7140])
-
-[[Groovy2.4releasenotes-TraitsSelfTypeannotation]]
-== Traits @SelfType annotation
-
-Sometimes, it’s desired to be able to restrict a trait’s application so
-that it can only be applied to subclasses of a certain type. That’s what
-the `@SelfType` annotation is for
-(link:https://issues.apache.org/jira/browse/GROOVY-7134[GROOVY-7134]).
-
-Here’s a concrete example of `@SelfType` in action.
-
-[source,groovy]
-----
-import groovy.transform.*
-
-class Component {
-   void doSomething() {
-       println "Done!"
-   }
-}
-
-@SelfType(Component)
-@TypeChecked
-trait ComponentDecorator {
-   void logAndDoSomething() {
-       println "Going to do something"
-       doSomething()
-   }
-}
-
-class ConcreteComponent
-   extends Component
-   implements ComponentDecorator {}
-
-def c = new ConcreteComponent()
-c.logAndDoSomething()
-----
-
-The `ComponentDecorator` trait is calling the `doSomething()` method from
-the `Component` sub-class to which it will be applied. If you don’t
-specify the `@SelfType(Component)` annotation, when using static type
-checking or static compilation, the compiler will throw a compilation
-error as it wouldn’t know where the `doSomething()` method would be coming
-from. With the annotation, you instruct the compiler to figure out that
-this trait will only be applied to child of Component that will have
-that method available. `@SelfType` is interesting in the context of static
-type checking or compilation, but is not needed if your code is dynamic
-as the resolution will take place at runtime as usual.
-
-[[Groovy2.4releasenotes-GDKimprovements]]
-== GDK improvements
-
-* `System.currentTimeSeconds()` to get the current time in seconds
-(link:https://issues.apache.org/jira/browse/GROOVY-6294[GROOVY-6294])
-* `List#getIndices()` to get a range representing the indices of the
-elements of the list
-(link:https://issues.apache.org/jira/browse/GROOVY-7171[GROOVY-7171])
-* More collection related methods are moved to iterator-based variants
-to apply to all iterable collection types
-(link:https://issues.apache.org/jira/browse/GROOVY-6863[GROOVY-6863]) and missing
-methods have been added like `init()`, `dropRight()`, `takeRight()`
-(link:https://issues.apache.org/jira/browse/GROOVY-6867[GROOVY-6867])
-* `Iterable` gets `disjoin()`, `minus()` and `toSpreadMap()` methods
-(link:https://issues.apache.org/jira/browse/GROOVY-6920[GROOVY-6920])
-* Refinements and concistency for existing collection methods,
-leveraging iterable approaches for stream-like traversals, consistency
-for mutation in place vs  new collection creation, minor optimizations,
-etc. (link:https://issues.apache.org/jira/browse/GROOVY-6945[GROOVY-6945])
-* New `List#removeAt(index)` and `Collection#removeElement(Object)` methods
-(link:https://issues.apache.org/jira/browse/GROOVY-6952[GROOVY-6952])
-* `Iterable` gets a `size()` method like iterators
-(link:https://issues.apache.org/jira/browse/GROOVY-7085[GROOVY-7085])
-
-[[Groovy2.4releasenotes-ASTtransformations]]
-== AST transformations
-
-* The `@ToString` transformation offers an `includeSuperProperties`
-parameter so properties from the super class are also present in the
-string representation
-(link:https://issues.apache.org/jira/browse/GROOVY-7161[GROOVY-7161])
-* You can define the compilation phase for the `@ASTTest` transformation
-for testing your AST transformations
-(link:https://issues.apache.org/jira/browse/GROOVY-6968[GROOVY-6968])
-* `@Synchronized` supports explicit static locks to be used by instance
-methods if needed
-(link:https://issues.apache.org/jira/browse/GROOVY-7030[GROOVY-7030])
-* Clean up generated code for `@AutoExternalizable`
-(link:https://issues.apache.org/jira/browse/GROOVY-6889[GROOVY-6889]) and
-`@EqualsAndHashCode`
-(link:https://issues.apache.org/jira/browse/GROOVY-6893[GROOVY-6893]) the when
-using `@CompileStatic`
-* `@Builder`’s default and initializer strategies improved Java
-integration (link:https://issues.apache.org/jira/browse/GROOVY-6875[GROOVY-6875])
-* `@PackageScope` allowed on constructors too
-(link:https://issues.apache.org/jira/browse/GROOVY-6839[GROOVY-6839])
-
-[[Groovy2.4releasenotes-Groovyshimprovements]]
-== Groovysh improvements
-
-The venerable Groovysh shell continues seeing some useful improvements:
-
-* Groovysh supports custom .rc and .profile scripts to be loaded on
-startup (link:https://issues.apache.org/jira/browse/GROOVY-6943[GROOVY-6943])
-* completion of instanceof statements
-(link:https://issues.apache.org/jira/browse/GROOVY-7200[GROOVY-7200])
-* completion of static members only displayed in a static context
-(link:https://issues.apache.org/jira/browse/GROOVY-6622[GROOVY-6622])
-* completion candidates in color
-(link:https://issues.apache.org/jira/browse/GROOVY-6563[GROOVY-6563])
-* with :set interpreterMode true, you can let Groovysh to let you see
-and use locally-defined variables after further line executions
-(link:https://issues.apache.org/jira/browse/GROOVY-6623[GROOVY-6623])
-* the :load command supports file names containing spaces
-(link:https://issues.apache.org/jira/browse/GROOVY-6942[GROOVY-6942])
-* make arguments and flags consistent with the groovy command and allow
-the launch of a script on startup passed as argument and continue
-execution of Groovysh
-(link:https://issues.apache.org/jira/browse/GROOVY-6754[GROOVY-6754])
-* make it easier to subclass Groovysh for reuse as an embedded shell
-(link:https://issues.apache.org/jira/browse/GROOVY-6752[GROOVY-6752])
-
-[[Groovy2.4releasenotes-Miscellaneous]]
-== Miscellaneous
-
-* Allow Ant targets declaration by AntBuilder without immediate
-execution (link:https://issues.apache.org/jira/browse/GROOVY-2900[GROOVY-2900])
-* Make `NamespaceBuilder` automatically detect namespace declarations
-(link:https://issues.apache.org/jira/browse/GROOVY-6890[GROOVY-6890])
-* Implement and register type checking extensions as subclasses of
-`TypeCheckingExtension`
-(link:https://issues.apache.org/jira/browse/GROOVY-6739[GROOVY-6739])
-* `ConfigObject` overrides `toString()` and offers a `prettyPrint()` method
-(link:https://issues.apache.org/jira/browse/GROOVY-7183[GROOVY-7183])
-* Improved type checking for certain GDK methods
-(link:https://issues.apache.org/jira/browse/GROOVY-6966[GROOVY-6966])
-* Grape is using JCenter through HTTP first for resolving dependencies,
-and now HTTPS is used for better security
-(link:https://issues.apache.org/jira/browse/GROOVY-7152[GROOVY-7152])
-* Parameters of `@DelegatesTo` and `@ClosureParams` are better aligned
-(link:https://issues.apache.org/jira/browse/GROOVY-6956[GROOVY-6956])
-* Multiple labels are supported on the same statement
-(link:https://issues.apache.org/jira/browse/GROOVY-3298[GROOVY-3298])
-
-[[Groovy2.4releasenotes-Breakingchanges]]
-== Breaking changes
-
-A few issues fixed might also be considered breaking changes in some
-situations:
-
-* Malformed class names for closures in inner classes
-(link:https://issues.apache.org/jira/browse/GROOVY-5351[GROOVY-5351])
-* Avoid creation of MOP methods in static compilation
-(link:https://issues.apache.org/jira/browse/GROOVY-6990[GROOVY-6990])
-* Reduce memory consumption for respondsTo()
-(link:https://issues.apache.org/jira/browse/GROOVY-7178[GROOVY-7178])
-* Making Groovysh more easily extendable and embeddable
-(link:https://issues.apache.org/jira/browse/GROOVY-6752[GROOVY-6752])
-
-[[Groovy2.4releasenotes-Moreinformation]]
-== More information
-
-You can browse all the link:../changelogs/changelog-2.4.0.html[tickets closed for Groovy 2.4 in JIRA].
diff --git a/site/src/site/releasenotes/groovy-2.5.adoc b/site/src/site/releasenotes/groovy-2.5.adoc
deleted file mode 100644
index 7fa4062..0000000
--- a/site/src/site/releasenotes/groovy-2.5.adoc
+++ /dev/null
@@ -1,112 +0,0 @@
-(Material on this page is still under development!)
-
-[[Groovy2.5releasenotes-Macros]]
-== Macro support
-With Groovy 2.5, you can write macros in Groovy!
-
-Details: TBD
-
-[[Groovy2.5releasenotes-NewAstTransforms]]
-== New AST Transformations
-
-* `@MapConstructor` adds a `Map`-based constructor to a class. This allows a usage
-style similar to Groovy's named parameters but doesn't use the no-arg constructor
-and then call setters. This may be useful if you have final properties or wish the
- class file to have the `Map` constructor for integration purposes
-(link:https://issues.apache.org/jira/browse/GROOVY-7353[GROOVY-7353]).
-* `@AutoImplement` allows you to provide dummy implementations of any abstract
-methods that might be inherited from super classes or interfaces
-(link:https://issues.apache.org/jira/browse/GROOVY-7860[GROOVY-7860]).
-
-[[Groovy2.5releasenotes-AstTransformImprovements]]
-== AST Transformation improvements
-
-* `@Canonical` becomes a meta-annotation allowing more flexible usage of the annotation attributes
-from its constituent annotations
-(link:https://issues.apache.org/jira/browse/GROOVY-6319[GROOVY-6319]).
-* `@Immutable` now supports Java's `Optional` container class
-(link:https://issues.apache.org/jira/browse/GROOVY-7600[GROOVY-7600])
-and handles inheritance hierarchies
-(link:https://issues.apache.org/jira/browse/GROOVY-7162[GROOVY-7162]).
-* `@Delegate` can now be used on getters
-(link:https://issues.apache.org/jira/browse/GROOVY-7769[GROOVY-7769]).
-* `@TupleConstructor` now supports `pre` and `post` closure conditions to match the functionality provided by `@MapConstructor`
-(link:https://issues.apache.org/jira/browse/GROOVY-7769[GROOVY-7769]).
-* `@TupleConstructor` and `@Builder` should be able to use defined setters rather than the field directly
-(link:https://issues.apache.org/jira/browse/GROOVY-7087[GROOVY-7087]).
-* Most annotations check property and field names provided to annotation attributes
-(link:https://issues.apache.org/jira/browse/GROOVY-7087[GROOVY-7087]).
-
-[[Groovy2.5releasenotes-Toolimprovements]]
-== Tool improvements
-
-Some improvements were made to Groovysh shell and the Groovy Console:
-
-* `groovysh` should offer easier access to grapes
-(link:https://issues.apache.org/jira/browse/GROOVY-6514[GROOVY-6514]).
-* `groovyconsole` now provides an ASMifier tab within the AstBrowser
-(link:https://issues.apache.org/jira/browse/GROOVY-8091[GROOVY-8091]).
-
-[[Groovy2.5releasenotes-OtherImprovements]]
-== Other improvements
-
-* Groovy's CliBuilder now supports annotation style definitions
-(link:https://issues.apache.org/jira/browse/GROOVY-7825[GROOVY-7825]).
-* Alternative to `with` called `tap` that has an implicit `return delegate`
-(link:https://issues.apache.org/jira/browse/GROOVY-3976[GROOVY-3976]).
-* Various JSON customization options are now supported
-(link:https://issues.apache.org/jira/browse/GROOVY-3976[GROOVY-6975] and
-link:https://issues.apache.org/jira/browse/GROOVY-3976[GROOVY-6854]).
-* Method parameter names are now accessible at runtime
-(link:https://issues.apache.org/jira/browse/GROOVY-7423[GROOVY-7423]).
-
-[[Groovy2.5releasenotes-Breakingchanges]]
-== Breaking changes
-
-A few issues fixed might also be considered breaking changes in some
-situations:
-
-* @TupleConstructor could use the order of properties listed in 'includes' when that option is used
-(link:https://issues.apache.org/jira/browse/GROOVY-8016[GROOVY-8016])
-* @ToString could output properties in a predefined order when 'includes' is used
-(link:https://issues.apache.org/jira/browse/GROOVY-8014[GROOVY-8014])
-* AstNodeToScriptAdapter should output source using the recommended modifier order
-(link:https://issues.apache.org/jira/browse/GROOVY-7967[GROOVY-7967])
-* ObjectRange iterator returns null instead of NoSuchElementException
-(link:https://issues.apache.org/jira/browse/GROOVY-7961[GROOVY-7961])
-* IntRange iterator returns null instead of NoSuchElementException
-(link:https://issues.apache.org/jira/browse/GROOVY-7960[GROOVY-7960])
-(link:https://issues.apache.org/jira/browse/GROOVY-7937[GROOVY-7937])
-* o.c.g.r.t.DefaultTypeTransformation does not apply the right toString on primitive arrays when transforming to String
-(link:https://issues.apache.org/jira/browse/GROOVY-7853[GROOVY-7853])
-* Remove synchronized methods of groovy.sql.Sql and document it as not thread-safe
-(link:https://issues.apache.org/jira/browse/GROOVY-7673[GROOVY-7673])
-* InvokerHelper formatting methods have inconsistent API
-(link:https://issues.apache.org/jira/browse/GROOVY-7563[GROOVY-7563])
-* Fix up transforms (apart from TupleConstructor) which are affected by empty includes default
-(link:https://issues.apache.org/jira/browse/GROOVY-7529[GROOVY-7529])
-* TupleConstructor with empty includes includes all
-(link:https://issues.apache.org/jira/browse/GROOVY-7523[GROOVY-7523])
-* TupleConstructor overwrites empty default constructors
-(link:https://issues.apache.org/jira/browse/GROOVY-7522[GROOVY-7522])
-* ResourceGroovyMethods/NioGroovyMethods BOM behavior is inconsistent
-(link:https://issues.apache.org/jira/browse/GROOVY-7465[GROOVY-7465])
-* API inconsistency between takeWhile, dropWhile and collectReplacements for CharSequences
-(link:https://issues.apache.org/jira/browse/GROOVY-7433[GROOVY-7433])
-* @ToString could support non-field properties
-(link:https://issues.apache.org/jira/browse/GROOVY-7394[GROOVY-7394])
-* same linkedlist code different behavior between groovy and java
-(link:https://issues.apache.org/jira/browse/GROOVY-6396[GROOVY-6396])
-* CLONE - same linkedlist code different behavior between groovy and java (fix priority of DGM methods vs actual methods on an object)
-* Accessing private methods from public ones using categories and inheritance causes MissingMethodException
-(link:https://issues.apache.org/jira/browse/GROOVY-6263[GROOVY-6263])
-
-[[Groovy2.5releasenotes-JDKrequirements]]
-== JDK requirements changes
-
-Groovy 2.5 requires JDK7+ to build and JDK7 is the minimum version of the JRE that we support.
-
-[[Groovy2.5releasenotes-Moreinformation]]
-== More information
-
-You can browse all the link:../changelogs/changelog-2.5.0.html[tickets closed for Groovy 2.5 in JIRA].
diff --git a/site/src/site/sitemap.groovy b/site/src/site/sitemap.groovy
deleted file mode 100644
index 107cba0..0000000
--- a/site/src/site/sitemap.groovy
+++ /dev/null
@@ -1,473 +0,0 @@
-menu {
-    group('Groovy') {
-        item 'Learn',                       'learn.html'
-        item 'Documentation',               'documentation.html'
-        item 'Download',                    'download.html'
-        item 'Community',                   'community.html'
-        item 'Ecosystem',                   'ecosystem.html'
-    }
-
-    group('About') {
-        item 'Contributing',                'contribute.html'
-        item 'Source code',                 'https://github.com/apache/groovy'
-        item 'Build status',                'buildstatus.html'
-        item 'Security',                    'security.html'
-        item 'Books',                       'learn.html#books'
-        item 'Thanks',                      'thanks.html'
-        item 'Sponsorship',                 'http://www.apache.org/foundation/sponsorship.html'
-        item 'FAQ',                         'faq.html'
-        item 'Search',                      'search.html'
-    }
-
-    group('Socialize') {
-        item 'Discuss on the mailing-list', 'mailing-lists.html',                               'fa-envelope'
-        item 'Groovy newsletter',           'groovy-weekly.html',                               'fa-envelope-o'
-        item 'Groovy on Twitter',           'https://twitter.com/ApacheGroovy',                 'fa-twitter'
-        item 'Events and conferences',      'events.html',                                      'fa-calendar'
-        item 'Source code on GitHub',       'https://github.com/apache/groovy',                 'fa-github'
-        item 'Report issues in Jira',       'contribute.html#reporting-issues',                 'fa-bug'
-        item 'Google+ Groovy Page',         'https://google.com/+groovy',                       'fa-google-plus'
-        item 'Google+ Groovy Community',    'http://bit.ly/g-community',                        'fa-google-plus'
-        item 'Stack Overflow questions',    'http://stackoverflow.com/questions/tagged/groovy', 'fa-stack-overflow'
-	item 'Slack Community',             'http://groovycommunity.com/',                      'fa-slack'
-    }
-}
-
-pages {
-    page 'index', 'index', [allEvents: allEvents]
-    page 'search', 'search', [category: 'Search']
-    page 'ecosystem', 'ecosystem', [category: 'Ecosystem', ecosys: ecosystem]
-    page 'learn', 'learn', [category: 'Learn', docSections: documentationSections, allBooks: library, videos: videos, courses: courses]
-    page 'documentation', 'documentation', [category: 'Documentation', docSections: documentationSections, allDocVersions: allDocVersions]
-    page 'download', 'download', [category: 'Download', distributions: distributions]
-    page 'versioning', 'versioning', [category: 'Download']
-    page 'indy', 'indy', [category: 'Download']
-    page 'security', 'security', [category: 'Learn']
-    page 'community', 'community', [category: 'Community']
-    page 'usergroups', 'usergroups', [category: 'Community', userGroups: usergroups]
-    page 'groovy-weekly', 'groovy-weekly', [category: 'Community']
-    page 'mailing-lists', 'mailing-lists', [category: 'Community']
-    page 'contribute', 'contribute', [category: 'Community']
-    page 'thanks', 'thanks', [category: 'Community']
-    page 'buildstatus', 'buildstatus', [category: 'Community']
-    page 'faq', 'faq', [category: 'Documentation', docSections: documentationSections]
-    page 'events', 'events', [category: 'Community', allEvents: allEvents]
-    page 'api', 'api', [category: 'Learn', iframeTarget: "${DOCS_BASEURL}/html/gapi"]
-    page 'gdk', 'gdk', [category: 'Learn', iframeTarget: "${DOCS_BASEURL}/html/groovy-jdk"]
-    page 'singlepagedocumentation', 'single-page-documentation', [category: 'Learn', iframeTarget: "${DOCS_BASEURL}/html/documentation/"]
-    page 'changelogs', 'changelogs', [:]
-    page '404','404', [:]
-}
-
-documentation {
-    groovyDocumentationVersions([
-            '1.7.0', '1.7.1', '1.7.2', '1.7.3', '1.7.4', '1.7.5', '1.7.6', '1.7.7', '1.7.8', '1.7.9', '1.7.10', '1.7.11',
-            '1.8.0', '1.8.1', '1.8.2', '1.8.3', '1.8.4', '1.8.5', '1.8.6', '1.8.7', '1.8.8', '1.8.9',
-            '2.0.0', '2.0.1', '2.0.2', '2.0.3', '2.0.4', '2.0.5', '2.0.6', '2.0.7', '2.0.8',
-            '2.1.0', '2.1.1', '2.1.2', '2.1.3', '2.1.4', '2.1.5', '2.1.6', '2.1.7', '2.1.8', '2.1.9',
-            '2.2.0', '2.2.1', '2.2.2',
-            '2.3.0', '2.3.1', '2.3.2', '2.3.3', '2.3.4', '2.3.5', '2.3.6', '2.3.7', '2.3.8', '2.3.9', '2.3.10', '2.3.11',
-            '2.4.0', '2.4.1', '2.4.2', '2.4.3', '2.4.4', '2.4.5', '2.4.6', '2.4.7', '2.4.8', '2.4.9', '2.4.10',
-            '2.5.0-alpha-1'
-    ])
-
-    section('Getting started','fa-graduation-cap') {
-        //          NAME                                     TARGET HTML         DOCPAGE HTML                       GENERATE
-        item 'Download Groovy',                             'download',         'download',                         false
-        item 'Install Groovy',                              'install',          'core-getting-started'
-        item 'Differences with Java',                       'differences',      'core-differences-java'
-        item 'The Groovy Development Kit',                  'groovy-dev-kit',   'core-gdk'
-        item 'Runtime and compile-time metaprogramming',    'metaprogramming',  'core-metaprogramming'
-        item 'The Grape dependency manager',                'grape',            'grape'
-        item 'Testing guide',                               'testing',          'core-testing-guide'
-        item 'Domain-Specific Languages',                   'dsls',             'core-domain-specific-languages'
-        item 'Integrating Groovy into applications',        'integrating',      'guide-integrating'
-        item 'Security',                                    'security',         'security'
-        item 'Design patterns in Groovy',                   'design-patterns',  'design-pattern-in-groovy'
-        item 'Style guide',                                 'style-guide',      'style-guide'
-    }
-
-    section ('Language Specification', 'fa-graduation-cap') {
-        item 'Syntax',              'syntax',               'core-syntax'
-        item 'Operators',           'operators',            'core-operators'
-        item 'Program structure',   'structure',            'core-program-structure'
-        item 'Object orientation',  'objectorientation',    'core-object-orientation'
-        item 'Closures',            'closures',             'core-closures'
-        item 'Semantics',           'semantics',            'core-semantics'
-    }
-
-    section ('Tools','fa-gears') {
-        item 'groovyc — the Groovy compiler',               'groovyc',          'tools-groovyc'
-        item 'groovysh — the Groovy command -like shell',   'groovysh',         'groovysh'
-        item 'groovyConsole — the Groovy Swing console',    'groovyconsole',    'groovy-console'
-        item 'IDE integration', 'ides', 'tools-ide'
-    }
-
-    section('Groovy module guides', 'fa-cubes') {
-        item 'Parsing and producing JSON',          'json',             'json-userguide'
-        item 'Working with a relational database',  'databases',        'sql-userguide'
-        item 'Processing XML',                      'processing-xml',   'xml-userguide'
-        item 'Scripting Ant tasks',                 'scripting-ant',    'ant-builder'
-        item 'Template engines',                    'templating',       'template-engines'
-        item 'Creating Swing UIs',                  'swing',            'swing-builder'
-        item 'Servlet support',                     'servlet',          'servlet-userguide'
-        item 'Working with JMX',                    'jmx',              'jmx'
-    }
-
-    section ('API documentation', 'fa-code') {
-        item 'GroovyDoc documentation of the Groovy APIs',  'api',    'api'
-        item 'The Groovy Development Kit enhancements',     'gdk',    'gdk'
-    }
-}
-
-downloads {
-    distribution('Groovy 2.5') {
-        description {
-            yield 'Groovy 2.5 is the upcoming '
-            a(href: 'versioning.html', 'version')
-            yield ' of Groovy. Pre-release versions are available:'
-        }
-        version('2.5.0-alpha-1') {
-            stable false
-        }
-    }
-    distribution('Groovy 2.4') {
-        description {
-            yield 'Groovy 2.4 is the latest stable '
-            a(href: 'versioning.html', 'version')
-            yield ' of Groovy.'
-            yieldUnescaped ''' Important: Releases before 2.4.4 weren't done under the Apache Software Foundation and are provided as a convenience, without any warranty.'''
-        }
-        version('2.4.10') {
-            stable true
-            windowsInstaller 'https://dl.bintray.com/groovy/Distributions/groovy-2.4.10-installer.exe'
-        }
-    }
-}
-
-ecosystem {
-    project('Grails') {
-        description 'Grails is an Open Source, full stack, web application framework for the JVM. It takes advantage of the Groovy programming language and convention over configuration to provide a productive and stream-lined development experience.'
-        url 'http://grails.org/'
-        logo 'img/ecosystem/grails.png'
-    }
-
-    project('Gradle') {
-        description 'Gradle is build automation evolved. Gradle can automate the building, testing, publishing, deployment and more of software packages or other types of projects such as generated static websites, generated documentation or indeed anything else.'
-        url 'http://gradle.org'
-        logo 'img/ecosystem/gradle.png'
-    }
-
-    project('Spock') {
-        description 'Spock is a testing and specification framework for Java and Groovy applications. What makes it stand out from the crowd is its beautiful and highly expressive specification language. Thanks to its JUnit runner, Spock is compatible with most IDEs, build tools, and continuous integration servers.'
-        url 'http://spockframework.org/'
-        logo ''
-    }
-
-    project('GPars') {
-        description 'The GPars framework offers Java developers intuitive and safe ways to handle Java or Groovy tasks concurrently. Leveraging the enormous flexibility of the Groovy programming language and building on proven Java technologies, we aim to make concurrent programming for multi-core hardware intuitive, robust and enjoyable.'
-        url 'http://www.gpars.org/'
-        logo 'img/ecosystem/gpars.png'
-    }
-
-    project('Ratpack') {
-        description 'Ratpack is a simple, capable, toolkit for creating high performance web applications.'
-        url 'http://www.ratpack.io/'
-        logo 'img/ecosystem/ratpack.png'
-    }
-
-    project('Griffon') {
-        description 'Griffon is an application framework for developing desktop applications in the JVM, with Groovy being the primary language of choice. Inspired by Grails, Griffon follows the Convention over Configuration paradigm, paired with an intuitive MVC architecture and a command line interface.'
-        url 'http://griffon-framework.org/'
-        logo 'img/ecosystem/griffon.png'
-    }
-
-    project('Geb') {
-        description 'Geb is a powerful browser functional testing framework that lets you quickly and easily write functional tests in Groovy. It brings together the power of WebDriver, the elegance of jQuery content selection, the robustness of Page Object modelling and the expressiveness of the Groovy language.'
-        url 'http://www.gebish.org/'
-        logo 'img/ecosystem/geb.png'
-    }
-
-    project('SDKMAN!') {
-        description 'SDKMAN! is a tool for managing parallel versions of multiple Software Development Kits on most Unix based systems. It provides a convenient command line interface for installing, switching, removing and listing Candidates.'
-        url 'http://sdkman.io/'
-        logo 'img/ecosystem/sdkman.png'
-    }
-}
-
-allEvents {
-    // Note that the event image should be 257x180 to look nice
-    event('Greach 2017') {
-        location 'Madrid, Spain'
-        date 'March 31 - April 1, 2017'
-        url 'http://greachconf.com/'
-        logo 'img/confs/greach2017.png'
-        description '''
-            <p>
-            Greach, the Spanish gathering of enthusiasts of Groovy, Grails, Griffon, Gradle, Spock, Vert.x, Gaelyk,
-            and many more. With inspirational talks from the makers and users of these projects, hands-on workshops with the rock stars,
-            join the 150+ attendees, designers, students, designers, the best professionals together in a great atmosphere.
-            </p>
-        '''
-    }
-    event('GR8Conf EU 2017') {
-        location 'Copenhagen, Denmark'
-        date 'May 31 - June 2, 2017'
-        url 'http://gr8conf.eu/'
-        logo 'img/confs/gr8confeu.png'
-        description '''
-            <p>
-            Groovy, Grails and the related technologies have seen astounding growth in interest and adoption the past
-            few years, and with good reason. To spread the word even more we have created GR8Conf.
-            </p>
-            <p>
-            The 2017 Edition of GR8Conf Europe will feature a DevOps day. Focus will be on technologies to support your
-            everyday DevOps needs.
-            </p>
-            <p>
-            GR8Conf is an independent, affordable series of conferences.
-            It's dedicated to the technologies in the Groovy ecosystem.
-            </p>
-        '''
-    }
-    event('GR8Conf US 2017') {
-        location 'Minneapolis, MN, United States of America'
-        date 'July 26 - 28, 2017'
-        url 'http://gr8conf.us/'
-        logo 'img/confs/gr8confus.png'
-        description '''
-            <p>
-            Groovy, Grails and the related technologies have seen astounding growth in interest and adoption the past
-            few years, and with good reason. To spread the word even more we have created GR8Conf.
-            </p>
-            <p>
-            GR8Conf is an independent, affordable series of conferences.
-            It's dedicated to the technologies in the Groovy ecosystem.
-            </p>
-        '''
-    }
-    event('GR8Conf India 2018') {
-        location 'New Delhi, India'
-        date 'January, 2018'
-        url 'http://gr8conf.in/'
-        logo 'img/confs/gr8confin.png'
-        description '''
-            <p>
-            Groovy, Grails and the related technologies have seen astounding growth in interest and adoption the past
-            few years, and with good reason. To spread the word even more we have created GR8Conf.
-            </p>
-            <p>
-            GR8Conf is an independent, affordable series of conferences.
-            It's dedicated to the technologies in the Groovy ecosystem.
-            </p>
-        '''
-    }
-
-
-}
-
-books {
-    book('Groovy in Action, Second Edition') {
-        authors "Dierk König, Paul King, Guillaume Laforge, Hamlet D'Arcy, Cédric Champeau, Erik Pragt, and Jon Skeet"
-        cover 'img/books/regina.png'
-        url 'http://www.manning.com/koenig2/'
-        description 'The undisputed definitive reference on the Groovy programming language, authored by core members of the development team.'
-    }
-
-    book('Making Java Groovy') {
-        authors 'Ken Kousen'
-        cover 'img/books/Kousen-MJG.png'
-        url 'http://www.manning.com/kousen/'
-        description 'Make Java development easier by adding Groovy. Each chapter focuses on a task Java developers do, like building, testing, or working with databases or restful web services, and shows ways Groovy can help.'
-    }
-
-    book('Programming Groovy 2') {
-        authors 'Venkat Subramaniam'
-        cover 'img/books/vslg2.jpg'
-        url 'http://pragprog.com/book/vslg2/programming-groovy-2'
-        description 'Dynamic productivity for the Java developer'
-    }
-
-    book('Groovy 2 Cookbook') {
-        authors 'Andrey Adamovitch, Luciano Fiandeso'
-        cover 'img/books/g2cook.jpg'
-        url 'http://www.packtpub.com/groovy-2-cookbook/book'
-        description 'Over 90 recipes that provide solutions to everyday programming challenges using the powerful features of Groovy 2'
-    }
-
-    book('Groovy for Domain-Specific Languages - Second Edition') {
-        authors 'Fergal Dearle'
-        cover 'img/books/gdsl.jpg'
-        url 'https://www.packtpub.com/application-development/groovy-domain-specific-languages-second-edition'
-        description 'Extend and enhance your Java applications with domain-specific scripting in Groovy'
-    }
-
-    book('Groovy Goodness Notebook') {
-        authors 'Hubert A. Klein Ikkink'
-        cover 'img/books/ggood.jpg'
-        url 'https://leanpub.com/groovy-goodness-notebook'
-        description 'Experience the Groovy programming language through code snippets. Learn more about (hidden) Groovy features with code snippets and short articles. The articles and code will get you started quickly and will give more insight in Groovy.'
-    }
-
-    book("Grails 3: A Practical Guide to Application Development") {
-        authors "Eric Helgeson"
-        cover 'img/books/pratical-grails-3-book-cover.png'
-        url 'https://www.grails3book.com/'
-        description "The first book dedicated to Grails 3. You will learn the concepts behind building Grails applications. Real, up-to-date code examples are provided so you can easily follow along."
-    }
-
-    book('Falando de Grails') {
-        authors 'Henrique Lobo Weissmann'
-        cover 'img/books/weissmann_groovy_grails.png'
-        url 'http://www.casadocodigo.com.br/products/livro-grails'
-        description 'For Groovy and Grails developers, authored by the founder of Grails Brasil based on his experiences as a Groovy and Grails consultant.'
-    }
-
-}
-
-usergroups {
-    // Europe
-    userGroup('Aarhus Groovy & Grails Meetup') {
-        location 'Europe/Denmark'
-        url 'https://www.linkedin.com/grps/Groovy-Grails-Meetup-Aarhus-3702945/'
-    }
-    userGroup('Paris Groovy Grails User Group') {
-         location 'Europe/France'
-    }
-    userGroup('Berlin Groovy User Group') {
-        location 'Europe/Germany'
-        url 'http://www.meetup.com/de/Berlin-Groovy-User-Group/'
-    }
-    userGroup('Groovy & Grails Israel User Group') {
-        location 'Europe/Israel'
-        url 'http://www.meetup.com/Groovy-Grails-Israel-Meetup-Group/'
-    }
-    userGroup('Warsaw Groovy User Group') {
-        location 'Europe/Poland'
-        url 'http://www.meetup.com/Warsaw-Groovy-User-Group/'
-    }
-    userGroup('Madrid Groovy User Group') {
-        location 'Europe/Spain'
-        url 'http://www.meetup.com/madrid-gug/'
-    }
-    userGroup('Dutch Groovy and Grails User Group (NLGUG)') {
-        location 'Europe/The Netherlands'
-        url 'http://www.meetup.com/nl-gug/'
-    }
-
-    // North-America
-    userGroup('Austin Groovy and Grails User Group (TX)') {
-        location 'North-America/United States'
-        url 'http://www.meetup.com/Austin-Groovy-and-Grails-Users/'
-    }
-    userGroup('Boston Groovy, Grails, Spring Meetup (B2GS)') {
-        location 'North-America/United States'
-        url 'https://www.meetup.com/Grails-Boston/'
-    }
-    userGroup('Coder Consortium of Sacramento') {
-        location 'North-America/United States'
-        url 'http://coderconsortium.com/'
-    }
-    userGroup('DFW Groovy & Grails User Group') {
-        location 'North-America/United States'
-        url 'http://dfw2gug.org'
-    }
-    userGroup('Groovy Users of Minnesota') {
-        location 'North-America/United States'
-        url 'http://groovy.mn'
-    }
-    userGroup('NYC Groovy / Grails Meetup') {
-        location 'North-America/United States'
-        url 'http://www.meetup.com/grails/'
-    }
-    userGroup('Pittsburgh Groovy Programming') {
-        location 'North-America/United States'
-        url 'http://www.meetup.com/Pittsburgh-Groovy-Programming/'
-    }
-
-    // South-America
-    userGroup('Grails Brasil - Groovy and Grails users group of Brazil') {
-        location 'South-America/Brazil'
-        url 'http://www.grailsbrasil.com.br'
-    }
-    userGroup('Brazil Groovy and Grails Meetup') {
-        location 'South-America/Brazil'
-        url 'http://www.meetup.com/groovybr'
-    }
-
-    // Asia
-    userGroup('Bangalore Groovy Grails Meetup') {
-        location 'Asia/India'
-        url 'http://www.meetup.com/Bangalore-Groovy-Grails-Meetup/'
-    }
-    userGroup('Japan Grails/Groovy User Group') {
-        location 'Asia/Japan'
-        url 'http://www.jggug.org/'
-    }
-
-    // Oceania?
-    /* userGroup('') { location 'Oceania/Australia' } */
-}
-
-videos {
-    video('The Groovy ecosystem revisited') {
-        speaker 'Andrés Almiray'
-        summary '''
-            <p>Groovy is a well established player in the JVM since a few years ago.
-            It's increased popularity across the years has spawned several projects that conform the Groovy Ecosystem.
-            You've probably heard of Grails, Gradle, Griffon and Spock.
-            But what about the rest of projects that are just waiting around the corner to be discovered and make your life easier?
-            This talk presents them tools and libraries that use Groovy as the main driving force to get the job done.</p>
-        '''
-        pictureUrl 'groovy-ecosystem-revisited.png'
-        videoUrl 'https://www.youtube.com/watch?v=2NGeaIwmnC8&list=PLwxhnQ2Qv3xuE4JEKBpyE2AbbM_7G0EN1&index=5'
-        slidesUrl 'http://fr.slideshare.net/aalmiray/gr8conf-groovy-ecosystem'
-    }
-
-    video('Metaprogramming with the Groovy runtime') {
-        speaker 'Jeff Brown'
-        summary '''
-            <p>The dynamic runtime nature of Groovy is one of the things that sets it apart from standard Java and makes it a fantastic language for building dynamic applications for the Java Platform.
-            The metaprogramming capabilities offered by the language provide everything that an application development team needs to build systems that are far more capable than their all Java counterparts.
-            This Part 1 of 2 will cover the runtime metaprogramming capabilities of Groovy. The session will dive deep into Groovy's Meta Object Protocol (MOP) which implements the incredibly dynamic runtime dispatch mechanism.
-            The session will include a lot of live code demonstrating really powerful runtime features of the language.
-            This session is focused specifically on Groovy's runtime metaprogramming capabilities.
-            Part 2 of 2 will cover Groovy's compile time metaprogramming capabilities</p>
-        '''
-        pictureUrl 'metaprogramming-part-1.png'
-        videoUrl 'https://www.youtube.com/watch?v=1xvg8Wcj-hg&list=PLwxhnQ2Qv3xuE4JEKBpyE2AbbM_7G0EN1&index=9'
-    }
-
-    video('Groovy Puzzlers') {
-        speaker 'Noam Tenne'
-        summary '''
-            <p>Remember the epic Java Puzzlers? Here's the Groovy version, and we have some neat ones!
-            Even though we are totally a Grails shop here at JFrog, some of these had us scratching our heads for days trying to figure them out.
-            And there is more!
-            Contributions from the truly Groovy senseis, including Guillaume Laforge, Andrés Almiray, Tim Yates, Ken Kousen
-            make this talk an unforgettable journey to Groovy.
-            In this talk, you'll have the expected dose of fun and enlightenment hearing about our mistakes and failures, great and small,
-            in hard core Groovy/Grails development.</p>
-        '''
-        pictureUrl 'groovy-puzzlers.png'
-        videoUrl 'https://www.youtube.com/watch?v=GfIhxi7L6R0&list=PLwxhnQ2Qv3xuE4JEKBpyE2AbbM_7G0EN1&index=17'
-    }
-}
-
-courses {
-    course('The Complete Apache Groovy Developer Course') {
-        instructor 'Dan Vega'
-        url 'https://www.udemy.com/apache-groovy/?couponCode=LEARN_GROOVY'
-        description '''
-            <p>I am going to teach you everything you need to know to start using The Groovy Programming language. This course is really designed
-            for 2 different types of people and I think both will benefit from it. If you’re a beginner programmer with a some experience in
-            another language like Python or Ruby this course is for you. Dynamic languages are generally thought of as easier for total beginners
-            to learn because they’re flexible and fun. If you’re an existing Java Developer (Beginner or Experienced) this course is also for you.</p>
-
-            <p>This course is packed with almost 14 hours of content. We are going to start off with getting your development environment up and running
-            and then go through the very basics of the language. From there we are going to build on that in each section cover topics like closures, meta-programming,
-            builders and so much more. I feel like this is one of the most complete courses around and I am excited for you to join me on this adventure.</p>
-        '''
-        cover 'groovy-course-cover.png'
-    }
-}
diff --git a/site/src/site/wiki/groovy-release.adoc b/site/src/site/wiki/groovy-release.adoc
deleted file mode 100644
index 63820de..0000000
--- a/site/src/site/wiki/groovy-release.adoc
+++ /dev/null
@@ -1,132 +0,0 @@
-= Adapting the release process for Apache
-Cédric Champeau <cchampeau@apache.org>
-v1.0, March 27, 2015: First version
-
-:teamcity: http://ci.groovy-lang.org
-:groovy: http://groovy-lang.org
-:bintray: https://bintray.com/[Bintray]
-:gradle: http://gradle.org[Gradle]
-
-The goal of this document is to review the current release process for Groovy, and what adaptations are required to fit into the Apache model. 
-
-== The Groovy Way
-
-During the last 4 years, the Groovy team invested a lot of time in narrowing its release process to reduce human errors as much as possible. Releases were previously done from a despot personal computer, with a number of risks:
-
-* mix of development sources and sources found in the repository. This can happen if the release manager did the release without doing a clean checkout in a separate directory. Then there were risks that source files were present on the release manager computer and not in source control.
-* reliance on a local dependency repository. During development, committers usually do not suffer dependency management issues, because they do regular update and some third party dependencies are found in their local caches (Maven, Gradle). However, new developers may find themselves in a different situation, where they have no local cache. When they try to build, compilation fails because some dependencies cannot be fetched.
-* manual update of properties file for release numbers
-* manual tagging
-* manual update of VCS after release, that can easily be forgotten
-* upload of distribution to the Codehaus WebDAV repository, with a lot of failures due to the poor quality of the protocol (in particular stale lock files)
-* upload of documentation took up to several hours due to the WebDAV process, and were *erasing* previous versions of documentation (API, GAPI, GDK) so it wasn't possible to find online the reference API for a specific Groovy version.
-* Maven artifact uploading and signing done through the Codehaus repository, which was again very slow and error-prone
-
-It's worth noting that binary artifacts are currently published in the `org.codehaus.groovy` group id and that the build uses {gradle}.
-
-=== Automation
-
-For those reasons, we slowly migrated off the Codehaus infrastructure and built a new release process with a continuous integration server at its core. We reviewed several options and eventually found a sponsor, Jetbrains, for a {teamcity}[TeamCity continuous integration server]. The reasons to choose a dedicated server are not all related to the release process. The development process itself greatly benefits from it:
-
-* each branch of Groovy (currently 3 active branches: 2.3.x, 2.4.x, master) are built and tested against multiple JDKs : JDK 6, JDK 7, JDK 8, and older branches of Groovy are tested against older JDKs (JDK 5 for 1.8.x/2.x). Note that some Groovy versions are tested in two flavors: legacy and _invokedynamic_.
-* we build unreleased versions of OpenJDK from sources, so that we can test the master branch against upcoming JDK versions, such as JDK 8 updates and even JDK 9. Those builds allowed us to find a lot of bugs in the JDK before it was released.
-* some community projects are tested against development versions of Groovy (currently, Ratpack and Nextflow)
-
-Eventually, the {groovy}[new Groovy website] is built from https://github.com/groovy/groovy-website[sources] and deployed directly from the CI server, after each push on the _master_ branch.
-
-But in addition to those benefits, it's the release process itself which greatly improved:
-
-* the deployment infrastructure moved from Codehaus to {bintray} and http://www.jfrog.com/open-source/[Artifactory]
-* several build plans are dedicated to builds and releases:
-** the http://ci.groovy-lang.org/viewType.html?buildTypeId=Groovy_BintrayIntegration_UploadSnapshots&guest=1[snapshot upload] plan builds Groovy from sources and deploys the artifacts to the http://oss.jfrog.org/oss-snapshot-local/org/codehaus/groovy/[OSS Artifactory Snapshot Repository].
-** the http://ci.groovy-lang.org/viewType.html?buildTypeId=Groovy_BintrayIntegration_ReleasePlan&guest=1[release plan] allows a release manager to release a new version of Groovy directly from the CI server
-** the http://ci.groovy-lang.org/viewType.html?buildTypeId=Groovy_BintrayIntegration_GvmBroadcast[GVM broadcast] plan allows us to announce a new release of Groovy to http://gvmtool.net/[GVM] and its https://twitter.com/gvmtool[Twitter account] directly from the CI server
-** the http://ci.groovy-lang.org/viewType.html?buildTypeId=Groovy_BintrayIntegration_GvmMakeDefault[GVM default] plan allows us to notify GVM that a specific Groovy version is the new default version, directly from the CI server
-
-The last two GVM plans are separated because they need to be triggered manually, once we are ready to announce that a new Groovy version is out. Let's now describe what the release plan does, so that we can imagine what adaptations will be required to go the Apache Way.
-
-=== Release plan
-
-The release plan is at the core of the Groovy release process. It reduces human interactions to the bare minimal, dramatically reducing the potential errors. In particular:
-
-* builds are done using a verified JDK
-* the CI local Maven and Gradle repository caches are cleaned every day, making sure that the build is doable from source for any developer
-* release branches and tags are created automatically
-* properties files are updated automatically (sets the release version, then the next version to push on VCS)
-* binaries (sources, documentation, distribution, SDK) are uploaded to {bintray}
-* documentation is uploaded to the {groovy}[Groovy website] in a separate directory, so that each Groovy version has its own documentation readable online
-* all artifacts (binaries+maven) are signed through the {bintray} API
-* Maven artifacts are uploaded to https://bintray.com/bintray/jcenter[JCenter]
-* Maven Central synchronization is done through the {bintray} API
-* GVM gets notified that a new version is available
-
-To do this, the only requirement is to fill in a form and click a button. From that, everything is automated. So when the Groovy team decides that a new release can be done, after clicking the button, the release is available online in general less than 2 hours later. This has to be compared to the previous, error prone process, which took up to 12 hours for a single release. Groovy has a tradition of maintaining multiple branches, so this time has to be multiplied by the number of active branches that we maintain, which are usually released the same day.
-
-With that regards, the decision whether to release a new version or not is done collectively, on the mailing list or in a Skype channel where the core developers agree about releases. But once the decision is made, there is almost no human process involved anymore.
-
-Last but not least, Groovy doesn't make any difference between the source distribution (the zip of the source tree) and binary artifacts (distribution, documentation, maven artifacts). All are considered part of the release, and signed accordingly. But there is a technical difference between Maven artifacts and what we call the distribution (sources, binaries, documentation, SDKs). The distribution is only available in {bintray}. It consists of zip files that the developer can download from the Groovy website. The Maven artifacts, on the other hand, are hosted in JCenter and Maven Central. 
-
-To be able to upload the distribution, the release process automatically creates a new version of Groovy on {bintray}. This version is some kind of folder which will host files for this specific Groovy version. When the files are uploaded, they are kept in *staging* for at most 48 hours. Currently, the release process automatically publishes the artifacts, so there's effectively no staging for Groovy.
-
-It is unclear whether such a staging phase exists for the Maven artifacts uploaded to JCenter (but it seems we can), but it is clear that the Maven Central synchronization that is doable through {bintray} uses a staging phase, because it directly communicates with the Nexus OSS repository. Maven Central synchronization staging repositories are directly closed by {bintray}.
-
-Releasing a new version of Groovy also implies updating the website. Technically it involves two manual steps:
-
-* connect to the server and update the _symlinks_ in _/var/www/docs/docs_ for _latest_ and _next_ versions of Groovy, so that the latest documentation link points to the just released version of Groovy
-* *then* update the _sitemap.groovy_ file in the Groovy Website repo to add the new version, commit, and push, leading to the generation of the website. In particular, the static website generator will fetch the release notes from JIRA and generate a pretty page using the website template, as well as generating some documentation pages from the whole documentation, again decorated with the website template. 
-
-Optionally, for major versions, release notes can be written in Asciidoctor format, and published through the website (see https://github.com/groovy/groovy-website/tree/master/site/src/site/releasenotes).
-
-Eventually, the joint builds on the CI server need to be updated so that they use the latest snapshot versions of Groovy. This is done by changing the `CI_GROOVY_VERSION` environment variable of each build configuration.
-
-== Adaptations required for Apache
-
-The following section is based on our understanding of the Apache Way of releasing. This section is going to be updated based on the feedback we have from our mentors or fellow Apache members.
-
-First of all, the main and only important artifact for Apache is the *sources of the project*. This is going to be very important for our adaptation of the process. This means that binaries, documentation, Maven artifacts and such are not considered equally, and are not mandatory to be able to release a version.
-
-A detailed guide of the release process *during incubation* can be found http://incubator.apache.org/guides/releasemanagement.html[here] but those are derived from the final release process. Below are the main points with comments about how far we are from there.
-
-* 1.1 Checksums and PGP signatures are valid.
-
-_There are no such checksums or multiple PGP signatures for Groovy, apart from those generated through {bintray}. It is implied here that signatures must be checked before the release is done, that is to say that we *require* a staging phase and the ability to perform *multiple signatures*. Signatures are those of committers._
-
-* 2.1 Build is successful including automated tests.
-
-_We're all clear on that. Groovy is tested before each release, and the CI server does much more in testing that a normal user can do. In particular, testing with multiple JDKs. The sources zip has been verified to build and test from sources without any issue._
-
-* 3.1 DISCLAIMER is correct, filenames include "incubating".
-
-_We need to add the *DISCLAIMER*. The "incubating" part is disturbing. In particular, Groovy is not a new project. It's been there for 12 years, and the last release before Apache will be 2.4.2. Does it mean that the next release will have to be named 2.4.3-incubating? It will be very disturbing for our users, and it sounds pretty bad, just as if Groovy wasn't production ready. Should we do this, then the incubation phase should be shortened as much as possible. Another option that we consider is what are exactly the deliverables. If the only deliverable is the source zip, because only sources matter (see 3.6), then we could potentially rename only the source zip to include incubating. The binaries, the properties file, etc, could stay with 2.4.3 (without incubating) because it doesn't seem to be mandatory that the *version number* includes incubating, only the filenames. And if we produce binaries that are not hosted at Apache, like we do now, they can follow their own pattern. This would imply that in Groovy, the only deliverable that would be done through Apache would be the source zip, and the *filename* could include incubating. All other artifacts would *not* belong to the release checklist._
-
-* 3.2 Top-level LICENSE and NOTICE are correct for each distribution.
-
-_We do have those files_.
-
-* 3.3 All source files have license headers where appropriate.
-
-_It has to be checked, but it should already be the case_
-
-* 3.4 The provenance of all source files is clear (ASF or software grants).
-
-_This is going to be done during the incubation phase._
-
-* 3.5 Dependencies licenses are ok as per http://apache.org/legal/
-
-_We will have to remove the only dependency which is now unused and not a standard OSS license: Simian._
-
-* 3.6 Release consists of source code only, no binaries. Each Apache release must contain a source package. This package may not contain compiled components (such as "jar" files) because compiled components are not open source, even if they were built from open source. 
-
-_The source zip does contain a binary *dependency*: openbeans, which is not available in a third party Maven repository. We are unsure if the rule applies to it or not._
- 
-It is also implied that we are going to change the group id from `org.codehaus.groovy` to `org.apache.groovy`. What it means for the release process (in particular synchronization with Maven Central through Bintray) are unclear.
-
-So it seems that the current process could be adapted if:
-
-* we only release the source zip on Apache, and only this item is voted
-* to do this we need to split the release process in at least 3 steps
-** building and deploying to a staging repository, including all artifacts. That staging period has to be extended to *at least* 72 hours, which is the minimal voting duration.
-** signing has to be done by individuals. This implies some way to download the full artifact list (there are more than 200 binary files in total !), sign them, and upload the signatures only.
-** publishing, which implies closing the Bintray staging repository, then synchronizing to Maven Central and publishing to GVM
-
-
diff --git a/site/src/site/wiki/incubation-release-process.adoc b/site/src/site/wiki/incubation-release-process.adoc
deleted file mode 100644
index a285e59..0000000
--- a/site/src/site/wiki/incubation-release-process.adoc
+++ /dev/null
@@ -1,263 +0,0 @@
-= Incubation release process
-Cédric Champeau <cchampeau@apache.org>
-v1.1, July 15, 2015: Update after concrete release
-
-:teamcity: http://ci.groovy-lang.org
-:groovy: http://groovy-lang.org
-:bintray: https://bintray.com/[Bintray]
-:gradle: http://gradle.org[Gradle]
-
-The goal of this document is to guide the release manager in order to perform a release under the Apache Incubator. This document, reflecting the status of incubation, is work in progress and will be adapted with regards to comments from the community, mentors and IPMC.
-
-== Initiating a release
-
-Releases can be initiated by a committer, as long as:
-
-* an email has been sent to the dev mailing list, where a committer volunteers for a release
-* there's a general agreement that a release can be done. There's still no explicit rule telling when a new Groovy version can be released, but the history of the project shows that releases are usually done when a significant amount of bugfixes have been done justifying a release, or that new major features are ready.
-* release manager has his personal setup ready. In particular:
-** release manager can log into his people.apache.org account using SSH
-** release manager has administration privileges on {teamcity}[the CI server]
-
-Releases are launched from the CI server. A release should never be done from a personal computer.
-
-== Preparing a release
-
-Releases are done from the CI server, but since it will involve creating tags, branches and several commits, and that the CI server doesn't have privileges to do it, we cannot work on the Apache Git origin. Instead, it is required that the release manager forks the repository and pushes changes to his personal fork. Given that `GROOVY_2_4_X` is the branch to release, `upstream` references Apache Git, and `origin` the release manager fork on GitHub, preparing for a release usually starts with:
-
-```
-git checkout GROOVY_2_4_X
-git pull --rebase upstream GROOVY_2_4_X
-git push origin GROOVY_GROOVY_2_4_X
-```
-
-If you haven't done it already, create a token on https://github.com/settings/tokens[your GitHub profile] so that the CI server can have write access on your fork. Keep the token safe!
-
-== Setup the TeamCity release configuration
-
-Go to the http://ci.groovy-lang.org/admin/editBuild.html?id=buildType:Groovy_BintrayIntegration_ReleasePlan[TeamCity release plan] configuration and open the VCS settings. If the VCS root attached to the configuration is not your GitHub fork, attach your VCS root, or create a new VCS root if you haven't done it already. The VCS root MUST have write access using the token authentication.
-
-
-== Trigger the release
-
-Go to the http://ci.groovy-lang.org/viewType.html?buildTypeId=Groovy_BintrayIntegration_ReleasePlan&tab=artifactory[Artifactory Release Management tab] and fill the form appropriately:
-
-* _groovyVersion_
-** _release version_ must be set to the version number of Groovy you are releasing. For example `2.4.4`.
-** _next integration version_ *must* be set to the subsequent version number of Groovy you are releasing and as it will be a development version, *must* end with `-SNAPSHOT`. For example `2.4.5-SNAPSHOT`.
-* _groovyBundleVersion_
-** _release version_ must be set to the OSGi bundle version number of Groovy you are releasing. For example `2.4.4`.
-** _next integration version_ *must* be set to the subsequent OSGi bundle version number of Groovy you are releasing and as it will be a development version, *must* end with `.SNAPSHOT`. For example `2.4.5.SNAPSHOT`.
-* _Checkout branch:_ must be set to the branch your are releasing. For example, if you are releasing a 2.4.x version of Groovy, `GROOVY_2_4_X`.
-* _Use release branch_ must be checked, and it will automate the creation of a release branch. Use a branch name in the form of `REL_BRANCH_2_4_3`
-* _Create VCS tag_ must be checked, and it will automate the creation of a release tag. Use a tag name in the form of `GROOVY_2_4_4`
-* _Tag comment_ must be set to something useful describing the release version
-* _Repository to stage the release to (Artifactory Pro):_ must be set to `oss-release-local`
-* _Staging comment_ should be set with something useful like `release of Groovy 2.4.4`
-
-Hit the release button.
-
-== Upload to Apache servers
-
-At this point, if the release build was successful, artifacts are staging on Bintray. You must log into Bintray and download the distribution artifacts. The URL for
-the staging distribution should be in the form of https://bintray.com/groovy/maven/groovy/2.4.4[https://bintray.com/groovy/maven/groovy/2.4.4].
-
-Downloads of the following files are only possible if you use the (groovy-operator,<api key>) credentials. If you don't have them please ask one of the PPMC members:
-
-* apache-groovy-src-_version_-incubating.zip
-* apache-groovy-binary-_version_.zip
-* apache-groovy-docs-_version_.zip
-* apache-groovy-sdk-_version_.zip
-
-as well as the corresponding _asc_ and _md5_ files. There should therefore be a total of _12_ files.
-
-NOTE: at this point it is possible that the MD5 files are missing, in which cases you would have to create them locally before uploading to Apache.
-```
-for f in `ls *.zip`; do md5sum $f > $f.md5; done
-```
-
-It is in general not accepted that the release is signed using the CI server key, so you *must* replace the signatures with your own. If you didn't yet,
-add your public key to the `KEYS` file, then sign each zip individually. This can be done, for each file, with a command line like:
-
-```
-gpg --armor --output apache-groovy-src-2.4.4-incubating.zip.asc --detach-sign apache-groovy-src-2.4.4-incubating.zip
-```
-
-Now you are ready to upload to the dev space on _dist.apache.org_. First of all, please make sure your local layout
-looks like this:
-
-```
-|-- KEYS
-|-- 2.4.4-incubating
-|     |
-|     -- distribution
-|     |  |-- apache-groovy-binary-2.4.4.zip
-|     |  |-- apache-groovy-binary-2.4.4.zip.asc
-|     |  |-- apache-groovy-binary-2.4.4.zip.md5
-|     |  |-- apache-groovy-docs-2.4.4.zip
-|     |  |-- apache-groovy-docs-2.4.4.zip.asc
-|     |  |-- apache-groovy-docs-2.4.4.zip.md5
-|     |  |-- apache-groovy-sdk-2.4.4.zip
-|     |  |-- apache-groovy-sdk-2.4.4.zip.asc
-|     |  `-- apache-groovy-sdk-2.4.4.zip.md5
-|     |-- sources
-         |-- apache-groovy-src-2.4.4-incubating.zip
-         |-- apache-groovy-src-2.4.4-incubating.zip.asc
-         `-- apache-groovy-src-2.4.4-incubating.zip.md5
-```
-
-Then you need to perform the upload:
-
-```
-svn https://dist.apache.org/repos/dist/dev/incubator/groovy groovy-release
-cd groovy-release
-cp -r ../path/to/local/groovy/<version> .
-svn add <version>
-svn ci <version>
-```
-
-== Push the tag and new HEAD
-
-```
-git fetch origin --tags
-git push upstream GROOVY_2_4_4
-git push upstream GROOVY_2_4_X
-```
-
-== Send a [VOTE] thread
-
-You can use the following template to send a VOTE thread on the dev@ list:
-
-```
-Dear community,
-
-I am happy to start the VOTE thread for a Groovy xxx-incubating!
-This release includes bugfixes for ...
-
-The changelog for this release can be found here: https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12318123&version=12331941
-
-Tag: https://git1-us-west.apache.org/repos/asf?p=groovy.git;a=tag;h=19f70958f39f0cc5c6b4d3e9471fd297400647d2
-
-The artifacts to be voted on are located here: https://dist.apache.org/repos/dist/dev/incubator/groovy/
-
-Release artifacts are signed with the following key: https://dist.apache.org/repos/dist/dev/incubator/groovy/KEYS
-
-Please vote on releasing this package as Apache Groovy 2.4.4-incubating.
-
-The vote is open for the next 72 hours and passes if a majority of at least three +1 PPMC votes are cast.
-
-[ ] +1 Release Apache Groovy 2.4.4-incubating
-[ ]  0 I don't have a strong opinion about this, but I assume it's ok
-[ ] -1 Do not release Apache Groovy 2.4.4-incubating because...
-
-Here is my vote:
-
-+1 (binding)
-```
-
-After 72h, send another email summarizing the result of the vote. If it passed, you *must* send another vote to
-`general@incubator.apache.org` to ask the IPMC to vote:
-
-```
-Hi all!
-
-The Apache Groovy PPMC has successfully voted the release of Apache Groovy 2.4.4-incubating [1], with 6 "+1" binding votes, one "+1" non binding, no "0" votes and one "-1" vote (see the explanation below). We are now asking the IPMC to vote it too. Since it is our first release under the Apache Software Foundation umbrella, let me give a few more details:
-
-<decription of the release>
-
-Vote on dev list: http://mail-archives.apache.org/mod_mbox/groovy-dev/201507.mbox/%3CCADQzvm%3DzDNCxpOua3LQ1ZNo62Aq40QZM7SJwgER5MfkArWrTeA%40mail.gmail.com%3E
-Result of vote on dev list: http://mail-archives.apache.org/mod_mbox/groovy-dev/201507.mbox/%3CCADQzvmn1yEMMz_ZaCL5QqqUtQJdgd0NNcy8v7BVY8Lt4Uog0Zg%40mail.gmail.com%3E
-Relicensing of the documentation tracking: https://issues.apache.org/jira/browse/GROOVY-7470
-Vote for relicensing the docs: http://mail-archives.apache.org/mod_mbox/groovy-dev/201506.mbox/%3CCADQzvm%3DMfajQuMxoZJmpLe%2B4W22a_MDY_dC4W%2BNMWiakEEOyNg%40mail.gmail.com%3E
-Result of vote for relicensing the docs: http://mail-archives.apache.org/mod_mbox/groovy-dev/201506.mbox/%3CCADQzvmkQyOEk3ofOrnTHfnvTKO5xECY87hKAGf5pD%2BuePyA8UA%40mail.gmail.com%3E
-
-The changelog for this release can be found here: https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12318123&version=12331941
-
-Tag for the release: https://git1-us-west.apache.org/repos/asf?p=groovy.git;a=commit;h=716b0b1bd56eeab04e4441eecc91c2cd8bfda8b6
-<https://git1-us-west.apache.org/repos/asf?p=groovy.git;a=tag;h=19f70958f39f0cc5c6b4d3e9471fd297400647d2>
-
-The artifacts to be voted on are located here: https://dist.apache.org/repos/dist/dev/incubator/groovy/
-
-Release artifacts are signed with the following keys: https://dist.apache.org/repos/dist/dev/incubator/groovy/KEYS
-
-Vote is open for at least 72 hours. Artifacts will be moved to dist as soon as the vote passes.
-
-[ ] +1, release Apache Groovy 2.4.4-incubating
-[ ] 0, I don't care
-[ ] -1, because...
-```
-
-If the vote passes:
-
-== Publish the release
-
-* Open `https://bintray.com/groovy/maven/groovy/2.4.4` and click `Publish` on the notice message (something like `ou have 532 unpublished item(s) for this version (expiring in 21 hours)`)
-* Perform Maven Central synchronization: on https://bintray.com/groovy/maven/groovy/2.4.4/view?sort=&order=#central[this page (update the link to the appropriate version)], click 'sync'. This step may take several minutes to complete.
-* Update the documentation symlinks on the website. You need credentials on the server:
-```
-cd /var/www/docs/docs
-rm -f latest
-ln -s groovy-2.4.4 latest
-```
-* Publish to GVM. Open http://ci.groovy-lang.org/viewType.html?buildTypeId=Groovy_BintrayIntegration_GvmPublish[the publish configuration], click on the 3 dots near `run` then on the _parameters_ tab, fill
-in the `groovyVersion` parameter. Click on `run build`.
-* if the release is NOT a beta or a release candidate, make it the default version on GVM. Open http://ci.groovy-lang.org/viewType.html?buildTypeId=Groovy_BintrayIntegration_GvmMakeDefault[the GVM make default configuration], click on the 3 dots near `run` then on the _parameters_ tab, fill
-in the `groovyVersion` parameter. Click on `run build`.
-
-== Update the web site
-
-If you don't have it locally, checkout `https://github.com/groovy/groovy-website`.
-
-* Update the https://github.com/melix/groovy-website/blob/master/site/src/site/sitemap.groovy[site map] to include the newly released version.
-* Push the changes
-* Wait for the http://ci.groovy-lang.org/viewType.html?buildTypeId=Groovy_Website[CI website deployment build] to complete.
-
-== Send an announcement email
-
-You should wait 24h before doing this (in order for `dist.apache.org` to be properly mirrored).
-Send an email to `dev@`, `user@` and `announce@apache.org`.
-
-You can use this template. Please make sure that the email at least contains the DISCLAIMER:
-
-```
-Dear community,
-
-We are pleased to announce the first release of Apache Groovy done under the Apache Software Foundation
-Incubator sponsorship! Apache Groovy is a multi-facet programming language for the JVM. Details can be
-found at http://groovy-lang.org
-
-This release is a maintenance release of the 2.4.x branch, but contains critical fixes, in particular a fix
-for a 0-day vulnerability. Details can be found on http://groovy-lang.org/security.html
-
-It is strongly encouraged that all users upgrade to this version. There is no plan to provide patches for
-older versions of Groovy which were not developped under the Foundation umbrella.
-
-Changelog for this version can be found at: http://groovy-lang.org/changelogs/changelog-2.4.4.html
-Sources can be downloaded from: http://www.groovy-lang.org/download.html
-Convenience binaries, SDK and documentation can be found at: http://www.groovy-lang.org/download.html
-
-We would like to thank all people who contributed to this release. In particular, thanks to our mentors who are
-having hard days at explaining the Apache Way :) Despite comments we received about this release, we felt that
-the security issue is so important that we deserved this to our community.
-
-Best regards,
-
-----
-DISCLAIMER
-
-Apache Groovy is an effort undergoing incubation at the Apache
-Software Foundation (ASF), sponsored by the Apache Incubator PMC.
-
-Incubation is required of all newly accepted projects until a further
-review indicates that the infrastructure, communications, and decision
-making process have stabilized in a manner consistent with other
-successful ASF projects.
-
-While incubation status is not necessarily a reflection of the
-completeness or stability of the code, it does indicate that the
-project has yet to be fully endorsed by the ASF.
-
-```
-
-* Broadcast the release on GVM. Open http://ci.groovy-lang.org/viewType.html?buildTypeId=Groovy_BintrayIntegration_GvmBroadcast[the GVM broadcast configuration], click on the 3 dots near `run` then on the _parameters_ tab, fill
-in the `groovyVersion` parameter. Click on `run build`.
diff --git a/versioning.html b/versioning.html
new file mode 100644
index 0000000..e2d45d1
--- /dev/null
+++ b/versioning.html
@@ -0,0 +1,102 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><title>The Apache Groovy programming language - Versioning</title><link href='img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='css/style.css'/>
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: 20px; right: -58px; border: 0; z-index: 100; transform: rotate(45deg);' src='/img/horizontal-github-ribbon.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/groovy-weekly.html' class='icon'><span class='fa fa-envelope-o'></span> Groovy newsletter</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+                <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span>
+                                    </button><a class='navbar-brand' href='index.html'>
+                                        <i class='fa fa-star'></i> Apache Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li class='active'><a href='/download.html'>Download</a></li><li class=''><a href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='/'>Contribute</a></li><li class=''><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li>
+                                            <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='download.html'>Download Groovy</a></li><li><a href='download.html#distro' class='anchor-link'>Distributions</a></li><li><a href='download.html#sdkman' class='anchor-link'>Through SDKMAN!</a></li><li><a href='download.html#buildtools' class='anchor-link'>From your build tools</a></li><li><a href='download.html#otherways' class='anchor-link'>Other ways to get Groovy</a></li><li class='active'><a href='versioning.html'><strong>Groovy version scheme</strong></a></li><li><a href='indy.html'>Invoke dynamic support</a></li></ul></div><div class='col-lg-8 col-lg-pull-0'><div id='contribute-btn'>
+                                            <button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/groovy-website/tree/asf-site/site/src/site/pages/versioning.groovy"'>
+                                                <i class='fa fa-pencil-square-o'></i> Improve this doc
+                                            </button>
+                                        </div><h1><i class='fa fa-copy'></i> Groovy version scheme</h1><article><h2>Since Groovy 2.0.0</h2><p>Since Groovy 2.0.0 we follow the <a href='http://semver.org/'>semantic version scheme</a>. This means the next minor version after 2.0.0 is 2.1.0, the first bugfix version after 2.0 is 2.0.1 and the next major version will be 3.0.0.</p><h2>Before Groovy 2.0.0</h2><p>Before Groovy 2.0.0 we followed a version scheme where we had X.Y.Z, where X.Y was the major version, and Z the minor version.
+Bugfix versions were not really done, you had to upgrade to the next minor version for that.
+Since Groovy 1.0 we incremented only the Y for a new major version.
+The increment of X we wanted to leave for a very big breaking change, like a new Meta-Object Protocol.
+The last major version in these scheme is 1.8(.0), 1.8.1 is the first minor and bugfix version.
+The major versions in the past using this scheme are: 1.8, 1.7, 1.6, 1.5, 1.0. Each of them having around 10 minor/bugfix versions.</p><h2>Official Major Version</h2><p>The official major version is the current major version that should/can be used by the developers if they are not bound to a specific major version.</p><h2>Maintenance Release Branch</h2><p>Here we indicate a former major version's bugfix release.</p><h2>How long is a major version maintained?</h2><p>That depends on the users. Let's say we have X in maintenance and Y is the official major version, then if a new major version Z is released, Y goes into maintenance. Usually we make one or two more bugfix releases for X and then we discontinue it, unless there are strong requests to have certain things fixed for users that can absolutely not upgrade.</p></article><hr class='divider'/></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='/download.html'>Download</a></li><li><a href='http://groovy-lang.org/support.html'>Support</a></li><li><a href='/'>Contribute</a></li><li><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='http://groovy-lang.org/security.html'>Security</a></li><li><a href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='http://groovy-lang.org/search.html'>Search</a></li>
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a href='http://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='http://groovy-lang.org/groovy-weekly.html'>Groovy newsletter</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='http://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li>
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community
+                                        </p><img src='img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' class='img-responsive'/>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2019 the Apache Groovy project &mdash; Groovy is Open Source, <a href='http://www.apache.org/licenses/LICENSE-2.0.html'>Apache 2 License</a></div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='js/vendor/jquery-1.10.2.min.js' defer></script><script src='js/vendor/classie.js' defer></script><script src='js/vendor/bootstrap.js' defer></script><script src='js/vendor/sidebarEffects.js' defer></script><script src='js/vendor/modernizr-2.6.2.min.js' defer></script><script src='js/plugins.js' defer></script><script>
+          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file
diff --git a/wiki/GEP-1.html b/wiki/GEP-1.html
new file mode 100644
index 0000000..7613324
--- /dev/null
+++ b/wiki/GEP-1.html
@@ -0,0 +1,368 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><title>The Apache Groovy programming language - Developer docs - GEP-1</title><link href='..\img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='..\css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='..\css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='..\css/style.css'/><link rel='stylesheet' type='text/css' href='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.css'/>
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: 20px; right: -58px; border: 0; z-index: 100; transform: rotate(45deg);' src='/img/horizontal-github-ribbon.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/groovy-weekly.html' class='icon'><span class='fa fa-envelope-o'></span> Groovy newsletter</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+                <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span>
+                                    </button><a class='navbar-brand' href='..\index.html'>
+                                        <i class='fa fa-star'></i> Apache Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li class=''><a href='..\/download.html'>Download</a></li><li class=''><a href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='..\/'>Contribute</a></li><li class=''><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li>
+                                            <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='..\search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li class='active'><a href='#doc'>GEP-1</a></li><li><a href='#_abstract_what_is_a_gep' class='anchor-link'>Abstract: What is a GEP?</a></li><li><a href='#_rationale_why_a_gep' class='anchor-link'>Rationale: Why a GEP?</a></li><li><a href='#_whats_in_a_gep' class='anchor-link'>What&#8217;s in a GEP?</a></li><li><a href='#_the_general_workflow' class='anchor-link'>The general workflow</a></li><li><a href='#_references' class='anchor-link'>References</a></li><li><a href='#_update_history' class='anchor-link'>Update history</a></li></ul></div><div class='col-lg-8 col-lg-pull-0'><a name='doc'></a><h1>GEP-1</h1><p>Author: <i/></p><hr/><div id="preamble">
+<div class="sectionbody">
+<div class="sidebarblock">
+<div class="content">
+<div class="title">Metadata</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+<strong>Number</strong>
+</td>
+<td class="hdlist2">
+<p>GEP-1</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Title</strong>
+</td>
+<td class="hdlist2">
+<p>Groovy Enhancement Proposal</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Version</strong>
+</td>
+<td class="hdlist2">
+<p>2.0</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Type</strong>
+</td>
+<td class="hdlist2">
+<p>Informational</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Status</strong>
+</td>
+<td class="hdlist2">
+<p>Final</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Leader</strong>
+</td>
+<td class="hdlist2">
+<p>Apache Project Leader</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Created</strong>
+</td>
+<td class="hdlist2">
+<p>2009-03-26</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Last modification</strong>&#160;
+</td>
+<td class="hdlist2">
+<p>2018-10-11</p>
+</td>
+</tr>
+</table>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_abstract_what_is_a_gep">Abstract: What is a GEP?</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>GEP stands for Groovy Enhancement Proposal. A GEP is a document providing information to the Groovy development team and
+user community describing a new feature, an enhancement, or a change to Groovy, the language, its APIs, its integration,
+or its infrastructure. Whenever such an addition or change is significant and deserves a detailed discussion on its
+rationale, its design, or its impact on the project, the writing of a GEP should be considered.</p>
+</div>
+<div class="paragraph">
+<p>The concept of the GEP was freely inspired from Python&#8217;s <a href="http://www.python.org/dev/peps/pep-0001/">PEP</a> (Python Enhancement Proposal).</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_rationale_why_a_gep">Rationale: Why a GEP?</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>For non-trivial, complex or strategic features, discussions on mailing-lists are difficult to lead and follow, and often
+don&#8217;t help reach a consensus. Writing a proper document explaining the design and implications of said feature allows both
+the originator of the idea and the community at large to have a chance to provide interesting and useful feedback and
+helps better understanding the rationale, the design decisions, the impact of the proposal.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_whats_in_a_gep">What&#8217;s in a GEP?</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>A GEP:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>is led by a "Leader" who is responsible for the writing and progress of the proposal</p>
+</li>
+<li>
+<p>is assigned a unique "Number"</p>
+</li>
+<li>
+<p>has a "Title" describing succinctly its intent</p>
+</li>
+<li>
+<p>has a "Type"</p>
+</li>
+<li>
+<p>has a "Status" giving information on its progress</p>
+</li>
+<li>
+<p>has a "Version" number indicating its current revision</p>
+</li>
+<li>
+<p>gives a "Last modification" date</p>
+</li>
+<li>
+<p>gives a "Creation" date</p>
+</li>
+<li>
+<p>features an "Abstract" explaining the intent of the GEP</p>
+</li>
+<li>
+<p>gives a "Rationale" for this enhancement</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The type of a GEP can be of the following:</p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1">Informational</dt>
+<dd>
+<p>if the GEP provides some information or guidance on a topic related to Groovy (this GEP is of such type, as well as the list of all existing GEPs)</p>
+</dd>
+<dt class="hdlist1">Feature</dt>
+<dd>
+<p>if the GEP is about the implementation of a new feature, enhancement or a change in Groovy</p>
+</dd>
+<dt class="hdlist1">Process</dt>
+<dd>
+<p>if the GEP describes a process related to the Groovy project (examples: the Groovy release process, how to enroll new committers, etc.)</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p>If the GEP is a Feature GEP, it should also:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>define a "Target" Groovy version for its integration</p>
+</li>
+<li>
+<p>provide a "Reference implementation" properly covered by unit tests and commented (Groovydoc/JavaDoc/asciidoc as appropriate) so that the Groovy community can play with the enhancement and provide useful feedback</p>
+</li>
+<li>
+<p>detail the "Impact" on Groovy, especially in terms of backward-compatibility or impact on other projects</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The "Status" of a GEP can be:</p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1">Draft</dt>
+<dd>
+<p>when a GEP is currently in the writing and is in discussion but hasn&#8217;t yet reached a state ready for inclusion in Groovy</p>
+</dd>
+<dt class="hdlist1">Accepted</dt>
+<dd>
+<p>when the draft GEP, as is, is in a state which doesn&#8217;t mandate any additional modification, is ready to be
+integrated into Groovy and has been accepted by the development team, following the usual Apache principles</p>
+</dd>
+<dt class="hdlist1">Rejected</dt>
+<dd>
+<p>when consensus emerges or a development team decision has been made that deems the proposal should not be integrated into Groovy</p>
+</dd>
+<dt class="hdlist1">Final</dt>
+<dd>
+<p>when the GEP has been integrated into a released version of Groovy and has been properly documented in the Groovy wiki</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p>Beyond all these metadata, as appropriate, a GEP should also:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>give pointers to existing mailing-list discussions (through Nabble, Markmail or Ponymail)</p>
+</li>
+<li>
+<p>list existing papers or documentations related to this feature that provides additional material for understanding the concepts or implementation difficulties</p>
+</li>
+<li>
+<p>provide samples showing how the feature should be used and how idiomatic Groovy the solution is</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_the_general_workflow">The general workflow</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The general workflow of a Groovy Enhancement Proposal is as follows:</p>
+</div>
+<div class="paragraph">
+<p>The inception of a GEP generally stems from a discussion on the Groovy mailing-lists about a new feature or change
+when the Groovy Despot and the development team deem necessary to properly document and articulate this new idea,
+for further discussion and analysis. Generally, simple bug fixes and minor enhancements don&#8217;t require a full-blown GEP.
+A GEP is started solely with the agreement of the Groovy PMC.</p>
+</div>
+<div class="paragraph">
+<p>A unique Number is assigned by the Groovy PMC and a meaningful "Title" is created for this GEP.
+A proposed Target Groovy version is proposed for the inclusion of this GEP if appropriate.
+A Leader for this effort (usually the instigator of the GEP or the lead developer of it) takes care of the
+creation of the GEP, of writing a detailed document proposing this enhancement, and eventually of providing
+a reference implementation as a branch (or PR or patch) for the targeted Groovy version.
+Once the development team and the "Leader" are happy with the status of the GEP, a decision should be made to act the
+integration of this GEP into Groovy and a JIRA issue for this task should be created. As per Apache guidelines,
+the Groovy PMC has the last say on the acceptation of the GEP as a Final status GEP.</p>
+</div>
+<div class="paragraph">
+<p>The integration of the GEP in Groovy is Final once proper documentation is added to the appropriate Groovy repo and
+that the reference implementation has reached maturity and provides a good test suite covering the feature.
+If the GEP doesn&#8217;t fulfill all the requirements of the GEP process, the GEP can be rejected or deferred.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_references">References</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_jira_issues">JIRA issues:</h3>
+<div class="paragraph">
+<p><a href="https://issues.apache.org/jira/browse/GROOVY-1709">GROOVY-1709</a>: GEP: Groovy Enhancement Proposal</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_update_history">Update history</h2>
+<div class="sectionbody">
+<div class="dlist">
+<dl>
+<dt class="hdlist1">1.0 (2009-03-26)</dt>
+<dd>
+<p>Version as extracted from Codehaus wiki</p>
+</dd>
+<dt class="hdlist1">2.0 (2018-10-11)</dt>
+<dd>
+<p>Update to reflect changes since joining Apache</p>
+</dd>
+</dl>
+</div>
+</div>
+</div></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='..\/download.html'>Download</a></li><li><a href='http://groovy-lang.org/support.html'>Support</a></li><li><a href='..\/'>Contribute</a></li><li><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='http://groovy-lang.org/security.html'>Security</a></li><li><a href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='http://groovy-lang.org/search.html'>Search</a></li>
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a href='http://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='http://groovy-lang.org/groovy-weekly.html'>Groovy newsletter</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='http://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li>
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community
+                                        </p><img src='..\img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' class='img-responsive'/>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2019 the Apache Groovy project &mdash; Groovy is Open Source, <a href='http://www.apache.org/licenses/LICENSE-2.0.html'>Apache 2 License</a></div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='..\js/vendor/jquery-1.10.2.min.js' defer></script><script src='..\js/vendor/classie.js' defer></script><script src='..\js/vendor/bootstrap.js' defer></script><script src='..\js/vendor/sidebarEffects.js' defer></script><script src='..\js/vendor/modernizr-2.6.2.min.js' defer></script><script src='..\js/plugins.js' defer></script><script src='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js'></script><script>document.addEventListener('DOMContentLoaded',prettyPrint)</script><script>
+          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file
diff --git a/wiki/GEP-10.html b/wiki/GEP-10.html
new file mode 100644
index 0000000..4b78f86
--- /dev/null
+++ b/wiki/GEP-10.html
@@ -0,0 +1,527 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><title>The Apache Groovy programming language - Developer docs - GEP-10</title><link href='..\img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='..\css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='..\css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='..\css/style.css'/><link rel='stylesheet' type='text/css' href='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.css'/>
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: 20px; right: -58px; border: 0; z-index: 100; transform: rotate(45deg);' src='/img/horizontal-github-ribbon.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/groovy-weekly.html' class='icon'><span class='fa fa-envelope-o'></span> Groovy newsletter</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+                <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span>
+                                    </button><a class='navbar-brand' href='..\index.html'>
+                                        <i class='fa fa-star'></i> Apache Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li class=''><a href='..\/download.html'>Download</a></li><li class=''><a href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='..\/'>Contribute</a></li><li class=''><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li>
+                                            <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='..\search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li class='active'><a href='#doc'>GEP-10</a></li><li><a href='#_abstract_static_compilation' class='anchor-link'>Abstract: Static compilation</a></li><li><a href='#_references_and_useful_links' class='anchor-link'>References and useful links</a></li><li><a href='#_update_history' class='anchor-link'>Update history</a></li></ul></div><div class='col-lg-8 col-lg-pull-0'><a name='doc'></a><h1>GEP-10</h1><p>Author: <i/></p><hr/><div id="preamble">
+<div class="sectionbody">
+<div class="sidebarblock">
+<div class="content">
+<div class="title">Metadata</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+<strong>Number</strong>
+</td>
+<td class="hdlist2">
+<p>GEP-10</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Title</strong>
+</td>
+<td class="hdlist2">
+<p>Static compilation</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Version</strong>
+</td>
+<td class="hdlist2">
+<p>4</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Type</strong>
+</td>
+<td class="hdlist2">
+<p>Feature</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Status</strong>
+</td>
+<td class="hdlist2">
+<p>Final</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Comment</strong>
+</td>
+<td class="hdlist2">
+<p>Delivered in Groovy 2.0 and enhanced in later versions</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Leader</strong>
+</td>
+<td class="hdlist2">
+<p>Cédric Champeau</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Created</strong>
+</td>
+<td class="hdlist2">
+<p>2011-11-23</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Last modification</strong>&#160;
+</td>
+<td class="hdlist2">
+<p>2018-10-26</p>
+</td>
+</tr>
+</table>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_abstract_static_compilation">Abstract: Static compilation</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>This GEP introduces an experimental new feature in the language known as static compilation.
+Static compilation can be used when the dynamic features of Groovy are not necessary and that the
+performance of the dynamic runtime is too low. The reader must understand that :</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>we do not plan to change the semantics of regular Groovy</p>
+</li>
+<li>
+<p>we want static compilation to be triggered explicitly</p>
+</li>
+<li>
+<p>we want the semantics of static groovy to be as close as possible as the semantics of dynamic Groovy</p>
+</li>
+</ul>
+</div>
+<div class="sect2">
+<h3 id="_rationale_static_type_checking_vs_static_compilation">Rationale: Static Type Checking vs Static compilation</h3>
+<div class="paragraph">
+<p>Static compilation heavily relies on another feature called Static type checking but it is important to understand
+that they are separate steps. You can statically type check your code, and still have the dynamic runtime at work.
+Static type checking adds type inference to the compilation process. This means that, for example, type arguments
+of method calls are inferred, as well as return types of closures or methods. Those inferred types are used by the
+checker to verify the type flow of your program. When it does so, once must be aware that the static checker cannot
+behave like dynamic Groovy. This means that even if a program passes static type checking, it may behave differently at runtime.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_method_selection">Method selection</h3>
+<div class="sect3">
+<h4 id="_method_selection_in_dynamic_groovy">Method selection in dynamic Groovy</h4>
+<div class="paragraph">
+<p>Groovy supports multimethods. Especially, in dynamic Groovy, target methods are chosen at runtime,
+in opposite to Java which chooses target method at compile time. Let&#8217;s illustrate the difference with an example :</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>public void foo(String arg) { System.out.println("String"); }
+public void foo(Object o) { System.out.println("Object"); }
+
+Object o = "The type of o at runtime is String";
+foo(o);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In Java, this code will output "Object", because the target method is chosen according to the type of the arguments at compile time.
+The declared type of "o" is Object, so the Object version of the method is chosen. If you want to call the String version,
+you have to define "o" as a "String", or cast o to string in the method call arguments. Now the same example in dynamic Groovy :</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>void foo(String arg) { println 'String' }
+void foo(Object o) { println 'Object' }
+
+def o = 'The type of o at runtime is String'
+foo(o)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If you run this snippet, you will see that Groovy prints "String". The reason is that Groovy resolves type arguments at
+runtime and chooses the most specialized version of a method signature when multiple versions are possible.
+To deal with multiple arguments, Groovy computes a distance between the actual type arguments and the declared
+argument types of a method. The method with the best score is chosen.</p>
+</div>
+<div class="paragraph">
+<p>The method selection process is complex, and makes Groovy quite powerful. It is also possible, for example,
+to define metaclasses which will choose different methods, or change the return type of a method dynamically.
+This behaviour is responsible for a large part of the poor performance of Groovy invocation times as compared to Java.
+However, performance has greatly improved with the introduction of call site caching in Groovy.
+Even with those optimizations, Groovy is far for the performance of a pure static language.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_invokedynamic">InvokeDynamic</h4>
+<div class="paragraph">
+<p>InvokeDynamic support is under development and should be introduced in the upcoming Groovy 2.0.
+What InvokeDynamic allows us to do is to, basically, replace call site caching with a native "dynamic method dispatch"
+system directly implemented by the JVM. It is still uncertain what performance improvement we will reach.
+At best, we could be close to the performance of a statically typed language.
+However, as some features are still difficult to implement with InvokeDynamic,
+most likely the performance gain will not be so high. It is important to talk about it though, because :</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>invokedynamic allows JIT optimizations</p>
+</li>
+<li>
+<p>replaces the current dynamic method dispatch without changing the semantics of the language</p>
+</li>
+<li>
+<p>if performance is good, could make static compilation unnecessary</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>However, InvokeDynamic has a major drawback : it will only be available for people using a Java 7+ JVM.
+If we want to deliver Java-like performance for Groovy programs to our users, can we afford leaving
+most of them without such? Most probably, Java 7 won&#8217;t be mainstream before two or three years.</p>
+</div>
+<div class="paragraph">
+<p>Rémi Forax, however, created a backport of invokedynamic for older versions of the JVM.
+Such a backport relies on bytecode transformation to replace invokedynamic instructions with "emulated instructions".
+This "emulated" mode is great for us Groovy developers, because it would allow us to write code once and run it on
+any JVM, but for users, the performance would most probably be bad. To be sure of that, an experiment with backported
+InDy will be made once invokedynamic support is implemented in Groovy core. The most probable situation,
+though, is that performance of such code will remain far from what a static language could provide.</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_static_groovy">Static Groovy</h3>
+<div class="sect3">
+<h4 id="_type_inference_based_dispatch">Type inference based dispatch</h4>
+<div class="paragraph">
+<p>This GEP is there to experiment a static compilation mode in Groovy. With what we have explained before,
+you should already understand that statically typed code implies a different behaviour from dynamic code.
+If you expect the statically checked and statically compiled code to behave exactly like dynamic Groovy,
+you should already stop there, or wait for invoke dynamic support to expect improved performance.
+If you perfectly understand that statically compiled code means different semantics,
+then you can continue reading this GEP, and help us choose the best implementation path.
+In fact, there are several options that we will explain here.</p>
+</div>
+<div class="paragraph">
+<p>The current implementation relies on the static type checker, which performs type inference.
+This means that with the previous example :</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>void foo(String arg) { println 'String' }
+void foo(Object o) { println 'Object' }
+
+def o = 'The type of o at runtime is String'
+foo(o)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The compiler is able to infer that when the foo method is called, the actual type argument will be a string.
+If we compile it statically, the behaviour of this statically compiled program at runtime will be the same as dynamic Groovy.
+With such an implementation, we expect most programs to behave statically like they would in dynamic Groovy.
+However, this will never be always true. This is why we say this behaviour is "as close as possible" as the one of dynamic Groovy.</p>
+</div>
+<div class="paragraph">
+<p>The drawback of this implementation is that the developer cannot easily know what method the compiler chooses.
+For example, let&#8217;s take this example, extracted from a discussion on the mailing list:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>void foo(String msg) { println msg }
+void foo(Object msg) { println 'Object' }
+
+def doIt = {x -&gt;
+  Object o = x
+  foo(o)
+}
+
+def getXXX() { "return String" }
+
+def o2=getXXX()
+doIt o2   // "String method" or "Object method"????</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The static type checker infers the type of o2 from the return type of getXXX, so knows that doIt is called with a String,
+so you could suspect the program to choose the foo(String) method. However, doIt is a closure, which can therefore
+be reused in many places, and the type of its "x" argument is unknown. The type checker will not generate distinct
+closure classes for the different call sites where it is used. This means that when you are in the closure,
+the type of 'x' is the one declared in the closure arguments. This means that without type information on 'x',
+x is supposed an Object, and the foo method which will be statically chosen will be the one with the Object argument.</p>
+</div>
+<div class="paragraph">
+<p>While this can be surprising, this is not really difficult to understand. To behave correctly,
+you must either add explicit type arguments to the closure, which is always preferred.
+In a word, in a statically checked world, it is preferred to limit the places where types will be inferred so
+that code is understood properly. Even if you don&#8217;t do it, fixing code is easy, so we think this is not a major issue.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_java_like_method_dispatch">Java-like method dispatch</h4>
+<div class="paragraph">
+<p>The alternative implementation is not to rely on inferred types, but rather behave exactly like Java does.
+The main advantage of this is that the user doesn&#8217;t have 3 distinct method dispatch modes to understand,
+like in the previous solution (Java, dynamic Groovy, inferred static Groovy).
+The major drawback is that the semantics of static Groovy are not close to the ones of dynamic Groovy.
+For this reason, this is not the preferred experimental implementation. If you think this version should be preferred,
+do not hesitate to send an email to the mailing list so that we can discuss.
+You can even fork the current implementation to provide your own.</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_testing">Testing</h3>
+<div class="paragraph">
+<p>Static compilation is now part of the Groovy 2.0.0 release. You can download the latest Groovy 2 releases and test it.</p>
+</div>
+<div class="sect3">
+<h4 id="_compilestatic">@CompileStatic</h4>
+<div class="paragraph">
+<p>You can try the following snippet :</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>@groovy.transform.CompileStatic
+int fib(int i) {
+    i &lt; 2 ? 1 : fib(i - 2) + fib(i - 1)
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This code should already run as fast as Java.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_the_arrow_operator_for_direct_method_calls">The "arrow" operator for direct method calls</h4>
+<div class="paragraph">
+<p>Some users have suggested another idea, related to static compilation, which is the "arrow operator".
+Basically, the idea is to introduce another way of calling methods in Groovy :</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>obj.method() // dynamic dispatch
+obj-&gt;method() // static dispatch</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>While this idea sounds interesting, especially when you want to mix dynamic and static code in a single method,
+we think it has many drawbacks. First, it introduces a grammar change, something we would like to avoid as much as possible.
+Second, the idea behind this operator is to perform direct method calls when you <strong>know</strong> the type of an object.
+But, without type inference, you have two problems :</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>even if the type of 'obj' is specified, you cannot be sure that at runtime, the type will be the same</p>
+</li>
+<li>
+<p>you still have to infer the argument types too, which leaves us with the same problem as before: relying on type inference,
+or relying on Java-like behaviour where the method is chosen based on the declared types.
+If we do so, then we would introduce possible incompatibility with the static mode&#8230;&#8203;
+So we would have to choose between this mode and the full static compilation mode.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Imagine the following code :</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>void write(PrintWriter out) {
+   out-&gt;write('Hello')
+   out-&gt;write(template())
+}
+
+def template() { new MarkupBuilder().html { p('Hello') } }</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>While the first call can be resolved easily, this is not the same with the second one.
+You would have to rewrite your code probably this way to have this work :</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>void write(PrintWriter out) {
+   out-&gt;println('Hello')
+   String content = template() // dynamic call, implicit coercion to string
+   out-&gt;println(content) // static method dispatch based on declared types only
+}
+
+def template() { new MarkupBuilder().html { p('Hello') } }</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Which is not necessary if you use the @CompileStatic annotation :</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>@CompileStatic
+void write(PrintWriter out) {
+   out.println('Hello')
+   out.println(template())
+}
+
+def template() { new MarkupBuilder().html { p('Hello') } }</code></pre>
+</div>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_references_and_useful_links">References and useful links</h2>
+<div class="sectionbody">
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://web.archive.org/web/20150508040816/http://docs.codehaus.org/display/GroovyJSR/GEP+10+-+Static+compilation">GEP-10: Static compilation</a> (web archive link)</p>
+</li>
+<li>
+<p><a href="http://blackdragsview.blogspot.com/2011/10/flow-sensitive-typing.html">Flow Sensitive Typing?</a></p>
+</li>
+<li>
+<p><a href="https://web.archive.org/web/20150508040745/http://www.jroller.com/melix/entry/groovy_static_type_checker_status">Groovy static type checker: status update</a> (web archive)</p>
+</li>
+</ul>
+</div>
+<div class="sect2">
+<h3 id="_mailing_list_discussions">Mailing-list discussions</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://markmail.org/thread/a4qhxtjzu3wsw6e5">groovy-dev: Static compilation for Groovy</a>:<br>
+An interesting discussion where dynamic lovers explain why they do not want static compilation</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_jira_issues">JIRA issues</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://issues.apache.org/jira/browse/GROOVY-5138">GROOVY-5138: GEP-10 - Static compilation</a></p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_update_history">Update history</h2>
+<div class="sectionbody">
+<div class="dlist">
+<dl>
+<dt class="hdlist1">3 (2012-06-21)</dt>
+<dd>
+<p>Version as extracted from Codehaus wiki</p>
+</dd>
+<dt class="hdlist1">4 (2018-10-26)</dt>
+<dd>
+<p>Numerous minor tweaks</p>
+</dd>
+</dl>
+</div>
+</div>
+</div></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='..\/download.html'>Download</a></li><li><a href='http://groovy-lang.org/support.html'>Support</a></li><li><a href='..\/'>Contribute</a></li><li><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='http://groovy-lang.org/security.html'>Security</a></li><li><a href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='http://groovy-lang.org/search.html'>Search</a></li>
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a href='http://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='http://groovy-lang.org/groovy-weekly.html'>Groovy newsletter</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='http://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li>
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community
+                                        </p><img src='..\img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' class='img-responsive'/>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2019 the Apache Groovy project &mdash; Groovy is Open Source, <a href='http://www.apache.org/licenses/LICENSE-2.0.html'>Apache 2 License</a></div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='..\js/vendor/jquery-1.10.2.min.js' defer></script><script src='..\js/vendor/classie.js' defer></script><script src='..\js/vendor/bootstrap.js' defer></script><script src='..\js/vendor/sidebarEffects.js' defer></script><script src='..\js/vendor/modernizr-2.6.2.min.js' defer></script><script src='..\js/plugins.js' defer></script><script src='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js'></script><script>document.addEventListener('DOMContentLoaded',prettyPrint)</script><script>
+          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file
diff --git a/wiki/GEP-11.html b/wiki/GEP-11.html
new file mode 100644
index 0000000..ed3b134
--- /dev/null
+++ b/wiki/GEP-11.html
@@ -0,0 +1,628 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><title>The Apache Groovy programming language - Developer docs - GEP-11</title><link href='..\img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='..\css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='..\css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='..\css/style.css'/><link rel='stylesheet' type='text/css' href='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.css'/>
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: 20px; right: -58px; border: 0; z-index: 100; transform: rotate(45deg);' src='/img/horizontal-github-ribbon.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/groovy-weekly.html' class='icon'><span class='fa fa-envelope-o'></span> Groovy newsletter</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+                <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span>
+                                    </button><a class='navbar-brand' href='..\index.html'>
+                                        <i class='fa fa-star'></i> Apache Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li class=''><a href='..\/download.html'>Download</a></li><li class=''><a href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='..\/'>Contribute</a></li><li class=''><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li>
+                                            <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='..\search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li class='active'><a href='#doc'>GEP-11</a></li><li><a href='#_abstract_groovy_3_semantics_and_new_mop' class='anchor-link'>Abstract: Groovy 3 semantics and new MOP</a></li><li><a href='#_rationale' class='anchor-link'>Rationale</a></li><li><a href='#_references_and_useful_links' class='anchor-link'>References and useful links</a></li><li><a href='#_update_history' class='anchor-link'>Update history</a></li></ul></div><div class='col-lg-8 col-lg-pull-0'><a name='doc'></a><h1>GEP-11</h1><p>Author: <i/></p><hr/><div id="preamble">
+<div class="sectionbody">
+<div class="sidebarblock">
+<div class="content">
+<div class="title">Metadata</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+<strong>Number</strong>
+</td>
+<td class="hdlist2">
+<p>GEP-11</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Title</strong>
+</td>
+<td class="hdlist2">
+<p>Groovy 3 semantics and new MOP</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Version</strong>
+</td>
+<td class="hdlist2">
+<p>4</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Type</strong>
+</td>
+<td class="hdlist2">
+<p>Feature</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Status</strong>
+</td>
+<td class="hdlist2">
+<p>Draft</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Leader</strong>
+</td>
+<td class="hdlist2">
+<p>Jochen "blackdrag" Theodorou</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Created</strong>
+</td>
+<td class="hdlist2">
+<p>2012-06-26</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Last modification</strong>&#160;
+</td>
+<td class="hdlist2">
+<p>2018-10-28</p>
+</td>
+</tr>
+</table>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_abstract_groovy_3_semantics_and_new_mop">Abstract: Groovy 3 semantics and new MOP</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>For quite long we are thinking about a new MOP for Groovy, without finding the right way  to do it better this time.
+It is difficult to find the right path between being user-friendly and efficient.
+Thus the new MOP will contain some features the old did not, but will also remove some old features for
+the sake of a more straight and more easy to understand MOP.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_rationale">Rationale</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_removing_default_null_argument">Removing default null argument</h3>
+<div class="paragraph">
+<p>The default null argument is used for method calls that have one parameter,
+but the call is done without an argument for the parameter.
+Groovy will here use null, as long as the type of the parameter is not a primitive.
+In case of a primitive the call fails. This feature was mainly added in the early Groovy pre 1.0 years
+before Groovy supported default values for parameters. Another limitation of this logic is that it works
+only with single parameter methods. There have been multiple cases of confused users by this logic.
+Performance wise this logic doesn&#8217;t cost much, and certainly not more than a call with a real argument.
+But since this is a confusing feature of limited use, it should be removed.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_removing_automatic_list_expansion">Removing automatic list expansion</h3>
+<div class="paragraph">
+<p>A method call done with a list that finds no matching method for that list (a method with one parameter of type List,
+Collection, Object, etc), will cause a second method selection iteration. This time the list is "unpacked" and all
+elements of the list are taken as if the method call had been done with the elements rather than the list.
+Groovy also supports spreading of lists by an syntax element, making this automatic feature not needed.
+In fact this can be quite surprising for users and is a problem for performance.
+A spread version might be still not good in performance, but at least the user will have
+to use an extra symbol and thus have the visual indicator. As of why this feature was originally added is unclear.
+Looking at user code you will find barely intended usages of this. Thus it should be removed.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_changing_safe_navigation_to_stop_evaluation">Changing Safe Navigation to stop evaluation</h3>
+<div class="paragraph">
+<p>Currently an expression like a?.b.c will fail if a is null. It will not evaluate b, but it will try to evaluate c on null.
+This defies the intend of safe navigation to avoid a NullPointerException. Thus this should be changed to stop the
+evaluation of the path expression.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_user_wish_list">User Wish List</h3>
+<div class="ulist">
+<ul>
+<li>
+<p>Instance based Categories by Wujek Srujek<br>
+Instead of having to provide a class with static methods it would be good to be able to feed an instance to the
+use-construct and that then we will use this instance along with its instance methods. This allows instance state to be used.</p>
+</li>
+<li>
+<p>Replacing Introspector by blackdrag<br>
+Not only because of bugs like GROOVY-5019 there should be a replacement of the Introspector</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_some_of_the_leading_design_ideas_of_this_mop">Some of the leading design ideas of this MOP</h3>
+<div class="paragraph">
+<p>The plan is to orientate us a lot on the open call site caching the JVM provides with invokedynamic.
+For this to work all parts of the MOP should no longer be seen as places that do invoke something,
+but as places that return something, that then will be invoked. An invokeMethod then will for example
+return instead an object that acts as a kind of handler, which can be invoked.
+Groovy will then store it and avoid the reselection unless you invalidate it.
+In the old MOP such caching often did not happen once you interact using meta programming.
+The tasks to be solved in this are to provide an "extension point" for intercepting methods and to react to
+missing methods, as well as being able to invalidate a cached version and/or to make an uncached version possible.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_mop2_outline">MOP2 outline</h3>
+<div class="paragraph">
+<p><span class="image"><img src="img/mop_2.jpg" alt="image"></span></p>
+</div>
+<div class="paragraph">
+<p>in meta class of x in pseudo code:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>cachable = getMethodInterceptor(...)
+if (cachable==null) cachable = getFittingMethod(...)
+if (cachable==null) getMethodMissingHandler(...)
+if (cachable==null) throw new MethodMissingException(...)
+storeInCallSite(cachable)
+invoke(cachable)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>as an explanation to the methods:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>getMethodInterceptor<br>
+Extension point for the user to register an interceptor, that will be used for all method calls.
+This is equal what GroovyInterceptable does using invokeMethod, only that in MOP1 the method is directly called.
+In MOP2 we will instead return a handler that then will do whatever is needed. This can for example be a method
+handle to a invokeMethod method if wanted. TODO: define guards</p>
+</li>
+<li>
+<p>getFittingMethod<br>
+Predefined way to select a method through meta class. This method will return an
+object which then can be used to invoke the selected method.</p>
+</li>
+<li>
+<p>getMethodMissingHandler<br>
+Extension point for the user to register a handler for missing methods.
+The then invoked method is comparable to what methodMissing in MOP1 would be doing.</p>
+</li>
+<li>
+<p>MethodMissingException<br>
+thrown if none of the above methods is bearing a non null result</p>
+</li>
+<li>
+<p>storeInCallSite<br>
+Predefined method to store the cachable result of the above process in the call site.
+As long as the cached object is valid the above methods will not be called again for this call site.</p>
+</li>
+<li>
+<p>invoke<br>
+Predefined method to do the Initial invocation of the cachable. Subsequent invocation may be done directly by invokedynamic.</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_context_meta_class">Context Meta Class</h3>
+<div class="paragraph">
+<p>For the MOP2 Groovy will use a system of meta classes with a context element and an always existing default.
+At each call site only one such view will be valid and it will be constant.
+Those views can be used to defined "sealed" meta class, which won&#8217;t get influenced by outside
+meta classes or to allow for example calling private methods and not allowing them in other cases.
+This makes 3 possible meta class variations currently:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Default meta class<br>
+Behaves pretty much like what Java allows in regards of method calls (same class private methods are available)
+and all meta programming changes are visible</p>
+</li>
+<li>
+<p>Sealed meta class<br>
+Like the default meta class, but meta programming changes from outside the class are not visible.
+This can be especially useful to library writers.</p>
+</li>
+<li>
+<p>Test meta class (un)sealed<br>
+Like the two before but with the addition that private members will always be available.</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_getting_a_meta_class">Getting a Meta Class</h3>
+<div class="paragraph">
+<p>Because of the concept of context a class does not have one direct meta class that can be generated without its context.
+The call site defines the place of the context. How the context itself is defined is a TODO.
+As an implementation strategy it is possible to for example use ClassValue to store a table with the context being a key.
+The key would probably have to be available as static information, or as easily computable information.
+Since the resulting meta class could be stored later in the call site object context changes are to be avoided,
+since it implies the invalidation of the call sites using that context.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_general_dispatch_rule_for_methods_and_properties">General dispatch rule for methods (and properties)</h3>
+<div class="paragraph">
+<p>To define the dispatch rules correctly we need to define some terms first:<br>
+<em>Static Sender Class (SSC)</em>:  This is the static information about the class a call is made from.
+If there is for example a class A and a class B extends A, and a call in a method in A,
+then even if your instance is actually a B the SSC will still be A.<br>
+<em>Inheritance based Multimethods</em> (short multimethods from now on): Given a class A and a class B extends A,
+a call made from within A may see a method defined on B as long as the method is visible (not private).
+Groovy defines a special  exception to this though. If the method call from within A is calling a method of the name m,
+then a m from B can only be visible if there is no private m defined in A.</p>
+</div>
+<div class="paragraph">
+<p>Given those two definitions a method call in A will select the set of method to decide from based on this:
+A call m() with the SSC A and done on an instance of B (extends A) will be using the methods defined in A, if A has a private m, otherwise the call is done using B.</p>
+</div>
+<div class="paragraph">
+<p>Calls to Super:<br>
+A call to super in B extends A will have the SSC B, but for the method selection process the super class of SSC (super(SSC)) will be used. In super calls mutimethods are not visible. Thus we can directly use the meta class super(SSC), but we will dispatch only on the public methods of that meta class.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_module_extension_methods_shadowing_rules">Module Extension Methods Shadowing Rules</h3>
+<div class="paragraph">
+<p>Module Extensions Methods are in the old and new MOP defined by the DefaultGroovyMethods related classes and module extension, like groovy-swing. In the definition here we will use the terms of from "inside" and from "outside" to define a callsite, that lies in the same class as the target method (inside) or not (outside). The general rules are:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>public methods are shadowed</p>
+</li>
+<li>
+<p>private methods are shadowed for outside callsites, but not for inside callsites</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Subclasses of the class the module extension method has been applied to have these extended rules:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>if the subclass defines a private method of the same signature as the module extension method, then outside callsites will still see the extension method, inside callsites the private method</p>
+</li>
+<li>
+<p>A call to "super" or "this" will call the module extension method. As such the subclass is seen as outside callsite.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Open Blocks are not seen as separate classes.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_property_discovery">Property Discovery</h3>
+<div class="paragraph">
+<p>Currently MetaClass discovers properties based on the Java Beans conventions.
+It also allows pseudo properties matching a convention on java.beans.EventSetDescriptor.
+This allows the following trick in SwingBuilder for example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>button(actionPerformed: { println it })</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The pseudo property actionPerformed is inferred from the single method exposed by ActionListener,
+a type of listener that can be registered on a JButton. The code responsible for discovering these
+properties is buried in MetaClassImpl and is not accessible to the outside.
+It would be great if this mechanism be made pluggable.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_the_realm_concept">The Realm concept</h3>
+<div class="paragraph">
+<p>In MOP2 a Realm is a tree like structure containing the meta classes.
+There is a root realm, used as default, but there can be any number of lower realms.
+A meta class change is visible in a realm, if the change is done to the meta class in
+the same realm or to a meta class in a higher realm.
+Script execution engines are able to set a realm for example to prevent them changing meta classes they should not change.
+This can be used for unit tests to isolate meta class changes done during the tests as well.
+A library can have its own realm (defined through an annotation) to prevent other classes to
+leak their changes into that library, while the library can still use a higher realm to make
+changes more public visible, if the realm allows that. Realms can have a setting that prevents
+code executed from there to make changes to higher realms. Calling a method is always done using
+the meta classes from the current realm, even if the called class then calls other classes using
+its own realm. A realm is thus not thread local structure, it is more of a lexical scope.
+A realm can also use a different meta class flavor, to for example allow access to private methods and fields.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_work_items">Work Items</h3>
+<div class="paragraph">
+<p>This part is to guide the implementors with the course of action and planning of the subtasks.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>make indy the only compilation target in the build</p>
+</li>
+<li>
+<p>move all non-indy bytecode interfacing code to a module, which may be removed later. This includes ScriptBytecodeAdpater as well as all the custom call site caching classes</p>
+</li>
+<li>
+<p>make a new module for MOP2</p>
+</li>
+<li>
+<p>turn meta class into an immutable</p>
+</li>
+<li>
+<p>implement meta class views</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_breaking_changes_trace">Breaking changes trace</h3>
+<div class="paragraph">
+<p><code>groovy.lang.MetaObjectProtocol</code> (currently in <code>groovy.mop.MetaObjectProtocol</code>):</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>getProperties()</code> renamed to <code>getMetaProperties()</code></p>
+</li>
+<li>
+<p><code>getMethods()</code> renamed to <code>getMetaMethods()</code></p>
+</li>
+<li>
+<p><code>respondsTo(Object, String, Object[])</code> changed to <code>respondsTo(String, Object&#8230;&#8203;)</code></p>
+</li>
+<li>
+<p><code>respondsTo(Object, String)</code> replaced by <code>getMetaMethods(String, Class&#8230;&#8203;)</code> with the class argument being null</p>
+</li>
+<li>
+<p>hasProperty(Object,String) replaced by getMetaProperty(String) being null or not</p>
+</li>
+<li>
+<p>getStaticMetaMethod(String, Object[]) replaced by respondsTo(String, Object&#8230;&#8203;) and inspecting the list for static methods</p>
+</li>
+<li>
+<p>getMetaMethod(name, Object[]) replaced by respondsTo(String, Object&#8230;&#8203;) in case the arguments are no classes and getMetaMethods(String,Class&#8230;&#8203;) in case of the arguments being classes</p>
+</li>
+<li>
+<p>invokeConstructor(Object[])NO REPLACEMENT</p>
+</li>
+<li>
+<p>invokeMethod(Object, String, Object[]) NO REPLACEMENT</p>
+</li>
+<li>
+<p>invokeMethod(Object, String, Object) NO REPLACEMENT</p>
+</li>
+<li>
+<p>invokeStaticMethod(Object, String, Object[]) NO REPLACEMENT</p>
+</li>
+<li>
+<p>getProperty(Object, String) replaced by MetaProperty#invoke</p>
+</li>
+<li>
+<p>setProperty(Object, String, Object) replaced by MetaProperty#invoke</p>
+</li>
+<li>
+<p>getAttribute(Object, String) replaced by MetaProperty#getField#invoke</p>
+</li>
+<li>
+<p>setAttribute(Object, String, Object) replaced by MetaProperty#getField#invoke</p>
+</li>
+<li>
+<p><code>getMetaProperty(String)</code>, <code>getTheClass()</code> UNCHANGED</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><code>groovy.lang.MetaMethod</code> is split into a public interface <code>groovy.mop.MetaMethod</code> and an internal default implementation <code>groovy.mop.internal.DefaultMetaMethod</code>.</p>
+</div>
+<div class="paragraph">
+<p>Differences to groovy.mop.internal.DefaultMetaMethod:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>does no longer extend ParameterTypes and does no longer implement Clonable</p>
+</li>
+<li>
+<p>no protected fields nativeParamTypes, parameterTypes and isVargsMethod</p>
+</li>
+<li>
+<p>the constructor MetaMethod() and MetaMethod(Class[]) are removed and partially replaced by DefaultMetaMethod(Class, String, int, MethodHandle) and DefaultMetaMethod(Class, String, MethodType), which uses the MethodType or the MethodHandle to define the parameter classes</p>
+</li>
+<li>
+<p>coerceArgumentsToClasses(Object[]), correctArguments(Object[]), isValidExactMethod(Class[]), isValidExactMethod(Object[]), isValidMethod(Class[]), isValidMethod(Object[]), isVargsMethod(), isVargsMethod(Object[]) NO REPLACEMENT</p>
+</li>
+<li>
+<p>getNativeParameterTypes()replaced by getParameterClasses()</p>
+</li>
+<li>
+<p>equal(CachedClass[], CachedClass[]), equal(CachedClass[], Class[]), checkParameters(Class[]), clone(), doMethodInvoke(Object, Object[]), getDescriptor() NO REPLACEMENT</p>
+</li>
+<li>
+<p>getDeclaringClass(), getModifiers(), getName(), getReturnType(), isAbstract(), isPrivate(), isProtected(), isPublic(), isStatic(), toString() UNCHANGED</p>
+</li>
+<li>
+<p>getMopName(), getSignature(), invoke(Object, Object[]), isCacheable(), isMethod(MetaMethod), isSame(MetaMethod), processDoMethodInvokeException(Exception, Object, Object[]) NO REPLACEMENT</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><code>groovy.lang.MetaProperty</code> is split into a public interface <code>groovy.mop.MetaProperty</code> and an internal default implementation <code>groovy.mop.internal.DefaultMetaProperty</code>.</p>
+</div>
+<div class="paragraph">
+<p>Differences to groovy.mop.internal.DefaultMetaProperty:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>the public static field PROPERTY_SET_PREFIX is removed NO REPLACEMENT</p>
+</li>
+<li>
+<p>the protected fields name and type are now private and have to be requested through getName and getType</p>
+</li>
+<li>
+<p>getModifiers(), getName(), getType(), DefaultMetaProperty(String, Class) UNCHANGED</p>
+</li>
+<li>
+<p>getGetterName(String, Class), getSetterName(String)NO REPLACEMENT</p>
+</li>
+<li>
+<p>getProperty(Object) replaced by getter(boolean)</p>
+</li>
+<li>
+<p>setProperty(Object, Object) replaced by setter(boolean)</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_references_and_useful_links">References and useful links</h2>
+<div class="sectionbody">
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://web.archive.org/web/20150508123746/http://docs.codehaus.org/display/GroovyJSR/GEP+11+-+Groovy+3+semantics+and+new+MOP">GEP-11: Groovy 3 semantics and new MOP</a> (web archive link)</p>
+</li>
+</ul>
+</div>
+<div class="sect2">
+<h3 id="_mailing_list_discussions">Mailing-list discussions</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://markmail.org/message/zujumywsb73px2ky">groovy-user: Groovy 3</a></p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_reference_implementation">Reference implementation</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://github.com/groovy/groovy-core/tree/GROOVY_3_FEATURE">GROOVY_3_FEATURE</a><br>
+feature branch on github</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_update_history">Update history</h2>
+<div class="sectionbody">
+<div class="dlist">
+<dl>
+<dt class="hdlist1">3 (2013-10-11)</dt>
+<dd>
+<p>Version as extracted from Codehaus wiki</p>
+</dd>
+<dt class="hdlist1">4 (2018-10-28)</dt>
+<dd>
+<p>Numerous minor tweaks</p>
+</dd>
+</dl>
+</div>
+</div>
+</div></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='..\/download.html'>Download</a></li><li><a href='http://groovy-lang.org/support.html'>Support</a></li><li><a href='..\/'>Contribute</a></li><li><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='http://groovy-lang.org/security.html'>Security</a></li><li><a href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='http://groovy-lang.org/search.html'>Search</a></li>
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a href='http://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='http://groovy-lang.org/groovy-weekly.html'>Groovy newsletter</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='http://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li>
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community
+                                        </p><img src='..\img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' class='img-responsive'/>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2019 the Apache Groovy project &mdash; Groovy is Open Source, <a href='http://www.apache.org/licenses/LICENSE-2.0.html'>Apache 2 License</a></div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='..\js/vendor/jquery-1.10.2.min.js' defer></script><script src='..\js/vendor/classie.js' defer></script><script src='..\js/vendor/bootstrap.js' defer></script><script src='..\js/vendor/sidebarEffects.js' defer></script><script src='..\js/vendor/modernizr-2.6.2.min.js' defer></script><script src='..\js/plugins.js' defer></script><script src='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js'></script><script>document.addEventListener('DOMContentLoaded',prettyPrint)</script><script>
+          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file
diff --git a/wiki/GEP-12.html b/wiki/GEP-12.html
new file mode 100644
index 0000000..dc5a978
--- /dev/null
+++ b/wiki/GEP-12.html
@@ -0,0 +1,509 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><title>The Apache Groovy programming language - Developer docs - GEP-12</title><link href='..\img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='..\css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='..\css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='..\css/style.css'/><link rel='stylesheet' type='text/css' href='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.css'/>
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: 20px; right: -58px; border: 0; z-index: 100; transform: rotate(45deg);' src='/img/horizontal-github-ribbon.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/groovy-weekly.html' class='icon'><span class='fa fa-envelope-o'></span> Groovy newsletter</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+                <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span>
+                                    </button><a class='navbar-brand' href='..\index.html'>
+                                        <i class='fa fa-star'></i> Apache Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li class=''><a href='..\/download.html'>Download</a></li><li class=''><a href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='..\/'>Contribute</a></li><li class=''><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li>
+                                            <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='..\search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li class='active'><a href='#doc'>GEP-12</a></li><li><a href='#_abstract_sam_coercion' class='anchor-link'>Abstract: SAM coercion</a></li><li><a href='#_references_and_useful_links' class='anchor-link'>References and useful links</a></li><li><a href='#_update_history' class='anchor-link'>Update history</a></li></ul></div><div class='col-lg-8 col-lg-pull-0'><a name='doc'></a><h1>GEP-12</h1><p>Author: <i/></p><hr/><div id="preamble">
+<div class="sectionbody">
+<div class="sidebarblock">
+<div class="content">
+<div class="title">Metadata</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+<strong>Number</strong>
+</td>
+<td class="hdlist2">
+<p>GEP-12</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Title</strong>
+</td>
+<td class="hdlist2">
+<p>SAM coercion</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Version</strong>
+</td>
+<td class="hdlist2">
+<p>4</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Type</strong>
+</td>
+<td class="hdlist2">
+<p>Feature</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Status</strong>
+</td>
+<td class="hdlist2">
+<p>Final</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Leader</strong>
+</td>
+<td class="hdlist2">
+<p>Jochen "blackdrag" Theodorou</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Created</strong>
+</td>
+<td class="hdlist2">
+<p>2013-05-30</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Last modification</strong>&#160;
+</td>
+<td class="hdlist2">
+<p>2018-10-29</p>
+</td>
+</tr>
+</table>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_abstract_sam_coercion">Abstract: SAM coercion</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>SAM stands for Single Abstract Method.  SAM coercion is here a Groovy style transformation of a
+<code>groovy.lang.Closure</code> instance into an object suitable for our SAM type.
+A SAM type is an abstract class or interface with a single abstract method. The coercion can happen as part of an assignment or as the result of a method call. Since this transformation might be outside of the types provided by Closure itself, it can be more than a simple Java style cast. Closure becomes a kind of sub type to all SAM types. Groovy has other such transformations without explicit cast or asType usage, which are number object transformations as well as the conversion of GString to String.</p>
+</div>
+<div class="sect2">
+<h3 id="_motivation">Motivation</h3>
+<div class="paragraph">
+<p>Even before Java8 we had discussions about supporting different interfaces with Closure like Runnable and Callable.
+These two being easy cases, any framework can define a myriad of interfaces and abstract classes.
+This then requires to "groovify" the library by writing a helper layer capable of transforming Closure
+objects into something the library then understand. While it is unlikely of this approach to make Groovy
+Builder surplus, it can still help with a more simple integration.</p>
+</div>
+<div class="sect3">
+<h4 id="_meaning_of_single_abstract_method">Meaning of  "Single Abstract Method"</h4>
+<div class="paragraph">
+<p>For a SAM type to be a SAM type according to this GEP an abstract class or interface with a single
+abstract method is required. Any static methods, as well as non-abstract methods are not counted.
+The abstract method may be defined in the SAM class itself, but it can also be a parent.
+The required visibility modifier for the method is public though.</p>
+</div>
+<div class="paragraph">
+<p>SAM examples:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Simple Interface:</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>interface SAM {
+  def foo()
+}</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Interface with defender method (aka virtual extension method):</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>interface SAM {
+  def foo()
+  def bar() default { 1 }
+}</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Interface inheriting from another interface:</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>interface ParentOfSAM {}
+interface SAM extends ParentOfSAM {
+  def foo()
+}</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Interface inheriting from another interface, but not defining a method on its own:</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>interface ParentOfSAM {
+  def foo()
+}
+interface SAM extends ParentOfSAM {}</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>simple abstract class</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>abstract class SAM {
+  abstract foo()
+}</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>abstract class with a abstract and a non abstract method:</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>abstract class SAM {
+  abstract foo()
+  def bar() { 1 }
+}</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>abstract class extending other class:</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>abstract class ParentOfSAM1 {
+  abstract foo()
+}</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>abstract class SAM1 extends ParentOfSAM1 {}</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>class ParentOfSAM {
+   def bar() { 1 }
+}
+abstract class SAM2 extends  {
+  abstract foo()
+}</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>abstract class implementing interface:</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>interface SomeInterface{
+  def foo()
+}
+abstract class SAM1 implements SomeInterface {}
+abstract class SAM2 implements Runnable{}
+interface AnotherInterface {}
+abstract class SAM3 implements AnotherInterface {
+  abstract foo()
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Non-SAM examples:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>empty interface:</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>interface SomeMarker {}</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>interface with two methods:</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>interface TwoMethods {
+  def foo()
+  def bar()
+}</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>abstract class with two abstract methods:</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>abstract class TwoMethods {
+  abstract foo()
+  abstract bar()
+}</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>empty abstract class:</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>abstract class Empty {}</code></pre>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_influence_on_method_selection">Influence on method selection</h4>
+<div class="paragraph">
+<p>The normal method selection algorithm tries to find the most specific method to the given argument
+runtime types and the most general for null. Since a SAM type and a target method parameter type
+are not in an inheritance relation "most specific" needs a redefinition in parts.
+It will be assumed the SAM type is like a direct child of the given target type,
+but if the SAM type is one implemented by Closure (Runnable and Callable),
+then no SAM coercion will be needed. This case is preferred in method selection.
+In case of an overloaded method, where each can be used as target for the SAM coercion,
+method selection will thus fail, regardless their internal relation.
+In Groovy the actual method signature of the SAM type and the coercion target are not important.
+Also it is not important if the target type is an abstract class or an interface.</p>
+</div>
+<div class="paragraph">
+<p>Example of two SAM targets with failing runtime method selection:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>interface SAM1 { def foo(String s)}
+interface SAM2 { def bar(Integer i)}
+def method(x, SAM1 s1){s1.foo(x)}
+def method(x, SAM2 s2){s2.bar(x)}
+method (1)   {it}  // fails because SAM1 and SAM2 are seen as equal
+method ("1") {it}  // fails because SAM1 and SAM2 are seen as equal</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Example of SAM type being ignore as a non-coercion case is available:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>interface SAM {def foo(String s)}
+def method(SAM s) {1}
+def method(Runnable r) {2}
+assert method {it} == 2</code></pre>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_influence_on_static_typing_system">Influence on static typing system</h4>
+<div class="paragraph">
+<p>The Scope for the static type system is split into a basic part for Groovy 2.2 and an extended one
+for a later version (2.3 or 3.0)</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_groovy_2_2_static_checks">Groovy 2.2 static checks</h4>
+<div class="paragraph">
+<p>The type checking in Groovy 2.2 will be limited to mimic the behavior of normal Groovy.
+No method signature checks are performed, as well as there will be no additional test or method
+selection based on the type provided by the open block.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_groovy_2_2_static_checks_2">Groovy 2.2+ static checks</h4>
+<div class="paragraph">
+<p>In later versions of Groovy the static type checker has to be improved to refine method selection by the given type
+signature through the open block or lambda. A SAM type is then a fitting type for the coercion only if the provided
+types and the target types in the SAM are matching by number and type itself. A more detailed description can be
+found here: <a href="http://cr.openjdk.java.net/~dlsmith/jsr335-0.6.1/F.html" class="bare">http://cr.openjdk.java.net/~dlsmith/jsr335-0.6.1/F.html</a></p>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_references_and_useful_links">References and useful links</h2>
+<div class="sectionbody">
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://web.archive.org/web/20150508054422/http://docs.codehaus.org/display/GroovyJSR/GEP+12+-+SAM+coercion">GEP-12: SAM coercion</a> (web archive link)</p>
+</li>
+</ul>
+</div>
+<div class="sect2">
+<h3 id="_reference_implementation">Reference implementation</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://github.com/groovy/groovy-core/commits/SAM" class="bare">https://github.com/groovy/groovy-core/commits/SAM</a> (feature branch on github)</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_jira_issues">JIRA issues</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://issues.apache.org/jira/browse/GROOVY-6188">GROOVY-6188: Java8 lambda style coercion for Closure</a></p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_update_history">Update history</h2>
+<div class="sectionbody">
+<div class="dlist">
+<dl>
+<dt class="hdlist1">3 (2013-07-01)</dt>
+<dd>
+<p>Version as extracted from Codehaus wiki</p>
+</dd>
+<dt class="hdlist1">4 (2018-10-29)</dt>
+<dd>
+<p>Numerous minor tweaks</p>
+</dd>
+</dl>
+</div>
+</div>
+</div></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='..\/download.html'>Download</a></li><li><a href='http://groovy-lang.org/support.html'>Support</a></li><li><a href='..\/'>Contribute</a></li><li><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='http://groovy-lang.org/security.html'>Security</a></li><li><a href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='http://groovy-lang.org/search.html'>Search</a></li>
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a href='http://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='http://groovy-lang.org/groovy-weekly.html'>Groovy newsletter</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='http://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li>
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community
+                                        </p><img src='..\img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' class='img-responsive'/>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2019 the Apache Groovy project &mdash; Groovy is Open Source, <a href='http://www.apache.org/licenses/LICENSE-2.0.html'>Apache 2 License</a></div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='..\js/vendor/jquery-1.10.2.min.js' defer></script><script src='..\js/vendor/classie.js' defer></script><script src='..\js/vendor/bootstrap.js' defer></script><script src='..\js/vendor/sidebarEffects.js' defer></script><script src='..\js/vendor/modernizr-2.6.2.min.js' defer></script><script src='..\js/plugins.js' defer></script><script src='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js'></script><script>document.addEventListener('DOMContentLoaded',prettyPrint)</script><script>
+          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file
diff --git a/wiki/GEP-2.html b/wiki/GEP-2.html
new file mode 100644
index 0000000..4ad73db
--- /dev/null
+++ b/wiki/GEP-2.html
@@ -0,0 +1,511 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><title>The Apache Groovy programming language - Developer docs - GEP-2</title><link href='..\img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='..\css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='..\css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='..\css/style.css'/><link rel='stylesheet' type='text/css' href='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.css'/>
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: 20px; right: -58px; border: 0; z-index: 100; transform: rotate(45deg);' src='/img/horizontal-github-ribbon.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/groovy-weekly.html' class='icon'><span class='fa fa-envelope-o'></span> Groovy newsletter</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+                <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span>
+                                    </button><a class='navbar-brand' href='..\index.html'>
+                                        <i class='fa fa-star'></i> Apache Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li class=''><a href='..\/download.html'>Download</a></li><li class=''><a href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='..\/'>Contribute</a></li><li class=''><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li>
+                                            <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='..\search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li class='active'><a href='#doc'>GEP-2</a></li><li><a href='#_abstract' class='anchor-link'>Abstract</a></li><li><a href='#_approach' class='anchor-link'>Approach</a></li><li><a href='#_references_and_useful_links' class='anchor-link'>References and useful links</a></li><li><a href='#_update_history' class='anchor-link'>Update history</a></li></ul></div><div class='col-lg-8 col-lg-pull-0'><a name='doc'></a><h1>GEP-2</h1><p>Author: <i/></p><hr/><div id="preamble">
+<div class="sectionbody">
+<div class="sidebarblock">
+<div class="content">
+<div class="title">Metadata</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+<strong>Number</strong>
+</td>
+<td class="hdlist2">
+<p>GEP-2</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Title</strong>
+</td>
+<td class="hdlist2">
+<p>AST Builder Support</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Version</strong>
+</td>
+<td class="hdlist2">
+<p>8</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Type</strong>
+</td>
+<td class="hdlist2">
+<p>Feature</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Target</strong>
+</td>
+<td class="hdlist2">
+<p>Groovy 1.7</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Status</strong>
+</td>
+<td class="hdlist2">
+<p>Final</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Comment</strong>
+</td>
+<td class="hdlist2">
+<p>Included in Groovy but somewhat <em>superseded by macros</em></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Leader</strong>
+</td>
+<td class="hdlist2">
+<p>Hamlet D&#8217;Arcy</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Created</strong>
+</td>
+<td class="hdlist2">
+<p>2009-04-01</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Last modification</strong>&#160;
+</td>
+<td class="hdlist2">
+<p>2018-10-12</p>
+</td>
+</tr>
+</table>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_abstract">Abstract</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Groovy 1.6 introduced the ability to perform local and global AST (Abstract Syntax Tree) transformations,
+allowing users to read and modify the AST of Groovy code as it is being compiled.
+Reading information in the AST is relatively easy in Groovy.
+The core library provides a strongly-typed visitor called GroovyCodeVisitor.
+Nodes can be read and modified using the API provided through the subtypes of ASTNode.
+Writing new AST nodes is not as simple. The AST generated from source is not always obvious,
+and using constructor calls to generate trees of nodes can be verbose.
+This GEP proposes an ASTBuilder object that allows users to easily create AST.</p>
+</div>
+<div class="paragraph">
+<p>The ASTBuilder object allows AST to be created from:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>strings containing Groovy source code</p>
+</li>
+<li>
+<p>a closure containing Groovy source</p>
+</li>
+<li>
+<p>a closure containing an AST creation DSL</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>All three approaches share the same API: a builder object is instantiated and a build* method is invoked.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_approach">Approach</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_astnode_from_string">ASTNode from String</h3>
+<div class="paragraph">
+<p>The simplest approach to implement is to provide an AST Builder with an API that takes a String and returns List&lt;ASTNode&gt;:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>def builder = new AstBuilder()
+List&lt;ASTNode&gt; statements = builder.buildFromString(
+     CompilePhase.CONVERSION,
+     true,
+     """ println "Hello World" """
+)</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>phase parameter tells the builder from which phase to return AST. This parameter is optional, and the default
+CompilePhase is CLASS_GENERATION. This provides a cleaner API for the common case, and CLASS_GENERATION was chosen
+because more types are available in later phases.</p>
+</li>
+<li>
+<p>the "statementsOnly" boolean parameter is an optional parameter, and tells the builder to discard the generated
+top level Script ClassNode. Default is true.</p>
+</li>
+<li>
+<p>The last String parameter is the input</p>
+</li>
+<li>
+<p>The builder returns List&lt;ASTNode&gt;</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The above example produces the following AST:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>BlockStatement
+-&gt; ExpressionStatement
+    -&gt; MethodCallExpression
+       -&gt; VariableExpression
+       -&gt; ConstantExpression
+       -&gt; ArgumentListExpression
+          -&gt; ConstantExpression</code></pre>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_alternatives">Alternatives</h4>
+<div class="ulist">
+<ul>
+<li>
+<p>Some sort of AST Template was considered for this feature. Consider the following example:</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>def astTemplate = builder.buildAst ( "println $txt" ).head()
+
+def constant = builder.buildAst ( "To be, or not to be: that is the question" ).head()
+
+def methodCallExpression = astTemplate.apply(txt: constant)
+// method call expression not contains println "To be ... "</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This templating approach adds complexity that may not be used. It overloads the GString $ operator,
+in that it is used here only with objects of type ASTNode but is used normally in GStrings with any Object type at all.
+Also, the templating approach can create order of precedence confusion.
+Consider source = "$expr * y", and later $expr is bound to "x+a". The result is "x + a * y", which was probably unintentional.
+At this time, the AST builder does not include such a feature.</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_astnode_from_code_block">ASTNode from Code Block</h3>
+<div class="paragraph">
+<p>A useful API would be creating AST from code blocks.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>AstBuilder builder = new AstBuilder()
+def statementBlock = builder.buildFromCode (CompilePhase.CONVERSION, true) {
+     println "Hello World"
+}</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Expressing Groovy source within Groovy source seems the most natural way to write it (as opposed to putting Groovy source into a String).</p>
+</li>
+<li>
+<p>Some IDE support is naturally available (highlighting, etc), but IDE warnings will be misleading for variable scoping rules</p>
+</li>
+<li>
+<p>Same issues and rules from "ASTNode from String" for phase and statementsOnly properties apply to this version</p>
+</li>
+<li>
+<p>Provides similar API as builder from String, except the code property accepts any block of code that is legal in the context of a Closure.</p>
+</li>
+<li>
+<p>Converting from a closure into AST is performed through a global compiler transformation.
+This requires that the AstBuilder reference be strongly typed so that the global annotation can be triggered.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The above example produces the following AST:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>BlockStatement
+ -&gt; ExpressionStatement
+    -&gt; MethodCallExpression
+       -&gt; VariableExpression
+       -&gt; ConstantExpression
+       -&gt; ArgumentListExpression
+          -&gt; ConstantExpression</code></pre>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_alternatives_2">Alternatives</h4>
+<div class="paragraph">
+<p>If @ASTSource annotation is used, then it would be very easy to let users reuse that annotation outside of the builder.
+Consider the following example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>@AstSource(CompilePhase.CONVERSION)
+List&lt;ASTNode&gt; source = { println "compiled on: ${new Date()}" }</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This option seems helpful; however, annotations on local variables are not yet supported. This approach will not be implemented.</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_astnode_from_psuedo_specification">ASTNode from psuedo-specification</h3>
+<div class="paragraph">
+<p>Building AST conditionally, such as inserting an if-statement or looping, is not easily accomplished in the String or code based builders.
+Consider this example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>def builder = new AstBuilder()
+List&lt;ASTNode&gt; statements = builder.buildFromSpec {
+    methodCall {
+        variable "this"
+        constant "println"
+        argumentList {
+            if (locale == "US") constant "Hello"
+            if (locale == "FR") constant "Bonjour"
+            else constant "Ni hao"
+        }
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This library class is useful for several reasons:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Using conditionals or looping within an AST Builder will probably be a common occurrence</p>
+</li>
+<li>
+<p>It is difficult to create a Field or Method references in any of the other approaches</p>
+</li>
+<li>
+<p>Simply using the @Newify annotation does not sufficiently improve the syntax</p>
+</li>
+<li>
+<p>This construct alleviates the need to distinguish between Statement and Expressions, since those words are dropped from the method names</p>
+</li>
+<li>
+<p>There is no need for a phase or statementsOnly property in this approach</p>
+</li>
+<li>
+<p>Many expressions take a type ClassNode, which wraps a Class. The syntax for ClassNode is to just pass
+a Class instance and the builder wraps it in a ClassNode automatically.</p>
+</li>
+</ul>
+</div>
+<div class="sect3">
+<h4 id="_issues">Issues</h4>
+<div class="ulist">
+<ul>
+<li>
+<p>Constructor parameter lists can be lengthy on ASTNode subtypes, and this approach removes the possibility for an IDE to help.
+This is the price to pay for a builder, and the planned builder metadata feature in 1.7 may alleviate this.</p>
+</li>
+<li>
+<p>The class creating AST from the pseudo-specification should be implemented so that it does not create a
+mirror-image class hierarchy of the current AST types. This would force all changes to the AST types to be performed
+in two places: once in the ASTNode subclass and once in this builder. If this is not possible, then at least the AST
+hierarchy doesn&#8217;t change frequently.</p>
+</li>
+<li>
+<p>Several ASTNode types have constructor signatures all of the same type: (Expression, Expression, Expression) most commonly.
+This means the parameters in the DSL are order dependent, and specifying arguments in the wrong order doesn&#8217;t create
+an exception but causes drastically different results at runtime. This is fully documented on the mailing list.</p>
+</li>
+<li>
+<p>The syntax for specifying Parameter objects is documented on the mailing list.</p>
+</li>
+<li>
+<p>A few of the ASTNode types having naming conflicts with language keywords. For instance the ClassExpression type
+cannot be abbreviated to 'class' and IfStatement cannot be reduced to 'if'. This is fully documented on the mailing list.</p>
+</li>
+<li>
+<p>Parameters have default values and can be varargs. A suitable syntax needs to be proposed.</p>
+</li>
+<li>
+<p>Sometimes the order of the constructor parameters needed to be switched within the DSL. For instance,
+consider SwitchStatement(Expression expression, List&lt;CaseStatement&gt; caseStatements, Expression defaultStatement).
+The current syntax of the DSL imposes a sort of VarArgs rigidity on the arguments: lists are just implied by repeated elements.
+So having the middle parameter of SwitchStatement be a list is problematic because the natural way to convert the
+constructor is to have it become (Expression expression, CaseStatement&#8230;&#8203; caseStatements, Expression default), which isn&#8217;t possible.
+This is fully documented on the mailing list.</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_alternatives_3">Alternatives</h4>
+<div class="paragraph">
+<p>Template Haskell and Boo provide a special syntax for AST building statements.
+Quasi-quote (or Oxford quotes) can be used to trigger an AST building operation:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>ConstantExpression exp = [| "Hello World" |]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Those languages also supply a splice operator $(&#8230;&#8203;) to turn AST back into code. This is not part of the AstBuilder work.</p>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_references_and_useful_links">References and useful links</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p><a href="https://groovy.markmail.org/thread/4pw7uzl5ulkb5zbe">groovy-dev: Groovy AST Builder discussion</a></p>
+</div>
+<div class="paragraph">
+<p><a href="https://groovy.markmail.org/thread/bbusithri2xmhmiw">groovy-dev: Several issues with GEP-2 AST Builder "from specification"</a></p>
+</div>
+<div class="paragraph">
+<p><a href="https://en.wikipedia.org/wiki/Template_Haskell">Template Haskell</a></p>
+</div>
+<div class="paragraph">
+<p><a href="https://web.archive.org/web/20090213045341/http://blogs.codehaus.org:80/people/bamboo/archives/001593_boo_meta_methods.html">Boo meta methods</a></p>
+</div>
+<div class="paragraph">
+<p><a href="https://github.com/cython/cython/wiki/enhancements-metaprogramming">Cython Metaprogramming Proposal</a> by Martin C Martin - Contains nice write up of some use cases</p>
+</div>
+<div class="sect2">
+<h3 id="_jira_issues">JIRA issues:</h3>
+<div class="paragraph">
+<p>This feature is dependent on allowing annotations on local variables: <a href="https://issues.apache.org/jira/browse/GROOVY-3481">GROOVY-3481</a></p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_update_history">Update history</h2>
+<div class="sectionbody">
+<div class="dlist">
+<dl>
+<dt class="hdlist1">7 (2009-06-17)</dt>
+<dd>
+<p>Version as extracted from Codehaus wiki</p>
+</dd>
+<dt class="hdlist1">8 (2018-10-11)</dt>
+<dd>
+<p>Added comment about macros</p>
+</dd>
+</dl>
+</div>
+</div>
+</div></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='..\/download.html'>Download</a></li><li><a href='http://groovy-lang.org/support.html'>Support</a></li><li><a href='..\/'>Contribute</a></li><li><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='http://groovy-lang.org/security.html'>Security</a></li><li><a href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='http://groovy-lang.org/search.html'>Search</a></li>
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a href='http://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='http://groovy-lang.org/groovy-weekly.html'>Groovy newsletter</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='http://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li>
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community
+                                        </p><img src='..\img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' class='img-responsive'/>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2019 the Apache Groovy project &mdash; Groovy is Open Source, <a href='http://www.apache.org/licenses/LICENSE-2.0.html'>Apache 2 License</a></div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='..\js/vendor/jquery-1.10.2.min.js' defer></script><script src='..\js/vendor/classie.js' defer></script><script src='..\js/vendor/bootstrap.js' defer></script><script src='..\js/vendor/sidebarEffects.js' defer></script><script src='..\js/vendor/modernizr-2.6.2.min.js' defer></script><script src='..\js/plugins.js' defer></script><script src='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js'></script><script>document.addEventListener('DOMContentLoaded',prettyPrint)</script><script>
+          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file
diff --git a/wiki/GEP-3.html b/wiki/GEP-3.html
new file mode 100644
index 0000000..83a1f39
--- /dev/null
+++ b/wiki/GEP-3.html
@@ -0,0 +1,709 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><title>The Apache Groovy programming language - Developer docs - GEP-3</title><link href='..\img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='..\css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='..\css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='..\css/style.css'/><link rel='stylesheet' type='text/css' href='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.css'/>
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: 20px; right: -58px; border: 0; z-index: 100; transform: rotate(45deg);' src='/img/horizontal-github-ribbon.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/groovy-weekly.html' class='icon'><span class='fa fa-envelope-o'></span> Groovy newsletter</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+                <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span>
+                                    </button><a class='navbar-brand' href='..\index.html'>
+                                        <i class='fa fa-star'></i> Apache Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li class=''><a href='..\/download.html'>Download</a></li><li class=''><a href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='..\/'>Contribute</a></li><li class=''><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li>
+                                            <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='..\search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li class='active'><a href='#doc'>GEP-3</a></li><li><a href='#_abstract' class='anchor-link'>Abstract</a></li><li><a href='#_rationale' class='anchor-link'>Rationale</a></li><li><a href='#_references_and_useful_links' class='anchor-link'>References and useful links</a></li><li><a href='#_update_history' class='anchor-link'>Update history</a></li></ul></div><div class='col-lg-8 col-lg-pull-0'><a name='doc'></a><h1>GEP-3</h1><p>Author: <i/></p><hr/><div id="preamble">
+<div class="sectionbody">
+<div class="sidebarblock">
+<div class="content">
+<div class="title">Metadata</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+<strong>Number</strong>
+</td>
+<td class="hdlist2">
+<p>GEP-3</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Title</strong>
+</td>
+<td class="hdlist2">
+<p>Command Expression based DSL</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Version</strong>
+</td>
+<td class="hdlist2">
+<p>2</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Type</strong>
+</td>
+<td class="hdlist2">
+<p>Feature</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Target</strong>
+</td>
+<td class="hdlist2">
+<p>Groovy 1.8 or 2.0</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Status</strong>
+</td>
+<td class="hdlist2">
+<p>Final</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Comment</strong>
+</td>
+<td class="hdlist2">
+<p>Included in Groovy and has been further enhanced</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Leader</strong>
+</td>
+<td class="hdlist2">
+<p>Jochen "blackdrag" Theodorou</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Created</strong>
+</td>
+<td class="hdlist2">
+<p>2009-06-30</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Last modification</strong>&#160;
+</td>
+<td class="hdlist2">
+<p>2018-10-12</p>
+</td>
+</tr>
+</table>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_abstract">Abstract</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Since Groovy 1.0 Groovy supports command expressions. These are method calls without parenthesizing the arguments.
+This would be in theory a nice base for DSLs, but our command expressions are too limited,
+because we were not able to find easy rules on how to handle multiple arguments.
+This proposal now tries to close the gap by defining the evaluation order and meaning of those arguments.
+The concept is very near to what Scala allows, but is not equal for historic reasons.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_rationale">Rationale</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_current_command_expression">Current Command Expression</h3>
+<div class="paragraph">
+<p>Examples of current command expressions are:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Command expression</th>
+<th class="tableblock halign-left valign-top">Meaning</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo a1</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo (a1)</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo {c}</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo ({c})</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo m {c}</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo (m({c})</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo a1, a2</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo (a1, a2)</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo k1:v1, a2, k2:v2</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo ([k1:v1, k2:v2], a2)</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo k1:m{c}</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo ([k1:m({c})])</code></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>Examples of current command expressions, that are not allowed:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Command expression</th>
+<th class="tableblock halign-left valign-top">Possible meanings</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo a1 a2</code></p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>foo(a1,a2)
+foo(a1(a2))
+foo(a1).a2</pre>
+</div>
+</div></div></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo a1 a2 a3</code></p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>foo(a1,a2,a3)
+foo(a1(a2(a3)))
+foo(a1).a2(a3)
+foo(a1,a2(a3))</pre>
+</div>
+</div></div></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>This list is not intended to be complete.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_constraints">Constraints</h3>
+<div class="ulist">
+<ul>
+<li>
+<p>existing valid usages must be kept as much as possible (for obvious backwards compatibility reasons)</p>
+</li>
+<li>
+<p>the evaluation must be easily explainable</p>
+</li>
+<li>
+<p>the grammar should support it</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_details">Details</h3>
+<div class="paragraph">
+<p>What I want to allow are expressions such as:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 33.3333%;">
+<col style="width: 33.3333%;">
+<col style="width: 33.3334%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Expression</th>
+<th class="tableblock halign-left valign-top">Possible meanings</th>
+<th class="tableblock halign-left valign-top">Allowed in old syntax</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo {c}</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo({c})</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs up]</span> (same meaning)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo a1</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo(a1)</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs up]</span> (same meaning)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo a1()</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo(a1())</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs up]</span> (same meaning)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo a1 {c}</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo(a1({c}))</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs up]</span> (same meaning)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo a1 a2</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs down]</span></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs down]</span></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo a1() a2</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs down]</span></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs down]</span></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo a1 a2()</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs down]</span></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs down]</span></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo a1 a2 {c}</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs down]</span></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs down]</span></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo a1 {c} a2</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs down]</span></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs down]</span></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo a1 {c} a2 {c}</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs down]</span></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs down]</span></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo a1 a2 a3</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo(a1).a2(a3)</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs down]</span></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo a1() a2 a3()</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo(a1()).a2(a3())</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs down]</span></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo a1 a2() a3</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs down]</span></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs down]</span></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo a1 a2 a3 {c}</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo(a1).a2(a3({c}))</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs down]</span></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo a1 a2 a3 a4</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs down]</span></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs down]</span></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo a1 a2 a3 a4 {c}</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs down]</span></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs down]</span></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo a1 a2 a3 a4 a5</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo(a1).a2(a3).a4(a5)</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs down]</span></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo a1() a2 a3() a4 a5()</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo(a1()).a2(a3()).a4(a5())</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs down]</span></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo a1 a2 a3 a4 a5 {c}</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>foo(a1).a2(a3).a4(a5({c})</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><span class="icon">[thumbs down]</span></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>The table shows enough to recognize the pattern. The attached block has a special role as it does not count as argument
+on its own directly. Instead the block is always bound to the identifier before and makes a method call.
+That itself is no command expression, but a normal method call expression. As can be seen too,
+this syntax nicely extends the existing Groovy syntax. Of course this also means, it will not be possible to omit
+commas if multiple arguments are used. A case that is not supported today anyway. For a DSL that is not really a problem though.</p>
+</div>
+<div class="sect3">
+<h4 id="_summary_of_the_pattern">Summary of the pattern</h4>
+<div class="ulist">
+<ul>
+<li>
+<p>A command-expression is composed of an even number of elements</p>
+</li>
+<li>
+<p>The elements are alternating a method name, and its parameters (can be named and non-named parameters)</p>
+</li>
+<li>
+<p>A parameter element can be any kind of expression (ie. a method call foo(), foo{}, or some expression like x+y)</p>
+</li>
+<li>
+<p>All those pairs of method name and parameters are actually chained method calls (ie. send "hello" to "Guillaume"
+is two methods chained one after the other as send("hello").to("Guillaume"))</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_interesting_benefit_of_the_enhanced_command_expressions">Interesting benefit of the enhanced command expressions</h4>
+<div class="paragraph">
+<p>More and more do we see Java Fluent APIs that chain method calls, returning this, so as to "build" a new object.
+For instance, you can imagine a fluent API for building an Email message, that would look something like this in Java:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>Email.from("foo@example.com").to("bar@example.com").subject("hello").body("how are you?")</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In Groovy, with the extended command expressions, this could become:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>Email.from "foo@example.com" to "bar@example.com" subject "hello" body "how are you?"</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Notice the absence of parentheses and dots.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_example_a_dsl_for_sql">Example: A DSL for SQL</h4>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>SELECT "column_name"
+FROM "table_name"
+WHERE "column_name" IN ('value1', 'value2', ...)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In current Groovy this could maybe expressed by</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>sql.select(
+  "column_name",
+  from:"table_name",
+  where:"column_name",
+  in:['value1','value2',...])</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>With this new command dsl you could also do</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>sql.
+  select "column_name" \\
+  from "table_name" \\
+  where "column_name" \\
+  in ['value1','value2',...]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>It should be noticed, that both cases have quite different semantics. In the second case the writer saves a lot of commas, but of course not all of them. Also the lack of any kind of operator like the comma makes it diifivult to span the DSL across multiple lines. A more extended example would be</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>SELECT COUNT("column_name")
+FROM "table_name"
+sql.select count("column_name") from "table_name"</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>To express this in map style is a bit difficult, because of where to place count&#8230;&#8203; a possible version is mabye</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>sql.select(sql.count("column_name"), from:"table_name"</code></pre>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_more_example_ideas">More example ideas</h4>
+<div class="paragraph">
+<p>Here are some additional examples which relate to various domains, which may make the idea more visual in our minds.
+These examples also mix named and non-named arguments, the use closures or not.
+In comments, alongside the example, you&#8217;ll see the equivalent non-command expression interpretation.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>sell 100.shares of MSFT // sell(100.shares).of(MSFT)
+every 10.minutes, execute {} // already possible with current command expressions
+schedule executionOf { ... } every 10.minutes // scheduler(executionOf({})).every(10.minutes)
+blend red, green of acrylic // blend(red, gree).of(acrylic)
+
+// named parameters into the mix
+select from: users where age &gt; 32 and sex == 'male'
+// equivalent to select(from: users).where(age &gt; 32).and(sex == 'male')
+// not that however for this example, it would be intersting
+// to transparently convert the boolean conditions into closure expressions!
+
+// a recipe DSL
+take mediumBowl
+combine soySauce, vinegar, chiliPowder, garlic
+place chicken in sauce
+turn once to coat
+marinate 30.minutes at roomTemperature</code></pre>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_extension_to_command_expressions_in_the_case_of_assignments">Extension to command expressions in the case of assignments</h4>
+<div class="paragraph">
+<p>Currently, command expressions are allowed as standalone top-leval statements or expressions, but you can&#8217;t assign such an expression to a variable with keeping that nice DSL syntax. For instance, while you can do:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>move left</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If you wanted to assign that command (which could return a Position instance), you would like to do</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>def newPosition = move left</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>But you still have to do</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>def newPosition = move(left)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>So the GEP-3 proposal also suggests we extend command expressions to be allowed on the RHS of assignments.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_differences_to_scala">Differences to Scala</h4>
+<div class="paragraph">
+<p>For historic reasons</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>println foo</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>has to be supported. This seems to not to be a valid version in Scala, since that would be interpreted as</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>println.foo</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>and not as</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>this.println foo</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>On the other hand</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>foo bar a1</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is interpreted as</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>foo.bar(a1)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>in Scala and is invalid in current Groovy as well as after this proposal. So it could be stated, that this proposal is less object oriented then Scala, because the DSL usually starts with the method, not the object. On the other hand it is possible to write</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>foo.bar a1</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>So the Groovy notation would be a bit more verbose, but not much.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_to_be_evaluated_mixed_case_with_explicit_parentheses">To be evaluated: Mixed case with explicit parentheses</h4>
+<div class="paragraph">
+<p>A possible supported case is also when mixing method calls with explicit parentheses within that extended command expression.
+The benefit would be to allow the ability to also be able to call methods not taking parameters, as well as allowing an odd number of "elements" (ie. a method name or a parameter).</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>m1 a m2 b m3()
+m1 a m2() m3 b
+m1() m2 a m3 b</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>would be respectively equivalent to:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>m1(a).m2(b).m3()
+m1(a).m2().m3(b)
+m1().m2(a).m3(b)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Note that the method calls with explicit parentheses could also take a number of arguments.
+For instance, this is also a valid mixed command expression:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>m1 a m2(1, 2, 3) m3 b</code></pre>
+</div>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_references_and_useful_links">References and useful links</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_jira_issues">JIRA issues:</h3>
+<div class="ulist">
+<ul>
+<li>
+<p>Implement GEP-3: extended command expressions <a href="https://issues.apache.org/jira/browse/GROOVY-4384">GROOVY-4384</a></p>
+</li>
+<li>
+<p>Ability to use (extended) command expression on the RHS <a href="https://issues.apache.org/jira/browse/GROOVY-4401">GROOVY-4401</a></p>
+</li>
+<li>
+<p>Allow zero-args methods in the chain of calls <a href="https://issues.apache.org/jira/browse/GROOVY-4402">GROOVY-4402</a></p>
+</li>
+<li>
+<p>Disambiguate cases where minus something or [] or {} are used as the argument of extended command expressions <a href="https://issues.apache.org/jira/browse/GROOVY-4403">GROOVY-4403</a></p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_update_history">Update history</h2>
+<div class="sectionbody">
+<div class="dlist">
+<dl>
+<dt class="hdlist1">1 (2009-06-17)</dt>
+<dd>
+<p>Version as extracted from Codehaus wiki</p>
+</dd>
+<dt class="hdlist1">2 (2018-10-11)</dt>
+<dd>
+<p>Numerous minor tweaks</p>
+</dd>
+</dl>
+</div>
+</div>
+</div></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='..\/download.html'>Download</a></li><li><a href='http://groovy-lang.org/support.html'>Support</a></li><li><a href='..\/'>Contribute</a></li><li><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='http://groovy-lang.org/security.html'>Security</a></li><li><a href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='http://groovy-lang.org/search.html'>Search</a></li>
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a href='http://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='http://groovy-lang.org/groovy-weekly.html'>Groovy newsletter</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='http://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li>
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community
+                                        </p><img src='..\img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' class='img-responsive'/>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2019 the Apache Groovy project &mdash; Groovy is Open Source, <a href='http://www.apache.org/licenses/LICENSE-2.0.html'>Apache 2 License</a></div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='..\js/vendor/jquery-1.10.2.min.js' defer></script><script src='..\js/vendor/classie.js' defer></script><script src='..\js/vendor/bootstrap.js' defer></script><script src='..\js/vendor/sidebarEffects.js' defer></script><script src='..\js/vendor/modernizr-2.6.2.min.js' defer></script><script src='..\js/plugins.js' defer></script><script src='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js'></script><script>document.addEventListener('DOMContentLoaded',prettyPrint)</script><script>
+          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file
diff --git a/wiki/GEP-4.html b/wiki/GEP-4.html
new file mode 100644
index 0000000..1e1da69
--- /dev/null
+++ b/wiki/GEP-4.html
@@ -0,0 +1,356 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><title>The Apache Groovy programming language - Developer docs - GEP-4</title><link href='..\img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='..\css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='..\css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='..\css/style.css'/><link rel='stylesheet' type='text/css' href='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.css'/>
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: 20px; right: -58px; border: 0; z-index: 100; transform: rotate(45deg);' src='/img/horizontal-github-ribbon.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/groovy-weekly.html' class='icon'><span class='fa fa-envelope-o'></span> Groovy newsletter</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+                <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span>
+                                    </button><a class='navbar-brand' href='..\index.html'>
+                                        <i class='fa fa-star'></i> Apache Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li class=''><a href='..\/download.html'>Download</a></li><li class=''><a href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='..\/'>Contribute</a></li><li class=''><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li>
+                                            <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='..\search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li class='active'><a href='#doc'>GEP-4</a></li><li><a href='#_abstract' class='anchor-link'>Abstract</a></li><li><a href='#_approach' class='anchor-link'>Approach</a></li><li><a href='#_references_and_useful_links' class='anchor-link'>References and useful links</a></li><li><a href='#_update_history' class='anchor-link'>Update history</a></li></ul></div><div class='col-lg-8 col-lg-pull-0'><a name='doc'></a><h1>GEP-4</h1><p>Author: <i/></p><hr/><div id="preamble">
+<div class="sectionbody">
+<div class="sidebarblock">
+<div class="content">
+<div class="title">Metadata</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+<strong>Number</strong>
+</td>
+<td class="hdlist2">
+<p>GEP-4</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Title</strong>
+</td>
+<td class="hdlist2">
+<p>AstBuilder AST Templates</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Version</strong>
+</td>
+<td class="hdlist2">
+<p>2</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Type</strong>
+</td>
+<td class="hdlist2">
+<p>Feature</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Status</strong>
+</td>
+<td class="hdlist2">
+<p>Rejected</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Comment</strong>
+</td>
+<td class="hdlist2">
+<p>The approach used in Groovy macros was pursued instead</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Leader</strong>
+</td>
+<td class="hdlist2">
+<p>Hamlet D&#8217;Arcy</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Created</strong>
+</td>
+<td class="hdlist2">
+<p>2010-02-16</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Last modification</strong>&#160;
+</td>
+<td class="hdlist2">
+<p>2018-10-12</p>
+</td>
+</tr>
+</table>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_abstract">Abstract</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The AstBuilder was introduced in Groovy 1.7 as a way to ease the task of writing AST transformations.
+The "fromCode" approach allows you generate the AST from a piece of code. Currently, the AstBuilder fromCode API
+accepts a closure as a parameter, and the code within the closure it transformed to AST.
+A limitation of the AstBuilder is that the closure parameter does not allow variables in the surrounding
+context to be referenced: there is no way to pass a parameter into the code block.
+It was initially discussed but the idea was deemed too much effort to fit into 1.7.</p>
+</div>
+<div class="paragraph">
+<p>This AST Template feature allows you to pass parameters into the AstBuilder.
+Similar to how a $ works in GString interpolation, there needs to be a way to bind a variable from the
+enclosing scope into an AstBuilder closure. The syntax proposed is to use oxford brackets (see below).
+An AstBuilder closure containing GEP 4 - AstBuilder AST Templates will have the variable within the brackets bound in.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_approach">Approach</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The oxford brackets are used to bind, or quasi-quote, variables from the enclosing scope into an AstBuilder parameter.</p>
+</div>
+<div class="paragraph">
+<p>Example 1: String concatenation</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>def constant = new ConstantExpression("World")
+List&lt;ASTNode&gt; greeting = AstBuilder.buildFromCode { "Hello" + [ | constant | ]  }</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Produces the AST</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>BlockStatement
+-&gt; ExpressionStatement
+   -&gt; BinaryExpression +
+      -&gt; ConstantExpresssion - Hello
+      -&gt; ConstantExpression - World</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Example 2: Producing a println</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>new AstBuilder().buildFromCode { println([ | message | ]) }[0]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is equivalent to invoking this method:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>private Statement createPrintlnAst(String message) {
+   return new ExpressionStatement(
+       new MethodCallExpression(
+           new VariableExpression("this"),
+           new ConstantExpression("println"),
+           new ArgumentListExpression(
+               new ConstantExpression(message)
+           )
+       )
+   )
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Example 3: Memoization of a method</p>
+</div>
+<div class="paragraph">
+<p>Presumably, you would have the existing method AST in a variable called "methodNode":</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>def methodNode = ...
+def parameters = methodNode.parameters
+
+def newMethod = new AstBuilder().buildFromCode {
+ if (cache.contains([ | parameters | ])) {
+   return cache.get([ | parameters | ])
+ }
+ def result = [ | methodNode.code | ]
+ cache.put([ | parameters | ])
+ return result
+}
+
+methodNode.code = newMethod[0]</code></pre>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_alternatives">Alternatives</h3>
+<div class="paragraph">
+<p>There are many syntax alternatives:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Lisp uses ´ and ,</p>
+</li>
+<li>
+<p>Template Haskell uses something similar to oxford brackets but with slightly different semantics</p>
+</li>
+<li>
+<p>Boo uses uses GEP 4 - AstBuilder AST Templates and $ but with slightly different semantics</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>A $ was considered but cannot be used as it is already a meaningful identifier.
+Boo Meta Method Comparison
+The Boo Metamethod feature overlaps with the Groovy AST Transformation features. Instead of an @AstTransformation interface with a seperately defined AstTransformation subclass, Boo offers Meta methods, where the AST Transformation is called and generated at compile time.</p>
+</div>
+<div class="paragraph">
+<p>While Groovy offers AstBuilder to turn code into AST, Boo uses the oxford brackets. And while GEP-4 proposed oxford brackets to signify an AST variable templating, Boo uses the $. Consider a simple println AST in Groovy</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>new AstBuilder().buildFromCode {
+    println([ | message | ])
+}[0]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Compared to a similar construct in Boo:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>[Meta]
+static def methodname(expr as Expression):
+    [| println($expr) |]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>GEP-4 proposes the opposite syntax from Boo: oxford brackets for AST Templating instead of the $. The $ is already a character in Java, and can be part of a variable name.</p>
+</div>
+<div class="paragraph">
+<p>There are no real drawbacks to having an opposite syntax. The number of Boo AST Transformation writers migrating to Groovy is most likely quite low.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_references_and_useful_links">References and useful links</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Mailing List Discussions</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>groovy-dev: <a href="https://groovy.markmail.org/thread/mgo3ze3uvn2jalz4">Groovy AstBuilder AST Templates</a></p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_update_history">Update history</h2>
+<div class="sectionbody">
+<div class="dlist">
+<dl>
+<dt class="hdlist1">1 (2010-02-16)</dt>
+<dd>
+<p>Version as extracted from Codehaus wiki</p>
+</dd>
+<dt class="hdlist1">2 (2018-10-14)</dt>
+<dd>
+<p>Numerous minor tweaks</p>
+</dd>
+</dl>
+</div>
+</div>
+</div></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='..\/download.html'>Download</a></li><li><a href='http://groovy-lang.org/support.html'>Support</a></li><li><a href='..\/'>Contribute</a></li><li><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='http://groovy-lang.org/security.html'>Security</a></li><li><a href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='http://groovy-lang.org/search.html'>Search</a></li>
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a href='http://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='http://groovy-lang.org/groovy-weekly.html'>Groovy newsletter</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='http://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li>
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community
+                                        </p><img src='..\img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' class='img-responsive'/>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2019 the Apache Groovy project &mdash; Groovy is Open Source, <a href='http://www.apache.org/licenses/LICENSE-2.0.html'>Apache 2 License</a></div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='..\js/vendor/jquery-1.10.2.min.js' defer></script><script src='..\js/vendor/classie.js' defer></script><script src='..\js/vendor/bootstrap.js' defer></script><script src='..\js/vendor/sidebarEffects.js' defer></script><script src='..\js/vendor/modernizr-2.6.2.min.js' defer></script><script src='..\js/plugins.js' defer></script><script src='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js'></script><script>document.addEventListener('DOMContentLoaded',prettyPrint)</script><script>
+          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file
diff --git a/wiki/GEP-5.html b/wiki/GEP-5.html
new file mode 100644
index 0000000..031d845
--- /dev/null
+++ b/wiki/GEP-5.html
@@ -0,0 +1,251 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><title>The Apache Groovy programming language - Developer docs - GEP-5</title><link href='..\img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='..\css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='..\css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='..\css/style.css'/><link rel='stylesheet' type='text/css' href='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.css'/>
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: 20px; right: -58px; border: 0; z-index: 100; transform: rotate(45deg);' src='/img/horizontal-github-ribbon.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/groovy-weekly.html' class='icon'><span class='fa fa-envelope-o'></span> Groovy newsletter</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+                <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span>
+                                    </button><a class='navbar-brand' href='..\index.html'>
+                                        <i class='fa fa-star'></i> Apache Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li class=''><a href='..\/download.html'>Download</a></li><li class=''><a href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='..\/'>Contribute</a></li><li class=''><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li>
+                                            <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='..\search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li class='active'><a href='#doc'>GEP-5</a></li><li><a href='#_abstract_what_is_a_file_extension_dependent_ast_transformations' class='anchor-link'>Abstract: What is a file extension dependent AST transformations?</a></li><li><a href='#_urls' class='anchor-link'>URLs</a></li><li><a href='#_update_history' class='anchor-link'>Update history</a></li></ul></div><div class='col-lg-8 col-lg-pull-0'><a name='doc'></a><h1>GEP-5</h1><p>Author: <i/></p><hr/><div id="preamble">
+<div class="sectionbody">
+<div class="sidebarblock">
+<div class="content">
+<div class="title">Metadata</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+<strong>Number</strong>
+</td>
+<td class="hdlist2">
+<p>GEP-5</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Title</strong>
+</td>
+<td class="hdlist2">
+<p>File extension dependent AST transformations</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Version</strong>
+</td>
+<td class="hdlist2">
+<p>2</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Type</strong>
+</td>
+<td class="hdlist2">
+<p>Feature</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Status</strong>
+</td>
+<td class="hdlist2">
+<p>Rejected</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Comment</strong>
+</td>
+<td class="hdlist2">
+<p>A general compiler configuration mechanism was adopted instead and delivered in Groovy 1.8</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Leader</strong>
+</td>
+<td class="hdlist2">
+<p>Alex Tkachman</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Created</strong>
+</td>
+<td class="hdlist2">
+<p>2010-02-26</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Last modification</strong>&#160;
+</td>
+<td class="hdlist2">
+<p>2018-10-12</p>
+</td>
+</tr>
+</table>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_abstract_what_is_a_file_extension_dependent_ast_transformations">Abstract: What is a file extension dependent AST transformations?</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>AST transformations is powerful tool for creating DSLs. Two ways to define AST transformations exist today - via annotation and global transformation, which apply to everything. This proposal introduce new type - transformations, which apply only to source files with given extension.</p>
+</div>
+<div class="paragraph">
+<p>Such approach gives possibility to have better and unified way to organize code base containing groovy based DSLs.</p>
+</div>
+<div class="sect2">
+<h3 id="_how_to_implement">How to implement?</h3>
+<div class="paragraph">
+<p>There are two problems to be addressed:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>how to make AST transformation extension aware</p>
+</li>
+<li>
+<p>how to make Groovyc or FileSystemCompiler or even IDE aware about additional (to *.groovy) extensions to be compiled
+Interesting that first problem doesn&#8217;t require any specific handling at all. Global AST transformation can use name of SourceUnit to filter what files to process.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>For second problem file <code>META-INF/services/org.codehaus.groovy.transform.ASTTransformation</code> where global AST transformations normally defined can be used. To keep things backward compatible following syntax is suggested</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>#files:&lt;ext1&gt;,&lt;ext2&gt;...</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The main benefit of using configuration files are:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>new frameworks using AST based transformations make compiler aware about files to be compiled just by dropping in to classpath</p>
+</li>
+<li>
+<p>it is very easy for any incarnation of compiler (FileSystemCompiler or Groovyc or whatever) to scan classpath and find extensions to be compiled</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_urls">URLs</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p><a href="https://groovy.markmail.org/thread/jahqbj6su5ddvuah">groovy-dev: GEP 5 - file extension based AST transformations</a></p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_update_history">Update history</h2>
+<div class="sectionbody">
+<div class="dlist">
+<dl>
+<dt class="hdlist1">1 (2010-02-16)</dt>
+<dd>
+<p>Version as extracted from Codehaus wiki</p>
+</dd>
+<dt class="hdlist1">2 (2018-10-14)</dt>
+<dd>
+<p>Numerous minor tweaks</p>
+</dd>
+</dl>
+</div>
+</div>
+</div></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='..\/download.html'>Download</a></li><li><a href='http://groovy-lang.org/support.html'>Support</a></li><li><a href='..\/'>Contribute</a></li><li><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='http://groovy-lang.org/security.html'>Security</a></li><li><a href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='http://groovy-lang.org/search.html'>Search</a></li>
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a href='http://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='http://groovy-lang.org/groovy-weekly.html'>Groovy newsletter</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='http://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li>
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community
+                                        </p><img src='..\img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' class='img-responsive'/>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2019 the Apache Groovy project &mdash; Groovy is Open Source, <a href='http://www.apache.org/licenses/LICENSE-2.0.html'>Apache 2 License</a></div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='..\js/vendor/jquery-1.10.2.min.js' defer></script><script src='..\js/vendor/classie.js' defer></script><script src='..\js/vendor/bootstrap.js' defer></script><script src='..\js/vendor/sidebarEffects.js' defer></script><script src='..\js/vendor/modernizr-2.6.2.min.js' defer></script><script src='..\js/plugins.js' defer></script><script src='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js'></script><script>document.addEventListener('DOMContentLoaded',prettyPrint)</script><script>
+          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file
diff --git a/wiki/GEP-6.html b/wiki/GEP-6.html
new file mode 100644
index 0000000..12677af
--- /dev/null
+++ b/wiki/GEP-6.html
@@ -0,0 +1,312 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><title>The Apache Groovy programming language - Developer docs - GEP-6</title><link href='..\img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='..\css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='..\css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='..\css/style.css'/><link rel='stylesheet' type='text/css' href='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.css'/>
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: 20px; right: -58px; border: 0; z-index: 100; transform: rotate(45deg);' src='/img/horizontal-github-ribbon.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/groovy-weekly.html' class='icon'><span class='fa fa-envelope-o'></span> Groovy newsletter</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+                <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span>
+                                    </button><a class='navbar-brand' href='..\index.html'>
+                                        <i class='fa fa-star'></i> Apache Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li class=''><a href='..\/download.html'>Download</a></li><li class=''><a href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='..\/'>Contribute</a></li><li class=''><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li>
+                                            <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='..\search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li class='active'><a href='#doc'>GEP-6</a></li><li><a href='#_abstract' class='anchor-link'>Abstract</a></li><li><a href='#_approach' class='anchor-link'>Approach</a></li><li><a href='#_references_and_useful_links' class='anchor-link'>References and useful links</a></li><li><a href='#_update_history' class='anchor-link'>Update history</a></li></ul></div><div class='col-lg-8 col-lg-pull-0'><a name='doc'></a><h1>GEP-6</h1><p>Author: <i/></p><hr/><div id="preamble">
+<div class="sectionbody">
+<div class="sidebarblock">
+<div class="content">
+<div class="title">Metadata</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+<strong>Number</strong>
+</td>
+<td class="hdlist2">
+<p>GEP-6</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Title</strong>
+</td>
+<td class="hdlist2">
+<p>NIO2 Support for Groovy</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Version</strong>
+</td>
+<td class="hdlist2">
+<p>2</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Type</strong>
+</td>
+<td class="hdlist2">
+<p>Feature</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Status</strong>
+</td>
+<td class="hdlist2">
+<p>Final</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Comment</strong>
+</td>
+<td class="hdlist2">
+<p>Delivered in Groovy 2.3</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Leader</strong>
+</td>
+<td class="hdlist2">
+<p>Merlyn Albery-Speyer/Hamlet D&#8217;Arcy</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Created</strong>
+</td>
+<td class="hdlist2">
+<p>2010-09-25</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Last modification</strong>&#160;
+</td>
+<td class="hdlist2">
+<p>2018-10-12</p>
+</td>
+</tr>
+</table>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_abstract">Abstract</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>JDK 7 includes a new java.nio.file package and Path class.
+These provide extended capabilities for filesystem tasks.
+We should explore incorporation into Groovy.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_approach">Approach</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>I propose:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Create an openjdk7 build of Groovy</p>
+</li>
+<li>
+<p>Move NIO2 support to a Groovy Module for now</p>
+</li>
+<li>
+<p>Move NIO2 Groovy Module to Groovy-core when JDK7 is officially released</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>JDK7 is still in beta. It is subject to change. If we build NIO2 support into Groovy today and make a release,
+then we risk having JDK7 make an API change, which would force us to support 2 different APIs. That would be bad.</p>
+</div>
+<div class="sect2">
+<h3 id="_todo_in_groovy_nio_module">Todo in Groovy NIO Module:</h3>
+<div class="ulist">
+<ul>
+<li>
+<p>Support new Path object</p>
+</li>
+<li>
+<p>All of the GDK File API needs to be on Path</p>
+</li>
+<li>
+<p>NIO2 contains a new WatchService API. We need to probably provide a GDK on WatchService to make it easy to work
+with using closures, etc. This is the most interesting piece of work IMO.</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_todo_in_groovy_core">Todo in Groovy Core:</h3>
+<div class="paragraph">
+<p>Groovy has a FileNameFinder and FileNameRegExFinder. This stuff needs to work with Paths as well:
+<a href="http://mrhaki.blogspot.com/2009/11/groovy-goodness-finding-files-with.html" class="bare">http://mrhaki.blogspot.com/2009/11/groovy-goodness-finding-files-with.html</a></p>
+</div>
+<div class="paragraph">
+<p>I haven&#8217;t looked at each file in this list yet, but we need to analyze these Groovy source files and see if
+any parallel Path implementations are needed. The first 3 files look like the most important:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>./groovy/util/IFileNameFinder.java
+./groovy/io/FileType.java
+./groovy/io/FileVisitResult.java
+./org/codehaus/groovy/runtime/WritableFile.java
+./org/codehaus/groovy/ant/FileIterator.java
+./org/codehaus/groovy/ant/FileScanner.java
+./org/codehaus/groovy/control/io/FileReaderSource.java</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>I couldn&#8217;t find any instances of this in Groovy-core, but any <code>asType(File)</code> methods need a parallel
+<code>asType(Path)</code> - I believe <code>asWritable(Path)</code> is the only change required. In NIO2, I believe <code>File.list</code>
+and another method now return an iterator, which enables this method to work better over networks.
+We need to update the File GDK to use this approach by default to also support network dir or ls style listings.
+NIO2 has a new <code>FileVisitor</code> class. We need to unify this new <code>FileVisitor</code> JDK method with what Groovy does
+today in with GDK with the <code>.eachFile</code> method. As well as the <code>.eachFileXXX</code> methods and the <code>.eachDirXXX</code>
+methods we should include the <code>.traverse</code> method when looking through potential places for unification.
+The <code>.traverse</code> method&#8217;s primary role was to make some <code>FileVisitor</code> like functionality available in the pre-JDK 7
+world but having NIO2 there might open up some more possibilities. There was also some thought at the time of having
+additional overloaded traverse methods with a more statically typed flavor rather than just the current Map solution.
+I guess now is a good time to also look at that option.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_references_and_useful_links">References and useful links</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_mailing_list_discussions">Mailing-list discussions</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://markmail.org/thread/osst6q4obk56fxqg">groovy-dev: OpenJDK 7 Groovy Build and NIO2 support</a></p>
+</li>
+<li>
+<p><a href="https://docs.oracle.com/javase/8/docs/technotes/guides/io/index.html">Java I/O, NIO and NIO.2</a></p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_jira_issues">JIRA issues</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://issues.apache.org/jira/browse/GROOVY-4390">GROOVY-4390: Add GDK File methods to the NIO2 API</a></p>
+</li>
+<li>
+<p><a href="https://issues.apache.org/jira/browse/GROOVY-4391">GROOVY-4391: Groovy build fails test target using Java 1.7.0</a></p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_update_history">Update history</h2>
+<div class="sectionbody">
+<div class="dlist">
+<dl>
+<dt class="hdlist1">1 (2010-02-16)</dt>
+<dd>
+<p>Version as extracted from Codehaus wiki</p>
+</dd>
+<dt class="hdlist1">2 (2018-10-14)</dt>
+<dd>
+<p>Numerous minor tweaks</p>
+</dd>
+</dl>
+</div>
+</div>
+</div></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='..\/download.html'>Download</a></li><li><a href='http://groovy-lang.org/support.html'>Support</a></li><li><a href='..\/'>Contribute</a></li><li><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='http://groovy-lang.org/security.html'>Security</a></li><li><a href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='http://groovy-lang.org/search.html'>Search</a></li>
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a href='http://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='http://groovy-lang.org/groovy-weekly.html'>Groovy newsletter</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='http://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li>
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community
+                                        </p><img src='..\img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' class='img-responsive'/>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2019 the Apache Groovy project &mdash; Groovy is Open Source, <a href='http://www.apache.org/licenses/LICENSE-2.0.html'>Apache 2 License</a></div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='..\js/vendor/jquery-1.10.2.min.js' defer></script><script src='..\js/vendor/classie.js' defer></script><script src='..\js/vendor/bootstrap.js' defer></script><script src='..\js/vendor/sidebarEffects.js' defer></script><script src='..\js/vendor/modernizr-2.6.2.min.js' defer></script><script src='..\js/plugins.js' defer></script><script src='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js'></script><script>document.addEventListener('DOMContentLoaded',prettyPrint)</script><script>
+          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file
diff --git a/wiki/GEP-7.html b/wiki/GEP-7.html
new file mode 100644
index 0000000..19984c5
--- /dev/null
+++ b/wiki/GEP-7.html
@@ -0,0 +1,405 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><title>The Apache Groovy programming language - Developer docs - GEP-7</title><link href='..\img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='..\css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='..\css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='..\css/style.css'/><link rel='stylesheet' type='text/css' href='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.css'/>
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: 20px; right: -58px; border: 0; z-index: 100; transform: rotate(45deg);' src='/img/horizontal-github-ribbon.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/groovy-weekly.html' class='icon'><span class='fa fa-envelope-o'></span> Groovy newsletter</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+                <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span>
+                                    </button><a class='navbar-brand' href='..\index.html'>
+                                        <i class='fa fa-star'></i> Apache Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li class=''><a href='..\/download.html'>Download</a></li><li class=''><a href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='..\/'>Contribute</a></li><li class=''><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li>
+                                            <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='..\search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li class='active'><a href='#doc'>GEP-7</a></li><li><a href='#_abstract_json_support' class='anchor-link'>Abstract: JSON Support</a></li><li><a href='#_rationale' class='anchor-link'>Rationale</a></li><li><a href='#_references_and_useful_links' class='anchor-link'>References and useful links</a></li><li><a href='#_update_history' class='anchor-link'>Update history</a></li></ul></div><div class='col-lg-8 col-lg-pull-0'><a name='doc'></a><h1>GEP-7</h1><p>Author: <i/></p><hr/><div id="preamble">
+<div class="sectionbody">
+<div class="sidebarblock">
+<div class="content">
+<div class="title">Metadata</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+<strong>Number</strong>
+</td>
+<td class="hdlist2">
+<p>GEP-7</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Title</strong>
+</td>
+<td class="hdlist2">
+<p>JSON Support</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Version</strong>
+</td>
+<td class="hdlist2">
+<p>4</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Type</strong>
+</td>
+<td class="hdlist2">
+<p>Feature</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Status</strong>
+</td>
+<td class="hdlist2">
+<p>Final</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Comment</strong>
+</td>
+<td class="hdlist2">
+<p>Delivered in Groovy 1.8</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Leader</strong>
+</td>
+<td class="hdlist2">
+<p>Guillaume Laforge</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Contributors</strong>
+</td>
+<td class="hdlist2">
+<p>Andres Almiray</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Created</strong>
+</td>
+<td class="hdlist2">
+<p>2010-10-25</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Last modification</strong>&#160;
+</td>
+<td class="hdlist2">
+<p>2018-10-12</p>
+</td>
+</tr>
+</table>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_abstract_json_support">Abstract: JSON Support</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Provide a builder/slurper combination for handling data in JSON format in a similar fashion as it&#8217;s already done for XML.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_rationale">Rationale</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>JSON has become ubiquitous to the web. RESTful services exchange data in both POX (Plain Old XML) and JSON formats.
+Groovy has excellent support for producing/consuming XML with MarkupBuilder, XmlSlurper and XmlParser but lacks this
+kind support for JSON. This GEP strives to remedy the situation, by providing a compatible builder approach.</p>
+</div>
+<div class="sect2">
+<h3 id="_producing_json">Producing JSON</h3>
+<div class="paragraph">
+<p>The following builder syntax is proposed</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>def builder = new groovy.json.JsonBuilder()
+def root = builder.people {
+    person {
+        firstName 'Guillame'
+        lastName 'Laforge'
+        // Maps are valid values for objects too
+        address(
+            city: 'Paris',
+            country: 'France',
+            zip: 12345,
+        )
+        married true
+        conferences 'JavaOne', 'Gr8conf'
+    }
+}
+
+// creates a data structure made of maps (Json object) and lists (Json array)
+assert root instanceof Map
+
+println builder.toString()
+
+// prints (without formatting)
+{"people": {
+    "person": {
+        "firstName": "Guillaume",
+        "lastName": "Laforge",
+        "address": {
+           "city": "Paris",
+           "country": "France",
+           "zip": 12345
+        },
+        "married": true,
+        "conferences": [
+            "JavaOne",
+            "Gr8conf"
+        ]
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Valid node values are: <code>Number</code>, <code>String</code>, <code>GString</code>, <code>Boolean</code>, <code>Map</code>, <code>List</code>. <code>null</code> is reserved for object references.
+Arrays can not be null but they can be empty. Anything else results in an IAE (or a more specialized exception) being thrown.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_special_cases">Special cases</h3>
+<div class="paragraph">
+<p>There is a special case to be considered: when the top node results in an anonymous object or array.
+or objects a call() method on the builder is needed which takes a map as argument, for arrays call() takes a vararg of values. Here are some examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>builder.foo "foo"
+// produces
+{foo: "foo"}</code></pre>
+</div>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>builder([{
+  foo 'foo'
+}])
+// produces
+[{"foo": "foo"}]</code></pre>
+</div>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>builder([[
+  foo: 'foo'
+]])
+// produces, same as above
+[{"foo": "foo"}]</code></pre>
+</div>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>builder {
+    elem 1, 2, 3
+}
+// produces
+{ "elem": [1, 2, 3] }</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>When a method is called on the builder without arguments, and empty JSON object is associated with the key:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>builder.element()
+// produces
+{ "element": {} }</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>You can also pass a map and a closure argument:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>builder.person(name: "Guillaume", age: 33) { town "Paris" }
+
+// produces
+{"name": "Guillaume", "age": 33, "town": "Paris}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Calls like the following, with a map and a value, don&#8217;t have any meaningful representation in JSON (unlike in XML), and triggers a JsonException:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>shouldFail(JsonException) {
+    builder.elem(a: 1, b: 2, "some text value")
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In case of overlapping keys in the map and the closure, the closure wins – a visual clue for this rule is that the closure appears "after" the map key/value pairs.</p>
+</div>
+<div class="paragraph">
+<p>Consuming JSON
+The proposal is for the creation of a JsonSlurper class that can read JSON from a string (in a non-streaming fashion) and produce a hierarchy of maps and lists representing the JSON objects and arrays respectively.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>String json = '{"person": {"firstName": "Guillaume", "lastName": "Laforge", "conferences": ["JavaOne", "Gr8conf"]}}'
+def root = new JsonSlurper().parseText(json)
+assert root instanceof Map
+assert root.person.conferences instanceof List
+assert root.person.firstName == 'Guillaume'
+assert root.person.conferences[1] == 'Gr8conf'</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>JsonSlurper&#8217;s API should mirror closely what XmlParser/XmlSlurper offers in terms of its parse* method variants.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_references_and_useful_links">References and useful links</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>JSON Spec and Java implementations</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="http://json.org/">json.org</a></p>
+</li>
+<li>
+<p><a href="http://tools.ietf.org/html/rfc4627">RFC-4627</a></p>
+</li>
+<li>
+<p><a href="http://json-lib.sourceforge.net/">json-lib</a></p>
+</li>
+</ul>
+</div>
+<div class="sect2">
+<h3 id="_mailing_list_discussions">Mailing-list discussions</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://markmail.org/thread/5ofqwr6t33okyh6g">groovy-dev: Built-in JSON support in 1.8</a></p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_jira_issues">JIRA issues</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://issues.apache.org/jira/browse/GROOVY-4644">GROOVY-4644: JSON support: provide a parser and a builder for JSON content</a></p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_update_history">Update history</h2>
+<div class="sectionbody">
+<div class="dlist">
+<dl>
+<dt class="hdlist1">3 (2011-02-02)</dt>
+<dd>
+<p>Version as extracted from Codehaus wiki</p>
+</dd>
+<dt class="hdlist1">4 (2018-10-16)</dt>
+<dd>
+<p>Numerous minor tweaks</p>
+</dd>
+</dl>
+</div>
+</div>
+</div></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='..\/download.html'>Download</a></li><li><a href='http://groovy-lang.org/support.html'>Support</a></li><li><a href='..\/'>Contribute</a></li><li><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='http://groovy-lang.org/security.html'>Security</a></li><li><a href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='http://groovy-lang.org/search.html'>Search</a></li>
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a href='http://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='http://groovy-lang.org/groovy-weekly.html'>Groovy newsletter</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='http://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li>
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community
+                                        </p><img src='..\img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' class='img-responsive'/>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2019 the Apache Groovy project &mdash; Groovy is Open Source, <a href='http://www.apache.org/licenses/LICENSE-2.0.html'>Apache 2 License</a></div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='..\js/vendor/jquery-1.10.2.min.js' defer></script><script src='..\js/vendor/classie.js' defer></script><script src='..\js/vendor/bootstrap.js' defer></script><script src='..\js/vendor/sidebarEffects.js' defer></script><script src='..\js/vendor/modernizr-2.6.2.min.js' defer></script><script src='..\js/plugins.js' defer></script><script src='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js'></script><script>document.addEventListener('DOMContentLoaded',prettyPrint)</script><script>
+          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file
diff --git a/wiki/GEP-8.html b/wiki/GEP-8.html
new file mode 100644
index 0000000..abf207f
--- /dev/null
+++ b/wiki/GEP-8.html
@@ -0,0 +1,680 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><title>The Apache Groovy programming language - Developer docs - GEP-8</title><link href='..\img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='..\css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='..\css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='..\css/style.css'/><link rel='stylesheet' type='text/css' href='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.css'/>
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: 20px; right: -58px; border: 0; z-index: 100; transform: rotate(45deg);' src='/img/horizontal-github-ribbon.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/groovy-weekly.html' class='icon'><span class='fa fa-envelope-o'></span> Groovy newsletter</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+                <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span>
+                                    </button><a class='navbar-brand' href='..\index.html'>
+                                        <i class='fa fa-star'></i> Apache Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li class=''><a href='..\/download.html'>Download</a></li><li class=''><a href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='..\/'>Contribute</a></li><li class=''><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li>
+                                            <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='..\search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li class='active'><a href='#doc'>GEP-8</a></li><li><a href='#_abstract_static_type_checking' class='anchor-link'>Abstract: Static Type Checking</a></li><li><a href='#_rationale_static_type_checking_vs_static_compilation' class='anchor-link'>Rationale: Static Type Checking vs Static compilation</a></li><li><a href='#_references_and_useful_links' class='anchor-link'>References and useful links</a></li><li><a href='#_update_history' class='anchor-link'>Update history</a></li></ul></div><div class='col-lg-8 col-lg-pull-0'><a name='doc'></a><h1>GEP-8</h1><p>Author: <i/></p><hr/><div id="preamble">
+<div class="sectionbody">
+<div class="sidebarblock">
+<div class="content">
+<div class="title">Metadata</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+<strong>Number</strong>
+</td>
+<td class="hdlist2">
+<p>GEP-8</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Title</strong>
+</td>
+<td class="hdlist2">
+<p>Static type checking</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Version</strong>
+</td>
+<td class="hdlist2">
+<p>9</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Type</strong>
+</td>
+<td class="hdlist2">
+<p>Feature</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Status</strong>
+</td>
+<td class="hdlist2">
+<p>Final</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Comment</strong>
+</td>
+<td class="hdlist2">
+<p>Delivered in Groovy 2.0 and enhanced in later versions</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Leader</strong>
+</td>
+<td class="hdlist2">
+<p>Cédric Champeau</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Created</strong>
+</td>
+<td class="hdlist2">
+<p>2011-10-08</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Last modification</strong>&#160;
+</td>
+<td class="hdlist2">
+<p>2018-10-12</p>
+</td>
+</tr>
+</table>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_abstract_static_type_checking">Abstract: Static Type Checking</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>This GEP introduces a new feature in the language known as static type checking.
+It is often disturbing for developers coming from a statically typed language (say Java)
+to discover that the Groovy compiler will not complain at compile time:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>when assignments are made on different types</p>
+</li>
+<li>
+<p>when a method doesn&#8217;t exist</p>
+</li>
+<li>
+<p>when a property or variable doesn&#8217;t exist</p>
+</li>
+<li>
+<p>when returned object type doesn&#8217;t match the method signature</p>
+</li>
+<li>
+<p>&#8230;&#8203;</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>All those are silent because the dynamic nature of the Groovy language makes such code perfectly valid.
+However, in some situations, a developer may want Groovy to behave like a statically typed language
+and have the compiler give hints about such "errors". To do this, Groovy must introduce static type checking.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_rationale_static_type_checking_vs_static_compilation">Rationale: Static Type Checking vs Static compilation</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>It is important to make the difference between static type checking and static compilation.
+The goal of this GEP is to have an option to turn static type checking (STC) on.
+If STC is activated, the compiler will be more verbose (you will also see the term "grumpy"),
+but in the end, the generated bytecode and runtime behaviour will be exactly the same as if you
+did not activate this mode. This is a major difference from an alternate compiler like Groovy++
+which will perform STC then produce a different bytecode and therefore produce different runtime semantics.
+The scope of this GEP is only a static type checker, and therefore should only be considered as a
+feature which allows developers to write statically checked code, so is an elegant way for example
+to leverage the Groovy syntax to reduce verbosity of Java code while still getting strongly checked code.
+Eventually, IDE could support the STC mode and provide information to the developer.</p>
+</div>
+<div class="sect2">
+<h3 id="_implementation_details">Implementation details</h3>
+<div class="sect3">
+<h4 id="_development_branch">Development branch</h4>
+<div class="paragraph">
+<p>Since Groovy 2.0-beta-2, code has been merged into master branch. However, if heavy developments are
+done on the type checker, it is advisable to work on the grumpy branch. It adds an AST transformation
+named TypeChecked. If set, then the AST transformation will perform type inference and store type
+information in AST nodes metadata. Eventually, if errors are found, it will add errors to the compiler
+through a dedicated addStaticTypeError method which basically does the same as the traditional
+addError method but prefixes the messages with a "Static type checking" message.
+This is done to help the developer determine whether the error he is seeing is a "plain Groovy" error,
+or an error thrown by the STC mode.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_the_statictypecheckingtestcase_class">The StaticTypeCheckingTestCase class</h4>
+<div class="paragraph">
+<p>Static type checking behaviour must be tested. As there are tons of possible checks to be done,
+a base test class provides a framework for testing this mode.
+Unit tests for static type checking should override this class.</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_decisions_made">Decisions made</h3>
+<div class="sect3">
+<h4 id="_about_this_section">About this section</h4>
+<div class="paragraph">
+<p>The goal of this section is to provide code samples which demonstrates in what case the STC transformation
+will actually complain and what is the expected error message, and serves as a basis to future STC documentation.
+This section may not be up-to-date, and one should always take a look at the STC unit tests found in the
+<code>src/test/groovy/transform/stc</code> directory.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 25%;">
+<col style="width: 25%;">
+<col style="width: 25%;">
+<col style="width: 25%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Feature</th>
+<th class="tableblock halign-left valign-top">Example</th>
+<th class="tableblock halign-left valign-top">Behavior</th>
+<th class="tableblock halign-left valign-top">Status</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Method does not exist</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>def method() {
+  ...
+}
+methode() // typo</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Complains about undefined method</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implemented</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Property does not exist</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>class A {
+  int x
+}
+A obj = new A()
+a.y = 2</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Complains about undefined property "y"</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implemented</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Assignment type checking</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>int x = 2
+x = 'String'</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Assigning a String to an int is forbidden</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implemented</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Incompatible binary expressions</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>1 + 'string'</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Checks that arguments of a binary expression are compatible (here, no 'plus' method is available</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implemented</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Possible loss of precision (1/2)</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>long myLong = ...
+int myInt = myLong</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Complains about possible loss of precision</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implemented</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Possible loss of precision (2/2)</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>int myInt = 2L</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Will not complain because '2' can be represented as an int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implemented</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Arrays components</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>String[] arr = { '1', '2', '3' }
+arr[2] = 200</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Cannot assign an int value in an array of type String[]</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implemented</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Method return type check</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>String method() { 'Hello' }
+int x = method() // return types don't match</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Ensures that assignments are compatible with method return type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implemented</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Explicit return type checking</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>int method() {
+  return 'String' // return type is not compatible
+}</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Ensures that returned value is compatible with declared return type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implemented</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implicit return type checking</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>int method() {
+  'String' // return type is not compatible
+}</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Ensures that returned value is compatible with declared return type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implemented</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implicit toString()</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>String method(String name) {
+  StringBuilder sb = new StringBuilder()
+  sb 'Hi ' &lt;&lt; name &lt;&lt; '!'
+}</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implicit call to toString()</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implemented</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Basic type inference</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>def str = 'My string'
+str.toUpperCase() // type of 'str' is inferred</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Method calls as well as property access are checked against inferred type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implemented</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Basic flow analysis</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>def o
+...
+if (o instanceof String) {
+  o.toUpperCase() // no explicit cast required
+}</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Casts should not be necessary when type can be inferred from a previous instanceof check</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implemented</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">DefaultGroovyMethods support</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>'123'.toInteger() // toInteger() is a Groovy extension method</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Method calls can be resolved against Groovy extension methods</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implemented</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">with</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>class A {
+  int x
+}
+def a = new A()
+a.with {
+  x = 1
+}</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Method calls can be resolved against Groovy extension methods</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implemented</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Categories</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>use (MyStringCategory) {
+   'string'.methodInStringCategory()
+}</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Compiler should be aware that extension method is found in a category</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>N/A</strong> (support will be limited as category support is inherently dynamic)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Groovy list constructor</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>Dimension d = [100, 200]</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Type checks the arguments and the number of arguments</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implemented</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Groovy map constructor</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>Bean myBean = [x: 100, y: 200]</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Type checks the properties and checks for incorrect property names</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implemented</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Closure parameter types</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>def closure = { int x, int y -&gt; x + y }
+closure(1, 2)
+closure('1', '2') // complains</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Type checking the arguments when calling a closure</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implemented</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Closure return type inference</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>def closure = { int x, int y -&gt; x + y }
+int sum = closure(1, 2)</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Closure return type can be inferred from block</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implemented</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Method return type inference</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>def method(int x, int y) { x + y }
+int sum = method(1, 2)</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Return type can be inferred from a method if the method is itself annotated with @TypeChecked (or class is annotated with @TypeChecked)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implemented</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Multiple assignments</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>def (x, y) = [1, 2]</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">In case of inline declaration, type check arguments</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implemented</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Multiple assignments from a variable</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>def (x, y) = list</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">In case of inline declaration, type check arguments</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implemented</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Generics</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>List&lt;String&gt; list = []
+List&lt;String&gt; list = ['a', 'b', 'c']
+List&lt;String&gt; list = [1, 2, 3] // should throw error</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Type checking of generic parameters</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implemented</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Spread operator</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>def list = ['a', 'b', 'c']
+list*.toUpperCase()</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Type checking against component type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implemented</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Closure shared variables</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
+<div class="content">
+<pre>def x = new Date()
+def cl = { x = 'hello' }
+cl()
+x.toUpperCase() // should throw an error because the toUpperCase() method doesn't belong to both Date and String classes</pre>
+</div>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Type check assignments of closure shared variables. The type checker is required to perform a two-pass verification,
+in order to check that method calls on a closure shared variables belong to the lowest upper bound of all assignment types.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implemented</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_open_discussions">Open discussions</h3>
+<div class="sect3">
+<h4 id="_closure_parameter_type_inference">Closure parameter type inference</h4>
+<div class="paragraph">
+<p>With the current version of the checker, idiomatic constructs like :</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>['a','b','c'].collect { it.toUpperCase() }</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Are not properly recognized. You have to explicitly set the type of the "it" parameter inside the closure.
+It is because the expected parameter types of closures are unknown at compile time.
+There is a discussion about how to add this type information to source code so that the inference
+engine can deal with them properly. The implementation of closure parameter type inference requires
+a change to the method signatures. It will probably not belong to the initial release of the type checker.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_unification_types">Unification Types</h4>
+<div class="paragraph">
+<p>In cases of for example <code>x instanceof A || x instanceof B</code> with A and B being unrelated we could
+still make an artificial union kind of type, that contains everything present in A and B,
+to allow those kinds of method calls. The alternative to this is to allow only methods from Object here,
+which is less interesting. This typing can also be used for multicatch, ensuring that a method call is
+only valid if it exists on each of the exceptions for the multicatch.
+In the current implementation (2011-10-14) the multicatch is already expanded at the point @TypeChecked will check.
+Meaning effectively this already represents a kind of union type, as the same code is in each catch block
+and thus the method call would fail, if the method is not available on each type.
+The proposed behaviour is therefore to align the instanceof case with multicatch.</p>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_references_and_useful_links">References and useful links</h2>
+<div class="sectionbody">
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://web.archive.org/web/20150508041021/http://docs.codehaus.org/display/GroovyJSR/GEP+8+-+Static+type+checking">GEP-8: Static type checking</a> (web archive link with comments)</p>
+</li>
+<li>
+<p><a href="http://blackdragsview.blogspot.com/2011/10/flow-sensitive-typing.html">Flow Sensitive Typing?</a></p>
+</li>
+<li>
+<p><a href="https://web.archive.org/web/20150508040745/http://www.jroller.com/melix/entry/groovy_static_type_checker_status">Groovy static type checker: status update</a> (web archive)</p>
+</li>
+</ul>
+</div>
+<div class="sect2">
+<h3 id="_mailing_list_discussions">Mailing-list discussions</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://markmail.org/thread/reou7z35nk64cai5">groovy-user: What to do on assignment?</a> Discussion about the expected behaviour when STC detects a potential error on assignment (for example, possible loose of precision on implicit number casts)</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_jira_issues">JIRA issues</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://issues.apache.org/jira/browse/GROOVY-5073">GROOVY-5073: GEP-8 - Static type checking</a></p>
+</li>
+<li>
+<p><a href="https://issues.apache.org/jira/browse/GROOVY-3014">GROOVY-3014: add an annotation that forces the compiler to check methods for their existence at compile time</a></p>
+</li>
+<li>
+<p><a href="https://issues.apache.org/jira/browse/GROOVY-5081">GROOVY-5081: Handle explicit and implicit returns</a></p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_update_history">Update history</h2>
+<div class="sectionbody">
+<div class="dlist">
+<dl>
+<dt class="hdlist1">8 (2012-02-21)</dt>
+<dd>
+<p>Version as extracted from Codehaus wiki</p>
+</dd>
+<dt class="hdlist1">9 (2018-10-16)</dt>
+<dd>
+<p>Numerous minor tweaks</p>
+</dd>
+</dl>
+</div>
+</div>
+</div></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='..\/download.html'>Download</a></li><li><a href='http://groovy-lang.org/support.html'>Support</a></li><li><a href='..\/'>Contribute</a></li><li><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='http://groovy-lang.org/security.html'>Security</a></li><li><a href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='http://groovy-lang.org/search.html'>Search</a></li>
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a href='http://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='http://groovy-lang.org/groovy-weekly.html'>Groovy newsletter</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='http://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li>
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community
+                                        </p><img src='..\img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' class='img-responsive'/>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2019 the Apache Groovy project &mdash; Groovy is Open Source, <a href='http://www.apache.org/licenses/LICENSE-2.0.html'>Apache 2 License</a></div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='..\js/vendor/jquery-1.10.2.min.js' defer></script><script src='..\js/vendor/classie.js' defer></script><script src='..\js/vendor/bootstrap.js' defer></script><script src='..\js/vendor/sidebarEffects.js' defer></script><script src='..\js/vendor/modernizr-2.6.2.min.js' defer></script><script src='..\js/plugins.js' defer></script><script src='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js'></script><script>document.addEventListener('DOMContentLoaded',prettyPrint)</script><script>
+          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file
diff --git a/wiki/GEP-9.html b/wiki/GEP-9.html
new file mode 100644
index 0000000..6900129
--- /dev/null
+++ b/wiki/GEP-9.html
@@ -0,0 +1,534 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><title>The Apache Groovy programming language - Developer docs - GEP-9</title><link href='..\img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='..\css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='..\css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='..\css/style.css'/><link rel='stylesheet' type='text/css' href='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.css'/>
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: 20px; right: -58px; border: 0; z-index: 100; transform: rotate(45deg);' src='/img/horizontal-github-ribbon.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/groovy-weekly.html' class='icon'><span class='fa fa-envelope-o'></span> Groovy newsletter</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+                <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span>
+                                    </button><a class='navbar-brand' href='..\index.html'>
+                                        <i class='fa fa-star'></i> Apache Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li class=''><a href='..\/download.html'>Download</a></li><li class=''><a href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='..\/'>Contribute</a></li><li class=''><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li>
+                                            <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='..\search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li class='active'><a href='#doc'>GEP-9</a></li><li><a href='#_abstract_modularization' class='anchor-link'>Abstract: Modularization</a></li><li><a href='#_references_and_useful_links' class='anchor-link'>References and useful links</a></li><li><a href='#_update_history' class='anchor-link'>Update history</a></li></ul></div><div class='col-lg-8 col-lg-pull-0'><a name='doc'></a><h1>GEP-9</h1><p>Author: <i/></p><hr/><div id="preamble">
+<div class="sectionbody">
+<div class="sidebarblock">
+<div class="content">
+<div class="title">Metadata</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+<strong>Number</strong>
+</td>
+<td class="hdlist2">
+<p>GEP-9</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Title</strong>
+</td>
+<td class="hdlist2">
+<p>Modularization</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Version</strong>
+</td>
+<td class="hdlist2">
+<p>5</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Type</strong>
+</td>
+<td class="hdlist2">
+<p>Feature</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Status</strong>
+</td>
+<td class="hdlist2">
+<p>Final</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Comment</strong>
+</td>
+<td class="hdlist2">
+<p>Parts incorporated in Groovy 2.0</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Leader</strong>
+</td>
+<td class="hdlist2">
+<p>Paul King</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Created</strong>
+</td>
+<td class="hdlist2">
+<p>2011-10-26</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Last modification</strong>&#160;
+</td>
+<td class="hdlist2">
+<p>2018-10-24</p>
+</td>
+</tr>
+</table>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_abstract_modularization">Abstract: Modularization</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>This GEP introduces the goals and proposed details behind a modularization effort that will:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>provide a more streamlined jar for core Groovy with other jars comprising what might be considered optional parts of Groovy</p>
+</li>
+<li>
+<p>provide Groovy library writers with hooks into the groovy runtime to allow them to extend Groovy in various ways - allowing "grapes" to be more like plugins than just traditional libraries</p>
+</li>
+<li>
+<p>auxiliary details about how the modularization might affect other artifacts, e.g. the Groovy build, wiki, jira components, etc.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>This activity builds upon the work discussed previously: Groovy 2.0 modularization and the somewhat older profiles discussion Packaging and Modularity.</p>
+</div>
+<div class="sect2">
+<h3 id="_out_of_scope">Out of scope</h3>
+<div class="paragraph">
+<p>While we should keep a watching brief on other modularization efforts, at this stage we are anticipating structural
+changes to the Groovy classes which are orthogonal to eventually using something like OSGi or Java 8&#8217;s Jigsaw modularization.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_jar_groupings">Jar groupings</h3>
+<div class="paragraph">
+<p>At the moment, Groovy provides two main jar artifacts:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>groovy.jar contains the core classes for Groovy and has a dependency on a small handful of critical dependent jars (i.e. asm, antlr, etc.)</p>
+</li>
+<li>
+<p>groovy-all.jar contains the core classes for Groovy and bundled versions of the critical dependent jars</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>After modularization, the main Groovy codebase will be packaged into additional jar artifacts:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>groovy.jar or groovy-core.jar (name to be finalized) will contain a smaller set of core classes for Groovy and will retain its dependency on a small handful of critical dependent jars (i.e. asm, antlr, etc.)</p>
+</li>
+<li>
+<p>numerous smaller "module/component" jars (exact names/numbers/contents to be finalized) but possibly things like groovy-bsf.jar, groovy-sql.jar, groovy-swing.jar, groovy-jmx.jar, groovy-xml, groovy-tools etc.</p>
+</li>
+<li>
+<p>groovy-all.jar contains the core classes for Groovy, bundled versions of the critical dependent jars and all of the classes from the module jars</p>
+</li>
+<li>
+<p>optionally we may support other "profiles" - profiles being other "fat" jars we bundle together for other environments, e.g. groovy-android.jar might exclude the JMX or Swing modules for instance.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Recommendations/suggestions for jar groupings are welcome. See some more details in the accompanying discussion: Groovy 2.0 modularization.</p>
+</div>
+<div class="paragraph">
+<p>One of the goals of this bundling effort is to facilitate Groovy&#8217;s evolution as a language by enabling:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>less relevant modules to become deprecated and removed from the main project but still available as external libraries, e.g. groovy-bsf might be deemed inessential now that most users will have jsr-223 (but it can be moved into a separate module and still available for anyone who needs it)</p>
+</li>
+<li>
+<p>the controlled migration from legacy to new versions of some functionality, e.g. we could produce a groovy-xml-v2 library which might have breaking changes - the v2 library might be an optional module at first but later become the main supported option - legacy users would be able to "point back to the old version" so that their scripts don&#8217;t break if they wished (further details later)</p>
+</li>
+<li>
+<p>external modules could more easily be incorporated into the core distribution (with users able to customize certain aspects of what gets bundled)</p>
+</li>
+<li>
+<p>we can provide "legacy" jars which contain deprecated features or unforeseen breaking changes - library writers can incorporate the legacy jar into their libraries to more easily support using their libraries across multiple versions of Groovy</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_configuring_a_groovy_installation">Configuring a Groovy installation</h3>
+<div class="paragraph">
+<p>Groovy bootstraps its configuration using a file in the conf/groovy-starter.conf file. It has entries like this:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code># load required libraries
+load !{groovy.home}/lib/*.jar</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>with required jars being in a lib directory which is part of a Groovy install.</p>
+</div>
+<div class="paragraph">
+<p>The groovy install will now likely have a "modules" (or components or repository) directory.
+The groovy-starter.conf file will have additional entries such as:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code># load SQL component
+grab org.codehaus.groovy groovy-sql 1.9.0
+# load XML component
+grab org.codehaus.groovy groovy-xml 1.9.0</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Grapes are loaded via Ivy and configured from a settings file. This file might have an additional entry:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>&lt;ibiblio name="modules" root="file:${groovy.home}/modules/" m2compatible="true"/&gt;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The Ivy library (or perhaps the wharf or aether libraries) will likely become a required jar - though it may be
+that only a very limited form of grab is supported in which case no additional library might be necessary.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_runtime_hooksregistration">Runtime hooks/registration</h3>
+<div class="paragraph">
+<p>When downloading a grape, the classes from its jar are added (currently appended) to the classpath.
+In addition, we are planning on supporting additional integration points:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 33.3333%;">
+<col style="width: 33.3333%;">
+<col style="width: 33.3334%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">potential hook</th>
+<th class="tableblock halign-left valign-top">purpose</th>
+<th class="tableblock halign-left valign-top">status</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>META-INF/services/<br>
+org.codehaus.groovy.runtime.CategoryMethods</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">allow the module to define additional category methods</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">now in <code>META-INF/groovy/<br>
+                                                                                                       org.codehaus.groovy.runtime.ExtensionModuleSpec</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>META-INF/services/<br>
+org.codehaus.groovy.runtime.StaticCategoryMethods</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">allow the module to define additional static category methods</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">now in <code>META-INF/groovy/<br>
+                                                                                                                    org.codehaus.groovy.runtime.ExtensionModuleSpec</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>META-INF/services/<br>
+org.codehaus.groovy.runtime.SerializedCategoryMethods</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">allow the module to define additional category methods which have been serialized</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">deferred</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>META-INF/services/<br>
+org.codehaus.groovy.runtime.ExpandoMethods</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">allow the module to define additional ExpandoMetaClass methods</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">deferred</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>META-INF/services/<br>
+org.codehaus.groovy.runtime.DefaultMetaClasses</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">allow the module to define additional metaclasses similar to the current magic package mechanism <sup class="footnote">[<a id="_footnoteref_1" class="footnote" href="#_footnotedef_1" title="View footnote.">1</a>]</sup></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">deferred</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>META-INF/services/groovy/defaultImports</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">allow the module to define additional normal, star, static imports, aliases</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">moved to compiler configuration</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>META-INF/services/groovy/defaultExtensions</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">allow the module to define supported file extensions</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">moved to compiler configuration</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>META-INF/services/groovy/defaultAstTransforms</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">allow the module to define AST transforms</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">now in <code>META-INF/services/<br>
+                                                                                               org.codehaus.groovy.transform.ASTTransformation</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">?</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">provide a way to register builder metadata</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">deferred</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">?</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">should there by a way to 'publish' new commandline level startup scripts e.g. java2groovy</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">deferred</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">?</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">provide a way to register a runner class, e.g. EasyB - there might also be a need to detect runner types</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">now in <code>META-INF/groovy/<br>
+                                                                                                                 org.apache.groovy.plugin.GroovyRunner</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">?</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">provide a way to register special compiler flags, e.g. '--indy'</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">deferred</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">?</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">provide a way to inject special AST customizations</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">deferred</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>This is also where we could specify additional requirements, e.g. require 'invoke dynamic' - but see later also. Could we declaratively specify our security policy requirements. Or can we disable specific aspects of functionality, e.g. disable some standard global AST transform because we want to provide a better one. (There are obviously security implications for this!)</p>
+</div>
+<div class="paragraph">
+<p>Another question is whether all these features will be available also via an API. Would such an API allow modules to be "unregistered"?</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_groovydocsource_pointers">Groovydoc/source pointers</h3>
+<div class="paragraph">
+<p>Some modularization systems support the "installation" of documentation (and/or sources) along with the module.
+Should a module have a pointer to (or be bundled with) its GroovyDoc and/or source.</p>
+</div>
+<div class="paragraph">
+<p>In the Java ecosystem, many libraries are published with their javadoc/sources according to common conventions or have javadoc available online. Do we rely on these established conventions or provide additional support? For users without access to sophisticated IDEs it could be convenient to have all the documentation available in "merged" form in one place.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_runtime_introspection">Runtime Introspection</h3>
+<div class="paragraph">
+<p>In Groovy you can currently determine the Groovy version using:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>println GroovySystem.version</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>which returns a String.</p>
+</div>
+<div class="paragraph">
+<p>In GROOVY-2422 it talks about the desire for additional version checks.</p>
+</div>
+<div class="paragraph">
+<p>It also talks about listing capabilities. This could be "is invokeDynamic" available or could really just be about available loaded modules. In general, we would expect our dependencies to be specified as part of our pom and loaded for us automatically but it can sometimes be useful to do special things.</p>
+</div>
+<div class="paragraph">
+<p>In general, should we be able to find out the list of loaded modules and versions? Or ask about which module/version a particular class belongs to?</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_build_impacts">Build Impacts</h3>
+<div class="paragraph">
+<p>Mostly discussed here: Groovy 2.0 modularization</p>
+</div>
+<div class="paragraph">
+<p>Should each "submodule" be able to be built on its own? Will it have its own javadoc, own coding style rules, own coverage metrics etc.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_module_robustness">Module robustness</h3>
+<div class="paragraph">
+<p>Should we provide a standard hook/mechanism to try to combat the following scenarios:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>you are loading a jar that depends on classes managed by the root classloader?</p>
+</li>
+<li>
+<p>a class with the same name is already on the classpath before yours?</p>
+</li>
+<li>
+<p>a class with the same name as one of your dependencies but from an incompatible version is on the classpath already</p>
+</li>
+<li>
+<p>an ability to register a "ping"/health check method to quickly test the component</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_assisting_ide_support">Assisting IDE support</h3>
+<div class="paragraph">
+<p>We may define a standard place or convention, e.g. META-INF/services/groovy/dsld or META-INF/services/groovy/gdsl where IDEs can find DSL descriptors relevant for that module.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_logging">Logging</h3>
+<div class="paragraph">
+<p>Should modules themselves have a standard way to do logging? Is that j.u.l.Logger? Perhaps bridged with slf4j?</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_references_and_useful_links">References and useful links</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_wiki_pages_web_archive">Wiki pages (web archive)</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://web.archive.org/web/20150508040614/http://docs.codehaus.org/display/GROOVY/Groovy+2.0+modularization">Groovy 2.0 modularization</a></p>
+</li>
+<li>
+<p><a href="https://web.archive.org/web/20150512231712/http://docs.codehaus.org/display/GroovyJSR/Packaging+and+Modularity">Packaging and Modularity</a></p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_jira_issues">JIRA issues</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://issues.apache.org/jira/browse/GROOVY-2422">GROOVY-2422: API for checking version and capabilities of Groovy runtime</a></p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_update_history">Update history</h2>
+<div class="sectionbody">
+<div class="dlist">
+<dl>
+<dt class="hdlist1">4 (2011-10-26)</dt>
+<dd>
+<p>Version as extracted from Codehaus wiki</p>
+</dd>
+<dt class="hdlist1">5 (2018-10-24)</dt>
+<dd>
+<p>Numerous minor tweaks</p>
+</dd>
+</dl>
+</div>
+</div>
+</div>
+<div id="footnotes">
+<hr>
+<div class="footnote" id="_footnotedef_1">
+<a href="#_footnoteref_1">1</a>. This needs to mesh in with the existing magic package mechanism for defining custom metaclasses.
+</div>
+</div></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='..\/download.html'>Download</a></li><li><a href='http://groovy-lang.org/support.html'>Support</a></li><li><a href='..\/'>Contribute</a></li><li><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='http://groovy-lang.org/security.html'>Security</a></li><li><a href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='http://groovy-lang.org/search.html'>Search</a></li>
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a href='http://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='http://groovy-lang.org/groovy-weekly.html'>Groovy newsletter</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='http://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li>
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community
+                                        </p><img src='..\img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' class='img-responsive'/>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2019 the Apache Groovy project &mdash; Groovy is Open Source, <a href='http://www.apache.org/licenses/LICENSE-2.0.html'>Apache 2 License</a></div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='..\js/vendor/jquery-1.10.2.min.js' defer></script><script src='..\js/vendor/classie.js' defer></script><script src='..\js/vendor/bootstrap.js' defer></script><script src='..\js/vendor/sidebarEffects.js' defer></script><script src='..\js/vendor/modernizr-2.6.2.min.js' defer></script><script src='..\js/plugins.js' defer></script><script src='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js'></script><script>document.addEventListener('DOMContentLoaded',prettyPrint)</script><script>
+          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file
diff --git a/wiki/geps.html b/wiki/geps.html
new file mode 100644
index 0000000..00e8536
--- /dev/null
+++ b/wiki/geps.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><title>The Apache Groovy programming language - GEPs</title><link href='..\img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='..\css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='..\css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='..\css/style.css'/>
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: 20px; right: -58px; border: 0; z-index: 100; transform: rotate(45deg);' src='/img/horizontal-github-ribbon.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/groovy-weekly.html' class='icon'><span class='fa fa-envelope-o'></span> Groovy newsletter</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+                <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span>
+                                    </button><a class='navbar-brand' href='..\index.html'>
+                                        <i class='fa fa-star'></i> Apache Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li class=''><a href='..\/download.html'>Download</a></li><li class=''><a href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='..\/'>Contribute</a></li><li class=''><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li>
+                                            <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='..\search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li class='active'><a href='#gep'>GEPs</a></li><li><a href='#GEP-1' class='anchor-link'>GEP-1</a></li><li><a href='#GEP-2' class='anchor-link'>GEP-2</a></li><li><a href='#GEP-3' class='anchor-link'>GEP-3</a></li><li><a href='#GEP-4' class='anchor-link'>GEP-4</a></li><li><a href='#GEP-5' class='anchor-link'>GEP-5</a></li><li><a href='#GEP-6' class='anchor-link'>GEP-6</a></li><li><a href='#GEP-7' class='anchor-link'>GEP-7</a></li><li><a href='#GEP-8' class='anchor-link'>GEP-8</a></li><li><a href='#GEP-9' class='anchor-link'>GEP-9</a></li><li><a href='#GEP-10' class='anchor-link'>GEP-10</a></li><li><a href='#GEP-11' class='anchor-link'>GEP-11</a></li><li><a href='#GEP-12' class='anchor-link'>GEP-12</a></li></ul></div><div class='col-lg-8 col-lg-pull-0'><h1>GEPs for Groovy</h1><p>Here you can find the GEPs for the Groovy programming language.</p><ul><li><a href='GEP-1.html'>GEP-1: Groovy Enhancement Proposal</a></li><li><a href='GEP-2.html'>GEP-2: AST Builder Support</a></li><li><a href='GEP-3.html'>GEP-3: Command Expression based DSL</a></li><li><a href='GEP-4.html'>GEP-4: AstBuilder AST Templates</a></li><li><a href='GEP-5.html'>GEP-5: File extension dependent AST transformations</a></li><li><a href='GEP-6.html'>GEP-6: NIO2 Support for Groovy</a></li><li><a href='GEP-7.html'>GEP-7: JSON Support</a></li><li><a href='GEP-8.html'>GEP-8: Static type checking</a></li><li><a href='GEP-9.html'>GEP-9: Modularization</a></li><li><a href='GEP-10.html'>GEP-10: Static compilation</a></li><li><a href='GEP-11.html'>GEP-11: Groovy 3 semantics and new MOP</a></li><li><a href='GEP-12.html'>GEP-12: SAM coercion</a></li></ul></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='..\/download.html'>Download</a></li><li><a href='http://groovy-lang.org/support.html'>Support</a></li><li><a href='..\/'>Contribute</a></li><li><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='http://groovy-lang.org/security.html'>Security</a></li><li><a href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='http://groovy-lang.org/search.html'>Search</a></li>
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a href='http://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='http://groovy-lang.org/groovy-weekly.html'>Groovy newsletter</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='http://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li>
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community
+                                        </p><img src='..\img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' class='img-responsive'/>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2019 the Apache Groovy project &mdash; Groovy is Open Source, <a href='http://www.apache.org/licenses/LICENSE-2.0.html'>Apache 2 License</a></div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='..\js/vendor/jquery-1.10.2.min.js' defer></script><script src='..\js/vendor/classie.js' defer></script><script src='..\js/vendor/bootstrap.js' defer></script><script src='..\js/vendor/sidebarEffects.js' defer></script><script src='..\js/vendor/modernizr-2.6.2.min.js' defer></script><script src='..\js/plugins.js' defer></script><script>
+          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file
diff --git a/wiki/groovy-release-discussion.html b/wiki/groovy-release-discussion.html
new file mode 100644
index 0000000..9d94840
--- /dev/null
+++ b/wiki/groovy-release-discussion.html
@@ -0,0 +1,400 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><title>The Apache Groovy programming language - Developer docs - Adapting the release process for Apache</title><link href='..\img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='..\css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='..\css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='..\css/style.css'/><link rel='stylesheet' type='text/css' href='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.css'/>
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: 20px; right: -58px; border: 0; z-index: 100; transform: rotate(45deg);' src='/img/horizontal-github-ribbon.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/groovy-weekly.html' class='icon'><span class='fa fa-envelope-o'></span> Groovy newsletter</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+                <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span>
+                                    </button><a class='navbar-brand' href='..\index.html'>
+                                        <i class='fa fa-star'></i> Apache Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li class=''><a href='..\/download.html'>Download</a></li><li class=''><a href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='..\/'>Contribute</a></li><li class=''><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li>
+                                            <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='..\search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li class='active'><a href='#doc'>Adapting the release process for Apache</a></li><li><a href='#_the_groovy_way' class='anchor-link'>The Groovy Way</a></li><li><a href='#_adaptations_required_for_apache' class='anchor-link'>Adaptations required for Apache</a></li></ul></div><div class='col-lg-8 col-lg-pull-0'><a name='doc'></a><h1>Adapting the release process for Apache</h1><p>Author: <i/></p><hr/><div id="preamble">
+<div class="sectionbody">
+<div class="paragraph">
+<p>v1.1, March 28, 2018</p>
+</div>
+<div class="paragraph">
+<p><em>NOTE</em></p>
+</div>
+<div class="sidebarblock">
+<div class="content">
+<div class="paragraph">
+<p>This document captures some historical information and discussion about Groovy&#8217;s release process both before joining Apache and during incubation.
+Many of the ideas went into Groovy&#8217;s current release process which involves use of a gradle build at the following repo: <a href="https://github.com/apache/groovy-release/" class="bare">https://github.com/apache/groovy-release/</a></p>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_the_groovy_way">The Groovy Way</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Between 2010 and 2015, the Groovy team invested a lot of time in narrowing its release process to reduce human errors as much as possible. Releases were previously done from a despot personal computer, with a number of risks:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>mix of development sources and sources found in the repository. This can happen if the release manager did the release without doing a clean checkout in a separate directory. Then there were risks that source files were present on the release manager computer and not in source control.</p>
+</li>
+<li>
+<p>reliance on a local dependency repository. During development, committers usually do not suffer dependency management issues, because they do regular update and some third party dependencies are found in their local caches (Maven, Gradle). However, new developers may find themselves in a different situation, where they have no local cache. When they try to build, compilation fails because some dependencies cannot be fetched.</p>
+</li>
+<li>
+<p>manual update of properties file for release numbers</p>
+</li>
+<li>
+<p>manual tagging</p>
+</li>
+<li>
+<p>manual update of VCS after release, that can easily be forgotten</p>
+</li>
+<li>
+<p>upload of distribution to the Codehaus WebDAV repository, with a lot of failures due to the poor quality of the protocol (in particular stale lock files)</p>
+</li>
+<li>
+<p>upload of documentation took up to several hours due to the WebDAV process, and were <strong>erasing</strong> previous versions of documentation (API, GAPI, GDK) so it wasn&#8217;t possible to find online the reference API for a specific Groovy version.</p>
+</li>
+<li>
+<p>Maven artifact uploading and signing done through the Codehaus repository, which was again very slow and error-prone</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>It&#8217;s worth noting that binary artifacts are currently published in the <code>org.codehaus.groovy</code> group id and that the build uses <a href="http://gradle.org">Gradle</a>.</p>
+</div>
+<div class="sect2">
+<h3 id="_automation">Automation</h3>
+<div class="paragraph">
+<p>For those reasons, we slowly migrated off the Codehaus infrastructure and built a new release process with a continuous integration server at its core. We reviewed several options and eventually found a sponsor, Jetbrains, for a <a href="http://ci.groovy-lang.org">TeamCity continuous integration server</a>. The reasons to choose a dedicated server are not all related to the release process. The development process itself greatly benefits from it:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>each branch of Groovy (currently 3 active branches: 2.3.x, 2.4.x, master) are built and tested against multiple JDKs : JDK 6, JDK 7, JDK 8, and older branches of Groovy are tested against older JDKs (JDK 5 for 1.8.x/2.x). Note that some Groovy versions are tested in two flavors: legacy and <em>invokedynamic</em>.</p>
+</li>
+<li>
+<p>we build unreleased versions of OpenJDK from sources, so that we can test the master branch against upcoming JDK versions, such as JDK 8 updates and even JDK 9. Those builds allowed us to find a lot of bugs in the JDK before it was released.</p>
+</li>
+<li>
+<p>some community projects are tested against development versions of Groovy (currently, Ratpack and Nextflow)</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Eventually, the <a href="http://groovy-lang.org">new Groovy website</a> is built from <a href="https://github.com/groovy/groovy-website">sources</a> and deployed directly from the CI server, after each push on the <em>master</em> branch.</p>
+</div>
+<div class="paragraph">
+<p>But in addition to those benefits, it&#8217;s the release process itself which greatly improved:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>the deployment infrastructure moved from Codehaus to <a href="https://bintray.com/">Bintray</a> and <a href="http://www.jfrog.com/open-source/">Artifactory</a></p>
+</li>
+<li>
+<p>several build plans are dedicated to builds and releases:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>the <a href="http://ci.groovy-lang.org/viewType.html?buildTypeId=Groovy_BintrayIntegration_UploadSnapshots&amp;guest=1">snapshot upload</a> plan builds Groovy from sources and deploys the artifacts to the <a href="http://oss.jfrog.org/oss-snapshot-local/org/codehaus/groovy/">OSS Artifactory Snapshot Repository</a>.</p>
+</li>
+<li>
+<p>the <a href="http://ci.groovy-lang.org/viewType.html?buildTypeId=Groovy_BintrayIntegration_ReleasePlan&amp;guest=1">release plan</a> allows a release manager to release a new version of Groovy directly from the CI server</p>
+</li>
+<li>
+<p>the <a href="http://ci.groovy-lang.org/viewType.html?buildTypeId=Groovy_BintrayIntegration_GvmBroadcast">GVM broadcast</a> plan allows us to announce a new release of Groovy to <a href="http://gvmtool.net/">GVM</a> and its <a href="https://twitter.com/gvmtool">Twitter account</a> directly from the CI server</p>
+</li>
+<li>
+<p>the <a href="http://ci.groovy-lang.org/viewType.html?buildTypeId=Groovy_BintrayIntegration_GvmMakeDefault">GVM default</a> plan allows us to notify GVM that a specific Groovy version is the new default version, directly from the CI server</p>
+</li>
+</ul>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The last two GVM plans are separated because they need to be triggered manually, once we are ready to announce that a new Groovy version is out. Let&#8217;s now describe what the release plan does, so that we can imagine what adaptations will be required to go the Apache Way.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_release_plan">Release plan</h3>
+<div class="paragraph">
+<p>The release plan is at the core of the Groovy release process. It reduces human interactions to the bare minimal, dramatically reducing the potential errors. In particular:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>builds are done using a verified JDK</p>
+</li>
+<li>
+<p>the CI local Maven and Gradle repository caches are cleaned every day, making sure that the build is doable from source for any developer</p>
+</li>
+<li>
+<p>release branches and tags are created automatically</p>
+</li>
+<li>
+<p>properties files are updated automatically (sets the release version, then the next version to push on VCS)</p>
+</li>
+<li>
+<p>binaries (sources, documentation, distribution, SDK) are uploaded to <a href="https://bintray.com/">Bintray</a></p>
+</li>
+<li>
+<p>documentation is uploaded to the <a href="http://groovy-lang.org">Groovy website</a> in a separate directory, so that each Groovy version has its own documentation readable online</p>
+</li>
+<li>
+<p>all artifacts (binaries+maven) are signed through the <a href="https://bintray.com/">Bintray</a> API</p>
+</li>
+<li>
+<p>Maven artifacts are uploaded to <a href="https://bintray.com/bintray/jcenter">JCenter</a></p>
+</li>
+<li>
+<p>Maven Central synchronization is done through the <a href="https://bintray.com/">Bintray</a> API</p>
+</li>
+<li>
+<p>GVM gets notified that a new version is available</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>To do this, the only requirement is to fill in a form and click a button. From that, everything is automated. So when the Groovy team decides that a new release can be done, after clicking the button, the release is available online in general less than 2 hours later. This has to be compared to the previous, error prone process, which took up to 12 hours for a single release. Groovy has a tradition of maintaining multiple branches, so this time has to be multiplied by the number of active branches that we maintain, which are usually released the same day.</p>
+</div>
+<div class="paragraph">
+<p>With that regards, the decision whether to release a new version or not is done collectively, on the mailing list or in a Skype channel where the core developers agree about releases. But once the decision is made, there is almost no human process involved anymore.</p>
+</div>
+<div class="paragraph">
+<p>Last but not least, Groovy doesn&#8217;t make any difference between the source distribution (the zip of the source tree) and binary artifacts (distribution, documentation, maven artifacts). All are considered part of the release, and signed accordingly. But there is a technical difference between Maven artifacts and what we call the distribution (sources, binaries, documentation, SDKs). The distribution is only available in <a href="https://bintray.com/">Bintray</a>. It consists of zip files that the developer can download from the Groovy website. The Maven artifacts, on the other hand, are hosted in JCenter and Maven Central.</p>
+</div>
+<div class="paragraph">
+<p>To be able to upload the distribution, the release process automatically creates a new version of Groovy on <a href="https://bintray.com/">Bintray</a>. This version is some kind of folder which will host files for this specific Groovy version. When the files are uploaded, they are kept in <strong>staging</strong> for at most 48 hours. Currently, the release process automatically publishes the artifacts, so there&#8217;s effectively no staging for Groovy.</p>
+</div>
+<div class="paragraph">
+<p>It is unclear whether such a staging phase exists for the Maven artifacts uploaded to JCenter (but it seems we can), but it is clear that the Maven Central synchronization that is doable through <a href="https://bintray.com/">Bintray</a> uses a staging phase, because it directly communicates with the Nexus OSS repository. Maven Central synchronization staging repositories are directly closed by <a href="https://bintray.com/">Bintray</a>.</p>
+</div>
+<div class="paragraph">
+<p>Releasing a new version of Groovy also implies updating the website. Technically it involves two manual steps:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>connect to the server and update the <em>symlinks</em> in <em>/var/www/docs/docs</em> for <em>latest</em> and <em>next</em> versions of Groovy, so that the latest documentation link points to the just released version of Groovy</p>
+</li>
+<li>
+<p><strong>then</strong> update the <em>sitemap.groovy</em> file in the Groovy Website repo to add the new version, commit, and push, leading to the generation of the website. In particular, the static website generator will fetch the release notes from JIRA and generate a pretty page using the website template, as well as generating some documentation pages from the whole documentation, again decorated with the website template.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Optionally, for major versions, release notes can be written in Asciidoctor format, and published through the website (see <a href="https://github.com/groovy/groovy-website/tree/master/site/src/site/releasenotes" class="bare">https://github.com/groovy/groovy-website/tree/master/site/src/site/releasenotes</a>).</p>
+</div>
+<div class="paragraph">
+<p>Eventually, the joint builds on the CI server need to be updated so that they use the latest snapshot versions of Groovy. This is done by changing the <code>CI_GROOVY_VERSION</code> environment variable of each build configuration.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_adaptations_required_for_apache">Adaptations required for Apache</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The following section is based on our understanding of the Apache Way of releasing. This section is going to be updated based on the feedback we have from our mentors or fellow Apache members.</p>
+</div>
+<div class="paragraph">
+<p>First of all, the main and only important artifact for Apache is the <strong>sources of the project</strong>. This is going to be very important for our adaptation of the process. This means that binaries, documentation, Maven artifacts and such are not considered equally, and are not mandatory to be able to release a version.</p>
+</div>
+<div class="paragraph">
+<p>A detailed guide of the release process <strong>during incubation</strong> can be found <a href="http://incubator.apache.org/guides/releasemanagement.html">here</a> but those are derived from the final release process. Below are the main points with comments about how far we are from there.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>1.1 Checksums and PGP signatures are valid.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><em>There are no such checksums or multiple PGP signatures for Groovy, apart from those generated through <a href="https://bintray.com/">Bintray</a>. It is implied here that signatures must be checked before the release is done, that is to say that we <strong>require</strong> a staging phase and the ability to perform <strong>multiple signatures</strong>. Signatures are those of committers.</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>2.1 Build is successful including automated tests.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><em>We&#8217;re all clear on that. Groovy is tested before each release, and the CI server does much more in testing that a normal user can do. In particular, testing with multiple JDKs. The sources zip has been verified to build and test from sources without any issue.</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>3.1 DISCLAIMER is correct, filenames include "incubating".</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><em>We need to add the <strong>DISCLAIMER</strong>. The "incubating" part is disturbing. In particular, Groovy is not a new project. It&#8217;s been there for 12 years, and the last release before Apache will be 2.4.2. Does it mean that the next release will have to be named 2.4.3-incubating? It will be very disturbing for our users, and it sounds pretty bad, just as if Groovy wasn&#8217;t production ready. Should we do this, then the incubation phase should be shortened as much as possible. Another option that we consider is what are exactly the deliverables. If the only deliverable is the source zip, because only sources matter (see 3.6), then we could potentially rename only the source zip to include incubating. The binaries, the properties file, etc, could stay with 2.4.3 (without incubating) because it doesn&#8217;t seem to be mandatory that the <strong>version number</strong> includes incubating, only the filenames. And if we produce binaries that are not hosted at Apache, like we do now, they can follow their own pattern. This would imply that in Groovy, the only deliverable that would be done through Apache would be the source zip, and the <strong>filename</strong> could include incubating. All other artifacts would <strong>not</strong> belong to the release checklist.</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>3.2 Top-level LICENSE and NOTICE are correct for each distribution.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><em>We do have those files</em>.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>3.3 All source files have license headers where appropriate.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><em>It has to be checked, but it should already be the case</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>3.4 The provenance of all source files is clear (ASF or software grants).</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><em>This is going to be done during the incubation phase.</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>3.5 Dependencies licenses are ok as per <a href="http://apache.org/legal/" class="bare">http://apache.org/legal/</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><em>We will have to remove the only dependency which is now unused and not a standard OSS license: Simian.</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>3.6 Release consists of source code only, no binaries. Each Apache release must contain a source package. This package may not contain compiled components (such as "jar" files) because compiled components are not open source, even if they were built from open source.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><em>The source zip does contain a binary <strong>dependency</strong>: openbeans, which is not available in a third party Maven repository. We are unsure if the rule applies to it or not.</em></p>
+</div>
+<div class="paragraph">
+<p>It is also implied that we are going to change the group id from <code>org.codehaus.groovy</code> to <code>org.apache.groovy</code>. What it means for the release process (in particular synchronization with Maven Central through Bintray) are unclear.</p>
+</div>
+<div class="paragraph">
+<p>So it seems that the current process could be adapted if:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>we only release the source zip on Apache, and only this item is voted</p>
+</li>
+<li>
+<p>to do this we need to split the release process in at least 3 steps</p>
+<div class="ulist">
+<ul>
+<li>
+<p>building and deploying to a staging repository, including all artifacts. That staging period has to be extended to <strong>at least</strong> 72 hours, which is the minimal voting duration.</p>
+</li>
+<li>
+<p>signing has to be done by individuals. This implies some way to download the full artifact list (there are more than 200 binary files in total !), sign them, and upload the signatures only.</p>
+</li>
+<li>
+<p>publishing, which implies closing the Bintray staging repository, then synchronizing to Maven Central and publishing to GVM</p>
+</li>
+</ul>
+</div>
+</li>
+</ul>
+</div>
+</div>
+</div></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='..\/download.html'>Download</a></li><li><a href='http://groovy-lang.org/support.html'>Support</a></li><li><a href='..\/'>Contribute</a></li><li><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='http://groovy-lang.org/security.html'>Security</a></li><li><a href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='http://groovy-lang.org/search.html'>Search</a></li>
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a href='http://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='http://groovy-lang.org/groovy-weekly.html'>Groovy newsletter</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='http://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li>
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community
+                                        </p><img src='..\img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' class='img-responsive'/>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2019 the Apache Groovy project &mdash; Groovy is Open Source, <a href='http://www.apache.org/licenses/LICENSE-2.0.html'>Apache 2 License</a></div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='..\js/vendor/jquery-1.10.2.min.js' defer></script><script src='..\js/vendor/classie.js' defer></script><script src='..\js/vendor/bootstrap.js' defer></script><script src='..\js/vendor/sidebarEffects.js' defer></script><script src='..\js/vendor/modernizr-2.6.2.min.js' defer></script><script src='..\js/plugins.js' defer></script><script src='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js'></script><script>document.addEventListener('DOMContentLoaded',prettyPrint)</script><script>
+          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file
diff --git a/wiki/img/mop_2.jpg b/wiki/img/mop_2.jpg
new file mode 100644
index 0000000..c8abac3
--- /dev/null
+++ b/wiki/img/mop_2.jpg
Binary files differ
diff --git a/wiki/initial-release-process-proposal.html b/wiki/initial-release-process-proposal.html
new file mode 100644
index 0000000..696cbd9
--- /dev/null
+++ b/wiki/initial-release-process-proposal.html
@@ -0,0 +1,520 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><title>The Apache Groovy programming language - Developer docs - Initial release process proposal</title><link href='..\img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='..\css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='..\css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='..\css/style.css'/><link rel='stylesheet' type='text/css' href='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.css'/>
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: 20px; right: -58px; border: 0; z-index: 100; transform: rotate(45deg);' src='/img/horizontal-github-ribbon.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/groovy-weekly.html' class='icon'><span class='fa fa-envelope-o'></span> Groovy newsletter</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+                <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span>
+                                    </button><a class='navbar-brand' href='..\index.html'>
+                                        <i class='fa fa-star'></i> Apache Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li class=''><a href='..\/download.html'>Download</a></li><li class=''><a href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='..\/'>Contribute</a></li><li class=''><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li>
+                                            <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='..\search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li class='active'><a href='#doc'>Initial release process proposal</a></li><li><a href='#_background' class='anchor-link'>Background</a></li><li><a href='#_initiating_a_release' class='anchor-link'>Initiating a release</a></li><li><a href='#_preparing_a_release' class='anchor-link'>Preparing a release</a></li><li><a href='#_setup_the_teamcity_release_configuration' class='anchor-link'>Setup the TeamCity release configuration</a></li><li><a href='#_trigger_the_release' class='anchor-link'>Trigger the release</a></li><li><a href='#_upload_to_apache_servers' class='anchor-link'>Upload to Apache servers</a></li><li><a href='#_push_the_tag_and_new_head' class='anchor-link'>Push the tag and new HEAD</a></li><li><a href='#_send_a_vote_thread' class='anchor-link'>Send a [VOTE] thread</a></li><li><a href='#_publish_the_release' class='anchor-link'>Publish the release</a></li><li><a href='#_update_the_web_site' class='anchor-link'>Update the web site</a></li><li><a href='#_send_an_announcement_email' class='anchor-link'>Send an announcement email</a></li></ul></div><div class='col-lg-8 col-lg-pull-0'><a name='doc'></a><h1>Initial release process proposal</h1><p>Author: <i/></p><hr/><div id="preamble">
+<div class="sectionbody">
+<div class="paragraph">
+<p>v1.2, March 28, 2018</p>
+</div>
+<div class="paragraph">
+<p><em>NOTE</em></p>
+</div>
+<div class="sidebarblock">
+<div class="content">
+<div class="paragraph">
+<p>This document captures some historical information and discussion about Groovy&#8217;s release process that occurred soon after the Groovy project joined Apache.
+Many of the ideas went into Groovy&#8217;s current release process which involves use of a gradle build at the following repo: <a href="https://github.com/apache/groovy-release/" class="bare">https://github.com/apache/groovy-release/</a>
+If any of the steps in the automated process fail, this documentation might prove useful to understand what manual rectification steps that might be needed.</p>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_background">Background</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The goal of this document is to guide the release manager in order to perform a release under the Apache Incubator. This document, reflecting the status of incubation, is work in progress and will be adapted with regards to comments from the community, mentors and IPMC.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_initiating_a_release">Initiating a release</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Releases can be initiated by a committer, as long as:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>an email has been sent to the dev mailing list, where a committer volunteers for a release</p>
+</li>
+<li>
+<p>there&#8217;s a general agreement that a release can be done. There&#8217;s still no explicit rule telling when a new Groovy version can be released, but the history of the project shows that releases are usually done when a significant amount of bugfixes have been done justifying a release, or that new major features are ready.</p>
+</li>
+<li>
+<p>release manager has his personal setup ready. In particular:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>release manager can log into his people.apache.org account using SSH</p>
+</li>
+<li>
+<p>release manager has administration privileges on <a href="http://ci.groovy-lang.org">the CI server</a></p>
+</li>
+</ul>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Releases are launched from the CI server. A release should never be done from a personal computer.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_preparing_a_release">Preparing a release</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Releases are done from the CI server, but since it will involve creating tags, branches and several commits, and that the CI server doesn&#8217;t have privileges to do it, we cannot work on the Apache Git origin. Instead, it is required that the release manager forks the repository and pushes changes to his personal fork. Given that <code>GROOVY_2_4_X</code> is the branch to release, <code>upstream</code> references Apache Git, and <code>origin</code> the release manager fork on GitHub, preparing for a release usually starts with:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>git checkout GROOVY_2_4_X
+git pull --rebase upstream GROOVY_2_4_X
+git push origin GROOVY_2_4_X</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If you haven&#8217;t done it already, create a token on <a href="https://github.com/settings/tokens">your GitHub profile</a> so that the CI server can have write access on your fork. Keep the token safe!</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_setup_the_teamcity_release_configuration">Setup the TeamCity release configuration</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Go to the <a href="http://ci.groovy-lang.org/admin/editBuild.html?id=buildType:Groovy_BintrayIntegration_ReleasePlan">TeamCity release plan</a> configuration and open the VCS settings. If the VCS root attached to the configuration is not your GitHub fork, attach your VCS root, or create a new VCS root if you haven&#8217;t done it already. The VCS root MUST have write access using the token authentication.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_trigger_the_release">Trigger the release</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Go to the <a href="http://ci.groovy-lang.org/viewType.html?buildTypeId=Groovy_BintrayIntegration_ReleasePlan&amp;tab=artifactory">Artifactory Release Management tab</a> and fill the form appropriately:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>groovyVersion</em></p>
+<div class="ulist">
+<ul>
+<li>
+<p><em>release version</em> must be set to the version number of Groovy you are releasing. For example <code>2.4.6</code>.</p>
+</li>
+<li>
+<p><em>next integration version</em> <strong>must</strong> be set to the subsequent version number of Groovy you are releasing and as it will be a development version, <strong>must</strong> end with <code>-SNAPSHOT</code>. For example <code>2.4.5-SNAPSHOT</code>.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p><em>groovyBundleVersion</em></p>
+<div class="ulist">
+<ul>
+<li>
+<p><em>release version</em> must be set to the OSGi bundle version number of Groovy you are releasing. For example <code>2.4.6</code>.</p>
+</li>
+<li>
+<p><em>next integration version</em> <strong>must</strong> be set to the subsequent OSGi bundle version number of Groovy you are releasing and as it will be a development version, <strong>must</strong> end with <code>.SNAPSHOT</code>. For example <code>2.4.5.SNAPSHOT</code>.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p><em>Checkout branch:</em> must be set to the branch your are releasing. For example, if you are releasing a 2.4.x version of Groovy, <code>GROOVY_2_4_X</code>.</p>
+</li>
+<li>
+<p><em>Use release branch</em> must be checked, and it will automate the creation of a release branch. Use a branch name in the form of <code>REL_BRANCH_2_4_3</code></p>
+</li>
+<li>
+<p><em>Create VCS tag</em> must be checked, and it will automate the creation of a release tag. Use a tag name in the form of <code>GROOVY_2_4_4</code></p>
+</li>
+<li>
+<p><em>Tag comment</em> must be set to something useful describing the release version</p>
+</li>
+<li>
+<p><em>Repository to stage the release to (Artifactory Pro):</em> must be set to <code>oss-release-local</code></p>
+</li>
+<li>
+<p><em>Staging comment</em> should be set with something useful like <code>release of Groovy 2.4.6</code></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Hit the release button.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_upload_to_apache_servers">Upload to Apache servers</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>At this point, if the release build was successful, artifacts are staging on Bintray. You must log into Bintray and download the distribution artifacts. The URL for
+the staging distribution should be in the form of <a href="https://bintray.com/groovy/maven/groovy/2.4.6">https://bintray.com/groovy/maven/groovy/2.4.6</a>.</p>
+</div>
+<div class="paragraph">
+<p>Downloads of the following files are only possible if you use the (groovy-operator,&lt;api key&gt;) credentials. If you don&#8217;t have them please ask one of the PPMC members:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>apache-groovy-src-<em>version</em>.zip</p>
+</li>
+<li>
+<p>apache-groovy-binary-<em>version</em>.zip</p>
+</li>
+<li>
+<p>apache-groovy-docs-<em>version</em>.zip</p>
+</li>
+<li>
+<p>apache-groovy-sdk-<em>version</em>.zip</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>as well as the corresponding <em>asc</em> and <em>md5</em> files. There should therefore be a total of <em>12</em> files.</p>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<div class="title">Note</div>
+</td>
+<td class="content">
+at this point it is possible that the MD5 files are missing, in which cases you would have to create them locally before uploading to Apache.
+</td>
+</tr>
+</table>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>for f in `ls *.zip`; do md5sum $f &gt; $f.md5; done</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>It is in general not accepted that the release is signed using the CI server key, so you <strong>must</strong> replace the signatures with your own. If you didn&#8217;t yet,
+add your public key to the <code>KEYS</code> file, then sign each zip individually. This can be done, for each file, with a command line like:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>gpg --armor --output apache-groovy-src-2.4.6.zip.asc --detach-sign apache-groovy-src-2.4.6.zip</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Now you are ready to upload to the dev space on <em>dist.apache.org</em>. First of all, please make sure your local layout
+looks like this:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>|-- KEYS
+|-- 2.4.6
+|     |
+|     -- distribution
+|     |  |-- apache-groovy-binary-2.4.6.zip
+|     |  |-- apache-groovy-binary-2.4.6.zip.asc
+|     |  |-- apache-groovy-binary-2.4.6.zip.md5
+|     |  |-- apache-groovy-docs-2.4.6.zip
+|     |  |-- apache-groovy-docs-2.4.6.zip.asc
+|     |  |-- apache-groovy-docs-2.4.6.zip.md5
+|     |  |-- apache-groovy-sdk-2.4.6.zip
+|     |  |-- apache-groovy-sdk-2.4.6.zip.asc
+|     |  `-- apache-groovy-sdk-2.4.6.zip.md5
+|     |-- sources
+         |-- apache-groovy-src-2.4.6.zip
+         |-- apache-groovy-src-2.4.6.zip.asc
+         `-- apache-groovy-src-2.4.6.zip.md5</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Then you need to perform the upload:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>svn https://dist.apache.org/repos/dist/dev/incubator/groovy groovy-release
+cd groovy-release
+cp -r ../path/to/local/groovy/&lt;version&gt; .
+svn add &lt;version&gt;
+svn ci &lt;version&gt;</code></pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_push_the_tag_and_new_head">Push the tag and new HEAD</h2>
+<div class="sectionbody">
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>git fetch origin --tags
+git push upstream GROOVY_2_4_4
+git push upstream GROOVY_2_4_X</code></pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_send_a_vote_thread">Send a [VOTE] thread</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>You can use the following template to send a VOTE thread on the dev@ list:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>Dear community,
+
+I am happy to start the VOTE thread for a Groovy x.y.z!
+This release includes bugfixes for ...
+
+The changelog for this release can be found here: https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12318123&amp;version=12331941
+
+Tag: https://git1-us-west.apache.org/repos/asf?p=groovy.git;a=tag;h=19f70958f39f0cc5c6b4d3e9471fd297400647d2
+
+The artifacts to be voted on are located here: https://dist.apache.org/repos/dist/dev/incubator/groovy/
+
+Release artifacts are signed with the following key: https://dist.apache.org/repos/dist/dev/incubator/groovy/KEYS
+
+Please vote on releasing this package as Apache Groovy 2.4.6.
+
+The vote is open for the next 72 hours and passes if a majority of at least three +1 PMC votes are cast.
+
+[ ] +1 Release Apache Groovy 2.4.6
+[ ]  0 I don't have a strong opinion about this, but I assume it's ok
+[ ] -1 Do not release Apache Groovy 2.4.6 because...
+
+Here is my vote:
+
++1 (binding)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>After 72h, send another email summarizing the result of the vote. If it passed, you <strong>must</strong> send another vote to
+<code>general@incubator.apache.org</code> to ask the IPMC to vote:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>Hi all!
+
+The Apache Groovy PMC has successfully voted the release of Apache Groovy 2.4.6 [1], with 6 "+1" binding votes, one "+1" non binding, no "0" votes and one "-1" vote (see the explanation below). We are now asking the IPMC to vote it too. Since it is our first release under the Apache Software Foundation umbrella, let me give a few more details:
+
+&lt;description of the release&gt;
+
+Vote on dev list: http://mail-archives.apache.org/mod_mbox/groovy-dev/201507.mbox/%3CCADQzvm%3DzDNCxpOua3LQ1ZNo62Aq40QZM7SJwgER5MfkArWrTeA%40mail.gmail.com%3E
+Result of vote on dev list: http://mail-archives.apache.org/mod_mbox/groovy-dev/201507.mbox/%3CCADQzvmn1yEMMz_ZaCL5QqqUtQJdgd0NNcy8v7BVY8Lt4Uog0Zg%40mail.gmail.com%3E
+Relicensing of the documentation tracking: https://issues.apache.org/jira/browse/GROOVY-7470
+Vote for relicensing the docs: http://mail-archives.apache.org/mod_mbox/groovy-dev/201506.mbox/%3CCADQzvm%3DMfajQuMxoZJmpLe%2B4W22a_MDY_dC4W%2BNMWiakEEOyNg%40mail.gmail.com%3E
+Result of vote for relicensing the docs: http://mail-archives.apache.org/mod_mbox/groovy-dev/201506.mbox/%3CCADQzvmkQyOEk3ofOrnTHfnvTKO5xECY87hKAGf5pD%2BuePyA8UA%40mail.gmail.com%3E
+
+The changelog for this release can be found here: https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12318123&amp;version=12331941
+
+Tag for the release: https://git1-us-west.apache.org/repos/asf?p=groovy.git;a=commit;h=716b0b1bd56eeab04e4441eecc91c2cd8bfda8b6
+&lt;https://git1-us-west.apache.org/repos/asf?p=groovy.git;a=tag;h=19f70958f39f0cc5c6b4d3e9471fd297400647d2&gt;
+
+The artifacts to be voted on are located here: https://dist.apache.org/repos/dist/dev/incubator/groovy/
+
+Release artifacts are signed with the following keys: https://dist.apache.org/repos/dist/dev/incubator/groovy/KEYS
+
+Vote is open for at least 72 hours. Artifacts will be moved to dist as soon as the vote passes.
+
+[ ] +1, release Apache Groovy 2.4.6
+[ ] 0, I don't care
+[ ] -1, because...</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If the vote passes:</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_publish_the_release">Publish the release</h2>
+<div class="sectionbody">
+<div class="ulist">
+<ul>
+<li>
+<p>Open <code><a href="https://bintray.com/groovy/maven/groovy/2.4.6" class="bare">https://bintray.com/groovy/maven/groovy/2.4.6</a></code> and click <code>Publish</code> on the notice message (something like <code>ou have 532 unpublished item(s) for this version (expiring in 21 hours)</code>)</p>
+</li>
+<li>
+<p>Perform Maven Central synchronization: on <a href="https://bintray.com/groovy/maven/groovy/2.4.6/view?sort=&amp;order=#central">this page (update the link to the appropriate version)</a>, click 'sync'. This step may take several minutes to complete.</p>
+</li>
+<li>
+<p>Update the documentation symlinks on the website. You need credentials on the server:</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>cd /var/www/docs/docs
+rm -f latest
+ln -s groovy-2.4.6 latest</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Publish to GVM. Open <a href="http://ci.groovy-lang.org/viewType.html?buildTypeId=Groovy_BintrayIntegration_GvmPublish">the publish configuration</a>, click on the 3 dots near <code>run</code> then on the <em>parameters</em> tab, fill
+in the <code>groovyVersion</code> parameter. Click on <code>run build</code>.</p>
+</li>
+<li>
+<p>if the release is NOT a beta or a release candidate, make it the default version on GVM. Open <a href="http://ci.groovy-lang.org/viewType.html?buildTypeId=Groovy_BintrayIntegration_GvmMakeDefault">the GVM make default configuration</a>, click on the 3 dots near <code>run</code> then on the <em>parameters</em> tab, fill
+in the <code>groovyVersion</code> parameter. Click on <code>run build</code>.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_update_the_web_site">Update the web site</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>If you don&#8217;t have it locally, checkout <code><a href="https://github.com/groovy/groovy-website" class="bare">https://github.com/groovy/groovy-website</a></code>.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Update the <a href="https://github.com/melix/groovy-website/blob/master/site/src/site/sitemap.groovy">site map</a> to include the newly released version.</p>
+</li>
+<li>
+<p>Push the changes</p>
+</li>
+<li>
+<p>Wait for the <a href="http://ci.groovy-lang.org/viewType.html?buildTypeId=Groovy_Website">CI website deployment build</a> to complete.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_send_an_announcement_email">Send an announcement email</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>You should wait 24h before doing this (in order for <code>dist.apache.org</code> to be properly mirrored).
+Send an email to <code>dev@</code>, <code>user@</code> and <code>announce@apache.org</code>.</p>
+</div>
+<div class="paragraph">
+<p>You can use this template. Please make sure that the email at least contains the DISCLAIMER:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>Dear community,
+
+We are pleased to announce the first release of Apache Groovy done under the Apache Software Foundation
+Incubator sponsorship! Apache Groovy is a multi-facet programming language for the JVM. Details can be
+found at http://groovy-lang.org
+
+This release is a maintenance release of the 2.4.x branch, but contains critical fixes, in particular a fix
+for a 0-day vulnerability. Details can be found on http://groovy-lang.org/security.html
+
+It is strongly encouraged that all users upgrade to this version. There is no plan to provide patches for
+older versions of Groovy which were not developped under the Foundation umbrella.
+
+Changelog for this version can be found at: http://groovy-lang.org/changelogs/changelog-2.4.6.html
+Sources can be downloaded from: http://www.groovy-lang.org/download.html
+Convenience binaries, SDK and documentation can be found at: http://www.groovy-lang.org/download.html
+
+We would like to thank all people who contributed to this release. In particular, thanks to our mentors who are
+having hard days at explaining the Apache Way :) Despite comments we received about this release, we felt that
+the security issue is so important that we deserved this to our community.
+
+Best regards,</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Broadcast the release on GVM. Open <a href="http://ci.groovy-lang.org/viewType.html?buildTypeId=Groovy_BintrayIntegration_GvmBroadcast">the GVM broadcast configuration</a>, click on the 3 dots near <code>run</code> then on the <em>parameters</em> tab, fill
+in the <code>groovyVersion</code> parameter. Click on <code>run build</code>.</p>
+</li>
+</ul>
+</div>
+</div>
+</div></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='..\/download.html'>Download</a></li><li><a href='http://groovy-lang.org/support.html'>Support</a></li><li><a href='..\/'>Contribute</a></li><li><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='http://groovy-lang.org/security.html'>Security</a></li><li><a href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='http://groovy-lang.org/search.html'>Search</a></li>
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a href='http://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='http://groovy-lang.org/groovy-weekly.html'>Groovy newsletter</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='http://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li>
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community
+                                        </p><img src='..\img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' class='img-responsive'/>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2019 the Apache Groovy project &mdash; Groovy is Open Source, <a href='http://www.apache.org/licenses/LICENSE-2.0.html'>Apache 2 License</a></div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='..\js/vendor/jquery-1.10.2.min.js' defer></script><script src='..\js/vendor/classie.js' defer></script><script src='..\js/vendor/bootstrap.js' defer></script><script src='..\js/vendor/sidebarEffects.js' defer></script><script src='..\js/vendor/modernizr-2.6.2.min.js' defer></script><script src='..\js/plugins.js' defer></script><script src='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js'></script><script>document.addEventListener('DOMContentLoaded',prettyPrint)</script><script>
+          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file