<!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">
<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" />
  <title>P1194: The Compromise Executors Proposal: A lazy simplification of P0443</title>
  <style type="text/css">code{white-space: pre;}</style>
  <style type="text/css">
a.sourceLine { display: inline-block; line-height: 1.25; }
a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
a.sourceLine:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode { white-space: pre; position: relative; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
code.sourceCode { white-space: pre-wrap; }
a.sourceLine { text-indent: -1em; padding-left: 1em; }
}
pre.numberSource a.sourceLine
  { position: relative; left: -4em; }
pre.numberSource a.sourceLine::before
  { content: attr(data-line-number);
    position: relative; left: -1em; text-align: right; vertical-align: baseline;
    border: none; pointer-events: all; display: inline-block;
    -webkit-touch-callout: none; -webkit-user-select: none;
    -khtml-user-select: none; -moz-user-select: none;
    -ms-user-select: none; user-select: none;
    padding: 0 4px; width: 4em;
    color: #aaaaaa;
  }
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
div.sourceCode
  {  }
@media screen {
a.sourceLine::before { text-decoration: underline; }
}
code span.al { color: #ff0000; font-weight: bold; } /* Alert */
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
code span.at { color: #7d9029; } /* Attribute */
code span.bn { color: #40a070; } /* BaseN */
code span.bu { } /* BuiltIn */
code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
code span.ch { color: #4070a0; } /* Char */
code span.cn { color: #880000; } /* Constant */
code span.co { color: #60a0b0; font-style: italic; } /* Comment */
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
code span.do { color: #ba2121; font-style: italic; } /* Documentation */
code span.dt { color: #902000; } /* DataType */
code span.dv { color: #40a070; } /* DecVal */
code span.er { color: #ff0000; font-weight: bold; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #40a070; } /* Float */
code span.fu { color: #06287e; } /* Function */
code span.im { } /* Import */
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
code span.kw { color: #007020; font-weight: bold; } /* Keyword */
code span.op { color: #666666; } /* Operator */
code span.ot { color: #007020; } /* Other */
code span.pp { color: #bc7a00; } /* Preprocessor */
code span.sc { color: #4070a0; } /* SpecialChar */
code span.ss { color: #bb6688; } /* SpecialString */
code span.st { color: #4070a0; } /* String */
code span.va { color: #19177c; } /* Variable */
code span.vs { color: #4070a0; } /* VerbatimString */
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
  </style>
<style type="text/css">code{white-space: pre;}</style>
  <style type="text/css">.sidebar ul{padding-left: 10px;}</style>
  <style data-fill-with="stylesheet">
  
  
  /*!
   * Bootstrap v3.3.7 (http://getbootstrap.com)
   * Copyright 2011-2016 Twitter, Inc.
   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
   */
  
  /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
  
  html {
      font-family: sans-serif;
      -webkit-text-size-adjust: 100%;
      -ms-text-size-adjust: 100%
  }
  
  body {
      margin: 0
  }
  
  article,
  aside,
  details,
  figcaption,
  figure,
  footer,
  header,
  hgroup,
  main,
  menu,
  nav,
  section,
  summary {
      display: block
  }
  
  audio,
  canvas,
  progress,
  video {
      display: inline-block;
      vertical-align: baseline
  }
  
  audio:not([controls]) {
      display: none;
      height: 0
  }
  
  [hidden],
  template {
      display: none
  }
  
  a {
      background-color: transparent
  }
  
  a:active,
  a:hover {
      outline: 0
  }
  
  abbr[title] {
      border-bottom: 1px dotted
  }
  
  b,
  strong {
      font-weight: 700
  }
  
  dfn {
      font-style: italic
  }
  
  h1 {
      margin: .67em 0;
      font-size: 2em
  }
  
  mark {
      color: #000;
      background: #ff0
  }
  
  small {
      font-size: 80%
  }
  
  sub,
  sup {
      position: relative;
      font-size: 75%;
      line-height: 0;
      vertical-align: baseline
  }
  
  sup {
      top: -.5em
  }
  
  sub {
      bottom: -.25em
  }
  
  img {
      border: 0
  }
  
  svg:not(:root) {
      overflow: hidden
  }
  
  figure {
      margin: 1em 40px
  }
  
  hr {
      height: 0;
      -webkit-box-sizing: content-box;
      -moz-box-sizing: content-box;
      box-sizing: content-box
  }
  
  pre {
      overflow: auto
  }
  
  code,
  kbd,
  pre,
  samp {
      font-family: monospace, monospace;
      font-size: 1em
  }
  
  button,
  input,
  optgroup,
  select,
  textarea {
      margin: 0;
      font: inherit;
      color: inherit
  }
  
  button {
      overflow: visible
  }
  
  button,
  select {
      text-transform: none
  }
  
  button,
  html input[type=button],
  input[type=reset],
  input[type=submit] {
      -webkit-appearance: button;
      cursor: pointer
  }
  
  button[disabled],
  html input[disabled] {
      cursor: default
  }
  
  button::-moz-focus-inner,
  input::-moz-focus-inner {
      padding: 0;
      border: 0
  }
  
  input {
      line-height: normal
  }
  
  input[type=checkbox],
  input[type=radio] {
      -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
      box-sizing: border-box;
      padding: 0
  }
  
  input[type=number]::-webkit-inner-spin-button,
  input[type=number]::-webkit-outer-spin-button {
      height: auto
  }
  
  input[type=search] {
      -webkit-box-sizing: content-box;
      -moz-box-sizing: content-box;
      box-sizing: content-box;
      -webkit-appearance: textfield
  }
  
  input[type=search]::-webkit-search-cancel-button,
  input[type=search]::-webkit-search-decoration {
      -webkit-appearance: none
  }
  
  fieldset {
      padding: .35em .625em .75em;
      margin: 0 2px;
      border: 1px solid silver
  }
  
  legend {
      padding: 0;
      border: 0
  }
  
  textarea {
      overflow: auto
  }
  
  optgroup {
      font-weight: 700
  }
  
  table {
      border-spacing: 0;
      border-collapse: collapse
  }
  
  td,
  th {
      padding: 0
  }
  
  /*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
  
  @media print {
      *,
      :after,
      :before {
          color: #000 !important;
          text-shadow: none !important;
          background: 0 0 !important;
          -webkit-box-shadow: none !important;
          box-shadow: none !important
      }
      a,
      a:visited {
          text-decoration: underline
      }
      a[href]:after {
          content: " (" attr(href) ")"
      }
      abbr[title]:after {
          content: " (" attr(title) ")"
      }
      a[href^="javascript:"]:after,
      a[href^="#"]:after {
          content: ""
      }
      blockquote,
      pre {
          border: 1px solid #999;
          page-break-inside: avoid
      }
      thead {
          display: table-header-group
      }
      img,
      tr {
          page-break-inside: avoid
      }
      img {
          max-width: 100% !important
      }
      h2,
      h3,
      p {
          orphans: 3;
          widows: 3
      }
      h2,
      h3 {
          page-break-after: avoid
      }
      .navbar {
          display: none
      }
      .btn>.caret,
      .dropup>.btn>.caret {
          border-top-color: #000 !important
      }
      .label {
          border: 1px solid #000
      }
      .table {
          border-collapse: collapse !important
      }
      .table td,
      .table th {
          background-color: #fff !important
      }
      .table-bordered td,
      .table-bordered th {
          border: 1px solid #ddd !important
      }
  }
  
  @font-face {
      font-family: 'Glyphicons Halflings';
      src: url(../fonts/glyphicons-halflings-regular.eot);
      src: url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'), url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'), url(../fonts/glyphicons-halflings-regular.woff) format('woff'), url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'), url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')
  }
  
  .glyphicon {
      position: relative;
      top: 1px;
      display: inline-block;
      font-family: 'Glyphicons Halflings';
      font-style: normal;
      font-weight: 400;
      line-height: 1;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale
  }
  
  .glyphicon-asterisk:before {
      content: "\002a"
  }
  
  .glyphicon-plus:before {
      content: "\002b"
  }
  
  .glyphicon-eur:before,
  .glyphicon-euro:before {
      content: "\20ac"
  }
  
  .glyphicon-minus:before {
      content: "\2212"
  }
  
  .glyphicon-cloud:before {
      content: "\2601"
  }
  
  .glyphicon-envelope:before {
      content: "\2709"
  }
  
  .glyphicon-pencil:before {
      content: "\270f"
  }
  
  .glyphicon-glass:before {
      content: "\e001"
  }
  
  .glyphicon-music:before {
      content: "\e002"
  }
  
  .glyphicon-search:before {
      content: "\e003"
  }
  
  .glyphicon-heart:before {
      content: "\e005"
  }
  
  .glyphicon-star:before {
      content: "\e006"
  }
  
  .glyphicon-star-empty:before {
      content: "\e007"
  }
  
  .glyphicon-user:before {
      content: "\e008"
  }
  
  .glyphicon-film:before {
      content: "\e009"
  }
  
  .glyphicon-th-large:before {
      content: "\e010"
  }
  
  .glyphicon-th:before {
      content: "\e011"
  }
  
  .glyphicon-th-list:before {
      content: "\e012"
  }
  
  .glyphicon-ok:before {
      content: "\e013"
  }
  
  .glyphicon-remove:before {
      content: "\e014"
  }
  
  .glyphicon-zoom-in:before {
      content: "\e015"
  }
  
  .glyphicon-zoom-out:before {
      content: "\e016"
  }
  
  .glyphicon-off:before {
      content: "\e017"
  }
  
  .glyphicon-signal:before {
      content: "\e018"
  }
  
  .glyphicon-cog:before {
      content: "\e019"
  }
  
  .glyphicon-trash:before {
      content: "\e020"
  }
  
  .glyphicon-home:before {
      content: "\e021"
  }
  
  .glyphicon-file:before {
      content: "\e022"
  }
  
  .glyphicon-time:before {
      content: "\e023"
  }
  
  .glyphicon-road:before {
      content: "\e024"
  }
  
  .glyphicon-download-alt:before {
      content: "\e025"
  }
  
  .glyphicon-download:before {
      content: "\e026"
  }
  
  .glyphicon-upload:before {
      content: "\e027"
  }
  
  .glyphicon-inbox:before {
      content: "\e028"
  }
  
  .glyphicon-play-circle:before {
      content: "\e029"
  }
  
  .glyphicon-repeat:before {
      content: "\e030"
  }
  
  .glyphicon-refresh:before {
      content: "\e031"
  }
  
  .glyphicon-list-alt:before {
      content: "\e032"
  }
  
  .glyphicon-lock:before {
      content: "\e033"
  }
  
  .glyphicon-flag:before {
      content: "\e034"
  }
  
  .glyphicon-headphones:before {
      content: "\e035"
  }
  
  .glyphicon-volume-off:before {
      content: "\e036"
  }
  
  .glyphicon-volume-down:before {
      content: "\e037"
  }
  
  .glyphicon-volume-up:before {
      content: "\e038"
  }
  
  .glyphicon-qrcode:before {
      content: "\e039"
  }
  
  .glyphicon-barcode:before {
      content: "\e040"
  }
  
  .glyphicon-tag:before {
      content: "\e041"
  }
  
  .glyphicon-tags:before {
      content: "\e042"
  }
  
  .glyphicon-book:before {
      content: "\e043"
  }
  
  .glyphicon-bookmark:before {
      content: "\e044"
  }
  
  .glyphicon-print:before {
      content: "\e045"
  }
  
  .glyphicon-camera:before {
      content: "\e046"
  }
  
  .glyphicon-font:before {
      content: "\e047"
  }
  
  .glyphicon-bold:before {
      content: "\e048"
  }
  
  .glyphicon-italic:before {
      content: "\e049"
  }
  
  .glyphicon-text-height:before {
      content: "\e050"
  }
  
  .glyphicon-text-width:before {
      content: "\e051"
  }
  
  .glyphicon-align-left:before {
      content: "\e052"
  }
  
  .glyphicon-align-center:before {
      content: "\e053"
  }
  
  .glyphicon-align-right:before {
      content: "\e054"
  }
  
  .glyphicon-align-justify:before {
      content: "\e055"
  }
  
  .glyphicon-list:before {
      content: "\e056"
  }
  
  .glyphicon-indent-left:before {
      content: "\e057"
  }
  
  .glyphicon-indent-right:before {
      content: "\e058"
  }
  
  .glyphicon-facetime-video:before {
      content: "\e059"
  }
  
  .glyphicon-picture:before {
      content: "\e060"
  }
  
  .glyphicon-map-marker:before {
      content: "\e062"
  }
  
  .glyphicon-adjust:before {
      content: "\e063"
  }
  
  .glyphicon-tint:before {
      content: "\e064"
  }
  
  .glyphicon-edit:before {
      content: "\e065"
  }
  
  .glyphicon-share:before {
      content: "\e066"
  }
  
  .glyphicon-check:before {
      content: "\e067"
  }
  
  .glyphicon-move:before {
      content: "\e068"
  }
  
  .glyphicon-step-backward:before {
      content: "\e069"
  }
  
  .glyphicon-fast-backward:before {
      content: "\e070"
  }
  
  .glyphicon-backward:before {
      content: "\e071"
  }
  
  .glyphicon-play:before {
      content: "\e072"
  }
  
  .glyphicon-pause:before {
      content: "\e073"
  }
  
  .glyphicon-stop:before {
      content: "\e074"
  }
  
  .glyphicon-forward:before {
      content: "\e075"
  }
  
  .glyphicon-fast-forward:before {
      content: "\e076"
  }
  
  .glyphicon-step-forward:before {
      content: "\e077"
  }
  
  .glyphicon-eject:before {
      content: "\e078"
  }
  
  .glyphicon-chevron-left:before {
      content: "\e079"
  }
  
  .glyphicon-chevron-right:before {
      content: "\e080"
  }
  
  .glyphicon-plus-sign:before {
      content: "\e081"
  }
  
  .glyphicon-minus-sign:before {
      content: "\e082"
  }
  
  .glyphicon-remove-sign:before {
      content: "\e083"
  }
  
  .glyphicon-ok-sign:before {
      content: "\e084"
  }
  
  .glyphicon-question-sign:before {
      content: "\e085"
  }
  
  .glyphicon-info-sign:before {
      content: "\e086"
  }
  
  .glyphicon-screenshot:before {
      content: "\e087"
  }
  
  .glyphicon-remove-circle:before {
      content: "\e088"
  }
  
  .glyphicon-ok-circle:before {
      content: "\e089"
  }
  
  .glyphicon-ban-circle:before {
      content: "\e090"
  }
  
  .glyphicon-arrow-left:before {
      content: "\e091"
  }
  
  .glyphicon-arrow-right:before {
      content: "\e092"
  }
  
  .glyphicon-arrow-up:before {
      content: "\e093"
  }
  
  .glyphicon-arrow-down:before {
      content: "\e094"
  }
  
  .glyphicon-share-alt:before {
      content: "\e095"
  }
  
  .glyphicon-resize-full:before {
      content: "\e096"
  }
  
  .glyphicon-resize-small:before {
      content: "\e097"
  }
  
  .glyphicon-exclamation-sign:before {
      content: "\e101"
  }
  
  .glyphicon-gift:before {
      content: "\e102"
  }
  
  .glyphicon-leaf:before {
      content: "\e103"
  }
  
  .glyphicon-fire:before {
      content: "\e104"
  }
  
  .glyphicon-eye-open:before {
      content: "\e105"
  }
  
  .glyphicon-eye-close:before {
      content: "\e106"
  }
  
  .glyphicon-warning-sign:before {
      content: "\e107"
  }
  
  .glyphicon-plane:before {
      content: "\e108"
  }
  
  .glyphicon-calendar:before {
      content: "\e109"
  }
  
  .glyphicon-random:before {
      content: "\e110"
  }
  
  .glyphicon-comment:before {
      content: "\e111"
  }
  
  .glyphicon-magnet:before {
      content: "\e112"
  }
  
  .glyphicon-chevron-up:before {
      content: "\e113"
  }
  
  .glyphicon-chevron-down:before {
      content: "\e114"
  }
  
  .glyphicon-retweet:before {
      content: "\e115"
  }
  
  .glyphicon-shopping-cart:before {
      content: "\e116"
  }
  
  .glyphicon-folder-close:before {
      content: "\e117"
  }
  
  .glyphicon-folder-open:before {
      content: "\e118"
  }
  
  .glyphicon-resize-vertical:before {
      content: "\e119"
  }
  
  .glyphicon-resize-horizontal:before {
      content: "\e120"
  }
  
  .glyphicon-hdd:before {
      content: "\e121"
  }
  
  .glyphicon-bullhorn:before {
      content: "\e122"
  }
  
  .glyphicon-bell:before {
      content: "\e123"
  }
  
  .glyphicon-certificate:before {
      content: "\e124"
  }
  
  .glyphicon-thumbs-up:before {
      content: "\e125"
  }
  
  .glyphicon-thumbs-down:before {
      content: "\e126"
  }
  
  .glyphicon-hand-right:before {
      content: "\e127"
  }
  
  .glyphicon-hand-left:before {
      content: "\e128"
  }
  
  .glyphicon-hand-up:before {
      content: "\e129"
  }
  
  .glyphicon-hand-down:before {
      content: "\e130"
  }
  
  .glyphicon-circle-arrow-right:before {
      content: "\e131"
  }
  
  .glyphicon-circle-arrow-left:before {
      content: "\e132"
  }
  
  .glyphicon-circle-arrow-up:before {
      content: "\e133"
  }
  
  .glyphicon-circle-arrow-down:before {
      content: "\e134"
  }
  
  .glyphicon-globe:before {
      content: "\e135"
  }
  
  .glyphicon-wrench:before {
      content: "\e136"
  }
  
  .glyphicon-tasks:before {
      content: "\e137"
  }
  
  .glyphicon-filter:before {
      content: "\e138"
  }
  
  .glyphicon-briefcase:before {
      content: "\e139"
  }
  
  .glyphicon-fullscreen:before {
      content: "\e140"
  }
  
  .glyphicon-dashboard:before {
      content: "\e141"
  }
  
  .glyphicon-paperclip:before {
      content: "\e142"
  }
  
  .glyphicon-heart-empty:before {
      content: "\e143"
  }
  
  .glyphicon-link:before {
      content: "\e144"
  }
  
  .glyphicon-phone:before {
      content: "\e145"
  }
  
  .glyphicon-pushpin:before {
      content: "\e146"
  }
  
  .glyphicon-usd:before {
      content: "\e148"
  }
  
  .glyphicon-gbp:before {
      content: "\e149"
  }
  
  .glyphicon-sort:before {
      content: "\e150"
  }
  
  .glyphicon-sort-by-alphabet:before {
      content: "\e151"
  }
  
  .glyphicon-sort-by-alphabet-alt:before {
      content: "\e152"
  }
  
  .glyphicon-sort-by-order:before {
      content: "\e153"
  }
  
  .glyphicon-sort-by-order-alt:before {
      content: "\e154"
  }
  
  .glyphicon-sort-by-attributes:before {
      content: "\e155"
  }
  
  .glyphicon-sort-by-attributes-alt:before {
      content: "\e156"
  }
  
  .glyphicon-unchecked:before {
      content: "\e157"
  }
  
  .glyphicon-expand:before {
      content: "\e158"
  }
  
  .glyphicon-collapse-down:before {
      content: "\e159"
  }
  
  .glyphicon-collapse-up:before {
      content: "\e160"
  }
  
  .glyphicon-log-in:before {
      content: "\e161"
  }
  
  .glyphicon-flash:before {
      content: "\e162"
  }
  
  .glyphicon-log-out:before {
      content: "\e163"
  }
  
  .glyphicon-new-window:before {
      content: "\e164"
  }
  
  .glyphicon-record:before {
      content: "\e165"
  }
  
  .glyphicon-save:before {
      content: "\e166"
  }
  
  .glyphicon-open:before {
      content: "\e167"
  }
  
  .glyphicon-saved:before {
      content: "\e168"
  }
  
  .glyphicon-import:before {
      content: "\e169"
  }
  
  .glyphicon-export:before {
      content: "\e170"
  }
  
  .glyphicon-send:before {
      content: "\e171"
  }
  
  .glyphicon-floppy-disk:before {
      content: "\e172"
  }
  
  .glyphicon-floppy-saved:before {
      content: "\e173"
  }
  
  .glyphicon-floppy-remove:before {
      content: "\e174"
  }
  
  .glyphicon-floppy-save:before {
      content: "\e175"
  }
  
  .glyphicon-floppy-open:before {
      content: "\e176"
  }
  
  .glyphicon-credit-card:before {
      content: "\e177"
  }
  
  .glyphicon-transfer:before {
      content: "\e178"
  }
  
  .glyphicon-cutlery:before {
      content: "\e179"
  }
  
  .glyphicon-header:before {
      content: "\e180"
  }
  
  .glyphicon-compressed:before {
      content: "\e181"
  }
  
  .glyphicon-earphone:before {
      content: "\e182"
  }
  
  .glyphicon-phone-alt:before {
      content: "\e183"
  }
  
  .glyphicon-tower:before {
      content: "\e184"
  }
  
  .glyphicon-stats:before {
      content: "\e185"
  }
  
  .glyphicon-sd-video:before {
      content: "\e186"
  }
  
  .glyphicon-hd-video:before {
      content: "\e187"
  }
  
  .glyphicon-subtitles:before {
      content: "\e188"
  }
  
  .glyphicon-sound-stereo:before {
      content: "\e189"
  }
  
  .glyphicon-sound-dolby:before {
      content: "\e190"
  }
  
  .glyphicon-sound-5-1:before {
      content: "\e191"
  }
  
  .glyphicon-sound-6-1:before {
      content: "\e192"
  }
  
  .glyphicon-sound-7-1:before {
      content: "\e193"
  }
  
  .glyphicon-copyright-mark:before {
      content: "\e194"
  }
  
  .glyphicon-registration-mark:before {
      content: "\e195"
  }
  
  .glyphicon-cloud-download:before {
      content: "\e197"
  }
  
  .glyphicon-cloud-upload:before {
      content: "\e198"
  }
  
  .glyphicon-tree-conifer:before {
      content: "\e199"
  }
  
  .glyphicon-tree-deciduous:before {
      content: "\e200"
  }
  
  .glyphicon-cd:before {
      content: "\e201"
  }
  
  .glyphicon-save-file:before {
      content: "\e202"
  }
  
  .glyphicon-open-file:before {
      content: "\e203"
  }
  
  .glyphicon-level-up:before {
      content: "\e204"
  }
  
  .glyphicon-copy:before {
      content: "\e205"
  }
  
  .glyphicon-paste:before {
      content: "\e206"
  }
  
  .glyphicon-alert:before {
      content: "\e209"
  }
  
  .glyphicon-equalizer:before {
      content: "\e210"
  }
  
  .glyphicon-king:before {
      content: "\e211"
  }
  
  .glyphicon-queen:before {
      content: "\e212"
  }
  
  .glyphicon-pawn:before {
      content: "\e213"
  }
  
  .glyphicon-bishop:before {
      content: "\e214"
  }
  
  .glyphicon-knight:before {
      content: "\e215"
  }
  
  .glyphicon-baby-formula:before {
      content: "\e216"
  }
  
  .glyphicon-tent:before {
      content: "\26fa"
  }
  
  .glyphicon-blackboard:before {
      content: "\e218"
  }
  
  .glyphicon-bed:before {
      content: "\e219"
  }
  
  .glyphicon-apple:before {
      content: "\f8ff"
  }
  
  .glyphicon-erase:before {
      content: "\e221"
  }
  
  .glyphicon-hourglass:before {
      content: "\231b"
  }
  
  .glyphicon-lamp:before {
      content: "\e223"
  }
  
  .glyphicon-duplicate:before {
      content: "\e224"
  }
  
  .glyphicon-piggy-bank:before {
      content: "\e225"
  }
  
  .glyphicon-scissors:before {
      content: "\e226"
  }
  
  .glyphicon-bitcoin:before {
      content: "\e227"
  }
  
  .glyphicon-btc:before {
      content: "\e227"
  }
  
  .glyphicon-xbt:before {
      content: "\e227"
  }
  
  .glyphicon-yen:before {
      content: "\00a5"
  }
  
  .glyphicon-jpy:before {
      content: "\00a5"
  }
  
  .glyphicon-ruble:before {
      content: "\20bd"
  }
  
  .glyphicon-rub:before {
      content: "\20bd"
  }
  
  .glyphicon-scale:before {
      content: "\e230"
  }
  
  .glyphicon-ice-lolly:before {
      content: "\e231"
  }
  
  .glyphicon-ice-lolly-tasted:before {
      content: "\e232"
  }
  
  .glyphicon-education:before {
      content: "\e233"
  }
  
  .glyphicon-option-horizontal:before {
      content: "\e234"
  }
  
  .glyphicon-option-vertical:before {
      content: "\e235"
  }
  
  .glyphicon-menu-hamburger:before {
      content: "\e236"
  }
  
  .glyphicon-modal-window:before {
      content: "\e237"
  }
  
  .glyphicon-oil:before {
      content: "\e238"
  }
  
  .glyphicon-grain:before {
      content: "\e239"
  }
  
  .glyphicon-sunglasses:before {
      content: "\e240"
  }
  
  .glyphicon-text-size:before {
      content: "\e241"
  }
  
  .glyphicon-text-color:before {
      content: "\e242"
  }
  
  .glyphicon-text-background:before {
      content: "\e243"
  }
  
  .glyphicon-object-align-top:before {
      content: "\e244"
  }
  
  .glyphicon-object-align-bottom:before {
      content: "\e245"
  }
  
  .glyphicon-object-align-horizontal:before {
      content: "\e246"
  }
  
  .glyphicon-object-align-left:before {
      content: "\e247"
  }
  
  .glyphicon-object-align-vertical:before {
      content: "\e248"
  }
  
  .glyphicon-object-align-right:before {
      content: "\e249"
  }
  
  .glyphicon-triangle-right:before {
      content: "\e250"
  }
  
  .glyphicon-triangle-left:before {
      content: "\e251"
  }
  
  .glyphicon-triangle-bottom:before {
      content: "\e252"
  }
  
  .glyphicon-triangle-top:before {
      content: "\e253"
  }
  
  .glyphicon-console:before {
      content: "\e254"
  }
  
  .glyphicon-superscript:before {
      content: "\e255"
  }
  
  .glyphicon-subscript:before {
      content: "\e256"
  }
  
  .glyphicon-menu-left:before {
      content: "\e257"
  }
  
  .glyphicon-menu-right:before {
      content: "\e258"
  }
  
  .glyphicon-menu-down:before {
      content: "\e259"
  }
  
  .glyphicon-menu-up:before {
      content: "\e260"
  }
  
  * {
      -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
      box-sizing: border-box
  }
  
  :after,
  :before {
      -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
      box-sizing: border-box
  }
  
  html {
      font-size: 10px;
      -webkit-tap-highlight-color: rgba(0, 0, 0, 0)
  }
  
  body {
      font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
      font-size: 14px;
      line-height: 1.42857143;
      color: #333;
      background-color: #fff
  }
  
  button,
  input,
  select,
  textarea {
      font-family: inherit;
      font-size: inherit;
      line-height: inherit
  }
  
  a {
      color: #337ab7;
      text-decoration: none
  }
  
  a:focus,
  a:hover {
      color: #23527c;
      text-decoration: underline
  }
  
  a:focus {
      outline: 5px auto -webkit-focus-ring-color;
      outline-offset: -2px
  }
  
  figure {
      margin: 0
  }
  
  img {
      vertical-align: middle
  }
  
  .carousel-inner>.item>a>img,
  .carousel-inner>.item>img,
  .img-responsive,
  .thumbnail a>img,
  .thumbnail>img {
      display: block;
      max-width: 100%;
      height: auto
  }
  
  .img-rounded {
      border-radius: 6px
  }
  
  .img-thumbnail {
      display: inline-block;
      max-width: 100%;
      height: auto;
      padding: 4px;
      line-height: 1.42857143;
      background-color: #fff;
      border: 1px solid #ddd;
      border-radius: 4px;
      -webkit-transition: all .2s ease-in-out;
      -o-transition: all .2s ease-in-out;
      transition: all .2s ease-in-out
  }
  
  .img-circle {
      border-radius: 50%
  }
  
  hr {
      margin-top: 20px;
      margin-bottom: 20px;
      border: 0;
      border-top: 1px solid #eee
  }
  
  .sr-only {
      position: absolute;
      width: 1px;
      height: 1px;
      padding: 0;
      margin: -1px;
      overflow: hidden;
      clip: rect(0, 0, 0, 0);
      border: 0
  }
  
  .sr-only-focusable:active,
  .sr-only-focusable:focus {
      position: static;
      width: auto;
      height: auto;
      margin: 0;
      overflow: visible;
      clip: auto
  }
  
  [role=button] {
      cursor: pointer
  }
  
  .h1,
  .h2,
  .h3,
  .h4,
  .h5,
  .h6,
  h1,
  h2,
  h3,
  h4,
  h5,
  h6 {
      font-family: inherit;
      font-weight: 500;
      line-height: 1.1;
      color: inherit
  }
  
  .h1 .small,
  .h1 small,
  .h2 .small,
  .h2 small,
  .h3 .small,
  .h3 small,
  .h4 .small,
  .h4 small,
  .h5 .small,
  .h5 small,
  .h6 .small,
  .h6 small,
  h1 .small,
  h1 small,
  h2 .small,
  h2 small,
  h3 .small,
  h3 small,
  h4 .small,
  h4 small,
  h5 .small,
  h5 small,
  h6 .small,
  h6 small {
      font-weight: 400;
      line-height: 1;
      color: #777
  }
  
  .h1,
  .h2,
  .h3,
  h1,
  h2,
  h3 {
      margin-top: 20px;
      margin-bottom: 10px
  }
  
  .h1 .small,
  .h1 small,
  .h2 .small,
  .h2 small,
  .h3 .small,
  .h3 small,
  h1 .small,
  h1 small,
  h2 .small,
  h2 small,
  h3 .small,
  h3 small {
      font-size: 65%
  }
  
  .h4,
  .h5,
  .h6,
  h4,
  h5,
  h6 {
      margin-top: 10px;
      margin-bottom: 10px
  }
  
  .h4 .small,
  .h4 small,
  .h5 .small,
  .h5 small,
  .h6 .small,
  .h6 small,
  h4 .small,
  h4 small,
  h5 .small,
  h5 small,
  h6 .small,
  h6 small {
      font-size: 75%
  }
  
  .h1,
  h1 {
      font-size: 36px
  }
  
  .h2,
  h2 {
      font-size: 30px
  }
  
  .h3,
  h3 {
      font-size: 24px
  }
  
  .h4,
  h4 {
      font-size: 18px
  }
  
  .h5,
  h5 {
      font-size: 14px
  }
  
  .h6,
  h6 {
      font-size: 12px
  }
  
  p {
      margin: 0 0 10px
  }
  
  .lead {
      margin-bottom: 20px;
      font-size: 16px;
      font-weight: 300;
      line-height: 1.4
  }
  
  @media (min-width:768px) {
      .lead {
          font-size: 21px
      }
  }
  
  .small,
  small {
      font-size: 85%
  }
  
  .mark,
  mark {
      padding: .2em;
      background-color: #fcf8e3
  }
  
  .text-left {
      text-align: left
  }
  
  .text-right {
      text-align: right
  }
  
  .text-center {
      text-align: center
  }
  
  .text-justify {
      text-align: justify
  }
  
  .text-nowrap {
      white-space: nowrap
  }
  
  .text-lowercase {
      text-transform: lowercase
  }
  
  .text-uppercase {
      text-transform: uppercase
  }
  
  .text-capitalize {
      text-transform: capitalize
  }
  
  .text-muted {
      color: #777
  }
  
  .text-primary {
      color: #337ab7
  }
  
  a.text-primary:focus,
  a.text-primary:hover {
      color: #286090
  }
  
  .text-success {
      color: #3c763d
  }
  
  a.text-success:focus,
  a.text-success:hover {
      color: #2b542c
  }
  
  .text-info {
      color: #31708f
  }
  
  a.text-info:focus,
  a.text-info:hover {
      color: #245269
  }
  
  .text-warning {
      color: #8a6d3b
  }
  
  a.text-warning:focus,
  a.text-warning:hover {
      color: #66512c
  }
  
  .text-danger {
      color: #a94442
  }
  
  a.text-danger:focus,
  a.text-danger:hover {
      color: #843534
  }
  
  .bg-primary {
      color: #fff;
      background-color: #337ab7
  }
  
  a.bg-primary:focus,
  a.bg-primary:hover {
      background-color: #286090
  }
  
  .bg-success {
      background-color: #dff0d8
  }
  
  a.bg-success:focus,
  a.bg-success:hover {
      background-color: #c1e2b3
  }
  
  .bg-info {
      background-color: #d9edf7
  }
  
  a.bg-info:focus,
  a.bg-info:hover {
      background-color: #afd9ee
  }
  
  .bg-warning {
      background-color: #fcf8e3
  }
  
  a.bg-warning:focus,
  a.bg-warning:hover {
      background-color: #f7ecb5
  }
  
  .bg-danger {
      background-color: #f2dede
  }
  
  a.bg-danger:focus,
  a.bg-danger:hover {
      background-color: #e4b9b9
  }
  
  .page-header {
      padding-bottom: 9px;
      margin: 40px 0 20px;
      border-bottom: 1px solid #eee
  }
  
  ol,
  ul {
      margin-top: 0;
      margin-bottom: 10px
  }
  
  ol ol,
  ol ul,
  ul ol,
  ul ul {
      margin-bottom: 0
  }
  
  .list-unstyled {
      padding-left: 0;
      list-style: none
  }
  
  .list-inline {
      padding-left: 0;
      margin-left: -5px;
      list-style: none
  }
  
  .list-inline>li {
      display: inline-block;
      padding-right: 5px;
      padding-left: 5px
  }
  
  dl {
      margin-top: 0;
      margin-bottom: 20px
  }
  
  dd,
  dt {
      line-height: 1.42857143
  }
  
  dt {
      font-weight: 700
  }
  
  dd {
      margin-left: 0
  }
  
  @media (min-width:768px) {
      .dl-horizontal dt {
          float: left;
          width: 160px;
          overflow: hidden;
          clear: left;
          text-align: right;
          text-overflow: ellipsis;
          white-space: nowrap
      }
      .dl-horizontal dd {
          margin-left: 180px
      }
  }
  
  abbr[data-original-title],
  abbr[title] {
      cursor: help;
      border-bottom: 1px dotted #777
  }
  
  .initialism {
      font-size: 90%;
      text-transform: uppercase
  }
  
  blockquote {
      padding: 10px 20px;
      margin: 0 0 20px;
      font-size: 17.5px;
      border-left: 5px solid #eee
  }
  
  blockquote ol:last-child,
  blockquote p:last-child,
  blockquote ul:last-child {
      margin-bottom: 0
  }
  
  blockquote .small,
  blockquote footer,
  blockquote small {
      display: block;
      font-size: 80%;
      line-height: 1.42857143;
      color: #777
  }
  
  blockquote .small:before,
  blockquote footer:before,
  blockquote small:before {
      content: '\2014 \00A0'
  }
  
  .blockquote-reverse,
  blockquote.pull-right {
      padding-right: 15px;
      padding-left: 0;
      text-align: right;
      border-right: 5px solid #eee;
      border-left: 0
  }
  
  .blockquote-reverse .small:before,
  .blockquote-reverse footer:before,
  .blockquote-reverse small:before,
  blockquote.pull-right .small:before,
  blockquote.pull-right footer:before,
  blockquote.pull-right small:before {
      content: ''
  }
  
  .blockquote-reverse .small:after,
  .blockquote-reverse footer:after,
  .blockquote-reverse small:after,
  blockquote.pull-right .small:after,
  blockquote.pull-right footer:after,
  blockquote.pull-right small:after {
      content: '\00A0 \2014'
  }
  
  address {
      margin-bottom: 20px;
      font-style: normal;
      line-height: 1.42857143
  }
  
  code,
  kbd,
  pre,
  samp {
      font-family: Menlo, Monaco, Consolas, "Courier New", monospace
  }
  
  code {
      font-size: 100%;
      background-color: hsl(24, 20%, 95%);
      border-radius: 4px
  }
  
  kbd {
      padding: 2px 4px;
      font-size: 90%;
      color: #fff;
      background-color: #333;
      border-radius: 3px;
      -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
      box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25)
  }
  
  kbd kbd {
      padding: 0;
      font-size: 100%;
      font-weight: 700;
      -webkit-box-shadow: none;
      box-shadow: none
  }
  
  pre {
      display: block;
      padding: 9.5px;
      margin: 0 0 10px;
      font-size: 13px;
      line-height: 1.42857143;
      color: #333;
      word-break: break-all;
      word-wrap: break-word;
      background-color: #f5f5f5;
      border: 1px solid #ccc;
      border-radius: 4px
  }
  
  pre code {
      padding: 0;
      font-size: inherit;
      color: inherit;
      white-space: pre-wrap;
      background-color: transparent;
      border-radius: 0
  }
  
  .pre-scrollable {
      max-height: 340px;
      overflow-y: scroll
  }
  
  .container {
      padding-right: 15px;
      padding-left: 15px;
      margin-right: auto;
      margin-left: auto
  }
  
  @media (min-width:768px) {
      .container {
          width: 750px
      }
  }
  
  @media (min-width:992px) {
      .container {
          width: 970px
      }
  }
  
  @media (min-width:1200px) {
      .container {
          width: 1170px
      }
  }
  
  .container-fluid {
      padding-right: 15px;
      padding-left: 15px;
      margin-right: auto;
      margin-left: auto
  }
  
  .row {
      margin-right: -15px;
      margin-left: -15px
  }
  
  .col-lg-1,
  .col-lg-10,
  .col-lg-11,
  .col-lg-12,
  .col-lg-2,
  .col-lg-3,
  .col-lg-4,
  .col-lg-5,
  .col-lg-6,
  .col-lg-7,
  .col-lg-8,
  .col-lg-9,
  .col-md-1,
  .col-md-10,
  .col-md-11,
  .col-md-12,
  .col-md-2,
  .col-md-3,
  .col-md-4,
  .col-md-5,
  .col-md-6,
  .col-md-7,
  .col-md-8,
  .col-md-9,
  .col-sm-1,
  .col-sm-10,
  .col-sm-11,
  .col-sm-12,
  .col-sm-2,
  .col-sm-3,
  .col-sm-4,
  .col-sm-5,
  .col-sm-6,
  .col-sm-7,
  .col-sm-8,
  .col-sm-9,
  .col-xs-1,
  .col-xs-10,
  .col-xs-11,
  .col-xs-12,
  .col-xs-2,
  .col-xs-3,
  .col-xs-4,
  .col-xs-5,
  .col-xs-6,
  .col-xs-7,
  .col-xs-8,
  .col-xs-9 {
      position: relative;
      min-height: 1px;
      padding-right: 15px;
      padding-left: 15px
  }
  
  .col-xs-1,
  .col-xs-10,
  .col-xs-11,
  .col-xs-12,
  .col-xs-2,
  .col-xs-3,
  .col-xs-4,
  .col-xs-5,
  .col-xs-6,
  .col-xs-7,
  .col-xs-8,
  .col-xs-9 {
      float: left
  }
  
  .col-xs-12 {
      width: 100%
  }
  
  .col-xs-11 {
      width: 91.66666667%
  }
  
  .col-xs-10 {
      width: 83.33333333%
  }
  
  .col-xs-9 {
      width: 75%
  }
  
  .col-xs-8 {
      width: 66.66666667%
  }
  
  .col-xs-7 {
      width: 58.33333333%
  }
  
  .col-xs-6 {
      width: 50%
  }
  
  .col-xs-5 {
      width: 41.66666667%
  }
  
  .col-xs-4 {
      width: 33.33333333%
  }
  
  .col-xs-3 {
      width: 25%
  }
  
  .col-xs-2 {
      width: 16.66666667%
  }
  
  .col-xs-1 {
      width: 8.33333333%
  }
  
  .col-xs-pull-12 {
      right: 100%
  }
  
  .col-xs-pull-11 {
      right: 91.66666667%
  }
  
  .col-xs-pull-10 {
      right: 83.33333333%
  }
  
  .col-xs-pull-9 {
      right: 75%
  }
  
  .col-xs-pull-8 {
      right: 66.66666667%
  }
  
  .col-xs-pull-7 {
      right: 58.33333333%
  }
  
  .col-xs-pull-6 {
      right: 50%
  }
  
  .col-xs-pull-5 {
      right: 41.66666667%
  }
  
  .col-xs-pull-4 {
      right: 33.33333333%
  }
  
  .col-xs-pull-3 {
      right: 25%
  }
  
  .col-xs-pull-2 {
      right: 16.66666667%
  }
  
  .col-xs-pull-1 {
      right: 8.33333333%
  }
  
  .col-xs-pull-0 {
      right: auto
  }
  
  .col-xs-push-12 {
      left: 100%
  }
  
  .col-xs-push-11 {
      left: 91.66666667%
  }
  
  .col-xs-push-10 {
      left: 83.33333333%
  }
  
  .col-xs-push-9 {
      left: 75%
  }
  
  .col-xs-push-8 {
      left: 66.66666667%
  }
  
  .col-xs-push-7 {
      left: 58.33333333%
  }
  
  .col-xs-push-6 {
      left: 50%
  }
  
  .col-xs-push-5 {
      left: 41.66666667%
  }
  
  .col-xs-push-4 {
      left: 33.33333333%
  }
  
  .col-xs-push-3 {
      left: 25%
  }
  
  .col-xs-push-2 {
      left: 16.66666667%
  }
  
  .col-xs-push-1 {
      left: 8.33333333%
  }
  
  .col-xs-push-0 {
      left: auto
  }
  
  .col-xs-offset-12 {
      margin-left: 100%
  }
  
  .col-xs-offset-11 {
      margin-left: 91.66666667%
  }
  
  .col-xs-offset-10 {
      margin-left: 83.33333333%
  }
  
  .col-xs-offset-9 {
      margin-left: 75%
  }
  
  .col-xs-offset-8 {
      margin-left: 66.66666667%
  }
  
  .col-xs-offset-7 {
      margin-left: 58.33333333%
  }
  
  .col-xs-offset-6 {
      margin-left: 50%
  }
  
  .col-xs-offset-5 {
      margin-left: 41.66666667%
  }
  
  .col-xs-offset-4 {
      margin-left: 33.33333333%
  }
  
  .col-xs-offset-3 {
      margin-left: 25%
  }
  
  .col-xs-offset-2 {
      margin-left: 16.66666667%
  }
  
  .col-xs-offset-1 {
      margin-left: 8.33333333%
  }
  
  .col-xs-offset-0 {
      margin-left: 0
  }
  
  @media (min-width:768px) {
      .col-sm-1,
      .col-sm-10,
      .col-sm-11,
      .col-sm-12,
      .col-sm-2,
      .col-sm-3,
      .col-sm-4,
      .col-sm-5,
      .col-sm-6,
      .col-sm-7,
      .col-sm-8,
      .col-sm-9 {
          float: left
      }
      .col-sm-12 {
          width: 100%
      }
      .col-sm-11 {
          width: 91.66666667%
      }
      .col-sm-10 {
          width: 83.33333333%
      }
      .col-sm-9 {
          width: 75%
      }
      .col-sm-8 {
          width: 66.66666667%
      }
      .col-sm-7 {
          width: 58.33333333%
      }
      .col-sm-6 {
          width: 50%
      }
      .col-sm-5 {
          width: 41.66666667%
      }
      .col-sm-4 {
          width: 33.33333333%
      }
      .col-sm-3 {
          width: 25%
      }
      .col-sm-2 {
          width: 16.66666667%
      }
      .col-sm-1 {
          width: 8.33333333%
      }
      .col-sm-pull-12 {
          right: 100%
      }
      .col-sm-pull-11 {
          right: 91.66666667%
      }
      .col-sm-pull-10 {
          right: 83.33333333%
      }
      .col-sm-pull-9 {
          right: 75%
      }
      .col-sm-pull-8 {
          right: 66.66666667%
      }
      .col-sm-pull-7 {
          right: 58.33333333%
      }
      .col-sm-pull-6 {
          right: 50%
      }
      .col-sm-pull-5 {
          right: 41.66666667%
      }
      .col-sm-pull-4 {
          right: 33.33333333%
      }
      .col-sm-pull-3 {
          right: 25%
      }
      .col-sm-pull-2 {
          right: 16.66666667%
      }
      .col-sm-pull-1 {
          right: 8.33333333%
      }
      .col-sm-pull-0 {
          right: auto
      }
      .col-sm-push-12 {
          left: 100%
      }
      .col-sm-push-11 {
          left: 91.66666667%
      }
      .col-sm-push-10 {
          left: 83.33333333%
      }
      .col-sm-push-9 {
          left: 75%
      }
      .col-sm-push-8 {
          left: 66.66666667%
      }
      .col-sm-push-7 {
          left: 58.33333333%
      }
      .col-sm-push-6 {
          left: 50%
      }
      .col-sm-push-5 {
          left: 41.66666667%
      }
      .col-sm-push-4 {
          left: 33.33333333%
      }
      .col-sm-push-3 {
          left: 25%
      }
      .col-sm-push-2 {
          left: 16.66666667%
      }
      .col-sm-push-1 {
          left: 8.33333333%
      }
      .col-sm-push-0 {
          left: auto
      }
      .col-sm-offset-12 {
          margin-left: 100%
      }
      .col-sm-offset-11 {
          margin-left: 91.66666667%
      }
      .col-sm-offset-10 {
          margin-left: 83.33333333%
      }
      .col-sm-offset-9 {
          margin-left: 75%
      }
      .col-sm-offset-8 {
          margin-left: 66.66666667%
      }
      .col-sm-offset-7 {
          margin-left: 58.33333333%
      }
      .col-sm-offset-6 {
          margin-left: 50%
      }
      .col-sm-offset-5 {
          margin-left: 41.66666667%
      }
      .col-sm-offset-4 {
          margin-left: 33.33333333%
      }
      .col-sm-offset-3 {
          margin-left: 25%
      }
      .col-sm-offset-2 {
          margin-left: 16.66666667%
      }
      .col-sm-offset-1 {
          margin-left: 8.33333333%
      }
      .col-sm-offset-0 {
          margin-left: 0
      }
  }
  
  @media (min-width:992px) {
      .col-md-1,
      .col-md-10,
      .col-md-11,
      .col-md-12,
      .col-md-2,
      .col-md-3,
      .col-md-4,
      .col-md-5,
      .col-md-6,
      .col-md-7,
      .col-md-8,
      .col-md-9 {
          float: left
      }
      .col-md-12 {
          width: 100%
      }
      .col-md-11 {
          width: 91.66666667%
      }
      .col-md-10 {
          width: 83.33333333%
      }
      .col-md-9 {
          width: 75%
      }
      .col-md-8 {
          width: 66.66666667%
      }
      .col-md-7 {
          width: 58.33333333%
      }
      .col-md-6 {
          width: 50%
      }
      .col-md-5 {
          width: 41.66666667%
      }
      .col-md-4 {
          width: 33.33333333%
      }
      .col-md-3 {
          width: 25%
      }
      .col-md-2 {
          width: 16.66666667%
      }
      .col-md-1 {
          width: 8.33333333%
      }
      .col-md-pull-12 {
          right: 100%
      }
      .col-md-pull-11 {
          right: 91.66666667%
      }
      .col-md-pull-10 {
          right: 83.33333333%
      }
      .col-md-pull-9 {
          right: 75%
      }
      .col-md-pull-8 {
          right: 66.66666667%
      }
      .col-md-pull-7 {
          right: 58.33333333%
      }
      .col-md-pull-6 {
          right: 50%
      }
      .col-md-pull-5 {
          right: 41.66666667%
      }
      .col-md-pull-4 {
          right: 33.33333333%
      }
      .col-md-pull-3 {
          right: 25%
      }
      .col-md-pull-2 {
          right: 16.66666667%
      }
      .col-md-pull-1 {
          right: 8.33333333%
      }
      .col-md-pull-0 {
          right: auto
      }
      .col-md-push-12 {
          left: 100%
      }
      .col-md-push-11 {
          left: 91.66666667%
      }
      .col-md-push-10 {
          left: 83.33333333%
      }
      .col-md-push-9 {
          left: 75%
      }
      .col-md-push-8 {
          left: 66.66666667%
      }
      .col-md-push-7 {
          left: 58.33333333%
      }
      .col-md-push-6 {
          left: 50%
      }
      .col-md-push-5 {
          left: 41.66666667%
      }
      .col-md-push-4 {
          left: 33.33333333%
      }
      .col-md-push-3 {
          left: 25%
      }
      .col-md-push-2 {
          left: 16.66666667%
      }
      .col-md-push-1 {
          left: 8.33333333%
      }
      .col-md-push-0 {
          left: auto
      }
      .col-md-offset-12 {
          margin-left: 100%
      }
      .col-md-offset-11 {
          margin-left: 91.66666667%
      }
      .col-md-offset-10 {
          margin-left: 83.33333333%
      }
      .col-md-offset-9 {
          margin-left: 75%
      }
      .col-md-offset-8 {
          margin-left: 66.66666667%
      }
      .col-md-offset-7 {
          margin-left: 58.33333333%
      }
      .col-md-offset-6 {
          margin-left: 50%
      }
      .col-md-offset-5 {
          margin-left: 41.66666667%
      }
      .col-md-offset-4 {
          margin-left: 33.33333333%
      }
      .col-md-offset-3 {
          margin-left: 25%
      }
      .col-md-offset-2 {
          margin-left: 16.66666667%
      }
      .col-md-offset-1 {
          margin-left: 8.33333333%
      }
      .col-md-offset-0 {
          margin-left: 0
      }
  }
  
  @media (min-width:1200px) {
      .col-lg-1,
      .col-lg-10,
      .col-lg-11,
      .col-lg-12,
      .col-lg-2,
      .col-lg-3,
      .col-lg-4,
      .col-lg-5,
      .col-lg-6,
      .col-lg-7,
      .col-lg-8,
      .col-lg-9 {
          float: left
      }
      .col-lg-12 {
          width: 100%
      }
      .col-lg-11 {
          width: 91.66666667%
      }
      .col-lg-10 {
          width: 83.33333333%
      }
      .col-lg-9 {
          width: 75%
      }
      .col-lg-8 {
          width: 66.66666667%
      }
      .col-lg-7 {
          width: 58.33333333%
      }
      .col-lg-6 {
          width: 50%
      }
      .col-lg-5 {
          width: 41.66666667%
      }
      .col-lg-4 {
          width: 33.33333333%
      }
      .col-lg-3 {
          width: 25%
      }
      .col-lg-2 {
          width: 16.66666667%
      }
      .col-lg-1 {
          width: 8.33333333%
      }
      .col-lg-pull-12 {
          right: 100%
      }
      .col-lg-pull-11 {
          right: 91.66666667%
      }
      .col-lg-pull-10 {
          right: 83.33333333%
      }
      .col-lg-pull-9 {
          right: 75%
      }
      .col-lg-pull-8 {
          right: 66.66666667%
      }
      .col-lg-pull-7 {
          right: 58.33333333%
      }
      .col-lg-pull-6 {
          right: 50%
      }
      .col-lg-pull-5 {
          right: 41.66666667%
      }
      .col-lg-pull-4 {
          right: 33.33333333%
      }
      .col-lg-pull-3 {
          right: 25%
      }
      .col-lg-pull-2 {
          right: 16.66666667%
      }
      .col-lg-pull-1 {
          right: 8.33333333%
      }
      .col-lg-pull-0 {
          right: auto
      }
      .col-lg-push-12 {
          left: 100%
      }
      .col-lg-push-11 {
          left: 91.66666667%
      }
      .col-lg-push-10 {
          left: 83.33333333%
      }
      .col-lg-push-9 {
          left: 75%
      }
      .col-lg-push-8 {
          left: 66.66666667%
      }
      .col-lg-push-7 {
          left: 58.33333333%
      }
      .col-lg-push-6 {
          left: 50%
      }
      .col-lg-push-5 {
          left: 41.66666667%
      }
      .col-lg-push-4 {
          left: 33.33333333%
      }
      .col-lg-push-3 {
          left: 25%
      }
      .col-lg-push-2 {
          left: 16.66666667%
      }
      .col-lg-push-1 {
          left: 8.33333333%
      }
      .col-lg-push-0 {
          left: auto
      }
      .col-lg-offset-12 {
          margin-left: 100%
      }
      .col-lg-offset-11 {
          margin-left: 91.66666667%
      }
      .col-lg-offset-10 {
          margin-left: 83.33333333%
      }
      .col-lg-offset-9 {
          margin-left: 75%
      }
      .col-lg-offset-8 {
          margin-left: 66.66666667%
      }
      .col-lg-offset-7 {
          margin-left: 58.33333333%
      }
      .col-lg-offset-6 {
          margin-left: 50%
      }
      .col-lg-offset-5 {
          margin-left: 41.66666667%
      }
      .col-lg-offset-4 {
          margin-left: 33.33333333%
      }
      .col-lg-offset-3 {
          margin-left: 25%
      }
      .col-lg-offset-2 {
          margin-left: 16.66666667%
      }
      .col-lg-offset-1 {
          margin-left: 8.33333333%
      }
      .col-lg-offset-0 {
          margin-left: 0
      }
  }
  
  table {
      background-color: transparent
  }
  
  caption {
      padding-top: 8px;
      padding-bottom: 8px;
      color: #777;
      text-align: left
  }
  
  th {
      text-align: left
  }
  
  .table {
      width: 100%;
      max-width: 100%;
      margin-bottom: 20px
  }
  
  .table>tbody>tr>td,
  .table>tbody>tr>th,
  .table>tfoot>tr>td,
  .table>tfoot>tr>th,
  .table>thead>tr>td,
  .table>thead>tr>th {
      padding: 8px;
      line-height: 1.42857143;
      vertical-align: top;
      border-top: 1px solid #ddd
  }
  
  .table>thead>tr>th {
      vertical-align: bottom;
      border-bottom: 2px solid #ddd
  }
  
  .table>caption+thead>tr:first-child>td,
  .table>caption+thead>tr:first-child>th,
  .table>colgroup+thead>tr:first-child>td,
  .table>colgroup+thead>tr:first-child>th,
  .table>thead:first-child>tr:first-child>td,
  .table>thead:first-child>tr:first-child>th {
      border-top: 0
  }
  
  .table>tbody+tbody {
      border-top: 2px solid #ddd
  }
  
  .table .table {
      background-color: #fff
  }
  
  .table-condensed>tbody>tr>td,
  .table-condensed>tbody>tr>th,
  .table-condensed>tfoot>tr>td,
  .table-condensed>tfoot>tr>th,
  .table-condensed>thead>tr>td,
  .table-condensed>thead>tr>th {
      padding: 5px
  }
  
  .table-bordered {
      border: 1px solid #ddd
  }
  
  .table-bordered>tbody>tr>td,
  .table-bordered>tbody>tr>th,
  .table-bordered>tfoot>tr>td,
  .table-bordered>tfoot>tr>th,
  .table-bordered>thead>tr>td,
  .table-bordered>thead>tr>th {
      border: 1px solid #ddd
  }
  
  .table-bordered>thead>tr>td,
  .table-bordered>thead>tr>th {
      border-bottom-width: 2px
  }
  
  .table-striped>tbody>tr:nth-of-type(odd) {
      background-color: #f9f9f9
  }
  
  .table-hover>tbody>tr:hover {
      background-color: #f5f5f5
  }
  
  table col[class*=col-] {
      position: static;
      display: table-column;
      float: none
  }
  
  table td[class*=col-],
  table th[class*=col-] {
      position: static;
      display: table-cell;
      float: none
  }
  
  .table>tbody>tr.active>td,
  .table>tbody>tr.active>th,
  .table>tbody>tr>td.active,
  .table>tbody>tr>th.active,
  .table>tfoot>tr.active>td,
  .table>tfoot>tr.active>th,
  .table>tfoot>tr>td.active,
  .table>tfoot>tr>th.active,
  .table>thead>tr.active>td,
  .table>thead>tr.active>th,
  .table>thead>tr>td.active,
  .table>thead>tr>th.active {
      background-color: #f5f5f5
  }
  
  .table-hover>tbody>tr.active:hover>td,
  .table-hover>tbody>tr.active:hover>th,
  .table-hover>tbody>tr:hover>.active,
  .table-hover>tbody>tr>td.active:hover,
  .table-hover>tbody>tr>th.active:hover {
      background-color: #e8e8e8
  }
  
  .table>tbody>tr.success>td,
  .table>tbody>tr.success>th,
  .table>tbody>tr>td.success,
  .table>tbody>tr>th.success,
  .table>tfoot>tr.success>td,
  .table>tfoot>tr.success>th,
  .table>tfoot>tr>td.success,
  .table>tfoot>tr>th.success,
  .table>thead>tr.success>td,
  .table>thead>tr.success>th,
  .table>thead>tr>td.success,
  .table>thead>tr>th.success {
      background-color: #dff0d8
  }
  
  .table-hover>tbody>tr.success:hover>td,
  .table-hover>tbody>tr.success:hover>th,
  .table-hover>tbody>tr:hover>.success,
  .table-hover>tbody>tr>td.success:hover,
  .table-hover>tbody>tr>th.success:hover {
      background-color: #d0e9c6
  }
  
  .table>tbody>tr.info>td,
  .table>tbody>tr.info>th,
  .table>tbody>tr>td.info,
  .table>tbody>tr>th.info,
  .table>tfoot>tr.info>td,
  .table>tfoot>tr.info>th,
  .table>tfoot>tr>td.info,
  .table>tfoot>tr>th.info,
  .table>thead>tr.info>td,
  .table>thead>tr.info>th,
  .table>thead>tr>td.info,
  .table>thead>tr>th.info {
      background-color: #d9edf7
  }
  
  .table-hover>tbody>tr.info:hover>td,
  .table-hover>tbody>tr.info:hover>th,
  .table-hover>tbody>tr:hover>.info,
  .table-hover>tbody>tr>td.info:hover,
  .table-hover>tbody>tr>th.info:hover {
      background-color: #c4e3f3
  }
  
  .table>tbody>tr.warning>td,
  .table>tbody>tr.warning>th,
  .table>tbody>tr>td.warning,
  .table>tbody>tr>th.warning,
  .table>tfoot>tr.warning>td,
  .table>tfoot>tr.warning>th,
  .table>tfoot>tr>td.warning,
  .table>tfoot>tr>th.warning,
  .table>thead>tr.warning>td,
  .table>thead>tr.warning>th,
  .table>thead>tr>td.warning,
  .table>thead>tr>th.warning {
      background-color: #fcf8e3
  }
  
  .table-hover>tbody>tr.warning:hover>td,
  .table-hover>tbody>tr.warning:hover>th,
  .table-hover>tbody>tr:hover>.warning,
  .table-hover>tbody>tr>td.warning:hover,
  .table-hover>tbody>tr>th.warning:hover {
      background-color: #faf2cc
  }
  
  .table>tbody>tr.danger>td,
  .table>tbody>tr.danger>th,
  .table>tbody>tr>td.danger,
  .table>tbody>tr>th.danger,
  .table>tfoot>tr.danger>td,
  .table>tfoot>tr.danger>th,
  .table>tfoot>tr>td.danger,
  .table>tfoot>tr>th.danger,
  .table>thead>tr.danger>td,
  .table>thead>tr.danger>th,
  .table>thead>tr>td.danger,
  .table>thead>tr>th.danger {
      background-color: #f2dede
  }
  
  .table-hover>tbody>tr.danger:hover>td,
  .table-hover>tbody>tr.danger:hover>th,
  .table-hover>tbody>tr:hover>.danger,
  .table-hover>tbody>tr>td.danger:hover,
  .table-hover>tbody>tr>th.danger:hover {
      background-color: #ebcccc
  }
  
  .table-responsive {
      min-height: .01%;
      overflow-x: auto
  }
  
  @media screen and (max-width:767px) {
      .table-responsive {
          width: 100%;
          margin-bottom: 15px;
          overflow-y: hidden;
          -ms-overflow-style: -ms-autohiding-scrollbar;
          border: 1px solid #ddd
      }
      .table-responsive>.table {
          margin-bottom: 0
      }
      .table-responsive>.table>tbody>tr>td,
      .table-responsive>.table>tbody>tr>th,
      .table-responsive>.table>tfoot>tr>td,
      .table-responsive>.table>tfoot>tr>th,
      .table-responsive>.table>thead>tr>td,
      .table-responsive>.table>thead>tr>th {
          white-space: nowrap
      }
      .table-responsive>.table-bordered {
          border: 0
      }
      .table-responsive>.table-bordered>tbody>tr>td:first-child,
      .table-responsive>.table-bordered>tbody>tr>th:first-child,
      .table-responsive>.table-bordered>tfoot>tr>td:first-child,
      .table-responsive>.table-bordered>tfoot>tr>th:first-child,
      .table-responsive>.table-bordered>thead>tr>td:first-child,
      .table-responsive>.table-bordered>thead>tr>th:first-child {
          border-left: 0
      }
      .table-responsive>.table-bordered>tbody>tr>td:last-child,
      .table-responsive>.table-bordered>tbody>tr>th:last-child,
      .table-responsive>.table-bordered>tfoot>tr>td:last-child,
      .table-responsive>.table-bordered>tfoot>tr>th:last-child,
      .table-responsive>.table-bordered>thead>tr>td:last-child,
      .table-responsive>.table-bordered>thead>tr>th:last-child {
          border-right: 0
      }
      .table-responsive>.table-bordered>tbody>tr:last-child>td,
      .table-responsive>.table-bordered>tbody>tr:last-child>th,
      .table-responsive>.table-bordered>tfoot>tr:last-child>td,
      .table-responsive>.table-bordered>tfoot>tr:last-child>th {
          border-bottom: 0
      }
  }
  
  fieldset {
      min-width: 0;
      padding: 0;
      margin: 0;
      border: 0
  }
  
  legend {
      display: block;
      width: 100%;
      padding: 0;
      margin-bottom: 20px;
      font-size: 21px;
      line-height: inherit;
      color: #333;
      border: 0;
      border-bottom: 1px solid #e5e5e5
  }
  
  label {
      display: inline-block;
      max-width: 100%;
      margin-bottom: 5px;
      font-weight: 700
  }
  
  input[type=search] {
      -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
      box-sizing: border-box
  }
  
  input[type=checkbox],
  input[type=radio] {
      margin: 4px 0 0;
      margin-top: 1px\9;
      line-height: normal
  }
  
  input[type=file] {
      display: block
  }
  
  input[type=range] {
      display: block;
      width: 100%
  }
  
  select[multiple],
  select[size] {
      height: auto
  }
  
  input[type=file]:focus,
  input[type=checkbox]:focus,
  input[type=radio]:focus {
      outline: 5px auto -webkit-focus-ring-color;
      outline-offset: -2px
  }
  
  output {
      display: block;
      padding-top: 7px;
      font-size: 14px;
      line-height: 1.42857143;
      color: #555
  }
  
  .form-control {
      display: block;
      width: 100%;
      height: 34px;
      padding: 6px 12px;
      font-size: 14px;
      line-height: 1.42857143;
      color: #555;
      background-color: #fff;
      background-image: none;
      border: 1px solid #ccc;
      border-radius: 4px;
      -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
      box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
      -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
      -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
      transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s
  }
  
  .form-control:focus {
      border-color: #66afe9;
      outline: 0;
      -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
      box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6)
  }
  
  .form-control::-moz-placeholder {
      color: #999;
      opacity: 1
  }
  
  .form-control:-ms-input-placeholder {
      color: #999
  }
  
  .form-control::-webkit-input-placeholder {
      color: #999
  }
  
  .form-control::-ms-expand {
      background-color: transparent;
      border: 0
  }
  
  .form-control[disabled],
  .form-control[readonly],
  fieldset[disabled] .form-control {
      background-color: #eee;
      opacity: 1
  }
  
  .form-control[disabled],
  fieldset[disabled] .form-control {
      cursor: not-allowed
  }
  
  textarea.form-control {
      height: auto
  }
  
  input[type=search] {
      -webkit-appearance: none
  }
  
  @media screen and (-webkit-min-device-pixel-ratio:0) {
      input[type=date].form-control,
      input[type=time].form-control,
      input[type=datetime-local].form-control,
      input[type=month].form-control {
          line-height: 34px
      }
      .input-group-sm input[type=date],
      .input-group-sm input[type=time],
      .input-group-sm input[type=datetime-local],
      .input-group-sm input[type=month],
      input[type=date].input-sm,
      input[type=time].input-sm,
      input[type=datetime-local].input-sm,
      input[type=month].input-sm {
          line-height: 30px
      }
      .input-group-lg input[type=date],
      .input-group-lg input[type=time],
      .input-group-lg input[type=datetime-local],
      .input-group-lg input[type=month],
      input[type=date].input-lg,
      input[type=time].input-lg,
      input[type=datetime-local].input-lg,
      input[type=month].input-lg {
          line-height: 46px
      }
  }
  
  .form-group {
      margin-bottom: 15px
  }
  
  .checkbox,
  .radio {
      position: relative;
      display: block;
      margin-top: 10px;
      margin-bottom: 10px
  }
  
  .checkbox label,
  .radio label {
      min-height: 20px;
      padding-left: 20px;
      margin-bottom: 0;
      font-weight: 400;
      cursor: pointer
  }
  
  .checkbox input[type=checkbox],
  .checkbox-inline input[type=checkbox],
  .radio input[type=radio],
  .radio-inline input[type=radio] {
      position: absolute;
      margin-top: 4px\9;
      margin-left: -20px
  }
  
  .checkbox+.checkbox,
  .radio+.radio {
      margin-top: -5px
  }
  
  .checkbox-inline,
  .radio-inline {
      position: relative;
      display: inline-block;
      padding-left: 20px;
      margin-bottom: 0;
      font-weight: 400;
      vertical-align: middle;
      cursor: pointer
  }
  
  .checkbox-inline+.checkbox-inline,
  .radio-inline+.radio-inline {
      margin-top: 0;
      margin-left: 10px
  }
  
  fieldset[disabled] input[type=checkbox],
  fieldset[disabled] input[type=radio],
  input[type=checkbox].disabled,
  input[type=checkbox][disabled],
  input[type=radio].disabled,
  input[type=radio][disabled] {
      cursor: not-allowed
  }
  
  .checkbox-inline.disabled,
  .radio-inline.disabled,
  fieldset[disabled] .checkbox-inline,
  fieldset[disabled] .radio-inline {
      cursor: not-allowed
  }
  
  .checkbox.disabled label,
  .radio.disabled label,
  fieldset[disabled] .checkbox label,
  fieldset[disabled] .radio label {
      cursor: not-allowed
  }
  
  .form-control-static {
      min-height: 34px;
      padding-top: 7px;
      padding-bottom: 7px;
      margin-bottom: 0
  }
  
  .form-control-static.input-lg,
  .form-control-static.input-sm {
      padding-right: 0;
      padding-left: 0
  }
  
  .input-sm {
      height: 30px;
      padding: 5px 10px;
      font-size: 12px;
      line-height: 1.5;
      border-radius: 3px
  }
  
  select.input-sm {
      height: 30px;
      line-height: 30px
  }
  
  select[multiple].input-sm,
  textarea.input-sm {
      height: auto
  }
  
  .form-group-sm .form-control {
      height: 30px;
      padding: 5px 10px;
      font-size: 12px;
      line-height: 1.5;
      border-radius: 3px
  }
  
  .form-group-sm select.form-control {
      height: 30px;
      line-height: 30px
  }
  
  .form-group-sm select[multiple].form-control,
  .form-group-sm textarea.form-control {
      height: auto
  }
  
  .form-group-sm .form-control-static {
      height: 30px;
      min-height: 32px;
      padding: 6px 10px;
      font-size: 12px;
      line-height: 1.5
  }
  
  .input-lg {
      height: 46px;
      padding: 10px 16px;
      font-size: 18px;
      line-height: 1.3333333;
      border-radius: 6px
  }
  
  select.input-lg {
      height: 46px;
      line-height: 46px
  }
  
  select[multiple].input-lg,
  textarea.input-lg {
      height: auto
  }
  
  .form-group-lg .form-control {
      height: 46px;
      padding: 10px 16px;
      font-size: 18px;
      line-height: 1.3333333;
      border-radius: 6px
  }
  
  .form-group-lg select.form-control {
      height: 46px;
      line-height: 46px
  }
  
  .form-group-lg select[multiple].form-control,
  .form-group-lg textarea.form-control {
      height: auto
  }
  
  .form-group-lg .form-control-static {
      height: 46px;
      min-height: 38px;
      padding: 11px 16px;
      font-size: 18px;
      line-height: 1.3333333
  }
  
  .has-feedback {
      position: relative
  }
  
  .has-feedback .form-control {
      padding-right: 42.5px
  }
  
  .form-control-feedback {
      position: absolute;
      top: 0;
      right: 0;
      z-index: 2;
      display: block;
      width: 34px;
      height: 34px;
      line-height: 34px;
      text-align: center;
      pointer-events: none
  }
  
  .form-group-lg .form-control+.form-control-feedback,
  .input-group-lg+.form-control-feedback,
  .input-lg+.form-control-feedback {
      width: 46px;
      height: 46px;
      line-height: 46px
  }
  
  .form-group-sm .form-control+.form-control-feedback,
  .input-group-sm+.form-control-feedback,
  .input-sm+.form-control-feedback {
      width: 30px;
      height: 30px;
      line-height: 30px
  }
  
  .has-success .checkbox,
  .has-success .checkbox-inline,
  .has-success .control-label,
  .has-success .help-block,
  .has-success .radio,
  .has-success .radio-inline,
  .has-success.checkbox label,
  .has-success.checkbox-inline label,
  .has-success.radio label,
  .has-success.radio-inline label {
      color: #3c763d
  }
  
  .has-success .form-control {
      border-color: #3c763d;
      -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
      box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075)
  }
  
  .has-success .form-control:focus {
      border-color: #2b542c;
      -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
      box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168
  }
  
  .has-success .input-group-addon {
      color: #3c763d;
      background-color: #dff0d8;
      border-color: #3c763d
  }
  
  .has-success .form-control-feedback {
      color: #3c763d
  }
  
  .has-warning .checkbox,
  .has-warning .checkbox-inline,
  .has-warning .control-label,
  .has-warning .help-block,
  .has-warning .radio,
  .has-warning .radio-inline,
  .has-warning.checkbox label,
  .has-warning.checkbox-inline label,
  .has-warning.radio label,
  .has-warning.radio-inline label {
      color: #8a6d3b
  }
  
  .has-warning .form-control {
      border-color: #8a6d3b;
      -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
      box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075)
  }
  
  .has-warning .form-control:focus {
      border-color: #66512c;
      -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
      box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b
  }
  
  .has-warning .input-group-addon {
      color: #8a6d3b;
      background-color: #fcf8e3;
      border-color: #8a6d3b
  }
  
  .has-warning .form-control-feedback {
      color: #8a6d3b
  }
  
  .has-error .checkbox,
  .has-error .checkbox-inline,
  .has-error .control-label,
  .has-error .help-block,
  .has-error .radio,
  .has-error .radio-inline,
  .has-error.checkbox label,
  .has-error.checkbox-inline label,
  .has-error.radio label,
  .has-error.radio-inline label {
      color: #a94442
  }
  
  .has-error .form-control {
      border-color: #a94442;
      -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
      box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075)
  }
  
  .has-error .form-control:focus {
      border-color: #843534;
      -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
      box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483
  }
  
  .has-error .input-group-addon {
      color: #a94442;
      background-color: #f2dede;
      border-color: #a94442
  }
  
  .has-error .form-control-feedback {
      color: #a94442
  }
  
  .has-feedback label~.form-control-feedback {
      top: 25px
  }
  
  .has-feedback label.sr-only~.form-control-feedback {
      top: 0
  }
  
  .help-block {
      display: block;
      margin-top: 5px;
      margin-bottom: 10px;
      color: #737373
  }
  
  @media (min-width:768px) {
      .form-inline .form-group {
          display: inline-block;
          margin-bottom: 0;
          vertical-align: middle
      }
      .form-inline .form-control {
          display: inline-block;
          width: auto;
          vertical-align: middle
      }
      .form-inline .form-control-static {
          display: inline-block
      }
      .form-inline .input-group {
          display: inline-table;
          vertical-align: middle
      }
      .form-inline .input-group .form-control,
      .form-inline .input-group .input-group-addon,
      .form-inline .input-group .input-group-btn {
          width: auto
      }
      .form-inline .input-group>.form-control {
          width: 100%
      }
      .form-inline .control-label {
          margin-bottom: 0;
          vertical-align: middle
      }
      .form-inline .checkbox,
      .form-inline .radio {
          display: inline-block;
          margin-top: 0;
          margin-bottom: 0;
          vertical-align: middle
      }
      .form-inline .checkbox label,
      .form-inline .radio label {
          padding-left: 0
      }
      .form-inline .checkbox input[type=checkbox],
      .form-inline .radio input[type=radio] {
          position: relative;
          margin-left: 0
      }
      .form-inline .has-feedback .form-control-feedback {
          top: 0
      }
  }
  
  .form-horizontal .checkbox,
  .form-horizontal .checkbox-inline,
  .form-horizontal .radio,
  .form-horizontal .radio-inline {
      padding-top: 7px;
      margin-top: 0;
      margin-bottom: 0
  }
  
  .form-horizontal .checkbox,
  .form-horizontal .radio {
      min-height: 27px
  }
  
  .form-horizontal .form-group {
      margin-right: -15px;
      margin-left: -15px
  }
  
  @media (min-width:768px) {
      .form-horizontal .control-label {
          padding-top: 7px;
          margin-bottom: 0;
          text-align: right
      }
  }
  
  .form-horizontal .has-feedback .form-control-feedback {
      right: 15px
  }
  
  @media (min-width:768px) {
      .form-horizontal .form-group-lg .control-label {
          padding-top: 11px;
          font-size: 18px
      }
  }
  
  @media (min-width:768px) {
      .form-horizontal .form-group-sm .control-label {
          padding-top: 6px;
          font-size: 12px
      }
  }
  
  .btn {
      display: inline-block;
      padding: 6px 12px;
      margin-bottom: 0;
      font-size: 14px;
      font-weight: 400;
      line-height: 1.42857143;
      text-align: center;
      white-space: nowrap;
      vertical-align: middle;
      -ms-touch-action: manipulation;
      touch-action: manipulation;
      cursor: pointer;
      -webkit-user-select: none;
      -moz-user-select: none;
      -ms-user-select: none;
      user-select: none;
      background-image: none;
      border: 1px solid transparent;
      border-radius: 4px
  }
  
  .btn.active.focus,
  .btn.active:focus,
  .btn.focus,
  .btn:active.focus,
  .btn:active:focus,
  .btn:focus {
      outline: 5px auto -webkit-focus-ring-color;
      outline-offset: -2px
  }
  
  .btn.focus,
  .btn:focus,
  .btn:hover {
      color: #333;
      text-decoration: none
  }
  
  .btn.active,
  .btn:active {
      background-image: none;
      outline: 0;
      -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
      box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125)
  }
  
  .btn.disabled,
  .btn[disabled],
  fieldset[disabled] .btn {
      cursor: not-allowed;
      filter: alpha(opacity=65);
      -webkit-box-shadow: none;
      box-shadow: none;
      opacity: .65
  }
  
  a.btn.disabled,
  fieldset[disabled] a.btn {
      pointer-events: none
  }
  
  .btn-default {
      color: #333;
      background-color: #fff;
      border-color: #ccc
  }
  
  .btn-default.focus,
  .btn-default:focus {
      color: #333;
      background-color: #e6e6e6;
      border-color: #8c8c8c
  }
  
  .btn-default:hover {
      color: #333;
      background-color: #e6e6e6;
      border-color: #adadad
  }
  
  .btn-default.active,
  .btn-default:active,
  .open>.dropdown-toggle.btn-default {
      color: #333;
      background-color: #e6e6e6;
      border-color: #adadad
  }
  
  .btn-default.active.focus,
  .btn-default.active:focus,
  .btn-default.active:hover,
  .btn-default:active.focus,
  .btn-default:active:focus,
  .btn-default:active:hover,
  .open>.dropdown-toggle.btn-default.focus,
  .open>.dropdown-toggle.btn-default:focus,
  .open>.dropdown-toggle.btn-default:hover {
      color: #333;
      background-color: #d4d4d4;
      border-color: #8c8c8c
  }
  
  .btn-default.active,
  .btn-default:active,
  .open>.dropdown-toggle.btn-default {
      background-image: none
  }
  
  .btn-default.disabled.focus,
  .btn-default.disabled:focus,
  .btn-default.disabled:hover,
  .btn-default[disabled].focus,
  .btn-default[disabled]:focus,
  .btn-default[disabled]:hover,
  fieldset[disabled] .btn-default.focus,
  fieldset[disabled] .btn-default:focus,
  fieldset[disabled] .btn-default:hover {
      background-color: #fff;
      border-color: #ccc
  }
  
  .btn-default .badge {
      color: #fff;
      background-color: #333
  }
  
  .btn-primary {
      color: #fff;
      background-color: #337ab7;
      border-color: #2e6da4
  }
  
  .btn-primary.focus,
  .btn-primary:focus {
      color: #fff;
      background-color: #286090;
      border-color: #122b40
  }
  
  .btn-primary:hover {
      color: #fff;
      background-color: #286090;
      border-color: #204d74
  }
  
  .btn-primary.active,
  .btn-primary:active,
  .open>.dropdown-toggle.btn-primary {
      color: #fff;
      background-color: #286090;
      border-color: #204d74
  }
  
  .btn-primary.active.focus,
  .btn-primary.active:focus,
  .btn-primary.active:hover,
  .btn-primary:active.focus,
  .btn-primary:active:focus,
  .btn-primary:active:hover,
  .open>.dropdown-toggle.btn-primary.focus,
  .open>.dropdown-toggle.btn-primary:focus,
  .open>.dropdown-toggle.btn-primary:hover {
      color: #fff;
      background-color: #204d74;
      border-color: #122b40
  }
  
  .btn-primary.active,
  .btn-primary:active,
  .open>.dropdown-toggle.btn-primary {
      background-image: none
  }
  
  .btn-primary.disabled.focus,
  .btn-primary.disabled:focus,
  .btn-primary.disabled:hover,
  .btn-primary[disabled].focus,
  .btn-primary[disabled]:focus,
  .btn-primary[disabled]:hover,
  fieldset[disabled] .btn-primary.focus,
  fieldset[disabled] .btn-primary:focus,
  fieldset[disabled] .btn-primary:hover {
      background-color: #337ab7;
      border-color: #2e6da4
  }
  
  .btn-primary .badge {
      color: #337ab7;
      background-color: #fff
  }
  
  .btn-success {
      color: #fff;
      background-color: #5cb85c;
      border-color: #4cae4c
  }
  
  .btn-success.focus,
  .btn-success:focus {
      color: #fff;
      background-color: #449d44;
      border-color: #255625
  }
  
  .btn-success:hover {
      color: #fff;
      background-color: #449d44;
      border-color: #398439
  }
  
  .btn-success.active,
  .btn-success:active,
  .open>.dropdown-toggle.btn-success {
      color: #fff;
      background-color: #449d44;
      border-color: #398439
  }
  
  .btn-success.active.focus,
  .btn-success.active:focus,
  .btn-success.active:hover,
  .btn-success:active.focus,
  .btn-success:active:focus,
  .btn-success:active:hover,
  .open>.dropdown-toggle.btn-success.focus,
  .open>.dropdown-toggle.btn-success:focus,
  .open>.dropdown-toggle.btn-success:hover {
      color: #fff;
      background-color: #398439;
      border-color: #255625
  }
  
  .btn-success.active,
  .btn-success:active,
  .open>.dropdown-toggle.btn-success {
      background-image: none
  }
  
  .btn-success.disabled.focus,
  .btn-success.disabled:focus,
  .btn-success.disabled:hover,
  .btn-success[disabled].focus,
  .btn-success[disabled]:focus,
  .btn-success[disabled]:hover,
  fieldset[disabled] .btn-success.focus,
  fieldset[disabled] .btn-success:focus,
  fieldset[disabled] .btn-success:hover {
      background-color: #5cb85c;
      border-color: #4cae4c
  }
  
  .btn-success .badge {
      color: #5cb85c;
      background-color: #fff
  }
  
  .btn-info {
      color: #fff;
      background-color: #5bc0de;
      border-color: #46b8da
  }
  
  .btn-info.focus,
  .btn-info:focus {
      color: #fff;
      background-color: #31b0d5;
      border-color: #1b6d85
  }
  
  .btn-info:hover {
      color: #fff;
      background-color: #31b0d5;
      border-color: #269abc
  }
  
  .btn-info.active,
  .btn-info:active,
  .open>.dropdown-toggle.btn-info {
      color: #fff;
      background-color: #31b0d5;
      border-color: #269abc
  }
  
  .btn-info.active.focus,
  .btn-info.active:focus,
  .btn-info.active:hover,
  .btn-info:active.focus,
  .btn-info:active:focus,
  .btn-info:active:hover,
  .open>.dropdown-toggle.btn-info.focus,
  .open>.dropdown-toggle.btn-info:focus,
  .open>.dropdown-toggle.btn-info:hover {
      color: #fff;
      background-color: #269abc;
      border-color: #1b6d85
  }
  
  .btn-info.active,
  .btn-info:active,
  .open>.dropdown-toggle.btn-info {
      background-image: none
  }
  
  .btn-info.disabled.focus,
  .btn-info.disabled:focus,
  .btn-info.disabled:hover,
  .btn-info[disabled].focus,
  .btn-info[disabled]:focus,
  .btn-info[disabled]:hover,
  fieldset[disabled] .btn-info.focus,
  fieldset[disabled] .btn-info:focus,
  fieldset[disabled] .btn-info:hover {
      background-color: #5bc0de;
      border-color: #46b8da
  }
  
  .btn-info .badge {
      color: #5bc0de;
      background-color: #fff
  }
  
  .btn-warning {
      color: #fff;
      background-color: #f0ad4e;
      border-color: #eea236
  }
  
  .btn-warning.focus,
  .btn-warning:focus {
      color: #fff;
      background-color: #ec971f;
      border-color: #985f0d
  }
  
  .btn-warning:hover {
      color: #fff;
      background-color: #ec971f;
      border-color: #d58512
  }
  
  .btn-warning.active,
  .btn-warning:active,
  .open>.dropdown-toggle.btn-warning {
      color: #fff;
      background-color: #ec971f;
      border-color: #d58512
  }
  
  .btn-warning.active.focus,
  .btn-warning.active:focus,
  .btn-warning.active:hover,
  .btn-warning:active.focus,
  .btn-warning:active:focus,
  .btn-warning:active:hover,
  .open>.dropdown-toggle.btn-warning.focus,
  .open>.dropdown-toggle.btn-warning:focus,
  .open>.dropdown-toggle.btn-warning:hover {
      color: #fff;
      background-color: #d58512;
      border-color: #985f0d
  }
  
  .btn-warning.active,
  .btn-warning:active,
  .open>.dropdown-toggle.btn-warning {
      background-image: none
  }
  
  .btn-warning.disabled.focus,
  .btn-warning.disabled:focus,
  .btn-warning.disabled:hover,
  .btn-warning[disabled].focus,
  .btn-warning[disabled]:focus,
  .btn-warning[disabled]:hover,
  fieldset[disabled] .btn-warning.focus,
  fieldset[disabled] .btn-warning:focus,
  fieldset[disabled] .btn-warning:hover {
      background-color: #f0ad4e;
      border-color: #eea236
  }
  
  .btn-warning .badge {
      color: #f0ad4e;
      background-color: #fff
  }
  
  .btn-danger {
      color: #fff;
      background-color: #d9534f;
      border-color: #d43f3a
  }
  
  .btn-danger.focus,
  .btn-danger:focus {
      color: #fff;
      background-color: #c9302c;
      border-color: #761c19
  }
  
  .btn-danger:hover {
      color: #fff;
      background-color: #c9302c;
      border-color: #ac2925
  }
  
  .btn-danger.active,
  .btn-danger:active,
  .open>.dropdown-toggle.btn-danger {
      color: #fff;
      background-color: #c9302c;
      border-color: #ac2925
  }
  
  .btn-danger.active.focus,
  .btn-danger.active:focus,
  .btn-danger.active:hover,
  .btn-danger:active.focus,
  .btn-danger:active:focus,
  .btn-danger:active:hover,
  .open>.dropdown-toggle.btn-danger.focus,
  .open>.dropdown-toggle.btn-danger:focus,
  .open>.dropdown-toggle.btn-danger:hover {
      color: #fff;
      background-color: #ac2925;
      border-color: #761c19
  }
  
  .btn-danger.active,
  .btn-danger:active,
  .open>.dropdown-toggle.btn-danger {
      background-image: none
  }
  
  .btn-danger.disabled.focus,
  .btn-danger.disabled:focus,
  .btn-danger.disabled:hover,
  .btn-danger[disabled].focus,
  .btn-danger[disabled]:focus,
  .btn-danger[disabled]:hover,
  fieldset[disabled] .btn-danger.focus,
  fieldset[disabled] .btn-danger:focus,
  fieldset[disabled] .btn-danger:hover {
      background-color: #d9534f;
      border-color: #d43f3a
  }
  
  .btn-danger .badge {
      color: #d9534f;
      background-color: #fff
  }
  
  .btn-link {
      font-weight: 400;
      color: #337ab7;
      border-radius: 0
  }
  
  .btn-link,
  .btn-link.active,
  .btn-link:active,
  .btn-link[disabled],
  fieldset[disabled] .btn-link {
      background-color: transparent;
      -webkit-box-shadow: none;
      box-shadow: none
  }
  
  .btn-link,
  .btn-link:active,
  .btn-link:focus,
  .btn-link:hover {
      border-color: transparent
  }
  
  .btn-link:focus,
  .btn-link:hover {
      color: #23527c;
      text-decoration: underline;
      background-color: transparent
  }
  
  .btn-link[disabled]:focus,
  .btn-link[disabled]:hover,
  fieldset[disabled] .btn-link:focus,
  fieldset[disabled] .btn-link:hover {
      color: #777;
      text-decoration: none
  }
  
  .btn-group-lg>.btn,
  .btn-lg {
      padding: 10px 16px;
      font-size: 18px;
      line-height: 1.3333333;
      border-radius: 6px
  }
  
  .btn-group-sm>.btn,
  .btn-sm {
      padding: 5px 10px;
      font-size: 12px;
      line-height: 1.5;
      border-radius: 3px
  }
  
  .btn-group-xs>.btn,
  .btn-xs {
      padding: 1px 5px;
      font-size: 12px;
      line-height: 1.5;
      border-radius: 3px
  }
  
  .btn-block {
      display: block;
      width: 100%
  }
  
  .btn-block+.btn-block {
      margin-top: 5px
  }
  
  input[type=button].btn-block,
  input[type=reset].btn-block,
  input[type=submit].btn-block {
      width: 100%
  }
  
  .fade {
      opacity: 0;
      -webkit-transition: opacity .15s linear;
      -o-transition: opacity .15s linear;
      transition: opacity .15s linear
  }
  
  .fade.in {
      opacity: 1
  }
  
  .collapse {
      display: none
  }
  
  .collapse.in {
      display: block
  }
  
  tr.collapse.in {
      display: table-row
  }
  
  tbody.collapse.in {
      display: table-row-group
  }
  
  .collapsing {
      position: relative;
      height: 0;
      overflow: hidden;
      -webkit-transition-timing-function: ease;
      -o-transition-timing-function: ease;
      transition-timing-function: ease;
      -webkit-transition-duration: .35s;
      -o-transition-duration: .35s;
      transition-duration: .35s;
      -webkit-transition-property: height, visibility;
      -o-transition-property: height, visibility;
      transition-property: height, visibility
  }
  
  .caret {
      display: inline-block;
      width: 0;
      height: 0;
      margin-left: 2px;
      vertical-align: middle;
      border-top: 4px dashed;
      border-top: 4px solid\9;
      border-right: 4px solid transparent;
      border-left: 4px solid transparent
  }
  
  .dropdown,
  .dropup {
      position: relative
  }
  
  .dropdown-toggle:focus {
      outline: 0
  }
  
  .dropdown-menu {
      position: absolute;
      top: 100%;
      left: 0;
      z-index: 1000;
      display: none;
      float: left;
      min-width: 160px;
      padding: 5px 0;
      margin: 2px 0 0;
      font-size: 14px;
      text-align: left;
      list-style: none;
      background-color: #fff;
      -webkit-background-clip: padding-box;
      background-clip: padding-box;
      border: 1px solid #ccc;
      border: 1px solid rgba(0, 0, 0, .15);
      border-radius: 4px;
      -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
      box-shadow: 0 6px 12px rgba(0, 0, 0, .175)
  }
  
  .dropdown-menu.pull-right {
      right: 0;
      left: auto
  }
  
  .dropdown-menu .divider {
      height: 1px;
      margin: 9px 0;
      overflow: hidden;
      background-color: #e5e5e5
  }
  
  .dropdown-menu>li>a {
      display: block;
      padding: 3px 20px;
      clear: both;
      font-weight: 400;
      line-height: 1.42857143;
      color: #333;
      white-space: nowrap
  }
  
  .dropdown-menu>li>a:focus,
  .dropdown-menu>li>a:hover {
      color: #262626;
      text-decoration: none;
      background-color: #f5f5f5
  }
  
  .dropdown-menu>.active>a,
  .dropdown-menu>.active>a:focus,
  .dropdown-menu>.active>a:hover {
      color: #fff;
      text-decoration: none;
      background-color: #337ab7;
      outline: 0
  }
  
  .dropdown-menu>.disabled>a,
  .dropdown-menu>.disabled>a:focus,
  .dropdown-menu>.disabled>a:hover {
      color: #777
  }
  
  .dropdown-menu>.disabled>a:focus,
  .dropdown-menu>.disabled>a:hover {
      text-decoration: none;
      cursor: not-allowed;
      background-color: transparent;
      background-image: none;
      filter: progid:DXImageTransform.Microsoft.gradient(enabled=false)
  }
  
  .open>.dropdown-menu {
      display: block
  }
  
  .open>a {
      outline: 0
  }
  
  .dropdown-menu-right {
      right: 0;
      left: auto
  }
  
  .dropdown-menu-left {
      right: auto;
      left: 0
  }
  
  .dropdown-header {
      display: block;
      padding: 3px 20px;
      font-size: 12px;
      line-height: 1.42857143;
      color: #777;
      white-space: nowrap
  }
  
  .dropdown-backdrop {
      position: fixed;
      top: 0;
      right: 0;
      bottom: 0;
      left: 0;
      z-index: 990
  }
  
  .pull-right>.dropdown-menu {
      right: 0;
      left: auto
  }
  
  .dropup .caret,
  .navbar-fixed-bottom .dropdown .caret {
      content: "";
      border-top: 0;
      border-bottom: 4px dashed;
      border-bottom: 4px solid\9
  }
  
  .dropup .dropdown-menu,
  .navbar-fixed-bottom .dropdown .dropdown-menu {
      top: auto;
      bottom: 100%;
      margin-bottom: 2px
  }
  
  @media (min-width:768px) {
      .navbar-right .dropdown-menu {
          right: 0;
          left: auto
      }
      .navbar-right .dropdown-menu-left {
          right: auto;
          left: 0
      }
  }
  
  .btn-group,
  .btn-group-vertical {
      position: relative;
      display: inline-block;
      vertical-align: middle
  }
  
  .btn-group-vertical>.btn,
  .btn-group>.btn {
      position: relative;
      float: left
  }
  
  .btn-group-vertical>.btn.active,
  .btn-group-vertical>.btn:active,
  .btn-group-vertical>.btn:focus,
  .btn-group-vertical>.btn:hover,
  .btn-group>.btn.active,
  .btn-group>.btn:active,
  .btn-group>.btn:focus,
  .btn-group>.btn:hover {
      z-index: 2
  }
  
  .btn-group .btn+.btn,
  .btn-group .btn+.btn-group,
  .btn-group .btn-group+.btn,
  .btn-group .btn-group+.btn-group {
      margin-left: -1px
  }
  
  .btn-toolbar {
      margin-left: -5px
  }
  
  .btn-toolbar .btn,
  .btn-toolbar .btn-group,
  .btn-toolbar .input-group {
      float: left
  }
  
  .btn-toolbar>.btn,
  .btn-toolbar>.btn-group,
  .btn-toolbar>.input-group {
      margin-left: 5px
  }
  
  .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
      border-radius: 0
  }
  
  .btn-group>.btn:first-child {
      margin-left: 0
  }
  
  .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle) {
      border-top-right-radius: 0;
      border-bottom-right-radius: 0
  }
  
  .btn-group>.btn:last-child:not(:first-child),
  .btn-group>.dropdown-toggle:not(:first-child) {
      border-top-left-radius: 0;
      border-bottom-left-radius: 0
  }
  
  .btn-group>.btn-group {
      float: left
  }
  
  .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn {
      border-radius: 0
  }
  
  .btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,
  .btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle {
      border-top-right-radius: 0;
      border-bottom-right-radius: 0
  }
  
  .btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child {
      border-top-left-radius: 0;
      border-bottom-left-radius: 0
  }
  
  .btn-group .dropdown-toggle:active,
  .btn-group.open .dropdown-toggle {
      outline: 0
  }
  
  .btn-group>.btn+.dropdown-toggle {
      padding-right: 8px;
      padding-left: 8px
  }
  
  .btn-group>.btn-lg+.dropdown-toggle {
      padding-right: 12px;
      padding-left: 12px
  }
  
  .btn-group.open .dropdown-toggle {
      -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
      box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125)
  }
  
  .btn-group.open .dropdown-toggle.btn-link {
      -webkit-box-shadow: none;
      box-shadow: none
  }
  
  .btn .caret {
      margin-left: 0
  }
  
  .btn-lg .caret {
      border-width: 5px 5px 0;
      border-bottom-width: 0
  }
  
  .dropup .btn-lg .caret {
      border-width: 0 5px 5px
  }
  
  .btn-group-vertical>.btn,
  .btn-group-vertical>.btn-group,
  .btn-group-vertical>.btn-group>.btn {
      display: block;
      float: none;
      width: 100%;
      max-width: 100%
  }
  
  .btn-group-vertical>.btn-group>.btn {
      float: none
  }
  
  .btn-group-vertical>.btn+.btn,
  .btn-group-vertical>.btn+.btn-group,
  .btn-group-vertical>.btn-group+.btn,
  .btn-group-vertical>.btn-group+.btn-group {
      margin-top: -1px;
      margin-left: 0
  }
  
  .btn-group-vertical>.btn:not(:first-child):not(:last-child) {
      border-radius: 0
  }
  
  .btn-group-vertical>.btn:first-child:not(:last-child) {
      border-top-left-radius: 4px;
      border-top-right-radius: 4px;
      border-bottom-right-radius: 0;
      border-bottom-left-radius: 0
  }
  
  .btn-group-vertical>.btn:last-child:not(:first-child) {
      border-top-left-radius: 0;
      border-top-right-radius: 0;
      border-bottom-right-radius: 4px;
      border-bottom-left-radius: 4px
  }
  
  .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn {
      border-radius: 0
  }
  
  .btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,
  .btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle {
      border-bottom-right-radius: 0;
      border-bottom-left-radius: 0
  }
  
  .btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child {
      border-top-left-radius: 0;
      border-top-right-radius: 0
  }
  
  .btn-group-justified {
      display: table;
      width: 100%;
      table-layout: fixed;
      border-collapse: separate
  }
  
  .btn-group-justified>.btn,
  .btn-group-justified>.btn-group {
      display: table-cell;
      float: none;
      width: 1%
  }
  
  .btn-group-justified>.btn-group .btn {
      width: 100%
  }
  
  .btn-group-justified>.btn-group .dropdown-menu {
      left: auto
  }
  
  [data-toggle=buttons]>.btn input[type=checkbox],
  [data-toggle=buttons]>.btn input[type=radio],
  [data-toggle=buttons]>.btn-group>.btn input[type=checkbox],
  [data-toggle=buttons]>.btn-group>.btn input[type=radio] {
      position: absolute;
      clip: rect(0, 0, 0, 0);
      pointer-events: none
  }
  
  .input-group {
      position: relative;
      display: table;
      border-collapse: separate
  }
  
  .input-group[class*=col-] {
      float: none;
      padding-right: 0;
      padding-left: 0
  }
  
  .input-group .form-control {
      position: relative;
      z-index: 2;
      float: left;
      width: 100%;
      margin-bottom: 0
  }
  
  .input-group .form-control:focus {
      z-index: 3
  }
  
  .input-group-lg>.form-control,
  .input-group-lg>.input-group-addon,
  .input-group-lg>.input-group-btn>.btn {
      height: 46px;
      padding: 10px 16px;
      font-size: 18px;
      line-height: 1.3333333;
      border-radius: 6px
  }
  
  select.input-group-lg>.form-control,
  select.input-group-lg>.input-group-addon,
  select.input-group-lg>.input-group-btn>.btn {
      height: 46px;
      line-height: 46px
  }
  
  select[multiple].input-group-lg>.form-control,
  select[multiple].input-group-lg>.input-group-addon,
  select[multiple].input-group-lg>.input-group-btn>.btn,
  textarea.input-group-lg>.form-control,
  textarea.input-group-lg>.input-group-addon,
  textarea.input-group-lg>.input-group-btn>.btn {
      height: auto
  }
  
  .input-group-sm>.form-control,
  .input-group-sm>.input-group-addon,
  .input-group-sm>.input-group-btn>.btn {
      height: 30px;
      padding: 5px 10px;
      font-size: 12px;
      line-height: 1.5;
      border-radius: 3px
  }
  
  select.input-group-sm>.form-control,
  select.input-group-sm>.input-group-addon,
  select.input-group-sm>.input-group-btn>.btn {
      height: 30px;
      line-height: 30px
  }
  
  select[multiple].input-group-sm>.form-control,
  select[multiple].input-group-sm>.input-group-addon,
  select[multiple].input-group-sm>.input-group-btn>.btn,
  textarea.input-group-sm>.form-control,
  textarea.input-group-sm>.input-group-addon,
  textarea.input-group-sm>.input-group-btn>.btn {
      height: auto
  }
  
  .input-group .form-control,
  .input-group-addon,
  .input-group-btn {
      display: table-cell
  }
  
  .input-group .form-control:not(:first-child):not(:last-child),
  .input-group-addon:not(:first-child):not(:last-child),
  .input-group-btn:not(:first-child):not(:last-child) {
      border-radius: 0
  }
  
  .input-group-addon,
  .input-group-btn {
      width: 1%;
      white-space: nowrap;
      vertical-align: middle
  }
  
  .input-group-addon {
      padding: 6px 12px;
      font-size: 14px;
      font-weight: 400;
      line-height: 1;
      color: #555;
      text-align: center;
      background-color: #eee;
      border: 1px solid #ccc;
      border-radius: 4px
  }
  
  .input-group-addon.input-sm {
      padding: 5px 10px;
      font-size: 12px;
      border-radius: 3px
  }
  
  .input-group-addon.input-lg {
      padding: 10px 16px;
      font-size: 18px;
      border-radius: 6px
  }
  
  .input-group-addon input[type=checkbox],
  .input-group-addon input[type=radio] {
      margin-top: 0
  }
  
  .input-group .form-control:first-child,
  .input-group-addon:first-child,
  .input-group-btn:first-child>.btn,
  .input-group-btn:first-child>.btn-group>.btn,
  .input-group-btn:first-child>.dropdown-toggle,
  .input-group-btn:last-child>.btn-group:not(:last-child)>.btn,
  .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle) {
      border-top-right-radius: 0;
      border-bottom-right-radius: 0
  }
  
  .input-group-addon:first-child {
      border-right: 0
  }
  
  .input-group .form-control:last-child,
  .input-group-addon:last-child,
  .input-group-btn:first-child>.btn-group:not(:first-child)>.btn,
  .input-group-btn:first-child>.btn:not(:first-child),
  .input-group-btn:last-child>.btn,
  .input-group-btn:last-child>.btn-group>.btn,
  .input-group-btn:last-child>.dropdown-toggle {
      border-top-left-radius: 0;
      border-bottom-left-radius: 0
  }
  
  .input-group-addon:last-child {
      border-left: 0
  }
  
  .input-group-btn {
      position: relative;
      font-size: 0;
      white-space: nowrap
  }
  
  .input-group-btn>.btn {
      position: relative
  }
  
  .input-group-btn>.btn+.btn {
      margin-left: -1px
  }
  
  .input-group-btn>.btn:active,
  .input-group-btn>.btn:focus,
  .input-group-btn>.btn:hover {
      z-index: 2
  }
  
  .input-group-btn:first-child>.btn,
  .input-group-btn:first-child>.btn-group {
      margin-right: -1px
  }
  
  .input-group-btn:last-child>.btn,
  .input-group-btn:last-child>.btn-group {
      z-index: 2;
      margin-left: -1px
  }
  
  .nav {
      padding-left: 0;
      margin-bottom: 0;
      list-style: none
  }
  
  .nav>li {
      position: relative;
      display: block
  }
  
  .nav>li>a {
      position: relative;
      display: block;
      padding: 10px 15px
  }
  
  .nav>li>a:focus,
  .nav>li>a:hover {
      text-decoration: none;
      background-color: #eee
  }
  
  .nav>li.disabled>a {
      color: #777
  }
  
  .nav>li.disabled>a:focus,
  .nav>li.disabled>a:hover {
      color: #777;
      text-decoration: none;
      cursor: not-allowed;
      background-color: transparent
  }
  
  .nav .open>a,
  .nav .open>a:focus,
  .nav .open>a:hover {
      background-color: #eee;
      border-color: #337ab7
  }
  
  .nav .nav-divider {
      height: 1px;
      margin: 9px 0;
      overflow: hidden;
      background-color: #e5e5e5
  }
  
  .nav>li>a>img {
      max-width: none
  }
  
  .nav-tabs {
      border-bottom: 1px solid #ddd
  }
  
  .nav-tabs>li {
      float: left;
      margin-bottom: -1px
  }
  
  .nav-tabs>li>a {
      margin-right: 2px;
      line-height: 1.42857143;
      border: 1px solid transparent;
      border-radius: 4px 4px 0 0
  }
  
  .nav-tabs>li>a:hover {
      border-color: #eee #eee #ddd
  }
  
  .nav-tabs>li.active>a,
  .nav-tabs>li.active>a:focus,
  .nav-tabs>li.active>a:hover {
      color: #555;
      cursor: default;
      background-color: #fff;
      border: 1px solid #ddd;
      border-bottom-color: transparent
  }
  
  .nav-tabs.nav-justified {
      width: 100%;
      border-bottom: 0
  }
  
  .nav-tabs.nav-justified>li {
      float: none
  }
  
  .nav-tabs.nav-justified>li>a {
      margin-bottom: 5px;
      text-align: center
  }
  
  .nav-tabs.nav-justified>.dropdown .dropdown-menu {
      top: auto;
      left: auto
  }
  
  @media (min-width:768px) {
      .nav-tabs.nav-justified>li {
          display: table-cell;
          width: 1%
      }
      .nav-tabs.nav-justified>li>a {
          margin-bottom: 0
      }
  }
  
  .nav-tabs.nav-justified>li>a {
      margin-right: 0;
      border-radius: 4px
  }
  
  .nav-tabs.nav-justified>.active>a,
  .nav-tabs.nav-justified>.active>a:focus,
  .nav-tabs.nav-justified>.active>a:hover {
      border: 1px solid #ddd
  }
  
  @media (min-width:768px) {
      .nav-tabs.nav-justified>li>a {
          border-bottom: 1px solid #ddd;
          border-radius: 4px 4px 0 0
      }
      .nav-tabs.nav-justified>.active>a,
      .nav-tabs.nav-justified>.active>a:focus,
      .nav-tabs.nav-justified>.active>a:hover {
          border-bottom-color: #fff
      }
  }
  
  .nav-pills>li {
      float: left
  }
  
  .nav-pills>li>a {
      border-radius: 4px
  }
  
  .nav-pills>li+li {
      margin-left: 2px
  }
  
  .nav-pills>li.active>a,
  .nav-pills>li.active>a:focus,
  .nav-pills>li.active>a:hover {
      color: #fff;
      background-color: #337ab7
  }
  
  .nav-stacked>li {
      float: none
  }
  
  .nav-stacked>li+li {
      margin-top: 2px;
      margin-left: 0
  }
  
  .nav-justified {
      width: 100%
  }
  
  .nav-justified>li {
      float: none
  }
  
  .nav-justified>li>a {
      margin-bottom: 5px;
      text-align: center
  }
  
  .nav-justified>.dropdown .dropdown-menu {
      top: auto;
      left: auto
  }
  
  @media (min-width:768px) {
      .nav-justified>li {
          display: table-cell;
          width: 1%
      }
      .nav-justified>li>a {
          margin-bottom: 0
      }
  }
  
  .nav-tabs-justified {
      border-bottom: 0
  }
  
  .nav-tabs-justified>li>a {
      margin-right: 0;
      border-radius: 4px
  }
  
  .nav-tabs-justified>.active>a,
  .nav-tabs-justified>.active>a:focus,
  .nav-tabs-justified>.active>a:hover {
      border: 1px solid #ddd
  }
  
  @media (min-width:768px) {
      .nav-tabs-justified>li>a {
          border-bottom: 1px solid #ddd;
          border-radius: 4px 4px 0 0
      }
      .nav-tabs-justified>.active>a,
      .nav-tabs-justified>.active>a:focus,
      .nav-tabs-justified>.active>a:hover {
          border-bottom-color: #fff
      }
  }
  
  .tab-content>.tab-pane {
      display: none
  }
  
  .tab-content>.active {
      display: block
  }
  
  .nav-tabs .dropdown-menu {
      margin-top: -1px;
      border-top-left-radius: 0;
      border-top-right-radius: 0
  }
  
  .navbar {
      position: relative;
      min-height: 50px;
      margin-bottom: 20px;
      border: 1px solid transparent
  }
  
  @media (min-width:768px) {
      .navbar {
          border-radius: 4px
      }
  }
  
  @media (min-width:768px) {
      .navbar-header {
          float: left
      }
  }
  
  .navbar-collapse {
      padding-right: 15px;
      padding-left: 15px;
      overflow-x: visible;
      -webkit-overflow-scrolling: touch;
      border-top: 1px solid transparent;
      -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
      box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1)
  }
  
  .navbar-collapse.in {
      overflow-y: auto
  }
  
  @media (min-width:768px) {
      .navbar-collapse {
          width: auto;
          border-top: 0;
          -webkit-box-shadow: none;
          box-shadow: none
      }
      .navbar-collapse.collapse {
          display: block !important;
          height: auto !important;
          padding-bottom: 0;
          overflow: visible !important
      }
      .navbar-collapse.in {
          overflow-y: visible
      }
      .navbar-fixed-bottom .navbar-collapse,
      .navbar-fixed-top .navbar-collapse,
      .navbar-static-top .navbar-collapse {
          padding-right: 0;
          padding-left: 0
      }
  }
  
  .navbar-fixed-bottom .navbar-collapse,
  .navbar-fixed-top .navbar-collapse {
      max-height: 340px
  }
  
  @media (max-device-width:480px) and (orientation:landscape) {
      .navbar-fixed-bottom .navbar-collapse,
      .navbar-fixed-top .navbar-collapse {
          max-height: 200px
      }
  }
  
  .container-fluid>.navbar-collapse,
  .container-fluid>.navbar-header,
  .container>.navbar-collapse,
  .container>.navbar-header {
      margin-right: -15px;
      margin-left: -15px
  }
  
  @media (min-width:768px) {
      .container-fluid>.navbar-collapse,
      .container-fluid>.navbar-header,
      .container>.navbar-collapse,
      .container>.navbar-header {
          margin-right: 0;
          margin-left: 0
      }
  }
  
  .navbar-static-top {
      z-index: 1000;
      border-width: 0 0 1px
  }
  
  @media (min-width:768px) {
      .navbar-static-top {
          border-radius: 0
      }
  }
  
  .navbar-fixed-bottom,
  .navbar-fixed-top {
      position: fixed;
      right: 0;
      left: 0;
      z-index: 1030
  }
  
  @media (min-width:768px) {
      .navbar-fixed-bottom,
      .navbar-fixed-top {
          border-radius: 0
      }
  }
  
  .navbar-fixed-top {
      top: 0;
      border-width: 0 0 1px
  }
  
  .navbar-fixed-bottom {
      bottom: 0;
      margin-bottom: 0;
      border-width: 1px 0 0
  }
  
  .navbar-brand {
      float: left;
      height: 50px;
      padding: 15px 15px;
      font-size: 18px;
      line-height: 20px
  }
  
  .navbar-brand:focus,
  .navbar-brand:hover {
      text-decoration: none
  }
  
  .navbar-brand>img {
      display: block
  }
  
  @media (min-width:768px) {
      .navbar>.container .navbar-brand,
      .navbar>.container-fluid .navbar-brand {
          margin-left: -15px
      }
  }
  
  .navbar-toggle {
      position: relative;
      float: right;
      padding: 9px 10px;
      margin-top: 8px;
      margin-right: 15px;
      margin-bottom: 8px;
      background-color: transparent;
      background-image: none;
      border: 1px solid transparent;
      border-radius: 4px
  }
  
  .navbar-toggle:focus {
      outline: 0
  }
  
  .navbar-toggle .icon-bar {
      display: block;
      width: 22px;
      height: 2px;
      border-radius: 1px
  }
  
  .navbar-toggle .icon-bar+.icon-bar {
      margin-top: 4px
  }
  
  @media (min-width:768px) {
      .navbar-toggle {
          display: none
      }
  }
  
  .navbar-nav {
      margin: 7.5px -15px
  }
  
  .navbar-nav>li>a {
      padding-top: 10px;
      padding-bottom: 10px;
      line-height: 20px
  }
  
  @media (max-width:767px) {
      .navbar-nav .open .dropdown-menu {
          position: static;
          float: none;
          width: auto;
          margin-top: 0;
          background-color: transparent;
          border: 0;
          -webkit-box-shadow: none;
          box-shadow: none
      }
      .navbar-nav .open .dropdown-menu .dropdown-header,
      .navbar-nav .open .dropdown-menu>li>a {
          padding: 5px 15px 5px 25px
      }
      .navbar-nav .open .dropdown-menu>li>a {
          line-height: 20px
      }
      .navbar-nav .open .dropdown-menu>li>a:focus,
      .navbar-nav .open .dropdown-menu>li>a:hover {
          background-image: none
      }
  }
  
  @media (min-width:768px) {
      .navbar-nav {
          float: left;
          margin: 0
      }
      .navbar-nav>li {
          float: left
      }
      .navbar-nav>li>a {
          padding-top: 15px;
          padding-bottom: 15px
      }
  }
  
  .navbar-form {
      padding: 10px 15px;
      margin-top: 8px;
      margin-right: -15px;
      margin-bottom: 8px;
      margin-left: -15px;
      border-top: 1px solid transparent;
      border-bottom: 1px solid transparent;
      -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
      box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1)
  }
  
  @media (min-width:768px) {
      .navbar-form .form-group {
          display: inline-block;
          margin-bottom: 0;
          vertical-align: middle
      }
      .navbar-form .form-control {
          display: inline-block;
          width: auto;
          vertical-align: middle
      }
      .navbar-form .form-control-static {
          display: inline-block
      }
      .navbar-form .input-group {
          display: inline-table;
          vertical-align: middle
      }
      .navbar-form .input-group .form-control,
      .navbar-form .input-group .input-group-addon,
      .navbar-form .input-group .input-group-btn {
          width: auto
      }
      .navbar-form .input-group>.form-control {
          width: 100%
      }
      .navbar-form .control-label {
          margin-bottom: 0;
          vertical-align: middle
      }
      .navbar-form .checkbox,
      .navbar-form .radio {
          display: inline-block;
          margin-top: 0;
          margin-bottom: 0;
          vertical-align: middle
      }
      .navbar-form .checkbox label,
      .navbar-form .radio label {
          padding-left: 0
      }
      .navbar-form .checkbox input[type=checkbox],
      .navbar-form .radio input[type=radio] {
          position: relative;
          margin-left: 0
      }
      .navbar-form .has-feedback .form-control-feedback {
          top: 0
      }
  }
  
  @media (max-width:767px) {
      .navbar-form .form-group {
          margin-bottom: 5px
      }
      .navbar-form .form-group:last-child {
          margin-bottom: 0
      }
  }
  
  @media (min-width:768px) {
      .navbar-form {
          width: auto;
          padding-top: 0;
          padding-bottom: 0;
          margin-right: 0;
          margin-left: 0;
          border: 0;
          -webkit-box-shadow: none;
          box-shadow: none
      }
  }
  
  .navbar-nav>li>.dropdown-menu {
      margin-top: 0;
      border-top-left-radius: 0;
      border-top-right-radius: 0
  }
  
  .navbar-fixed-bottom .navbar-nav>li>.dropdown-menu {
      margin-bottom: 0;
      border-top-left-radius: 4px;
      border-top-right-radius: 4px;
      border-bottom-right-radius: 0;
      border-bottom-left-radius: 0
  }
  
  .navbar-btn {
      margin-top: 8px;
      margin-bottom: 8px
  }
  
  .navbar-btn.btn-sm {
      margin-top: 10px;
      margin-bottom: 10px
  }
  
  .navbar-btn.btn-xs {
      margin-top: 14px;
      margin-bottom: 14px
  }
  
  .navbar-text {
      margin-top: 15px;
      margin-bottom: 15px
  }
  
  @media (min-width:768px) {
      .navbar-text {
          float: left;
          margin-right: 15px;
          margin-left: 15px
      }
  }
  
  @media (min-width:768px) {
      .navbar-left {
          float: left !important
      }
      .navbar-right {
          float: right !important;
          margin-right: -15px
      }
      .navbar-right~.navbar-right {
          margin-right: 0
      }
  }
  
  .navbar-default {
      background-color: #f8f8f8;
      border-color: #e7e7e7
  }
  
  .navbar-default .navbar-brand {
      color: #777
  }
  
  .navbar-default .navbar-brand:focus,
  .navbar-default .navbar-brand:hover {
      color: #5e5e5e;
      background-color: transparent
  }
  
  .navbar-default .navbar-text {
      color: #777
  }
  
  .navbar-default .navbar-nav>li>a {
      color: #777
  }
  
  .navbar-default .navbar-nav>li>a:focus,
  .navbar-default .navbar-nav>li>a:hover {
      color: #333;
      background-color: transparent
  }
  
  .navbar-default .navbar-nav>.active>a,
  .navbar-default .navbar-nav>.active>a:focus,
  .navbar-default .navbar-nav>.active>a:hover {
      color: #555;
      background-color: #e7e7e7
  }
  
  .navbar-default .navbar-nav>.disabled>a,
  .navbar-default .navbar-nav>.disabled>a:focus,
  .navbar-default .navbar-nav>.disabled>a:hover {
      color: #ccc;
      background-color: transparent
  }
  
  .navbar-default .navbar-toggle {
      border-color: #ddd
  }
  
  .navbar-default .navbar-toggle:focus,
  .navbar-default .navbar-toggle:hover {
      background-color: #ddd
  }
  
  .navbar-default .navbar-toggle .icon-bar {
      background-color: #888
  }
  
  .navbar-default .navbar-collapse,
  .navbar-default .navbar-form {
      border-color: #e7e7e7
  }
  
  .navbar-default .navbar-nav>.open>a,
  .navbar-default .navbar-nav>.open>a:focus,
  .navbar-default .navbar-nav>.open>a:hover {
      color: #555;
      background-color: #e7e7e7
  }
  
  @media (max-width:767px) {
      .navbar-default .navbar-nav .open .dropdown-menu>li>a {
          color: #777
      }
      .navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,
      .navbar-default .navbar-nav .open .dropdown-menu>li>a:hover {
          color: #333;
          background-color: transparent
      }
      .navbar-default .navbar-nav .open .dropdown-menu>.active>a,
      .navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,
      .navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover {
          color: #555;
          background-color: #e7e7e7
      }
      .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,
      .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,
      .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover {
          color: #ccc;
          background-color: transparent
      }
  }
  
  .navbar-default .navbar-link {
      color: #777
  }
  
  .navbar-default .navbar-link:hover {
      color: #333
  }
  
  .navbar-default .btn-link {
      color: #777
  }
  
  .navbar-default .btn-link:focus,
  .navbar-default .btn-link:hover {
      color: #333
  }
  
  .navbar-default .btn-link[disabled]:focus,
  .navbar-default .btn-link[disabled]:hover,
  fieldset[disabled] .navbar-default .btn-link:focus,
  fieldset[disabled] .navbar-default .btn-link:hover {
      color: #ccc
  }
  
  .navbar-inverse {
      background-color: #222;
      border-color: #080808
  }
  
  .navbar-inverse .navbar-brand {
      color: #9d9d9d
  }
  
  .navbar-inverse .navbar-brand:focus,
  .navbar-inverse .navbar-brand:hover {
      color: #fff;
      background-color: transparent
  }
  
  .navbar-inverse .navbar-text {
      color: #9d9d9d
  }
  
  .navbar-inverse .navbar-nav>li>a {
      color: #9d9d9d
  }
  
  .navbar-inverse .navbar-nav>li>a:focus,
  .navbar-inverse .navbar-nav>li>a:hover {
      color: #fff;
      background-color: transparent
  }
  
  .navbar-inverse .navbar-nav>.active>a,
  .navbar-inverse .navbar-nav>.active>a:focus,
  .navbar-inverse .navbar-nav>.active>a:hover {
      color: #fff;
      background-color: #080808
  }
  
  .navbar-inverse .navbar-nav>.disabled>a,
  .navbar-inverse .navbar-nav>.disabled>a:focus,
  .navbar-inverse .navbar-nav>.disabled>a:hover {
      color: #444;
      background-color: transparent
  }
  
  .navbar-inverse .navbar-toggle {
      border-color: #333
  }
  
  .navbar-inverse .navbar-toggle:focus,
  .navbar-inverse .navbar-toggle:hover {
      background-color: #333
  }
  
  .navbar-inverse .navbar-toggle .icon-bar {
      background-color: #fff
  }
  
  .navbar-inverse .navbar-collapse,
  .navbar-inverse .navbar-form {
      border-color: #101010
  }
  
  .navbar-inverse .navbar-nav>.open>a,
  .navbar-inverse .navbar-nav>.open>a:focus,
  .navbar-inverse .navbar-nav>.open>a:hover {
      color: #fff;
      background-color: #080808
  }
  
  @media (max-width:767px) {
      .navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header {
          border-color: #080808
      }
      .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
          background-color: #080808
      }
      .navbar-inverse .navbar-nav .open .dropdown-menu>li>a {
          color: #9d9d9d
      }
      .navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,
      .navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover {
          color: #fff;
          background-color: transparent
      }
      .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,
      .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,
      .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover {
          color: #fff;
          background-color: #080808
      }
      .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,
      .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,
      .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover {
          color: #444;
          background-color: transparent
      }
  }
  
  .navbar-inverse .navbar-link {
      color: #9d9d9d
  }
  
  .navbar-inverse .navbar-link:hover {
      color: #fff
  }
  
  .navbar-inverse .btn-link {
      color: #9d9d9d
  }
  
  .navbar-inverse .btn-link:focus,
  .navbar-inverse .btn-link:hover {
      color: #fff
  }
  
  .navbar-inverse .btn-link[disabled]:focus,
  .navbar-inverse .btn-link[disabled]:hover,
  fieldset[disabled] .navbar-inverse .btn-link:focus,
  fieldset[disabled] .navbar-inverse .btn-link:hover {
      color: #444
  }
  
  .breadcrumb {
      padding: 8px 15px;
      margin-bottom: 20px;
      list-style: none;
      background-color: #f5f5f5;
      border-radius: 4px
  }
  
  .breadcrumb>li {
      display: inline-block
  }
  
  .breadcrumb>li+li:before {
      padding: 0 5px;
      color: #ccc;
      content: "/\00a0"
  }
  
  .breadcrumb>.active {
      color: #777
  }
  
  .pagination {
      display: inline-block;
      padding-left: 0;
      margin: 20px 0;
      border-radius: 4px
  }
  
  .pagination>li {
      display: inline
  }
  
  .pagination>li>a,
  .pagination>li>span {
      position: relative;
      float: left;
      padding: 6px 12px;
      margin-left: -1px;
      line-height: 1.42857143;
      color: #337ab7;
      text-decoration: none;
      background-color: #fff;
      border: 1px solid #ddd
  }
  
  .pagination>li:first-child>a,
  .pagination>li:first-child>span {
      margin-left: 0;
      border-top-left-radius: 4px;
      border-bottom-left-radius: 4px
  }
  
  .pagination>li:last-child>a,
  .pagination>li:last-child>span {
      border-top-right-radius: 4px;
      border-bottom-right-radius: 4px
  }
  
  .pagination>li>a:focus,
  .pagination>li>a:hover,
  .pagination>li>span:focus,
  .pagination>li>span:hover {
      z-index: 2;
      color: #23527c;
      background-color: #eee;
      border-color: #ddd
  }
  
  .pagination>.active>a,
  .pagination>.active>a:focus,
  .pagination>.active>a:hover,
  .pagination>.active>span,
  .pagination>.active>span:focus,
  .pagination>.active>span:hover {
      z-index: 3;
      color: #fff;
      cursor: default;
      background-color: #337ab7;
      border-color: #337ab7
  }
  
  .pagination>.disabled>a,
  .pagination>.disabled>a:focus,
  .pagination>.disabled>a:hover,
  .pagination>.disabled>span,
  .pagination>.disabled>span:focus,
  .pagination>.disabled>span:hover {
      color: #777;
      cursor: not-allowed;
      background-color: #fff;
      border-color: #ddd
  }
  
  .pagination-lg>li>a,
  .pagination-lg>li>span {
      padding: 10px 16px;
      font-size: 18px;
      line-height: 1.3333333
  }
  
  .pagination-lg>li:first-child>a,
  .pagination-lg>li:first-child>span {
      border-top-left-radius: 6px;
      border-bottom-left-radius: 6px
  }
  
  .pagination-lg>li:last-child>a,
  .pagination-lg>li:last-child>span {
      border-top-right-radius: 6px;
      border-bottom-right-radius: 6px
  }
  
  .pagination-sm>li>a,
  .pagination-sm>li>span {
      padding: 5px 10px;
      font-size: 12px;
      line-height: 1.5
  }
  
  .pagination-sm>li:first-child>a,
  .pagination-sm>li:first-child>span {
      border-top-left-radius: 3px;
      border-bottom-left-radius: 3px
  }
  
  .pagination-sm>li:last-child>a,
  .pagination-sm>li:last-child>span {
      border-top-right-radius: 3px;
      border-bottom-right-radius: 3px
  }
  
  .pager {
      padding-left: 0;
      margin: 20px 0;
      text-align: center;
      list-style: none
  }
  
  .pager li {
      display: inline
  }
  
  .pager li>a,
  .pager li>span {
      display: inline-block;
      padding: 5px 14px;
      background-color: #fff;
      border: 1px solid #ddd;
      border-radius: 15px
  }
  
  .pager li>a:focus,
  .pager li>a:hover {
      text-decoration: none;
      background-color: #eee
  }
  
  .pager .next>a,
  .pager .next>span {
      float: right
  }
  
  .pager .previous>a,
  .pager .previous>span {
      float: left
  }
  
  .pager .disabled>a,
  .pager .disabled>a:focus,
  .pager .disabled>a:hover,
  .pager .disabled>span {
      color: #777;
      cursor: not-allowed;
      background-color: #fff
  }
  
  .label {
      display: inline;
      padding: .2em .6em .3em;
      font-size: 75%;
      font-weight: 700;
      line-height: 1;
      color: #fff;
      text-align: center;
      white-space: nowrap;
      vertical-align: baseline;
      border-radius: .25em
  }
  
  a.label:focus,
  a.label:hover {
      color: #fff;
      text-decoration: none;
      cursor: pointer
  }
  
  .label:empty {
      display: none
  }
  
  .btn .label {
      position: relative;
      top: -1px
  }
  
  .label-default {
      background-color: #777
  }
  
  .label-default[href]:focus,
  .label-default[href]:hover {
      background-color: #5e5e5e
  }
  
  .label-primary {
      background-color: #337ab7
  }
  
  .label-primary[href]:focus,
  .label-primary[href]:hover {
      background-color: #286090
  }
  
  .label-success {
      background-color: #5cb85c
  }
  
  .label-success[href]:focus,
  .label-success[href]:hover {
      background-color: #449d44
  }
  
  .label-info {
      background-color: #5bc0de
  }
  
  .label-info[href]:focus,
  .label-info[href]:hover {
      background-color: #31b0d5
  }
  
  .label-warning {
      background-color: #f0ad4e
  }
  
  .label-warning[href]:focus,
  .label-warning[href]:hover {
      background-color: #ec971f
  }
  
  .label-danger {
      background-color: #d9534f
  }
  
  .label-danger[href]:focus,
  .label-danger[href]:hover {
      background-color: #c9302c
  }
  
  .badge {
      display: inline-block;
      min-width: 10px;
      padding: 3px 7px;
      font-size: 12px;
      font-weight: 700;
      line-height: 1;
      color: #fff;
      text-align: center;
      white-space: nowrap;
      vertical-align: middle;
      background-color: #777;
      border-radius: 10px
  }
  
  .badge:empty {
      display: none
  }
  
  .btn .badge {
      position: relative;
      top: -1px
  }
  
  .btn-group-xs>.btn .badge,
  .btn-xs .badge {
      top: 0;
      padding: 1px 5px
  }
  
  a.badge:focus,
  a.badge:hover {
      color: #fff;
      text-decoration: none;
      cursor: pointer
  }
  
  .list-group-item.active>.badge,
  .nav-pills>.active>a>.badge {
      color: #337ab7;
      background-color: #fff
  }
  
  .list-group-item>.badge {
      float: right
  }
  
  .list-group-item>.badge+.badge {
      margin-right: 5px
  }
  
  .nav-pills>li>a>.badge {
      margin-left: 3px
  }
  
  .jumbotron {
      padding-top: 30px;
      padding-bottom: 30px;
      margin-bottom: 30px;
      color: inherit;
      background-color: #eee
  }
  
  .jumbotron .h1,
  .jumbotron h1 {
      color: inherit
  }
  
  .jumbotron p {
      margin-bottom: 15px;
      font-size: 21px;
      font-weight: 200
  }
  
  .jumbotron>hr {
      border-top-color: #d5d5d5
  }
  
  .container .jumbotron,
  .container-fluid .jumbotron {
      padding-right: 15px;
      padding-left: 15px;
      border-radius: 6px
  }
  
  .jumbotron .container {
      max-width: 100%
  }
  
  @media screen and (min-width:768px) {
      .jumbotron {
          padding-top: 48px;
          padding-bottom: 48px
      }
      .container .jumbotron,
      .container-fluid .jumbotron {
          padding-right: 60px;
          padding-left: 60px
      }
      .jumbotron .h1,
      .jumbotron h1 {
          font-size: 63px
      }
  }
  
  .thumbnail {
      display: block;
      padding: 4px;
      margin-bottom: 20px;
      line-height: 1.42857143;
      background-color: #fff;
      border: 1px solid #ddd;
      border-radius: 4px;
      -webkit-transition: border .2s ease-in-out;
      -o-transition: border .2s ease-in-out;
      transition: border .2s ease-in-out
  }
  
  .thumbnail a>img,
  .thumbnail>img {
      margin-right: auto;
      margin-left: auto
  }
  
  a.thumbnail.active,
  a.thumbnail:focus,
  a.thumbnail:hover {
      border-color: #337ab7
  }
  
  .thumbnail .caption {
      padding: 9px;
      color: #333
  }
  
  .alert {
      padding: 15px;
      margin-bottom: 20px;
      border: 1px solid transparent;
      border-radius: 4px
  }
  
  .alert h4 {
      margin-top: 0;
      color: inherit
  }
  
  .alert .alert-link {
      font-weight: 700
  }
  
  .alert>p,
  .alert>ul {
      margin-bottom: 0
  }
  
  .alert>p+p {
      margin-top: 5px
  }
  
  .alert-dismissable,
  .alert-dismissible {
      padding-right: 35px
  }
  
  .alert-dismissable .close,
  .alert-dismissible .close {
      position: relative;
      top: -2px;
      right: -21px;
      color: inherit
  }
  
  .alert-success {
      color: #3c763d;
      background-color: #dff0d8;
      border-color: #d6e9c6
  }
  
  .alert-success hr {
      border-top-color: #c9e2b3
  }
  
  .alert-success .alert-link {
      color: #2b542c
  }
  
  .alert-info {
      color: #31708f;
      background-color: #d9edf7;
      border-color: #bce8f1
  }
  
  .alert-info hr {
      border-top-color: #a6e1ec
  }
  
  .alert-info .alert-link {
      color: #245269
  }
  
  .alert-warning {
      color: #8a6d3b;
      background-color: #fcf8e3;
      border-color: #faebcc
  }
  
  .alert-warning hr {
      border-top-color: #f7e1b5
  }
  
  .alert-warning .alert-link {
      color: #66512c
  }
  
  .alert-danger {
      color: #a94442;
      background-color: #f2dede;
      border-color: #ebccd1
  }
  
  .alert-danger hr {
      border-top-color: #e4b9c0
  }
  
  .alert-danger .alert-link {
      color: #843534
  }
  
  @-webkit-keyframes progress-bar-stripes {
      from {
          background-position: 40px 0
      }
      to {
          background-position: 0 0
      }
  }
  
  @-o-keyframes progress-bar-stripes {
      from {
          background-position: 40px 0
      }
      to {
          background-position: 0 0
      }
  }
  
  @keyframes progress-bar-stripes {
      from {
          background-position: 40px 0
      }
      to {
          background-position: 0 0
      }
  }
  
  .progress {
      height: 20px;
      margin-bottom: 20px;
      overflow: hidden;
      background-color: #f5f5f5;
      border-radius: 4px;
      -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
      box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1)
  }
  
  .progress-bar {
      float: left;
      width: 0;
      height: 100%;
      font-size: 12px;
      line-height: 20px;
      color: #fff;
      text-align: center;
      background-color: #337ab7;
      -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
      box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
      -webkit-transition: width .6s ease;
      -o-transition: width .6s ease;
      transition: width .6s ease
  }
  
  .progress-bar-striped,
  .progress-striped .progress-bar {
      background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
      background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
      background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
      -webkit-background-size: 40px 40px;
      background-size: 40px 40px
  }
  
  .progress-bar.active,
  .progress.active .progress-bar {
      -webkit-animation: progress-bar-stripes 2s linear infinite;
      -o-animation: progress-bar-stripes 2s linear infinite;
      animation: progress-bar-stripes 2s linear infinite
  }
  
  .progress-bar-success {
      background-color: #5cb85c
  }
  
  .progress-striped .progress-bar-success {
      background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
      background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
      background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent)
  }
  
  .progress-bar-info {
      background-color: #5bc0de
  }
  
  .progress-striped .progress-bar-info {
      background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
      background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
      background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent)
  }
  
  .progress-bar-warning {
      background-color: #f0ad4e
  }
  
  .progress-striped .progress-bar-warning {
      background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
      background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
      background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent)
  }
  
  .progress-bar-danger {
      background-color: #d9534f
  }
  
  .progress-striped .progress-bar-danger {
      background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
      background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
      background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent)
  }
  
  .media {
      margin-top: 15px
  }
  
  .media:first-child {
      margin-top: 0
  }
  
  .media,
  .media-body {
      overflow: hidden;
      zoom: 1
  }
  
  .media-body {
      width: 10000px
  }
  
  .media-object {
      display: block
  }
  
  .media-object.img-thumbnail {
      max-width: none
  }
  
  .media-right,
  .media>.pull-right {
      padding-left: 10px
  }
  
  .media-left,
  .media>.pull-left {
      padding-right: 10px
  }
  
  .media-body,
  .media-left,
  .media-right {
      display: table-cell;
      vertical-align: top
  }
  
  .media-middle {
      vertical-align: middle
  }
  
  .media-bottom {
      vertical-align: bottom
  }
  
  .media-heading {
      margin-top: 0;
      margin-bottom: 5px
  }
  
  .media-list {
      padding-left: 0;
      list-style: none
  }
  
  .list-group {
      padding-left: 0;
      margin-bottom: 20px
  }
  
  .list-group-item {
      position: relative;
      display: block;
      padding: 10px 15px;
      margin-bottom: -1px;
      background-color: #fff;
      border: 1px solid #ddd
  }
  
  .list-group-item:first-child {
      border-top-left-radius: 4px;
      border-top-right-radius: 4px
  }
  
  .list-group-item:last-child {
      margin-bottom: 0;
      border-bottom-right-radius: 4px;
      border-bottom-left-radius: 4px
  }
  
  a.list-group-item,
  button.list-group-item {
      color: #555
  }
  
  a.list-group-item .list-group-item-heading,
  button.list-group-item .list-group-item-heading {
      color: #333
  }
  
  a.list-group-item:focus,
  a.list-group-item:hover,
  button.list-group-item:focus,
  button.list-group-item:hover {
      color: #555;
      text-decoration: none;
      background-color: #f5f5f5
  }
  
  button.list-group-item {
      width: 100%;
      text-align: left
  }
  
  .list-group-item.disabled,
  .list-group-item.disabled:focus,
  .list-group-item.disabled:hover {
      color: #777;
      cursor: not-allowed;
      background-color: #eee
  }
  
  .list-group-item.disabled .list-group-item-heading,
  .list-group-item.disabled:focus .list-group-item-heading,
  .list-group-item.disabled:hover .list-group-item-heading {
      color: inherit
  }
  
  .list-group-item.disabled .list-group-item-text,
  .list-group-item.disabled:focus .list-group-item-text,
  .list-group-item.disabled:hover .list-group-item-text {
      color: #777
  }
  
  .list-group-item.active,
  .list-group-item.active:focus,
  .list-group-item.active:hover {
      z-index: 2;
      color: #fff;
      background-color: #337ab7;
      border-color: #337ab7
  }
  
  .list-group-item.active .list-group-item-heading,
  .list-group-item.active .list-group-item-heading>.small,
  .list-group-item.active .list-group-item-heading>small,
  .list-group-item.active:focus .list-group-item-heading,
  .list-group-item.active:focus .list-group-item-heading>.small,
  .list-group-item.active:focus .list-group-item-heading>small,
  .list-group-item.active:hover .list-group-item-heading,
  .list-group-item.active:hover .list-group-item-heading>.small,
  .list-group-item.active:hover .list-group-item-heading>small {
      color: inherit
  }
  
  .list-group-item.active .list-group-item-text,
  .list-group-item.active:focus .list-group-item-text,
  .list-group-item.active:hover .list-group-item-text {
      color: #c7ddef
  }
  
  .list-group-item-success {
      color: #3c763d;
      background-color: #dff0d8
  }
  
  a.list-group-item-success,
  button.list-group-item-success {
      color: #3c763d
  }
  
  a.list-group-item-success .list-group-item-heading,
  button.list-group-item-success .list-group-item-heading {
      color: inherit
  }
  
  a.list-group-item-success:focus,
  a.list-group-item-success:hover,
  button.list-group-item-success:focus,
  button.list-group-item-success:hover {
      color: #3c763d;
      background-color: #d0e9c6
  }
  
  a.list-group-item-success.active,
  a.list-group-item-success.active:focus,
  a.list-group-item-success.active:hover,
  button.list-group-item-success.active,
  button.list-group-item-success.active:focus,
  button.list-group-item-success.active:hover {
      color: #fff;
      background-color: #3c763d;
      border-color: #3c763d
  }
  
  .list-group-item-info {
      color: #31708f;
      background-color: #d9edf7
  }
  
  a.list-group-item-info,
  button.list-group-item-info {
      color: #31708f
  }
  
  a.list-group-item-info .list-group-item-heading,
  button.list-group-item-info .list-group-item-heading {
      color: inherit
  }
  
  a.list-group-item-info:focus,
  a.list-group-item-info:hover,
  button.list-group-item-info:focus,
  button.list-group-item-info:hover {
      color: #31708f;
      background-color: #c4e3f3
  }
  
  a.list-group-item-info.active,
  a.list-group-item-info.active:focus,
  a.list-group-item-info.active:hover,
  button.list-group-item-info.active,
  button.list-group-item-info.active:focus,
  button.list-group-item-info.active:hover {
      color: #fff;
      background-color: #31708f;
      border-color: #31708f
  }
  
  .list-group-item-warning {
      color: #8a6d3b;
      background-color: #fcf8e3
  }
  
  a.list-group-item-warning,
  button.list-group-item-warning {
      color: #8a6d3b
  }
  
  a.list-group-item-warning .list-group-item-heading,
  button.list-group-item-warning .list-group-item-heading {
      color: inherit
  }
  
  a.list-group-item-warning:focus,
  a.list-group-item-warning:hover,
  button.list-group-item-warning:focus,
  button.list-group-item-warning:hover {
      color: #8a6d3b;
      background-color: #faf2cc
  }
  
  a.list-group-item-warning.active,
  a.list-group-item-warning.active:focus,
  a.list-group-item-warning.active:hover,
  button.list-group-item-warning.active,
  button.list-group-item-warning.active:focus,
  button.list-group-item-warning.active:hover {
      color: #fff;
      background-color: #8a6d3b;
      border-color: #8a6d3b
  }
  
  .list-group-item-danger {
      color: #a94442;
      background-color: #f2dede
  }
  
  a.list-group-item-danger,
  button.list-group-item-danger {
      color: #a94442
  }
  
  a.list-group-item-danger .list-group-item-heading,
  button.list-group-item-danger .list-group-item-heading {
      color: inherit
  }
  
  a.list-group-item-danger:focus,
  a.list-group-item-danger:hover,
  button.list-group-item-danger:focus,
  button.list-group-item-danger:hover {
      color: #a94442;
      background-color: #ebcccc
  }
  
  a.list-group-item-danger.active,
  a.list-group-item-danger.active:focus,
  a.list-group-item-danger.active:hover,
  button.list-group-item-danger.active,
  button.list-group-item-danger.active:focus,
  button.list-group-item-danger.active:hover {
      color: #fff;
      background-color: #a94442;
      border-color: #a94442
  }
  
  .list-group-item-heading {
      margin-top: 0;
      margin-bottom: 5px
  }
  
  .list-group-item-text {
      margin-bottom: 0;
      line-height: 1.3
  }
  
  .panel {
      margin-bottom: 20px;
      background-color: #fff;
      border: 1px solid transparent;
      border-radius: 4px;
      -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
      box-shadow: 0 1px 1px rgba(0, 0, 0, .05)
  }
  
  .panel-body {
      padding: 15px
  }
  
  .panel-heading {
      padding: 10px 15px;
      border-bottom: 1px solid transparent;
      border-top-left-radius: 3px;
      border-top-right-radius: 3px
  }
  
  .panel-heading>.dropdown .dropdown-toggle {
      color: inherit
  }
  
  .panel-title {
      margin-top: 0;
      margin-bottom: 0;
      font-size: 16px;
      color: inherit
  }
  
  .panel-title>.small,
  .panel-title>.small>a,
  .panel-title>a,
  .panel-title>small,
  .panel-title>small>a {
      color: inherit
  }
  
  .panel-footer {
      padding: 10px 15px;
      background-color: #f5f5f5;
      border-top: 1px solid #ddd;
      border-bottom-right-radius: 3px;
      border-bottom-left-radius: 3px
  }
  
  .panel>.list-group,
  .panel>.panel-collapse>.list-group {
      margin-bottom: 0
  }
  
  .panel>.list-group .list-group-item,
  .panel>.panel-collapse>.list-group .list-group-item {
      border-width: 1px 0;
      border-radius: 0
  }
  
  .panel>.list-group:first-child .list-group-item:first-child,
  .panel>.panel-collapse>.list-group:first-child .list-group-item:first-child {
      border-top: 0;
      border-top-left-radius: 3px;
      border-top-right-radius: 3px
  }
  
  .panel>.list-group:last-child .list-group-item:last-child,
  .panel>.panel-collapse>.list-group:last-child .list-group-item:last-child {
      border-bottom: 0;
      border-bottom-right-radius: 3px;
      border-bottom-left-radius: 3px
  }
  
  .panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child {
      border-top-left-radius: 0;
      border-top-right-radius: 0
  }
  
  .panel-heading+.list-group .list-group-item:first-child {
      border-top-width: 0
  }
  
  .list-group+.panel-footer {
      border-top-width: 0
  }
  
  .panel>.panel-collapse>.table,
  .panel>.table,
  .panel>.table-responsive>.table {
      margin-bottom: 0
  }
  
  .panel>.panel-collapse>.table caption,
  .panel>.table caption,
  .panel>.table-responsive>.table caption {
      padding-right: 15px;
      padding-left: 15px
  }
  
  .panel>.table-responsive:first-child>.table:first-child,
  .panel>.table:first-child {
      border-top-left-radius: 3px;
      border-top-right-radius: 3px
  }
  
  .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,
  .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,
  .panel>.table:first-child>tbody:first-child>tr:first-child,
  .panel>.table:first-child>thead:first-child>tr:first-child {
      border-top-left-radius: 3px;
      border-top-right-radius: 3px
  }
  
  .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,
  .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,
  .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,
  .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,
  .panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,
  .panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,
  .panel>.table:first-child>thead:first-child>tr:first-child td:first-child,
  .panel>.table:first-child>thead:first-child>tr:first-child th:first-child {
      border-top-left-radius: 3px
  }
  
  .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,
  .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,
  .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,
  .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,
  .panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,
  .panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,
  .panel>.table:first-child>thead:first-child>tr:first-child td:last-child,
  .panel>.table:first-child>thead:first-child>tr:first-child th:last-child {
      border-top-right-radius: 3px
  }
  
  .panel>.table-responsive:last-child>.table:last-child,
  .panel>.table:last-child {
      border-bottom-right-radius: 3px;
      border-bottom-left-radius: 3px
  }
  
  .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,
  .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,
  .panel>.table:last-child>tbody:last-child>tr:last-child,
  .panel>.table:last-child>tfoot:last-child>tr:last-child {
      border-bottom-right-radius: 3px;
      border-bottom-left-radius: 3px
  }
  
  .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,
  .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,
  .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,
  .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,
  .panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,
  .panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,
  .panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,
  .panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child {
      border-bottom-left-radius: 3px
  }
  
  .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,
  .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,
  .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,
  .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,
  .panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,
  .panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,
  .panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,
  .panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child {
      border-bottom-right-radius: 3px
  }
  
  .panel>.panel-body+.table,
  .panel>.panel-body+.table-responsive,
  .panel>.table+.panel-body,
  .panel>.table-responsive+.panel-body {
      border-top: 1px solid #ddd
  }
  
  .panel>.table>tbody:first-child>tr:first-child td,
  .panel>.table>tbody:first-child>tr:first-child th {
      border-top: 0
  }
  
  .panel>.table-bordered,
  .panel>.table-responsive>.table-bordered {
      border: 0
  }
  
  .panel>.table-bordered>tbody>tr>td:first-child,
  .panel>.table-bordered>tbody>tr>th:first-child,
  .panel>.table-bordered>tfoot>tr>td:first-child,
  .panel>.table-bordered>tfoot>tr>th:first-child,
  .panel>.table-bordered>thead>tr>td:first-child,
  .panel>.table-bordered>thead>tr>th:first-child,
  .panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,
  .panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,
  .panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,
  .panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,
  .panel>.table-responsive>.table-bordered>thead>tr>td:first-child,
  .panel>.table-responsive>.table-bordered>thead>tr>th:first-child {
      border-left: 0
  }
  
  .panel>.table-bordered>tbody>tr>td:last-child,
  .panel>.table-bordered>tbody>tr>th:last-child,
  .panel>.table-bordered>tfoot>tr>td:last-child,
  .panel>.table-bordered>tfoot>tr>th:last-child,
  .panel>.table-bordered>thead>tr>td:last-child,
  .panel>.table-bordered>thead>tr>th:last-child,
  .panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,
  .panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,
  .panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,
  .panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,
  .panel>.table-responsive>.table-bordered>thead>tr>td:last-child,
  .panel>.table-responsive>.table-bordered>thead>tr>th:last-child {
      border-right: 0
  }
  
  .panel>.table-bordered>tbody>tr:first-child>td,
  .panel>.table-bordered>tbody>tr:first-child>th,
  .panel>.table-bordered>thead>tr:first-child>td,
  .panel>.table-bordered>thead>tr:first-child>th,
  .panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,
  .panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,
  .panel>.table-responsive>.table-bordered>thead>tr:first-child>td,
  .panel>.table-responsive>.table-bordered>thead>tr:first-child>th {
      border-bottom: 0
  }
  
  .panel>.table-bordered>tbody>tr:last-child>td,
  .panel>.table-bordered>tbody>tr:last-child>th,
  .panel>.table-bordered>tfoot>tr:last-child>td,
  .panel>.table-bordered>tfoot>tr:last-child>th,
  .panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,
  .panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,
  .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,
  .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th {
      border-bottom: 0
  }
  
  .panel>.table-responsive {
      margin-bottom: 0;
      border: 0
  }
  
  .panel-group {
      margin-bottom: 20px
  }
  
  .panel-group .panel {
      margin-bottom: 0;
      border-radius: 4px
  }
  
  .panel-group .panel+.panel {
      margin-top: 5px
  }
  
  .panel-group .panel-heading {
      border-bottom: 0
  }
  
  .panel-group .panel-heading+.panel-collapse>.list-group,
  .panel-group .panel-heading+.panel-collapse>.panel-body {
      border-top: 1px solid #ddd
  }
  
  .panel-group .panel-footer {
      border-top: 0
  }
  
  .panel-group .panel-footer+.panel-collapse .panel-body {
      border-bottom: 1px solid #ddd
  }
  
  .panel-default {
      border-color: #ddd
  }
  
  .panel-default>.panel-heading {
      color: #333;
      background-color: #f5f5f5;
      border-color: #ddd
  }
  
  .panel-default>.panel-heading+.panel-collapse>.panel-body {
      border-top-color: #ddd
  }
  
  .panel-default>.panel-heading .badge {
      color: #f5f5f5;
      background-color: #333
  }
  
  .panel-default>.panel-footer+.panel-collapse>.panel-body {
      border-bottom-color: #ddd
  }
  
  .panel-primary {
      border-color: #337ab7
  }
  
  .panel-primary>.panel-heading {
      color: #fff;
      background-color: #337ab7;
      border-color: #337ab7
  }
  
  .panel-primary>.panel-heading+.panel-collapse>.panel-body {
      border-top-color: #337ab7
  }
  
  .panel-primary>.panel-heading .badge {
      color: #337ab7;
      background-color: #fff
  }
  
  .panel-primary>.panel-footer+.panel-collapse>.panel-body {
      border-bottom-color: #337ab7
  }
  
  .panel-success {
      border-color: #d6e9c6
  }
  
  .panel-success>.panel-heading {
      color: #3c763d;
      background-color: #dff0d8;
      border-color: #d6e9c6
  }
  
  .panel-success>.panel-heading+.panel-collapse>.panel-body {
      border-top-color: #d6e9c6
  }
  
  .panel-success>.panel-heading .badge {
      color: #dff0d8;
      background-color: #3c763d
  }
  
  .panel-success>.panel-footer+.panel-collapse>.panel-body {
      border-bottom-color: #d6e9c6
  }
  
  .panel-info {
      border-color: #bce8f1
  }
  
  .panel-info>.panel-heading {
      color: #31708f;
      background-color: #d9edf7;
      border-color: #bce8f1
  }
  
  .panel-info>.panel-heading+.panel-collapse>.panel-body {
      border-top-color: #bce8f1
  }
  
  .panel-info>.panel-heading .badge {
      color: #d9edf7;
      background-color: #31708f
  }
  
  .panel-info>.panel-footer+.panel-collapse>.panel-body {
      border-bottom-color: #bce8f1
  }
  
  .panel-warning {
      border-color: #faebcc
  }
  
  .panel-warning>.panel-heading {
      color: #8a6d3b;
      background-color: #fcf8e3;
      border-color: #faebcc
  }
  
  .panel-warning>.panel-heading+.panel-collapse>.panel-body {
      border-top-color: #faebcc
  }
  
  .panel-warning>.panel-heading .badge {
      color: #fcf8e3;
      background-color: #8a6d3b
  }
  
  .panel-warning>.panel-footer+.panel-collapse>.panel-body {
      border-bottom-color: #faebcc
  }
  
  .panel-danger {
      border-color: #ebccd1
  }
  
  .panel-danger>.panel-heading {
      color: #a94442;
      background-color: #f2dede;
      border-color: #ebccd1
  }
  
  .panel-danger>.panel-heading+.panel-collapse>.panel-body {
      border-top-color: #ebccd1
  }
  
  .panel-danger>.panel-heading .badge {
      color: #f2dede;
      background-color: #a94442
  }
  
  .panel-danger>.panel-footer+.panel-collapse>.panel-body {
      border-bottom-color: #ebccd1
  }
  
  .embed-responsive {
      position: relative;
      display: block;
      height: 0;
      padding: 0;
      overflow: hidden
  }
  
  .embed-responsive .embed-responsive-item,
  .embed-responsive embed,
  .embed-responsive iframe,
  .embed-responsive object,
  .embed-responsive video {
      position: absolute;
      top: 0;
      bottom: 0;
      left: 0;
      width: 100%;
      height: 100%;
      border: 0
  }
  
  .embed-responsive-16by9 {
      padding-bottom: 56.25%
  }
  
  .embed-responsive-4by3 {
      padding-bottom: 75%
  }
  
  .well {
      min-height: 20px;
      padding: 19px;
      margin-bottom: 20px;
      background-color: #f5f5f5;
      border: 1px solid #e3e3e3;
      border-radius: 4px;
      -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
      box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05)
  }
  
  .well blockquote {
      border-color: #ddd;
      border-color: rgba(0, 0, 0, .15)
  }
  
  .well-lg {
      padding: 24px;
      border-radius: 6px
  }
  
  .well-sm {
      padding: 9px;
      border-radius: 3px
  }
  
  .close {
      float: right;
      font-size: 21px;
      font-weight: 700;
      line-height: 1;
      color: #000;
      text-shadow: 0 1px 0 #fff;
      filter: alpha(opacity=20);
      opacity: .2
  }
  
  .close:focus,
  .close:hover {
      color: #000;
      text-decoration: none;
      cursor: pointer;
      filter: alpha(opacity=50);
      opacity: .5
  }
  
  button.close {
      -webkit-appearance: none;
      padding: 0;
      cursor: pointer;
      background: 0 0;
      border: 0
  }
  
  .modal-open {
      overflow: hidden
  }
  
  .modal {
      position: fixed;
      top: 0;
      right: 0;
      bottom: 0;
      left: 0;
      z-index: 1050;
      display: none;
      overflow: hidden;
      -webkit-overflow-scrolling: touch;
      outline: 0
  }
  
  .modal.fade .modal-dialog {
      -webkit-transition: -webkit-transform .3s ease-out;
      -o-transition: -o-transform .3s ease-out;
      transition: transform .3s ease-out;
      -webkit-transform: translate(0, -25%);
      -ms-transform: translate(0, -25%);
      -o-transform: translate(0, -25%);
      transform: translate(0, -25%)
  }
  
  .modal.in .modal-dialog {
      -webkit-transform: translate(0, 0);
      -ms-transform: translate(0, 0);
      -o-transform: translate(0, 0);
      transform: translate(0, 0)
  }
  
  .modal-open .modal {
      overflow-x: hidden;
      overflow-y: auto
  }
  
  .modal-dialog {
      position: relative;
      width: auto;
      margin: 10px
  }
  
  .modal-content {
      position: relative;
      background-color: #fff;
      -webkit-background-clip: padding-box;
      background-clip: padding-box;
      border: 1px solid #999;
      border: 1px solid rgba(0, 0, 0, .2);
      border-radius: 6px;
      outline: 0;
      -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
      box-shadow: 0 3px 9px rgba(0, 0, 0, .5)
  }
  
  .modal-backdrop {
      position: fixed;
      top: 0;
      right: 0;
      bottom: 0;
      left: 0;
      z-index: 1040;
      background-color: #000
  }
  
  .modal-backdrop.fade {
      filter: alpha(opacity=0);
      opacity: 0
  }
  
  .modal-backdrop.in {
      filter: alpha(opacity=50);
      opacity: .5
  }
  
  .modal-header {
      padding: 15px;
      border-bottom: 1px solid #e5e5e5
  }
  
  .modal-header .close {
      margin-top: -2px
  }
  
  .modal-title {
      margin: 0;
      line-height: 1.42857143
  }
  
  .modal-body {
      position: relative;
      padding: 15px
  }
  
  .modal-footer {
      padding: 15px;
      text-align: right;
      border-top: 1px solid #e5e5e5
  }
  
  .modal-footer .btn+.btn {
      margin-bottom: 0;
      margin-left: 5px
  }
  
  .modal-footer .btn-group .btn+.btn {
      margin-left: -1px
  }
  
  .modal-footer .btn-block+.btn-block {
      margin-left: 0
  }
  
  .modal-scrollbar-measure {
      position: absolute;
      top: -9999px;
      width: 50px;
      height: 50px;
      overflow: scroll
  }
  
  @media (min-width:768px) {
      .modal-dialog {
          width: 600px;
          margin: 30px auto
      }
      .modal-content {
          -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
          box-shadow: 0 5px 15px rgba(0, 0, 0, .5)
      }
      .modal-sm {
          width: 300px
      }
  }
  
  @media (min-width:992px) {
      .modal-lg {
          width: 900px
      }
  }
  
  .tooltip {
      position: absolute;
      z-index: 1070;
      display: block;
      font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
      font-size: 12px;
      font-style: normal;
      font-weight: 400;
      line-height: 1.42857143;
      text-align: left;
      text-align: start;
      text-decoration: none;
      text-shadow: none;
      text-transform: none;
      letter-spacing: normal;
      word-break: normal;
      word-spacing: normal;
      word-wrap: normal;
      white-space: normal;
      filter: alpha(opacity=0);
      opacity: 0;
      line-break: auto
  }
  
  .tooltip.in {
      filter: alpha(opacity=90);
      opacity: .9
  }
  
  .tooltip.top {
      padding: 5px 0;
      margin-top: -3px
  }
  
  .tooltip.right {
      padding: 0 5px;
      margin-left: 3px
  }
  
  .tooltip.bottom {
      padding: 5px 0;
      margin-top: 3px
  }
  
  .tooltip.left {
      padding: 0 5px;
      margin-left: -3px
  }
  
  .tooltip-inner {
      max-width: 200px;
      padding: 3px 8px;
      color: #fff;
      text-align: center;
      background-color: #000;
      border-radius: 4px
  }
  
  .tooltip-arrow {
      position: absolute;
      width: 0;
      height: 0;
      border-color: transparent;
      border-style: solid
  }
  
  .tooltip.top .tooltip-arrow {
      bottom: 0;
      left: 50%;
      margin-left: -5px;
      border-width: 5px 5px 0;
      border-top-color: #000
  }
  
  .tooltip.top-left .tooltip-arrow {
      right: 5px;
      bottom: 0;
      margin-bottom: -5px;
      border-width: 5px 5px 0;
      border-top-color: #000
  }
  
  .tooltip.top-right .tooltip-arrow {
      bottom: 0;
      left: 5px;
      margin-bottom: -5px;
      border-width: 5px 5px 0;
      border-top-color: #000
  }
  
  .tooltip.right .tooltip-arrow {
      top: 50%;
      left: 0;
      margin-top: -5px;
      border-width: 5px 5px 5px 0;
      border-right-color: #000
  }
  
  .tooltip.left .tooltip-arrow {
      top: 50%;
      right: 0;
      margin-top: -5px;
      border-width: 5px 0 5px 5px;
      border-left-color: #000
  }
  
  .tooltip.bottom .tooltip-arrow {
      top: 0;
      left: 50%;
      margin-left: -5px;
      border-width: 0 5px 5px;
      border-bottom-color: #000
  }
  
  .tooltip.bottom-left .tooltip-arrow {
      top: 0;
      right: 5px;
      margin-top: -5px;
      border-width: 0 5px 5px;
      border-bottom-color: #000
  }
  
  .tooltip.bottom-right .tooltip-arrow {
      top: 0;
      left: 5px;
      margin-top: -5px;
      border-width: 0 5px 5px;
      border-bottom-color: #000
  }
  
  .popover {
      position: absolute;
      top: 0;
      left: 0;
      z-index: 1060;
      display: none;
      max-width: 276px;
      padding: 1px;
      font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
      font-size: 14px;
      font-style: normal;
      font-weight: 400;
      line-height: 1.42857143;
      text-align: left;
      text-align: start;
      text-decoration: none;
      text-shadow: none;
      text-transform: none;
      letter-spacing: normal;
      word-break: normal;
      word-spacing: normal;
      word-wrap: normal;
      white-space: normal;
      background-color: #fff;
      -webkit-background-clip: padding-box;
      background-clip: padding-box;
      border: 1px solid #ccc;
      border: 1px solid rgba(0, 0, 0, .2);
      border-radius: 6px;
      -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
      box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
      line-break: auto
  }
  
  .popover.top {
      margin-top: -10px
  }
  
  .popover.right {
      margin-left: 10px
  }
  
  .popover.bottom {
      margin-top: 10px
  }
  
  .popover.left {
      margin-left: -10px
  }
  
  .popover-title {
      padding: 8px 14px;
      margin: 0;
      font-size: 14px;
      background-color: #f7f7f7;
      border-bottom: 1px solid #ebebeb;
      border-radius: 5px 5px 0 0
  }
  
  .popover-content {
      padding: 9px 14px
  }
  
  .popover>.arrow,
  .popover>.arrow:after {
      position: absolute;
      display: block;
      width: 0;
      height: 0;
      border-color: transparent;
      border-style: solid
  }
  
  .popover>.arrow {
      border-width: 11px
  }
  
  .popover>.arrow:after {
      content: "";
      border-width: 10px
  }
  
  .popover.top>.arrow {
      bottom: -11px;
      left: 50%;
      margin-left: -11px;
      border-top-color: #999;
      border-top-color: rgba(0, 0, 0, .25);
      border-bottom-width: 0
  }
  
  .popover.top>.arrow:after {
      bottom: 1px;
      margin-left: -10px;
      content: " ";
      border-top-color: #fff;
      border-bottom-width: 0
  }
  
  .popover.right>.arrow {
      top: 50%;
      left: -11px;
      margin-top: -11px;
      border-right-color: #999;
      border-right-color: rgba(0, 0, 0, .25);
      border-left-width: 0
  }
  
  .popover.right>.arrow:after {
      bottom: -10px;
      left: 1px;
      content: " ";
      border-right-color: #fff;
      border-left-width: 0
  }
  
  .popover.bottom>.arrow {
      top: -11px;
      left: 50%;
      margin-left: -11px;
      border-top-width: 0;
      border-bottom-color: #999;
      border-bottom-color: rgba(0, 0, 0, .25)
  }
  
  .popover.bottom>.arrow:after {
      top: 1px;
      margin-left: -10px;
      content: " ";
      border-top-width: 0;
      border-bottom-color: #fff
  }
  
  .popover.left>.arrow {
      top: 50%;
      right: -11px;
      margin-top: -11px;
      border-right-width: 0;
      border-left-color: #999;
      border-left-color: rgba(0, 0, 0, .25)
  }
  
  .popover.left>.arrow:after {
      right: 1px;
      bottom: -10px;
      content: " ";
      border-right-width: 0;
      border-left-color: #fff
  }
  
  .carousel {
      position: relative
  }
  
  .carousel-inner {
      position: relative;
      width: 100%;
      overflow: hidden
  }
  
  .carousel-inner>.item {
      position: relative;
      display: none;
      -webkit-transition: .6s ease-in-out left;
      -o-transition: .6s ease-in-out left;
      transition: .6s ease-in-out left
  }
  
  .carousel-inner>.item>a>img,
  .carousel-inner>.item>img {
      line-height: 1
  }
  
  @media all and (transform-3d),
  (-webkit-transform-3d) {
      .carousel-inner>.item {
          -webkit-transition: -webkit-transform .6s ease-in-out;
          -o-transition: -o-transform .6s ease-in-out;
          transition: transform .6s ease-in-out;
          -webkit-backface-visibility: hidden;
          backface-visibility: hidden;
          -webkit-perspective: 1000px;
          perspective: 1000px
      }
      .carousel-inner>.item.active.right,
      .carousel-inner>.item.next {
          left: 0;
          -webkit-transform: translate3d(100%, 0, 0);
          transform: translate3d(100%, 0, 0)
      }
      .carousel-inner>.item.active.left,
      .carousel-inner>.item.prev {
          left: 0;
          -webkit-transform: translate3d(-100%, 0, 0);
          transform: translate3d(-100%, 0, 0)
      }
      .carousel-inner>.item.active,
      .carousel-inner>.item.next.left,
      .carousel-inner>.item.prev.right {
          left: 0;
          -webkit-transform: translate3d(0, 0, 0);
          transform: translate3d(0, 0, 0)
      }
  }
  
  .carousel-inner>.active,
  .carousel-inner>.next,
  .carousel-inner>.prev {
      display: block
  }
  
  .carousel-inner>.active {
      left: 0
  }
  
  .carousel-inner>.next,
  .carousel-inner>.prev {
      position: absolute;
      top: 0;
      width: 100%
  }
  
  .carousel-inner>.next {
      left: 100%
  }
  
  .carousel-inner>.prev {
      left: -100%
  }
  
  .carousel-inner>.next.left,
  .carousel-inner>.prev.right {
      left: 0
  }
  
  .carousel-inner>.active.left {
      left: -100%
  }
  
  .carousel-inner>.active.right {
      left: 100%
  }
  
  .carousel-control {
      position: absolute;
      top: 0;
      bottom: 0;
      left: 0;
      width: 15%;
      font-size: 20px;
      color: #fff;
      text-align: center;
      text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
      background-color: rgba(0, 0, 0, 0);
      filter: alpha(opacity=50);
      opacity: .5
  }
  
  .carousel-control.left {
      background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0, rgba(0, 0, 0, .0001) 100%);
      background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0, rgba(0, 0, 0, .0001) 100%);
      background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));
      background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0, rgba(0, 0, 0, .0001) 100%);
      filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);
      background-repeat: repeat-x
  }
  
  .carousel-control.right {
      right: 0;
      left: auto;
      background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0, rgba(0, 0, 0, .5) 100%);
      background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0, rgba(0, 0, 0, .5) 100%);
      background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));
      background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0, rgba(0, 0, 0, .5) 100%);
      filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);
      background-repeat: repeat-x
  }
  
  .carousel-control:focus,
  .carousel-control:hover {
      color: #fff;
      text-decoration: none;
      filter: alpha(opacity=90);
      outline: 0;
      opacity: .9
  }
  
  .carousel-control .glyphicon-chevron-left,
  .carousel-control .glyphicon-chevron-right,
  .carousel-control .icon-next,
  .carousel-control .icon-prev {
      position: absolute;
      top: 50%;
      z-index: 5;
      display: inline-block;
      margin-top: -10px
  }
  
  .carousel-control .glyphicon-chevron-left,
  .carousel-control .icon-prev {
      left: 50%;
      margin-left: -10px
  }
  
  .carousel-control .glyphicon-chevron-right,
  .carousel-control .icon-next {
      right: 50%;
      margin-right: -10px
  }
  
  .carousel-control .icon-next,
  .carousel-control .icon-prev {
      width: 20px;
      height: 20px;
      font-family: serif;
      line-height: 1
  }
  
  .carousel-control .icon-prev:before {
      content: '\2039'
  }
  
  .carousel-control .icon-next:before {
      content: '\203a'
  }
  
  .carousel-indicators {
      position: absolute;
      bottom: 10px;
      left: 50%;
      z-index: 15;
      width: 60%;
      padding-left: 0;
      margin-left: -30%;
      text-align: center;
      list-style: none
  }
  
  .carousel-indicators li {
      display: inline-block;
      width: 10px;
      height: 10px;
      margin: 1px;
      text-indent: -999px;
      cursor: pointer;
      background-color: #000\9;
      background-color: rgba(0, 0, 0, 0);
      border: 1px solid #fff;
      border-radius: 10px
  }
  
  .carousel-indicators .active {
      width: 12px;
      height: 12px;
      margin: 0;
      background-color: #fff
  }
  
  .carousel-caption {
      position: absolute;
      right: 15%;
      bottom: 20px;
      left: 15%;
      z-index: 10;
      padding-top: 20px;
      padding-bottom: 20px;
      color: #fff;
      text-align: center;
      text-shadow: 0 1px 2px rgba(0, 0, 0, .6)
  }
  
  .carousel-caption .btn {
      text-shadow: none
  }
  
  @media screen and (min-width:768px) {
      .carousel-control .glyphicon-chevron-left,
      .carousel-control .glyphicon-chevron-right,
      .carousel-control .icon-next,
      .carousel-control .icon-prev {
          width: 30px;
          height: 30px;
          margin-top: -10px;
          font-size: 30px
      }
      .carousel-control .glyphicon-chevron-left,
      .carousel-control .icon-prev {
          margin-left: -10px
      }
      .carousel-control .glyphicon-chevron-right,
      .carousel-control .icon-next {
          margin-right: -10px
      }
      .carousel-caption {
          right: 20%;
          left: 20%;
          padding-bottom: 30px
      }
      .carousel-indicators {
          bottom: 20px
      }
  }
  
  .btn-group-vertical>.btn-group:after,
  .btn-group-vertical>.btn-group:before,
  .btn-toolbar:after,
  .btn-toolbar:before,
  .clearfix:after,
  .clearfix:before,
  .container-fluid:after,
  .container-fluid:before,
  .container:after,
  .container:before,
  .dl-horizontal dd:after,
  .dl-horizontal dd:before,
  .form-horizontal .form-group:after,
  .form-horizontal .form-group:before,
  .modal-footer:after,
  .modal-footer:before,
  .modal-header:after,
  .modal-header:before,
  .nav:after,
  .nav:before,
  .navbar-collapse:after,
  .navbar-collapse:before,
  .navbar-header:after,
  .navbar-header:before,
  .navbar:after,
  .navbar:before,
  .pager:after,
  .pager:before,
  .panel-body:after,
  .panel-body:before,
  .row:after,
  .row:before {
      display: table;
      content: " "
  }
  
  .btn-group-vertical>.btn-group:after,
  .btn-toolbar:after,
  .clearfix:after,
  .container-fluid:after,
  .container:after,
  .dl-horizontal dd:after,
  .form-horizontal .form-group:after,
  .modal-footer:after,
  .modal-header:after,
  .nav:after,
  .navbar-collapse:after,
  .navbar-header:after,
  .navbar:after,
  .pager:after,
  .panel-body:after,
  .row:after {
      clear: both
  }
  
  .center-block {
      display: block;
      margin-right: auto;
      margin-left: auto
  }
  
  .pull-right {
      float: right !important
  }
  
  .pull-left {
      float: left !important
  }
  
  .hide {
      display: none !important
  }
  
  .show {
      display: block !important
  }
  
  .invisible {
      visibility: hidden
  }
  
  .text-hide {
      font: 0/0 a;
      color: transparent;
      text-shadow: none;
      background-color: transparent;
      border: 0
  }
  
  .hidden {
      display: none !important
  }
  
  .affix {
      position: fixed
  }
  
  @-ms-viewport {
      width: device-width
  }
  
  .visible-lg,
  .visible-md,
  .visible-sm,
  .visible-xs {
      display: none !important
  }
  
  .visible-lg-block,
  .visible-lg-inline,
  .visible-lg-inline-block,
  .visible-md-block,
  .visible-md-inline,
  .visible-md-inline-block,
  .visible-sm-block,
  .visible-sm-inline,
  .visible-sm-inline-block,
  .visible-xs-block,
  .visible-xs-inline,
  .visible-xs-inline-block {
      display: none !important
  }
  
  @media (max-width:767px) {
      .visible-xs {
          display: block !important
      }
      table.visible-xs {
          display: table !important
      }
      tr.visible-xs {
          display: table-row !important
      }
      td.visible-xs,
      th.visible-xs {
          display: table-cell !important
      }
  }
  
  @media (max-width:767px) {
      .visible-xs-block {
          display: block !important
      }
  }
  
  @media (max-width:767px) {
      .visible-xs-inline {
          display: inline !important
      }
  }
  
  @media (max-width:767px) {
      .visible-xs-inline-block {
          display: inline-block !important
      }
  }
  
  @media (min-width:768px) and (max-width:991px) {
      .visible-sm {
          display: block !important
      }
      table.visible-sm {
          display: table !important
      }
      tr.visible-sm {
          display: table-row !important
      }
      td.visible-sm,
      th.visible-sm {
          display: table-cell !important
      }
  }
  
  @media (min-width:768px) and (max-width:991px) {
      .visible-sm-block {
          display: block !important
      }
  }
  
  @media (min-width:768px) and (max-width:991px) {
      .visible-sm-inline {
          display: inline !important
      }
  }
  
  @media (min-width:768px) and (max-width:991px) {
      .visible-sm-inline-block {
          display: inline-block !important
      }
  }
  
  @media (min-width:992px) and (max-width:1199px) {
      .visible-md {
          display: block !important
      }
      table.visible-md {
          display: table !important
      }
      tr.visible-md {
          display: table-row !important
      }
      td.visible-md,
      th.visible-md {
          display: table-cell !important
      }
  }
  
  @media (min-width:992px) and (max-width:1199px) {
      .visible-md-block {
          display: block !important
      }
  }
  
  @media (min-width:992px) and (max-width:1199px) {
      .visible-md-inline {
          display: inline !important
      }
  }
  
  @media (min-width:992px) and (max-width:1199px) {
      .visible-md-inline-block {
          display: inline-block !important
      }
  }
  
  @media (min-width:1200px) {
      .visible-lg {
          display: block !important
      }
      table.visible-lg {
          display: table !important
      }
      tr.visible-lg {
          display: table-row !important
      }
      td.visible-lg,
      th.visible-lg {
          display: table-cell !important
      }
  }
  
  @media (min-width:1200px) {
      .visible-lg-block {
          display: block !important
      }
  }
  
  @media (min-width:1200px) {
      .visible-lg-inline {
          display: inline !important
      }
  }
  
  @media (min-width:1200px) {
      .visible-lg-inline-block {
          display: inline-block !important
      }
  }
  
  @media (max-width:767px) {
      .hidden-xs {
          display: none !important
      }
  }
  
  @media (min-width:768px) and (max-width:991px) {
      .hidden-sm {
          display: none !important
      }
  }
  
  @media (min-width:992px) and (max-width:1199px) {
      .hidden-md {
          display: none !important
      }
  }
  
  @media (min-width:1200px) {
      .hidden-lg {
          display: none !important
      }
  }
  
  .visible-print {
      display: none !important
  }
  
  @media print {
      .visible-print {
          display: block !important
      }
      table.visible-print {
          display: table !important
      }
      tr.visible-print {
          display: table-row !important
      }
      td.visible-print,
      th.visible-print {
          display: table-cell !important
      }
  }
  
  .visible-print-block {
      display: none !important
  }
  
  @media print {
      .visible-print-block {
          display: block !important
      }
  }
  
  
  .visible-print-inline {
      display: none !important
  }
  
  @media print {
      .visible-print-inline {
          display: inline !important
      }
  }
  
  .visible-print-inline-block {
      display: none !important
  }
  
  @media print {
      .visible-print-inline-block {
          display: inline-block !important
      }
  }
  
  @media print {
      .hidden-print {
          display: none !important
      }
  }
  
  /*# sourceMappingURL=bootstrap.min.css.map */
  
  
  /*
   * Parts taken from https://github.com/Mushiyo/pandoc-toc-sidebar
   */
  
  /*
   * Base structure
   */
  
  /*
   * Global add-ons
   */
  
   .sub-header {
  	padding-bottom: 10px;
  	border-bottom: 1px solid #eee;
    }
    
    /*
     * Top navigation
     * Hide default border to remove 1px line.
     */
    .navbar-fixed-top {
  	border: 0;
    }
    
    /*
     * Sidebar
     */
    
    /* Hide for mobile, show later */
    .sidebar {
  	display: none;
    }
    @media (min-width: 768px) {
  	.sidebar {
  	  position: fixed;
  	  top: 20px;
  	  bottom: 0;
  	  left: 0;
  	  z-index: 1000;
  	  display: block;
  	  padding: 20px;
  	  overflow-x: hidden;
  	  overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */
  	  background-color: #f5f5f5;
  	  border-right: 1px solid #eee;
  	}
    }
    
    /* Sidebar navigation */
    .nav-sidebar {
  	margin-right: -21px; /* 20px padding + 1px border */
  	margin-bottom: 20px;
  	margin-left: -20px;
    }
    .nav-sidebar > li > a {
  	padding-right: 20px;
  	padding-left: 20px;
    }
    .nav-sidebar > .active > a,
    .nav-sidebar > .active > a:hover,
    .nav-sidebar > .active > a:focus {
  	color: #fff;
  	background-color: #428bca;
    }
    
    
    /*
     * Main content
     */
    
    .main {
  	padding: 20px;
    }
    @media (min-width: 768px) {
  	.main {
  	  padding-right: 40px;
  	  padding-left: 40px;
  	}
    }
    .main .page-header {
  	margin-top: 0;
    }
    
    
    /*
     * Placeholder dashboard ideas
     */
    
    .placeholders {
  	margin-bottom: 30px;
  	text-align: center;
    }
    .placeholders h4 {
  	margin-bottom: 0;
    }
    .placeholder {
  	margin-bottom: 20px;
    }
    .placeholder img {
  	display: inline-block;
  	border-radius: 50%;
    }
    
  
  
  
  /******************************************************************************
   *                   Style sheet for the W3C specifications                   *
   *
   * Special classes handled by this style sheet include:
   *
   * Indices
   *   - .toc for the Table of Contents (<ol class="toc">)
   *     + <span class="secno"> for the section numbers
   *   - #toc for the Table of Contents (<nav id="toc">)
   *   - ul.index for Indices (<a href="#ref">term</a><span>, in §N.M</span>)
   *   - table.index for Index Tables (e.g. for properties or elements)
   *
   * Structural Markup
   *   - table.data for general data tables
   *     -> use 'scope' attribute, <colgroup>, <thead>, and <tbody> for best results !
   *     -> use <table class='complex data'> for extra-complex tables
   *     -> use <td class='long'> for paragraph-length cell content
   *     -> use <td class='pre'> when manual line breaks/indentation would help readability
   *   - dl.switch for switch statements
   *   - ol.algorithm for algorithms (helps to visualize nesting)
   *   - .figure and .caption (HTML4) and figure and figcaption (HTML5)
   *     -> .sidefigure for right-floated figures
   *   - ins/del
   *
   * Code
   *   - pre and code
   *
   * Special Sections
   *   - .note       for informative notes             (div, p, span, aside, details)
   *   - .example    for informative examples          (div, p, pre, span)
   *   - .issue      for issues                        (div, p, span)
   *   - .assertion  for assertions                    (div, p, span)
   *   - .advisement for loud normative statements     (div, p, strong)
   *   - .annoying-warning for spec obsoletion notices (div, aside, details)
   *
   * Definition Boxes
   *   - pre.def   for WebIDL definitions
   *   - table.def for tables that define other entities (e.g. CSS properties)
   *   - dl.def    for definition lists that define other entitles (e.g. HTML elements)
   *
   * Numbering
   *   - .secno for section numbers in .toc and headings (<span class='secno'>3.2</span>)
   *   - .marker for source-inserted example/figure/issue numbers (<span class='marker'>Issue 4</span>)
   *   - ::before styled for CSS-generated issue/example/figure numbers:
   *     -> Documents wishing to use this only need to add
   *        figcaption::before,
   *        .caption::before { content: "Figure "  counter(figure) " ";  }
   *        .example::before { content: "Example " counter(example) " "; }
   *        .issue::before   { content: "Issue "   counter(issue) " ";   }
   *
   * Header Stuff (ignore, just don't conflict with these classes)
   *   - .head for the header
   *   - .copyright for the copyright
   *
   * Miscellaneous
   *   - .overlarge for things that should be as wide as possible, even if
   *     that overflows the body text area. This can be used on an item or
   *     on its container, depending on the effect desired.
   *     Note that this styling basically doesn't help at all when printing,
   *     since A4 paper isn't much wider than the max-width here.
   *     It's better to design things to fit into a narrower measure if possible.
   *   - js-added ToC jump links (see fixup.js)
   *
   ******************************************************************************/
  
  /******************************************************************************/
  /*                                   Body                                     */
  /******************************************************************************/
  
  	body {
  		counter-reset: example figure issue;
  
  		/* Typography */
  		line-height: 1.5;
  		font-family: sans-serif;
  		widows: 2;
  		orphans: 2;
  		word-wrap: break-word;
  		overflow-wrap: break-word;
  		hyphens: auto;
  
  		/* Colors */
  		color: black;
  		background: white top left fixed no-repeat;
  		background-size: 25px auto;
  	}
  
  
  /******************************************************************************/
  /*                         Front Matter & Navigation                          */
  /******************************************************************************/
  
  /** Header ********************************************************************/
  
  	div.head { margin-bottom: 1em }
  	div.head hr { border-style: solid; }
  
  	div.head h1 {
  		font-weight: bold;
  		margin: 0 0 .1em;
  		font-size: 220%;
  	}
  
  	div.head h2 { margin-bottom: 1.5em;}
  
  /** W3C Logo ******************************************************************/
  
  	.head .logo {
  		float: right;
  		margin: 0.4rem 0 0.2rem .4rem;
  	}
  
  	.head img[src*="logos/W3C"] {
  		display: block;
  		border: solid #1a5e9a;
  		border-width: .65rem .7rem .6rem;
  		border-radius: .4rem;
  		background: #1a5e9a;
  		color: white;
  		font-weight: bold;
  	}
  
  	.head a:hover > img[src*="logos/W3C"],
  	.head a:focus > img[src*="logos/W3C"] {
  		opacity: .8;
  	}
  
  	.head a:active > img[src*="logos/W3C"] {
  		background: #c00;
  		border-color: #c00;
  	}
  
  	/* see also additional rules in Link Styling section */
  
  /** Copyright *****************************************************************/
  
  	p.copyright,
  	p.copyright small { font-size: small }
  
  /** Back to Top / ToC Toggle **************************************************/
  
  	@media print {
  		#toc-nav {
  			display: none;
  		}
  	}
  	@media not print {
  		#toc-nav {
  			position: fixed;
  			z-index: 2;
  			bottom: 0; left: 0;
  			margin: 0;
  			min-width: 1.33em;
  			border-top-right-radius: 2rem;
  			box-shadow: 0 0 2px;
  			font-size: 1.5em;
  			color: black;
  		}
  		#toc-nav > a {
  			display: block;
  			white-space: nowrap;
  
  			height: 1.33em;
  			padding: .1em 0.3em;
  			margin: 0;
  
  			background: white;
  			box-shadow: 0 0 2px;
  			border: none;
  			border-top-right-radius: 1.33em;
  			background: white;
  		}
  		#toc-nav > #toc-jump {
  			padding-bottom: 2em;
  			margin-bottom: -1.9em;
  		}
  
  		#toc-nav > a:hover,
  		#toc-nav > a:focus {
  			background: #f8f8f8;
  		}
  		#toc-nav > a:not(:hover):not(:focus) {
  			color: #707070;
  		}
  
  		/* statusbar gets in the way on keyboard focus; remove once browsers fix */
  		#toc-nav > a[href="#toc"]:not(:hover):focus:last-child {
  			padding-bottom: 1.5rem;
  		}
  
  		#toc-nav:not(:hover) > a:not(:focus) > span + span {
  			/* Ideally this uses :focus-within on #toc-nav */
  			display: none;
  		}
  		#toc-nav > a > span + span {
  			padding-right: 0.2em;
  		}
  
  		#toc-toggle-inline {
  			vertical-align: 0.05em;
  			font-size: 80%;
  			color: gray;
  			color: hsla(203,20%,40%,.7);
  			border-style: none;
  			background: transparent;
  			position: relative;
  		}
  		#toc-toggle-inline:hover:not(:active),
  		#toc-toggle-inline:focus:not(:active) {
  			text-shadow: 1px 1px silver;
  			top: -1px;
  			left: -1px;
  		}
  
  		#toc-nav :active {
  			color: #C00;
  		}
  	}
  
  
  
  /******************************************************************************/
  /*                                Sectioning                                  */
  /******************************************************************************/
  
  /** Headings ******************************************************************/
  
  	h1, h2, h3, h4, h5, h6, dt {
  		page-break-after: avoid;
  		page-break-inside: avoid;
  		font: 100% sans-serif;   /* Reset all font styling to clear out UA styles */
  		font-family: inherit;    /* Inherit the font family. */
  		line-height: 1.2;        /* Keep wrapped headings compact */
  		hyphens: manual;         /* Hyphenated headings look weird */
  	}
  
  	h2, h3, h4, h5, h6 {
  		margin-top: 3rem;
  	}
  
  	h1, h2, h3 {
  		color: #005A9C;
  		background: transparent;
  	}
  
  	h1 { font-size: 170%; }
  	h2 { font-size: 140%; }
  	h3 { font-size: 120%; }
  	h4 { font-weight: bold; }
  	h5 { font-style: italic; }
  	h6 { font-variant: small-caps; }
  	dt { font-weight: bold; }
  
  /** Subheadings ***************************************************************/
  
  	h1 + h2,
  	#subtitle {
  		/* #subtitle is a subtitle in an H2 under the H1 */
  		margin-top: 0;
  	}
  	h2 + h3,
  	h3 + h4,
  	h4 + h5,
  	h5 + h6 {
  		margin-top: 1.2em; /* = 1 x line-height */
  	}
  
  /** Section divider ***********************************************************/
  
  	:not(.head) > hr {
  		font-size: 1.5em;
  		text-align: center;
  		margin: 1em auto;
  		height: auto;
  		border: transparent solid 0;
  		background: transparent;
  	}
  	:not(.head) > hr::before {
  		content: "\2727\2003\2003\2727\2003\2003\2727";
  	}
  
  /******************************************************************************/
  /*                            Paragraphs and Lists                            */
  /******************************************************************************/
  
  	p {
  		margin: 1em 0;
  	}
  
  	dd > p:first-child,
  	li > p:first-child {
  		margin-top: 0;
  	}
  
  	ul, ol {
  		margin-left: 0;
  		padding-left: 2em;
  	}
  
  	li {
  		margin: 0.25em 0 0.5em;
  		padding: 0;
  	}
  
  	dl dd {
  		margin: 0 0 .5em 2em;
  	}
  
  	.head dd + dd { /* compact for header */
  		margin-top: -.5em;
  	}
  
  	/* Style for algorithms */
  	ol.algorithm ol:not(.algorithm),
  	.algorithm > ol ol:not(.algorithm) {
  	 border-left: 0.5em solid #DEF;
  	}
  
  	/* Put nice boxes around each algorithm. */
  	[data-algorithm]:not(.heading) {
  	  padding: .5em;
  	  border: thin solid #ddd; border-radius: .5em;
  	  margin: .5em calc(-0.5em - 1px);
  	}
  	[data-algorithm]:not(.heading) > :first-child {
  	  margin-top: 0;
  	}
  	[data-algorithm]:not(.heading) > :last-child {
  	  margin-bottom: 0;
  	}
  
  	/* Style for switch/case <dl>s */
  	dl.switch > dd > ol.only,
  	dl.switch > dd > .only > ol {
  	 margin-left: 0;
  	}
  	dl.switch > dd > ol.algorithm,
  	dl.switch > dd > .algorithm > ol {
  	 margin-left: -2em;
  	}
  	dl.switch {
  	 padding-left: 2em;
  	}
  	dl.switch > dt {
  	 text-indent: -1.5em;
  	 margin-top: 1em;
  	}
  	dl.switch > dt + dt {
  	 margin-top: 0;
  	}
  	dl.switch > dt::before {
  	 content: '\21AA';
  	 padding: 0 0.5em 0 0;
  	 display: inline-block;
  	 width: 1em;
  	 text-align: right;
  	 line-height: 0.5em;
  	}
  
  /** Terminology Markup ********************************************************/
  
  
  /******************************************************************************/
  /*                                 Inline Markup                              */
  /******************************************************************************/
  
  /** Terminology Markup ********************************************************/
  	dfn   { /* Defining instance */
  		font-weight: bolder;
  	}
  	a > i { /* Instance of term */
  		font-style: normal;
  	}
  	dt dfn code, code.idl {
  		font-size: medium;
  	}
  	dfn var {
  		font-style: normal;
  	}
  
  /** Change Marking ************************************************************/
  
  	del { color: red;  text-decoration: line-through; }
  	ins { color: #080; text-decoration: underline;    }
  
  /** Miscellaneous improvements to inline formatting ***************************/
  
  	sup {
  		vertical-align: super;
  		font-size: 80%
  	}
  
  /******************************************************************************/
  /*                                    Code                                    */
  /******************************************************************************/
  
  /** General monospace/pre rules ***********************************************/
  
  	pre, code, samp {
  		font-family: Menlo, Consolas, "DejaVu Sans Mono", Monaco, monospace;
  		font-size: .9em;
  		page-break-inside: avoid;
  		hyphens: none;
  		text-transform: none;
  	}
  	pre code,
  	code code {
  		font-size: 100%;
  	}
  
  	pre {
  		margin-top: 1em;
  		margin-bottom: 1em;
  		overflow: auto;
  	}
  
  /** Inline Code fragments *****************************************************/
  
    /* Do something nice. */
  
  /******************************************************************************/
  /*                                    Links                                   */
  /******************************************************************************/
  
  /** General Hyperlinks ********************************************************/
  
  	/* We hyperlink a lot, so make it less intrusive */
  	a[href] {
  		color: #034575;
  		text-decoration: none;
  		border-bottom: 1px solid #707070;
  		/* Need a bit of extending for it to look okay */
  		padding: 0 1px 0;
  		margin: 0 -1px 0;
  	}
  	a:visited {
  		border-bottom-color: #BBB;
  	}
  
  	/* Use distinguishing colors when user is interacting with the link */
  	a[href]:focus,
  	a[href]:hover {
  		background: #f8f8f8;
  		background: rgba(75%, 75%, 75%, .25);
  		border-bottom-width: 3px;
  		margin-bottom: -2px;
  	}
  	a[href]:active {
  		color: #C00;
  		border-color: #C00;
  	}
  
  	/* Backout above styling for W3C logo */
  	.head .logo,
  	.head .logo a {
  		border: none;
  		text-decoration: none;
  		background: transparent;
  	}
  
  /******************************************************************************/
  /*                                    Images                                  */
  /******************************************************************************/
  
  	img {
  		border-style: none;
  	}
  
  	/* For autogen numbers, add
  	   .caption::before, figcaption::before { content: "Figure " counter(figure) ". "; }
  	*/
  
  	figure, .figure, .sidefigure {
  		page-break-inside: avoid;
  		text-align: center;
  		margin: 2.5em 0;
  	}
  	.figure img,    .sidefigure img,    figure img,
  	.figure object, .sidefigure object, figure object {
  		max-width: 100%;
  		margin: auto;
  	}
  	.figure pre, .sidefigure pre, figure pre {
  		text-align: left;
  		display: table;
  		margin: 1em auto;
  	}
  	.figure table, figure table {
  		margin: auto;
  	}
  	@media screen and (min-width: 20em) {
  		.sidefigure {
  			float: right;
  			width: 50%;
  			margin: 0 0 0.5em 0.5em
  		}
  	}
  	.caption, figcaption, caption {
  		font-style: italic;
  		font-size: 90%;
  	}
  	.caption::before, figcaption::before, figcaption > .marker {
  		font-weight: bold;
  	}
  	.caption, figcaption {
  		counter-increment: figure;
  	}
  
  	/* DL list is indented 2em, but figure inside it is not */
  	dd > .figure, dd > figure { margin-left: -2em }
  
  /******************************************************************************/
  /*                             Colored Boxes                                  */
  /******************************************************************************/
  
  	.issue, .note, .example, .assertion, .advisement, blockquote {
  		padding: .5em;
  		border: .5em;
  		border-left-style: solid;
  		page-break-inside: avoid;
  	}
  	span.issue, span.note {
  		padding: .1em .5em .15em;
  		border-right-style: solid;
  	}
  
  	.issue,
  	.note,
  	.example,
  	.advisement,
  	.assertion,
  	blockquote {
  		margin: 1em auto;
  	}
  	.note  > p:first-child,
  	.issue > p:first-child,
  	blockquote > :first-child {
  		margin-top: 0;
  	}
  	blockquote > :last-child {
  		margin-bottom: 0;
  	}
  
  /** Blockquotes ***************************************************************/
  
  	blockquote {
  		border-color: silver;
  	}
  
  /** Open issue ****************************************************************/
  
  	.issue {
  		border-color: #E05252;
  		background: #FBE9E9;
  		counter-increment: issue;
  		overflow: auto;
  	}
  	.issue::before, .issue > .marker {
  		text-transform: uppercase;
  		color: #AE1E1E;
  		padding-right: 1em;
  		text-transform: uppercase;
  	}
  	/* Add .issue::before { content: "Issue " counter(issue) " "; } for autogen numbers,
  	   or use class="marker" to mark up the issue number in source. */
  
  /** Example *******************************************************************/
  
  	.example {
  		border-color: #E0CB52;
  		background: #FCFAEE;
  		counter-increment: example;
  		overflow: auto;
  		clear: both;
  	}
  	.example::before, .example > .marker {
  		text-transform: uppercase;
  		color: #827017;
  		min-width: 7.5em;
  		display: block;
  	}
  	/* Add .example::before { content: "Example " counter(example) " "; } for autogen numbers,
  	   or use class="marker" to mark up the example number in source. */
  
  /** Non-normative Note ********************************************************/
  
  	.note {
  		border-color: #52E052;
  		background: #E9FBE9;
  		overflow: auto;
  	}
  
  	.note::before, .note > .marker,
  	details.note > summary::before,
  	details.note > summary > .marker {
  		text-transform: uppercase;
  		display: block;
  		color: hsl(120, 70%, 30%);
  	}
  	/* Add .note::before { content: "Note"; } for autogen label,
  	   or use class="marker" to mark up the label in source. */
  
  	details.note > summary {
  		display: block;
  		color: hsl(120, 70%, 30%);
  	}
  	details.note[open] > summary {
  		border-bottom: 1px silver solid;
  	}
  
  /** Assertion Box *************************************************************/
  	/*  for assertions in algorithms */
  
  	.assertion {
  		border-color: #AAA;
  		background: #EEE;
  	}
  
  /** Advisement Box ************************************************************/
  	/*  for attention-grabbing normative statements */
  
  	.advisement {
  		border-color: orange;
  		border-style: none solid;
  		background: #FFEECC;
  	}
  	strong.advisement {
  		display: block;
  		text-align: center;
  	}
  	.advisement > .marker {
  		color: #B35F00;
  	}
  
  /** Spec Obsoletion Notice ****************************************************/
  	/* obnoxious obsoletion notice for older/abandoned specs. */
  
  	details {
  		display: block;
  	}
  	summary {
  		font-weight: bolder;
  	}
  
  	.annoying-warning:not(details),
  	details.annoying-warning:not([open]) > summary,
  	details.annoying-warning[open] {
  		background: #fdd;
  		color: red;
  		font-weight: bold;
  		padding: .75em 1em;
  		border: thick red;
  		border-style: solid;
  		border-radius: 1em;
  	}
  	.annoying-warning :last-child {
  		margin-bottom: 0;
  	}
  
  @media not print {
  	details.annoying-warning[open] {
  		position: fixed;
  		left: 1em;
  		right: 1em;
  		bottom: 1em;
  		z-index: 1000;
  	}
  }
  
  	details.annoying-warning:not([open]) > summary {
  		text-align: center;
  	}
  
  /** Entity Definition Boxes ***************************************************/
  
  	.def {
  		padding: .5em 1em;
  		background: #DEF;
  		margin: 1.2em 0;
  		border-left: 0.5em solid #8CCBF2;
  	}
  
  /******************************************************************************/
  /*                                    Tables                                  */
  /******************************************************************************/
  
  	th, td {
  		text-align: left;
  		text-align: start;
  	}
  
  /** Property/Descriptor Definition Tables *************************************/
  
  	table.def {
  		/* inherits .def box styling, see above */
  		width: 100%;
  		border-spacing: 0;
  	}
  
  	table.def td,
  	table.def th {
  		padding: 0.5em;
  		vertical-align: baseline;
  		border-bottom: 1px solid #bbd7e9;
  	}
  
  	table.def > tbody > tr:last-child th,
  	table.def > tbody > tr:last-child td {
  		border-bottom: 0;
  	}
  
  	table.def th {
  		font-style: italic;
  		font-weight: normal;
  		padding-left: 1em;
  		width: 3em;
  	}
  
  	/* For when values are extra-complex and need formatting for readability */
  	table td.pre {
  		white-space: pre-wrap;
  	}
  
  	/* A footnote at the bottom of a def table */
  	table.def           td.footnote {
  		padding-top: 0.6em;
  	}
  	table.def           td.footnote::before {
  		content: " ";
  		display: block;
  		height: 0.6em;
  		width: 4em;
  		border-top: thin solid;
  	}
  
  /** Data tables (and properly marked-up index tables) *************************/
  	/*
  		 <table class="data"> highlights structural relationships in a table
  		 when correct markup is used (e.g. thead/tbody, th vs. td, scope attribute)
  
  		 Use class="complex data" for particularly complicated tables --
  		 (This will draw more lines: busier, but clearer.)
  
  		 Use class="long" on table cells with paragraph-like contents
  		 (This will adjust text alignment accordingly.)
  		 Alternately use class="longlastcol" on tables, to have the last column assume "long".
  	*/
  
  	table {
  		word-wrap: normal;
  		overflow-wrap: normal;
  		hyphens: manual;
  	}
  
  	table.data,
  	table.index {
  		margin: 1em auto;
  		border-collapse: collapse;
  		border: hidden;
  		width: 100%;
  	}
  	table.data caption,
  	table.index caption {
  		max-width: 50em;
  		margin: 0 auto 1em;
  	}
  
  	table.data td,  table.data th,
  	table.index td, table.index th {
  		padding: 0.5em 1em;
  		border-width: 1px;
  		border-color: silver;
  		border-top-style: solid;
  	}
  
  	table.data thead td:empty {
  		padding: 0;
  		border: 0;
  	}
  
  	table.data  thead,
  	table.index thead,
  	table.data  tbody,
  	table.index tbody {
  		border-bottom: 2px solid;
  	}
  
  	table.data colgroup,
  	table.index colgroup {
  		border-left: 2px solid;
  	}
  
  	table.data  tbody th:first-child,
  	table.index tbody th:first-child  {
  		border-right: 2px solid;
  		border-top: 1px solid silver;
  		padding-right: 1em;
  	}
  
  	table.data th[colspan],
  	table.data td[colspan] {
  		text-align: center;
  	}
  
  	table.complex.data th,
  	table.complex.data td {
  		border: 1px solid silver;
  		text-align: center;
  	}
  
  	table.data.longlastcol td:last-child,
  	table.data td.long {
  	 vertical-align: baseline;
  	 text-align: left;
  	}
  
  	table.data img {
  		vertical-align: middle;
  	}
  
  
  /*
  Alternate table alignment rules
  
  	table.data,
  	table.index {
  		text-align: center;
  	}
  
  	table.data  thead th[scope="row"],
  	table.index thead th[scope="row"] {
  		text-align: right;
  	}
  
  	table.data  tbody th:first-child,
  	table.index tbody th:first-child  {
  		text-align: right;
  	}
  
  Possible extra rowspan handling
  
  	table.data  tbody th[rowspan]:not([rowspan='1']),
  	table.index tbody th[rowspan]:not([rowspan='1']),
  	table.data  tbody td[rowspan]:not([rowspan='1']),
  	table.index tbody td[rowspan]:not([rowspan='1']) {
  		border-left: 1px solid silver;
  	}
  
  	table.data  tbody th[rowspan]:first-child,
  	table.index tbody th[rowspan]:first-child,
  	table.data  tbody td[rowspan]:first-child,
  	table.index tbody td[rowspan]:first-child{
  		border-left: 0;
  		border-right: 1px solid silver;
  	}
  */
  
  /******************************************************************************/
  /*                                  Indices                                   */
  /******************************************************************************/
  
  
  /** Table of Contents *********************************************************/
  
  	.toc a {
  		/* More spacing; use padding to make it part of the click target. */
  		padding-top: 0.1rem;
  		/* Larger, more consistently-sized click target */
  		display: block;
  		/* Reverse color scheme */
  		color: black;
  		border-color: #3980B5;
  		border-bottom-width: 3px !important;
  		margin-bottom: 0px !important;
  	}
  	.toc a:visited {
  		border-color: #054572;
  	}
  	.toc a:not(:focus):not(:hover) {
  		/* Allow colors to cascade through from link styling */
  		border-bottom-color: transparent;
  	}
  
  	.toc, .toc ol, .toc ul, .toc li {
  		list-style: none; /* Numbers must be inlined into source */
  		/* because generated content isn't search/selectable and markers can't do multilevel yet */
  		margin:  0;
  		padding: 0;
  		line-height: 1.1rem; /* consistent spacing */
  	}
  
  	/* ToC not indented until third level, but font style & margins show hierarchy */
  	.toc > li             { font-weight: bold;   }
  	.toc > li li          { font-weight: normal; }
  	.toc > li li li       { font-size:   95%;    }
  	.toc > li li li li    { font-size:   90%;    }
  	.toc > li li li li .secno { font-size: 85%; }
  	.toc > li li li li li { font-size:   85%;    }
  	.toc > li li li li li .secno { font-size: 100%; }
  
  	/* @supports not (display:grid) { */
  		.toc > li             { margin: 1.5rem 0;    }
  		.toc > li li          { margin: 0.3rem 0;    }
  		.toc > li li li       { margin-left: 2rem;   }
  
  		/* Section numbers in a column of their own */
  		.toc .secno {
  			float: left;
  			width: 4rem;
  			white-space: nowrap;
  		}
  
  		.toc li {
  			clear: both;
  		}
  
  		:not(li) > .toc              { margin-left:  5rem; }
  		.toc .secno                  { margin-left: -5rem; }
  		.toc > li li li .secno       { margin-left: -7rem; }
  		.toc > li li li li .secno    { margin-left: -9rem; }
  		.toc > li li li li li .secno { margin-left: -11rem; }
  
  		/* Tighten up indentation in narrow ToCs */
  		@media (max-width: 30em) {
  			:not(li) > .toc              { margin-left:  4rem; }
  			.toc .secno                  { margin-left: -4rem; }
  			.toc > li li li              { margin-left:  1rem; }
  			.toc > li li li .secno       { margin-left: -5rem; }
  			.toc > li li li li .secno    { margin-left: -6rem; }
  			.toc > li li li li li .secno { margin-left: -7rem; }
  		}
  	/* } */
  
  	@supports (display:grid) {
  		/* Use #toc over .toc to override non-@supports rules. */
  		#toc {
  			display: grid;
  			align-content: start;
  			grid-template-columns: auto 1fr;
  			grid-column-gap: 1rem;
  			column-gap: 1rem;
  			grid-row-gap: .6rem;
  			row-gap: .6rem;
  		}
  		#toc h2 {
  			grid-column: 1 / -1;
  			margin-bottom: 0;
  		}
  		#toc ol,
  		#toc li,
  		#toc a {
  			display: contents;
  			/* Switch <a> to subgrid when supported */
  		}
  		#toc span {
  			margin: 0;
  		}
  		#toc > .toc > li > a > span {
  			/* The spans of the top-level list,
  			   comprising the first items of each top-level section. */
  			margin-top: 1.1rem;
  		}
  		#toc .secno {
  			grid-column: 1;
  			width: auto;
  		}
  		#toc .content {
  			grid-column: 2;
  			width: auto;
  			margin-right: 1rem;
  		}
  		#toc .content:hover {
  			background: rgba(75%, 75%, 75%, .25);
  			border-bottom: 3px solid #054572;
  			margin-bottom: -3px;
  		}
  		#toc li li li .content {
  			margin-left: 1rem;
  		}
  		#toc li li li li .content {
  			margin-left: 2rem;
  		}
  	}
  
  
  /** Index *********************************************************************/
  
  	/* Index Lists: Layout */
  	ul.index       { margin-left: 0; columns: 15em; text-indent: 1em hanging; }
  	ul.index li    { margin-left: 0; list-style: none; break-inside: avoid; }
  	ul.index li li { margin-left: 1em }
  	ul.index dl    { margin-top: 0; }
  	ul.index dt    { margin: .2em 0 .2em 20px;}
  	ul.index dd    { margin: .2em 0 .2em 40px;}
  	/* Index Lists: Typography */
  	ul.index ul,
  	ul.index dl { font-size: smaller; }
  	@media not print {
  		ul.index li span {
  			white-space: nowrap;
  			color: transparent; }
  		ul.index li a:hover + span,
  		ul.index li a:focus + span {
  			color: #707070;
  		}
  	}
  
  /** Index Tables *****************************************************/
  	/* See also the data table styling section, which this effectively subclasses */
  
  	table.index {
  		font-size: small;
  		border-collapse: collapse;
  		border-spacing: 0;
  		text-align: left;
  		margin: 1em 0;
  	}
  
  	table.index td,
  	table.index th {
  		padding: 0.4em;
  	}
  
  	table.index tr:hover td:not([rowspan]),
  	table.index tr:hover th:not([rowspan]) {
  		background: #f7f8f9;
  	}
  
  	/* The link in the first column in the property table (formerly a TD) */
  	table.index th:first-child a {
  		font-weight: bold;
  	}
  
  /******************************************************************************/
  /*                                    Print                                   */
  /******************************************************************************/
  
  	@media print {
  		/* Pages have their own margins. */
  		html {
  			margin: 0;
  		}
  		/* Serif for print. */
  		body {
  			font-family: serif;
  		}
  	}
  	@page {
  		margin: 1.5cm 1.1cm;
  	}
  
  /******************************************************************************/
  /*                                    Legacy                                  */
  /******************************************************************************/
  
  	/* This rule is inherited from past style sheets. No idea what it's for. */
  	.hide { display: none }
  
  
  
  /******************************************************************************/
  /*                             Overflow Control                               */
  /******************************************************************************/
  
  	.figure .caption, .sidefigure .caption, figcaption {
  		/* in case figure is overlarge, limit caption to 50em */
  		max-width: 50rem;
  		margin-left: auto;
  		margin-right: auto;
  	}
  	.overlarge > table {
  		/* limit preferred width of table */
  		max-width: 50em;
  		margin-left: auto;
  		margin-right: auto;
  	}
  
  	@media (min-width: 55em) {
  		.overlarge {
  			margin-left: calc(13px + 26.5rem - 50vw);
  			margin-right: calc(13px + 26.5rem - 50vw);
  			max-width: none;
  		}
  	}
  	@media screen and (min-width: 78em) {
  		body:not(.toc-inline) .overlarge {
  			/* 30.5em body padding 50em content area */
  			margin-left: calc(40em - 50vw) !important;
  			margin-right: calc(40em - 50vw) !important;
  		}
  	}
  	@media screen and (min-width: 90em) {
  		body:not(.toc-inline) .overlarge {
  			/* 4em html margin 30.5em body padding 50em content area */
  			margin-left: 0 !important;
  			margin-right: calc(84.5em - 100vw) !important;
  		}
  	}
  
  	@media not print {
  		.overlarge {
  			overflow-x: auto;
  			/* See Lea Verou's explanation background-attachment:
  			 * http://lea.verou.me/2012/04/background-attachment-local/
  			 *
  			background: top left  / 4em 100% linear-gradient(to right,  #ffffff, rgba(255, 255, 255, 0)) local,
  			            top right / 4em 100% linear-gradient(to left, #ffffff, rgba(255, 255, 255, 0)) local,
  			            top left  / 1em 100% linear-gradient(to right,  #c3c3c5, rgba(195, 195, 197, 0)) scroll,
  			            top right / 1em 100% linear-gradient(to left, #c3c3c5, rgba(195, 195, 197, 0)) scroll,
  			            white;
  			background-repeat: no-repeat;
  			*/
  		}
  	}
  </style>
  <style type="text/css">
      table, th, td {
        border: 1px solid black;
        border-collapse: collapse;
        vertical-align: top;
      }
      th, td {
        border-left: none;
        border-right: none;
        padding: 0px 10px;
      }
      th {
        text-align: center;
      }
    </style>
  
  <style>/* style-md-lists */
  
  /* This is a weird hack for me not yet following the commonmark spec
     regarding paragraph and lists. */
  [data-md] > :first-child {
      margin-top: 0;
  }
  [data-md] > :last-child {
      margin-bottom: 0;
  }</style>
  <style>/* style-counters */
  
  body {
      counter-reset: example figure issue;
  }
  .issue {
      counter-increment: issue;
  }
  .issue:not(.no-marker)::before {
      content: "Issue " counter(issue);
  }
  
  .example {
      counter-increment: example;
  }
  .example:not(.no-marker)::before {
      content: "Example " counter(example);
  }
  .invalid.example:not(.no-marker)::before,
  .illegal.example:not(.no-marker)::before {
      content: "Invalid Example" counter(example);
  }
  
  figcaption {
      counter-increment: figure;
  }
  figcaption:not(.no-marker)::before {
      content: "Figure " counter(figure) " ";
  }</style>
  <style>/* style-syntax-highlighting */
  
  .highlight:not(.idl) { background: hsl(24, 20%, 95%); }
  code.highlight { padding: .1em; border-radius: .3em; }
  pre.highlight, pre > code.highlight { display: block; padding: 1em; margin: .5em 0; overflow: auto; border-radius: 0; }
  .highlight .c { color: #708090 } /* Comment */
  .highlight .k { color: #990055 } /* Keyword */
  .highlight .l { color: #000000 } /* Literal */
  .highlight .n { color: #0077aa } /* Name */
  .highlight .o { color: #999999 } /* Operator */
  .highlight .p { color: #999999 } /* Punctuation */
  .highlight .cm { color: #708090 } /* Comment.Multiline */
  .highlight .cp { color: #708090 } /* Comment.Preproc */
  .highlight .c1 { color: #708090 } /* Comment.Single */
  .highlight .cs { color: #708090 } /* Comment.Special */
  .highlight .kc { color: #990055 } /* Keyword.Constant */
  .highlight .kd { color: #990055 } /* Keyword.Declaration */
  .highlight .kn { color: #990055 } /* Keyword.Namespace */
  .highlight .kp { color: #990055 } /* Keyword.Pseudo */
  .highlight .kr { color: #990055 } /* Keyword.Reserved */
  .highlight .kt { color: #990055 } /* Keyword.Type */
  .highlight .ld { color: #000000 } /* Literal.Date */
  .highlight .m { color: #000000 } /* Literal.Number */
  .highlight .s { color: #a67f59 } /* Literal.String */
  .highlight .na { color: #0077aa } /* Name.Attribute */
  .highlight .nc { color: #0077aa } /* Name.Class */
  .highlight .no { color: #0077aa } /* Name.Constant */
  .highlight .nd { color: #0077aa } /* Name.Decorator */
  .highlight .ni { color: #0077aa } /* Name.Entity */
  .highlight .ne { color: #0077aa } /* Name.Exception */
  .highlight .nf { color: #0077aa } /* Name.Function */
  .highlight .nl { color: #0077aa } /* Name.Label */
  .highlight .nn { color: #0077aa } /* Name.Namespace */
  .highlight .py { color: #0077aa } /* Name.Property */
  .highlight .nt { color: #669900 } /* Name.Tag */
  .highlight .nv { color: #222222 } /* Name.Variable */
  .highlight .ow { color: #999999 } /* Operator.Word */
  .highlight .mb { color: #000000 } /* Literal.Number.Bin */
  .highlight .mf { color: #000000 } /* Literal.Number.Float */
  .highlight .mh { color: #000000 } /* Literal.Number.Hex */
  .highlight .mi { color: #000000 } /* Literal.Number.Integer */
  .highlight .mo { color: #000000 } /* Literal.Number.Oct */
  .highlight .sb { color: #a67f59 } /* Literal.String.Backtick */
  .highlight .sc { color: #a67f59 } /* Literal.String.Char */
  .highlight .sd { color: #a67f59 } /* Literal.String.Doc */
  .highlight .s2 { color: #a67f59 } /* Literal.String.Double */
  .highlight .se { color: #a67f59 } /* Literal.String.Escape */
  .highlight .sh { color: #a67f59 } /* Literal.String.Heredoc */
  .highlight .si { color: #a67f59 } /* Literal.String.Interpol */
  .highlight .sx { color: #a67f59 } /* Literal.String.Other */
  .highlight .sr { color: #a67f59 } /* Literal.String.Regex */
  .highlight .s1 { color: #a67f59 } /* Literal.String.Single */
  .highlight .ss { color: #a67f59 } /* Literal.String.Symbol */
  .highlight .vc { color: #0077aa } /* Name.Variable.Class */
  .highlight .vg { color: #0077aa } /* Name.Variable.Global */
  .highlight .vi { color: #0077aa } /* Name.Variable.Instance */
  .highlight .il { color: #000000 } /* Literal.Number.Integer.Long */
  </style>
  <style>/* style-selflinks */
  
  .heading, .issue, .note, .example, li, dt {
      position: relative;
  }
  a.self-link {
      position: absolute;
      top: 0;
      left: calc(-1 * (3.5rem - 26px));
      width: calc(3.5rem - 26px);
      height: 2em;
      text-align: center;
      border: none;
      transition: opacity .2s;
      opacity: .5;
  }
  a.self-link:hover {
      opacity: 1;
  }
  .heading > a.self-link {
      font-size: 83%;
  }
  li > a.self-link {
      left: calc(-1 * (3.5rem - 26px) - 2em);
  }
  dfn > a.self-link {
      top: auto;
      left: auto;
      opacity: 0;
      width: 1.5em;
      height: 1.5em;
      background: gray;
      color: white;
      font-style: normal;
      transition: opacity .2s, background-color .2s, color .2s;
  }
  dfn:hover > a.self-link {
      opacity: 1;
  }
  dfn > a.self-link:hover {
      color: black;
  }
  
  a.self-link::before            { content: "¶"; }
  .heading > a.self-link::before { content: "§"; }
  dfn > a.self-link::before      { content: "#"; }</style>
  <style>/* style-autolinks */
  
  .css.css, .property.property, .descriptor.descriptor {
      color: #005a9c;
      font-size: inherit;
      font-family: inherit;
  }
  .css::before, .property::before, .descriptor::before {
      content: "‘";
  }
  .css::after, .property::after, .descriptor::after {
      content: "’";
  }
  .property, .descriptor {
      /* Don't wrap property and descriptor names */
      white-space: nowrap;
  }
  .type { /* CSS value <type> */
      font-style: italic;
  }
  pre .property::before, pre .property::after {
      content: "";
  }
  [data-link-type="property"]::before,
  [data-link-type="propdesc"]::before,
  [data-link-type="descriptor"]::before,
  [data-link-type="value"]::before,
  [data-link-type="function"]::before,
  [data-link-type="at-rule"]::before,
  [data-link-type="selector"]::before,
  [data-link-type="maybe"]::before {
      content: "‘";
  }
  [data-link-type="property"]::after,
  [data-link-type="propdesc"]::after,
  [data-link-type="descriptor"]::after,
  [data-link-type="value"]::after,
  [data-link-type="function"]::after,
  [data-link-type="at-rule"]::after,
  [data-link-type="selector"]::after,
  [data-link-type="maybe"]::after {
      content: "’";
  }
  
  [data-link-type].production::before,
  [data-link-type].production::after,
  .prod [data-link-type]::before,
  .prod [data-link-type]::after {
      content: "";
  }
  
  [data-link-type=element],
  [data-link-type=element-attr] {
      font-family: Menlo, Consolas, "DejaVu Sans Mono", monospace;
      font-size: .9em;
  }
  [data-link-type=element]::before { content: "<" }
  [data-link-type=element]::after  { content: ">" }
  
  [data-link-type=biblio] {
      white-space: pre;
  }
  </style>
</head>

<body>
<div class="container-fluid">
<div class="row">
<div id="sidebar" class="col-sm-3 col-md-2 sidebar">
<ul>
<li><a href="#summary"><span class="toc-section-number">1</span> Summary</a></li>
<li><a href="#background"><span class="toc-section-number">2</span> Background</a></li>
<li><a href="#summary-of-high-level-changes"><span class="toc-section-number">3</span> Summary of high-level changes</a><ul>
<li><a href="#parity-with-p0443"><span class="toc-section-number">3.1</span> Parity with P0443</a></li>
<li><a href="#extensions-to-p0443"><span class="toc-section-number">3.2</span> Extensions to P0443</a></li>
</ul></li>
<li><a href="#before-and-after"><span class="toc-section-number">4</span> Before and After</a></li>
<li><a href="#terminology"><span class="toc-section-number">5</span> Terminology</a></li>
<li><a href="#rationale-for-design-changes"><span class="toc-section-number">6</span> Rationale for design changes</a><ul>
<li><a href="#rationale-of-changes-to-executor-and-future-concepts"><span class="toc-section-number">6.1</span> Rationale of Changes to Executor and Future Concepts</a><ul>
<li><a href="#senders-are-futures"><span class="toc-section-number">6.1.1</span> Senders are Futures</a></li>
<li><a href="#receivers-are-continuations"><span class="toc-section-number">6.1.2</span> Receivers are Continuations</a></li>
<li><a href="#task-construction-is-separate-from-submission"><span class="toc-section-number">6.1.3</span> Task Construction is Separate From Submission</a></li>
</ul></li>
<li><a href="#rationale-of-done-signal"><span class="toc-section-number">6.2</span> Rationale of Done Signal</a></li>
<li><a href="#rationale-of-executors-as-senders-of-sub-executors"><span class="toc-section-number">6.3</span> Rationale of Executors as Senders of Sub-executors</a></li>
<li><a href="#rationale-for-requiring-all-senders-to-have-associated-executors"><span class="toc-section-number">6.4</span> Rationale for Requiring All Senders to Have Associated Executors</a></li>
</ul></li>
<li><a href="#suggested-design"><span class="toc-section-number">7</span> Suggested Design</a><ul>
<li><a href="#receiver-concepts"><span class="toc-section-number">7.1</span> Receiver Concepts</a><ul>
<li><a href="#customization-points"><span class="toc-section-number">7.1.1</span> Customization points</a></li>
<li><a href="#concept-receiver"><span class="toc-section-number">7.1.2</span> Concept <code>Receiver</code></a></li>
<li><a href="#concept-receiverof"><span class="toc-section-number">7.1.3</span> Concept <code>ReceiverOf</code></a></li>
</ul></li>
<li><a href="#sender-concepts"><span class="toc-section-number">7.2</span> Sender Concepts</a><ul>
<li><a href="#customization-points-1"><span class="toc-section-number">7.2.1</span> Customization points</a></li>
<li><a href="#concept-sender"><span class="toc-section-number">7.2.2</span> Concept <code>Sender</code></a></li>
<li><a href="#concept-typedsender"><span class="toc-section-number">7.2.3</span> Concept <code>TypedSender</code></a></li>
<li><a href="#concept-senderto"><span class="toc-section-number">7.2.4</span> Concept <code>SenderTo</code></a></li>
<li><a href="#concept-transformedsender"><span class="toc-section-number">7.2.5</span> Concept <code>TransformedSender</code></a></li>
</ul></li>
<li><a href="#executor-concepts"><span class="toc-section-number">7.3</span> Executor Concepts</a><ul>
<li><a href="#senderexecutor"><span class="toc-section-number">7.3.1</span> SenderExecutor</a></li>
<li><a href="#onewayexecutor"><span class="toc-section-number">7.3.2</span> OneWayExecutor</a></li>
</ul></li>
<li><a href="#ordering-guarantees"><span class="toc-section-number">7.4</span> Ordering guarantees</a></li>
</ul></li>
<li><a href="#extensions"><span class="toc-section-number">8</span> Extensions</a></li>
<li><a href="#qa"><span class="toc-section-number">9</span> Q&amp;A</a><ul>
<li><a href="#q-what-do-lazy-execution-and-eager-execution-mean"><span class="toc-section-number">9.1</span> Q: What do lazy execution and eager execution mean?</a></li>
<li><a href="#q-how-is-eager-execution-more-expensive-than-lazy-execution-when-concurrency-is-introduced"><span class="toc-section-number">9.2</span> Q: How is eager execution more expensive than lazy execution when concurrency is introduced?</a></li>
<li><a href="#q-in-what-specific-ways-was-p0443-failing-to-address-the-lazy-execution-scenario"><span class="toc-section-number">9.3</span> Q: In what specific ways was P0443 failing to address the lazy execution scenario?</a></li>
<li><a href="#q-what-are-senders-and-receivers-and-how-do-they-help"><span class="toc-section-number">9.4</span> Q: What are Senders and Receivers, and how do they help?</a></li>
<li><a href="#q-what-makes-stdpromisestdfuture-expensive"><span class="toc-section-number">9.5</span> Q: What makes <code>std::promise</code>/<code>std::future</code> expensive?</a></li>
<li><a href="#q-how-is-void-sendersubmitreceiver-different-from-futureu-futuretthencallable"><span class="toc-section-number">9.6</span> Q: How is <code>void sender::submit(receiver)</code> different from <code>future&lt;U&gt; future&lt;T&gt;::then(callable)</code>?</a></li>
<li><a href="#q-how-is-void-sendersubmitreceiver-different-from-void-executorexecutecallable"><span class="toc-section-number">9.7</span> Q: How is <code>void sender::submit(receiver)</code> different from <code>void executor::execute(callable)</code>?</a></li>
<li><a href="#q-what-is-the-difference-between-stdfuturet-and-sender"><span class="toc-section-number">9.8</span> Q: What is the difference between <code>std::future&lt;T&gt;</code> and <em>Sender</em>?</a></li>
</ul></li>
<li><a href="#acknowledgements"><span class="toc-section-number">10</span> Acknowledgements</a></li>
</ul>
</div>
<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="700">
  <tr>
    <td width="172" align="left" valign="top">Document number:</td>
    <td width="450">
      P1194
    </td>
  </tr>
  <tr>
    <td width="172" align="left" valign="top">Date:</td>
    <td width="450">2018-10-08</td>
  </tr>
  <tr>
    <td width="172" align="left" valign="top">Title:</td>
    <td width="600"><b>The Compromise Executors Proposal: A lazy simplification of P0443</b></td>
  </tr>
  <tr>
    <td width="172" align="left" valign="top">Audience:</td>
    <td width="500">SG1 & LEWG</td>
  </tr>
  <tr>
    <td width="172" align="left" valign="top">Reply-to:</td>
    <td width="450">
      Lee Howes        &lt;<a href="mailto:lwh@fb.com">lwh@fb.com</a>&gt;<br/>
      Eric Niebler     &lt;<a href="mailto:eniebler@fb.com">eniebler@fb.com</a>&gt;<br/>
      Kirk Shoop       &lt;<a href="mailto:kirkshoop@fb.com">kirkshoop@fb.com</a>&gt;<br/>
      Bryce Lelbach    &lt;<a href="mailto:brycelelback@gmail.com">brycelelback@gmail.com</a>&gt;<br/>
      David S. Hollman &lt;<a href="mailto:dshollm@sandia.gov">dshollm@sandia.gov</a>&gt;</td>
    </td>
  </tr>
</table>
<h1 id="summary"><span class="header-section-number">1</span> Summary</h1>
<p>This paper seeks to add support for lazy task creation and deferred execution to <a href="https://wg21.link/P0443">P0443</a>, while also simplifying the fundamental concepts involved in asynchronous execution. It seeks to do this as a minimal set of diffs to P0443. It achieves this by replacing P0443’s six <code>Executor::*execute</code> member functions with two lazy task constructors that each return a (potentially) lazy Future-like type known as a “Sender”. Work may then be submitted to the underlying execution context lazily when <code>submit</code> is called on a Sender or eagerly at task creation time, as long as the semantic constraints of the task are satisfied.</p>
<h1 id="background"><span class="header-section-number">2</span> Background</h1>
<p>P0443 presents a unified abstraction for agents of asynchronous execution. It is the result of a long collaboration between experts from many subdomains of concurrent and parallel execution, and achieved consensus within SG1 and, to some degree, LEWG. Although there were known gaps in the abstraction (e.g., reliance on an unspecified <code>Future</code> concept), there were papers in flight to address them, and for all intents and purposes P0443 seemed on-target for a TS or, possibly even C++20.</p>
<p>At the Spring 2018 meeting in Rapperswil, a significant design problem was identified: poor support for <em>lazy</em> execution, whereby executors participate in the efficient construction and optimal composition of tasks <em>prior</em> to those tasks being enqueued for execution. A solution was put forward by <a href="https://wg21.link/P1055">P1055</a>: “senders” (called “deferred” in that paper) and “receivers”. Senders and receivers could be freely composed into richer senders and receivers, and only when a receiver was “submitted” to a sender would that task be passed to an execution context for actual execution.</p>
<p>P1055 represented a radical departure from the P0443 design. LEWG deferred the decision to merge P0443 until the alternative had been explored. There are, however, good reasons to be circumspect: a significant redesign now would almost certainly push Executors, and the Networking TS which depends on it, out past C++20. Also, the authors of P1055 had not yet proved to the satisfaction of the experts in SG1 that senders and receivers could efficiently address all the use cases that shaped the design of P0443.</p>
<p>This paper seeks a middle way: a small set of changes to P0443 that improve its support for lazy execution. The changes are limited to such a degree that no functionality has been lost.</p>
<p>In the <em>ad hoc</em> Executors meeting in Bellevue, WA on Sept 22-23 2018, some polls were taken regarding overall direction of the Executors design with regards to how best to support the lazy execution scenario. The design presented in this paper (Senders and Reeivers) was endorsed by the experts there.</p>
<blockquote>
<p><strong>For the long-term direction for executors we like senders/receivers.</strong></p>
<table>
<thead>
<tr class="header">
<th>SF</th>
<th>F</th>
<th>N</th>
<th>A</th>
<th>SA</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>9</td>
<td>10</td>
<td>6</td>
<td>2</td>
<td>0</td>
</tr>
</tbody>
</table>
</blockquote>
<p><em>Note: This paper only seeks to add support for lazy task composition and execution to P0443 while maintaining feature parity with P0443. Companion papers will fill in additional gaps in P0443.</em></p>
<!--
Bryce notes that P0443 has no story for data dependencies and dependent execution, and that is another thing we would like to address, but that is left for another paper.
-->
<h1 id="summary-of-high-level-changes"><span class="header-section-number">3</span> Summary of high-level changes</h1>
<h2 id="parity-with-p0443"><span class="header-section-number">3.1</span> Parity with P0443</h2>
<p>In the interest of maintaining feature parity with P0443 while also adding support for a lazy asynchronous execution model, we suggest the following changes, which are described in more detail below.</p>
<ol type="1">
<li>The placeholder <code>Future</code> concept is renamed “<code>Sender</code>”. A sender may begin executing immediately when the sender is created, or it may defer execution until a continuation is attached.</li>
<li>The API for attaching a continuation to a task, which was <code>then</code> on the <code>Future</code> concept in P0443, is renamed “<code>submit</code>” on the <code>Sender</code> concept.</li>
<li>The <code>submit</code> API accepts a <code>Promise</code>-like object as a continuation called a <code>Receiver</code>. Like <code>std::promise</code>, it has separate APIs for setting an error or a value.</li>
<li>The <code>submit</code> API, unlike <code>Future.then</code>, returns <code>void</code>.</li>
<li>The <code>then_execute</code> API on the <code>Executor</code> concept is renamed <code>make_value_task</code>, and <code>bulk_then_execute</code> is renamed <code>bulk_make_value_task</code>. (They both return <code>Sender</code>s.)</li>
<li>The following <code>Executor</code> APIs are removed: <code>execute</code>, <code>twoway_execute</code>, <code>bulk_execute</code>, and <code>bulk_twoway_execute</code>.</li>
</ol>
<p>These changes and the rationale for each are described <a href="#rationale-of-changes-to-executor-and-future-concepts">here</a>.</p>
<h2 id="extensions-to-p0443"><span class="header-section-number">3.2</span> Extensions to P0443</h2>
<ol type="1">
<li>In addition to <code>set_error</code> and <code>set_value</code> APIs, the <code>Receiver</code> concept gets a <code>set_done</code> API by which a sender can notify a receiver that computation is finished and it will not receive either an error or a value. <a href="#rationale-of-done-signal">Rationale</a></li>
<li>In addition to <code>make_value_task</code> and <code>make_bulk_value_task</code> APIs, the <code>Executor</code> concept gets a <code>submit</code> API that takes a <code>Receiver</code> and that passes the executor or a sub-executor to the receiver. That is, an <code>Executor</code> is a <code>Sender</code> of an executor. <a href="#rationale-of-executors-as-senders-of-sub-executors">Rationale</a></li>
<li>Additionally, the <code>Sender</code> concept gets a <code>get_executor</code> API for fetching the executor associated with the sender. <a href="#rationale-for-requiring-all-senders-to-have-associated-executors">Rationale</a></li>
</ol>
<h1 id="before-and-after"><span class="header-section-number">4</span> Before and After</h1>
<p>In the table below, where a future is returned this is represented by the promise end of a future/promise pair in the compromise version. Any necessary synchronization or storage is under the control of that promise/future pair, rather than the executor, which will often allow an entirely synchronization-free structure.</p>
<table>
<colgroup>
<col style="width: 53%" />
<col style="width: 46%" />
</colgroup>
<thead>
<tr class="header">
<th>Before</th>
<th>After</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><code>executor.execute(f)</code></td>
<td><code>executor.execute(f)</code></td>
</tr>
<tr class="even">
<td><code>executor.execute(f)</code></td>
<td><code>executor.make_value_task(sender{}, f).submit(receiver{})</code></td>
</tr>
<tr class="odd">
<td><code>fut = executor.twoway_execute(f)</code></td>
<td><code>executor.make_value_task(sender{}, f).submit(futPromise)</code></td>
</tr>
<tr class="even">
<td><code>fut' = executor.then_execute(f, fut)</code></td>
<td><code>executor.make_value_task(fut, f).submit(fut'Promise)</code></td>
</tr>
<tr class="odd">
<td><code>executor.bulk_execute(f, n, sf)</code></td>
<td><code>executor.make_bulk_value_task(sender{}, f, n, sf, []{}).submit(receiver{})</code></td>
</tr>
<tr class="even">
<td><code>fut = executor.bulk_twoway_execute(f, n, sf, rf)</code></td>
<td><code>executor.make_bulk_value_task(sender{}, f, n, sf, rf).submit(futPromise{})</code></td>
</tr>
<tr class="odd">
<td><code>fut' = executor.bulk_then_execute(f, n, sf, rf, fut')</code></td>
<td><code>executor.make_bulk_value_task(fut, f, n, sf, rf).submit(fut'Promise{})</code></td>
</tr>
</tbody>
</table>
<p>Although the “after” here is more verbose, this is a natural side-effect of choosing primitives that are fewer and lowerer-level. It goes without saying that higher-level abstractions can and should be provided to simplify the usage of these primitives.</p>
<p>If a constructed task is type erased, then it may benefit from custom overloads for known trivial receiver types to optimize. If a constructed task is not type erased then the outgoing receiver will trivially inline. That goes likewise for any noop-sender.</p>
<p>We do not expect any performance difference between the two forms of the one way execute definition. The task factory-based design gives the opportunity for the application to provide a well-defined output channel for exceptions. For example, the provided output receiver could be an interface to a lock-free exception list if per-request exceptions are not required.</p>
<h1 id="terminology"><span class="header-section-number">5</span> Terminology</h1>
<p>This paper describes “task construction” and “task submission”. By the former, we mean creating task dependencies. By the latter, we mean handing the task off to an execution context for execution. We sometimes use the terms “enqueue” or “submit” as synonyms for “task submission.”</p>
<p>A particular executor may decide to perform both task creation <em>and</em> task submission in its <code>make_value_task</code>. This would be <em>eager</em>. Another may decide to only do task creation in its <code>make_value_task</code> and do task submission in the <code>submit</code> method of the returned <code>Sender</code>. That would be <em>lazy</em>.</p>
<p>Generic code that uses executors must assume the lazy case and call <code>submit</code> on the sender, even though it may do nothing more than attach a (possibly empty) continuation. It must also assume that the work associated with a task may start as eagerly as the call to <code>make_value_task</code> itself.</p>
<h1 id="rationale-for-design-changes"><span class="header-section-number">6</span> Rationale for design changes</h1>
<h2 id="rationale-of-changes-to-executor-and-future-concepts"><span class="header-section-number">6.1</span> Rationale of Changes to Executor and Future Concepts</h2>
<p>The fundamental change suggested by this paper, the one that precipitates all the other changes, is to define the <code>Future</code> concept — which was left undefined in P0443 — such that it is a handle to either an eager <em>or lazy</em> asynchronous result. Every other change suggested in this paper falls out neatly from that, and most of the changes are simply renames to avoid confusion.</p>
<p>The following describes the changes to the Executors proposal necessitated by the new, weaker semantics of the <code>Future</code> concept.</p>
<dl>
<dt>
Case 1: Eagerly queued work
</dt>
<dd>
If <code>Future</code> is eager, it’s basically <code>std::experimental::future</code> (or a non-type-erased equivalent) and everything is as in P0443.
</dd>
<dt>
Case 2: Lazily queued work
</dt>
<dd>
If <code>Future</code> is lazy, then tasks are enqueued for execution only when <code>fut.then</code> is called with a continuation. Why do this? Because a lazy <code>Future</code> can be zero overhead. Since there is never a logical race when accessing the continuation, there is no need for synchronization and no need for a dynamically allocated shared state between the promise and future.
</dd>
<dt>
<ol type="1">
<li>Use promises as continuations:
</dt>
<dd>
<a href="https://wg21.link/P1053">P1053</a> makes a strong case that the object passed to a <code>Future</code>’s <code>then</code> API should look like a promise, not like a callable. When chaining operations, a preceding operation may end with an error. Likewise, scheduling work on an execution context may also fail. (Consider the case where <code>then</code> successfully schedules work on a threadpool that dequeues work that doesn’t execute within a timeout window.) Those errors need somewhere to go. A promise has an error channel, so it gives us a logical way to chain tasks that propagate both values <em>and</em> errors.
</dd>
<dt>
<ol start="2" type="1">
<li>Make <code>then</code> return <code>void</code>:
</dt>
<dd>
To stay “eager/lazy agnostic”, <code>then</code> shouldn’t be required to return an eager future; return <code>void</code> instead, and leave task chaining to <code>then_execute</code> on the <code>Executor</code> concept.
</dd>
<dt>
<ol start="3" type="1">
<li>Rename <code>then</code> to <code>submit</code>:
</dt>
<dd>
The name “<code>then</code>” doesn’t suggest the possibility that it may in fact submit the task for execution. Rename it to “<code>submit</code>”.
</dd>
<dt>
<ol start="4" type="1">
<li>Drop <code>execute</code> and <code>bulk_execute</code> from the <code>Executor</code> concept.
</dt>
<dd>
Since <code>then_execute</code> is no longer required to return an expensive handle to a continuable, eager task, oneway execution can be efficiently built on top of <code>then_execute</code>/<code>submit</code> by passing a null sender to <code>then_execute</code> and a sink receiver to <code>submit</code>. We can drop oneway <code>execute</code> as a required part of the <code>Executor</code> concept and instead provide standard null sender and sink receiver types against which implementations are free to optimize. (The same logic lets us drop <code>bulk_execute</code> from the concept.)
</dd>
<dt>
<ol start="5" type="1">
<li>Drop <code>twoway_execute</code> and <code>bulk_twoway_execute</code>:
</dt>
<dd>
Similarly, <code>twoway_execute</code> can be efficiently built on top of <code>then_execute</code>/<code>submit</code> by passing a null sender to <code>then_execute</code> and the promise of an eager future to <code>submit</code>, so we can drop <code>twoway_execute</code> as a required part of the <code>Executor</code> concept (and by extension, <code>bulk_twoway_execute</code>).
</dd>
<dt>
<ol start="6" type="1">
<li>Rename <code>then_execute</code> on the <code>Executor</code> concept to <code>make_value_task</code>.
</dt>
<dd>
Since “<code>then_execute</code>” really just builds a link in a task chain without necessarily enqueueing it for execution, rename it to “<code>make_value_task</code>”.
</dd>
</dl></li>
</ol></li>
</ol></li>
</ol></li>
</ol></li>
</ol></li>
</ol>
<p>Done. We have now arrived at the executors design suggested by this paper. As we hope the above shows, <code>Sender</code> and <code>Receiver</code> are really just a minor reformulation of concepts that already appear in P0443 and related papers.</p>
<h3 id="senders-are-futures"><span class="header-section-number">6.1.1</span> Senders are Futures</h3>
<p>Four of the the six <code>execute</code> functions from P0443 return a type that satisfies the as-yet-unspecified <code>Future</code> concept. A <code>Future</code> in the latest draft of P0443, which references the Concurrency TS, is a handle to an already-queued work item to which additional work can be chained by passing it back to an executor’s <code>(bulk_)?then_execute</code> function, along wih a continuation that will execute when the queued work completes.</p>
<p>A sender is a generalization of a future. It <em>may</em> be a handle to already queued work, or it may represent work that will be queued when a continuation has been attached, which is accomplished by passing a “continuation” to the sender’s <code>submit</code> member function. This is akin to a future that launches work in its <code>then</code> API.</p>
<h3 id="receivers-are-continuations"><span class="header-section-number">6.1.2</span> Receivers are Continuations</h3>
<p>In P0443, a continuation was a simple callable, but that didn’t give a convenient place for errors to go if the preceding computation failed. This shortcoming had already been recognized, and was a subject of P1053, which recommended <em>promises</em> — which have both a value and an error channel — as a useful abstraction for continuations. A <code>Receiver</code> is little more than a promise, with the addition of a channel for a “done” signal.</p>
<p>In short, if you squint at P0443 and P1053, the sender and receiver concepts are already there. They just weren’t fully spelled out.</p>
<h3 id="task-construction-is-separate-from-submission"><span class="header-section-number">6.1.3</span> Task Construction is Separate From Submission</h3>
<p>The effect of the changes suggested by this proposal is to break the <code>execute</code> functions up into two steps:</p>
<ul>
<li>Task creation (<code>s = ex.make_(bulk_)?value_task(...)</code>), and</li>
<li>Work submission (<code>s.submit(...)</code>).</li>
</ul>
<p>It is not hard to see how the reformulation is isometric with the original:</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode cpp"><code class="sourceCode cpp"><a class="sourceLine" id="cb1-1" data-line-number="1"><span class="co">// Create a task and immediately submit it for execution:</span></a>
<a class="sourceLine" id="cb1-2" data-line-number="2"><span class="kw">auto</span> fut2 = ex.then_execute(fut1, fn);</a></code></pre></div>
<p>maps cleanly to:</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode cpp"><code class="sourceCode cpp"><a class="sourceLine" id="cb2-1" data-line-number="1"><span class="co">// Create a task:</span></a>
<a class="sourceLine" id="cb2-2" data-line-number="2"><span class="kw">auto</span> sender2 = ex.make_value_task(sender1, fn);</a>
<a class="sourceLine" id="cb2-3" data-line-number="3"><span class="co">// Submit it for execution:</span></a>
<a class="sourceLine" id="cb2-4" data-line-number="4">sender2.submit(p2);</a></code></pre></div>
<p>… where <code>p2</code> is possibly a promise corresponding to <code>fut2</code> from above, though it need not be.</p>
<p>Four of the P0443 <code>execute</code> functions return a future. The type of the future is under the executor’s control. By splitting <code>execute</code> into lazy task construction and a (<code>void</code>-returning) work submission API, we enable lazy futures because the code returning the future can rely on the fact that submit will be called later by the caller. With that knowledge, the lazy future is safe to return because we can rely on it being submitted separately.</p>
<p>We optionally lose the ability to block on completion of the task at task construction time. As <code>submit</code> is to be called anyway (except for the pure oneway executor case where submit is implicit) it is cleaner to apply the blocking semantic to the invocation of <code>submit</code>. In particular, this approach allows us to build executors that return senders that block on completion but are still lazy.</p>
<p><span class="note"><strong>Weakening the Future Concept</strong><br/><br/>Permitting a <code>Future</code> to have either eager or lazy submission semantics is a weakening of the concept. Before permitting lazy semantics, the semantics of the <code>Future</code> concept were very strong: it was possible to say exactly when work would be enqueued. That strength came at a cost: creating dependent execution chains was expensive, and complexity was needed in the executors to avoid the expense in some limited situations.<br/><br/>Weakening the <code>Future</code> concept permits more types to satisfy the concept without the overhead needed to meet the strong semantics. This in turn lets us drop the compexity in executors, which no longer needs to worry about how to magically and efficiently stitch together dependent chains of execution.</span></p>
<h2 id="rationale-of-done-signal"><span class="header-section-number">6.2</span> Rationale of Done Signal</h2>
<p>In addition to a <code>set_error</code> and <code>set_value</code> API, the <code>Receiver</code> concept gets a <code>set_done</code> API by which a sender can notify a receiver that computation is finished and it will not receive either an error or a value.</p>
<p>In acknowlegement of the fact that some tasks will want to support cancellation (by some unspecified means), this paper suggests a mechanism by with a <code>Sender</code> can notify a <code>Receiver</code> that the task is completing without either an error or a value. This is with a <code>done</code> API as part of the <code>Receiver</code> concept. <em>This is not a cancellation mechanism</em>; rather, it is a means by which a cancellation mechanism can notify downstream computations that they will not execute.</p>
<p>The name <code>done</code> is chosen for two reasons: 1. Calling it <code>cancel</code> will obviously lead to confusion since this is not a way to cancel an asynchronous task. 2. The <code>Sender</code> and <code>Receiver</code> concepts naturally extend to multi-value asynchronous computations, also knows as <em>streams</em> (not to be confused with C++98 iostreams). In the stream case, a <code>Sender</code> calls the receiver’s <code>value</code> API multiple times, terminating the stream by calling <code>done</code> on the <code>Receiver</code> to let it know that no additional values are forthcoming. <span class="note">[<em>Editor’s note:</em> Streams are a planned extension, but are not a part of this proposal. <em>— end note</em>]</p>
<h2 id="rationale-of-executors-as-senders-of-sub-executors"><span class="header-section-number">6.3</span> Rationale of Executors as Senders of Sub-executors</h2>
<p>In a great many interesting scenarios, a launched task needs to know something about the execution agent on which it is executing. Perhaps the task needs to submit nested work to be run on a similar agent, for instance. The exact characteristics of the agent an executor decides to schedule the work on (beyond those explicitly guaranteed by the executor) can be entirely runtime dependent. For instance, a thread pool executor doesn’t know <em>a priori</em> on which thread it will schedule a task, and that information could be critical for efficient scheduling of nested tasks or correct use of thread-specific state.</p>
<p>In order to keep this information in-band, an <code>Executor</code> is a <code>Sender</code> whose <code>submit(...)</code> API passes itself or some sub-executor through the value channel. In practice, a <code>Sender</code> returned from <code>make_value_task(...)</code> could work like this:</p>
<ol type="1">
<li><code>ex.make_value_task(s1, fn)</code> returns <code>s2</code> that knows about <code>ex</code>, <code>s1</code>, and <code>fn</code>.</li>
<li><code>s2.submit(r1)</code> creates a new receiver <code>r2</code> that knows about <code>ex</code>, <code>fn</code>, and <code>r1</code> and passes that to <code>s1.submit(r2)</code>.</li>
<li>If <code>s1</code> completes with a value, it calls <code>r2.set_value(v1)</code>.</li>
<li><code>r2.set_value(v1)</code> builds a new receiver <code>r3</code> that captures <code>fn</code>, <code>v1</code>, and <code>r1</code> and passes that to <code>ex.submit(r3)</code>.</li>
<li><code>ex.submit(r3)</code> makes a decision about where and how to execute <code>r3</code> and calls <code>r3.set_value(subex)</code>, where <code>subex</code> is an executor that encapsulates that decision. (<code>subex</code> is possibly a copy of <code>ex</code> itself.)</li>
<li><code>r3.set_value(subex)</code> now has (a) the value <code>v1</code> produced by <code>s1</code>, (b) the function <code>fn</code> passed to <code>make_value_task</code>, and (c) a handle to the execution context on which it is currently running. In the simple case, it simply calls <code>r1.set_value(fn(v1))</code>, but it may do anything it pleases including submitting more work to the execution context to which <code>subex</code> is a handle.</li>
</ol>
<p>With this structure, eager executors have the flexibility to create <code>r2</code> eagerly but defer the creation of <code>r3</code> until the decision about where and how to run the task is made. This is a natural fit for how, for instance, many modern work-stealing schedulers interact with eager dependency expression.</p>
<h2 id="rationale-for-requiring-all-senders-to-have-associated-executors"><span class="header-section-number">6.4</span> Rationale for Requiring All Senders to Have Associated Executors</h2>
<p>In the executor worldview (even in P0443), all work is carried out on one or more execution agents. While the association of execution agents with work need not happen when that work is created, the association with an entity responsible for the creation of those agents always happens as the work is created. This has not changed from P0443. In this proposal, we represent this association by saying that all <code>Sender</code>s have executors. Since Senders are a representation of (potentially deferred) work, their association with an entity responsible for creation of agents to execute that work happens when the Sender is constructed; this is semantically evident from the fact that <code>make_value_task</code>, which returns a Sender, is a part of the interface of the executor type.</p>
<h1 id="suggested-design"><span class="header-section-number">7</span> Suggested Design</h1>
<p><span class="note"><em>[Editorial note:</em> The discussed compromise is that we should replace the enqueue functions (<code>ex.*execute</code>) with a limited set of (potentially lazy) task factories. Any syntactic cost of providing a trivial output receiver (i.e., a sink) to these operations can be hidden in wrapper functions. We do not expect a runtime cost assuming we also provide a trivial parameter-dropping receiver in the standard library against which an implementation can optimize.<br/><br/>By passing a full set of parameters to task construction functions, any task we place in a task graph may be type erased with no loss of efficiency. There may still be some loss of efficiency if the executor is type erased before task construction because the compiler may no longer be able to see from the actual executor into the passed functions. The earlier we perform this operation, however, the more chance there is of making this work effectively. <em>— end note]</em></span></p>
<h2 id="receiver-concepts"><span class="header-section-number">7.1</span> Receiver Concepts</h2>
<p><strong>Summary:</strong></p>
<ul>
<li><code>Receiver&lt;To&gt;</code>: A type that declares itself to be a receiver by responding to the <code>receiver_t</code> property query.</li>
<li><code>ReceiverOf&lt;To, E, T...&gt;</code>: A receiver that accepts an error of type <code>E</code> and the (possibly empty) set of values <code>T...</code>. (This concept is useful for constraining a <code>Sender</code>’s <code>submit</code> member function.)</li>
</ul>
<h3 id="customization-points"><span class="header-section-number">7.1.1</span> Customization points</h3>
<p><code>Receiver</code> is defined in terms of the following global customization point objects (shown as free functions for the purpose of exposition). These customization points are defined in terms of an exposition-only <em><code>_ReceiverLike</code></em> concept that checks only that a type responds to the <code>receiver_t</code> property query. These customization point objects are all declared in the <code>std::execution</code> namespace.</p>
<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<thead>
<tr class="header">
<th>Signature</th>
<th>Semantics</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><code>template &lt; _ReceiverLike To &gt;</code> <br/> <code>void set_done(To&amp; to);</code></td>
<td><strong>Cancellation channel:</strong><br/>Dispatches to <code>to.set_done</code> if that expression is well-formed; otherwise, dispatches to (unqualified) <code>set_done(to)</code> in a context that doesn’t contain the <code>execution::set_done</code> customization point object.</td>
</tr>
<tr class="even">
<td><code>template &lt; _ReceiverLike To, class E &gt;</code> <br/> <code>void set_error(To&amp; to, E&amp;&amp; e);</code></td>
<td><strong>Error channel:</strong><br/>Dispatches to <code>to.set_error((E&amp;&amp;) e)</code> if that expression is well-formed; otherwise, dispatches to (unqualified) <code>set_error(to, (E&amp;&amp;) e)</code> in a context that doesn’t contain the <code>execution::set_error</code> customization point object.</td>
</tr>
<tr class="odd">
<td><code>template &lt; _ReceiverLike To, class... Vs &gt;</code> <br/> <code>void set_value(To&amp; to, Vs&amp;&amp;... vs);</code></td>
<td><strong>Value channel:</strong><br/>Dispatches to <code>to.set_value((Vs&amp;&amp;) vs...)</code> if that expression is well-formed; otherwise, dispatches to (unqualified) <code>set_value(to, (Vs&amp;&amp;) vs...)</code> in a context that doesn’t contain the <code>execution::set_value</code> customization point object.</td>
</tr>
</tbody>
</table>
<h3 id="concept-receiver"><span class="header-section-number">7.1.2</span> Concept <code>Receiver</code></h3>
<div class="sourceCode" id="cb3"><pre class="sourceCode cpp"><code class="sourceCode cpp"><a class="sourceLine" id="cb3-1" data-line-number="1"><span class="kw">struct</span> <span class="dt">receiver_t</span> {</a>
<a class="sourceLine" id="cb3-2" data-line-number="2">  <span class="at">static</span> <span class="kw">inline</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="at">const</span> is_requirable = <span class="kw">false</span>;</a>
<a class="sourceLine" id="cb3-3" data-line-number="3">  <span class="at">static</span> <span class="kw">inline</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="at">const</span> is_preferable = <span class="kw">false</span>;</a>
<a class="sourceLine" id="cb3-4" data-line-number="4">};</a>
<a class="sourceLine" id="cb3-5" data-line-number="5"></a>
<a class="sourceLine" id="cb3-6" data-line-number="6"><span class="kw">template</span> &lt;<span class="kw">class</span> To&gt;</a>
<a class="sourceLine" id="cb3-7" data-line-number="7">concept Receiver =</a>
<a class="sourceLine" id="cb3-8" data-line-number="8">  requires (To&amp; to) {</a>
<a class="sourceLine" id="cb3-9" data-line-number="9">    execution::query(to, <span class="dt">receiver_t</span>{});</a>
<a class="sourceLine" id="cb3-10" data-line-number="10">    execution::set_done(to);</a>
<a class="sourceLine" id="cb3-11" data-line-number="11">  };</a></code></pre></div>
<h3 id="concept-receiverof"><span class="header-section-number">7.1.3</span> Concept <code>ReceiverOf</code></h3>
<div class="sourceCode" id="cb4"><pre class="sourceCode cpp"><code class="sourceCode cpp"><a class="sourceLine" id="cb4-1" data-line-number="1"><span class="kw">template</span> &lt;<span class="kw">class</span> To, <span class="kw">class</span> E = exception_ptr, <span class="kw">class</span>... Args&gt;</a>
<a class="sourceLine" id="cb4-2" data-line-number="2">concept ReceiverOf =</a>
<a class="sourceLine" id="cb4-3" data-line-number="3">  Receiver&lt;To&gt; &amp;&amp;</a>
<a class="sourceLine" id="cb4-4" data-line-number="4">  requires (To&amp; to, E&amp;&amp; e, Args&amp;&amp;... args) {</a>
<a class="sourceLine" id="cb4-5" data-line-number="5">    execution::set_error(to, (E&amp;&amp;) e);</a>
<a class="sourceLine" id="cb4-6" data-line-number="6">    execution::set_value(to, (Args&amp;&amp;) args...);</a>
<a class="sourceLine" id="cb4-7" data-line-number="7">  };</a></code></pre></div>
<h2 id="sender-concepts"><span class="header-section-number">7.2</span> Sender Concepts</h2>
<p><strong>Summary:</strong></p>
<ul>
<li><code>Sender&lt;From&gt;</code>: A type that declares itself to be a sender by responding to the <code>sender_t</code> property query and that has a <code>get_executor</code> API for accessing the sender’s executor.</li>
<li><code>TypedSender&lt;From&gt;</code>: A <code>Sender</code> that returns a <code>sender_desc&lt;E, T...&gt;</code> descriptor from the <code>sender_t</code> property query that declares what types are to be passed through the receiver’s error and value channels.</li>
<li><code>SenderTo&lt;From, To&gt;</code>: A <code>Sender</code> and <code>Receiver</code> that are compatible.</li>
<li><code>TransformedSender&lt;From, Fun&gt;</code>: A <code>TypedSender</code> and an <code>Invocable</code> that are compatible.</li>
</ul>
<h3 id="customization-points-1"><span class="header-section-number">7.2.1</span> Customization points</h3>
<p>These customization-points are defined in terms of an exposition-only <em><code>_SenderLike&lt;From&gt;</code></em> concept that checks only that a type responds to the <code>sender_t</code> property query; and <em><code>_Executor&lt;Ex&gt;</code></em> represents a refinement of <code>TypedSender</code> that is a light-weight handle to an execution context, and that sends a single value through the value channel representing another executor (or itself). <em><code>_SenderOf&lt;From, T...&gt;</code></em> is a <code>TypedSender</code> that sends <code>T...</code> to its receiver through the value channel. These customization point objects are all declared in the <code>std::execution</code> namespace.</p>
<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<thead>
<tr class="header">
<th>Signature</th>
<th>Semantics</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><code>template &lt; _SenderLike From &gt;</code> <br/> <code>_Executor&amp;&amp; get_executor(From&amp; from);</code></td>
<td><strong>Executor access:</strong><br/>asks a sender for its associated executor. Dispatches to <code>from.get_executor()</code> if that expression is well-formed and returns a <em><code>_SenderLike</code></em>; otherwise, dispatches to (unqualified) <code>get_executor(from)</code> in a context that doesn’t include the <code>execution::get_executor</code> customization point object and that does include the following function:<br/><br/>  <code>template&lt; _Executor Exec &gt;</code><br/>  <code>Exec get_executor(Exec exec) {</code><br/>      <code>return (Exec&amp;&amp;) exec;</code><br/>  <code>}</code><br/><br/><strong>Semantics:</strong><br/>Receivers passed to this sender’s <code>submit</code> function (see below) will be executed by an agent “owned” by the executor returned by the <code>get_executor</code> accessor.</td>
</tr>
<tr class="even">
<td><code>template &lt; _Executor Exec, Sender Fut, class Fun &gt;</code><br/>  <code>requires !TypedSender&lt;Fut&gt; || TransformedSender&lt;Fut, Fun&gt;</code><br/><code>Sender make_value_task(</code><br/>    <code>Exec&amp; exec,</code><br/>    <code>Fut fut,</code><br/>    <code>Fun fun);</code></td>
<td><strong>Task construction (w/optional eager submission):</strong><br/>Dispatches to <code>exec.make_value_task((Fut&amp;&amp;)fut, (Fun&amp;&amp;)fun)</code> if that expression is well-formed and returns a <code>Sender</code>; otherwise, dispatches to (unqualified) <code>make_value_task(exec, (Fut&amp;&amp;)fut, (Fun&amp;&amp;)fun)</code> in a context that doesn’t include the <code>execution::make_value_task</code> customization point object.<br/><br/>Let <code>T...</code> be the types that <code>From</code> will pass to its receiver through the value channel. The returned sender <code>S</code> satisfies <code>_SenderOf&lt;S, invoke_result_t&lt;Fun, T...&gt;&gt;</code>, or <code>_SenderOf&lt;S&gt;</code> if <code>invoke_result_t&lt;Fun, T...&gt;</code> is <code>void</code>.<br/><br/>Logically, <code>make_value_task</code> constructs a new sender <code>S</code> that, when submitted with a particular receiver <code>R</code>, effects a transition to the execution context represented by <code>Exec</code>. In particular:<br/>  • <code>submit(S,R)</code> constructs a new receiver <code>R'</code> that wraps <code>R</code> and <code>Exec</code>, and calls <code>submit(fut, R')</code>.<br/>  • If <code>fut</code> completes with a done signal by calling <code>set_done(R')</code>, then <code>R'</code>’s <code>set_done</code> method effects a transition to <code>exec</code>’s execution context and propagates the signal by calling <code>set_done(R)</code>.<br/>  • Otherwise, if <code>fut</code> completes with an error signal by calling <code>set_error(R', E)</code>, then <code>R'</code>’s <code>set_error</code> method <em>attempts</em> a transition to <code>exec</code>’s execution context and propagates the signal by calling <code>set_error(R, E)</code>. (The attempt to transition execution contexts in the error channel may or may not succeed. A particular executor may make stronger guarantees about the execution context used for the error signal.)<br/>   • Otherwise, if <code>fut</code> completes with a value signal by calling <code>set_value(R', Vs...)</code>, then <code>R'</code>’s <code>set_value</code> method effects a transition to <code>exec</code>’s execution context and propagates the signal by calling <code>set_value(R, fun(Vs...))</code> — or, if the type of <code>fun(Vs...)</code> is <code>void</code>, by calling <code>fun(Vs...)</code> followed by <code>set_value(R)</code>.<br/><br/><strong>Eager submission:</strong><br/> <code>make_value_task</code> may return a lazy sender, or it may eagerly queue work for submission. In the latter case, the task is executed by passing to <code>submit</code> an eager receiver such as a <code>promise</code> of a continuable <code>future</code> so that the returned sender may still have work chained to it.<br/><br/><strong>Guarantees:</strong> <br/>The actual queuing of work happens-after entry to <code>make_value_task</code> and happens-before <code>submit</code>, when called on the resulting sender (see below), returns.</td>
</tr>
<tr class="odd">
<td><code>template &lt; _Executor Exec, Sender Fut, class Fun,</code><br/>            <code>Invocable ShapeFactory, Invocable SharedFactory,</code><br/>            <code>Invocable ResultFactory &gt;</code><br/>  <code>requires !TypedSender&lt;Fut&gt; || TransformedSender&lt;Fut, Fun&gt;</code><br/><code>Sender make_bulk_value_task(</code><br/>    <code>Exec&amp; exec,</code><br/>    <code>Fut fut,</code><br/>    <code>Fun fun,</code><br/>    <code>ShapeFactory shf,</code><br/>    <code>SharedFactory sf,</code><br/>    <code>ResultFactory rf);</code></td>
<td><strong>Task construction (w/optional eager submission):</strong><br/>Dispatches to <code>exec.make_bulk_value_task((Fut&amp;&amp;)fut, (Fun&amp;&amp;)fun, shf, sf, rf)</code> if that expression is well-formed and returns a <code>Sender</code>; otherwise, dispatches to (unqualified) <code>make_bulk_value_task(exec, (Fut&amp;&amp;)fut, (Fun&amp;&amp;)fun, shf, sf, rf)</code> in a context that doesn’t include the <code>execution::make_bulk_value_task</code> customization point object.<br/><br/>Let <code>T...</code> be the types that <code>From</code> will pass to its receiver through the value channel. The returned sender <code>S</code> satisfies <code>_SenderOf&lt;S, invoke_result_t&lt;Fun, T...&gt;&gt;</code>, or <code>_SenderOf&lt;S&gt;</code> if <code>invoke_result_t&lt;Fun, T...&gt;</code> is <code>void</code>.<br/><br/>Logically, <code>make_bulk_value_task</code> constructs a new sender <code>S</code> that, when submitted with a particular receiver <code>R</code>, effects a transition to the execution context represented by <code>Exec</code>. In particular:<br/>  • <code>submit(S,R)</code> constructs a new receiver <code>R'</code> that wraps <code>R</code> and <code>Exec</code>, and calls <code>submit(fut, R')</code>.<br/>  • If <code>fut</code> completes with a done signal by calling <code>set_done(R')</code>, then <code>R'</code>’s <code>set_done</code> method effects a transition to <code>exec</code>’s execution context and propagates the signal by calling <code>set_done(R)</code>.<br/>  • Otherwise, if <code>fut</code> completes with an error signal by calling <code>set_error(R', E)</code>, then <code>R'</code>’s <code>set_error</code> method <em>attempts</em> a transition to <code>exec</code>’s execution context and propagates the signal by calling <code>set_error(R, E)</code>. (The attempt to transition execution contexts in the error channel may or may not succeed. A particular executor may make stronger guarantees about the execution context used for the error signal.)<br/>   • Otherwise, if <code>fut</code> completes with a value signal by calling <code>set_value(R', Vs...)</code>, then <code>R'</code>’s <code>set_value</code> method effects a transition to <code>exec</code>’s execution context and propagates the signal as if by executing the algorithm:<br/><br/><code>auto shr = sf();</code><br/><code>auto res = rf();</code><br/><code>for(idx : shf()) {</code><br/>    <code>fun(idx, t..., sf, rf);</code><br/><code>}</code><br/><code>set_value(R, std::move(res));</code><br/><br/> — or, if the type of <code>RF()</code> is <code>void</code> or no <code>RF</code> is provided, as if by executing:<br/><br/><code>auto shr = sf();</code><br/><code>for(idx : shf()) {</code><br/>    <code>fun(idx, t..., sf);</code><br/><code>}</code><br/><code>set_value(R);</code>.<br/><br/><strong>Eager submission:</strong><br/> <code>make_bulk_value_task</code> may return a lazy sender, or it may eagerly queue work for submission. In the latter case, the task is executed by passing to <code>submit</code> an eager receiver such as a <code>promise</code> of a continuable <code>future</code> so that the returned sender may still have work chained to it.<br/><br/><strong>Guarantees:</strong> <br/>The actual queuing of work happens-after entry to <code>make_bulk_value_task</code> and happens-before <code>submit</code>, when called on the resulting sender (see below), returns.</td>
</tr>
<tr class="even">
<td><code>template &lt; _SenderLike From, Receiver To &gt;</code><br/><code>void submit(From&amp; from, To to);</code></td>
<td><strong>Work submission.</strong><br/>Dispatches to <code>from.submit((To&amp;&amp;) to)</code> if that expression is well-formed; otherwise, dispatches to (unqualified) <code>submit(from, (To&amp;&amp;)to)</code> in a context that doesn’t include the <code>execution::submit</code> customization point object.<br/><br/><strong>Guarantees:</strong> <br/>The actual queuing of any asynchronous work that this sender represents happens-before <code>submit</code> returns.</td>
</tr>
</tbody>
</table>
<h3 id="concept-sender"><span class="header-section-number">7.2.2</span> Concept <code>Sender</code></h3>
<div class="sourceCode" id="cb5"><pre class="sourceCode cpp"><code class="sourceCode cpp"><a class="sourceLine" id="cb5-1" data-line-number="1"><span class="kw">template</span> &lt;<span class="kw">class</span> Error = exception_ptr, <span class="kw">class</span>... Args&gt;</a>
<a class="sourceLine" id="cb5-2" data-line-number="2"><span class="kw">struct</span> sender_desc {</a>
<a class="sourceLine" id="cb5-3" data-line-number="3">  <span class="kw">using</span> <span class="dt">error_type</span> = Error;</a>
<a class="sourceLine" id="cb5-4" data-line-number="4">  <span class="kw">template</span> &lt;<span class="kw">template</span> &lt;<span class="kw">class</span>...&gt; <span class="kw">class</span> List&gt;</a>
<a class="sourceLine" id="cb5-5" data-line-number="5">  <span class="kw">using</span> value_types = List&lt;Args...&gt;;</a>
<a class="sourceLine" id="cb5-6" data-line-number="6">};</a>
<a class="sourceLine" id="cb5-7" data-line-number="7"></a>
<a class="sourceLine" id="cb5-8" data-line-number="8"><span class="kw">struct</span> <span class="dt">sender_t</span> {</a>
<a class="sourceLine" id="cb5-9" data-line-number="9">  <span class="at">static</span> <span class="kw">inline</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="at">const</span> is_requirable = <span class="kw">false</span>;</a>
<a class="sourceLine" id="cb5-10" data-line-number="10">  <span class="at">static</span> <span class="kw">inline</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="at">const</span> is_preferable = <span class="kw">false</span>;</a>
<a class="sourceLine" id="cb5-11" data-line-number="11">};</a>
<a class="sourceLine" id="cb5-12" data-line-number="12"></a>
<a class="sourceLine" id="cb5-13" data-line-number="13"><span class="co">// Exposition only:</span></a>
<a class="sourceLine" id="cb5-14" data-line-number="14"><span class="kw">template</span> &lt;<span class="kw">class</span> From&gt;</a>
<a class="sourceLine" id="cb5-15" data-line-number="15">concept _Sender =</a>
<a class="sourceLine" id="cb5-16" data-line-number="16">  requires (From&amp; from) {</a>
<a class="sourceLine" id="cb5-17" data-line-number="17">      execution::query(from, <span class="dt">sender_t</span>{});</a>
<a class="sourceLine" id="cb5-18" data-line-number="18">  };</a>
<a class="sourceLine" id="cb5-19" data-line-number="19"></a>
<a class="sourceLine" id="cb5-20" data-line-number="20"><span class="kw">template</span> &lt;<span class="kw">class</span> From&gt;</a>
<a class="sourceLine" id="cb5-21" data-line-number="21">concept Sender =</a>
<a class="sourceLine" id="cb5-22" data-line-number="22">  _Sender&lt;From&gt; &amp;&amp;</a>
<a class="sourceLine" id="cb5-23" data-line-number="23">  requires (From&amp; from) {</a>
<a class="sourceLine" id="cb5-24" data-line-number="24">      get_executor(from) -&gt; _Sender;</a>
<a class="sourceLine" id="cb5-25" data-line-number="25">  };</a></code></pre></div>
<h3 id="concept-typedsender"><span class="header-section-number">7.2.3</span> Concept <code>TypedSender</code></h3>
<div class="sourceCode" id="cb6"><pre class="sourceCode cpp"><code class="sourceCode cpp"><a class="sourceLine" id="cb6-1" data-line-number="1"><span class="kw">template</span> &lt;<span class="kw">class</span> From&gt;</a>
<a class="sourceLine" id="cb6-2" data-line-number="2">concept TypedSender =</a>
<a class="sourceLine" id="cb6-3" data-line-number="3">  Sender&lt;From&gt; &amp;&amp;</a>
<a class="sourceLine" id="cb6-4" data-line-number="4">  requires (From&amp; from) {</a>
<a class="sourceLine" id="cb6-5" data-line-number="5">    { execution::query(from, <span class="dt">sender_t</span>{}) } -&gt; sender_desc&lt;<span class="kw">auto</span>, <span class="kw">auto</span>...&gt;;</a>
<a class="sourceLine" id="cb6-6" data-line-number="6">  };</a></code></pre></div>
<h3 id="concept-senderto"><span class="header-section-number">7.2.4</span> Concept <code>SenderTo</code></h3>
<div class="sourceCode" id="cb7"><pre class="sourceCode cpp"><code class="sourceCode cpp"><a class="sourceLine" id="cb7-1" data-line-number="1"><span class="kw">template</span> &lt;<span class="kw">class</span> From, <span class="kw">class</span> To&gt;</a>
<a class="sourceLine" id="cb7-2" data-line-number="2">concept SenderTo =</a>
<a class="sourceLine" id="cb7-3" data-line-number="3">  Sender&lt;From&gt; &amp;&amp;</a>
<a class="sourceLine" id="cb7-4" data-line-number="4">  Receiver&lt;To&gt; &amp;&amp;</a>
<a class="sourceLine" id="cb7-5" data-line-number="5">  requires (From&amp; from, To&amp;&amp; to) {</a>
<a class="sourceLine" id="cb7-6" data-line-number="6">    execution::submit(from, (To&amp;&amp;) to);</a>
<a class="sourceLine" id="cb7-7" data-line-number="7">  };</a></code></pre></div>
<h3 id="concept-transformedsender"><span class="header-section-number">7.2.5</span> Concept <code>TransformedSender</code></h3>
<div class="sourceCode" id="cb8"><pre class="sourceCode cpp"><code class="sourceCode cpp"><a class="sourceLine" id="cb8-1" data-line-number="1"><span class="co">// Exposition only:</span></a>
<a class="sourceLine" id="cb8-2" data-line-number="2"><span class="kw">template</span> &lt;TypedSender From&gt;</a>
<a class="sourceLine" id="cb8-3" data-line-number="3"><span class="kw">using</span> __sender_desc_of =</a>
<a class="sourceLine" id="cb8-4" data-line-number="4">  <span class="kw">decltype</span>(execution::query(declval&lt;From&amp;&gt;(), <span class="dt">sender_t</span>{}));</a>
<a class="sourceLine" id="cb8-5" data-line-number="5"></a>
<a class="sourceLine" id="cb8-6" data-line-number="6"><span class="co">// Exposition only:</span></a>
<a class="sourceLine" id="cb8-7" data-line-number="7"><span class="kw">template</span> &lt;<span class="kw">class</span> Fun&gt;</a>
<a class="sourceLine" id="cb8-8" data-line-number="8"><span class="kw">struct</span> __transformed_sender_traits {</a>
<a class="sourceLine" id="cb8-9" data-line-number="9">  <span class="kw">template</span> &lt;<span class="kw">class</span>... Vs&gt;</a>
<a class="sourceLine" id="cb8-10" data-line-number="10">  <span class="kw">using</span> __invoke_with_t = <span class="dt">invoke_result_t</span>&lt;Fun, Vs...&gt;;</a>
<a class="sourceLine" id="cb8-11" data-line-number="11"></a>
<a class="sourceLine" id="cb8-12" data-line-number="12">  <span class="kw">template</span> &lt;TypedSender From&gt;</a>
<a class="sourceLine" id="cb8-13" data-line-number="13">  <span class="kw">using</span> __result_t = <span class="kw">typename</span> __sender_desc_of&lt;From&gt;::</a>
<a class="sourceLine" id="cb8-14" data-line-number="14">    <span class="kw">template</span> value_types&lt;__invoke_with_t&gt;;</a>
<a class="sourceLine" id="cb8-15" data-line-number="15">};</a>
<a class="sourceLine" id="cb8-16" data-line-number="16"></a>
<a class="sourceLine" id="cb8-17" data-line-number="17"><span class="kw">template</span> &lt;<span class="kw">class</span> From, <span class="kw">class</span> Fun&gt;</a>
<a class="sourceLine" id="cb8-18" data-line-number="18">concept TransformedSender =</a>
<a class="sourceLine" id="cb8-19" data-line-number="19">    TypedSender&lt;From&gt; &amp;&amp;</a>
<a class="sourceLine" id="cb8-20" data-line-number="20">    requires {</a>
<a class="sourceLine" id="cb8-21" data-line-number="21">      <span class="kw">typename</span> __transformed_sender_traits&lt;Fun&gt;::</a>
<a class="sourceLine" id="cb8-22" data-line-number="22">        <span class="kw">template</span> __result_t&lt;From&gt;;</a>
<a class="sourceLine" id="cb8-23" data-line-number="23">    };</a></code></pre></div>
<h2 id="executor-concepts"><span class="header-section-number">7.3</span> Executor Concepts</h2>
<p>An executor should either be a sender of a sub executor, or a one way fire and forget entity. These can be implemented in terms of each other, and so can be adapted if necessary, potentially with some loss of information.</p>
<p>These executor concepts support P0443 style properties (e.g. <code>require</code> or <code>prefer</code>).</p>
<h3 id="senderexecutor"><span class="header-section-number">7.3.1</span> SenderExecutor</h3>
<p>A <code>SenderExecutor</code> is a <code>Sender</code> and meets the requirements of Sender. The interface of the passed receiver should be noexcept.</p>
<table>
<colgroup>
<col style="width: 47%" />
<col style="width: 52%" />
</colgroup>
<thead>
<tr class="header">
<th>Function</th>
<th>Semantics</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><code>void submit(ReceiverOf&lt;</code> <em><code>E</code></em>, <em><code>SubExecutorType</code></em> <code>&gt; r) noexcept;</code></td>
<td>At some future point invokes either:<br/>  • <code>set_value(r, get_executor())</code> on success, or<br/>  • <code>set_error(r, err)</code> on failure, where <code>err</code> is object of unspecified type representing an error, or<br/>  • <code>set_done(r)</code> otherwise.<br/><em>Requires:</em> <code>noexcept(set_value(r, get_executor())) &amp;&amp; noexcept(set_error(r, err) &amp;&amp; noexcept(set_done(r)</code> is true.</td>
</tr>
<tr class="even">
<td><code>SenderExecutor get_executor() noexcept</code></td>
<td>Returns the sub-executor. [ <em>Note</em>: Implementations may return <code>*this</code> ]</td>
</tr>
</tbody>
</table>
<p><code>submit</code> and <code>get_executor</code> are required on an executor that has task constructors. <code>submit</code> is a fundamental sender operation that may be called by a task at any point.</p>
<p>Invocation of the <code>Receiver</code> customization points caused by <code>submit</code> will execute in an execution agent created by the executor (the creation of an execution agent does not imply the creation of a new thread of execution). The executor should send a sub-executor to <code>set_value</code> to provide information about that context. The sub-executor may be itself. No sub-executor will be passed to <code>set_error</code>, and a call to <code>set_error</code> represents a failed enqueue. A call to <code>set_done</code> indicates that the submission was not accepted (e.g. cancellation).</p>
<p>To avoid deep recursion, a task may post itself directly onto the underlying executor, giving the executor a chance to pass a new sub executor. For example, if a prior task completes on one thread of a thread pool, the next task may re-enqueue rather than running inline, and the thread pool may decide to post that task to a new thread. Hence, at any point in the chain the sub-executor passed out of the executor may be utilized.</p>
<h3 id="onewayexecutor"><span class="header-section-number">7.3.2</span> OneWayExecutor</h3>
<p>The passed function may or may not be <code>noexcept</code>. The behavior on an exception escaping the passed task is executor-defined.</p>
<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<thead>
<tr class="header">
<th>Signature</th>
<th>Semantics</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><code>void execute(Function fn)</code></td>
<td>At some future point evaluates <code>fn()</code><br/><em>Requires:</em> <code>is_invocable_r&lt;void, Function&gt;</code> is <code>true</code>.</td>
</tr>
</tbody>
</table>
<h2 id="ordering-guarantees"><span class="header-section-number">7.4</span> Ordering guarantees</h2>
<p>There are two strong guarantees made here, to allow eager execution:</p>
<ul>
<li>Memory operations made before the call to a task constructor happen-before the execution of the task.</li>
<li>Completion of the task happens-before a call to <code>set_value</code> on the next receiver in the chain, including the implicit receiver implied by a task constructor.</li>
</ul>
<p>A task may therefore run at any point between constructing it, and being able to detect that it completed, for example, by seeing side effects in a subsequent task. This allows tasks to run on construction, in an eager fashion, and does not allow a user to rely on laziness.</p>
<p>The definition of the API does, however, allow laziness and as such no sender is guaranteed to run its contained work until a receiver is passed to its <code>submit</code> method (or it is passed to a task constructor that calls <code>submit</code> implicitly).</p>
<p>As an optional extension, we may define properties that define whether tasks are guaranteed, or allowed, to run eagerly on construction, assuming that their inputs are ready.</p>
<h1 id="extensions"><span class="header-section-number">8</span> Extensions</h1>
<p>A wide range of further customization points should be expected. The above description is the fundamental set that matches the capabilities in P0443. To build a full futures library on top of this we will need, in addition:</p>
<ul>
<li>A blocking operation for use from concurrent execution contexts. For consistency we suggest defining this as an overload of the <code>sync_wait</code> proposal from Lewis Baker, D1171. That paper proposes <code>std::this_thread::sync_wait(Awaitable)</code>. We should define a customization point that allows <code>sync_wait(Sender)</code> to be implemented optimally.</li>
<li>A share operation that takes a <code>Sender</code> and splits it such that when the input to the <code>Sender</code> is complete, multiple <code>Receivers</code> may be triggered.</li>
<li>A join operation that takes multiple <code>Senders</code> and constructs a single <code>Sender</code> out of them that joins the values in some fashion.</li>
<li>An unwrap operation that takes a <code>Sender&lt;Sender&lt;T&gt;&gt;</code> and returns a <code>Sender&lt;T&gt;</code>.</li>
<li>A task type that supports both value and error handling: <code>make_value_error_task(Value'(Value), Error'(Error))</code>, for example.</li>
<li>A task type that handles only errors and bypasses values: <code>make_error_task(Error'(Error))</code> for example.</li>
<li>Potentially a wider range of parallel algorithm customizations.</li>
</ul>
<p>By defining these as above in terms of a customization point that calls a method on the executor if that method call is well-formed we can relatively easily extend the API piecemeal with these operations as necessary.</p>
<p>The Sender/Receiver model can be extended to types that asynchronously send and receive more than one value; aka <em>reactive streams</em>. That is left as future work.</p>
<h1 id="qa"><span class="header-section-number">9</span> Q&amp;A</h1>
<h2 id="q-what-do-lazy-execution-and-eager-execution-mean"><span class="header-section-number">9.1</span> Q: What do lazy execution and eager execution mean?</h2>
<ul>
<li><em>Lazy execution</em> is when a node in a graph of operations is constructed by storing state and does not start any work.</li>
<li><em>Eager execution</em> is when a node in a graph of operations starts working as soon as it is constructed.</li>
</ul>
<p>These can be demonstrated without adding concurrency using normal functions.</p>
<p>Lazy execution:</p>
<div class="sourceCode" id="cb9"><pre class="sourceCode cpp"><code class="sourceCode cpp"><a class="sourceLine" id="cb9-1" data-line-number="1"><span class="kw">auto</span> f0 = []{ <span class="cf">return</span> <span class="dv">40</span>; };</a>
<a class="sourceLine" id="cb9-2" data-line-number="2"><span class="kw">auto</span> f1 = [f0]{ <span class="cf">return</span> <span class="dv">2</span> + f0(); }</a>
<a class="sourceLine" id="cb9-3" data-line-number="3"><span class="co">// f0 has not been called.</span></a>
<a class="sourceLine" id="cb9-4" data-line-number="4"></a>
<a class="sourceLine" id="cb9-5" data-line-number="5"><span class="co">// execute the graph</span></a>
<a class="sourceLine" id="cb9-6" data-line-number="6"><span class="kw">auto</span> v1 = f1();</a>
<a class="sourceLine" id="cb9-7" data-line-number="7"><span class="co">// f0 and f1 are complete</span></a></code></pre></div>
<p>Eager execution:</p>
<div class="sourceCode" id="cb10"><pre class="sourceCode cpp"><code class="sourceCode cpp"><a class="sourceLine" id="cb10-1" data-line-number="1"><span class="kw">auto</span> f0 = []{ <span class="cf">return</span> <span class="dv">40</span>; };</a>
<a class="sourceLine" id="cb10-2" data-line-number="2"><span class="kw">auto</span> f1 = [<span class="kw">auto</span> v0 = f0()]{ <span class="cf">return</span> <span class="dv">2</span> + v0; }</a>
<a class="sourceLine" id="cb10-3" data-line-number="3"><span class="co">// f0 has been called.</span></a>
<a class="sourceLine" id="cb10-4" data-line-number="4"></a>
<a class="sourceLine" id="cb10-5" data-line-number="5"><span class="co">// execute the graph</span></a>
<a class="sourceLine" id="cb10-6" data-line-number="6"><span class="kw">auto</span> v1 = f1();</a>
<a class="sourceLine" id="cb10-7" data-line-number="7"><span class="co">// f0 and f1 are complete</span></a></code></pre></div>
<p>Without concurrency the only difference is the order of execution. This changes when concurrency is introduced.</p>
<h2 id="q-how-is-eager-execution-more-expensive-than-lazy-execution-when-concurrency-is-introduced"><span class="header-section-number">9.2</span> Q: How is eager execution more expensive than lazy execution when concurrency is introduced?</h2>
<p><strong>Shared state and synchronization</strong></p>
<p>When concurrency is introduced, the result of an operation is sent as a notification. With coroutines that notification is hidden from users, but is still there in the coroutine machinery.</p>
<p>Often the notification is a callback function. As before, the effect of adding callbacks for eager and lazy execution can be demonstrated without adding concurrency using normal functions.</p>
<p>Lazy execution:</p>
<div class="sourceCode" id="cb11"><pre class="sourceCode cpp"><code class="sourceCode cpp"><a class="sourceLine" id="cb11-1" data-line-number="1"><span class="kw">auto</span> f0 = [](<span class="kw">auto</span> cb0){ cb0(<span class="dv">40</span>); };</a>
<a class="sourceLine" id="cb11-2" data-line-number="2"><span class="kw">auto</span> f1 = [f0](<span class="kw">auto</span> cb1){ f0([cb1](<span class="kw">auto</span> v){ cb1(<span class="dv">2</span> + v); }); }</a>
<a class="sourceLine" id="cb11-3" data-line-number="3"><span class="co">// f0 has not been called.</span></a>
<a class="sourceLine" id="cb11-4" data-line-number="4"></a>
<a class="sourceLine" id="cb11-5" data-line-number="5"><span class="co">// execute the graph</span></a>
<a class="sourceLine" id="cb11-6" data-line-number="6">f1([](<span class="kw">auto</span> v1){});</a>
<a class="sourceLine" id="cb11-7" data-line-number="7"><span class="co">// f0 and f1 are complete</span></a></code></pre></div>
<p>Eager execution:</p>
<div class="sourceCode" id="cb12"><pre class="sourceCode cpp"><code class="sourceCode cpp"><a class="sourceLine" id="cb12-1" data-line-number="1"><span class="kw">auto</span> f0 = [](<span class="kw">auto</span> cb0){ cb0(<span class="dv">40</span>); };</a>
<a class="sourceLine" id="cb12-2" data-line-number="2"><span class="kw">auto</span> sv0 = make_shared&lt;<span class="dt">int</span>&gt;(<span class="dv">0</span>);</a>
<a class="sourceLine" id="cb12-3" data-line-number="3"><span class="kw">auto</span> f1 = [<span class="kw">auto</span> sv0 = (f0([sv0](<span class="dt">int</span> v0){ sv0 = v0; }), sv0)](<span class="kw">auto</span> cb1){</a>
<a class="sourceLine" id="cb12-4" data-line-number="4">  cb1(<span class="dv">2</span> + *sv0);</a>
<a class="sourceLine" id="cb12-5" data-line-number="5">}</a>
<a class="sourceLine" id="cb12-6" data-line-number="6"><span class="co">// f0 has been called.</span></a>
<a class="sourceLine" id="cb12-7" data-line-number="7"></a>
<a class="sourceLine" id="cb12-8" data-line-number="8"><span class="co">// execute the graph</span></a>
<a class="sourceLine" id="cb12-9" data-line-number="9">f1([](<span class="kw">auto</span> v1){});</a>
<a class="sourceLine" id="cb12-10" data-line-number="10"><span class="co">// f0 and f1 are complete</span></a></code></pre></div>
<p>The shared state is required in the eager case because <code>cb1</code> is not known at the time that <code>f0</code> is called. In the lazy case <code>cb1</code> is known at the time that <code>f0</code> is called and no shared state is needed.</p>
<p>The shared state in the eager case is already more expensive, but when concurrency is added to the eager case there is also a need to synchronize the <code>f0</code> setting <code>sv0</code> and the <code>f1</code> accessing <code>sv0</code>. This increases the complexity and expense dramatically.</p>
<p>When composing concurrent operations, sometimes eager execution is required. Any design for execution must support eager execution. Lazy execution is almost always the better choice and since lazy execution is also more efficient, lazy execution is the right default.</p>
<h2 id="q-in-what-specific-ways-was-p0443-failing-to-address-the-lazy-execution-scenario"><span class="header-section-number">9.3</span> Q: In what specific ways was P0443 failing to address the lazy execution scenario?</h2>
<p>The Future concept of P0443 was undefined, but the structure of the <code>then_execute</code> customization point, which lacked a separate expression of task submission, impeded lazy construction of task chains. Without a separate expression of task submission, the twoway and then_execute functions were making it awkward to build task chains in an executor-specific way without incurring a synchronization and allocation penalty, and impossible with the specific definition of <code>Future</code> as <code>std::experimental::future</code> in the latest draft. P0443 offered no reasonable way for an executor to participate in the construction and submission of task chains (without, say, resorting to unreasonable measures lake taking advantage of the unspecified behavior of the <code>Future</code> destructor to perform task submission).</p>
<h2 id="q-what-are-senders-and-receivers-and-how-do-they-help"><span class="header-section-number">9.4</span> Q: What are Senders and Receivers, and how do they help?</h2>
<p>Logically, a “Sender” is a handle to an asynchronous computation that may or may not have been submitted for execution yet.</p>
<p>Since a Sender often represents a suspended asynchronous operation, there must be a mechanism to submit it to an execution context. That operation is called “<code>submit</code>” and accepts a “<code>Receiver</code>”. A <code>Receiver</code> is a channel into which a <code>Sender</code> pushes its results once they are ready. To be precise, a <code>Receiver</code> represents <em>three</em> distinct channels: value, error, and done.</p>
<p>It is the <code>submit</code> operation that allows Senders and Receivers to efficiently support lazy composition. By contrast, the futures from P0443 and the Concurrency TS had no explicit “submit” operation, only a blocking “<code>get</code>” operation and a non-blocking “<code>then</code>” operation for chaining a continuation.</p>
<p>If we imagine that a future’s <code>then</code> operation which potentially submitted the task to an execution context after the continuation is attached, then we have a lazy <code>Sender</code>. Nothing is preventing the <code>Future</code> concept from being defined this way, and that is precisely what this paper suggests.</p>
<h2 id="q-what-makes-stdpromisestdfuture-expensive"><span class="header-section-number">9.5</span> Q: What makes <code>std::promise</code>/<code>std::future</code> expensive?</h2>
<p><strong>eager execution</strong></p>
<p>When it is possible to call <code>promise::set_value(. . .)</code> before <code>future::get</code> then state must be shared by the future and promise. When concurrent calls are allowed to the promise and future, then the access to the shared state must be synchronized.</p>
<p><code>std::promise</code>/<code>std::future</code> are expensive because the interface forces an implementation of eager execution.</p>
<h2 id="q-how-is-void-sendersubmitreceiver-different-from-futureu-futuretthencallable"><span class="header-section-number">9.6</span> Q: How is <code>void sender::submit(receiver)</code> different from <code>future&lt;U&gt; future&lt;T&gt;::then(callable)</code>?</h2>
<p><strong>termination</strong></p>
<p><code>then</code> returns another future. <code>then</code> is not terminal, it always returns another future with another <code>then</code> to call. To implement lazy execution <code>then</code> would have to store the callable and not start the work until <code>then</code> on the returned future was called. Since <code>then</code> on the returned future is also not terminal, it either must implement expensive eager execution or must not start the work, which leaves no way to start the work without using an expensive eager execution implementation of <code>then</code></p>
<p><code>submit</code> returns void. Returning void makes <code>submit</code> terminal. When <code>submit</code> is an implementation of lazy execution the work starts when <code>submit</code> is called and was given the continuation function to use when delivering the result of the work. When <code>submit</code> is an implementation of expensive eager execution the work was started before <code>submit</code> is called and synchronization is used to deliver the result of the work to the continuation function.</p>
<h2 id="q-how-is-void-sendersubmitreceiver-different-from-void-executorexecutecallable"><span class="header-section-number">9.7</span> Q: How is <code>void sender::submit(receiver)</code> different from <code>void executor::execute(callable)</code>?</h2>
<p><strong>signals</strong></p>
<p><code>execute</code> takes a callable that takes <code>void</code> and returns <code>void</code>. The callable will be invoked in an execution context specified by the executor. Any failure to invoke the callable or any exception thrown by the callable after <code>execute</code> has returned must be handled by the executor. There is no signal to the function on failure or cancellation or rejection. When the callable is a functor the destructor will be run on copy, move, success, failure and rejection with no parameters to distinguish them.</p>
<p><code>submit</code> takes a receiver that has three methods.</p>
<ul>
<li><code>value</code> will be invoked in an execution context specified by the executor. <code>value</code> does any work needed.</li>
<li><code>error</code> will be invoked in an execution context specified by the executor. any failure to invoke <code>value</code> or any exception thrown by <code>value</code> after <code>execute</code> has returned is reported to the receiver by invoking <code>error</code> and passing the error as a parameter</li>
<li><code>done</code> will be invoked in an execution context specified by the executor. <code>done</code> handles cases where the work was cancelled (cancellation is not an error).</li>
</ul>
<h2 id="q-what-is-the-difference-between-stdfuturet-and-sender"><span class="header-section-number">9.8</span> Q: What is the difference between <code>std::future&lt;T&gt;</code> and <em>Sender</em>?</h2>
<p>A crucial difference is in how Sender and Receiver are composed.</p>
<ul>
<li><code>std::promise&lt;T&gt;</code> has a <code>future&lt;T&gt;</code> that is returned from <code>std::promise&lt;T&gt;::get_future()</code></li>
<li>A <em>Sender</em> has a submit method that takes a <em>Receiver</em> and returns void</li>
</ul>
<p>When the promise is the producer and owns the consumer there are two implementation options.</p>
<ol type="1">
<li>Create shared state and synchronize access to the shared state. This option is the common case as it allows the producer to safely set a value before the consumer asks for the value.</li>
<li>Define <code>std::promise&lt;T&gt;::set_value()</code> and <code>std::promise&lt;T&gt;::set_exception()</code> to have undefined-behaviour when called before the consumer has asked for the value.</li>
</ol>
<p>When the <em>Sender</em> is the producer and the <em>Receiver</em> is the consumer then they are both created independently and are bound together by the call to <code>submit()</code> on the <em>Sender</em>. This form of composition does not prevent a <em>Sender</em> from creating a shared state with access to the state synchronized so that binding the <em>Receiver</em> later results in the same complexity and behaviour as <code>std::promise&lt;T&gt;</code> does, and it also allows a <em>Sender</em> to allocate nothing and wait for the <em>Receiver</em> to be bound, then call the consumer directly with no synchronization.</p>
<h1 id="acknowledgements"><span class="header-section-number">10</span> Acknowledgements</h1>
<p>This document arose out of offline discussion largely between Lee, Bryce and David, as promised during the 2018-08-10 executors call.</p>
<p>A great many other people have contrbuted. The authors are grateful to the members of the sg1-exec@ googlegroup for helping to flesh out and vet these ideas.</p>
</div>
</div>
</div>

</body>
</html>
