packages feed

knit-haskell 0.5.0.0 → 0.6.0.0

raw patch · 25 files changed

+4549/−297 lines, 25 filesdep +constraintsdep +polysemy-RandomFudep +polysemy-zoodep ~polysemy-pluginPVP ok

version bump matches the API change (PVP)

Dependencies added: constraints, polysemy-RandomFu, polysemy-zoo

Dependency ranges changed: polysemy-plugin

API changes (from Hackage documentation)

- Knit.Effect.PandocMonad: instance (Polysemy.Internal.Union.Member (Polysemy.Error.Error Text.Pandoc.Error.PandocError) r, Knit.Effect.PandocMonad.PandocEffects r) => Text.Pandoc.Class.PandocMonad (Knit.Effect.PandocMonad.PandocMonadSem r)
- Knit.Effect.PandocMonad: instance GHC.Base.Applicative (Knit.Effect.PandocMonad.PandocMonadSem r)
- Knit.Effect.PandocMonad: instance GHC.Base.Functor (Knit.Effect.PandocMonad.PandocMonadSem r)
- Knit.Effect.PandocMonad: instance GHC.Base.Monad (Knit.Effect.PandocMonad.PandocMonadSem r)
- Knit.Effect.PandocMonad: instance Polysemy.Internal.Union.Member (Polysemy.Error.Error Text.Pandoc.Error.PandocError) r => Control.Monad.Error.Class.MonadError Text.Pandoc.Error.PandocError (Knit.Effect.PandocMonad.PandocMonadSem r)
- Knit.Effect.RandomFu: absorbMonadRandom :: Member RandomFu r => (forall m. MonadRandom m => m a) -> Sem r a
- Knit.Effect.RandomFu: data RandomFu m r
- Knit.Effect.RandomFu: instance GHC.Base.Applicative (Knit.Effect.RandomFu.RandomFuSem r)
- Knit.Effect.RandomFu: instance GHC.Base.Functor (Knit.Effect.RandomFu.RandomFuSem r)
- Knit.Effect.RandomFu: instance GHC.Base.Monad (Knit.Effect.RandomFu.RandomFuSem r)
- Knit.Effect.RandomFu: instance Polysemy.Internal.Union.Member Knit.Effect.RandomFu.RandomFu r => Data.Random.Internal.Source.MonadRandom (Knit.Effect.RandomFu.RandomFuSem r)
- Knit.Effect.RandomFu: runRandomFuFromSource :: forall s effs a. RandomSource (Sem effs) s => s -> Sem (RandomFu : effs) a -> Sem effs a
- Knit.Effect.RandomFu: runRandomFuIOPureMT :: MonadIO (Sem effs) => PureMT -> Sem (RandomFu : effs) a -> Sem effs a
- Knit.Effect.RandomFu: runRandomFuIOSimple :: forall effs a. MonadIO (Sem effs) => Sem (RandomFu : effs) a -> Sem effs a
- Knit.Effect.RandomFu: sampleDist :: (Member RandomFu effs, Distribution d t) => d t -> Sem effs t
- Knit.Effect.RandomFu: sampleRVar :: Member RandomFu effs => RVar t -> Sem effs t
- Knit.Effect.RandomFu: type Random = RandomFu
- Knit.Report: PandocWriterConfig :: Maybe FilePath -> Map String String -> (WriterOptions -> WriterOptions) -> PandocWriterConfig
- Knit.Report: [optionsF] :: PandocWriterConfig -> WriterOptions -> WriterOptions
- Knit.Report: [templateFP] :: PandocWriterConfig -> Maybe FilePath
- Knit.Report: [templateVars] :: PandocWriterConfig -> Map String String
- Knit.Report: data PandocWriterConfig
+ Knit.Effect.PandocMonad: instance forall (m :: * -> *) k (s' :: k). GHC.Base.Applicative m => GHC.Base.Applicative (Knit.Effect.PandocMonad.Action m s')
+ Knit.Effect.PandocMonad: instance forall (m :: * -> *) k (s' :: k). GHC.Base.Functor m => GHC.Base.Functor (Knit.Effect.PandocMonad.Action m s')
+ Knit.Effect.PandocMonad: instance forall (m :: * -> *) k (s' :: k). GHC.Base.Monad m => GHC.Base.Monad (Knit.Effect.PandocMonad.Action m s')
+ Knit.Effect.PandocMonad: instance forall k (m :: * -> *) (s' :: k). (GHC.Base.Monad m, Control.Monad.Error.Class.MonadError Text.Pandoc.Error.PandocError (Knit.Effect.PandocMonad.Action m s'), Data.Reflection.Reifies s' (Knit.Effect.PandocMonad.PandocDict m)) => Text.Pandoc.Class.PandocMonad (Knit.Effect.PandocMonad.Action m s')
+ Knit.Effect.PandocMonad: instance forall k (m :: * -> *) (s' :: k). (GHC.Base.Monad m, Data.Reflection.Reifies s' (Knit.Effect.PandocMonad.PandocDict m)) => Control.Monad.Error.Class.MonadError Text.Pandoc.Error.PandocError (Knit.Effect.PandocMonad.Action m s')
+ Knit.Report: writeAllPandocResultsWithInfoAsHtml :: Text -> [DocWithInfo PandocInfo Text] -> IO ()
+ Knit.Report: writePandocResultWithInfoAsHtml :: Text -> DocWithInfo PandocInfo Text -> IO ()
+ Knit.Report.Output: DefaultTemplate :: TemplatePath
+ Knit.Report.Output: FromIncludedCssDir :: Text -> CssPath
+ Knit.Report.Output: FromIncludedTemplateDir :: Text -> TemplatePath
+ Knit.Report.Output: FullySpecifiedCssPath :: Text -> CssPath
+ Knit.Report.Output: FullySpecifiedTemplatePath :: Text -> TemplatePath
+ Knit.Report.Output: addCss :: CssPath -> TemplateVariables -> IO TemplateVariables
+ Knit.Report.Output: data CssPath
+ Knit.Report.Output: data TemplatePath
+ Knit.Report.Output: mkPandocWriterConfig :: TemplatePath -> TemplateVariables -> WriterOptionsF -> IO PandocWriterConfig
+ Knit.Report.Output: type TemplateVariables = Map String String
+ Knit.Report.Output: type WriterOptionsF = WriterOptions -> WriterOptions
+ Knit.Report.Output: writeAllPandocResultsWithInfo :: Text -> Text -> [DocWithInfo PandocInfo Text] -> IO ()
+ Knit.Report.Output: writeAndMakePath :: Text -> (a -> Text) -> a -> IO ()
+ Knit.Report.Output: writeAndMakePathLT :: Text -> Text -> IO ()
+ Knit.Report.Output: writePandocResultWithInfo :: Text -> Text -> DocWithInfo PandocInfo Text -> IO ()
+ Knit.Report.Output.Html: writeAllPandocResultsWithInfoAsHtml :: Text -> [DocWithInfo PandocInfo Text] -> IO ()
+ Knit.Report.Output.Html: writePandocResultWithInfoAsHtml :: Text -> DocWithInfo PandocInfo Text -> IO ()
- Knit.Effect.PandocMonad: absorbPandocMonad :: (Member (Error PandocError) r, PandocEffects r) => (forall m. PandocMonad m => m a) -> Sem r a
+ Knit.Effect.PandocMonad: absorbPandocMonad :: Members '[Error PandocError, Pandoc] r => (PandocMonad (Sem r) => Sem r a) -> Sem r a
- Knit.Effect.PandocMonad: fileExists :: forall r_aGeO. Member Pandoc r_aGeO => FilePath -> Sem r_aGeO Bool
+ Knit.Effect.PandocMonad: fileExists :: forall r_aOiF. Member Pandoc r_aOiF => FilePath -> Sem r_aOiF Bool
- Knit.Effect.PandocMonad: getCommonState :: forall r_aGeR. Member Pandoc r_aGeR => Sem r_aGeR CommonState
+ Knit.Effect.PandocMonad: getCommonState :: forall r_aOiI. Member Pandoc r_aOiI => Sem r_aOiI CommonState
- Knit.Effect.PandocMonad: getCurrentTime :: forall r_aGeG. Member Pandoc r_aGeG => Sem r_aGeG UTCTime
+ Knit.Effect.PandocMonad: getCurrentTime :: forall r_aOix. Member Pandoc r_aOix => Sem r_aOix UTCTime
- Knit.Effect.PandocMonad: getCurrentTimeZone :: forall r_aGeH. Member Pandoc r_aGeH => Sem r_aGeH TimeZone
+ Knit.Effect.PandocMonad: getCurrentTimeZone :: forall r_aOiy. Member Pandoc r_aOiy => Sem r_aOiy TimeZone
- Knit.Effect.PandocMonad: getDataFileName :: forall r_aGeP. Member Pandoc r_aGeP => FilePath -> Sem r_aGeP [Char]
+ Knit.Effect.PandocMonad: getDataFileName :: forall r_aOiG. Member Pandoc r_aOiG => FilePath -> Sem r_aOiG [Char]
- Knit.Effect.PandocMonad: getModificationTime :: forall r_aGeQ. Member Pandoc r_aGeQ => FilePath -> Sem r_aGeQ UTCTime
+ Knit.Effect.PandocMonad: getModificationTime :: forall r_aOiH. Member Pandoc r_aOiH => FilePath -> Sem r_aOiH UTCTime
- Knit.Effect.PandocMonad: getsCommonState :: forall r_aGeT r_aF1k. Member Pandoc r_aGeT => (CommonState -> r_aF1k) -> Sem r_aGeT r_aF1k
+ Knit.Effect.PandocMonad: getsCommonState :: forall r_aOiK r_aNux. Member Pandoc r_aOiK => (CommonState -> r_aNux) -> Sem r_aOiK r_aNux
- Knit.Effect.PandocMonad: glob :: forall r_aGeN. Member Pandoc r_aGeN => String -> Sem r_aGeN [[Char]]
+ Knit.Effect.PandocMonad: glob :: forall r_aOiE. Member Pandoc r_aOiE => String -> Sem r_aOiE [[Char]]
- Knit.Effect.PandocMonad: logOutput :: forall r_aGeV. Member Pandoc r_aGeV => LogMessage -> Sem r_aGeV ()
+ Knit.Effect.PandocMonad: logOutput :: forall r_aOiM. Member Pandoc r_aOiM => LogMessage -> Sem r_aOiM ()
- Knit.Effect.PandocMonad: lookupEnv :: forall r_aGeF. Member Pandoc r_aGeF => String -> Sem r_aGeF (Maybe [Char])
+ Knit.Effect.PandocMonad: lookupEnv :: forall r_aOiw. Member Pandoc r_aOiw => String -> Sem r_aOiw (Maybe [Char])
- Knit.Effect.PandocMonad: modifyCommonState :: forall r_aGeU. Member Pandoc r_aGeU => (CommonState -> CommonState) -> Sem r_aGeU ()
+ Knit.Effect.PandocMonad: modifyCommonState :: forall r_aOiL. Member Pandoc r_aOiL => (CommonState -> CommonState) -> Sem r_aOiL ()
- Knit.Effect.PandocMonad: newStdGen :: forall r_aGeI. Member Pandoc r_aGeI => Sem r_aGeI StdGen
+ Knit.Effect.PandocMonad: newStdGen :: forall r_aOiz. Member Pandoc r_aOiz => Sem r_aOiz StdGen
- Knit.Effect.PandocMonad: newUniqueHash :: forall r_aGeJ. Member Pandoc r_aGeJ => Sem r_aGeJ Int
+ Knit.Effect.PandocMonad: newUniqueHash :: forall r_aOiA. Member Pandoc r_aOiA => Sem r_aOiA Int
- Knit.Effect.PandocMonad: openURL :: forall r_aGeK. Member Pandoc r_aGeK => String -> Sem r_aGeK (ByteString, Maybe [Char])
+ Knit.Effect.PandocMonad: openURL :: forall r_aOiB. Member Pandoc r_aOiB => String -> Sem r_aOiB (ByteString, Maybe [Char])
- Knit.Effect.PandocMonad: putCommonState :: forall r_aGeS. Member Pandoc r_aGeS => CommonState -> Sem r_aGeS ()
+ Knit.Effect.PandocMonad: putCommonState :: forall r_aOiJ. Member Pandoc r_aOiJ => CommonState -> Sem r_aOiJ ()
- Knit.Effect.PandocMonad: readFileLazy :: forall r_aGeL. Member Pandoc r_aGeL => FilePath -> Sem r_aGeL ByteString
+ Knit.Effect.PandocMonad: readFileLazy :: forall r_aOiC. Member Pandoc r_aOiC => FilePath -> Sem r_aOiC ByteString
- Knit.Effect.PandocMonad: readFileStrict :: forall r_aGeM. Member Pandoc r_aGeM => FilePath -> Sem r_aGeM ByteString
+ Knit.Effect.PandocMonad: readFileStrict :: forall r_aOiD. Member Pandoc r_aOiD => FilePath -> Sem r_aOiD ByteString
- Knit.Effect.PandocMonad: trace :: forall r_aGeW. Member Pandoc r_aGeW => String -> Sem r_aGeW ()
+ Knit.Effect.PandocMonad: trace :: forall r_aOiN. Member Pandoc r_aOiN => String -> Sem r_aOiN ()
- Knit.Report.Output: PandocWriterConfig :: Maybe FilePath -> Map String String -> (WriterOptions -> WriterOptions) -> PandocWriterConfig
+ Knit.Report.Output: PandocWriterConfig :: Maybe FilePath -> TemplateVariables -> WriterOptionsF -> PandocWriterConfig
- Knit.Report.Output: [optionsF] :: PandocWriterConfig -> WriterOptions -> WriterOptions
+ Knit.Report.Output: [optionsF] :: PandocWriterConfig -> WriterOptionsF
- Knit.Report.Output: [templateVars] :: PandocWriterConfig -> Map String String
+ Knit.Report.Output: [templateVars] :: PandocWriterConfig -> TemplateVariables

Files

ChangeLog.md view
@@ -1,4 +1,19 @@-* v 0.5.0.0+v 0.6.0.0+* updated to use polysemy-zoo version of constraint absorbers in PandocMonad.+* Hackage download should now include templates and associated css+* Added mkPandocWriterConfig and addCss function in Knit.Report.Output to handle loading things in +the included directory, which may be installed in a platform independent way.+* Added two more html templates, pandoc-bootstrap-KH.html and pandoc-adaptive-bootstrap-KH.html+with pandoc-bootstrap.css and used them in some of the examples.+* Added the default html templates into the pandoc-templates directory where Pandoc will expect+them if the given template fails.+* Reorganized data directory with "pandoc-data" "knit-haskell-templates" and "knit-haskell-css"+* Added output helpers for Pandoc results which are lazy text (html).  These create the+required parent directories if necessary. See examples for details.+* Removed ```Knit.Effect.RandomFu``` and modified the example which uses it to use the+"polysemy-RandomFu" package instead.++v 0.5.0.0 * Added plots example back since there is a version of plots on hackage with  a relaxed upper bound on containers. * Changed the Doc effect so that instead of Text name, it carries a polymorphic info type.  
+ Readme.md view
@@ -0,0 +1,80 @@+# knit-haskell v0.6.0.0++[![Build Status][travis-badge]][travis]+[![Hackage][hackage-badge]][hackage]+[![Hackage Dependencies][hackage-deps-badge]][hackage-deps]++## Introduction+knit-haskell is an attempt to emulate parts of the RMarkdown/knitR experience in haskell. +The idea is to be able to build HTML (or, perhaps, some other things [Pandoc](http://hackage.haskell.org/package/pandoc) can write) +inside a haskell executable.  +This package has some wrapping around Pandoc and the [PandocMonad](http://hackage.haskell.org/package/pandoc-2.7.2/docs/Text-Pandoc-Class.html#t:PandocMonad) +as well as logging facilities +and some support for inserting [hvega](http://hackage.haskell.org/package/hvega) visualizations.  +All of that is handled via writer-like effects, so additions to the documents can be interspersed with regular haskell code.++## Supported Inputs+* [markdown](https://pandoc.org/MANUAL.html#pandocs-markdown)+* HTML ([blaze](http://hackage.haskell.org/package/blaze-html), [lucid](http://hackage.haskell.org/package/lucid) or Text)+* [latex](https://en.wikipedia.org/wiki/LaTeX)+* [colonnade tables](https://hackage.haskell.org/package/colonnade)+* [hvega](http://hackage.haskell.org/package/hvega) visualizations (via [blaze](http://hackage.haskell.org/package/blaze-html) HTML) +* [Diagrams](https://archives.haskell.org/projects.haskell.org/diagrams/) (via Diagrams SVG backend, inserted as HTML) ++## Examples+There are a few examples in the "examples" directory.  +* [SimpleExample](https://github.com/adamConnerSax/knit-haskell/blob/master/examples/SimpleExample.hs) +demonstrates the bare bones features of the library.  Creating a document from a few fragments and then +"knitting" it into HTML text and writing that to a file. This includes hvega, diagrams and plots examples.+* [MultiDocExample](https://github.com/adamConnerSax/knit-haskell/blob/master/examples/MultiDocExample.hs) +demonstrates how to build multiple documents.+* [MtlExample](https://github.com/adamConnerSax/knit-haskell/blob/master/examples/MtlExample.hs) +demonstrates the same simple features as above, but runs them atop an example mtl stack, +allowing access to the mtl stack's functionality during document assembly.+* [RandomExample](https://github.com/adamConnerSax/knit-haskell/blob/master/examples/RandomExample.hs) +builds on the mtl example to show how you can also add an additional polysemy effect (in this case, +Polysemy.RandomFu from [polysemy-RandomFu](https://hackage.haskell.org/package/polysemy-RandomFu))+to your document-building. +This one also demonstrates a use of [colonnade](https://hackage.haskell.org/package/colonnade) +for adding a formatted table to the document.+* [ErrorExample](https://github.com/adamConnerSax/knit-haskell/blob/master/examples/ErrorExample.hs).  +Similar to "SimpleExample" but throws a user error during document assembly.++## Notes+* You should be able to get everything you need by just importing the +[Knit.Report](https://github.com/adamConnerSax/knit-haskell/blob/master/src/Knit/Report.hs) +module.  That has the main functions for "knitting" documents from fragments +and re-exports all the required functions to input the supported fragment types and create/write Html.+* This uses [polysemy](https://github.com/isovector/polysemy#readme) for its effect management rather than mtl.  +Effects are provided for logging and generating [random-fu](http://hackage.haskell.org/package/random-fu) style random numbers.  +Polysemy's inference and performance are improved greatly if you enable the [polysemy-plugin](https://hackage.haskell.org/package/polysemy-plugin),+which involves:+1. adding "polysemy-plugin" in build-depends and+2. Add "ghc-options: -fplugin=Polysemy.Plugin" to your package configuration.+Pandoc effects and writer effects for document building are also provided.+* Polysemy is capable of "absorbing" some mtl-style monad constraints.  This is demonstrated in+the [Random](https://github.com/adamConnerSax/knit-haskell/blob/master/examples/RandomExample.hs#L96) and+composable absorbers for MonadReader, MonadWriter, MonadState and MonadError+can be found in the [polysemy-zoo](https://github.com/isovector/polysemy-zoo).+* Pandoc templates are included for HTML output.  See the examples for how to access them+or specify others.+* Though you can theoretically output to any format Pandoc can +write--and it would be great to add some output formats!--some +features only work with some output formats. +My goal was the production of Html and that is the only output format that supports the hvega charting +since hvega itself is just a wrapper that builds javascript to render in a browser.  +And so far that is the only supported output format.++* This is very much a WIP. So it's rough around the edges and in the middle.  If you find it useful but have suggestions, please submit issues on github.+* I'm very interested in adding to the "zoo" of input fragments.  Any PRs of that sort would be most welcome!+* I'm also interested in widening the possible output types--currently only HTML is supported--but +that is quite limited now by hvega which only works in html output.  +But support could be added for other output types if hvega input is not required.+++[travis]:        <https://travis-ci.org/adamConnerSax/knit-haskell>+[travis-badge]:  <https://travis-ci.org/adamConnerSax/knit-haskell.svg?branch=master>+[hackage]:       <https://hackage.haskell.org/package/knit-haskell>+[hackage-badge]: <https://img.shields.io/hackage/v/knit-haskell.svg>+[hackage-deps-badge]: <https://img.shields.io/hackage-deps/v/knit-haskell.svg>+[hackage-deps]: <http://packdeps.haskellers.com/feed?needle=knit-haskell>
+ data/knit-haskell-css/pandoc-bootstrap.css view
@@ -0,0 +1,3051 @@+/*!+  This is a modified version of Bootstrap.+  Bootstrap code comes first, customizations are at the end of the file.+*/++/*!+ * Bootstrap v2.3.2+ *+ * Copyright 2012 Twitter, Inc+ * Licensed under the Apache License v2.0+ * http://www.apache.org/licenses/LICENSE-2.0+ *+ * Designed and built with all the love in the world @twitter by @mdo and @fat.+ */+.clearfix {+  *zoom: 1;+}+.clearfix:before,+.clearfix:after {+  display: table;+  content: "";+  line-height: 0;+}+.clearfix:after {+  clear: both;+}+.hide-text {+  font: 0/0 a;+  color: transparent;+  text-shadow: none;+  background-color: transparent;+  border: 0;+}+.input-block-level {+  display: block;+  width: 100%;+  min-height: 30px;+  -webkit-box-sizing: border-box;+  -moz-box-sizing: border-box;+  box-sizing: border-box;+}+article,+aside,+details,+figcaption,+figure,+footer,+header,+hgroup,+nav,+section {+  display: block;+}+audio,+canvas,+video {+  display: inline-block;+  *display: inline;+  *zoom: 1;+}+audio:not([controls]) {+  display: none;+}+html {+  font-size: 100%;+  -webkit-text-size-adjust: 100%;+  -ms-text-size-adjust: 100%;+}+a:focus {+  outline: thin dotted #333;+  outline: 5px auto -webkit-focus-ring-color;+  outline-offset: -2px;+}+a:hover,+a:active {+  outline: 0;+}+sub,+sup {+  position: relative;+  font-size: 75%;+  line-height: 0;+  vertical-align: baseline;+}+sup {+  top: -0.5em;+}+sub {+  bottom: -0.25em;+}+img {+  /* Responsive images (ensure images don't scale beyond their parents) */++  max-width: 100%;+  /* Part 1: Set a maxium relative to the parent */++  width: auto\9;+  /* IE7-8 need help adjusting responsive images */++  height: auto;+  /* Part 2: Scale the height according to the width, otherwise you get stretching */++  vertical-align: middle;+  border: 0;+  -ms-interpolation-mode: bicubic;+}+#map_canvas img,+.google-maps img {+  max-width: none;+}+button,+input,+select,+textarea {+  margin: 0;+  font-size: 100%;+  vertical-align: middle;+}+button,+input {+  *overflow: visible;+  line-height: normal;+}+button::-moz-focus-inner,+input::-moz-focus-inner {+  padding: 0;+  border: 0;+}+button,+html input[type="button"],+input[type="reset"],+input[type="submit"] {+  -webkit-appearance: button;+  cursor: pointer;+}+label,+select,+button,+input[type="button"],+input[type="reset"],+input[type="submit"],+input[type="radio"],+input[type="checkbox"] {+  cursor: pointer;+}+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-decoration,+input[type="search"]::-webkit-search-cancel-button {+  -webkit-appearance: none;+}+textarea {+  overflow: auto;+  vertical-align: top;+}+@media print {+  * {+    text-shadow: none !important;+    color: #000 !important;+    background: transparent !important;+    box-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: 0.5cm;+  }+  p,+  h2,+  h3 {+    orphans: 3;+    widows: 3;+  }+  h2,+  h3 {+    page-break-after: avoid;+  }+}+body {+  margin: 0;+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;+  font-size: 14px;+  line-height: 20px;+  color: #333333;+  background-color: #ffffff;+}+a {+  color: #0088cc;+  text-decoration: none;+}+a:hover,+a:focus {+  color: #005580;+  text-decoration: underline;+}+.img-rounded {+  -webkit-border-radius: 6px;+  -moz-border-radius: 6px;+  border-radius: 6px;+}+.img-polaroid {+  padding: 4px;+  background-color: #fff;+  border: 1px solid #ccc;+  border: 1px solid rgba(0, 0, 0, 0.2);+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);+  -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);+}+.img-circle {+  -webkit-border-radius: 500px;+  -moz-border-radius: 500px;+  border-radius: 500px;+}+.row {+  margin-left: -20px;+  *zoom: 1;+}+.row:before,+.row:after {+  display: table;+  content: "";+  line-height: 0;+}+.row:after {+  clear: both;+}+[class*="span"] {+  float: left;+  min-height: 1px;+  margin-left: 20px;+}+.container,+.navbar-static-top .container,+.navbar-fixed-top .container,+.navbar-fixed-bottom .container {+  width: 940px;+}+.span12 {+  width: 940px;+}+.span11 {+  width: 860px;+}+.span10 {+  width: 780px;+}+.span9 {+  width: 700px;+}+.span8 {+  width: 620px;+}+.span7 {+  width: 540px;+}+.span6 {+  width: 460px;+}+.span5 {+  width: 380px;+}+.span4 {+  width: 300px;+}+.span3 {+  width: 220px;+}+.span2 {+  width: 140px;+}+.span1 {+  width: 60px;+}+.offset12 {+  margin-left: 980px;+}+.offset11 {+  margin-left: 900px;+}+.offset10 {+  margin-left: 820px;+}+.offset9 {+  margin-left: 740px;+}+.offset8 {+  margin-left: 660px;+}+.offset7 {+  margin-left: 580px;+}+.offset6 {+  margin-left: 500px;+}+.offset5 {+  margin-left: 420px;+}+.offset4 {+  margin-left: 340px;+}+.offset3 {+  margin-left: 260px;+}+.offset2 {+  margin-left: 180px;+}+.offset1 {+  margin-left: 100px;+}+.row-fluid {+  width: 100%;+  *zoom: 1;+}+.row-fluid:before,+.row-fluid:after {+  display: table;+  content: "";+  line-height: 0;+}+.row-fluid:after {+  clear: both;+}+.row-fluid [class*="span"] {+  display: block;+  width: 100%;+  min-height: 30px;+  -webkit-box-sizing: border-box;+  -moz-box-sizing: border-box;+  box-sizing: border-box;+  float: left;+  margin-left: 2.127659574468085%;+  *margin-left: 2.074468085106383%;+}+.row-fluid [class*="span"]:first-child {+  margin-left: 0;+}+.row-fluid .controls-row [class*="span"] + [class*="span"] {+  margin-left: 2.127659574468085%;+}+.row-fluid .span12 {+  width: 100%;+  *width: 99.94680851063829%;+}+.row-fluid .span11 {+  width: 91.48936170212765%;+  *width: 91.43617021276594%;+}+.row-fluid .span10 {+  width: 82.97872340425532%;+  *width: 82.92553191489361%;+}+.row-fluid .span9 {+  width: 74.46808510638297%;+  *width: 74.41489361702126%;+}+.row-fluid .span8 {+  width: 65.95744680851064%;+  *width: 65.90425531914893%;+}+.row-fluid .span7 {+  width: 57.44680851063829%;+  *width: 57.39361702127659%;+}+.row-fluid .span6 {+  width: 48.93617021276595%;+  *width: 48.88297872340425%;+}+.row-fluid .span5 {+  width: 40.42553191489362%;+  *width: 40.37234042553192%;+}+.row-fluid .span4 {+  width: 31.914893617021278%;+  *width: 31.861702127659576%;+}+.row-fluid .span3 {+  width: 23.404255319148934%;+  *width: 23.351063829787233%;+}+.row-fluid .span2 {+  width: 14.893617021276595%;+  *width: 14.840425531914894%;+}+.row-fluid .span1 {+  width: 6.382978723404255%;+  *width: 6.329787234042553%;+}+.row-fluid .offset12 {+  margin-left: 104.25531914893617%;+  *margin-left: 104.14893617021275%;+}+.row-fluid .offset12:first-child {+  margin-left: 102.12765957446808%;+  *margin-left: 102.02127659574467%;+}+.row-fluid .offset11 {+  margin-left: 95.74468085106382%;+  *margin-left: 95.6382978723404%;+}+.row-fluid .offset11:first-child {+  margin-left: 93.61702127659574%;+  *margin-left: 93.51063829787232%;+}+.row-fluid .offset10 {+  margin-left: 87.23404255319149%;+  *margin-left: 87.12765957446807%;+}+.row-fluid .offset10:first-child {+  margin-left: 85.1063829787234%;+  *margin-left: 84.99999999999999%;+}+.row-fluid .offset9 {+  margin-left: 78.72340425531914%;+  *margin-left: 78.61702127659572%;+}+.row-fluid .offset9:first-child {+  margin-left: 76.59574468085106%;+  *margin-left: 76.48936170212764%;+}+.row-fluid .offset8 {+  margin-left: 70.2127659574468%;+  *margin-left: 70.10638297872339%;+}+.row-fluid .offset8:first-child {+  margin-left: 68.08510638297872%;+  *margin-left: 67.9787234042553%;+}+.row-fluid .offset7 {+  margin-left: 61.70212765957446%;+  *margin-left: 61.59574468085106%;+}+.row-fluid .offset7:first-child {+  margin-left: 59.574468085106375%;+  *margin-left: 59.46808510638297%;+}+.row-fluid .offset6 {+  margin-left: 53.191489361702125%;+  *margin-left: 53.085106382978715%;+}+.row-fluid .offset6:first-child {+  margin-left: 51.063829787234035%;+  *margin-left: 50.95744680851063%;+}+.row-fluid .offset5 {+  margin-left: 44.68085106382979%;+  *margin-left: 44.57446808510638%;+}+.row-fluid .offset5:first-child {+  margin-left: 42.5531914893617%;+  *margin-left: 42.4468085106383%;+}+.row-fluid .offset4 {+  margin-left: 36.170212765957444%;+  *margin-left: 36.06382978723405%;+}+.row-fluid .offset4:first-child {+  margin-left: 34.04255319148936%;+  *margin-left: 33.93617021276596%;+}+.row-fluid .offset3 {+  margin-left: 27.659574468085104%;+  *margin-left: 27.5531914893617%;+}+.row-fluid .offset3:first-child {+  margin-left: 25.53191489361702%;+  *margin-left: 25.425531914893618%;+}+.row-fluid .offset2 {+  margin-left: 19.148936170212764%;+  *margin-left: 19.04255319148936%;+}+.row-fluid .offset2:first-child {+  margin-left: 17.02127659574468%;+  *margin-left: 16.914893617021278%;+}+.row-fluid .offset1 {+  margin-left: 10.638297872340425%;+  *margin-left: 10.53191489361702%;+}+.row-fluid .offset1:first-child {+  margin-left: 8.51063829787234%;+  *margin-left: 8.404255319148938%;+}+[class*="span"].hide,+.row-fluid [class*="span"].hide {+  display: none;+}+[class*="span"].pull-right,+.row-fluid [class*="span"].pull-right {+  float: right;+}+.container {+  margin-right: auto;+  margin-left: auto;+  *zoom: 1;+}+.container:before,+.container:after {+  display: table;+  content: "";+  line-height: 0;+}+.container:after {+  clear: both;+}+.container-fluid {+  padding-right: 20px;+  padding-left: 20px;+  *zoom: 1;+}+.container-fluid:before,+.container-fluid:after {+  display: table;+  content: "";+  line-height: 0;+}+.container-fluid:after {+  clear: both;+}+p {+  margin: 0 0 10px;+}+.lead {+  margin-bottom: 20px;+  font-size: 21px;+  font-weight: 200;+  line-height: 30px;+}+small {+  font-size: 85%;+}+strong {+  font-weight: bold;+}+em {+  font-style: italic;+}+cite {+  font-style: normal;+}+.muted {+  color: #999999;+}+a.muted:hover,+a.muted:focus {+  color: #808080;+}+.text-warning {+  color: #c09853;+}+a.text-warning:hover,+a.text-warning:focus {+  color: #a47e3c;+}+.text-error {+  color: #b94a48;+}+a.text-error:hover,+a.text-error:focus {+  color: #953b39;+}+.text-info {+  color: #3a87ad;+}+a.text-info:hover,+a.text-info:focus {+  color: #2d6987;+}+.text-success {+  color: #468847;+}+a.text-success:hover,+a.text-success:focus {+  color: #356635;+}+.text-left {+  text-align: left;+}+.text-right {+  text-align: right;+}+.text-center {+  text-align: center;+}+h1,+h2,+h3,+h4,+h5,+h6 {+  margin: 10px 0;+  font-family: inherit;+  font-weight: bold;+  line-height: 20px;+  color: inherit;+  text-rendering: optimizelegibility;+}+h1 small,+h2 small,+h3 small,+h4 small,+h5 small,+h6 small {+  font-weight: normal;+  line-height: 1;+  color: #999999;+}+h1,+h2,+h3 {+  line-height: 40px;+}+h1 {+  font-size: 38.5px;+}+h2 {+  font-size: 31.5px;+}+h3 {+  font-size: 24.5px;+}+h4 {+  font-size: 17.5px;+}+h5 {+  font-size: 14px;+}+h6 {+  font-size: 11.9px;+}+h1 small {+  font-size: 24.5px;+}+h2 small {+  font-size: 17.5px;+}+h3 small {+  font-size: 14px;+}+h4 small {+  font-size: 14px;+}+.page-header {+  padding-bottom: 9px;+  margin: 20px 0 30px;+  border-bottom: 1px solid #eeeeee;+}+ul,+ol {+  padding: 0;+  margin: 0 0 10px 25px;+}+ul ul,+ul ol,+ol ol,+ol ul {+  margin-bottom: 0;+}+li {+  line-height: 20px;+}+ul.unstyled,+ol.unstyled {+  margin-left: 0;+  list-style: none;+}+ul.inline,+ol.inline {+  margin-left: 0;+  list-style: none;+}+ul.inline > li,+ol.inline > li {+  display: inline-block;+  *display: inline;+  /* IE7 inline-block hack */++  *zoom: 1;+  padding-left: 5px;+  padding-right: 5px;+}+dl {+  margin-bottom: 20px;+}+dt,+dd {+  line-height: 20px;+}+dt {+  font-weight: bold;+}+dd {+  margin-left: 10px;+}+.dl-horizontal {+  *zoom: 1;+}+.dl-horizontal:before,+.dl-horizontal:after {+  display: table;+  content: "";+  line-height: 0;+}+.dl-horizontal:after {+  clear: both;+}+.dl-horizontal dt {+  float: left;+  width: 160px;+  clear: left;+  text-align: right;+  overflow: hidden;+  text-overflow: ellipsis;+  white-space: nowrap;+}+.dl-horizontal dd {+  margin-left: 180px;+}+hr {+  margin: 20px 0;+  border: 0;+  border-top: 1px solid #eeeeee;+  border-bottom: 1px solid #ffffff;+}+abbr[title],+abbr[data-original-title] {+  cursor: help;+  border-bottom: 1px dotted #999999;+}+abbr.initialism {+  font-size: 90%;+  text-transform: uppercase;+}+blockquote {+  padding: 0 0 0 15px;+  margin: 0 0 20px;+  border-left: 5px solid #eeeeee;+}+blockquote p {+  margin-bottom: 0;+  font-size: 17.5px;+  font-weight: 300;+  line-height: 1.25;+}+blockquote small {+  display: block;+  line-height: 20px;+  color: #999999;+}+blockquote small:before {+  content: '\2014 \00A0';+}+blockquote.pull-right {+  float: right;+  padding-right: 15px;+  padding-left: 0;+  border-right: 5px solid #eeeeee;+  border-left: 0;+}+blockquote.pull-right p,+blockquote.pull-right small {+  text-align: right;+}+blockquote.pull-right small:before {+  content: '';+}+blockquote.pull-right small:after {+  content: '\00A0 \2014';+}+q:before,+q:after,+blockquote:before,+blockquote:after {+  content: "";+}+address {+  display: block;+  margin-bottom: 20px;+  font-style: normal;+  line-height: 20px;+}+code,+pre {+  padding: 0 3px 2px;+  font-family: Monaco, Menlo, Consolas, "Courier New", monospace;+  font-size: 12px;+  color: #333333;+  -webkit-border-radius: 3px;+  -moz-border-radius: 3px;+  border-radius: 3px;+}+code {+  padding: 2px 4px;+  color: #d14;+  background-color: #f7f7f9;+  border: 1px solid #e1e1e8;+  white-space: nowrap;+}+pre {+  display: block;+  padding: 9.5px;+  margin: 0 0 10px;+  font-size: 13px;+  line-height: 20px;+  word-break: break-all;+  word-wrap: break-word;+  white-space: pre;+  white-space: pre-wrap;+  background-color: #f5f5f5;+  border: 1px solid #ccc;+  border: 1px solid rgba(0, 0, 0, 0.15);+  -webkit-border-radius: 4px;+  -moz-border-radius: 4px;+  border-radius: 4px;+}+pre.prettyprint {+  margin-bottom: 20px;+}+pre code {+  padding: 0;+  color: inherit;+  white-space: pre;+  white-space: pre-wrap;+  background-color: transparent;+  border: 0;+}+.pre-scrollable {+  max-height: 340px;+  overflow-y: scroll;+}+table {+  max-width: 100%;+  background-color: transparent;+  border-collapse: collapse;+  border-spacing: 0;+}+.table {+  width: 100%;+  margin-bottom: 20px;+}+.table th,+.table td {+  padding: 8px;+  line-height: 20px;+  text-align: left;+  vertical-align: top;+  border-top: 1px solid #dddddd;+}+.table th {+  font-weight: bold;+}+.table thead th {+  vertical-align: bottom;+}+.table caption + thead tr:first-child th,+.table caption + thead tr:first-child td,+.table colgroup + thead tr:first-child th,+.table colgroup + thead tr:first-child td,+.table thead:first-child tr:first-child th,+.table thead:first-child tr:first-child td {+  border-top: 0;+}+.table tbody + tbody {+  border-top: 2px solid #dddddd;+}+.table .table {+  background-color: #ffffff;+}+.table-condensed th,+.table-condensed td {+  padding: 4px 5px;+}+.table-bordered {+  border: 1px solid #dddddd;+  border-collapse: separate;+  *border-collapse: collapse;+  border-left: 0;+  -webkit-border-radius: 4px;+  -moz-border-radius: 4px;+  border-radius: 4px;+}+.table-bordered th,+.table-bordered td {+  border-left: 1px solid #dddddd;+}+.table-bordered caption + thead tr:first-child th,+.table-bordered caption + tbody tr:first-child th,+.table-bordered caption + tbody tr:first-child td,+.table-bordered colgroup + thead tr:first-child th,+.table-bordered colgroup + tbody tr:first-child th,+.table-bordered colgroup + tbody tr:first-child td,+.table-bordered thead:first-child tr:first-child th,+.table-bordered tbody:first-child tr:first-child th,+.table-bordered tbody:first-child tr:first-child td {+  border-top: 0;+}+.table-bordered thead:first-child tr:first-child > th:first-child,+.table-bordered tbody:first-child tr:first-child > td:first-child,+.table-bordered tbody:first-child tr:first-child > th:first-child {+  -webkit-border-top-left-radius: 4px;+  -moz-border-radius-topleft: 4px;+  border-top-left-radius: 4px;+}+.table-bordered thead:first-child tr:first-child > th:last-child,+.table-bordered tbody:first-child tr:first-child > td:last-child,+.table-bordered tbody:first-child tr:first-child > th:last-child {+  -webkit-border-top-right-radius: 4px;+  -moz-border-radius-topright: 4px;+  border-top-right-radius: 4px;+}+.table-bordered thead:last-child tr:last-child > th:first-child,+.table-bordered tbody:last-child tr:last-child > td:first-child,+.table-bordered tbody:last-child tr:last-child > th:first-child,+.table-bordered tfoot:last-child tr:last-child > td:first-child,+.table-bordered tfoot:last-child tr:last-child > th:first-child {+  -webkit-border-bottom-left-radius: 4px;+  -moz-border-radius-bottomleft: 4px;+  border-bottom-left-radius: 4px;+}+.table-bordered thead:last-child tr:last-child > th:last-child,+.table-bordered tbody:last-child tr:last-child > td:last-child,+.table-bordered tbody:last-child tr:last-child > th:last-child,+.table-bordered tfoot:last-child tr:last-child > td:last-child,+.table-bordered tfoot:last-child tr:last-child > th:last-child {+  -webkit-border-bottom-right-radius: 4px;+  -moz-border-radius-bottomright: 4px;+  border-bottom-right-radius: 4px;+}+.table-bordered tfoot + tbody:last-child tr:last-child td:first-child {+  -webkit-border-bottom-left-radius: 0;+  -moz-border-radius-bottomleft: 0;+  border-bottom-left-radius: 0;+}+.table-bordered tfoot + tbody:last-child tr:last-child td:last-child {+  -webkit-border-bottom-right-radius: 0;+  -moz-border-radius-bottomright: 0;+  border-bottom-right-radius: 0;+}+.table-bordered caption + thead tr:first-child th:first-child,+.table-bordered caption + tbody tr:first-child td:first-child,+.table-bordered colgroup + thead tr:first-child th:first-child,+.table-bordered colgroup + tbody tr:first-child td:first-child {+  -webkit-border-top-left-radius: 4px;+  -moz-border-radius-topleft: 4px;+  border-top-left-radius: 4px;+}+.table-bordered caption + thead tr:first-child th:last-child,+.table-bordered caption + tbody tr:first-child td:last-child,+.table-bordered colgroup + thead tr:first-child th:last-child,+.table-bordered colgroup + tbody tr:first-child td:last-child {+  -webkit-border-top-right-radius: 4px;+  -moz-border-radius-topright: 4px;+  border-top-right-radius: 4px;+}+.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 td[class*="span"],+table th[class*="span"],+.row-fluid table td[class*="span"],+.row-fluid table th[class*="span"] {+  display: table-cell;+  float: none;+  margin-left: 0;+}+.table td.span1,+.table th.span1 {+  float: none;+  width: 44px;+  margin-left: 0;+}+.table td.span2,+.table th.span2 {+  float: none;+  width: 124px;+  margin-left: 0;+}+.table td.span3,+.table th.span3 {+  float: none;+  width: 204px;+  margin-left: 0;+}+.table td.span4,+.table th.span4 {+  float: none;+  width: 284px;+  margin-left: 0;+}+.table td.span5,+.table th.span5 {+  float: none;+  width: 364px;+  margin-left: 0;+}+.table td.span6,+.table th.span6 {+  float: none;+  width: 444px;+  margin-left: 0;+}+.table td.span7,+.table th.span7 {+  float: none;+  width: 524px;+  margin-left: 0;+}+.table td.span8,+.table th.span8 {+  float: none;+  width: 604px;+  margin-left: 0;+}+.table td.span9,+.table th.span9 {+  float: none;+  width: 684px;+  margin-left: 0;+}+.table td.span10,+.table th.span10 {+  float: none;+  width: 764px;+  margin-left: 0;+}+.table td.span11,+.table th.span11 {+  float: none;+  width: 844px;+  margin-left: 0;+}+.table td.span12,+.table th.span12 {+  float: none;+  width: 924px;+  margin-left: 0;+}+.table tbody tr.success > td {+  background-color: #dff0d8;+}+.table tbody tr.error > td {+  background-color: #f2dede;+}+.table tbody tr.warning > td {+  background-color: #fcf8e3;+}+.table tbody tr.info > td {+  background-color: #d9edf7;+}+.table-hover tbody tr.success:hover > td {+  background-color: #d0e9c6;+}+.table-hover tbody tr.error:hover > td {+  background-color: #ebcccc;+}+.table-hover tbody tr.warning:hover > td {+  background-color: #faf2cc;+}+.table-hover tbody tr.info:hover > td {+  background-color: #c4e3f3;+}+.nav {+  margin-left: 0;+  margin-bottom: 20px;+  list-style: none;+}+.nav > li > a {+  display: block;+}+.nav > li > a:hover,+.nav > li > a:focus {+  text-decoration: none;+  background-color: #eeeeee;+}+.nav > li > a > img {+  max-width: none;+}+.nav > .pull-right {+  float: right;+}+.nav-header {+  display: block;+  padding: 3px 15px;+  font-size: 11px;+  font-weight: bold;+  line-height: 20px;+  color: #999999;+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);+  text-transform: uppercase;+}+.nav li + .nav-header {+  margin-top: 9px;+}+.nav-list {+  padding-left: 15px;+  padding-right: 15px;+  margin-bottom: 0;+}+.nav-list > li > a,+.nav-list .nav-header {+  margin-left: -15px;+  margin-right: -15px;+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);+}+.nav-list > li > a {+  padding: 3px 15px;+}+.nav-list > .active > a,+.nav-list > .active > a:hover,+.nav-list > .active > a:focus {+  color: #ffffff;+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);+  background-color: #0088cc;+}+.nav-list [class^="icon-"],+.nav-list [class*=" icon-"] {+  margin-right: 2px;+}+.nav-list .divider {+  *width: 100%;+  height: 1px;+  margin: 9px 1px;+  *margin: -5px 0 5px;+  overflow: hidden;+  background-color: #e5e5e5;+  border-bottom: 1px solid #ffffff;+}+.nav-tabs,+.nav-pills {+  *zoom: 1;+}+.nav-tabs:before,+.nav-pills:before,+.nav-tabs:after,+.nav-pills:after {+  display: table;+  content: "";+  line-height: 0;+}+.nav-tabs:after,+.nav-pills:after {+  clear: both;+}+.nav-tabs > li,+.nav-pills > li {+  float: left;+}+.nav-tabs > li > a,+.nav-pills > li > a {+  padding-right: 12px;+  padding-left: 12px;+  margin-right: 2px;+  line-height: 14px;+}+.nav-tabs {+  border-bottom: 1px solid #ddd;+}+.nav-tabs > li {+  margin-bottom: -1px;+}+.nav-tabs > li > a {+  padding-top: 8px;+  padding-bottom: 8px;+  line-height: 20px;+  border: 1px solid transparent;+  -webkit-border-radius: 4px 4px 0 0;+  -moz-border-radius: 4px 4px 0 0;+  border-radius: 4px 4px 0 0;+}+.nav-tabs > li > a:hover,+.nav-tabs > li > a:focus {+  border-color: #eeeeee #eeeeee #dddddd;+}+.nav-tabs > .active > a,+.nav-tabs > .active > a:hover,+.nav-tabs > .active > a:focus {+  color: #555555;+  background-color: #ffffff;+  border: 1px solid #ddd;+  border-bottom-color: transparent;+  cursor: default;+}+.nav-pills > li > a {+  padding-top: 8px;+  padding-bottom: 8px;+  margin-top: 2px;+  margin-bottom: 2px;+  -webkit-border-radius: 5px;+  -moz-border-radius: 5px;+  border-radius: 5px;+}+.nav-pills > .active > a,+.nav-pills > .active > a:hover,+.nav-pills > .active > a:focus {+  color: #ffffff;+  background-color: #0088cc;+}+.nav-stacked > li {+  float: none;+}+.nav-stacked > li > a {+  margin-right: 0;+}+.nav-tabs.nav-stacked {+  border-bottom: 0;+}+.nav-tabs.nav-stacked > li > a {+  border: 1px solid #ddd;+  -webkit-border-radius: 0;+  -moz-border-radius: 0;+  border-radius: 0;+}+.nav-tabs.nav-stacked > li:first-child > a {+  -webkit-border-top-right-radius: 4px;+  -moz-border-radius-topright: 4px;+  border-top-right-radius: 4px;+  -webkit-border-top-left-radius: 4px;+  -moz-border-radius-topleft: 4px;+  border-top-left-radius: 4px;+}+.nav-tabs.nav-stacked > li:last-child > a {+  -webkit-border-bottom-right-radius: 4px;+  -moz-border-radius-bottomright: 4px;+  border-bottom-right-radius: 4px;+  -webkit-border-bottom-left-radius: 4px;+  -moz-border-radius-bottomleft: 4px;+  border-bottom-left-radius: 4px;+}+.nav-tabs.nav-stacked > li > a:hover,+.nav-tabs.nav-stacked > li > a:focus {+  border-color: #ddd;+  z-index: 2;+}+.nav-pills.nav-stacked > li > a {+  margin-bottom: 3px;+}+.nav-pills.nav-stacked > li:last-child > a {+  margin-bottom: 1px;+}+.nav-tabs .dropdown-menu {+  -webkit-border-radius: 0 0 6px 6px;+  -moz-border-radius: 0 0 6px 6px;+  border-radius: 0 0 6px 6px;+}+.nav-pills .dropdown-menu {+  -webkit-border-radius: 6px;+  -moz-border-radius: 6px;+  border-radius: 6px;+}+.nav .dropdown-toggle .caret {+  border-top-color: #0088cc;+  border-bottom-color: #0088cc;+  margin-top: 6px;+}+.nav .dropdown-toggle:hover .caret,+.nav .dropdown-toggle:focus .caret {+  border-top-color: #005580;+  border-bottom-color: #005580;+}+/* move down carets for tabs */+.nav-tabs .dropdown-toggle .caret {+  margin-top: 8px;+}+.nav .active .dropdown-toggle .caret {+  border-top-color: #fff;+  border-bottom-color: #fff;+}+.nav-tabs .active .dropdown-toggle .caret {+  border-top-color: #555555;+  border-bottom-color: #555555;+}+.nav > .dropdown.active > a:hover,+.nav > .dropdown.active > a:focus {+  cursor: pointer;+}+.nav-tabs .open .dropdown-toggle,+.nav-pills .open .dropdown-toggle,+.nav > li.dropdown.open.active > a:hover,+.nav > li.dropdown.open.active > a:focus {+  color: #ffffff;+  background-color: #999999;+  border-color: #999999;+}+.nav li.dropdown.open .caret,+.nav li.dropdown.open.active .caret,+.nav li.dropdown.open a:hover .caret,+.nav li.dropdown.open a:focus .caret {+  border-top-color: #ffffff;+  border-bottom-color: #ffffff;+  opacity: 1;+  filter: alpha(opacity=100);+}+.tabs-stacked .open > a:hover,+.tabs-stacked .open > a:focus {+  border-color: #999999;+}+.tabbable {+  *zoom: 1;+}+.tabbable:before,+.tabbable:after {+  display: table;+  content: "";+  line-height: 0;+}+.tabbable:after {+  clear: both;+}+.tab-content {+  overflow: auto;+}+.tabs-below > .nav-tabs,+.tabs-right > .nav-tabs,+.tabs-left > .nav-tabs {+  border-bottom: 0;+}+.tab-content > .tab-pane,+.pill-content > .pill-pane {+  display: none;+}+.tab-content > .active,+.pill-content > .active {+  display: block;+}+.tabs-below > .nav-tabs {+  border-top: 1px solid #ddd;+}+.tabs-below > .nav-tabs > li {+  margin-top: -1px;+  margin-bottom: 0;+}+.tabs-below > .nav-tabs > li > a {+  -webkit-border-radius: 0 0 4px 4px;+  -moz-border-radius: 0 0 4px 4px;+  border-radius: 0 0 4px 4px;+}+.tabs-below > .nav-tabs > li > a:hover,+.tabs-below > .nav-tabs > li > a:focus {+  border-bottom-color: transparent;+  border-top-color: #ddd;+}+.tabs-below > .nav-tabs > .active > a,+.tabs-below > .nav-tabs > .active > a:hover,+.tabs-below > .nav-tabs > .active > a:focus {+  border-color: transparent #ddd #ddd #ddd;+}+.tabs-left > .nav-tabs > li,+.tabs-right > .nav-tabs > li {+  float: none;+}+.tabs-left > .nav-tabs > li > a,+.tabs-right > .nav-tabs > li > a {+  min-width: 74px;+  margin-right: 0;+  margin-bottom: 3px;+}+.tabs-left > .nav-tabs {+  float: left;+  margin-right: 19px;+  border-right: 1px solid #ddd;+}+.tabs-left > .nav-tabs > li > a {+  margin-right: -1px;+  -webkit-border-radius: 4px 0 0 4px;+  -moz-border-radius: 4px 0 0 4px;+  border-radius: 4px 0 0 4px;+}+.tabs-left > .nav-tabs > li > a:hover,+.tabs-left > .nav-tabs > li > a:focus {+  border-color: #eeeeee #dddddd #eeeeee #eeeeee;+}+.tabs-left > .nav-tabs .active > a,+.tabs-left > .nav-tabs .active > a:hover,+.tabs-left > .nav-tabs .active > a:focus {+  border-color: #ddd transparent #ddd #ddd;+  *border-right-color: #ffffff;+}+.tabs-right > .nav-tabs {+  float: right;+  margin-left: 19px;+  border-left: 1px solid #ddd;+}+.tabs-right > .nav-tabs > li > a {+  margin-left: -1px;+  -webkit-border-radius: 0 4px 4px 0;+  -moz-border-radius: 0 4px 4px 0;+  border-radius: 0 4px 4px 0;+}+.tabs-right > .nav-tabs > li > a:hover,+.tabs-right > .nav-tabs > li > a:focus {+  border-color: #eeeeee #eeeeee #eeeeee #dddddd;+}+.tabs-right > .nav-tabs .active > a,+.tabs-right > .nav-tabs .active > a:hover,+.tabs-right > .nav-tabs .active > a:focus {+  border-color: #ddd #ddd #ddd transparent;+  *border-left-color: #ffffff;+}+.nav > .disabled > a {+  color: #999999;+}+.nav > .disabled > a:hover,+.nav > .disabled > a:focus {+  text-decoration: none;+  background-color: transparent;+  cursor: default;+}+.navbar {+  overflow: visible;+  margin-bottom: 20px;+  *position: relative;+  *z-index: 2;+}+.navbar-inner {+  min-height: 40px;+  padding-left: 20px;+  padding-right: 20px;+  background-color: #fafafa;+  background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));+  background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);+  background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);+  background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);+  background-repeat: repeat-x;+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);+  border: 1px solid #d4d4d4;+  -webkit-border-radius: 4px;+  -moz-border-radius: 4px;+  border-radius: 4px;+  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);+  -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);+  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);+  *zoom: 1;+}+.navbar-inner:before,+.navbar-inner:after {+  display: table;+  content: "";+  line-height: 0;+}+.navbar-inner:after {+  clear: both;+}+.navbar .container {+  width: auto;+}+.nav-collapse.collapse {+  height: auto;+  overflow: visible;+}+.navbar .brand {+  float: left;+  display: block;+  padding: 10px 20px 10px;+  margin-left: -20px;+  font-size: 20px;+  font-weight: 200;+  color: #777777;+  text-shadow: 0 1px 0 #ffffff;+}+.navbar .brand:hover,+.navbar .brand:focus {+  text-decoration: none;+}+.navbar-text {+  margin-bottom: 0;+  line-height: 40px;+  color: #777777;+}+.navbar-link {+  color: #777777;+}+.navbar-link:hover,+.navbar-link:focus {+  color: #333333;+}+.navbar .divider-vertical {+  height: 40px;+  margin: 0 9px;+  border-left: 1px solid #f2f2f2;+  border-right: 1px solid #ffffff;+}+.navbar .btn,+.navbar .btn-group {+  margin-top: 5px;+}+.navbar .btn-group .btn,+.navbar .input-prepend .btn,+.navbar .input-append .btn,+.navbar .input-prepend .btn-group,+.navbar .input-append .btn-group {+  margin-top: 0;+}+.navbar-form {+  margin-bottom: 0;+  *zoom: 1;+}+.navbar-form:before,+.navbar-form:after {+  display: table;+  content: "";+  line-height: 0;+}+.navbar-form:after {+  clear: both;+}+.navbar-form input,+.navbar-form select,+.navbar-form .radio,+.navbar-form .checkbox {+  margin-top: 5px;+}+.navbar-form input,+.navbar-form select,+.navbar-form .btn {+  display: inline-block;+  margin-bottom: 0;+}+.navbar-form input[type="image"],+.navbar-form input[type="checkbox"],+.navbar-form input[type="radio"] {+  margin-top: 3px;+}+.navbar-form .input-append,+.navbar-form .input-prepend {+  margin-top: 5px;+  white-space: nowrap;+}+.navbar-form .input-append input,+.navbar-form .input-prepend input {+  margin-top: 0;+}+.navbar-search {+  position: relative;+  float: left;+  margin-top: 5px;+  margin-bottom: 0;+}+.navbar-search .search-query {+  margin-bottom: 0;+  padding: 4px 14px;+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;+  font-size: 13px;+  font-weight: normal;+  line-height: 1;+  -webkit-border-radius: 15px;+  -moz-border-radius: 15px;+  border-radius: 15px;+}+.navbar-static-top {+  position: static;+  margin-bottom: 0;+}+.navbar-static-top .navbar-inner {+  -webkit-border-radius: 0;+  -moz-border-radius: 0;+  border-radius: 0;+}+.navbar-fixed-top,+.navbar-fixed-bottom {+  position: fixed;+  right: 0;+  left: 0;+  z-index: 1030;+  margin-bottom: 0;+}+.navbar-fixed-top .navbar-inner,+.navbar-static-top .navbar-inner {+  border-width: 0 0 1px;+}+.navbar-fixed-bottom .navbar-inner {+  border-width: 1px 0 0;+}+.navbar-fixed-top .navbar-inner,+.navbar-fixed-bottom .navbar-inner {+  padding-left: 0;+  padding-right: 0;+  -webkit-border-radius: 0;+  -moz-border-radius: 0;+  border-radius: 0;+}+.navbar-static-top .container,+.navbar-fixed-top .container,+.navbar-fixed-bottom .container {+  width: 940px;+}+.navbar-fixed-top {+  top: 0;+}+.navbar-fixed-top .navbar-inner,+.navbar-static-top .navbar-inner {+  -webkit-box-shadow: 0 1px 10px rgba(0,0,0,.1);+  -moz-box-shadow: 0 1px 10px rgba(0,0,0,.1);+  box-shadow: 0 1px 10px rgba(0,0,0,.1);+}+.navbar-fixed-bottom {+  bottom: 0;+}+.navbar-fixed-bottom .navbar-inner {+  -webkit-box-shadow: 0 -1px 10px rgba(0,0,0,.1);+  -moz-box-shadow: 0 -1px 10px rgba(0,0,0,.1);+  box-shadow: 0 -1px 10px rgba(0,0,0,.1);+}+.navbar .nav {+  position: relative;+  left: 0;+  display: block;+  float: left;+  margin: 0 10px 0 0;+}+.navbar .nav.pull-right {+  float: right;+  margin-right: 0;+}+.navbar .nav > li {+  float: left;+}+.navbar .nav > li > a {+  float: none;+  padding: 10px 15px 10px;+  color: #777777;+  text-decoration: none;+  text-shadow: 0 1px 0 #ffffff;+}+.navbar .nav .dropdown-toggle .caret {+  margin-top: 8px;+}+.navbar .nav > li > a:focus,+.navbar .nav > li > a:hover {+  background-color: transparent;+  color: #333333;+  text-decoration: none;+}+.navbar .nav > .active > a,+.navbar .nav > .active > a:hover,+.navbar .nav > .active > a:focus {+  color: #555555;+  text-decoration: none;+  background-color: #e5e5e5;+  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);+  -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);+  box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);+}+.navbar .btn-navbar {+  display: none;+  float: right;+  padding: 7px 10px;+  margin-left: 5px;+  margin-right: 5px;+  color: #ffffff;+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);+  background-color: #ededed;+  background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5);+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));+  background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5);+  background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5);+  background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5);+  background-repeat: repeat-x;+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);+  border-color: #e5e5e5 #e5e5e5 #bfbfbf;+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);+  *background-color: #e5e5e5;+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */++  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+  -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);+  -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);+  box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);+}+.navbar .btn-navbar:hover,+.navbar .btn-navbar:focus,+.navbar .btn-navbar:active,+.navbar .btn-navbar.active,+.navbar .btn-navbar.disabled,+.navbar .btn-navbar[disabled] {+  color: #ffffff;+  background-color: #e5e5e5;+  *background-color: #d9d9d9;+}+.navbar .btn-navbar:active,+.navbar .btn-navbar.active {+  background-color: #cccccc \9;+}+.navbar .btn-navbar .icon-bar {+  display: block;+  width: 18px;+  height: 2px;+  background-color: #f5f5f5;+  -webkit-border-radius: 1px;+  -moz-border-radius: 1px;+  border-radius: 1px;+  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);+  -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);+  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);+}+.btn-navbar .icon-bar + .icon-bar {+  margin-top: 3px;+}+.navbar .nav > li > .dropdown-menu:before {+  content: '';+  display: inline-block;+  border-left: 7px solid transparent;+  border-right: 7px solid transparent;+  border-bottom: 7px solid #ccc;+  border-bottom-color: rgba(0, 0, 0, 0.2);+  position: absolute;+  top: -7px;+  left: 9px;+}+.navbar .nav > li > .dropdown-menu:after {+  content: '';+  display: inline-block;+  border-left: 6px solid transparent;+  border-right: 6px solid transparent;+  border-bottom: 6px solid #ffffff;+  position: absolute;+  top: -6px;+  left: 10px;+}+.navbar-fixed-bottom .nav > li > .dropdown-menu:before {+  border-top: 7px solid #ccc;+  border-top-color: rgba(0, 0, 0, 0.2);+  border-bottom: 0;+  bottom: -7px;+  top: auto;+}+.navbar-fixed-bottom .nav > li > .dropdown-menu:after {+  border-top: 6px solid #ffffff;+  border-bottom: 0;+  bottom: -6px;+  top: auto;+}+.navbar .nav li.dropdown > a:hover .caret,+.navbar .nav li.dropdown > a:focus .caret {+  border-top-color: #333333;+  border-bottom-color: #333333;+}+.navbar .nav li.dropdown.open > .dropdown-toggle,+.navbar .nav li.dropdown.active > .dropdown-toggle,+.navbar .nav li.dropdown.open.active > .dropdown-toggle {+  background-color: #e5e5e5;+  color: #555555;+}+.navbar .nav li.dropdown > .dropdown-toggle .caret {+  border-top-color: #777777;+  border-bottom-color: #777777;+}+.navbar .nav li.dropdown.open > .dropdown-toggle .caret,+.navbar .nav li.dropdown.active > .dropdown-toggle .caret,+.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {+  border-top-color: #555555;+  border-bottom-color: #555555;+}+.navbar .pull-right > li > .dropdown-menu,+.navbar .nav > li > .dropdown-menu.pull-right {+  left: auto;+  right: 0;+}+.navbar .pull-right > li > .dropdown-menu:before,+.navbar .nav > li > .dropdown-menu.pull-right:before {+  left: auto;+  right: 12px;+}+.navbar .pull-right > li > .dropdown-menu:after,+.navbar .nav > li > .dropdown-menu.pull-right:after {+  left: auto;+  right: 13px;+}+.navbar .pull-right > li > .dropdown-menu .dropdown-menu,+.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {+  left: auto;+  right: 100%;+  margin-left: 0;+  margin-right: -1px;+  -webkit-border-radius: 6px 0 6px 6px;+  -moz-border-radius: 6px 0 6px 6px;+  border-radius: 6px 0 6px 6px;+}+.navbar-inverse .navbar-inner {+  background-color: #1b1b1b;+  background-image: -moz-linear-gradient(top, #222222, #111111);+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));+  background-image: -webkit-linear-gradient(top, #222222, #111111);+  background-image: -o-linear-gradient(top, #222222, #111111);+  background-image: linear-gradient(to bottom, #222222, #111111);+  background-repeat: repeat-x;+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);+  border-color: #252525;+}+.navbar-inverse .brand,+.navbar-inverse .nav > li > a {+  color: #999999;+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);+}+.navbar-inverse .brand:hover,+.navbar-inverse .nav > li > a:hover,+.navbar-inverse .brand:focus,+.navbar-inverse .nav > li > a:focus {+  color: #ffffff;+}+.navbar-inverse .brand {+  color: #999999;+}+.navbar-inverse .navbar-text {+  color: #999999;+}+.navbar-inverse .nav > li > a:focus,+.navbar-inverse .nav > li > a:hover {+  background-color: transparent;+  color: #ffffff;+}+.navbar-inverse .nav .active > a,+.navbar-inverse .nav .active > a:hover,+.navbar-inverse .nav .active > a:focus {+  color: #ffffff;+  background-color: #111111;+}+.navbar-inverse .navbar-link {+  color: #999999;+}+.navbar-inverse .navbar-link:hover,+.navbar-inverse .navbar-link:focus {+  color: #ffffff;+}+.navbar-inverse .divider-vertical {+  border-left-color: #111111;+  border-right-color: #222222;+}+.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,+.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,+.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {+  background-color: #111111;+  color: #ffffff;+}+.navbar-inverse .nav li.dropdown > a:hover .caret,+.navbar-inverse .nav li.dropdown > a:focus .caret {+  border-top-color: #ffffff;+  border-bottom-color: #ffffff;+}+.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {+  border-top-color: #999999;+  border-bottom-color: #999999;+}+.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,+.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,+.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {+  border-top-color: #ffffff;+  border-bottom-color: #ffffff;+}+.navbar-inverse .navbar-search .search-query {+  color: #ffffff;+  background-color: #515151;+  border-color: #111111;+  -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);+  -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);+  box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);+  -webkit-transition: none;+  -moz-transition: none;+  -o-transition: none;+  transition: none;+}+.navbar-inverse .navbar-search .search-query:-moz-placeholder {+  color: #cccccc;+}+.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {+  color: #cccccc;+}+.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {+  color: #cccccc;+}+.navbar-inverse .navbar-search .search-query:focus,+.navbar-inverse .navbar-search .search-query.focused {+  padding: 5px 15px;+  color: #333333;+  text-shadow: 0 1px 0 #ffffff;+  background-color: #ffffff;+  border: 0;+  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);+  -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);+  box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);+  outline: 0;+}+.navbar-inverse .btn-navbar {+  color: #ffffff;+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);+  background-color: #0e0e0e;+  background-image: -moz-linear-gradient(top, #151515, #040404);+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));+  background-image: -webkit-linear-gradient(top, #151515, #040404);+  background-image: -o-linear-gradient(top, #151515, #040404);+  background-image: linear-gradient(to bottom, #151515, #040404);+  background-repeat: repeat-x;+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);+  border-color: #040404 #040404 #000000;+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);+  *background-color: #040404;+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */++  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+}+.navbar-inverse .btn-navbar:hover,+.navbar-inverse .btn-navbar:focus,+.navbar-inverse .btn-navbar:active,+.navbar-inverse .btn-navbar.active,+.navbar-inverse .btn-navbar.disabled,+.navbar-inverse .btn-navbar[disabled] {+  color: #ffffff;+  background-color: #040404;+  *background-color: #000000;+}+.navbar-inverse .btn-navbar:active,+.navbar-inverse .btn-navbar.active {+  background-color: #000000 \9;+}+.well {+  min-height: 20px;+  padding: 19px;+  margin-bottom: 20px;+  background-color: #f5f5f5;+  border: 1px solid #e3e3e3;+  -webkit-border-radius: 4px;+  -moz-border-radius: 4px;+  border-radius: 4px;+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);+}+.well blockquote {+  border-color: #ddd;+  border-color: rgba(0, 0, 0, 0.15);+}+.well-large {+  padding: 24px;+  -webkit-border-radius: 6px;+  -moz-border-radius: 6px;+  border-radius: 6px;+}+.well-small {+  padding: 9px;+  -webkit-border-radius: 3px;+  -moz-border-radius: 3px;+  border-radius: 3px;+}+@-ms-viewport {+  width: device-width;+}+.hidden {+  display: none;+  visibility: hidden;+}+.visible-phone {+  display: none !important;+}+.visible-tablet {+  display: none !important;+}+.hidden-desktop {+  display: none !important;+}+.visible-desktop {+  display: inherit !important;+}+@media (min-width: 768px) and (max-width: 979px) {+  .hidden-desktop {+    display: inherit !important;+  }+  .visible-desktop {+    display: none !important ;+  }+  .visible-tablet {+    display: inherit !important;+  }+  .hidden-tablet {+    display: none !important;+  }+}+@media (max-width: 767px) {+  .hidden-desktop {+    display: inherit !important;+  }+  .visible-desktop {+    display: none !important;+  }+  .visible-phone {+    display: inherit !important;+  }+  .hidden-phone {+    display: none !important;+  }+}+.visible-print {+  display: none !important;+}+@media print {+  .visible-print {+    display: inherit !important;+  }+  .hidden-print {+    display: none !important;+  }+}+@media (max-width: 767px) {+  body {+    padding-left: 20px;+    padding-right: 20px;+  }+  .navbar-fixed-top,+  .navbar-fixed-bottom,+  .navbar-static-top {+    margin-left: -20px;+    margin-right: -20px;+  }+  .container-fluid {+    padding: 0;+  }+  .dl-horizontal dt {+    float: none;+    clear: none;+    width: auto;+    text-align: left;+  }+  .dl-horizontal dd {+    margin-left: 0;+  }+  .container {+    width: auto;+  }+  .row-fluid {+    width: 100%;+  }+  .row,+  .thumbnails {+    margin-left: 0;+  }+  .thumbnails > li {+    float: none;+    margin-left: 0;+  }+  [class*="span"],+  .uneditable-input[class*="span"],+  .row-fluid [class*="span"] {+    float: none;+    display: block;+    width: 100%;+    margin-left: 0;+    -webkit-box-sizing: border-box;+    -moz-box-sizing: border-box;+    box-sizing: border-box;+  }+  .span12,+  .row-fluid .span12 {+    width: 100%;+    -webkit-box-sizing: border-box;+    -moz-box-sizing: border-box;+    box-sizing: border-box;+  }+  .row-fluid [class*="offset"]:first-child {+    margin-left: 0;+  }+  .input-large,+  .input-xlarge,+  .input-xxlarge,+  input[class*="span"],+  select[class*="span"],+  textarea[class*="span"],+  .uneditable-input {+    display: block;+    width: 100%;+    min-height: 30px;+    -webkit-box-sizing: border-box;+    -moz-box-sizing: border-box;+    box-sizing: border-box;+  }+  .input-prepend input,+  .input-append input,+  .input-prepend input[class*="span"],+  .input-append input[class*="span"] {+    display: inline-block;+    width: auto;+  }+  .controls-row [class*="span"] + [class*="span"] {+    margin-left: 0;+  }+  .modal {+    position: fixed;+    top: 20px;+    left: 20px;+    right: 20px;+    width: auto;+    margin: 0;+  }+  .modal.fade {+    top: -100px;+  }+  .modal.fade.in {+    top: 20px;+  }+}+@media (max-width: 480px) {+  .nav-collapse {+    -webkit-transform: translate3d(0, 0, 0);+  }+  .page-header h1 small {+    display: block;+    line-height: 20px;+  }+  input[type="checkbox"],+  input[type="radio"] {+    border: 1px solid #ccc;+  }+  .form-horizontal .control-label {+    float: none;+    width: auto;+    padding-top: 0;+    text-align: left;+  }+  .form-horizontal .controls {+    margin-left: 0;+  }+  .form-horizontal .control-list {+    padding-top: 0;+  }+  .form-horizontal .form-actions {+    padding-left: 10px;+    padding-right: 10px;+  }+  .media .pull-left,+  .media .pull-right {+    float: none;+    display: block;+    margin-bottom: 10px;+  }+  .media-object {+    margin-right: 0;+    margin-left: 0;+  }+  .modal {+    top: 10px;+    left: 10px;+    right: 10px;+  }+  .modal-header .close {+    padding: 10px;+    margin: -10px;+  }+  .carousel-caption {+    position: static;+  }+}+@media (min-width: 768px) and (max-width: 979px) {+  .row {+    margin-left: -20px;+    *zoom: 1;+  }+  .row:before,+  .row:after {+    display: table;+    content: "";+    line-height: 0;+  }+  .row:after {+    clear: both;+  }+  [class*="span"] {+    float: left;+    min-height: 1px;+    margin-left: 20px;+  }+  .container,+  .navbar-static-top .container,+  .navbar-fixed-top .container,+  .navbar-fixed-bottom .container {+    width: 724px;+  }+  .span12 {+    width: 724px;+  }+  .span11 {+    width: 662px;+  }+  .span10 {+    width: 600px;+  }+  .span9 {+    width: 538px;+  }+  .span8 {+    width: 476px;+  }+  .span7 {+    width: 414px;+  }+  .span6 {+    width: 352px;+  }+  .span5 {+    width: 290px;+  }+  .span4 {+    width: 228px;+  }+  .span3 {+    width: 166px;+  }+  .span2 {+    width: 104px;+  }+  .span1 {+    width: 42px;+  }+  .offset12 {+    margin-left: 764px;+  }+  .offset11 {+    margin-left: 702px;+  }+  .offset10 {+    margin-left: 640px;+  }+  .offset9 {+    margin-left: 578px;+  }+  .offset8 {+    margin-left: 516px;+  }+  .offset7 {+    margin-left: 454px;+  }+  .offset6 {+    margin-left: 392px;+  }+  .offset5 {+    margin-left: 330px;+  }+  .offset4 {+    margin-left: 268px;+  }+  .offset3 {+    margin-left: 206px;+  }+  .offset2 {+    margin-left: 144px;+  }+  .offset1 {+    margin-left: 82px;+  }+  .row-fluid {+    width: 100%;+    *zoom: 1;+  }+  .row-fluid:before,+  .row-fluid:after {+    display: table;+    content: "";+    line-height: 0;+  }+  .row-fluid:after {+    clear: both;+  }+  .row-fluid [class*="span"] {+    display: block;+    width: 100%;+    min-height: 30px;+    -webkit-box-sizing: border-box;+    -moz-box-sizing: border-box;+    box-sizing: border-box;+    float: left;+    margin-left: 2.7624309392265194%;+    *margin-left: 2.709239449864817%;+  }+  .row-fluid [class*="span"]:first-child {+    margin-left: 0;+  }+  .row-fluid .controls-row [class*="span"] + [class*="span"] {+    margin-left: 2.7624309392265194%;+  }+  .row-fluid .span12 {+    width: 100%;+    *width: 99.94680851063829%;+  }+  .row-fluid .span11 {+    width: 91.43646408839778%;+    *width: 91.38327259903608%;+  }+  .row-fluid .span10 {+    width: 82.87292817679558%;+    *width: 82.81973668743387%;+  }+  .row-fluid .span9 {+    width: 74.30939226519337%;+    *width: 74.25620077583166%;+  }+  .row-fluid .span8 {+    width: 65.74585635359117%;+    *width: 65.69266486422946%;+  }+  .row-fluid .span7 {+    width: 57.18232044198895%;+    *width: 57.12912895262725%;+  }+  .row-fluid .span6 {+    width: 48.61878453038674%;+    *width: 48.56559304102504%;+  }+  .row-fluid .span5 {+    width: 40.05524861878453%;+    *width: 40.00205712942283%;+  }+  .row-fluid .span4 {+    width: 31.491712707182323%;+    *width: 31.43852121782062%;+  }+  .row-fluid .span3 {+    width: 22.92817679558011%;+    *width: 22.87498530621841%;+  }+  .row-fluid .span2 {+    width: 14.3646408839779%;+    *width: 14.311449394616199%;+  }+  .row-fluid .span1 {+    width: 5.801104972375691%;+    *width: 5.747913483013988%;+  }+  .row-fluid .offset12 {+    margin-left: 105.52486187845304%;+    *margin-left: 105.41847889972962%;+  }+  .row-fluid .offset12:first-child {+    margin-left: 102.76243093922652%;+    *margin-left: 102.6560479605031%;+  }+  .row-fluid .offset11 {+    margin-left: 96.96132596685082%;+    *margin-left: 96.8549429881274%;+  }+  .row-fluid .offset11:first-child {+    margin-left: 94.1988950276243%;+    *margin-left: 94.09251204890089%;+  }+  .row-fluid .offset10 {+    margin-left: 88.39779005524862%;+    *margin-left: 88.2914070765252%;+  }+  .row-fluid .offset10:first-child {+    margin-left: 85.6353591160221%;+    *margin-left: 85.52897613729868%;+  }+  .row-fluid .offset9 {+    margin-left: 79.8342541436464%;+    *margin-left: 79.72787116492299%;+  }+  .row-fluid .offset9:first-child {+    margin-left: 77.07182320441989%;+    *margin-left: 76.96544022569647%;+  }+  .row-fluid .offset8 {+    margin-left: 71.2707182320442%;+    *margin-left: 71.16433525332079%;+  }+  .row-fluid .offset8:first-child {+    margin-left: 68.50828729281768%;+    *margin-left: 68.40190431409427%;+  }+  .row-fluid .offset7 {+    margin-left: 62.70718232044199%;+    *margin-left: 62.600799341718584%;+  }+  .row-fluid .offset7:first-child {+    margin-left: 59.94475138121547%;+    *margin-left: 59.838368402492065%;+  }+  .row-fluid .offset6 {+    margin-left: 54.14364640883978%;+    *margin-left: 54.037263430116376%;+  }+  .row-fluid .offset6:first-child {+    margin-left: 51.38121546961326%;+    *margin-left: 51.27483249088986%;+  }+  .row-fluid .offset5 {+    margin-left: 45.58011049723757%;+    *margin-left: 45.47372751851417%;+  }+  .row-fluid .offset5:first-child {+    margin-left: 42.81767955801105%;+    *margin-left: 42.71129657928765%;+  }+  .row-fluid .offset4 {+    margin-left: 37.01657458563536%;+    *margin-left: 36.91019160691196%;+  }+  .row-fluid .offset4:first-child {+    margin-left: 34.25414364640884%;+    *margin-left: 34.14776066768544%;+  }+  .row-fluid .offset3 {+    margin-left: 28.45303867403315%;+    *margin-left: 28.346655695309746%;+  }+  .row-fluid .offset3:first-child {+    margin-left: 25.69060773480663%;+    *margin-left: 25.584224756083227%;+  }+  .row-fluid .offset2 {+    margin-left: 19.88950276243094%;+    *margin-left: 19.783119783707537%;+  }+  .row-fluid .offset2:first-child {+    margin-left: 17.12707182320442%;+    *margin-left: 17.02068884448102%;+  }+  .row-fluid .offset1 {+    margin-left: 11.32596685082873%;+    *margin-left: 11.219583872105325%;+  }+  .row-fluid .offset1:first-child {+    margin-left: 8.56353591160221%;+    *margin-left: 8.457152932878806%;+  }+  input,+  textarea,+  .uneditable-input {+    margin-left: 0;+  }+  .controls-row [class*="span"] + [class*="span"] {+    margin-left: 20px;+  }+  input.span12,+  textarea.span12,+  .uneditable-input.span12 {+    width: 710px;+  }+  input.span11,+  textarea.span11,+  .uneditable-input.span11 {+    width: 648px;+  }+  input.span10,+  textarea.span10,+  .uneditable-input.span10 {+    width: 586px;+  }+  input.span9,+  textarea.span9,+  .uneditable-input.span9 {+    width: 524px;+  }+  input.span8,+  textarea.span8,+  .uneditable-input.span8 {+    width: 462px;+  }+  input.span7,+  textarea.span7,+  .uneditable-input.span7 {+    width: 400px;+  }+  input.span6,+  textarea.span6,+  .uneditable-input.span6 {+    width: 338px;+  }+  input.span5,+  textarea.span5,+  .uneditable-input.span5 {+    width: 276px;+  }+  input.span4,+  textarea.span4,+  .uneditable-input.span4 {+    width: 214px;+  }+  input.span3,+  textarea.span3,+  .uneditable-input.span3 {+    width: 152px;+  }+  input.span2,+  textarea.span2,+  .uneditable-input.span2 {+    width: 90px;+  }+  input.span1,+  textarea.span1,+  .uneditable-input.span1 {+    width: 28px;+  }+}+@media (min-width: 1200px) {+  .row {+    margin-left: -30px;+    *zoom: 1;+  }+  .row:before,+  .row:after {+    display: table;+    content: "";+    line-height: 0;+  }+  .row:after {+    clear: both;+  }+  [class*="span"] {+    float: left;+    min-height: 1px;+    margin-left: 30px;+  }+  .container,+  .navbar-static-top .container,+  .navbar-fixed-top .container,+  .navbar-fixed-bottom .container {+    width: 1170px;+  }+  .span12 {+    width: 1170px;+  }+  .span11 {+    width: 1070px;+  }+  .span10 {+    width: 970px;+  }+  .span9 {+    width: 870px;+  }+  .span8 {+    width: 770px;+  }+  .span7 {+    width: 670px;+  }+  .span6 {+    width: 570px;+  }+  .span5 {+    width: 470px;+  }+  .span4 {+    width: 370px;+  }+  .span3 {+    width: 270px;+  }+  .span2 {+    width: 170px;+  }+  .span1 {+    width: 70px;+  }+  .offset12 {+    margin-left: 1230px;+  }+  .offset11 {+    margin-left: 1130px;+  }+  .offset10 {+    margin-left: 1030px;+  }+  .offset9 {+    margin-left: 930px;+  }+  .offset8 {+    margin-left: 830px;+  }+  .offset7 {+    margin-left: 730px;+  }+  .offset6 {+    margin-left: 630px;+  }+  .offset5 {+    margin-left: 530px;+  }+  .offset4 {+    margin-left: 430px;+  }+  .offset3 {+    margin-left: 330px;+  }+  .offset2 {+    margin-left: 230px;+  }+  .offset1 {+    margin-left: 130px;+  }+  .row-fluid {+    width: 100%;+    *zoom: 1;+  }+  .row-fluid:before,+  .row-fluid:after {+    display: table;+    content: "";+    line-height: 0;+  }+  .row-fluid:after {+    clear: both;+  }+  .row-fluid [class*="span"] {+    display: block;+    width: 100%;+    min-height: 30px;+    -webkit-box-sizing: border-box;+    -moz-box-sizing: border-box;+    box-sizing: border-box;+    float: left;+    margin-left: 2.564102564102564%;+    *margin-left: 2.5109110747408616%;+  }+  .row-fluid [class*="span"]:first-child {+    margin-left: 0;+  }+  .row-fluid .controls-row [class*="span"] + [class*="span"] {+    margin-left: 2.564102564102564%;+  }+  .row-fluid .span12 {+    width: 100%;+    *width: 99.94680851063829%;+  }+  .row-fluid .span11 {+    width: 91.45299145299145%;+    *width: 91.39979996362975%;+  }+  .row-fluid .span10 {+    width: 82.90598290598291%;+    *width: 82.8527914166212%;+  }+  .row-fluid .span9 {+    width: 74.35897435897436%;+    *width: 74.30578286961266%;+  }+  .row-fluid .span8 {+    width: 65.81196581196582%;+    *width: 65.75877432260411%;+  }+  .row-fluid .span7 {+    width: 57.26495726495726%;+    *width: 57.21176577559556%;+  }+  .row-fluid .span6 {+    width: 48.717948717948715%;+    *width: 48.664757228587014%;+  }+  .row-fluid .span5 {+    width: 40.17094017094017%;+    *width: 40.11774868157847%;+  }+  .row-fluid .span4 {+    width: 31.623931623931625%;+    *width: 31.570740134569924%;+  }+  .row-fluid .span3 {+    width: 23.076923076923077%;+    *width: 23.023731587561375%;+  }+  .row-fluid .span2 {+    width: 14.52991452991453%;+    *width: 14.476723040552828%;+  }+  .row-fluid .span1 {+    width: 5.982905982905983%;+    *width: 5.929714493544281%;+  }+  .row-fluid .offset12 {+    margin-left: 105.12820512820512%;+    *margin-left: 105.02182214948171%;+  }+  .row-fluid .offset12:first-child {+    margin-left: 102.56410256410257%;+    *margin-left: 102.45771958537915%;+  }+  .row-fluid .offset11 {+    margin-left: 96.58119658119658%;+    *margin-left: 96.47481360247316%;+  }+  .row-fluid .offset11:first-child {+    margin-left: 94.01709401709402%;+    *margin-left: 93.91071103837061%;+  }+  .row-fluid .offset10 {+    margin-left: 88.03418803418803%;+    *margin-left: 87.92780505546462%;+  }+  .row-fluid .offset10:first-child {+    margin-left: 85.47008547008548%;+    *margin-left: 85.36370249136206%;+  }+  .row-fluid .offset9 {+    margin-left: 79.48717948717949%;+    *margin-left: 79.38079650845607%;+  }+  .row-fluid .offset9:first-child {+    margin-left: 76.92307692307693%;+    *margin-left: 76.81669394435352%;+  }+  .row-fluid .offset8 {+    margin-left: 70.94017094017094%;+    *margin-left: 70.83378796144753%;+  }+  .row-fluid .offset8:first-child {+    margin-left: 68.37606837606839%;+    *margin-left: 68.26968539734497%;+  }+  .row-fluid .offset7 {+    margin-left: 62.393162393162385%;+    *margin-left: 62.28677941443899%;+  }+  .row-fluid .offset7:first-child {+    margin-left: 59.82905982905982%;+    *margin-left: 59.72267685033642%;+  }+  .row-fluid .offset6 {+    margin-left: 53.84615384615384%;+    *margin-left: 53.739770867430444%;+  }+  .row-fluid .offset6:first-child {+    margin-left: 51.28205128205128%;+    *margin-left: 51.175668303327875%;+  }+  .row-fluid .offset5 {+    margin-left: 45.299145299145295%;+    *margin-left: 45.1927623204219%;+  }+  .row-fluid .offset5:first-child {+    margin-left: 42.73504273504273%;+    *margin-left: 42.62865975631933%;+  }+  .row-fluid .offset4 {+    margin-left: 36.75213675213675%;+    *margin-left: 36.645753773413354%;+  }+  .row-fluid .offset4:first-child {+    margin-left: 34.18803418803419%;+    *margin-left: 34.081651209310785%;+  }+  .row-fluid .offset3 {+    margin-left: 28.205128205128204%;+    *margin-left: 28.0987452264048%;+  }+  .row-fluid .offset3:first-child {+    margin-left: 25.641025641025642%;+    *margin-left: 25.53464266230224%;+  }+  .row-fluid .offset2 {+    margin-left: 19.65811965811966%;+    *margin-left: 19.551736679396257%;+  }+  .row-fluid .offset2:first-child {+    margin-left: 17.094017094017094%;+    *margin-left: 16.98763411529369%;+  }+  .row-fluid .offset1 {+    margin-left: 11.11111111111111%;+    *margin-left: 11.004728132387708%;+  }+  .row-fluid .offset1:first-child {+    margin-left: 8.547008547008547%;+    *margin-left: 8.440625568285142%;+  }+  input,+  textarea,+  .uneditable-input {+    margin-left: 0;+  }+  .controls-row [class*="span"] + [class*="span"] {+    margin-left: 30px;+  }+  input.span12,+  textarea.span12,+  .uneditable-input.span12 {+    width: 1156px;+  }+  input.span11,+  textarea.span11,+  .uneditable-input.span11 {+    width: 1056px;+  }+  input.span10,+  textarea.span10,+  .uneditable-input.span10 {+    width: 956px;+  }+  input.span9,+  textarea.span9,+  .uneditable-input.span9 {+    width: 856px;+  }+  input.span8,+  textarea.span8,+  .uneditable-input.span8 {+    width: 756px;+  }+  input.span7,+  textarea.span7,+  .uneditable-input.span7 {+    width: 656px;+  }+  input.span6,+  textarea.span6,+  .uneditable-input.span6 {+    width: 556px;+  }+  input.span5,+  textarea.span5,+  .uneditable-input.span5 {+    width: 456px;+  }+  input.span4,+  textarea.span4,+  .uneditable-input.span4 {+    width: 356px;+  }+  input.span3,+  textarea.span3,+  .uneditable-input.span3 {+    width: 256px;+  }+  input.span2,+  textarea.span2,+  .uneditable-input.span2 {+    width: 156px;+  }+  input.span1,+  textarea.span1,+  .uneditable-input.span1 {+    width: 56px;+  }+  .thumbnails {+    margin-left: -30px;+  }+  .thumbnails > li {+    margin-left: 30px;+  }+  .row-fluid .thumbnails {+    margin-left: 0;+  }+}+@media (max-width: 979px) {+  body {+    padding-top: 0;+  }+  .navbar-fixed-top,+  .navbar-fixed-bottom {+    position: static;+  }+  .navbar-fixed-top {+    margin-bottom: 20px;+  }+  .navbar-fixed-bottom {+    margin-top: 20px;+  }+  .navbar-fixed-top .navbar-inner,+  .navbar-fixed-bottom .navbar-inner {+    padding: 5px;+  }+  .navbar .container {+    width: auto;+    padding: 0;+  }+  .navbar .brand {+    padding-left: 10px;+    padding-right: 10px;+    margin: 0 0 0 -5px;+  }+  .nav-collapse {+    clear: both;+  }+  .nav-collapse .nav {+    float: none;+    margin: 0 0 10px;+  }+  .nav-collapse .nav > li {+    float: none;+  }+  .nav-collapse .nav > li > a {+    margin-bottom: 2px;+  }+  .nav-collapse .nav > .divider-vertical {+    display: none;+  }+  .nav-collapse .nav .nav-header {+    color: #777777;+    text-shadow: none;+  }+  .nav-collapse .nav > li > a,+  .nav-collapse .dropdown-menu a {+    padding: 9px 15px;+    font-weight: bold;+    color: #777777;+    -webkit-border-radius: 3px;+    -moz-border-radius: 3px;+    border-radius: 3px;+  }+  .nav-collapse .btn {+    padding: 4px 10px 4px;+    font-weight: normal;+    -webkit-border-radius: 4px;+    -moz-border-radius: 4px;+    border-radius: 4px;+  }+  .nav-collapse .dropdown-menu li + li a {+    margin-bottom: 2px;+  }+  .nav-collapse .nav > li > a:hover,+  .nav-collapse .nav > li > a:focus,+  .nav-collapse .dropdown-menu a:hover,+  .nav-collapse .dropdown-menu a:focus {+    background-color: #f2f2f2;+  }+  .navbar-inverse .nav-collapse .nav > li > a,+  .navbar-inverse .nav-collapse .dropdown-menu a {+    color: #999999;+  }+  .navbar-inverse .nav-collapse .nav > li > a:hover,+  .navbar-inverse .nav-collapse .nav > li > a:focus,+  .navbar-inverse .nav-collapse .dropdown-menu a:hover,+  .navbar-inverse .nav-collapse .dropdown-menu a:focus {+    background-color: #111111;+  }+  .nav-collapse.in .btn-group {+    margin-top: 5px;+    padding: 0;+  }+  .nav-collapse .dropdown-menu {+    position: static;+    top: auto;+    left: auto;+    float: none;+    display: none;+    max-width: none;+    margin: 0 15px;+    padding: 0;+    background-color: transparent;+    border: none;+    -webkit-border-radius: 0;+    -moz-border-radius: 0;+    border-radius: 0;+    -webkit-box-shadow: none;+    -moz-box-shadow: none;+    box-shadow: none;+  }+  .nav-collapse .open > .dropdown-menu {+    display: block;+  }+  .nav-collapse .dropdown-menu:before,+  .nav-collapse .dropdown-menu:after {+    display: none;+  }+  .nav-collapse .dropdown-menu .divider {+    display: none;+  }+  .nav-collapse .nav > li > .dropdown-menu:before,+  .nav-collapse .nav > li > .dropdown-menu:after {+    display: none;+  }+  .nav-collapse .navbar-form,+  .nav-collapse .navbar-search {+    float: none;+    padding: 10px 15px;+    margin: 10px 0;+    border-top: 1px solid #f2f2f2;+    border-bottom: 1px solid #f2f2f2;+    -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);+    -moz-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);+  }+  .navbar-inverse .nav-collapse .navbar-form,+  .navbar-inverse .nav-collapse .navbar-search {+    border-top-color: #111111;+    border-bottom-color: #111111;+  }+  .navbar .nav-collapse .nav.pull-right {+    float: none;+    margin-left: 0;+  }+  .nav-collapse,+  .nav-collapse.collapse {+    overflow: hidden;+    height: 0;+  }+  .navbar .btn-navbar {+    display: block;+  }+  .navbar-static .navbar-inner {+    padding-left: 10px;+    padding-right: 10px;+  }+}+@media (min-width: 980px) {+  .nav-collapse.collapse {+    height: auto !important;+    overflow: visible !important;+  }+}+++/* CUSTOMIZATIONS */+.doc-title { float: left; display: block; padding: 10px 20px 10px; margin-left: -20px;+  font-size: 20px; font-weight: 200; color: #777777; text-shadow: 0 1px 0 #ffffff; }+.doc-info .navbar-text { padding: 0 15px; }+h1 a { color: #333; } h2 a { color: #333; } h3 a { color: #333; }+h4 a { color: #333; } h5 a { color: #333; } h6 a { color: #333; }+h1:hover a { color: #333; } h2:hover a { color: #333; } h3:hover a { color: #333; }+h4:hover a { color: #333; } h5:hover a { color: #333; } h6:hover a { color: #333; }+.toc { margin-top: 10px; }+.toc, .toc ul { padding: 0; }+.toc ul { margin-left: 0; margin-bottom: 20px; list-style: none; }+.toc ul > li > a { display: block; }+.toc ul > li > a:hover,+.toc ul > li > a:focus { text-decoration: none; background-color: #eeeeee; }+.toc ul { margin-bottom: 0; }+.toc ul > li > a, .toc ul > li > a { padding: 3px 15px; }
+ data/knit-haskell-templates/mindoc-pandoc-KH.html view
@@ -0,0 +1,159 @@+<!doctype html>+<html$if(lang)$ lang="$lang$"$endif$$if(dir)$ dir="$dir$"$endif$>+<head>+<meta charset="utf-8">+<meta name="generator" content="pandoc">+<meta name="viewport" content="width=device-width, initial-scale=1">+$if(description)$+<meta name="description" content="$description$">+$endif$+$for(author-meta)$+<meta name="author" content="$author-meta$">+$endfor$+$if(date-meta)$+<meta name="dcterms.date" content="$date-meta$">+$endif$+<title>$if(title-prefix)$$title-prefix$ - $endif$$pagetitle$</title>++<!-- Yahoo! CDN combo URL for selected Pure.css modules -->+<link rel="stylesheet" href="http://yui.yahooapis.com/combo?pure/0.6.0/base-min.css&pure/0.6.0/grids-responsive-min.css&pure/0.6.0/menus-min.css&pure/0.6.0/tables-min.css">+$if(tufte)$+<!-- Tufte -->+<link href="https://cdnjs.cloudflare.com/ajax/libs/tufte-css/1.4/tufte.min.css" rel="stylesheet"><meta content="width=device-width, initial-scale=1" name="viewport">+$endif$+<!-- Additional css -->+$for(css)$+  <link rel="stylesheet" href="$css$" $if(html5)$$else$type="text/css" $endif$/>+$endfor$+<!-- MathJax -->+<script async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML"></script>+<!-- Vega and Vega Embed -->+<script src="https://cdn.jsdelivr.net/npm/vega@4.4.0"></script>+<script src="https://cdn.jsdelivr.net/npm/vega-lite@3.0.0-rc11"></script>+<script src="https://cdn.jsdelivr.net/npm/vega-embed@3.28.0"></script>++<!-- Extra styles -->+<style>+body{margin:10em 0 0}.pure-g{padding:0 1em}.pure-menu-link:focus{background-color:#d3d3d3}nav{margin:0 0 1em;padding:0 0 1em;border-bottom:1px solid #ccc}footer{margin:5em 0 1em}pre{white-space:pre-wrap;margin-left:3em}code{font-size:89%;color:#191919}.author{margin-bottom:0;padding-bottom:0}.headnote,.published,.license{font-size:89%;margin-bottom:.75em}@media screen and (max-width:35.5em){thead{display:none}tr,th,td{display:block}td{border-top:0}tr td:first-child{border-top:1px solid #ddd;font-weight:700}}+table {+    margin-left: auto;+    margin-right: auto;+    margin-bottom: 24px;+    border-spacing: 0;+    border-bottom: 2px solid black;+    border-top: 2px solid black;+}+table th {+    padding: 3px 10px;+    background-color: white;+    border-top: none;+    border-left: none;+    border-right: none;+    border-bottom: 1px solid black;+}+table td {+    padding: 3px 10px;+    border-top: none;+    border-left: none;+    border-bottom: none;+    border-right: none;+}+</style>++$if(quotes)$+<style>q {quotes: "“" "”" "‘" "’";}</style>+$endif$+$if(highlighting-css)$+<style>+$highlighting-css$+</style>+$endif$+$for(css)$+<link rel="stylesheet" href="$css$">+$endfor$+$if(math)$+$math$+$endif$+$for(header-includes)$+$header-includes$+$endfor$+</head>+<body>+<section id="page-content">+<div class="pure-g">+<div class="pure-u-1 pure-u-sm-1 pure-u-md-1 pure-u-lg-1 pure-u-xl-1">++<!-- page content begins here -->++$for(include-before)$+$include-before$+$endfor$+$if(headnote)$+<div class="headnote">$headnote$</div>+$endif$+$if(published)$+<div class="published">$published$</div>+$endif$+$if(license)$+<div class="license">$license$</div>$endif$+$if(title)$+<header>+<h1 class="title">$title$</h1>+$if(subtitle)$+<h1 class="subtitle">$subtitle$</h1>+$endif$+$if(author)$+$for(author)$+$if(author.name)$+<h2 class="author">$author.name$</h2>+$else$+<h2 class="author">$author$</h2>+$endif$+$if(author.affiliation)$+<div class="affiliation">$author.affiliation$</div>+$endif$+$if(author.email)$+<div class="email"><a href="mailto:$author.email$">$author.email$</a></div>+$endif$+$endfor$+$endif$+$if(version)$+<h3 class="version">Version $version$</h3>+$endif$+$if(date)$+<h3 class="date">$date$</h3>+$endif$+</header>+$endif$+$if(abstract)$+<div class="abstract">+<h3>Abstract</h3>+$abstract$+</div>+$endif$+$if(toc)$+<nav id="$idprefix$TOC">+$toc$+</nav>+$endif$+$body$+$for(include-after)$+$include-after$+$endfor$++<!-- page content ends here -->++</div>     <!-- pure-u-1... -->+</div>     <!-- pure-g -->+</section> <!-- page-content -->+<div class="pure-g">+<footer><a href="https://bitfragment.github.io/mindoc">mindoc</a> v1.1.0</footer>+</div>+<script>+var mindoc=function(){function e(e){return e=e.toLowerCase(),e.charAt(0).toUpperCase()+e.substr(1)}function n(e){var n=new RegExp(/^\b[a-z]\S+\b-\b\S+\b/);return n.test(e)&&(e=e.replace(/-+/g," ")),e}function t(t){return t=n(t),e(t)}function r(e,n){return!!e.className.match(new RegExp("(\\s|^)"+n+"(\\s|)"))}function a(e,n){r(e,n)||(e.className+=" "+n)}function o(e,n){if(r(e,n)){var t=new RegExp("(\\s|^)"+n+"(\\s|)");e.className=e.className.replace(t," ")}}function u(){var e,n,t={table:"pure-table pure-table-bordered"};Object.keys(t).forEach(function(r){if(e=document.getElementsByTagName(r),n=e.length,n>1)for(var o=0;n>o;o++)a(e[o],t[r])})}function c(e,n){for(var t=0,r=e.length;r>t;t++)for(var a=e[t].getElementsByTagName("a"),u=0,c=a.length;c>u;u++)a[u].addEventListener("click",function(){o(n,"hidden")})}function i(e,n){for(var t=0,r=e.length;r>t;t++)e[t].addEventListener("click",function(){o(n,"hidden")})}function d(){var e=document.createElement("li");return a(e,"pure-menu-item"),e}function l(e){var n=document.createElement("a");return n.id="menu-"+e,n.href="#",n.innerHTML=t(e),a(n,"pure-menu-link"),n}function m(e){var n=document.createDocumentFragment(),t=document.createElement("nav"),r=document.createElement("div"),o=document.createElement("ul");n.appendChild(t),t.appendChild(r),r.appendChild(o),a(r,"pure-menu"),a(o,"pure-menu-list");var u="All sections",c=d();a(c,"pure-menu-selected"),o.appendChild(c),c.appendChild(l(u));for(var i,m,s=0,f=e.length;f>s;s++)i=e[s].getAttribute("id"),m=d(),o.appendChild(m),m.appendChild(l(i));var p=document.getElementById("page-content");document.querySelector("body").insertBefore(n,p)}function s(e){var n;e.hasAttribute("pure-menu-selected")||(n=document.querySelector(".pure-menu-selected"),o(n,"pure-menu-selected"),a(e,"pure-menu-selected"))}function f(e,n){var t,u=n.getAttribute("id"),c=u.replace(/menu-/,""),i=document.getElementById(u).parentNode;s(i);for(var d in e)t=e[d],r(t,"hidden")||a(t,"hidden"),t.getAttribute("id")===c&&r(t,"hidden")&&o(t,"hidden")}function p(e){var n;for(var t in e)n=e[t],r(n,"hidden")&&o(n,"hidden")}function v(e){for(var n=document.querySelectorAll(".pure-menu-link"),t=0,r=n.length;r>t;t++)0===t?n[t].addEventListener("click",function(){p(e)}):n[t].addEventListener("click",function(){f(e,this)})}return{main:function(){if(u(),document.getElementsByClassName("level2").length>0){var e,n=[];["abstract","level2","footnotes"].forEach(function(t){e=document.getElementsByClassName(t);for(var r=0,a=e.length;a>r;r++)n.push(e[r])});var t;for(var o in n)t=n[o],r(t,"level2")||a(t,"level2"),r(t,"footnotes")&&t.setAttribute("id","footnotes");m(n),v(n);var d=document.getElementsByClassName("citation"),l=document.getElementById("references");c(d,l);var s=document.getElementsByClassName("footnoteRef"),f=document.getElementById("footnotes");i(s,f)}}}}();window.addEventListener("load",function(){mindoc.main()});+</script>++<!-- For debugging local scripts -->+<!-- <script src="../build/mindoc.js"></script> -->+</body>+</html>
+ data/knit-haskell-templates/pandoc-adaptive-bootstrap-KH.html view
@@ -0,0 +1,116 @@+<!doctype html>+<html $if(lang)$ lang="$lang$" $endif$>+<head>+    +    <meta name="viewport" content="width=device-width, initial-scale=1.0" />+        <!--[if lt IE 9]>+                <script src="http://css3-mediaqueries-js.googlecode.com/svn/trunk/css3-mediaqueries.js"></script>+        <![endif]-->+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />+  <meta http-equiv="Content-Style-Type" content="text/css" />+  <link href="https://vjs.zencdn.net/5.4.4/video-js.css" rel="stylesheet" />++++<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>+<script type='text/javascript' src='menu/js/jquery.cookie.js'></script>+<script type='text/javascript' src='menu/js/jquery.hoverIntent.minified.js'></script>+<script type='text/javascript' src='menu/js/jquery.dcjqaccordion.2.7.min.js'></script>++<link href="menu/css/skins/blue.css" rel="stylesheet" type="text/css" />+<link href="menu/css/skins/graphite.css" rel="stylesheet" type="text/css" />+<link href="menu/css/skins/grey.css" rel="stylesheet" type="text/css" />++<!-- MathJax -->+<script async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML"></script>+<!-- Vega and Vega Embed -->+<script src="https://cdn.jsdelivr.net/npm/vega@4.4.0"></script>+<script src="https://cdn.jsdelivr.net/npm/vega-lite@3.0.0-rc11"></script>+<script src="https://cdn.jsdelivr.net/npm/vega-embed@3.28.0"></script>        +  +  <script src="script.js"></script>+  +    <script src="jquery.sticky-kit.js "></script>+  <meta name="generator" content="pandoc" />+$for(author-meta)$+  <meta name="author" content="$author-meta$" />+$endfor$+$if(date-meta)$+  <meta name="date" content="$date-meta$" />+$endif$+  <title>$if(title-prefix)$$title-prefix$ - $endif$$pagetitle$</title>+  <style type="text/css">code{white-space: pre;}</style>+$if(quotes)$+  <style type="text/css">q { quotes: "“" "”" "‘" "’"; }</style>+$endif$+$if(highlighting-css)$+  <style type="text/css">+$highlighting-css$+  </style>+$endif$+$for(css)$+  <link rel="stylesheet" href="$css$" $if(html5)$$else$type="text/css" $endif$/>+$endfor$+$if(math)$+  $math$+$endif$+$for(header-includes)$+  $header-includes$+$endfor$+</head>+<body>++    +  $if(title)$+  <div class="navbar navbar-static-top">+    <div class="navbar-inner">+      <div class="container">+        <span class="doc-title">$title$</span>+        <ul class="nav pull-right doc-info">+          $for(author)$+          <li><p class="navbar-text">$author$</p></li>+          $endfor$+          $if(date)$+          <li><p class="navbar-text">$date$</p></li>+          $endif$+        </ul>+      </div>+    </div>+  </div>+  $endif$+  <div class="container">+    <div class="row">+      $if(toc)$+      <div id="$idprefix$TOC" class="span3">+        <div class="well toc">++        $toc$++        </div>+      </div>+      $endif$+      <div class="span$if(toc)$9$else$12$endif$">+      $for(include-before)$+      $include-before$+      $endfor$+      $body$+      $for(include-after)$+      $include-after$+      $endfor$+      </div>+    </div>+  </div>+$if(analytics)$                    +            <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','https://www.google-analytics.com/analytics.js','ga');++  ga('create', '$analytics$', 'auto');+  ga('send', 'pageview');+$endif$+  <script src="https://vjs.zencdn.net/5.4.4/video.js"></script>++</body>+</html>
+ data/knit-haskell-templates/pandoc-bootstrap-KH.html view
@@ -0,0 +1,81 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"$if(lang)$ lang="$lang$" xml:lang="$lang$"$endif$>+<head>+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />+  <meta http-equiv="Content-Style-Type" content="text/css" />+  <meta name="generator" content="pandoc" />+$for(author-meta)$+  <meta name="author" content="$author-meta$" />+$endfor$+$if(date-meta)$+  <meta name="date" content="$date-meta$" />+$endif$+  <title>$if(title-prefix)$$title-prefix$ - $endif$$pagetitle$</title>+  <style type="text/css">code{white-space: pre;}</style>+$if(quotes)$+  <style type="text/css">q { quotes: "“" "”" "‘" "’"; }</style>+$endif$+$if(highlighting-css)$+  <style type="text/css">+$highlighting-css$+  </style>+$endif$+$for(css)$+  <link rel="stylesheet" href="$css$" $if(html5)$$else$type="text/css" $endif$/>+$endfor$+$if(math)$+  $math$+$endif$+$for(header-includes)$+  $header-includes$+$endfor$+<!-- MathJax -->+<script async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML"></script>+<!-- Vega and Vega Embed -->+<script src="https://cdn.jsdelivr.net/npm/vega@4.4.0"></script>+<script src="https://cdn.jsdelivr.net/npm/vega-lite@3.0.0-rc11"></script>+<script src="https://cdn.jsdelivr.net/npm/vega-embed@3.28.0"></script>+</head>+<body>+  $if(title)$+  <div class="navbar navbar-static-top">+    <div class="navbar-inner">+      <div class="container">+        <span class="doc-title">$title$</span>+        <ul class="nav pull-right doc-info">+          $for(author)$+          <li><p class="navbar-text">$author$</p></li>+          $endfor$+          $if(date)$+          <li><p class="navbar-text">$date$</p></li>+          $endif$+        </ul>+      </div>+    </div>+  </div>+  $endif$+  <div class="container">+    <div class="row">+      $if(toc)$+      <div id="$idprefix$TOC" class="span3">+        <div class="well toc">+        <ul>+          <li class="nav-header">Table of Contents</li>+        </ul>+        $toc$+        </div>+      </div>+      $endif$+      <div class="span$if(toc)$9$else$12$endif$">+      $for(include-before)$+      $include-before$+      $endfor$+      $body$+      $for(include-after)$+      $include-after$+      $endfor$+      </div>+    </div>+  </div>+</body>+</html>
+ data/pandoc-data/templates/default.commonmark view
@@ -0,0 +1,21 @@+$if(titleblock)$+$titleblock$++$endif$+$for(header-includes)$+$header-includes$++$endfor$+$for(include-before)$+$include-before$++$endfor$+$if(toc)$+$table-of-contents$++$endif$+$body$+$for(include-after)$++$include-after$+$endfor$
+ data/pandoc-data/templates/default.haddock view
@@ -0,0 +1,1 @@+$body$
+ data/pandoc-data/templates/default.html4 view
@@ -0,0 +1,69 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"$if(lang)$ lang="$lang$" xml:lang="$lang$"$endif$$if(dir)$ dir="$dir$"$endif$>+<head>+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />+  <meta http-equiv="Content-Style-Type" content="text/css" />+  <meta name="generator" content="pandoc" />+$for(author-meta)$+  <meta name="author" content="$author-meta$" />+$endfor$+$if(date-meta)$+  <meta name="date" content="$date-meta$" />+$endif$+$if(keywords)$+  <meta name="keywords" content="$for(keywords)$$keywords$$sep$, $endfor$" />+$endif$+  <title>$if(title-prefix)$$title-prefix$ – $endif$$pagetitle$</title>+  <style type="text/css">+      code{white-space: pre-wrap;}+      span.smallcaps{font-variant: small-caps;}+      span.underline{text-decoration: underline;}+      div.column{display: inline-block; vertical-align: top; width: 50%;}+$if(quotes)$+      q { quotes: "“" "”" "‘" "’"; }+$endif$+  </style>+$if(highlighting-css)$+  <style type="text/css">+$highlighting-css$+  </style>+$endif$+$for(css)$+  <link rel="stylesheet" href="$css$" type="text/css" />+$endfor$+$if(math)$+  $math$+$endif$+$for(header-includes)$+  $header-includes$+$endfor$+</head>+<body>+$for(include-before)$+$include-before$+$endfor$+$if(title)$+<div id="$idprefix$header">+<h1 class="title">$title$</h1>+$if(subtitle)$+<h1 class="subtitle">$subtitle$</h1>+$endif$+$for(author)$+<h2 class="author">$author$</h2>+$endfor$+$if(date)$+<h3 class="date">$date$</h3>+$endif$+</div>+$endif$+$if(toc)$+<div id="$idprefix$TOC">+$table-of-contents$+</div>+$endif$+$body$+$for(include-after)$+$include-after$+$endfor$+</body>+</html>
+ data/pandoc-data/templates/default.html5 view
@@ -0,0 +1,72 @@+<!DOCTYPE html>+<html xmlns="http://www.w3.org/1999/xhtml" lang="$lang$" xml:lang="$lang$"$if(dir)$ dir="$dir$"$endif$>+<head>+  <meta charset="utf-8" />+  <meta name="generator" content="pandoc" />+  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />+$for(author-meta)$+  <meta name="author" content="$author-meta$" />+$endfor$+$if(date-meta)$+  <meta name="dcterms.date" content="$date-meta$" />+$endif$+$if(keywords)$+  <meta name="keywords" content="$for(keywords)$$keywords$$sep$, $endfor$" />+$endif$+  <title>$if(title-prefix)$$title-prefix$ – $endif$$pagetitle$</title>+  <style>+      code{white-space: pre-wrap;}+      span.smallcaps{font-variant: small-caps;}+      span.underline{text-decoration: underline;}+      div.column{display: inline-block; vertical-align: top; width: 50%;}+$if(quotes)$+      q { quotes: "“" "”" "‘" "’"; }+$endif$+  </style>+$if(highlighting-css)$+  <style>+$highlighting-css$+  </style>+$endif$+$for(css)$+  <link rel="stylesheet" href="$css$" />+$endfor$+$if(math)$+  $math$+$endif$+  <!--[if lt IE 9]>+    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>+  <![endif]-->+$for(header-includes)$+  $header-includes$+$endfor$+</head>+<body>+$for(include-before)$+$include-before$+$endfor$+$if(title)$+<header id="title-block-header">+<h1 class="title">$title$</h1>+$if(subtitle)$+<p class="subtitle">$subtitle$</p>+$endif$+$for(author)$+<p class="author">$author$</p>+$endfor$+$if(date)$+<p class="date">$date$</p>+$endif$+</header>+$endif$+$if(toc)$+<nav id="$idprefix$TOC" role="doc-toc">+$table-of-contents$+</nav>+$endif$+$body$+$for(include-after)$+$include-after$+$endfor$+</body>+</html>
+ data/pandoc-data/templates/default.latex view
@@ -0,0 +1,488 @@+% Options for packages loaded elsewhere+\PassOptionsToPackage{unicode$for(hyperrefoptions)$,$hyperrefoptions$$endfor$}{hyperref}+\PassOptionsToPackage{hyphens}{url}+$if(colorlinks)$+\PassOptionsToPackage{dvipsnames,svgnames*,x11names*}{xcolor}+$endif$+$if(dir)$+$if(latex-dir-rtl)$+\PassOptionsToPackage{RTLdocument}{bidi}+$endif$+$endif$+%+\documentclass[+$if(fontsize)$+  $fontsize$,+$endif$+$if(lang)$+  $babel-lang$,+$endif$+$if(papersize)$+  $papersize$paper,+$endif$+$if(beamer)$+  ignorenonframetext,+$if(handout)$+  handout,+$endif$+$if(aspectratio)$+  aspectratio=$aspectratio$,+$endif$+$endif$+$for(classoption)$+  $classoption$$sep$,+$endfor$+]{$documentclass$}+$if(beamer)$+$if(background-image)$+\usebackgroundtemplate{%+  \includegraphics[width=\paperwidth]{$background-image$}%+}+$endif$+\usepackage{pgfpages}+\setbeamertemplate{caption}[numbered]+\setbeamertemplate{caption label separator}{: }+\setbeamercolor{caption name}{fg=normal text.fg}+\beamertemplatenavigationsymbols$if(navigation)$$navigation$$else$empty$endif$+$for(beameroption)$+\setbeameroption{$beameroption$}+$endfor$+% Prevent slide breaks in the middle of a paragraph+\widowpenalties 1 10000+\raggedbottom+$if(section-titles)$+\setbeamertemplate{part page}{+  \centering+  \begin{beamercolorbox}[sep=16pt,center]{part title}+    \usebeamerfont{part title}\insertpart\par+  \end{beamercolorbox}+}+\setbeamertemplate{section page}{+  \centering+  \begin{beamercolorbox}[sep=12pt,center]{part title}+    \usebeamerfont{section title}\insertsection\par+  \end{beamercolorbox}+}+\setbeamertemplate{subsection page}{+  \centering+  \begin{beamercolorbox}[sep=8pt,center]{part title}+    \usebeamerfont{subsection title}\insertsubsection\par+  \end{beamercolorbox}+}+\AtBeginPart{+  \frame{\partpage}+}+\AtBeginSection{+  \ifbibliography+  \else+    \frame{\sectionpage}+  \fi+}+\AtBeginSubsection{+  \frame{\subsectionpage}+}+$endif$+$endif$+$if(beamerarticle)$+\usepackage{beamerarticle} % needs to be loaded first+$endif$+$if(fontfamily)$+\usepackage[$for(fontfamilyoptions)$$fontfamilyoptions$$sep$,$endfor$]{$fontfamily$}+$else$+\usepackage{lmodern}+$endif$+$if(linestretch)$+\usepackage{setspace}+$endif$+\usepackage{amssymb,amsmath}+\usepackage{ifxetex,ifluatex}+\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex+  \usepackage[$if(fontenc)$$fontenc$$else$T1$endif$]{fontenc}+  \usepackage[utf8]{inputenc}+  \usepackage{textcomp} % provide euro and other symbols+\else % if luatex or xetex+$if(mathspec)$+  \ifxetex+    \usepackage{mathspec}+  \else+    \usepackage{unicode-math}+  \fi+$else$+  \usepackage{unicode-math}+$endif$+  \defaultfontfeatures{Scale=MatchLowercase}+  \defaultfontfeatures[\rmfamily]{Ligatures=TeX,Scale=1}+$if(mainfont)$+  \setmainfont[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$]{$mainfont$}+$endif$+$if(sansfont)$+  \setsansfont[$for(sansfontoptions)$$sansfontoptions$$sep$,$endfor$]{$sansfont$}+$endif$+$if(monofont)$+  \setmonofont[$for(monofontoptions)$$monofontoptions$$sep$,$endfor$]{$monofont$}+$endif$+$for(fontfamilies)$+  \newfontfamily{$fontfamilies.name$}[$for(fontfamilies.options)$$fontfamilies.options$$sep$,$endfor$]{$fontfamilies.font$}+$endfor$+$if(mathfont)$+$if(mathspec)$+  \ifxetex+    \setmathfont(Digits,Latin,Greek)[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$}+  \else+    \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$}+  \fi+$else$+  \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$}+$endif$+$endif$+$if(CJKmainfont)$+  \ifxetex+    \usepackage{xeCJK}+    \setCJKmainfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$}+  \fi+$endif$+$if(luatexjapresetoptions)$+  \ifluatex+    \usepackage[$for(luatexjapresetoptions)$$luatexjapresetoptions$$sep$,$endfor$]{luatexja-preset}+  \fi+$endif$+$if(CJKmainfont)$+  \ifluatex+    \usepackage[$for(luatexjafontspecoptions)$$luatexjafontspecoptions$$sep$,$endfor$]{luatexja-fontspec}+    \setmainjfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$}+  \fi+$endif$+\fi+$if(beamer)$+$if(theme)$+\usetheme[$for(themeoptions)$$themeoptions$$sep$,$endfor$]{$theme$}+$endif$+$if(colortheme)$+\usecolortheme{$colortheme$}+$endif$+$if(fonttheme)$+\usefonttheme{$fonttheme$}+$endif$+$if(mainfont)$+\usefonttheme{serif} % use mainfont rather than sansfont for slide text+$endif$+$if(innertheme)$+\useinnertheme{$innertheme$}+$endif$+$if(outertheme)$+\useoutertheme{$outertheme$}+$endif$+$endif$+% Use upquote if available, for straight quotes in verbatim environments+\IfFileExists{upquote.sty}{\usepackage{upquote}}{}+\IfFileExists{microtype.sty}{% use microtype if available+  \usepackage[$for(microtypeoptions)$$microtypeoptions$$sep$,$endfor$]{microtype}+  \UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts+}{}+$if(indent)$+$else$+\makeatletter+\@ifundefined{KOMAClassName}{% if non-KOMA class+  \IfFileExists{parskip.sty}{%+    \usepackage{parskip}+  }{% else+    \setlength{\parindent}{0pt}+    \setlength{\parskip}{6pt plus 2pt minus 1pt}}+}{% if KOMA class+  \KOMAoptions{parskip=half}}+\makeatother+$endif$+$if(verbatim-in-note)$+\usepackage{fancyvrb}+$endif$+\usepackage{xcolor}+\IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available+\IfFileExists{bookmark.sty}{\usepackage{bookmark}}{\usepackage{hyperref}}+\hypersetup{+$if(title-meta)$+  pdftitle={$title-meta$},+$endif$+$if(author-meta)$+  pdfauthor={$author-meta$},+$endif$+$if(lang)$+  pdflang={$lang$},+$endif$+$if(subject)$+  pdfsubject={$subject$},+$endif$+$if(keywords)$+  pdfkeywords={$for(keywords)$$keywords$$sep$, $endfor$},+$endif$+$if(colorlinks)$+  colorlinks=true,+  linkcolor=$if(linkcolor)$$linkcolor$$else$Maroon$endif$,+  filecolor=$if(filecolor)$$filecolor$$else$Maroon$endif$,+  citecolor=$if(citecolor)$$citecolor$$else$Blue$endif$,+  urlcolor=$if(urlcolor)$$urlcolor$$else$Blue$endif$,+$else$+  hidelinks,+$endif$+  pdfcreator={LaTeX via pandoc}}+\urlstyle{same} % disable monospaced font for URLs+$if(verbatim-in-note)$+\VerbatimFootnotes % allow verbatim text in footnotes+$endif$+$if(geometry)$+$if(beamer)$+\geometry{$for(geometry)$$geometry$$sep$,$endfor$}+$else$+\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry}+$endif$+$endif$+$if(beamer)$+\newif\ifbibliography+$endif$+$if(listings)$+\usepackage{listings}+\newcommand{\passthrough}[1]{#1}+\lstset{defaultdialect=[5.3]Lua}+\lstset{defaultdialect=[x86masm]Assembler}+$endif$+$if(lhs)$+\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{}+$endif$+$if(highlighting-macros)$+$highlighting-macros$+$endif$+$if(tables)$+\usepackage{longtable,booktabs}+$if(beamer)$+\usepackage{caption}+% Make caption package work with longtable+\makeatletter+\def\fnum@table{\tablename~\thetable}+\makeatother+$else$+% Correct order of tables after \paragraph or \subparagraph+\usepackage{etoolbox}+\makeatletter+\patchcmd\longtable{\par}{\if@noskipsec\mbox{}\fi\par}{}{}+\makeatother+% Allow footnotes in longtable head/foot+\IfFileExists{footnotehyper.sty}{\usepackage{footnotehyper}}{\usepackage{footnote}}+\makesavenoteenv{longtable}+$endif$+$endif$+$if(graphics)$+\usepackage{graphicx,grffile}+\makeatletter+\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi}+\def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi}+\makeatother+% Scale images if necessary, so that they will not overflow the page+% margins by default, and it is still possible to overwrite the defaults+% using explicit options in \includegraphics[width, height, ...]{}+\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio}+% Set default figure placement to htbp+\makeatletter+\def\fps@figure{htbp}+\makeatother+$endif$+$if(links-as-notes)$+% Make links footnotes instead of hotlinks:+\DeclareRobustCommand{\href}[2]{#2\footnote{\url{#1}}}+$endif$+$if(strikeout)$+\usepackage[normalem]{ulem}+% Avoid problems with \sout in headers with hyperref+\pdfstringdefDisableCommands{\renewcommand{\sout}{}}+$endif$+\setlength{\emergencystretch}{3em} % prevent overfull lines+\providecommand{\tightlist}{%+  \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}+$if(numbersections)$+\setcounter{secnumdepth}{$if(secnumdepth)$$secnumdepth$$else$5$endif$}+$else$+\setcounter{secnumdepth}{-\maxdimen} % remove section numbering+$endif$+$if(beamer)$+$else$+$if(block-headings)$+% Make \paragraph and \subparagraph free-standing+\ifx\paragraph\undefined\else+  \let\oldparagraph\paragraph+  \renewcommand{\paragraph}[1]{\oldparagraph{#1}\mbox{}}+\fi+\ifx\subparagraph\undefined\else+  \let\oldsubparagraph\subparagraph+  \renewcommand{\subparagraph}[1]{\oldsubparagraph{#1}\mbox{}}+\fi+$endif$+$endif$+$if(pagestyle)$+\pagestyle{$pagestyle$}+$endif$+$for(header-includes)$+$header-includes$+$endfor$+$if(lang)$+\ifxetex+  % Load polyglossia as late as possible: uses bidi with RTL langages (e.g. Hebrew, Arabic)+  \usepackage{polyglossia}+  \setmainlanguage[$polyglossia-lang.options$]{$polyglossia-lang.name$}+$for(polyglossia-otherlangs)$+  \setotherlanguage[$polyglossia-otherlangs.options$]{$polyglossia-otherlangs.name$}+$endfor$+\else+  \usepackage[shorthands=off,$for(babel-otherlangs)$$babel-otherlangs$,$endfor$main=$babel-lang$]{babel}+$if(babel-newcommands)$+  $babel-newcommands$+$endif$+\fi+$endif$+$if(dir)$+\ifxetex+  % Load bidi as late as possible as it modifies e.g. graphicx+  \usepackage{bidi}+\fi+\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex+  \TeXXeTstate=1+  \newcommand{\RL}[1]{\beginR #1\endR}+  \newcommand{\LR}[1]{\beginL #1\endL}+  \newenvironment{RTL}{\beginR}{\endR}+  \newenvironment{LTR}{\beginL}{\endL}+\fi+$endif$+$if(natbib)$+\usepackage[$natbiboptions$]{natbib}+\bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$}+$endif$+$if(biblatex)$+\usepackage[$if(biblio-style)$style=$biblio-style$,$endif$$for(biblatexoptions)$$biblatexoptions$$sep$,$endfor$]{biblatex}+$for(bibliography)$+\addbibresource{$bibliography$}+$endfor$+$endif$++$if(title)$+\title{$title$$if(thanks)$\thanks{$thanks$}$endif$}+$endif$+$if(subtitle)$+$if(beamer)$+$else$+\usepackage{etoolbox}+\makeatletter+\providecommand{\subtitle}[1]{% add subtitle to \maketitle+  \apptocmd{\@title}{\par {\large #1 \par}}{}{}+}+\makeatother+$endif$+\subtitle{$subtitle$}+$endif$+$if(author)$+\author{$for(author)$$author$$sep$ \and $endfor$}+$endif$+\date{$date$}+$if(beamer)$+$if(institute)$+\institute{$for(institute)$$institute$$sep$ \and $endfor$}+$endif$+$if(titlegraphic)$+\titlegraphic{\includegraphics{$titlegraphic$}}+$endif$+$if(logo)$+\logo{\includegraphics{$logo$}}+$endif$+$endif$++\begin{document}+$if(has-frontmatter)$+\frontmatter+$endif$+$if(title)$+$if(beamer)$+\frame{\titlepage}+$else$+\maketitle+$endif$+$if(abstract)$+\begin{abstract}+$abstract$+\end{abstract}+$endif$+$endif$++$for(include-before)$+$include-before$++$endfor$+$if(toc)$+$if(toc-title)$+\renewcommand*\contentsname{$toc-title$}+$endif$+$if(beamer)$+\begin{frame}+$if(toc-title)$+  \frametitle{$toc-title$}+$endif$+  \tableofcontents[hideallsubsections]+\end{frame}+$else$+{+$if(colorlinks)$+\hypersetup{linkcolor=$if(toccolor)$$toccolor$$else$$endif$}+$endif$+\setcounter{tocdepth}{$toc-depth$}+\tableofcontents+}+$endif$+$endif$+$if(lot)$+\listoftables+$endif$+$if(lof)$+\listoffigures+$endif$+$if(linestretch)$+\setstretch{$linestretch$}+$endif$+$if(has-frontmatter)$+\mainmatter+$endif$+$body$++$if(has-frontmatter)$+\backmatter+$endif$+$if(natbib)$+$if(bibliography)$+$if(biblio-title)$+$if(has-chapters)$+\renewcommand\bibname{$biblio-title$}+$else$+\renewcommand\refname{$biblio-title$}+$endif$+$endif$+$if(beamer)$+\begin{frame}[allowframebreaks]{$biblio-title$}+  \bibliographytrue+$endif$+  \bibliography{$for(bibliography)$$bibliography$$sep$,$endfor$}+$if(beamer)$+\end{frame}+$endif$++$endif$+$endif$+$if(biblatex)$+$if(beamer)$+\begin{frame}[allowframebreaks]{$biblio-title$}+  \bibliographytrue+  \printbibliography[heading=none]+\end{frame}+$else$+\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$+$endif$++$endif$+$for(include-after)$+$include-after$++$endfor$+\end{document}
+ data/pandoc-data/templates/default.markdown view
@@ -0,0 +1,21 @@+$if(titleblock)$+$titleblock$++$endif$+$for(header-includes)$+$header-includes$++$endfor$+$for(include-before)$+$include-before$++$endfor$+$if(toc)$+$table-of-contents$++$endif$+$body$+$for(include-after)$++$include-after$+$endfor$
examples/ErrorExample.hs view
@@ -8,8 +8,6 @@ import qualified Knit.Report as K      import qualified Data.Map                      as M-import qualified Data.Text.IO                  as T-import qualified Data.Text.Lazy                as TL import qualified Data.Text                as T import           Data.String.Here (here) import qualified Graphics.Vega.VegaLite        as V@@ -24,13 +22,11 @@  main :: IO () main = do-  let pandocWriterConfig = K.PandocWriterConfig (Just "pandoc-templates/minWithVega-pandoc.html")  templateVars K.mindocOptionsF-  resSimpleE <- K.knitHtml (Just "SimpleExample.Main") K.logAll pandocWriterConfig makeDocWithKnitError+  let template =  K.FromIncludedTemplateDir "pandoc-bootstrap-KH.html"+  pandocWriterConfig <- K.mkPandocWriterConfig template templateVars K.mindocOptionsF+  resSimpleE <- K.knitHtml (Just "ErrorExample.Main") K.logAll pandocWriterConfig makeDocWithKnitError   case resSimpleE of-    Right htmlAsText ->-      T.writeFile "examples/html/example_simple.html"-        $ TL.toStrict-        $ htmlAsText+    Right htmlAsText -> K.writeAndMakePathLT "examples/html/error_example.html" htmlAsText     Left err -> putStrLn $ "Pandoc Error: " ++ show err      md1 :: T.Text
examples/MtlExample.hs view
@@ -27,7 +27,7 @@   ]  -- A demo application stack -newtype MyApp env a = MyStack { unMyApp :: ReaderT env IO a } deriving (Functor, Applicative, Monad, MonadIO)+newtype MyApp env a = MyStack { unMyApp :: ReaderT env IO a } deriving (Functor, Applicative, Monad, MonadIO)   type ExampleApp = MyApp T.Text @@ -39,15 +39,13 @@  main :: IO () main = do-  let pandocWriterConfig =-        K.PandocWriterConfig (Just "pandoc-templates/minWithVega-pandoc.html")  templateVars K.mindocOptionsF+  let template =  K.FromIncludedTemplateDir "pandoc-bootstrap-KH.html"+  templateVarsWithCss <- K.addCss (K.FromIncludedCssDir "pandoc-bootstrap.css") templateVars+  pandocWriterConfig <- K.mkPandocWriterConfig template templateVarsWithCss K.mindocOptionsF   resE <- runExampleApp "This is from the MyApp environment."     $ K.knitHtml (Just "MtlExample.Main") K.logAll pandocWriterConfig makeDoc   case resE of-    Right htmlAsText ->-      T.writeFile "examples/html/mtl_example.html"-        $ TL.toStrict-        $ htmlAsText+    Right htmlAsText -> K.writeAndMakePathLT "examples/html/mtl_example.html" htmlAsText     Left err -> putStrLn $ "Pandoc error: " ++ show err  md1 :: T.Text
examples/MultiDocExample.hs view
@@ -24,15 +24,14 @@  main :: IO () main = do-  let writeNamedHtml (K.DocWithInfo (K.PandocInfo n _) lt)-        = T.writeFile (T.unpack $ "examples/html/" <> n <> ".html") $ TL.toStrict lt-      writeAllHtml = fmap (const ()) . traverse writeNamedHtml-      pandocWriterConfig = K.PandocWriterConfig (Just "pandoc-templates/minWithVega-pandoc.html")  templateVars K.mindocOptionsF-  resE <- K.knitHtmls (Just "SimpleExample.Main") K.logAll pandocWriterConfig $ do+  let template = K.FromIncludedTemplateDir "pandoc-adaptive-bootstrap-KH.html"+  tvWithCss <- K.addCss (K.FromIncludedCssDir "pandoc-bootstrap.css") templateVars+  pandocWriterConfig <- K.mkPandocWriterConfig template  tvWithCss K.mindocOptionsF+  resE <- K.knitHtmls (Just "MTLExample.Main") K.logAll pandocWriterConfig $ do     K.newPandoc (K.PandocInfo "multi_doc1" M.empty) makeDoc1     K.newPandoc (K.PandocInfo "multi_doc2" M.empty) makeDoc2   case resE of-    Right namedDocs -> writeAllHtml namedDocs +    Right namedDocs -> K.writeAllPandocResultsWithInfoAsHtml "examples/html" namedDocs     Left err -> putStrLn $ "pandoc error: " ++ show err      md1 :: T.Text
examples/RandomExample.hs view
@@ -7,14 +7,13 @@ module Main where  import qualified Knit.Report               as K-import qualified Knit.Effect.RandomFu      as KR+import qualified Polysemy.RandomFu         as PR+import qualified Polysemy.ConstraintAbsorber.MonadRandom as PR import qualified Colonnade                 as C  import           Control.Monad              (replicateM) import           Control.Monad.IO.Class     (MonadIO) import qualified Data.Map                  as M-import qualified Data.Text.IO              as T-import qualified Data.Text.Lazy            as TL import qualified Data.Text                 as T import           Data.String.Here           (here) import qualified Graphics.Vega.VegaLite    as V@@ -48,17 +47,14 @@  main :: IO () main = do-  let pandocWriterConfig =-        K.PandocWriterConfig (Just "pandoc-templates/minWithVega-pandoc.html")  templateVars K.mindocOptionsF+  let template =  K.FromIncludedTemplateDir "mindoc-pandoc-KH.html"+  pandocWriterConfig <- K.mkPandocWriterConfig template templateVars K.mindocOptionsF   pureMTSource <- newPureMT     resE <- runExampleApp "This is from the MyApp environment."           $ K.knitHtml (Just "RandomExample.Main") K.logAll pandocWriterConfig-          $ KR.runRandomFuIOPureMT pureMTSource $ makeDoc+          $ PR.runRandomIOPureMT pureMTSource $ makeDoc   case resE of -    Right htmlAsText ->-      T.writeFile "examples/html/random_example.html"-        $ TL.toStrict-        $ htmlAsText+    Right htmlAsText -> K.writeAndMakePathLT "examples/html/random_example.html" htmlAsText     Left err -> putStrLn $ "Pandoc error: " ++ show err  md1 :: T.Text@@ -71,7 +67,7 @@ |]  makeDoc :: ( K.KnitOne effs-           , K.Member KR.RandomFu effs -- this one needs to be handled before knitting+           , K.Member PR.RandomFu effs -- this one needs to be handled before knitting            , K.KnitBase ExampleApp effs) => K.Sem effs () makeDoc = K.wrapPrefix "makeDoc" $ do   K.logLE K.Info "adding some markdown..."@@ -93,11 +89,11 @@    K.logLE K.Info "Using another polysemy effect, here RandomFu"   let nDraws = 20-  someNormalDoubles <- KR.sampleRVar $ replicateM nDraws (stdNormal @Double)+  someNormalDoubles <- PR.sampleRVar $ replicateM nDraws (stdNormal @Double)   K.addMarkDown "## An example of using the RandomFu effect to get random numbers and using Colonnade to make tables."   K.addMarkDown $ "some std normal draws: "   K.addColonnadeTextTable (C.headed "#" (T.pack . show . fst) <> C.headed "Draw" (T.pack . show . snd)) $ zip [1..nDraws] someNormalDoubles-  moreNormalDoubles <- KR.absorbMonadRandom (monadRandomFunction nDraws)+  moreNormalDoubles <- PR.absorbMonadRandom (monadRandomFunction nDraws)   K.addMarkDown "## This time, using absorbMonadRandom to interoperate with a function using the MonadRandom constraint."   K.addMarkDown $ "some std normal draws: "   K.addColonnadeTextTable (C.headed "#" (T.pack . show . fst) <> C.headed "Draw" (T.pack . show . snd)) $ zip [1..nDraws] moreNormalDoubles
examples/SimpleExample.hs view
@@ -8,8 +8,6 @@ import qualified Knit.Report              as K      import qualified Data.Map                 as M-import qualified Data.Text.IO             as T-import qualified Data.Text.Lazy           as TL import qualified Data.Text                as T import           Data.String.Here          (here) import qualified Graphics.Vega.VegaLite   as V@@ -26,13 +24,11 @@  main :: IO () main = do-  let pandocWriterConfig = K.PandocWriterConfig (Just "pandoc-templates/minWithVega-pandoc.html")  templateVars K.mindocOptionsF+  let template = K.FromIncludedTemplateDir "mindoc-pandoc-KH.html"+  pandocWriterConfig <- K.mkPandocWriterConfig template templateVars K.mindocOptionsF   resE <- K.knitHtml (Just "SimpleExample.Main") K.logAll pandocWriterConfig makeDoc   case resE of-    Right htmlAsText ->-      T.writeFile "examples/html/example_simple.html"-        $ TL.toStrict-        $ htmlAsText+    Right htmlAsText ->  K.writeAndMakePathLT "examples/html/simple_example.html" htmlAsText     Left err -> putStrLn $ "Pandoc Error: " ++ show err  md1 :: T.Text
knit-haskell.cabal view
@@ -1,14 +1,13 @@-cabal-version:       2.2+cabal-version:       2.4  name:                knit-haskell-version:             0.5.0.0+version:             0.6.0.0 synopsis:            a minimal Rmarkdown sort-of-thing for haskell, by way of Pandoc description:         knit-haskell is a beginning attempt at bringing some of the benefits of                      Rmarkdown to Haskell.                      It includes an effects stack                      (using <https://github.com/isovector/polysemy#readme polysemy> rather than mtl)-                     which includes logging, randomness-                     (via <http://hackage.haskell.org/package/random-fu random-fu>),+                     which includes logging,                                           a simplified interface to Pandoc and various writer-like effects to                      intersperse document building with regular code.                      Various helper functions are provided to simplify common operations,@@ -28,25 +27,38 @@ maintainer:          adam_conner_sax@yahoo.com copyright:           2019 Adam Conner-Sax category:            Text-extra-source-files:  ChangeLog.md-tested-with: GHC ==8.6.4 +extra-source-files:  ChangeLog.md, Readme.md+data-dir:            data+data-files:+           knit-haskell-templates/*.html+           knit-haskell-css/*.css+           pandoc-data/templates/*.html4+           pandoc-data/templates/*.html5+           pandoc-data/templates/default.latex+           pandoc-data/templates/default.markdown+           pandoc-data/templates/default.commonmark+           pandoc-data/templates/default.haddock++tested-with: GHC ==8.6.4 Build-type: Simple  source-repository head     Type: git     Location: https://github.com/adamConnerSax/knit-haskell --                                          +                                               library-  ghc-options: -Wall -fplugin=Polysemy.Plugin -fno-warn-unused-top-binds -funbox-strict-fields+  ghc-options: -Wall -fno-warn-unused-top-binds -funbox-strict-fields+  ghc-options: -fplugin=Polysemy.Plugin+--  ghc-options: -fdefer-type-errors -fno-warn-deferred-type-errors+-- when generating haddocks, comment out the plugin and uncomment the one above   exposed-modules: Knit.Effect.Logger                  , Knit.Effect.Docs                  , Knit.Effect.Html-                 , Knit.Effect.RandomFu                  , Knit.Effect.PandocMonad                  , Knit.Effect.Pandoc                  , Knit.Effect.UnusedId+                 , Knit.Report                  , Knit.Report.Input.Table.Colonnade                  , Knit.Report.Input.Html                  , Knit.Report.Input.Html.Lucid@@ -57,9 +69,10 @@                  , Knit.Report.Input.Visualization.Diagrams                  , Knit.Report.Output                  , Knit.Report.Output.Html-                 , Knit.Report                  , Knit.Report.Other.Lucid                  , Knit.Report.Other.Blaze+  other-modules:   Paths_knit_haskell+  autogen-modules: Paths_knit_haskell                                      build-depends:    aeson-pretty                      >= 0.8.7 && < 0.9,                     base                              >= 4.12.0 && < 4.13,@@ -69,6 +82,7 @@                     case-insensitive                  >= 1.2.0.11 && < 1.3.0.0,                     colonnade                         >= 1.1 && < 1.3,                     containers                        >= 0.5.0 && < 0.7,+                    constraints                       >= 0.10 && < 0.12,                     directory                         >= 1.3.3.0 && < 1.4.0.0,                     diagrams-lib                      >= 1.4 && < 1.5.0.0,                     diagrams-svg                      >= 1.4.1 && < 1.5.0.0,@@ -87,6 +101,7 @@                     mtl                               >= 2.2.2 && < 2.3,                     polysemy                          >= 0.3.0.0 && < 0.5.0.0,                     polysemy-plugin                   >= 0.2.0.0 && < 0.3.0.0,+                    polysemy-zoo                      >= 0.3.0.0 && < 0.4.0,                     prettyprinter                     >= 1.2.1 && < 1.4,                     lucid                             >= 2.9.11 && < 2.10,                     pandoc                            >= 2.7.2 && < 2.8,@@ -102,7 +117,7 @@     type: exitcode-stdio-1.0     main-is: SimpleExample.hs     hs-source-dirs: examples-    ghc-options: -Wall+    ghc-options: -fplugin=Polysemy.Plugin     build-depends: base,                    blaze-html,                    containers,@@ -110,7 +125,8 @@                    hvega,                         knit-haskell                      -any,                    plots                             >= 0.1.1.0 && <= 0.2,-                   polysemy,  +                   polysemy,+                   polysemy-plugin,                    text           default-language: Haskell2010 @@ -118,14 +134,15 @@     type: exitcode-stdio-1.0     main-is: ErrorExample.hs     hs-source-dirs: examples-    ghc-options: -Wall +    ghc-options: -fplugin=Polysemy.Plugin     build-depends: base,                    blaze-html,                    containers,                    here                              >= 1.2.10 && < 1.3.0,                    hvega,                         knit-haskell                      -any,-                   polysemy,  +                   polysemy,+                   polysemy-plugin,                                       text           default-language: Haskell2010 @@ -133,14 +150,15 @@     type: exitcode-stdio-1.0     main-is: MultiDocExample.hs     hs-source-dirs: examples-    ghc-options: -Wall +    ghc-options: -fplugin=Polysemy.Plugin     build-depends: base,                    blaze-html,                    containers,                    here                              >= 1.2.10 && < 1.3.0,                    hvega,                         knit-haskell                      -any,-                   polysemy,  +                   polysemy,+                   polysemy-plugin,                                       text           default-language: Haskell2010 @@ -148,7 +166,7 @@     type: exitcode-stdio-1.0     main-is: MtlExample.hs     hs-source-dirs: examples-    ghc-options: -Wall +    ghc-options: -fplugin=Polysemy.Plugin     build-depends: base,                    blaze-html,                    containers,@@ -157,6 +175,7 @@                    knit-haskell                      -any,                    mtl,                    polysemy,+                   polysemy-plugin,                                       text     default-language: Haskell2010 @@ -164,7 +183,7 @@     type: exitcode-stdio-1.0     main-is: RandomExample.hs     hs-source-dirs: examples-    ghc-options: -Wall +    ghc-options: -fplugin=Polysemy.Plugin      build-depends: base,                    blaze-html,                    colonnade,@@ -174,6 +193,8 @@                    knit-haskell                      -any,                    mtl,                    polysemy,+                   polysemy-plugin,+                   polysemy-RandomFu >= 0.2.0.0,                    random-fu,                    random-source,                    text
src/Knit/Effect/Docs.hs view
@@ -8,7 +8,6 @@ {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE StandaloneDeriving  #-} {-# LANGUAGE TypeOperators       #-}- {-# OPTIONS_GHC -fwarn-incomplete-patterns #-} {-| Module      : Knit.Effect.Docs@@ -49,17 +48,19 @@ import           Polysemy.Internal              ( send ) import qualified Polysemy.Writer               as P -import           Control.Monad (sequence, join)+import           Control.Monad                  ( sequence+                                                , join+                                                )  -- | GADT to represent storing a document and some info for processing it. data Docs i a m r where-  NewDoc :: i -> a -> Docs i a m ()+  NewDoc ::i -> a -> Docs i a m ()  -- | Action of the 'Docs' Effect.  Store a document. newDoc :: P.Member (Docs i a) effs => i -> a -> P.Sem effs () newDoc info doc = send $ NewDoc info doc --- | Data type to hold one document with info of typ @i@ and doc of type @a@. +-- | Data type to hold one document with info of type @i@ and doc of type @a@.  data DocWithInfo i a = DocWithInfo { dwiInfo :: i, dwiDoc :: a } deriving instance Functor (DocWithInfo i) deriving instance Foldable (DocWithInfo i)@@ -67,7 +68,8 @@  -- | Intepret 'Docs' in @Polysemy.Writer [DocWithInfo i a]' toWriter-  :: P.Sem (Docs i a ': effs) () -> P.Sem (P.Writer [DocWithInfo i a] ': effs) ()+  :: P.Sem (Docs i a ': effs) ()+  -> P.Sem (P.Writer [DocWithInfo i a] ': effs) () toWriter = P.reinterpret f  where   f :: Docs i a m x -> P.Sem (P.Writer [DocWithInfo i a] ': effs) x@@ -78,22 +80,28 @@ toDocList = fmap fst . P.runWriter . toWriter  -- | Map over the doc part of @Functor m => m [DocWithInfo i a]@ with an @a->b@ resulting in @m [DocWithInfo i b]@-mapDocs :: Monad m => (i -> a -> b) -> m [DocWithInfo i a] -> m [DocWithInfo i b]+mapDocs+  :: Monad m => (i -> a -> b) -> m [DocWithInfo i a] -> m [DocWithInfo i b] mapDocs f = fmap (fmap (\(DocWithInfo i a) -> DocWithInfo i (f i a)))  -- | Map over the doc part of @Monad m => m [DocWithInfo i a]@ with @a -> m b@ resulting in @m [DocWithInfo i b]@-mapDocsM :: Monad m => (i -> a -> m b) -> m [DocWithInfo i a] -> m [DocWithInfo i b]+mapDocsM+  :: Monad m => (i -> a -> m b) -> m [DocWithInfo i a] -> m [DocWithInfo i b] mapDocsM f = join . fmap (sequence . fmap (traverse id)) . mapDocs f --(traverse (traverse f) =<<)  -- | Combine the interpretation and mapping step. -- Commonly used to "run" the effect and map the results to your desired output format. toDocListWith-  :: (i -> a -> b) -> P.Sem (Docs i a ': effs) () -> P.Sem effs [DocWithInfo i b]+  :: (i -> a -> b)+  -> P.Sem (Docs i a ': effs) ()+  -> P.Sem effs [DocWithInfo i b] toDocListWith f = mapDocs f . toDocList  -- | Combine the interpretation and effectful mapping step. -- Commonly used to "run" the effect and map the results to your deisred output format. toDocListWithM-  :: (i -> a -> P.Sem effs b) -> P.Sem (Docs i a ': effs) () -> P.Sem effs [DocWithInfo i b]+  :: (i -> a -> P.Sem effs b)+  -> P.Sem (Docs i a ': effs) ()+  -> P.Sem effs [DocWithInfo i b] toDocListWithM f = mapDocsM f . toDocList 
src/Knit/Effect/PandocMonad.hs view
@@ -1,9 +1,7 @@ {-# LANGUAGE ConstraintKinds       #-} {-# LANGUAGE DataKinds             #-} {-# LANGUAGE PolyKinds             #-}-{-# LANGUAGE DeriveFunctor         #-} {-# LANGUAGE FlexibleContexts      #-}-{-# LANGUAGE FlexibleInstances     #-} {-# LANGUAGE GADTs                 #-} {-# LANGUAGE LambdaCase            #-} {-# LANGUAGE MultiParamTypeClasses #-}@@ -14,7 +12,6 @@ {-# LANGUAGE TypeApplications      #-} {-# LANGUAGE TypeOperators         #-} {-# LANGUAGE UndecidableInstances  #-}-{-# LANGUAGE AllowAmbiguousTypes   #-} {-# LANGUAGE TupleSections         #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# OPTIONS_GHC -fwarn-incomplete-patterns #-}@@ -74,11 +71,14 @@ where  import qualified Knit.Effect.Logger            as Log+import qualified Paths_knit_haskell            as Paths  import qualified Polysemy                      as P import           Polysemy.Internal              ( send ) import           Polysemy.Internal.Combinators  ( stateful ) import qualified Polysemy.Error                as P+import qualified Polysemy.ConstraintAbsorber   as P+ import qualified Text.Pandoc                   as PA import qualified Text.Pandoc.MIME              as PA import qualified Text.Pandoc.UTF8              as UTF8@@ -93,6 +93,9 @@ import           Control.Monad.Except           ( MonadError(..)                                                 , liftIO                                                 )++--import qualified Data.Constraint               as C+ import qualified Network.URI                   as NU import           Network.Socket                 ( withSocketsDo ) import qualified Network.HTTP.Client           as NHC@@ -131,24 +134,24 @@  -- | Pandoc Effect data Pandoc m r where-  LookupEnv :: String -> Pandoc m (Maybe String)-  GetCurrentTime :: Pandoc m UTCTime-  GetCurrentTimeZone :: Pandoc m TimeZone-  NewStdGen :: Pandoc m StdGen-  NewUniqueHash :: Pandoc m Int-  OpenURL :: String -> Pandoc m (BS.ByteString, Maybe PA.MimeType)-  ReadFileLazy :: FilePath -> Pandoc m LBS.ByteString-  ReadFileStrict :: FilePath -> Pandoc m BS.ByteString-  Glob :: String -> Pandoc m [FilePath]-  FileExists :: FilePath -> Pandoc m Bool-  GetDataFileName :: FilePath -> Pandoc m FilePath-  GetModificationTime :: FilePath -> Pandoc m UTCTime-  GetCommonState :: Pandoc m PA.CommonState-  PutCommonState :: PA.CommonState -> Pandoc m ()-  GetsCommonState :: (PA.CommonState -> a) -> Pandoc m a-  ModifyCommonState :: (PA.CommonState -> PA.CommonState) -> Pandoc m  ()-  LogOutput :: PA.LogMessage -> Pandoc m ()-  Trace :: String -> Pandoc m ()+  LookupEnv ::String -> Pandoc m (Maybe String)+  GetCurrentTime ::Pandoc m UTCTime+  GetCurrentTimeZone ::Pandoc m TimeZone+  NewStdGen ::Pandoc m StdGen+  NewUniqueHash ::Pandoc m Int+  OpenURL ::String -> Pandoc m (BS.ByteString, Maybe PA.MimeType)+  ReadFileLazy ::FilePath -> Pandoc m LBS.ByteString+  ReadFileStrict ::FilePath -> Pandoc m BS.ByteString+  Glob ::String -> Pandoc m [FilePath]+  FileExists ::FilePath -> Pandoc m Bool+  GetDataFileName ::FilePath -> Pandoc m FilePath+  GetModificationTime ::FilePath -> Pandoc m UTCTime+  GetCommonState ::Pandoc m PA.CommonState+  PutCommonState ::PA.CommonState -> Pandoc m ()+  GetsCommonState ::(PA.CommonState -> a) -> Pandoc m a+  ModifyCommonState ::(PA.CommonState -> PA.CommonState) -> Pandoc m  ()+  LogOutput ::PA.LogMessage -> Pandoc m ()+  Trace ::String -> Pandoc m ()  P.makeSem ''Pandoc @@ -169,55 +172,108 @@   (T.pack . PA.showLogMessage $ lm)  -- | Constraint helper for using this set of effects in IO.-type PandocEffects effs =-  ( P.Member Pandoc effs+type PandocEffects effs+  = ( P.Member Pandoc effs   , P.Member (P.Error PA.PandocError) effs   , P.Member Log.PrefixLog effs-  , P.Member (Log.Logger Log.LogEntry) effs)+  , P.Member (Log.Logger Log.LogEntry) effs+  ) --- | Unexported newtype for creating instances which we then discharge with absorbPandocMonad-newtype PandocMonadSem r a = PandocMonadSem { unPandocMonadSem :: P.Sem r a } deriving (Functor, Applicative, Monad)+-- absorption gear+-- | absorb a @PandocMonad@ constraint into+--  @Members [Pandoc, Error PandocError] r => Sem r@+absorbPandocMonad+  :: P.Members '[P.Error PA.PandocError, Pandoc] r+  => (PA.PandocMonad (P.Sem r) => P.Sem r a)+  -> P.Sem r a+absorbPandocMonad = P.absorbWithSem @PA.PandocMonad @Action+  (PandocDict lookupEnv+              getCurrentTime+              getCurrentTimeZone+              newStdGen+              newUniqueHash+              openURL+              readFileLazy+              readFileStrict+              glob+              fileExists+              getDataFileName+              getModificationTime+              getCommonState+              putCommonState+              getsCommonState+              modifyCommonState+              logOutput+              trace+              P.throw+              P.catch+  )+  (P.Sub P.Dict) -instance (P.Member (P.Error PA.PandocError) r) => MonadError PA.PandocError (PandocMonadSem r) where-  throwError = PandocMonadSem . P.throw-  catchError (PandocMonadSem sa) h = PandocMonadSem $ P.catch sa (unPandocMonadSem . h)+-- | wrapper for the PandocMonad constrained action +newtype Action m s' a = Action+    { action :: m a+    } deriving (Functor, Applicative, Monad) -instance (P.Member (P.Error PA.PandocError) r, PandocEffects r) => PA.PandocMonad (PandocMonadSem r) where-  lookupEnv = PandocMonadSem . lookupEnv-  getCurrentTime = PandocMonadSem $ getCurrentTime-  getCurrentTimeZone = PandocMonadSem $ getCurrentTimeZone-  newStdGen = PandocMonadSem $ newStdGen-  newUniqueHash = PandocMonadSem $ newUniqueHash-  openURL = PandocMonadSem . openURL-  readFileLazy = PandocMonadSem . readFileLazy-  readFileStrict = PandocMonadSem . readFileStrict-  glob = PandocMonadSem . glob-  fileExists = PandocMonadSem . fileExists-  getDataFileName = PandocMonadSem . getDataFileName-  getModificationTime = PandocMonadSem . getModificationTime-  getCommonState = PandocMonadSem $ getCommonState-  putCommonState = PandocMonadSem . putCommonState-  getsCommonState = PandocMonadSem . getsCommonState-  modifyCommonState = PandocMonadSem . modifyCommonState-  logOutput = PandocMonadSem . logOutput-  trace = PandocMonadSem . trace+-- | A dictionary of the functions we need to supply+-- to make an instance of PandocMonad+-- NB: the presence of @throwError@ and @catchError_@+-- which we need because of the MonadError superclass.+data PandocDict m = PandocDict+  {+    lookupEnv_ :: String -> m (Maybe String)+  , getCurrentTime_ :: m UTCTime+  , getCurrentTimeZone_ :: m TimeZone+  , newStdGen_ ::m StdGen+  , newUniqueHash_ :: m Int+  , openURL_ :: String ->  m (BS.ByteString, Maybe PA.MimeType)+  , readFileLazy_ :: FilePath ->  m LBS.ByteString+  , readFileStrict_ :: FilePath ->  m BS.ByteString+  , glob_ :: String ->  m [FilePath]+  , fileExists_ :: FilePath ->  m Bool+  , getDataFileName_ :: FilePath ->  m FilePath+  , getModificationTime_ :: FilePath ->  m UTCTime+  , getCommonState_ :: m PA.CommonState+  , putCommonState_ :: PA.CommonState ->  m ()+  , getsCommonState_ :: forall a. (PA.CommonState -> a) ->  m a+  , modifyCommonState_ :: (PA.CommonState -> PA.CommonState) ->  m  ()+  , logOutput_ :: PA.LogMessage ->  m ()+  , trace_ :: String ->  m ()+  , throwError_ :: forall a. PA.PandocError -> m a+  , catchError_ :: forall a. m a -> (PA.PandocError -> m a) -> m a+  }  -{- | Given an action constrained only by a PandocMonad constraint, -absorb it into a Polysemy monad whose-effect list contains the required effects.--}-absorbPandocMonad-  :: (P.Member (P.Error PA.PandocError) r, PandocEffects r)-  => (forall m . PA.PandocMonad m => m a)-  -> P.Sem r a-absorbPandocMonad = unPandocMonadSem+instance (Monad m+         , P.Reifies s' (PandocDict m)) => MonadError PA.PandocError (Action m s') where+  throwError e = Action $ throwError_ (P.reflect $ P.Proxy @s') e+  catchError x f =+    Action $ catchError_ (P.reflect $ P.Proxy @s') (action x) (action . f) +instance (Monad m+         , MonadError PA.PandocError (Action m s')+         , P.Reifies s' (PandocDict m)) => PA.PandocMonad (Action m s') where+  lookupEnv           = Action . lookupEnv_ (P.reflect $ P.Proxy @s')+  getCurrentTime      = Action $ getCurrentTime_ (P.reflect $ P.Proxy @s')+  getCurrentTimeZone  = Action $ getCurrentTimeZone_ (P.reflect $ P.Proxy @s')+  newStdGen           = Action $ newStdGen_ (P.reflect $ P.Proxy @s')+  newUniqueHash       = Action $ newUniqueHash_ (P.reflect $ P.Proxy @s')+  openURL             = Action . openURL_ (P.reflect $ P.Proxy @s')+  readFileLazy        = Action . readFileLazy_ (P.reflect $ P.Proxy @s')+  readFileStrict      = Action . readFileStrict_ (P.reflect $ P.Proxy @s')+  glob                = Action . glob_ (P.reflect $ P.Proxy @s')+  fileExists          = Action . fileExists_ (P.reflect $ P.Proxy @s')+  getDataFileName     = Action . getDataFileName_ (P.reflect $ P.Proxy @s')+  getModificationTime = Action . getModificationTime_ (P.reflect $ P.Proxy @s')+  getCommonState      = Action $ getCommonState_ (P.reflect $ P.Proxy @s')+  putCommonState      = Action . putCommonState_ (P.reflect $ P.Proxy @s')+  getsCommonState     = Action . getsCommonState_ (P.reflect $ P.Proxy @s')+  modifyCommonState   = Action . modifyCommonState_ (P.reflect $ P.Proxy @s')+  logOutput           = Action . logOutput_ (P.reflect $ P.Proxy @s')+  trace               = Action . trace_ (P.reflect $ P.Proxy @s')  -- | Constraint helper for using this set of effects in IO.-type PandocEffectsIO effs =-  ( PandocEffects effs-  , P.Member (P.Lift IO) effs)+type PandocEffectsIO effs = (PandocEffects effs, P.Member (P.Lift IO) effs)  -- | Interpret the Pandoc effect using @IO@, @Knit.Effect.Logger@ and @PolySemy.Error PandocError@  interpretInIO@@ -371,12 +427,11 @@ -- this default is built into Pandoc.  I could probably do something more useful here but maybe something depends on it?? -- or maybe the actual version on each machine has a correct local version?? -- TODO: Fix/Understand this-datadir :: FilePath-datadir-  = "/home/builder/hackage-server/build-cache/tmp-install/share/x86_64-linux-ghc-8.6.3/pandoc-2.7.2"+datadir :: IO FilePath+datadir = Paths.getDataDir+--  "/home/builder/hackage-server/build-cache/tmp-install/share/x86_64-linux-ghc-8.6.3/pandoc-2.7.2"  getDataFileName' :: FilePath -> IO FilePath getDataFileName' fp = do-  dir <- E.catch @E.IOException (IO.getEnv "pandoc_datadir")-                                (\_ -> return datadir)-  return (dir ++ "/" ++ fp)+  dir <- E.catch @E.IOException (IO.getEnv "pandoc_datadir") (\_ -> datadir)+  return (dir ++ "/pandoc-data/" ++ fp)
− src/Knit/Effect/RandomFu.hs
@@ -1,139 +0,0 @@-{-# LANGUAGE FlexibleContexts              #-}-{-# LANGUAGE OverloadedStrings             #-}-{-# LANGUAGE RankNTypes                    #-}-{-# LANGUAGE GADTs                         #-}-{-# LANGUAGE LambdaCase                    #-}-{-# LANGUAGE DataKinds                     #-}-{-# LANGUAGE PolyKinds                     #-}-{-# LANGUAGE TypeOperators                 #-}-{-# LANGUAGE ScopedTypeVariables           #-}-{-# LANGUAGE TypeApplications              #-}-{-# LANGUAGE TemplateHaskell               #-}-{-# LANGUAGE UndecidableInstances          #-}-{-# LANGUAGE AllowAmbiguousTypes           #-}-{-# LANGUAGE GeneralizedNewtypeDeriving    #-}-{-# LANGUAGE InstanceSigs                  #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -fwarn-incomplete-patterns #-}-{-|-Module      : Knit.Effect.RandomFu-Description : Polysemy random-fu effect-Copyright   : (c) Adam Conner-Sax 2019-License     : BSD-3-Clause-Maintainer  : adam_conner_sax@yahoo.com-Stability   : experimental--Polysemy "random-fu" effect.-Allows a polysemy "stack" to satisfy a MonadRandom (from "random-fu") constraint.-This can be run in a few ways:--1. Directly in 'IO'-2. Using any 'Data.Random.RandomSource' from "random-fu"-3. In 'IO', using a given 'Data.Random.Source.PureMT' source. ('IO' is used to put the source in an 'IORef')--}-module Knit.Effect.RandomFu-  (-    -- * Effect-    RandomFu--    -- * Actions-  , sampleRVar-  , sampleDist--  -- * Interpretations -  , runRandomFuIOSimple-  , runRandomFuIOPureMT-  , runRandomFuFromSource--  -- * Interop  -  , absorbMonadRandom--  -- * Deprecated, will be removed in next release-  , Random-  )-where--import qualified Polysemy                      as P-import           Polysemy.Internal              ( send )--import           Data.IORef                     ( newIORef )-import qualified Data.Random                   as R-import qualified Data.Random.Source            as R-import qualified Data.Random.Internal.Source   as R-import qualified Data.Random.Source.PureMT     as R--import           Control.Monad.IO.Class         ( MonadIO(..) )----import           Data.Kind                      ( Constraint )---- | Random Effect-data RandomFu m r where-  SampleRVar ::  R.RVar t -> RandomFu m t-  GetRandomPrim :: R.Prim t -> RandomFu m t--type Random = RandomFu-{-# DEPRECATED Random "Use RandomFu instead" #-}---- | Convert a random-fu RVar to the Random Effect-sampleRVar :: (P.Member RandomFu effs) => R.RVar t -> P.Sem effs t-sampleRVar = send . SampleRVar---- | Convert a random-fu Distribution to the Random Effect-sampleDist-  :: (P.Member RandomFu effs, R.Distribution d t) => d t -> P.Sem effs t-sampleDist = sampleRVar . R.rvar--getRandomPrim :: P.Member RandomFu effs => R.Prim t -> P.Sem effs t-getRandomPrim = send . GetRandomPrim---- | Run in IO using default random-fu IO source-runRandomFuIOSimple-  :: forall effs a-   . MonadIO (P.Sem effs)-  => P.Sem (RandomFu ': effs) a-  -> P.Sem effs a-runRandomFuIOSimple = P.interpret f- where-  f :: forall m x . (RandomFu m x -> P.Sem effs x)-  f r = case r of-    SampleRVar    rv -> liftIO $ R.sample rv-    GetRandomPrim pt -> liftIO $ R.getRandomPrim pt---- | Run using the given source-runRandomFuFromSource-  :: forall s effs a-   . R.RandomSource (P.Sem effs) s-  => s-  -> P.Sem (RandomFu ': effs) a-  -> P.Sem effs a-runRandomFuFromSource source = P.interpret f- where-  f :: forall m x . (RandomFu m x -> P.Sem effs x)-  f r = case r of-    SampleRVar    rv -> R.runRVar (R.sample rv) source-    GetRandomPrim pt -> R.runRVar (R.getRandomPrim pt) source---- | Run in 'IO', using the given 'PureMT' source stored in an 'IORef'-runRandomFuIOPureMT-  :: MonadIO (P.Sem effs)-  => R.PureMT-  -> P.Sem (RandomFu ': effs) a-  -> P.Sem effs a-runRandomFuIOPureMT source re =-  liftIO (newIORef source) >>= flip runRandomFuFromSource re--newtype RandomFuSem r a = RandomFuSem { unRandomFuSem :: P.Sem r a } deriving (Functor, Applicative, Monad)--$(R.monadRandom [d|-        instance P.Member RandomFu r => R.MonadRandom (RandomFuSem r) where-            getRandomPrim = RandomFuSem . getRandomPrim-    |])--{- | Given a function that uses the random-fu package and produces a result thusly-constrained by 'MonadRandom', absorb it into a Polysemy monad whose-effect list contains the RandomFu effect.--}-absorbMonadRandom-  :: P.Member RandomFu r => (forall m . R.MonadRandom m => m a) -> P.Sem r a-absorbMonadRandom = unRandomFuSem-
src/Knit/Report.hs view
@@ -56,7 +56,7 @@   , module Knit.Report.Input.Visualization.Hvega   , module Knit.Report.Input.Visualization.Diagrams -    -- * Output +    -- * Output   , module Knit.Report.Output   , module Knit.Report.Output.Html @@ -79,7 +79,7 @@                                                 , PandocReadFormat(..)                                                 , PandocWriteFormat(..)                                                 , Pandocs-                                                , PandocInfo (..)+                                                , PandocInfo(..)                                                 , newPandoc                                                 ) import           Knit.Effect.Docs               ( DocWithInfo(..) )@@ -106,9 +106,11 @@ import           Knit.Report.Input.Visualization.Diagrams --                                         hiding ( trace ) -- trace conflicts with Pandoc.trace -import           Knit.Report.Output             ( PandocWriterConfig(..) )+import           Knit.Report.Output import           Knit.Report.Output.Html        ( pandocWriterToBlazeDocument                                                 , mindocOptionsF+                                                , writeAllPandocResultsWithInfoAsHtml+                                                , writePandocResultWithInfoAsHtml                                                 )  import           Text.Pandoc                    ( PandocError )@@ -124,7 +126,6 @@ import qualified Text.Pandoc                   as PA import qualified Text.Blaze.Html.Renderer.Text as BH - import qualified Knit.Report.Output.Html       as KO import qualified Knit.Effect.Docs              as KD import qualified Knit.Effect.Pandoc            as KP@@ -144,10 +145,18 @@   -> [KLog.LogSeverity] -- ^ what to output in log   -> PandocWriterConfig -- ^ configuration for the Pandoc Html Writer   -> P.Sem (KnitEffectDocsStack m) ()-  -> m (Either PA.PandocError [KP.DocWithInfo KP.PandocInfo TL.Text])+  -> m+       ( Either+           PA.PandocError+           [KP.DocWithInfo KP.PandocInfo TL.Text]+       ) knitHtmls loggingPrefixM ls (PandocWriterConfig mFP tv oF) =   consumeKnitEffectStack loggingPrefixM ls . KD.toDocListWithM-    (\(KP.PandocInfo _ tv') a -> fmap BH.renderHtml . KO.toBlazeDocument (PandocWriterConfig mFP (tv' <> tv) oF) $ a)+    (\(KP.PandocInfo _ tv') a ->+      fmap BH.renderHtml+        . KO.toBlazeDocument (PandocWriterConfig mFP (tv' <> tv) oF)+        $ a+    )  -- | Create HTML Text from pandoc fragments -- In use, you may need a type-application to specify m.@@ -187,17 +196,14 @@ -- | Constraint alias for the effects we need to knit multiple documents. type KnitMany r = (KnitEffects r, P.Member KP.Pandocs r) +++ -- From here down is unexported.   -- | The exact stack we are interpreting when we knit-type KnitEffectStack m =-  '[ KUI.UnusedId-   , KPM.Pandoc-   , KLog.Logger KLog.LogEntry-   , KLog.PrefixLog-   , PE.Error PA.PandocError-   , P.Lift IO-   , P.Lift m-   ]+type KnitEffectStack m+  = '[KUI.UnusedId, KPM.Pandoc, KLog.Logger KLog.LogEntry, KLog.PrefixLog, PE.Error+    PA.PandocError, P.Lift IO, P.Lift m] -- | Add a Multi-doc writer to the front of the effect list type KnitEffectDocsStack m = (KP.Pandocs ': KnitEffectStack m) 
src/Knit/Report/Input/MarkDown/PandocMarkDown.hs view
@@ -46,6 +46,7 @@                             , PA.Ext_tex_math_dollars                             , PA.Ext_header_attributes                             , PA.Ext_implicit_header_references+                            , PA.Ext_implicit_figures                             ]   } 
src/Knit/Report/Output.hs view
@@ -1,20 +1,135 @@+{-# LANGUAGE OverloadedStrings #-} module Knit.Report.Output   (     -- * Pandoc Writer Configuration     PandocWriterConfig(..)+  , TemplateVariables+  , WriterOptionsF+  , mkPandocWriterConfig++    -- * Pandoc Template Types+  , TemplatePath(..)+  , CssPath(..)+  , addCss++    -- * file writing helpers+  , writeAllPandocResultsWithInfo+  , writePandocResultWithInfo+  , writeAndMakePathLT+  , writeAndMakePath   ) where +import qualified Paths_knit_haskell            as Paths import qualified Data.Map                      as M import qualified Text.Pandoc                   as PA+import qualified Data.Text                     as T+import qualified Data.Text.IO                  as T+import qualified Data.Text.Lazy                as TL+import qualified System.Directory              as SD +import qualified Knit.Effect.Docs              as KD+import qualified Knit.Effect.Pandoc            as KP++type TemplateVariables = M.Map String String+type WriterOptionsF = PA.WriterOptions -> PA.WriterOptions+ data PandocWriterConfig =   PandocWriterConfig   {     templateFP :: Maybe FilePath     -- ^ optional path to pandoc <https://pandoc.org/MANUAL.html#templates template>-  , templateVars :: M.Map String String+  , templateVars :: TemplateVariables   -- ^ variable substitutions for the <https://pandoc.org/MANUAL.html#templates template>-  , optionsF :: (PA.WriterOptions -> PA.WriterOptions)+  , optionsF :: WriterOptionsF   -- ^ change default <https://pandoc.org/MANUAL.html#general-writer-options options>   }++-- | Make a 'PandocWriterConfig' from a PandocTemplate specification+mkPandocWriterConfig+  :: TemplatePath+  -> TemplateVariables+  -> WriterOptionsF+  -> IO PandocWriterConfig+mkPandocWriterConfig tp tv wf = do+  templateFPM <- pandocTemplatePath tp+  return $ PandocWriterConfig templateFPM tv wf++-- | Type to specify path to template,+-- which may be in a directory installed with knit-haskell.+data TemplatePath = DefaultTemplate+                  | FromIncludedTemplateDir T.Text+                  | FullySpecifiedTemplatePath T.Text++-- | get correct path to give Pandoc, depending on how things are installed+pandocTemplatePath :: TemplatePath -> IO (Maybe String)+pandocTemplatePath DefaultTemplate                = return Nothing+pandocTemplatePath (FullySpecifiedTemplatePath x) = return $ Just (T.unpack x)+pandocTemplatePath (FromIncludedTemplateDir x) =+  fmap (Just . (++ "/knit-haskell-templates/" ++ (T.unpack x))) Paths.getDataDir++-- | Type to specify path to Css,+-- which may be in a directory installed with knit-haskell or not.+data CssPath = FromIncludedCssDir T.Text+             | FullySpecifiedCssPath T.Text++-- | Add a CssPath to an existing TemplateVariables+-- which may already have Css paths specified+addCss :: CssPath -> TemplateVariables -> IO TemplateVariables+addCss (FullySpecifiedCssPath x) pt = return $ appendCss x pt+addCss (FromIncludedCssDir    x) pt = do+  dir <- Paths.getDataDir+  let fp = (T.pack dir) <> "/knit-haskell-css/" <> x+  return $ appendCss fp pt+++-- | Append a filepath (given as Text) to the existing Css paths in TemplateVariables+appendCss :: T.Text -> TemplateVariables -> TemplateVariables+appendCss x tv =+  let curValM = M.lookup "css" tv+      newVal  = maybe (T.unpack x) (\y -> y ++ "," ++ T.unpack x) curValM+  in  M.insert "css" newVal tv++-- utilities for file output++-- | Write each lazy text from a list of 'KD.DocWithInfo'+-- to disk. File names come from the 'KP.PandocInfo'+-- Directory and file extension are function arguments.+writeAllPandocResultsWithInfo+  :: T.Text -> T.Text -> [KP.DocWithInfo KP.PandocInfo TL.Text] -> IO ()+writeAllPandocResultsWithInfo dir extension =+  fmap (const ()) . traverse (writePandocResultWithInfo dir extension) -- fmap (const ()) :: IO [()] -> IO ()++-- | Write the Lazy Text in a 'KD.DocWithInfo' to disk+-- Name comes from the 'KP.PandocInfo'+-- Directory and file extection are arguments to the function+-- Create the parent directory or directories, if necessary.+writePandocResultWithInfo+  :: T.Text -- ^ directory+  -> T.Text -- ^ extension+  -> KD.DocWithInfo KP.PandocInfo TL.Text+  -> IO ()+writePandocResultWithInfo dir extension (KD.DocWithInfo (KP.PandocInfo n _) x)+  = do+    let fPath = dir <> "/" <> n <> "." <> extension+    writeAndMakePathLT fPath x++-- | Write Lazy Text (Pandoc's Html result) to disk.+-- Create the parent directory or directories, if necessary.+writeAndMakePathLT :: T.Text -> TL.Text -> IO ()+writeAndMakePathLT fPath = writeAndMakePath fPath TL.toStrict++-- | Write (to disk) something which can be converted to text.+-- Create the parent directory or directories, if necessary.+writeAndMakePath :: T.Text -> (a -> T.Text) -> a -> IO ()+writeAndMakePath fPath toStrictText x = do+  let (dirPath, fName) = T.breakOnEnd "/" fPath+  putStrLn+    $  T.unpack+    $  "If necessary, creating "+    <> dirPath+    <> " (and parents), and writing "+    <> fName+  SD.createDirectoryIfMissing True (T.unpack dirPath)+  T.writeFile (T.unpack fPath) $ toStrictText x+
src/Knit/Report/Output/Html.hs view
@@ -24,17 +24,22 @@   , toBlazeDocument   , pandocWriterToBlazeDocument -  -- * Options helper  +    -- * Options helper     , mindocOptionsF -  -- * Other helpers+    -- * Other helpers   , markDownTextToBlazeFragment++    -- * File writing helpers+  , writeAllPandocResultsWithInfoAsHtml+  , writePandocResultWithInfoAsHtml   ) where   import qualified Data.ByteString.Char8         as BS import qualified Data.Text                     as T+import qualified Data.Text.Lazy                as TL import qualified Data.Map                      as M import qualified Text.Blaze.Html               as BH import qualified Text.Pandoc                   as PA@@ -45,7 +50,7 @@  import           Knit.Report.Input.MarkDown.PandocMarkDown                                                 ( markDownReaderOptions )-import           Knit.Report.Output             ( PandocWriterConfig(..) )+import           Knit.Report.Output            as KO  -- | Base Html writer options, with support for MathJax htmlWriterOptions :: PA.WriterOptions@@ -89,7 +94,7 @@ -- Incudes support for template and template variables and changes to the default writer options toBlazeDocument   :: PM.PandocEffects effs-  => PandocWriterConfig+  => KO.PandocWriterConfig   -> PE.PandocWithRequirements -- ^ Document and union of input requirements    -> P.Sem effs BH.Html toBlazeDocument writeConfig pdocWR = PM.absorbPandocMonad $ do@@ -101,7 +106,7 @@ -- Incudes support for template and template variables and changes to the default writer options.  pandocWriterToBlazeDocument   :: PM.PandocEffects effs-  => PandocWriterConfig -- ^ Configuration info for the Pandoc writer  +  => KO.PandocWriterConfig -- ^ Configuration info for the Pandoc writer     -> P.Sem (PE.ToPandoc ': effs) () -- ^ Effects stack to run to get Pandoc   -> P.Sem effs BH.Html -- ^ Blaze Html (in remaining effects) pandocWriterToBlazeDocument writeConfig pw =@@ -110,3 +115,24 @@ -- | options for the mindoc template mindocOptionsF :: PA.WriterOptions -> PA.WriterOptions mindocOptionsF op = op { PA.writerSectionDivs = True }+++-- file output+-- | Write each lazy text from a list of 'KD.DocWithInfo'+-- to disk. File names come from the 'KP.PandocInfo'+-- Directory is a function arguments.+-- File extension is "html"+writeAllPandocResultsWithInfoAsHtml+  :: T.Text -> [PE.DocWithInfo PE.PandocInfo TL.Text] -> IO ()+writeAllPandocResultsWithInfoAsHtml dir =+  KO.writeAllPandocResultsWithInfo dir "html"++-- | Write the Lazy Text in a 'KD.DocWithInfo' to disk,+-- Name comes from the 'KP.PandocInfo'+-- Directory is an argument to the function+-- File extension is "html"+-- Create the parent directory or directories, if necessary.+writePandocResultWithInfoAsHtml+  :: T.Text -> PE.DocWithInfo PE.PandocInfo TL.Text -> IO ()+writePandocResultWithInfoAsHtml dir dwi =+  KO.writePandocResultWithInfo dir "html" dwi