From 96e08c60007c6cbdcda80b1f3b742b9e4e56fcfb Mon Sep 17 00:00:00 2001 From: William Lam Date: Sun, 2 Feb 2025 11:26:44 -0800 Subject: [PATCH 01/37] vSphere UI 8.x Customization Example --- other/clr-ui.css | 11472 +++++++++++++++++++++++++++++++++++++++++++ other/unpentry.jsp | 296 ++ other/websso.js | 816 +++ 3 files changed, 12584 insertions(+) create mode 100644 other/clr-ui.css create mode 100644 other/unpentry.jsp create mode 100644 other/websso.js diff --git a/other/clr-ui.css b/other/clr-ui.css new file mode 100644 index 0000000..c705a62 --- /dev/null +++ b/other/clr-ui.css @@ -0,0 +1,11472 @@ +/*! + * Copyright (c) 2016-2017 VMware, Inc. All Rights Reserved. + * This software is released under MIT license. + * The full license information can be found in LICENSE in the root directory of this project. + * + * Clarity v@VERSION | MIT license | https://github.com/vmware/clarity + * + */ +/*! normalize.css v4.2.0 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + line-height: 1.15; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; } + +body { + margin: 0; } + +article, +aside, +details, +figcaption, +figure, +footer, +header, +main, +menu, +nav, +section, +summary { + display: block; } + +audio, +canvas, +progress, +video { + display: inline-block; } + +audio:not([controls]) { + display: none; + height: 0; } + +progress { + vertical-align: baseline; } + +template, +[hidden] { + display: none; } + +a { + background-color: transparent; + -webkit-text-decoration-skip: objects; } + +a:active, +a:hover { + outline-width: 0; } + +abbr[title] { + border-bottom: none; + text-decoration: underline; + text-decoration: underline dotted; } + +b, +strong { + font-weight: inherit; } + +b, +strong { + font-weight: bolder; } + +dfn { + font-style: italic; } + +h1 { + font-size: 2em; + margin: 0.67em 0; } + +mark { + background-color: #ff0; + color: #000; } + +small { + font-size: 80%; } + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; } + +sub { + bottom: -0.25em; } + +sup { + top: -0.5em; } + +img { + border-style: none; } + +svg:not(:root) { + overflow: hidden; } + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; } + +figure { + margin: 1em 40px; } + +hr { + box-sizing: content-box; + height: 0; + overflow: visible; } + +button, +input, +optgroup, +select, +textarea { + font: inherit; + margin: 0; } + +optgroup { + font-weight: bold; } + +button, +input { + overflow: visible; } + +button, +select { + text-transform: none; } + +button, +html [type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; } + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; } + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; } + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; } + +legend { + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal; } + +textarea { + overflow: auto; } + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; + padding: 0; } + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; } + +[type="search"] { + -webkit-appearance: textfield; + outline-offset: -2px; } + +[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; } + +::-webkit-input-placeholder { + color: inherit; + opacity: 0.54; } + +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; } + +.clr-flex-row { + -ms-flex-direction: row !important; + flex-direction: row !important; } + +.clr-flex-column { + -ms-flex-direction: column !important; + flex-direction: column !important; } + +.clr-flex-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; } + +.clr-flex-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; } + +.clr-flex-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; } + +.clr-flex-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; } + +.clr-flex-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; } + +.clr-flex-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; } + +.clr-flex-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; } + +.clr-flex-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; } + +.clr-flex-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; } + +.clr-flex-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; } + +.clr-justify-content-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; } + +.clr-justify-content-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; } + +.clr-justify-content-center { + -ms-flex-pack: center !important; + justify-content: center !important; } + +.clr-justify-content-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; } + +.clr-justify-content-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; } + +.clr-align-items-start { + -ms-flex-align: start !important; + align-items: flex-start !important; } + +.clr-align-items-end { + -ms-flex-align: end !important; + align-items: flex-end !important; } + +.clr-align-items-center { + -ms-flex-align: center !important; + align-items: center !important; } + +.clr-align-items-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; } + +.clr-align-items-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; } + +.clr-align-content-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; } + +.clr-align-content-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; } + +.clr-align-content-center { + -ms-flex-line-pack: center !important; + align-content: center !important; } + +.clr-align-content-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; } + +.clr-align-content-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; } + +.clr-align-content-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; } + +.clr-align-self-auto { + -ms-flex-item-align: auto !important; + -ms-grid-row-align: auto !important; + align-self: auto !important; } + +.clr-align-self-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; } + +.clr-align-self-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; } + +.clr-align-self-center { + -ms-flex-item-align: center !important; + -ms-grid-row-align: center !important; + align-self: center !important; } + +.clr-align-self-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; } + +.clr-align-self-stretch { + -ms-flex-item-align: stretch !important; + -ms-grid-row-align: stretch !important; + align-self: stretch !important; } + +@media (min-width: 576px) { + .clr-flex-sm-row { + -ms-flex-direction: row !important; + flex-direction: row !important; } + .clr-flex-sm-column { + -ms-flex-direction: column !important; + flex-direction: column !important; } + .clr-flex-sm-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; } + .clr-flex-sm-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; } + .clr-flex-sm-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; } + .clr-flex-sm-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; } + .clr-flex-sm-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; } + .clr-flex-sm-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; } + .clr-flex-sm-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; } + .clr-flex-sm-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; } + .clr-flex-sm-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; } + .clr-flex-sm-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; } + .clr-justify-content-sm-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; } + .clr-justify-content-sm-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; } + .clr-justify-content-sm-center { + -ms-flex-pack: center !important; + justify-content: center !important; } + .clr-justify-content-sm-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; } + .clr-justify-content-sm-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; } + .clr-align-items-sm-start { + -ms-flex-align: start !important; + align-items: flex-start !important; } + .clr-align-items-sm-end { + -ms-flex-align: end !important; + align-items: flex-end !important; } + .clr-align-items-sm-center { + -ms-flex-align: center !important; + align-items: center !important; } + .clr-align-items-sm-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; } + .clr-align-items-sm-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; } + .clr-align-content-sm-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; } + .clr-align-content-sm-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; } + .clr-align-content-sm-center { + -ms-flex-line-pack: center !important; + align-content: center !important; } + .clr-align-content-sm-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; } + .clr-align-content-sm-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; } + .clr-align-content-sm-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; } + .clr-align-self-sm-auto { + -ms-flex-item-align: auto !important; + -ms-grid-row-align: auto !important; + align-self: auto !important; } + .clr-align-self-sm-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; } + .clr-align-self-sm-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; } + .clr-align-self-sm-center { + -ms-flex-item-align: center !important; + -ms-grid-row-align: center !important; + align-self: center !important; } + .clr-align-self-sm-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; } + .clr-align-self-sm-stretch { + -ms-flex-item-align: stretch !important; + -ms-grid-row-align: stretch !important; + align-self: stretch !important; } } + +@media (min-width: 768px) { + .clr-flex-md-row { + -ms-flex-direction: row !important; + flex-direction: row !important; } + .clr-flex-md-column { + -ms-flex-direction: column !important; + flex-direction: column !important; } + .clr-flex-md-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; } + .clr-flex-md-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; } + .clr-flex-md-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; } + .clr-flex-md-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; } + .clr-flex-md-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; } + .clr-flex-md-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; } + .clr-flex-md-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; } + .clr-flex-md-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; } + .clr-flex-md-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; } + .clr-flex-md-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; } + .clr-justify-content-md-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; } + .clr-justify-content-md-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; } + .clr-justify-content-md-center { + -ms-flex-pack: center !important; + justify-content: center !important; } + .clr-justify-content-md-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; } + .clr-justify-content-md-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; } + .clr-align-items-md-start { + -ms-flex-align: start !important; + align-items: flex-start !important; } + .clr-align-items-md-end { + -ms-flex-align: end !important; + align-items: flex-end !important; } + .clr-align-items-md-center { + -ms-flex-align: center !important; + align-items: center !important; } + .clr-align-items-md-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; } + .clr-align-items-md-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; } + .clr-align-content-md-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; } + .clr-align-content-md-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; } + .clr-align-content-md-center { + -ms-flex-line-pack: center !important; + align-content: center !important; } + .clr-align-content-md-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; } + .clr-align-content-md-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; } + .clr-align-content-md-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; } + .clr-align-self-md-auto { + -ms-flex-item-align: auto !important; + -ms-grid-row-align: auto !important; + align-self: auto !important; } + .clr-align-self-md-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; } + .clr-align-self-md-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; } + .clr-align-self-md-center { + -ms-flex-item-align: center !important; + -ms-grid-row-align: center !important; + align-self: center !important; } + .clr-align-self-md-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; } + .clr-align-self-md-stretch { + -ms-flex-item-align: stretch !important; + -ms-grid-row-align: stretch !important; + align-self: stretch !important; } } + +@media (min-width: 992px) { + .clr-flex-lg-row { + -ms-flex-direction: row !important; + flex-direction: row !important; } + .clr-flex-lg-column { + -ms-flex-direction: column !important; + flex-direction: column !important; } + .clr-flex-lg-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; } + .clr-flex-lg-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; } + .clr-flex-lg-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; } + .clr-flex-lg-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; } + .clr-flex-lg-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; } + .clr-flex-lg-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; } + .clr-flex-lg-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; } + .clr-flex-lg-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; } + .clr-flex-lg-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; } + .clr-flex-lg-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; } + .clr-justify-content-lg-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; } + .clr-justify-content-lg-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; } + .clr-justify-content-lg-center { + -ms-flex-pack: center !important; + justify-content: center !important; } + .clr-justify-content-lg-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; } + .clr-justify-content-lg-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; } + .clr-align-items-lg-start { + -ms-flex-align: start !important; + align-items: flex-start !important; } + .clr-align-items-lg-end { + -ms-flex-align: end !important; + align-items: flex-end !important; } + .clr-align-items-lg-center { + -ms-flex-align: center !important; + align-items: center !important; } + .clr-align-items-lg-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; } + .clr-align-items-lg-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; } + .clr-align-content-lg-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; } + .clr-align-content-lg-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; } + .clr-align-content-lg-center { + -ms-flex-line-pack: center !important; + align-content: center !important; } + .clr-align-content-lg-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; } + .clr-align-content-lg-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; } + .clr-align-content-lg-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; } + .clr-align-self-lg-auto { + -ms-flex-item-align: auto !important; + -ms-grid-row-align: auto !important; + align-self: auto !important; } + .clr-align-self-lg-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; } + .clr-align-self-lg-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; } + .clr-align-self-lg-center { + -ms-flex-item-align: center !important; + -ms-grid-row-align: center !important; + align-self: center !important; } + .clr-align-self-lg-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; } + .clr-align-self-lg-stretch { + -ms-flex-item-align: stretch !important; + -ms-grid-row-align: stretch !important; + align-self: stretch !important; } } + +@media (min-width: 1200px) { + .clr-flex-xl-row { + -ms-flex-direction: row !important; + flex-direction: row !important; } + .clr-flex-xl-column { + -ms-flex-direction: column !important; + flex-direction: column !important; } + .clr-flex-xl-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; } + .clr-flex-xl-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; } + .clr-flex-xl-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; } + .clr-flex-xl-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; } + .clr-flex-xl-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; } + .clr-flex-xl-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; } + .clr-flex-xl-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; } + .clr-flex-xl-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; } + .clr-flex-xl-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; } + .clr-flex-xl-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; } + .clr-justify-content-xl-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; } + .clr-justify-content-xl-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; } + .clr-justify-content-xl-center { + -ms-flex-pack: center !important; + justify-content: center !important; } + .clr-justify-content-xl-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; } + .clr-justify-content-xl-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; } + .clr-align-items-xl-start { + -ms-flex-align: start !important; + align-items: flex-start !important; } + .clr-align-items-xl-end { + -ms-flex-align: end !important; + align-items: flex-end !important; } + .clr-align-items-xl-center { + -ms-flex-align: center !important; + align-items: center !important; } + .clr-align-items-xl-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; } + .clr-align-items-xl-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; } + .clr-align-content-xl-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; } + .clr-align-content-xl-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; } + .clr-align-content-xl-center { + -ms-flex-line-pack: center !important; + align-content: center !important; } + .clr-align-content-xl-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; } + .clr-align-content-xl-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; } + .clr-align-content-xl-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; } + .clr-align-self-xl-auto { + -ms-flex-item-align: auto !important; + -ms-grid-row-align: auto !important; + align-self: auto !important; } + .clr-align-self-xl-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; } + .clr-align-self-xl-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; } + .clr-align-self-xl-center { + -ms-flex-item-align: center !important; + -ms-grid-row-align: center !important; + align-self: center !important; } + .clr-align-self-xl-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; } + .clr-align-self-xl-stretch { + -ms-flex-item-align: stretch !important; + -ms-grid-row-align: stretch !important; + align-self: stretch !important; } } + +/** + * Copyright (c) 2016-2017 VMware, Inc. All Rights Reserved. + * This software is released under MIT license. + * The full license information can be found in LICENSE in the root directory of this project. + */ +.media { + display: -ms-flexbox; + display: flex; } + +.media-body { + -ms-flex: 1; + flex: 1; } + +.media-middle { + -ms-flex-item-align: center; + -ms-grid-row-align: center; + align-self: center; } + +.media-bottom { + -ms-flex-item-align: end; + align-self: flex-end; } + +.media-object { + display: block; } + .media-object.img-thumbnail { + max-width: none; } + +.media-right { + padding-left: 10px; } + +.media-left { + padding-right: 10px; } + +.media-heading { + margin-top: 0; + margin-bottom: 5px; } + +.media-list { + padding-left: 0; + list-style: none; } + +.align-baseline { + vertical-align: baseline !important; } + +.align-top { + vertical-align: top !important; } + +.align-middle { + vertical-align: middle !important; } + +.align-bottom { + vertical-align: bottom !important; } + +.align-text-bottom { + vertical-align: text-bottom !important; } + +.align-text-top { + vertical-align: text-top !important; } + +.bg-faded { + background-color: #fff; } + +.bg-primary { + background-color: #0275d8 !important; } + +a.bg-primary:focus, a.bg-primary:hover { + background-color: #025aa5 !important; } + +.bg-success { + background-color: #5cb85c !important; } + +a.bg-success:focus, a.bg-success:hover { + background-color: #449d44 !important; } + +.bg-info { + background-color: #5bc0de !important; } + +a.bg-info:focus, a.bg-info:hover { + background-color: #31b0d5 !important; } + +.bg-warning { + background-color: #f0ad4e !important; } + +a.bg-warning:focus, a.bg-warning:hover { + background-color: #ec971f !important; } + +.bg-danger { + background-color: #d9534f !important; } + +a.bg-danger:focus, a.bg-danger:hover { + background-color: #c9302c !important; } + +.bg-inverse { + background-color: #373a3c !important; } + +a.bg-inverse:focus, a.bg-inverse:hover { + background-color: #1f2021 !important; } + +.rounded { + border-radius: 0.25rem; } + +.rounded-top { + border-top-right-radius: 0.25rem; + border-top-left-radius: 0.25rem; } + +.rounded-right { + border-bottom-right-radius: 0.25rem; + border-top-right-radius: 0.25rem; } + +.rounded-bottom { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; } + +.rounded-left { + border-bottom-left-radius: 0.25rem; + border-top-left-radius: 0.25rem; } + +.rounded-circle { + border-radius: 50%; } + +.clearfix::after { + content: ""; + display: table; + clear: both; } + +.d-block { + display: block !important; } + +.d-inline-block { + display: inline-block !important; } + +.d-inline { + display: inline !important; } + +.flex-xs-first { + -ms-flex-order: -1; + order: -1; } + +.flex-xs-last { + -ms-flex-order: 1; + order: 1; } + +.flex-xs-unordered { + -ms-flex-order: 0; + order: 0; } + +.flex-items-xs-top { + -ms-flex-align: start; + align-items: flex-start; } + +.flex-items-xs-middle { + -ms-flex-align: center; + align-items: center; } + +.flex-items-xs-bottom { + -ms-flex-align: end; + align-items: flex-end; } + +.flex-xs-top { + -ms-flex-item-align: start; + align-self: flex-start; } + +.flex-xs-middle { + -ms-flex-item-align: center; + -ms-grid-row-align: center; + align-self: center; } + +.flex-xs-bottom { + -ms-flex-item-align: end; + align-self: flex-end; } + +.flex-items-xs-left { + -ms-flex-pack: start; + justify-content: flex-start; } + +.flex-items-xs-center { + -ms-flex-pack: center; + justify-content: center; } + +.flex-items-xs-right { + -ms-flex-pack: end; + justify-content: flex-end; } + +.flex-items-xs-around { + -ms-flex-pack: distribute; + justify-content: space-around; } + +.flex-items-xs-between { + -ms-flex-pack: justify; + justify-content: space-between; } + +@media (min-width: 576px) { + .flex-sm-first { + -ms-flex-order: -1; + order: -1; } + .flex-sm-last { + -ms-flex-order: 1; + order: 1; } + .flex-sm-unordered { + -ms-flex-order: 0; + order: 0; } } + +@media (min-width: 576px) { + .flex-items-sm-top { + -ms-flex-align: start; + align-items: flex-start; } + .flex-items-sm-middle { + -ms-flex-align: center; + align-items: center; } + .flex-items-sm-bottom { + -ms-flex-align: end; + align-items: flex-end; } } + +@media (min-width: 576px) { + .flex-sm-top { + -ms-flex-item-align: start; + align-self: flex-start; } + .flex-sm-middle { + -ms-flex-item-align: center; + -ms-grid-row-align: center; + align-self: center; } + .flex-sm-bottom { + -ms-flex-item-align: end; + align-self: flex-end; } } + +@media (min-width: 576px) { + .flex-items-sm-left { + -ms-flex-pack: start; + justify-content: flex-start; } + .flex-items-sm-center { + -ms-flex-pack: center; + justify-content: center; } + .flex-items-sm-right { + -ms-flex-pack: end; + justify-content: flex-end; } + .flex-items-sm-around { + -ms-flex-pack: distribute; + justify-content: space-around; } + .flex-items-sm-between { + -ms-flex-pack: justify; + justify-content: space-between; } } + +@media (min-width: 768px) { + .flex-md-first { + -ms-flex-order: -1; + order: -1; } + .flex-md-last { + -ms-flex-order: 1; + order: 1; } + .flex-md-unordered { + -ms-flex-order: 0; + order: 0; } } + +@media (min-width: 768px) { + .flex-items-md-top { + -ms-flex-align: start; + align-items: flex-start; } + .flex-items-md-middle { + -ms-flex-align: center; + align-items: center; } + .flex-items-md-bottom { + -ms-flex-align: end; + align-items: flex-end; } } + +@media (min-width: 768px) { + .flex-md-top { + -ms-flex-item-align: start; + align-self: flex-start; } + .flex-md-middle { + -ms-flex-item-align: center; + -ms-grid-row-align: center; + align-self: center; } + .flex-md-bottom { + -ms-flex-item-align: end; + align-self: flex-end; } } + +@media (min-width: 768px) { + .flex-items-md-left { + -ms-flex-pack: start; + justify-content: flex-start; } + .flex-items-md-center { + -ms-flex-pack: center; + justify-content: center; } + .flex-items-md-right { + -ms-flex-pack: end; + justify-content: flex-end; } + .flex-items-md-around { + -ms-flex-pack: distribute; + justify-content: space-around; } + .flex-items-md-between { + -ms-flex-pack: justify; + justify-content: space-between; } } + +@media (min-width: 992px) { + .flex-lg-first { + -ms-flex-order: -1; + order: -1; } + .flex-lg-last { + -ms-flex-order: 1; + order: 1; } + .flex-lg-unordered { + -ms-flex-order: 0; + order: 0; } } + +@media (min-width: 992px) { + .flex-items-lg-top { + -ms-flex-align: start; + align-items: flex-start; } + .flex-items-lg-middle { + -ms-flex-align: center; + align-items: center; } + .flex-items-lg-bottom { + -ms-flex-align: end; + align-items: flex-end; } } + +@media (min-width: 992px) { + .flex-lg-top { + -ms-flex-item-align: start; + align-self: flex-start; } + .flex-lg-middle { + -ms-flex-item-align: center; + -ms-grid-row-align: center; + align-self: center; } + .flex-lg-bottom { + -ms-flex-item-align: end; + align-self: flex-end; } } + +@media (min-width: 992px) { + .flex-items-lg-left { + -ms-flex-pack: start; + justify-content: flex-start; } + .flex-items-lg-center { + -ms-flex-pack: center; + justify-content: center; } + .flex-items-lg-right { + -ms-flex-pack: end; + justify-content: flex-end; } + .flex-items-lg-around { + -ms-flex-pack: distribute; + justify-content: space-around; } + .flex-items-lg-between { + -ms-flex-pack: justify; + justify-content: space-between; } } + +@media (min-width: 1200px) { + .flex-xl-first { + -ms-flex-order: -1; + order: -1; } + .flex-xl-last { + -ms-flex-order: 1; + order: 1; } + .flex-xl-unordered { + -ms-flex-order: 0; + order: 0; } } + +@media (min-width: 1200px) { + .flex-items-xl-top { + -ms-flex-align: start; + align-items: flex-start; } + .flex-items-xl-middle { + -ms-flex-align: center; + align-items: center; } + .flex-items-xl-bottom { + -ms-flex-align: end; + align-items: flex-end; } } + +@media (min-width: 1200px) { + .flex-xl-top { + -ms-flex-item-align: start; + align-self: flex-start; } + .flex-xl-middle { + -ms-flex-item-align: center; + -ms-grid-row-align: center; + align-self: center; } + .flex-xl-bottom { + -ms-flex-item-align: end; + align-self: flex-end; } } + +@media (min-width: 1200px) { + .flex-items-xl-left { + -ms-flex-pack: start; + justify-content: flex-start; } + .flex-items-xl-center { + -ms-flex-pack: center; + justify-content: center; } + .flex-items-xl-right { + -ms-flex-pack: end; + justify-content: flex-end; } + .flex-items-xl-around { + -ms-flex-pack: distribute; + justify-content: space-around; } + .flex-items-xl-between { + -ms-flex-pack: justify; + justify-content: space-between; } } + +.float-xs-left { + float: left !important; } + +.float-xs-right { + float: right !important; } + +.float-xs-none { + float: none !important; } + +@media (min-width: 576px) { + .float-sm-left { + float: left !important; } + .float-sm-right { + float: right !important; } + .float-sm-none { + float: none !important; } } + +@media (min-width: 768px) { + .float-md-left { + float: left !important; } + .float-md-right { + float: right !important; } + .float-md-none { + float: none !important; } } + +@media (min-width: 992px) { + .float-lg-left { + float: left !important; } + .float-lg-right { + float: right !important; } + .float-lg-none { + float: none !important; } } + +@media (min-width: 1200px) { + .float-xl-left { + float: left !important; } + .float-xl-right { + float: right !important; } + .float-xl-none { + float: none !important; } } + +.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; } + +.w-100 { + width: 100% !important; } + +.h-100 { + height: 100% !important; } + +.mx-auto { + margin-right: auto !important; + margin-left: auto !important; } + +.m-0 { + margin: 0 0 !important; } + +.mt-0 { + margin-top: 0 !important; } + +.mr-0 { + margin-right: 0 !important; } + +.mb-0 { + margin-bottom: 0 !important; } + +.ml-0 { + margin-left: 0 !important; } + +.mx-0 { + margin-right: 0 !important; + margin-left: 0 !important; } + +.my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; } + +.m-1 { + margin: 1rem 1rem !important; } + +.mt-1 { + margin-top: 1rem !important; } + +.mr-1 { + margin-right: 1rem !important; } + +.mb-1 { + margin-bottom: 1rem !important; } + +.ml-1 { + margin-left: 1rem !important; } + +.mx-1 { + margin-right: 1rem !important; + margin-left: 1rem !important; } + +.my-1 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; } + +.m-2 { + margin: 1.5rem 1.5rem !important; } + +.mt-2 { + margin-top: 1.5rem !important; } + +.mr-2 { + margin-right: 1.5rem !important; } + +.mb-2 { + margin-bottom: 1.5rem !important; } + +.ml-2 { + margin-left: 1.5rem !important; } + +.mx-2 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; } + +.my-2 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; } + +.m-3 { + margin: 3rem 3rem !important; } + +.mt-3 { + margin-top: 3rem !important; } + +.mr-3 { + margin-right: 3rem !important; } + +.mb-3 { + margin-bottom: 3rem !important; } + +.ml-3 { + margin-left: 3rem !important; } + +.mx-3 { + margin-right: 3rem !important; + margin-left: 3rem !important; } + +.my-3 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; } + +.p-0 { + padding: 0 0 !important; } + +.pt-0 { + padding-top: 0 !important; } + +.pr-0 { + padding-right: 0 !important; } + +.pb-0 { + padding-bottom: 0 !important; } + +.pl-0 { + padding-left: 0 !important; } + +.px-0 { + padding-right: 0 !important; + padding-left: 0 !important; } + +.py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; } + +.p-1 { + padding: 1rem 1rem !important; } + +.pt-1 { + padding-top: 1rem !important; } + +.pr-1 { + padding-right: 1rem !important; } + +.pb-1 { + padding-bottom: 1rem !important; } + +.pl-1 { + padding-left: 1rem !important; } + +.px-1 { + padding-right: 1rem !important; + padding-left: 1rem !important; } + +.py-1 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; } + +.p-2 { + padding: 1.5rem 1.5rem !important; } + +.pt-2 { + padding-top: 1.5rem !important; } + +.pr-2 { + padding-right: 1.5rem !important; } + +.pb-2 { + padding-bottom: 1.5rem !important; } + +.pl-2 { + padding-left: 1.5rem !important; } + +.px-2 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; } + +.py-2 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; } + +.p-3 { + padding: 3rem 3rem !important; } + +.pt-3 { + padding-top: 3rem !important; } + +.pr-3 { + padding-right: 3rem !important; } + +.pb-3 { + padding-bottom: 3rem !important; } + +.pl-3 { + padding-left: 3rem !important; } + +.px-3 { + padding-right: 3rem !important; + padding-left: 3rem !important; } + +.py-3 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; } + +.pos-f-t { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; } + +.text-justify { + text-align: justify !important; } + +.text-nowrap { + white-space: nowrap !important; } + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } + +.text-xs-left { + text-align: left !important; } + +.text-xs-right { + text-align: right !important; } + +.text-xs-center { + text-align: center !important; } + +@media (min-width: 576px) { + .text-sm-left { + text-align: left !important; } + .text-sm-right { + text-align: right !important; } + .text-sm-center { + text-align: center !important; } } + +@media (min-width: 768px) { + .text-md-left { + text-align: left !important; } + .text-md-right { + text-align: right !important; } + .text-md-center { + text-align: center !important; } } + +@media (min-width: 992px) { + .text-lg-left { + text-align: left !important; } + .text-lg-right { + text-align: right !important; } + .text-lg-center { + text-align: center !important; } } + +@media (min-width: 1200px) { + .text-xl-left { + text-align: left !important; } + .text-xl-right { + text-align: right !important; } + .text-xl-center { + text-align: center !important; } } + +.text-lowercase { + text-transform: lowercase !important; } + +.text-uppercase { + text-transform: uppercase !important; } + +.text-capitalize { + text-transform: capitalize !important; } + +.font-weight-normal { + font-weight: normal; } + +.font-weight-bold { + font-weight: bold; } + +.font-italic { + font-style: italic; } + +.text-white { + color: #fff !important; } + +.text-muted { + color: #818a91 !important; } + +a.text-muted:focus, a.text-muted:hover { + color: #687077 !important; } + +.text-primary { + color: #0275d8 !important; } + +a.text-primary:focus, a.text-primary:hover { + color: #025aa5 !important; } + +.text-success { + color: #5cb85c !important; } + +a.text-success:focus, a.text-success:hover { + color: #449d44 !important; } + +.text-info { + color: #5bc0de !important; } + +a.text-info:focus, a.text-info:hover { + color: #31b0d5 !important; } + +.text-warning { + color: #f0ad4e !important; } + +a.text-warning:focus, a.text-warning:hover { + color: #ec971f !important; } + +.text-danger { + color: #d9534f !important; } + +a.text-danger:focus, a.text-danger:hover { + color: #c9302c !important; } + +.text-gray-dark { + color: #737373 !important; } + +a.text-gray-dark:focus, a.text-gray-dark:hover { + color: #5a5a5a !important; } + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; } + +.invisible { + visibility: hidden !important; } + +.hidden-xs-up { + display: none !important; } + +@media (max-width: 575px) { + .hidden-xs-down { + display: none !important; } } + +@media (min-width: 576px) { + .hidden-sm-up { + display: none !important; } } + +@media (max-width: 767px) { + .hidden-sm-down { + display: none !important; } } + +@media (min-width: 768px) { + .hidden-md-up { + display: none !important; } } + +@media (max-width: 991px) { + .hidden-md-down { + display: none !important; } } + +@media (min-width: 992px) { + .hidden-lg-up { + display: none !important; } } + +@media (max-width: 1199px) { + .hidden-lg-down { + display: none !important; } } + +@media (min-width: 1200px) { + .hidden-xl-up { + display: none !important; } } + +.hidden-xl-down { + display: none !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; } } + +.img-fluid { + max-width: 100%; + height: auto; } + +.img-thumbnail { + padding: 0.25rem; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 0.25rem; + transition: all .2s ease-in-out; + max-width: 100%; + height: auto; } + +.figure { + display: inline-block; } + +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; } + +.figure-caption { + font-size: 90%; + color: #eee; } + +.list-group { + padding-left: 0; + margin-bottom: 0; } + +.list-group-item { + position: relative; + display: block; + padding: 0.75rem 1.25rem; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; } + .list-group-item:first-child { + border-top-right-radius: 0.25rem; + border-top-left-radius: 0.25rem; } + .list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; } + .list-group-item.disabled, .list-group-item.disabled:focus, .list-group-item.disabled:hover { + color: #818a91; + cursor: not-allowed; + background-color: #eceeef; } + .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: #818a91; } + .list-group-item.active, .list-group-item.active:focus, .list-group-item.active:hover { + z-index: 2; + color: #fff; + text-decoration: none; + background-color: #0275d8; + border-color: #0275d8; } + .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: #a8d6fe; } + +.list-group-flush .list-group-item { + border-right: 0; + border-left: 0; + border-radius: 0; } + +.list-group-item-action { + width: 100%; + color: #555; + text-align: inherit; } + .list-group-item-action .list-group-item-heading { + color: #333; } + .list-group-item-action:focus, .list-group-item-action:hover { + color: #555; + text-decoration: none; + background-color: #f5f5f5; } + +.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; } + +.close { + float: right; + font-size: 1.5rem; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + opacity: .2; } + .close:focus, .close:hover { + color: #000; + text-decoration: none; + cursor: pointer; + opacity: .5; } + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; } + +.container { + margin-left: auto; + margin-right: auto; + padding-left: 0.5rem; + padding-right: 0.5rem; } + @media (min-width: 576px) { + .container { + width: 540px; + max-width: 100%; } } + @media (min-width: 768px) { + .container { + width: 720px; + max-width: 100%; } } + @media (min-width: 992px) { + .container { + width: 960px; + max-width: 100%; } } + @media (min-width: 1200px) { + .container { + width: 1140px; + max-width: 100%; } } + +.container-fluid { + margin-left: auto; + margin-right: auto; + padding-left: 0.5rem; + padding-right: 0.5rem; } + +.row { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-right: -0.5rem; + margin-left: -0.5rem; } + @media (min-width: 576px) { + .row { + margin-right: -0.5rem; + margin-left: -0.5rem; } } + @media (min-width: 768px) { + .row { + margin-right: -0.5rem; + margin-left: -0.5rem; } } + @media (min-width: 992px) { + .row { + margin-right: -0.5rem; + margin-left: -0.5rem; } } + @media (min-width: 1200px) { + .row { + margin-right: -0.5rem; + margin-left: -0.5rem; } } + +.col-xs, .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12, .col-sm, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-md, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-lg, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-xl, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12 { + position: relative; + min-height: 1px; + width: 100%; + padding-right: 0.5rem; + padding-left: 0.5rem; } + @media (min-width: 576px) { + .col-xs, .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12, .col-sm, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-md, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-lg, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-xl, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12 { + padding-right: 0.5rem; + padding-left: 0.5rem; } } + @media (min-width: 768px) { + .col-xs, .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12, .col-sm, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-md, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-lg, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-xl, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12 { + padding-right: 0.5rem; + padding-left: 0.5rem; } } + @media (min-width: 992px) { + .col-xs, .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12, .col-sm, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-md, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-lg, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-xl, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12 { + padding-right: 0.5rem; + padding-left: 0.5rem; } } + @media (min-width: 1200px) { + .col-xs, .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12, .col-sm, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-md, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-lg, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-xl, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12 { + padding-right: 0.5rem; + padding-left: 0.5rem; } } + +.col-xs { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; } + +.col-xs-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; } + +.col-xs-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; } + +.col-xs-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; } + +.col-xs-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; } + +.col-xs-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; } + +.col-xs-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; } + +.col-xs-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; } + +.col-xs-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; } + +.col-xs-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; } + +.col-xs-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; } + +.col-xs-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; } + +.col-xs-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; } + +.pull-xs-0 { + right: auto; } + +.pull-xs-1 { + right: 8.333333%; } + +.pull-xs-2 { + right: 16.666667%; } + +.pull-xs-3 { + right: 25%; } + +.pull-xs-4 { + right: 33.333333%; } + +.pull-xs-5 { + right: 41.666667%; } + +.pull-xs-6 { + right: 50%; } + +.pull-xs-7 { + right: 58.333333%; } + +.pull-xs-8 { + right: 66.666667%; } + +.pull-xs-9 { + right: 75%; } + +.pull-xs-10 { + right: 83.333333%; } + +.pull-xs-11 { + right: 91.666667%; } + +.pull-xs-12 { + right: 100%; } + +.push-xs-0 { + left: auto; } + +.push-xs-1 { + left: 8.333333%; } + +.push-xs-2 { + left: 16.666667%; } + +.push-xs-3 { + left: 25%; } + +.push-xs-4 { + left: 33.333333%; } + +.push-xs-5 { + left: 41.666667%; } + +.push-xs-6 { + left: 50%; } + +.push-xs-7 { + left: 58.333333%; } + +.push-xs-8 { + left: 66.666667%; } + +.push-xs-9 { + left: 75%; } + +.push-xs-10 { + left: 83.333333%; } + +.push-xs-11 { + left: 91.666667%; } + +.push-xs-12 { + left: 100%; } + +.offset-xs-1 { + margin-left: 8.333333%; } + +.offset-xs-2 { + margin-left: 16.666667%; } + +.offset-xs-3 { + margin-left: 25%; } + +.offset-xs-4 { + margin-left: 33.333333%; } + +.offset-xs-5 { + margin-left: 41.666667%; } + +.offset-xs-6 { + margin-left: 50%; } + +.offset-xs-7 { + margin-left: 58.333333%; } + +.offset-xs-8 { + margin-left: 66.666667%; } + +.offset-xs-9 { + margin-left: 75%; } + +.offset-xs-10 { + margin-left: 83.333333%; } + +.offset-xs-11 { + margin-left: 91.666667%; } + +@media (min-width: 576px) { + .col-sm { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; } + .col-sm-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; } + .col-sm-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; } + .col-sm-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; } + .col-sm-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; } + .col-sm-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; } + .col-sm-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; } + .col-sm-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; } + .col-sm-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; } + .col-sm-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; } + .col-sm-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; } + .col-sm-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; } + .col-sm-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; } + .pull-sm-0 { + right: auto; } + .pull-sm-1 { + right: 8.333333%; } + .pull-sm-2 { + right: 16.666667%; } + .pull-sm-3 { + right: 25%; } + .pull-sm-4 { + right: 33.333333%; } + .pull-sm-5 { + right: 41.666667%; } + .pull-sm-6 { + right: 50%; } + .pull-sm-7 { + right: 58.333333%; } + .pull-sm-8 { + right: 66.666667%; } + .pull-sm-9 { + right: 75%; } + .pull-sm-10 { + right: 83.333333%; } + .pull-sm-11 { + right: 91.666667%; } + .pull-sm-12 { + right: 100%; } + .push-sm-0 { + left: auto; } + .push-sm-1 { + left: 8.333333%; } + .push-sm-2 { + left: 16.666667%; } + .push-sm-3 { + left: 25%; } + .push-sm-4 { + left: 33.333333%; } + .push-sm-5 { + left: 41.666667%; } + .push-sm-6 { + left: 50%; } + .push-sm-7 { + left: 58.333333%; } + .push-sm-8 { + left: 66.666667%; } + .push-sm-9 { + left: 75%; } + .push-sm-10 { + left: 83.333333%; } + .push-sm-11 { + left: 91.666667%; } + .push-sm-12 { + left: 100%; } + .offset-sm-0 { + margin-left: 0%; } + .offset-sm-1 { + margin-left: 8.333333%; } + .offset-sm-2 { + margin-left: 16.666667%; } + .offset-sm-3 { + margin-left: 25%; } + .offset-sm-4 { + margin-left: 33.333333%; } + .offset-sm-5 { + margin-left: 41.666667%; } + .offset-sm-6 { + margin-left: 50%; } + .offset-sm-7 { + margin-left: 58.333333%; } + .offset-sm-8 { + margin-left: 66.666667%; } + .offset-sm-9 { + margin-left: 75%; } + .offset-sm-10 { + margin-left: 83.333333%; } + .offset-sm-11 { + margin-left: 91.666667%; } } + +@media (min-width: 768px) { + .col-md { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; } + .col-md-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; } + .col-md-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; } + .col-md-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; } + .col-md-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; } + .col-md-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; } + .col-md-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; } + .col-md-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; } + .col-md-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; } + .col-md-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; } + .col-md-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; } + .col-md-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; } + .col-md-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; } + .pull-md-0 { + right: auto; } + .pull-md-1 { + right: 8.333333%; } + .pull-md-2 { + right: 16.666667%; } + .pull-md-3 { + right: 25%; } + .pull-md-4 { + right: 33.333333%; } + .pull-md-5 { + right: 41.666667%; } + .pull-md-6 { + right: 50%; } + .pull-md-7 { + right: 58.333333%; } + .pull-md-8 { + right: 66.666667%; } + .pull-md-9 { + right: 75%; } + .pull-md-10 { + right: 83.333333%; } + .pull-md-11 { + right: 91.666667%; } + .pull-md-12 { + right: 100%; } + .push-md-0 { + left: auto; } + .push-md-1 { + left: 8.333333%; } + .push-md-2 { + left: 16.666667%; } + .push-md-3 { + left: 25%; } + .push-md-4 { + left: 33.333333%; } + .push-md-5 { + left: 41.666667%; } + .push-md-6 { + left: 50%; } + .push-md-7 { + left: 58.333333%; } + .push-md-8 { + left: 66.666667%; } + .push-md-9 { + left: 75%; } + .push-md-10 { + left: 83.333333%; } + .push-md-11 { + left: 91.666667%; } + .push-md-12 { + left: 100%; } + .offset-md-0 { + margin-left: 0%; } + .offset-md-1 { + margin-left: 8.333333%; } + .offset-md-2 { + margin-left: 16.666667%; } + .offset-md-3 { + margin-left: 25%; } + .offset-md-4 { + margin-left: 33.333333%; } + .offset-md-5 { + margin-left: 41.666667%; } + .offset-md-6 { + margin-left: 50%; } + .offset-md-7 { + margin-left: 58.333333%; } + .offset-md-8 { + margin-left: 66.666667%; } + .offset-md-9 { + margin-left: 75%; } + .offset-md-10 { + margin-left: 83.333333%; } + .offset-md-11 { + margin-left: 91.666667%; } } + +@media (min-width: 992px) { + .col-lg { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; } + .col-lg-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; } + .col-lg-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; } + .col-lg-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; } + .col-lg-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; } + .col-lg-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; } + .col-lg-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; } + .col-lg-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; } + .col-lg-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; } + .col-lg-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; } + .col-lg-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; } + .col-lg-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; } + .col-lg-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; } + .pull-lg-0 { + right: auto; } + .pull-lg-1 { + right: 8.333333%; } + .pull-lg-2 { + right: 16.666667%; } + .pull-lg-3 { + right: 25%; } + .pull-lg-4 { + right: 33.333333%; } + .pull-lg-5 { + right: 41.666667%; } + .pull-lg-6 { + right: 50%; } + .pull-lg-7 { + right: 58.333333%; } + .pull-lg-8 { + right: 66.666667%; } + .pull-lg-9 { + right: 75%; } + .pull-lg-10 { + right: 83.333333%; } + .pull-lg-11 { + right: 91.666667%; } + .pull-lg-12 { + right: 100%; } + .push-lg-0 { + left: auto; } + .push-lg-1 { + left: 8.333333%; } + .push-lg-2 { + left: 16.666667%; } + .push-lg-3 { + left: 25%; } + .push-lg-4 { + left: 33.333333%; } + .push-lg-5 { + left: 41.666667%; } + .push-lg-6 { + left: 50%; } + .push-lg-7 { + left: 58.333333%; } + .push-lg-8 { + left: 66.666667%; } + .push-lg-9 { + left: 75%; } + .push-lg-10 { + left: 83.333333%; } + .push-lg-11 { + left: 91.666667%; } + .push-lg-12 { + left: 100%; } + .offset-lg-0 { + margin-left: 0%; } + .offset-lg-1 { + margin-left: 8.333333%; } + .offset-lg-2 { + margin-left: 16.666667%; } + .offset-lg-3 { + margin-left: 25%; } + .offset-lg-4 { + margin-left: 33.333333%; } + .offset-lg-5 { + margin-left: 41.666667%; } + .offset-lg-6 { + margin-left: 50%; } + .offset-lg-7 { + margin-left: 58.333333%; } + .offset-lg-8 { + margin-left: 66.666667%; } + .offset-lg-9 { + margin-left: 75%; } + .offset-lg-10 { + margin-left: 83.333333%; } + .offset-lg-11 { + margin-left: 91.666667%; } } + +@media (min-width: 1200px) { + .col-xl { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; } + .col-xl-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; } + .col-xl-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; } + .col-xl-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; } + .col-xl-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; } + .col-xl-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; } + .col-xl-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; } + .col-xl-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; } + .col-xl-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; } + .col-xl-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; } + .col-xl-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; } + .col-xl-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; } + .col-xl-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; } + .pull-xl-0 { + right: auto; } + .pull-xl-1 { + right: 8.333333%; } + .pull-xl-2 { + right: 16.666667%; } + .pull-xl-3 { + right: 25%; } + .pull-xl-4 { + right: 33.333333%; } + .pull-xl-5 { + right: 41.666667%; } + .pull-xl-6 { + right: 50%; } + .pull-xl-7 { + right: 58.333333%; } + .pull-xl-8 { + right: 66.666667%; } + .pull-xl-9 { + right: 75%; } + .pull-xl-10 { + right: 83.333333%; } + .pull-xl-11 { + right: 91.666667%; } + .pull-xl-12 { + right: 100%; } + .push-xl-0 { + left: auto; } + .push-xl-1 { + left: 8.333333%; } + .push-xl-2 { + left: 16.666667%; } + .push-xl-3 { + left: 25%; } + .push-xl-4 { + left: 33.333333%; } + .push-xl-5 { + left: 41.666667%; } + .push-xl-6 { + left: 50%; } + .push-xl-7 { + left: 58.333333%; } + .push-xl-8 { + left: 66.666667%; } + .push-xl-9 { + left: 75%; } + .push-xl-10 { + left: 83.333333%; } + .push-xl-11 { + left: 91.666667%; } + .push-xl-12 { + left: 100%; } + .offset-xl-0 { + margin-left: 0%; } + .offset-xl-1 { + margin-left: 8.333333%; } + .offset-xl-2 { + margin-left: 16.666667%; } + .offset-xl-3 { + margin-left: 25%; } + .offset-xl-4 { + margin-left: 33.333333%; } + .offset-xl-5 { + margin-left: 41.666667%; } + .offset-xl-6 { + margin-left: 50%; } + .offset-xl-7 { + margin-left: 58.333333%; } + .offset-xl-8 { + margin-left: 66.666667%; } + .offset-xl-9 { + margin-left: 75%; } + .offset-xl-10 { + margin-left: 83.333333%; } + .offset-xl-11 { + margin-left: 91.666667%; } } + +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; } + .embed-responsive .embed-responsive-item, + .embed-responsive iframe, + .embed-responsive embed, + .embed-responsive object, + .embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; } + +.embed-responsive-21by9 { + padding-bottom: 42.857143%; } + +.embed-responsive-16by9 { + padding-bottom: 56.25%; } + +.embed-responsive-4by3 { + padding-bottom: 75%; } + +.embed-responsive-1by1 { + padding-bottom: 100%; } + +html { + box-sizing: border-box; } + +*, +*::before, +*::after { + box-sizing: inherit; } + +@-ms-viewport { + width: device-width; } + +html { + -ms-overflow-style: scrollbar; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } + +[tabindex='-1']:focus { + outline: none !important; } + +img { + vertical-align: middle; } + +[role='button'] { + cursor: pointer; } + +a, +area, +button, +[role='button'], +input, +label, +select, +summary, +textarea { + -ms-touch-action: manipulation; + touch-action: manipulation; } + +button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color; } + +input, +button, +select, +textarea { + border-radius: 0; } + +input[type='radio']:disabled, +input[type='checkbox']:disabled { + cursor: not-allowed; } + +input[type='date'], +input[type='time'], +input[type='datetime-local'], +input[type='month'] { + -webkit-appearance: listbox; } + +textarea { + resize: vertical; } + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; } + +legend { + display: block; + width: 100%; + padding: 0; + line-height: inherit; } + +input[type='search'] { + -webkit-appearance: none; } + +[hidden] { + display: none !important; } + +dl { + margin-bottom: 0; + margin-top: 1rem; } + +table { + border-spacing: 0; } + +a:link { + color: #007cbb; + text-decoration: none; } + +a:hover { + color: #007cbb; + text-decoration: underline; } + +a:active { + color: #9460b8; + text-decoration: underline; } + +a:visited { + color: #5659b9; + text-decoration: none; } + +.is-off-screen { + position: fixed !important; + border: none !important; + height: 1px !important; + width: 1px !important; + left: 0px !important; + top: -1px !important; + overflow: hidden !important; + visibility: hidden !important; + padding: 0 !important; + margin: 0 0 -1px 0 !important; } + +.alert-icon, +.clr-icon { + display: inline-block; + height: 0.666667rem; + width: 0.666667rem; + padding: 0; + background-repeat: no-repeat; + background-size: contain; + vertical-align: middle; } + +.alert-icon.clr-icon-warning, .alert-icon.icon-warning, +.clr-icon.clr-icon-warning, +.clr-icon.icon-warning { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20version%3D%221.1%22%20viewBox%3D%225%205%2026%2026%22%20preserveAspectRatio%3D%22xMidYMid%20meet%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%3Cdefs%3E%3Cstyle%20type%3D%22text%2Fcss%22%3E%0A%09.clr-i-outline%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23737373%3B%7D%3C%2Fstyle%3E%3C%2Fdefs%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctitle%3Eexclamation-triangle-line%3C%2Ftitle%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22clr-i-outline%20clr-i-outline-path-1%22%20d%3D%22M18%2C21.32a1.3%2C1.3%2C0%2C0%2C0%2C1.3-1.3V14a1.3%2C1.3%2C0%2C1%2C0-2.6%2C0v6A1.3%2C1.3%2C0%2C0%2C0%2C18%2C21.32Z%22%3E%3C%2Fpath%3E%3Ccircle%20class%3D%22clr-i-outline%20clr-i-outline-path-2%22%20cx%3D%2217.95%22%20cy%3D%2224.27%22%20r%3D%221.5%22%3E%3C%2Fcircle%3E%3Cpath%20class%3D%22clr-i-outline%20clr-i-outline-path-3%22%20d%3D%22M30.33%2C25.54%2C20.59%2C7.6a3%2C3%2C0%2C0%2C0-5.27%2C0L5.57%2C25.54A3%2C3%2C0%2C0%2C0%2C8.21%2C30H27.69a3%2C3%2C0%2C0%2C0%2C2.64-4.43Zm-1.78%2C1.94a1%2C1%2C0%2C0%2C1-.86.49H8.21a1%2C1%2C0%2C0%2C1-.88-1.48L17.07%2C8.55a1%2C1%2C0%2C0%2C1%2C1.76%2C0l9.74%2C17.94A1%2C1%2C0%2C0%2C1%2C28.55%2C27.48Z%22%3E%3C%2Fpath%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fsvg%3E"); } + +.alert-icon.clr-icon-warning-white, +.clr-icon.clr-icon-warning-white { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20version%3D%221.1%22%20viewBox%3D%225%205%2026%2026%22%20preserveAspectRatio%3D%22xMidYMid%20meet%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%3Cdefs%3E%3Cstyle%20type%3D%22text%2Fcss%22%3E%0A%09.clr-i-outline%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23fff%3B%7D%3C%2Fstyle%3E%3C%2Fdefs%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctitle%3Eexclamation-triangle-line%3C%2Ftitle%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22clr-i-outline%20clr-i-outline-path-1%22%20d%3D%22M18%2C21.32a1.3%2C1.3%2C0%2C0%2C0%2C1.3-1.3V14a1.3%2C1.3%2C0%2C1%2C0-2.6%2C0v6A1.3%2C1.3%2C0%2C0%2C0%2C18%2C21.32Z%22%3E%3C%2Fpath%3E%3Ccircle%20class%3D%22clr-i-outline%20clr-i-outline-path-2%22%20cx%3D%2217.95%22%20cy%3D%2224.27%22%20r%3D%221.5%22%3E%3C%2Fcircle%3E%3Cpath%20class%3D%22clr-i-outline%20clr-i-outline-path-3%22%20d%3D%22M30.33%2C25.54%2C20.59%2C7.6a3%2C3%2C0%2C0%2C0-5.27%2C0L5.57%2C25.54A3%2C3%2C0%2C0%2C0%2C8.21%2C30H27.69a3%2C3%2C0%2C0%2C0%2C2.64-4.43Zm-1.78%2C1.94a1%2C1%2C0%2C0%2C1-.86.49H8.21a1%2C1%2C0%2C0%2C1-.88-1.48L17.07%2C8.55a1%2C1%2C0%2C0%2C1%2C1.76%2C0l9.74%2C17.94A1%2C1%2C0%2C0%2C1%2C28.55%2C27.48Z%22%3E%3C%2Fpath%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fsvg%3E"); } + +.alert-icon.clr-vmw-logo, +.clr-icon.clr-vmw-logo { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20viewBox%3D%220%200%2036%2036%22%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%0A%20%20%20%20%3Ctitle%3Evm%20bug%3C%2Ftitle%3E%0A%20%20%20%20%3Cdefs%3E%3C%2Fdefs%3E%0A%20%20%20%20%3Cg%20id%3D%22Headers%22%20stroke%3D%22none%22%20stroke-width%3D%221%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%20%20%20%20%3Cg%20id%3D%22CL-Headers-Specs%22%20transform%3D%22translate(-262.000000%2C%20-175.000000)%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20id%3D%2201%22%20transform%3D%22translate(238.000000%2C%20163.000000)%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20id%3D%22vm-bug%22%20transform%3D%22translate(24.703125%2C%2012.000000)%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Crect%20id%3D%22Rectangle-42%22%20fill-opacity%3D%220.25%22%20fill%3D%22%23DDDDDD%22%20opacity%3D%220.6%22%20x%3D%220%22%20y%3D%220%22%20width%3D%2236%22%20height%3D%2236%22%20rx%3D%223%22%3E%3C%2Frect%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M7.63948376%2C13.8762402%20C7.32265324%2C13.2097082%206.53978152%2C12.9085139%205.80923042%2C13.219934%20C5.07771043%2C13.5322837%204.80932495%2C14.3103691%205.13972007%2C14.9769011%20L8.20725954%2C21.3744923%20C8.68977207%2C22.3784735%209.19844491%2C22.9037044%2010.1528121%2C22.9037044%20C11.1720955%2C22.9037044%2011.6168209%2C22.3310633%2012.0983646%2C21.3744923%20C12.0983646%2C21.3744923%2014.7744682%2C15.7847341%2014.8015974%2C15.7261685%20C14.8287266%2C15.6666733%2014.9149588%2C15.4863286%2015.1872199%2C15.4872582%20C15.4178182%2C15.490047%2015.6106294%2C15.6657437%2015.6106294%2C15.9018652%20L15.6106294%2C21.3698443%20C15.6106294%2C22.212073%2016.0979865%2C22.9037044%2017.0349134%2C22.9037044%20C17.9718403%2C22.9037044%2018.4785754%2C22.212073%2018.4785754%2C21.3698443%20L18.4785754%2C16.8965503%20C18.4785754%2C16.0338702%2019.1219254%2C15.4742436%2020.0007183%2C15.4742436%20C20.8785423%2C15.4742436%2021.4637583%2C16.0524624%2021.4637583%2C16.8965503%20L21.4637583%2C21.3698443%20C21.4637583%2C22.212073%2021.9520842%2C22.9037044%2022.8880423%2C22.9037044%20C23.8240003%2C22.9037044%2024.3326731%2C22.212073%2024.3326731%2C21.3698443%20L24.3326731%2C16.8965503%20C24.3326731%2C16.0338702%2024.9750543%2C15.4742436%2025.8538472%2C15.4742436%20C26.7307023%2C15.4742436%2027.3168871%2C16.0524624%2027.3168871%2C16.8965503%20L27.3168871%2C21.3698443%20C27.3168871%2C22.212073%2027.8052131%2C22.9037044%2028.74214%2C22.9037044%20C29.6771291%2C22.9037044%2030.1848331%2C22.212073%2030.1848331%2C21.3698443%20L30.1848331%2C16.2783582%20C30.1848331%2C14.4070488%2028.6181207%2C13.0962956%2026.7307023%2C13.0962956%20C24.8452216%2C13.0962956%2023.6651006%2C14.3475536%2023.6651006%2C14.3475536%20C23.037253%2C13.5666793%2022.1720247%2C13.0972252%2020.7089847%2C13.0972252%20C19.164557%2C13.0972252%2017.8129406%2C14.3475536%2017.8129406%2C14.3475536%20C17.1841241%2C13.5666793%2016.1154267%2C13.0972252%2015.2308204%2C13.0972252%20C13.8617638%2C13.0972252%2012.7746572%2C13.675444%2012.1119292%2C15.1302871%20L10.1528121%2C19.5608189%20L7.63948376%2C13.8762402%22%20id%3D%22Fill-4%22%20fill%3D%22%23FFFFFF%22%3E%3C%2Fpath%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E"); } + +h1 { + color: #000; + font-weight: 200; + font-family: Metropolis, "Avenir Next", "Helvetica Neue", Arial, sans-serif; + font-size: 1.333333rem; + letter-spacing: normal; + line-height: 2rem; + margin-top: 1rem; + margin-bottom: 0; } + +h2 { + color: #000; + font-weight: 200; + font-family: Metropolis, "Avenir Next", "Helvetica Neue", Arial, sans-serif; + font-size: 1.166667rem; + letter-spacing: normal; + line-height: 2rem; + margin-top: 1rem; + margin-bottom: 0; } + +h3 { + color: #000; + font-weight: 200; + font-family: Metropolis, "Avenir Next", "Helvetica Neue", Arial, sans-serif; + font-size: 0.916667rem; + letter-spacing: normal; + line-height: 1rem; + margin-top: 1rem; + margin-bottom: 0; } + +h4 { + color: #000; + font-weight: 200; + font-family: Metropolis, "Avenir Next", "Helvetica Neue", Arial, sans-serif; + font-size: 0.75rem; + letter-spacing: normal; + line-height: 1rem; + margin-top: 1rem; + margin-bottom: 0; } + +h5 { + color: #565656; + font-weight: 400; + font-family: Metropolis, "Avenir Next", "Helvetica Neue", Arial, sans-serif; + font-size: 0.666667rem; + letter-spacing: 0.01em; + line-height: 1rem; + margin-top: 1rem; + margin-bottom: 0; } + +h6 { + font-weight: 500; + font-family: Metropolis, "Avenir Next", "Helvetica Neue", Arial, sans-serif; + font-size: 0.583333rem; + letter-spacing: normal; + line-height: 1rem; + margin-top: 1rem; + margin-bottom: 0; + color: #313131; } + +body { + color: #565656; + font-weight: 400; + font-size: 0.583333rem; + letter-spacing: normal; + line-height: 1rem; + margin-top: 1rem; + margin-bottom: 0; + font-family: Metropolis, "Avenir Next", "Helvetica Neue", Arial, sans-serif; + margin-top: 0 !important; } + +body p { + color: #565656; + font-weight: 400; + font-size: 0.583333rem; + letter-spacing: normal; + line-height: 1rem; + margin-top: 1rem; + margin-bottom: 0; } + +body .p0, +body p.p0 { + font-weight: 200; + font-size: 0.833333rem; + letter-spacing: normal; + line-height: 1rem; + margin-top: 1rem; + margin-bottom: 0; } + +body .p2, +body p.p2 { + color: #565656; + font-weight: 500; + font-size: 0.541667rem; + letter-spacing: normal; + line-height: 1rem; + margin-top: 1rem; + margin-bottom: 0; } + +body .p3, +body p.p3 { + color: #565656; + font-weight: 400; + font-size: 0.541667rem; + letter-spacing: normal; + line-height: 1rem; + margin-top: 1rem; + margin-bottom: 0; } + +body .p4, +body p.p4 { + color: #565656; + font-weight: 600; + font-size: 0.5rem; + letter-spacing: normal; + line-height: 1rem; + margin-top: 1rem; + margin-bottom: 0; } + +body .p5, +body p.p5 { + color: #565656; + font-weight: 400; + font-size: 0.5rem; + letter-spacing: normal; + line-height: 1rem; + margin-top: 1rem; + margin-bottom: 0; } + +body .p6, +body p.p6 { + color: #565656; + font-weight: 600; + font-size: 0.458333rem; + letter-spacing: 0.03em; + line-height: 0.5rem; + margin-top: 1rem; + margin-bottom: 0; } + +body .p7, +body p.p7 { + color: #565656; + font-weight: 400; + font-size: 0.458333rem; + letter-spacing: 0.03em; + line-height: 0.5rem; + margin-top: 1rem; + margin-bottom: 0; } + +body .p8, +body p.p8 { + color: #565656; + font-weight: 400; + font-size: 0.416667rem; + letter-spacing: 0.03em; + line-height: 0.5rem; + margin-top: 1rem; + margin-bottom: 0; } + +.text-light { + font-weight: 200; } + +.text-right { + text-align: right !important; } + +.text-center { + text-align: center !important; } + +.text-left { + text-align: left !important; } + +.text-justify { + text-align: justify !important; } + +html { + color: #565656; + font-family: Metropolis, "Avenir Next", "Helvetica Neue", Arial, sans-serif; + font-size: 24px; } + +.btn { + cursor: pointer; + display: inline-block; + -webkit-appearance: none !important; + border-radius: 0.125rem; + border: 1px solid; + min-width: 3rem; + max-width: 15rem; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + text-align: center; + text-decoration: none; + text-transform: uppercase; + vertical-align: middle; + line-height: 1.5rem; + letter-spacing: 0.12em; + font-size: 0.5rem; + font-weight: 500; + height: 1.5rem; + padding: 0 0.5rem; + border-color: #0077b7; + background-color: transparent; + color: #007cbb; } + .btn:hover { + text-decoration: none; } + .btn:visited { + color: #007cbb; } + .btn:hover { + background-color: #e1f1f6; + color: #004a70; } + .btn:active { + box-shadow: 0 2px 0 0 #0094d2 inset; } + .btn.disabled, .btn:disabled { + color: #565656; + cursor: not-allowed; + background-color: transparent; + border-color: #737373; + opacity: 0.4; } + +.btn-group > .btn clr-icon, +.btn clr-icon { + transform: translate3d(0rem, -0.083333rem, 0); } + +.btn.btn-secondary, +.btn.btn-info, +.btn.btn-outline, +.btn.btn-primary-outline, +.btn.btn-secondary-outline, +.btn.btn-outline-primary, +.btn.btn-outline-secondary, +.btn.btn-info-outline, +.btn-secondary .btn, +.btn-info .btn, +.btn-outline .btn, +.btn-primary-outline .btn, +.btn-secondary-outline .btn, +.btn-outline-primary .btn, +.btn-outline-secondary .btn, +.btn-info-outline .btn, +.btn-outline-info .btn { + border-color: #0077b7; + background-color: transparent; + color: #007cbb; } + .btn.btn-secondary:visited, + .btn.btn-info:visited, + .btn.btn-outline:visited, + .btn.btn-primary-outline:visited, + .btn.btn-secondary-outline:visited, + .btn.btn-outline-primary:visited, + .btn.btn-outline-secondary:visited, + .btn.btn-info-outline:visited, + .btn-secondary .btn:visited, + .btn-info .btn:visited, + .btn-outline .btn:visited, + .btn-primary-outline .btn:visited, + .btn-secondary-outline .btn:visited, + .btn-outline-primary .btn:visited, + .btn-outline-secondary .btn:visited, + .btn-info-outline .btn:visited, + .btn-outline-info .btn:visited { + color: #007cbb; } + .btn.btn-secondary:hover, + .btn.btn-info:hover, + .btn.btn-outline:hover, + .btn.btn-primary-outline:hover, + .btn.btn-secondary-outline:hover, + .btn.btn-outline-primary:hover, + .btn.btn-outline-secondary:hover, + .btn.btn-info-outline:hover, + .btn-secondary .btn:hover, + .btn-info .btn:hover, + .btn-outline .btn:hover, + .btn-primary-outline .btn:hover, + .btn-secondary-outline .btn:hover, + .btn-outline-primary .btn:hover, + .btn-outline-secondary .btn:hover, + .btn-info-outline .btn:hover, + .btn-outline-info .btn:hover { + background-color: #e1f1f6; + color: #004a70; } + .btn.btn-secondary:active, + .btn.btn-info:active, + .btn.btn-outline:active, + .btn.btn-primary-outline:active, + .btn.btn-secondary-outline:active, + .btn.btn-outline-primary:active, + .btn.btn-outline-secondary:active, + .btn.btn-info-outline:active, + .btn-secondary .btn:active, + .btn-info .btn:active, + .btn-outline .btn:active, + .btn-primary-outline .btn:active, + .btn-secondary-outline .btn:active, + .btn-outline-primary .btn:active, + .btn-outline-secondary .btn:active, + .btn-info-outline .btn:active, + .btn-outline-info .btn:active { + box-shadow: 0 2px 0 0 #0094d2 inset; } + .btn.btn-secondary.disabled, .btn.btn-secondary:disabled, + .btn.btn-info.disabled, + .btn.btn-info:disabled, + .btn.btn-outline.disabled, + .btn.btn-outline:disabled, + .btn.btn-primary-outline.disabled, + .btn.btn-primary-outline:disabled, + .btn.btn-secondary-outline.disabled, + .btn.btn-secondary-outline:disabled, + .btn.btn-outline-primary.disabled, + .btn.btn-outline-primary:disabled, + .btn.btn-outline-secondary.disabled, + .btn.btn-outline-secondary:disabled, + .btn.btn-info-outline.disabled, + .btn.btn-info-outline:disabled, + .btn-secondary .btn.disabled, + .btn-secondary .btn:disabled, + .btn-info .btn.disabled, + .btn-info .btn:disabled, + .btn-outline .btn.disabled, + .btn-outline .btn:disabled, + .btn-primary-outline .btn.disabled, + .btn-primary-outline .btn:disabled, + .btn-secondary-outline .btn.disabled, + .btn-secondary-outline .btn:disabled, + .btn-outline-primary .btn.disabled, + .btn-outline-primary .btn:disabled, + .btn-outline-secondary .btn.disabled, + .btn-outline-secondary .btn:disabled, + .btn-info-outline .btn.disabled, + .btn-info-outline .btn:disabled, + .btn-outline-info .btn.disabled, + .btn-outline-info .btn:disabled { + color: #565656; + cursor: not-allowed; + background-color: transparent; + border-color: #737373; + opacity: 0.4; } + +.btn.btn-primary, +.btn-primary .btn { + border-color: #007cbb; + background-color: #007cbb; + color: #fff; } + .btn.btn-primary:visited, + .btn-primary .btn:visited { + color: #fff; } + .btn.btn-primary:hover, + .btn-primary .btn:hover { + background-color: #004a70; + color: #e1f1f6; } + .btn.btn-primary:active, + .btn-primary .btn:active { + box-shadow: 0 1px 0 0 #0094d2 inset; } + .btn.btn-primary.disabled, .btn.btn-primary:disabled, + .btn-primary .btn.disabled, + .btn-primary .btn:disabled { + color: #565656; + cursor: not-allowed; + background-color: #ccc; + border-color: #ccc; + opacity: 0.4; } + +.btn.btn-success, +.btn-success .btn { + border-color: #318700; + background-color: #318700; + color: #fff; } + .btn.btn-success:visited, + .btn-success .btn:visited { + color: #fff; } + .btn.btn-success:hover, + .btn-success .btn:hover { + background-color: #266900; + color: #fff; } + .btn.btn-success:active, + .btn-success .btn:active { + box-shadow: 0 2px 0 0 #1d5100 inset; } + .btn.btn-success.disabled, .btn.btn-success:disabled, + .btn-success .btn.disabled, + .btn-success .btn:disabled { + color: #565656; + cursor: not-allowed; + background-color: #ccc; + border-color: #ccc; + opacity: 0.4; } + +.btn.btn-danger, +.btn.btn-warning, +.btn-danger .btn, +.btn-warning .btn { + border-color: #e62700; + background-color: #e62700; + color: #fff; } + .btn.btn-danger:visited, + .btn.btn-warning:visited, + .btn-danger .btn:visited, + .btn-warning .btn:visited { + color: #fff; } + .btn.btn-danger:hover, + .btn.btn-warning:hover, + .btn-danger .btn:hover, + .btn-warning .btn:hover { + background-color: #c92100; + color: #fff; } + .btn.btn-danger:active, + .btn.btn-warning:active, + .btn-danger .btn:active, + .btn-warning .btn:active { + box-shadow: 0 2px 0 0 #a32100 inset; } + .btn.btn-danger.disabled, .btn.btn-danger:disabled, + .btn.btn-warning.disabled, + .btn.btn-warning:disabled, + .btn-danger .btn.disabled, + .btn-danger .btn:disabled, + .btn-warning .btn.disabled, + .btn-warning .btn:disabled { + color: #565656; + cursor: not-allowed; + background-color: #ccc; + border-color: #ccc; + opacity: 0.4; } + +.btn.btn-outline, +.btn.btn-outline .btn, +.btn.btn-info-outline, +.btn-info-outline .btn, +.btn.btn-outline-info, +.btn-outline .btn { + border-color: #0077b7; + background-color: transparent; + color: #0077b7; } + .btn.btn-outline:visited, + .btn.btn-outline .btn:visited, + .btn.btn-info-outline:visited, + .btn-info-outline .btn:visited, + .btn.btn-outline-info:visited, + .btn-outline .btn:visited { + color: #0077b7; } + .btn.btn-outline:hover, + .btn.btn-outline .btn:hover, + .btn.btn-info-outline:hover, + .btn-info-outline .btn:hover, + .btn.btn-outline-info:hover, + .btn-outline .btn:hover { + background-color: #e1f1f6; + color: #004a70; } + .btn.btn-outline:active, + .btn.btn-outline .btn:active, + .btn.btn-info-outline:active, + .btn-info-outline .btn:active, + .btn.btn-outline-info:active, + .btn-outline .btn:active { + box-shadow: 0 2px 0 0 #0094d2 inset; } + .btn.btn-outline.disabled, .btn.btn-outline:disabled, + .btn.btn-outline .btn.disabled, + .btn.btn-outline .btn:disabled, + .btn.btn-info-outline.disabled, + .btn.btn-info-outline:disabled, + .btn-info-outline .btn.disabled, + .btn-info-outline .btn:disabled, + .btn.btn-outline-info.disabled, + .btn.btn-outline-info:disabled, + .btn-outline .btn.disabled, + .btn-outline .btn:disabled { + color: #565656; + cursor: not-allowed; + background-color: transparent; + border-color: #737373; + opacity: 0.4; } + +.btn.btn-success-outline, +.btn.btn-outline-success, +.btn-success-outline .btn, +.btn-outline-success .btn { + border-color: #308300; + background-color: transparent; + color: #308300; } + .btn.btn-success-outline:visited, + .btn.btn-outline-success:visited, + .btn-success-outline .btn:visited, + .btn-outline-success .btn:visited { + color: #308300; } + .btn.btn-success-outline:hover, + .btn.btn-outline-success:hover, + .btn-success-outline .btn:hover, + .btn-outline-success .btn:hover { + background-color: #dff0d0; + color: #1d5100; } + .btn.btn-success-outline:active, + .btn.btn-outline-success:active, + .btn-success-outline .btn:active, + .btn-outline-success .btn:active { + box-shadow: 0 1px 0 0 #60b515 inset; } + .btn.btn-success-outline.disabled, .btn.btn-success-outline:disabled, + .btn.btn-outline-success.disabled, + .btn.btn-outline-success:disabled, + .btn-success-outline .btn.disabled, + .btn-success-outline .btn:disabled, + .btn-outline-success .btn.disabled, + .btn-outline-success .btn:disabled { + color: #565656; + cursor: not-allowed; + background-color: transparent; + border-color: #737373; + opacity: 0.4; } + +.btn.btn-danger-outline, +.btn.btn-outline-danger, +.btn.btn-warning-outline, +.btn.btn-outline-warning, +.btn-danger-outline .btn, +.btn-outline-danger .btn, +.btn-warning-outline .btn, +.btn-outline-warning .btn { + border-color: #c92100; + background-color: transparent; + color: #e62700; } + .btn.btn-danger-outline:visited, + .btn.btn-outline-danger:visited, + .btn.btn-warning-outline:visited, + .btn.btn-outline-warning:visited, + .btn-danger-outline .btn:visited, + .btn-outline-danger .btn:visited, + .btn-warning-outline .btn:visited, + .btn-outline-warning .btn:visited { + color: #e62700; } + .btn.btn-danger-outline:hover, + .btn.btn-outline-danger:hover, + .btn.btn-warning-outline:hover, + .btn.btn-outline-warning:hover, + .btn-danger-outline .btn:hover, + .btn-outline-danger .btn:hover, + .btn-warning-outline .btn:hover, + .btn-outline-warning .btn:hover { + background-color: #f5dbd9; + color: #a32100; } + .btn.btn-danger-outline:active, + .btn.btn-outline-danger:active, + .btn.btn-warning-outline:active, + .btn.btn-outline-warning:active, + .btn-danger-outline .btn:active, + .btn-outline-danger .btn:active, + .btn-warning-outline .btn:active, + .btn-outline-warning .btn:active { + box-shadow: 0 1px 0 0 #ebafa6 inset; } + .btn.btn-danger-outline.disabled, .btn.btn-danger-outline:disabled, + .btn.btn-outline-danger.disabled, + .btn.btn-outline-danger:disabled, + .btn.btn-warning-outline.disabled, + .btn.btn-warning-outline:disabled, + .btn.btn-outline-warning.disabled, + .btn.btn-outline-warning:disabled, + .btn-danger-outline .btn.disabled, + .btn-danger-outline .btn:disabled, + .btn-outline-danger .btn.disabled, + .btn-outline-danger .btn:disabled, + .btn-warning-outline .btn.disabled, + .btn-warning-outline .btn:disabled, + .btn-outline-warning .btn.disabled, + .btn-outline-warning .btn:disabled { + color: #565656; + cursor: not-allowed; + background-color: transparent; + border-color: #565656; + opacity: 0.4; } + +.btn.btn-link, +.btn-link .btn { + border-color: transparent; + background-color: transparent; + color: #0077b7; } + .btn.btn-link:visited, + .btn-link .btn:visited { + color: #0077b7; } + .btn.btn-link:hover, + .btn-link .btn:hover { + background-color: transparent; + color: #004a70; } + .btn.btn-link:active, + .btn-link .btn:active { + box-shadow: 0 0 0 0 transparent inset; } + .btn.btn-link.disabled, .btn.btn-link:disabled, + .btn-link .btn.disabled, + .btn-link .btn:disabled { + color: #565656; + cursor: not-allowed; + background-color: transparent; + border-color: transparent; + opacity: 0.4; } + +.btn.btn-inverse, .alert-app-level .alert-item .btn, +.btn-inverse .btn, +.alert-app-level .alert-item .btn .btn { + border-color: #fff; + background-color: transparent; + color: #fff; } + .btn.btn-inverse:visited, .alert-app-level .alert-item .btn:visited, + .btn-inverse .btn:visited, + .alert-app-level .alert-item .btn .btn:visited { + color: #fff; } + .btn.btn-inverse:hover, .alert-app-level .alert-item .btn:hover, + .btn-inverse .btn:hover, + .alert-app-level .alert-item .btn .btn:hover { + background-color: rgba(255, 255, 255, 0.15); + color: #fff; } + .btn.btn-inverse:active, .alert-app-level .alert-item .btn:active, + .btn-inverse .btn:active, + .alert-app-level .alert-item .btn .btn:active { + box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.25) inset; } + .btn.btn-inverse.disabled, .alert-app-level .alert-item .btn.disabled, .btn.btn-inverse:disabled, .alert-app-level .alert-item .btn:disabled, + .btn-inverse .btn.disabled, + .alert-app-level .alert-item .btn .btn.disabled, + .btn-inverse .btn:disabled, + .alert-app-level .alert-item .btn .btn:disabled { + color: #fff; + cursor: not-allowed; + background-color: transparent; + border-color: #fff; + opacity: 0.4; } + +.btn.btn-sm, .alert-app-level .alert-item .btn, +.btn-sm .btn, +.alert-app-level .alert-item .btn .btn { + line-height: calc(1rem - 1px); + letter-spacing: 0.073em; + font-size: 0.458333rem; + font-weight: 500; + height: 1rem; + padding: 0 0.5rem; } + +.btn-block { + display: block; + width: 100%; + max-width: 100%; } + +.btn { + margin: 0.25rem 0.5rem 0.25rem 0; } + .btn.btn-link { + margin: 0.25rem 0; } + +.btn-sm:not(.btn-link) clr-icon, .alert-app-level .alert-item .btn:not(.btn-link) clr-icon { + width: 0.5rem; + height: 0.5rem; + transform: translate3d(0rem, -0.041667rem, 0); } + +.btn-icon { + min-width: 0; } + .btn-icon.disabled, .btn-icon:disabled { + color: #565656; } + +.btn-group.btn-primary .dropdown-toggle, +.btn-group.btn-success .dropdown-toggle, +.btn-group.btn-warning .dropdown-toggle, +.btn-group.btn-danger .dropdown-toggle { + border-color: #007cbb; + background-color: #007cbb; + color: #fff; } + .btn-group.btn-primary .dropdown-toggle:visited, + .btn-group.btn-success .dropdown-toggle:visited, + .btn-group.btn-warning .dropdown-toggle:visited, + .btn-group.btn-danger .dropdown-toggle:visited { + color: #fff; } + .btn-group.btn-primary .dropdown-toggle:hover, + .btn-group.btn-success .dropdown-toggle:hover, + .btn-group.btn-warning .dropdown-toggle:hover, + .btn-group.btn-danger .dropdown-toggle:hover { + background-color: #004a70; + color: #e1f1f6; } + .btn-group.btn-primary .dropdown-toggle:active, + .btn-group.btn-success .dropdown-toggle:active, + .btn-group.btn-warning .dropdown-toggle:active, + .btn-group.btn-danger .dropdown-toggle:active { + box-shadow: 0 1px 0 0 #0094d2 inset; } + .btn-group.btn-primary .dropdown-toggle.disabled, .btn-group.btn-primary .dropdown-toggle:disabled, + .btn-group.btn-success .dropdown-toggle.disabled, + .btn-group.btn-success .dropdown-toggle:disabled, + .btn-group.btn-warning .dropdown-toggle.disabled, + .btn-group.btn-warning .dropdown-toggle:disabled, + .btn-group.btn-danger .dropdown-toggle.disabled, + .btn-group.btn-danger .dropdown-toggle:disabled { + color: #565656; + cursor: not-allowed; + background-color: #ccc; + border-color: #ccc; + opacity: 0.4; } + +.btn-group.btn-link .dropdown-toggle { + border-color: transparent; + background-color: transparent; + color: #0077b7; } + .btn-group.btn-link .dropdown-toggle:visited { + color: #0077b7; } + .btn-group.btn-link .dropdown-toggle:hover { + background-color: transparent; + color: #004a70; } + .btn-group.btn-link .dropdown-toggle:active { + box-shadow: 0 0 0 0 transparent inset; } + .btn-group.btn-link .dropdown-toggle.disabled, .btn-group.btn-link .dropdown-toggle:disabled { + color: #565656; + cursor: not-allowed; + background-color: transparent; + border-color: transparent; + opacity: 0.4; } + +.btn-group.btn-sm .btn-group-overflow > .dropdown-toggle, .alert-app-level .alert-item .btn-group.btn .btn-group-overflow > .dropdown-toggle { + line-height: calc(1rem - 1px); + letter-spacing: 0.073em; + font-size: 0.458333rem; + font-weight: 500; + height: 1rem; + padding: 0 0.5rem; } + +.checkbox.btn, +.checkbox-inline.btn, +.radio.btn, +.radio-inline.btn { + padding: 0; } + .checkbox.btn label, + .checkbox-inline.btn label, + .radio.btn label, + .radio-inline.btn label { + display: block; + line-height: inherit; + padding: 0 0.5rem; } + +.checkbox.btn input[type='checkbox'] + label::before, +.checkbox.btn input[type='checkbox'] + label::after, +.checkbox-inline.btn input[type='checkbox'] + label::before, +.checkbox-inline.btn input[type='checkbox'] + label::after { + content: none; } + +.radio.btn input[type='radio'] + label::before, +.radio.btn input[type='radio'] + label::after, +.radio-inline.btn input[type='radio'] + label::before, +.radio-inline.btn input[type='radio'] + label::after { + content: none; } + +.checkbox.btn input[type='checkbox']:checked + label, +.checkbox-inline.btn input[type='checkbox']:checked + label { + background-color: #007cbb; + color: #fff; } + +.checkbox.btn label, +.checkbox-inline.btn label { + width: 100%; } + +.checkbox.btn.btn-secondary input[type='checkbox']:checked + label, .checkbox.btn.btn-info input[type='checkbox']:checked + label, .checkbox.btn.btn-outline input[type='checkbox']:checked + label, .checkbox.btn.btn-primary-outline input[type='checkbox']:checked + label, .checkbox.btn.btn-secondary-outline input[type='checkbox']:checked + label, .checkbox.btn.btn-outline-primary input[type='checkbox']:checked + label, .checkbox.btn.btn-outline-secondary input[type='checkbox']:checked + label, .checkbox.btn.btn-info-outline input[type='checkbox']:checked + label, .checkbox.btn.btn-outline-info input[type='checkbox']:checked + label, +.checkbox-inline.btn.btn-secondary input[type='checkbox']:checked + label, +.checkbox-inline.btn.btn-info input[type='checkbox']:checked + label, +.checkbox-inline.btn.btn-outline input[type='checkbox']:checked + label, +.checkbox-inline.btn.btn-primary-outline input[type='checkbox']:checked + label, +.checkbox-inline.btn.btn-secondary-outline input[type='checkbox']:checked + label, +.checkbox-inline.btn.btn-outline-primary input[type='checkbox']:checked + label, +.checkbox-inline.btn.btn-outline-secondary input[type='checkbox']:checked + label, +.checkbox-inline.btn.btn-info-outline input[type='checkbox']:checked + label, +.checkbox-inline.btn.btn-outline-info input[type='checkbox']:checked + label { + background-color: #007cbb; + color: #fff; } + +.checkbox.btn.btn-primary input[type='checkbox']:checked + label, +.checkbox-inline.btn.btn-primary input[type='checkbox']:checked + label { + background-color: #fff; + color: #fff; } + +.checkbox.btn.btn-success input[type='checkbox']:checked + label, +.checkbox-inline.btn.btn-success input[type='checkbox']:checked + label { + background-color: #266900; + color: #fff; } + +.checkbox.btn.btn-danger input[type='checkbox']:checked + label, .checkbox.btn.btn-warning input[type='checkbox']:checked + label, +.checkbox-inline.btn.btn-danger input[type='checkbox']:checked + label, +.checkbox-inline.btn.btn-warning input[type='checkbox']:checked + label { + background-color: #c92100; + color: #fff; } + +.checkbox.btn.btn-success-outline input[type='checkbox']:checked + label, .checkbox.btn.btn-outline-success input[type='checkbox']:checked + label, +.checkbox-inline.btn.btn-success-outline input[type='checkbox']:checked + label, +.checkbox-inline.btn.btn-outline-success input[type='checkbox']:checked + label { + background-color: #308300; + color: #fff; } + +.checkbox.btn.btn-danger-outline input[type='checkbox']:checked + label, .checkbox.btn.btn-outline-danger input[type='checkbox']:checked + label, .checkbox.btn.btn-warning-outline input[type='checkbox']:checked + label, .checkbox.btn.btn-outline-warning input[type='checkbox']:checked + label, +.checkbox-inline.btn.btn-danger-outline input[type='checkbox']:checked + label, +.checkbox-inline.btn.btn-outline-danger input[type='checkbox']:checked + label, +.checkbox-inline.btn.btn-warning-outline input[type='checkbox']:checked + label, +.checkbox-inline.btn.btn-outline-warning input[type='checkbox']:checked + label { + background-color: #c92100; + color: #fff; } + +.checkbox.btn.btn-link input[type='checkbox']:checked + label, +.checkbox-inline.btn.btn-link input[type='checkbox']:checked + label { + background-color: transparent; + color: #004a70; } + +.checkbox.btn.btn-inverse input[type='checkbox']:checked + label, .alert-app-level .alert-item .checkbox.btn input[type='checkbox']:checked + label, +.checkbox-inline.btn.btn-inverse input[type='checkbox']:checked + label, +.alert-app-level .alert-item .checkbox-inline.btn input[type='checkbox']:checked + label { + background-color: rgba(255, 255, 255, 0.15); + color: #fff; } + +.radio.btn input[type='radio']:checked + label, +.radio.btn input[type='radio']:checked + label { + background-color: #007cbb; + color: #fff; } + +.radio.btn label, +.radio.btn label { + width: 100%; } + +.radio.btn.btn-secondary input[type='radio']:checked + label, .radio.btn.btn-info input[type='radio']:checked + label, .radio.btn.btn-outline input[type='radio']:checked + label, .radio.btn.btn-primary-outline input[type='radio']:checked + label, .radio.btn.btn-secondary-outline input[type='radio']:checked + label, .radio.btn.btn-outline-primary input[type='radio']:checked + label, .radio.btn.btn-outline-secondary input[type='radio']:checked + label, .radio.btn.btn-info-outline input[type='radio']:checked + label, .radio.btn.btn-outline-info input[type='radio']:checked + label, +.radio.btn.btn-secondary input[type='radio']:checked + label, +.radio.btn.btn-info input[type='radio']:checked + label, +.radio.btn.btn-outline input[type='radio']:checked + label, +.radio.btn.btn-primary-outline input[type='radio']:checked + label, +.radio.btn.btn-secondary-outline input[type='radio']:checked + label, +.radio.btn.btn-outline-primary input[type='radio']:checked + label, +.radio.btn.btn-outline-secondary input[type='radio']:checked + label, +.radio.btn.btn-info-outline input[type='radio']:checked + label, +.radio.btn.btn-outline-info input[type='radio']:checked + label { + background-color: #007cbb; + color: #fff; } + +.radio.btn.btn-primary input[type='radio']:checked + label, +.radio.btn.btn-primary input[type='radio']:checked + label { + background-color: #fff; + color: #fff; } + +.radio.btn.btn-success input[type='radio']:checked + label, +.radio.btn.btn-success input[type='radio']:checked + label { + background-color: #266900; + color: #fff; } + +.radio.btn.btn-danger input[type='radio']:checked + label, .radio.btn.btn-warning input[type='radio']:checked + label, +.radio.btn.btn-danger input[type='radio']:checked + label, +.radio.btn.btn-warning input[type='radio']:checked + label { + background-color: #c92100; + color: #fff; } + +.radio.btn.btn-success-outline input[type='radio']:checked + label, .radio.btn.btn-outline-success input[type='radio']:checked + label, +.radio.btn.btn-success-outline input[type='radio']:checked + label, +.radio.btn.btn-outline-success input[type='radio']:checked + label { + background-color: #308300; + color: #fff; } + +.radio.btn.btn-danger-outline input[type='radio']:checked + label, .radio.btn.btn-outline-danger input[type='radio']:checked + label, .radio.btn.btn-warning-outline input[type='radio']:checked + label, .radio.btn.btn-outline-warning input[type='radio']:checked + label, +.radio.btn.btn-danger-outline input[type='radio']:checked + label, +.radio.btn.btn-outline-danger input[type='radio']:checked + label, +.radio.btn.btn-warning-outline input[type='radio']:checked + label, +.radio.btn.btn-outline-warning input[type='radio']:checked + label { + background-color: #c92100; + color: #fff; } + +.radio.btn.btn-link input[type='radio']:checked + label, +.radio.btn.btn-link input[type='radio']:checked + label { + background-color: transparent; + color: #004a70; } + +.radio.btn.btn-inverse input[type='radio']:checked + label, .alert-app-level .alert-item .radio.btn input[type='radio']:checked + label, .radio.btn.btn-inverse input[type='radio']:checked + label, .alert-app-level .alert-item .radio.btn input[type='radio']:checked + label { + background-color: rgba(255, 255, 255, 0.15); + color: #fff; } + +.btn-group { + display: -ms-inline-flexbox; + display: inline-flex; + margin-right: 0.5rem; } + .btn-group .btn { + margin: 0; } + .btn-group .btn:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + .btn-group .btn:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + .btn-group.btn-primary .btn:not(:last-child), + .btn-group.btn-success .btn:not(:last-child), + .btn-group.btn-danger .btn:not(:last-child), + .btn-group.btn-warning .btn:not(:last-child) { + margin: 0 1px 0 0; } + .btn-group.btn-primary .dropdown-menu .btn, + .btn-group.btn-success .dropdown-menu .btn, + .btn-group.btn-danger .dropdown-menu .btn, + .btn-group.btn-warning .dropdown-menu .btn { + margin: 0; } + .btn-group > .btn-group-overflow { + position: relative; } + .btn-group > .btn-group-overflow:last-child:not(:first-child) > .btn:first-child { + border-radius: 0 0.125rem 0.125rem 0; } + .btn-group > .btn-group-overflow:last-child:first-child > .btn:first-child { + border-radius: 0.125rem; } + .btn-group .btn + .btn { + border-left: none; } + .btn-group .btn + .btn-group-overflow .btn { + border-left: none; } + .btn-group.btn-link .dropdown-toggle { + min-width: 0; } + .btn-group.btn-icon-link.btn-link .btn { + min-width: 0; } + .btn-group.btn-icon .btn { + min-width: 0; } + .btn-group .clr-icon-title { + display: none; + text-transform: none; } + .btn-group .dropdown-toggle { + display: block; } + .btn-group .dropdown-menu clr-icon { + display: none; } + .btn-group .dropdown-menu .clr-icon-title { + display: inline; } + +.card-footer .checkbox.btn label, +.card-footer .checkbox-inline.btn label, +.card-footer .radio.btn label, +.card-footer .radio-inline.btn label { + line-height: calc(1rem - 1px); } + +.toggle-switch input[type='checkbox'] { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; } + +.toggle-switch { + display: inline-block; + height: 1rem; + margin-right: 1rem; + vertical-align: middle; + position: relative; } + .toggle-switch label { + display: inline-block; + position: relative; + cursor: pointer; + height: 1rem; + margin-right: 2rem; } + .toggle-switch input[type='checkbox'] { + position: absolute; + top: 0.25rem; + right: 0.25rem; + height: 0.666667rem; + width: 0.666667rem; + opacity: 0; } + .toggle-switch input[type='checkbox'] + label::before { + position: absolute; + display: inline-block; + content: ''; + height: 0.75rem; + width: 1.375rem; + border: 2px solid; + border-radius: 0.375rem; + border-color: #737373; + background-color: #737373; + top: 0.125rem; + right: -1.75rem; + transition: 0.15s ease-in; + transition-property: border-color, background-color; } + .toggle-switch input[type='checkbox']:focus + label::before { + outline: 0; + box-shadow: 0 0 2px 2px #6bc1e3; } + .toggle-switch input[type='checkbox']:checked + label::before { + border-color: #62a420; + background-color: #62a420; + transition: 0.15s ease-in; + transition-property: border-color, background-color; } + .toggle-switch input[type='checkbox'] + label::after { + position: absolute; + display: inline-block; + content: ''; + height: 0.5833rem; + width: 0.5833rem; + border: 1px solid #fff; + border-radius: 50%; + background-color: #fff; + top: 0.20835rem; + right: -1.041667rem; + transition: right 0.15s ease-in; } + .toggle-switch input[type='checkbox']:checked + label::after { + right: -1.666667rem; + transition: right 0.15s ease-in; } + .toggle-switch.disabled label { + opacity: 0.4; + cursor: not-allowed; } + .toggle-switch.disabled input[type='checkbox']:checked + label::before { + border-color: #ccc; + background-color: #ccc; } + .toggle-switch input[type='checkbox']:disabled + label { + cursor: not-allowed; } + .toggle-switch input[type='checkbox']:disabled + label::before { + background-color: #fff; + border-color: #ccc; } + .toggle-switch input[type='checkbox']:disabled + label::after { + background-color: #fff; + border: 2px solid #ccc; + width: 0.75rem; + height: 0.75rem; + top: 3px; } + .toggle-switch input[type='checkbox']:checked:disabled + label::before { + border-color: #ccc; + background-color: #ccc; } + .toggle-switch input[type='checkbox']:checked:disabled + label::after { + border-color: #fff; + width: 0.5833rem; + height: 0.5833rem; + top: 5px; } + .toggle-switch.right-label label { + margin-left: 1.75rem; + margin-right: 0; } + .toggle-switch.right-label input[type='checkbox'] + label::before { + right: 0; + left: -1.75rem; } + .toggle-switch.right-label input[type='checkbox'] + label::after { + right: 0; + left: -1.666667rem; + transition-property: left; } + .toggle-switch.right-label input[type='checkbox']:checked + label::after { + left: -1.041667rem; + transition-property: left; } + +.close { + transition: color linear 0.2s; + font-weight: 200; + text-shadow: none; + line-height: inherit; + color: #737373; + opacity: 1; } + .close clr-icon { + fill: #737373; } + .close:focus, .close:hover, .close:active { + opacity: 1; + color: #000; } + .close:focus clr-icon, .close:hover clr-icon, .close:active clr-icon { + fill: #000; } + .close:focus { + outline: 0; + box-shadow: 0 0 2px 2px #6bc1e3; } + +.alert-icon { + height: 1rem; + width: 1rem; + margin-left: -0.125rem; + margin-top: -0.166667rem; } + +.alert-icon-wrapper { + -ms-flex: 0 0 1.041667rem; + flex: 0 0 1.041667rem; + -ms-flex-item-align: start; + -ms-grid-row-align: start; + align-self: start; + padding-top: 0.041667rem; + height: 0.75rem; } + +.alert-item { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + min-height: 0.75rem; + margin-bottom: 0.25rem; } + .alert-item:last-child { + margin-bottom: 0; } + +.alert-items { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + padding: 0.333333rem calc(0.5rem - 1px); + display: -ms-flexbox; + display: flex; } + +.alert-item > span, +.alert-text { + display: inline-block; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 1; + flex-shrink: 1; + -ms-flex-preferred-size: 98%; + flex-basis: 98%; + max-width: 98%; + margin-right: 0.5rem; + text-align: left; } + +.alert { + font-size: 0.541667rem; + letter-spacing: normal; + line-height: 0.75rem; + position: relative; + box-sizing: border-box; + display: -ms-flexbox; + display: flex; + -ms-flex-direction: row; + flex-direction: row; + width: auto; + border-radius: 0.125rem; + margin-top: 0.25rem; + background: #e1f1f6; + color: #565656; + border: 1px solid #49afd9; } + .alert .alert-icon { + color: #007cbb; } + .alert.alert-info { + background: #e1f1f6; + color: #565656; + border: 1px solid #49afd9; } + .alert.alert-info .alert-icon { + color: #007cbb; } + .alert.alert-success { + background: #dff0d0; + color: #565656; + border: 1px solid #60b515; } + .alert.alert-success .alert-icon { + color: #318700; } + .alert.alert-warning { + background: #feecb5; + color: #565656; + border: 1px solid #ffdc0b; } + .alert.alert-warning .alert-icon { + color: #565656; } + .alert.alert-danger { + background: #f5dbd9; + color: #565656; + border: 1px solid #ebafa6; } + .alert.alert-danger .alert-icon { + color: #c92100; } + .alert .alert-item .clr-icon { + height: 0.75rem; + width: 0.75rem; + margin-right: 0.25rem; } + .alert .alert-item .clr-icon + .alert-text { + padding-left: 0; } + .alert .alert-item .clr-icon + .alert-text::before { + content: none; } + .alert .alert-actions { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + white-space: nowrap; } + .alert .alert-actions .dropdown:last-child { + margin-right: -0.083333rem; } + .alert .alert-actions .dropdown-item { + color: #565656; + font-size: 0.583333rem; + line-height: 1rem; + letter-spacing: normal; } + .alert .alert-actions .dropdown .dropdown-toggle { + color: #565656; } + .alert .alert-action:not(:last-child) { + margin-right: 0.5rem; } + .alert .alert-action, + .alert .dropdown-toggle { + color: #565656; + text-decoration: underline; } + .alert .alert-action:active, + .alert .dropdown-toggle:active { + color: #50266b; } + .alert .alert-action button.dropdown-toggle:not(.btn) { + background: transparent; + cursor: pointer; + color: #565656; } + .alert .dropdown-toggle:not(.btn) { + display: inline-block; + background: transparent; + border: none; } + .alert .close { + width: 1rem; + display: block; + height: 1.5rem; + -ms-flex: 0 0 1.166667rem; + flex: 0 0 1.166667rem; + -ms-flex-order: 100; + order: 100; + padding-right: 0.166667rem; } + .alert .close clr-icon { + margin-top: -0.125rem; + height: calc(1rem - 1px); + width: calc(1rem - 1px); } + .alert .close ~ .alert-item > .alert-actions { + padding-right: 0.5rem; } + .alert .close ~ .alert-item > .alert-actions > .alert-action:last-child { + margin-right: 0.5rem; } + +.alert-app-level { + margin: 0; + border: none; + border-radius: 0; + overflow-y: auto; + background: #007cbb; + color: #fff; + border: none; } + .alert-app-level .alert-icon { + color: #fff; } + .alert-app-level.alert-info { + background: #007cbb; + color: #fff; + border: none; } + .alert-app-level.alert-info .alert-icon { + color: #fff; } + .alert-app-level.alert-danger { + background: #c92100; + color: #fff; + border: none; } + .alert-app-level.alert-danger .alert-icon { + color: #fff; } + .alert-app-level.alert-warning { + background: #c25400; + color: #fff; + border: none; } + .alert-app-level.alert-warning .alert-icon { + color: #fff; } + .alert-app-level.alert-success { + background: #62a420; + color: #fff; + border: none; } + .alert-app-level.alert-success .alert-icon { + color: #fff; } + .alert-app-level .alert-items { + padding-top: 0.25rem; + padding-bottom: 0.25rem; } + .alert-app-level .alert-item { + -ms-flex-pack: center; + justify-content: center; + -ms-flex-align: center; + align-items: center; + min-height: 1rem; } + .alert-app-level .alert-item .btn { + margin: 0; } + .alert-app-level .alert-item > span, + .alert-app-level .alert-text { + -ms-flex: 0 1 auto; + flex: 0 1 auto; } + .alert-app-level .alert-icon-wrapper { + margin-top: 0.125rem; } + .alert-app-level .close { + color: #fff; + opacity: 0.8; + height: 1.5rem; + overflow: hidden; } + .alert-app-level .close clr-icon { + fill: #fff; + margin-top: -0.208333rem; } + .alert-app-level .close:focus, .alert-app-level .close:hover, .alert-app-level .close:active { + opacity: 1; } + .alert-app-level .alert-action, + .alert-app-level .dropdown-toggle { + text-decoration: none; } + +.alert-sm { + letter-spacing: normal; + font-size: calc(0.5rem - 1px); + line-height: 0.666667rem; } + .alert-sm .alert-items { + padding: calc(0.166667rem - 1px) calc(0.25rem - 1px); } + .alert-sm .alert-item { + padding-top: 0.041667rem; + margin-bottom: 0.166667rem; } + .alert-sm .alert-item:last-child { + margin-bottom: 0; } + .alert-sm .alert-icon-wrapper { + padding-top: 0; + height: 0.666667rem; } + .alert-sm .alert-icon { + margin-left: -0.166667rem; + margin-top: -0.166667rem; } + .alert-sm .alert-item > span, + .alert-sm .alert-text { + margin-right: 0.25rem; } + .alert-sm .close { + padding-right: 0; + -ms-flex: 0 0 1rem; + flex: 0 0 1rem; + height: 1rem; + line-height: 1rem; } + .alert-sm .close clr-icon { + margin-top: -0.208334rem; + margin-right: -0.041667rem; + height: 0.833333rem; + width: 0.833333rem; + line-height: calc(0.833333rem + 1px); } + +@media screen and (max-width: 768px) { + .alert .alert-item { + -ms-flex-wrap: wrap; + flex-wrap: wrap; } + .alert .alert-text { + margin-right: 0; + max-width: 90%; + width: 90%; + -ms-flex-preferred-size: 90%; + flex-basis: 90%; } + .alert .alert-actions { + -ms-flex: 1 0 100%; + flex: 1 0 100%; + padding-top: 0.125rem; + padding-left: 1rem; } + .alerts-pager { + margin-top: 0.125rem; } + .alert-app-level .alert-actions { + margin-left: 0; } } + +.alert-hidden { + display: none; } + +.card .alert { + margin: 0.25rem 0; } + +.modal .alert + .modal-header { + margin-top: 0.5rem; } + +.alerts.alert-info { + background: #004a70; } + +.alerts.alert-danger { + background: #a32100; } + +.alerts.alert-warning { + background: #9e4100; } + +.alerts.alert-success { + background: #1d5100; } + +.alerts-pager { + color: #fff; + float: left; + font-size: 0.541667rem; + letter-spacing: normal; + min-height: 1.5rem; + text-align: center; + width: 144px; } + +.alerts-pager-button { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + margin: 0; + padding: 0; + border: none; + border-radius: 0; + box-shadow: none; + background: none; + color: #fff; + cursor: pointer; } + +.alerts-pager-control { + display: -ms-flexbox; + display: flex; + margin-top: 0.25rem; + white-space: nowrap; } + +.alerts-page-down { + margin-left: 1rem; + width: 33.33%; } + +.alerts-page-up { + margin-right: 1rem; + width: 33.33%; } + +.alerts-pager-text { + width: 33.33%; } + +.card { + box-shadow: 0 0.125rem 0 0 #d7d7d7; + border-radius: 0.125rem; + border: 1px solid #d7d7d7; } + +.card.clickable:hover { + box-shadow: 0 0.125rem 0 0 #0094d2; + border: 1px solid #0094d2; + cursor: pointer; + text-decoration: none; + transform: translateY(-2px); + transition: border 0.2s ease, transform 0.2s ease; } + +.card .card-title, +.card .card-text, +.card .card-media-block, +.card .list, +.card .list-unstyled, .card-block .card-divider { + margin-top: 0; + margin-bottom: 0.5rem; } + .card .card-title:last-child, + .card .card-text:last-child, + .card .card-media-block:last-child, + .card .list:last-child, + .card .list-unstyled:last-child, .card-block .card-divider:last-child { + margin-bottom: 0; } + +.card-img > img, .card.card-img > img, +.card > .card-img:first-child:last-child > img { + display: block; + height: auto; + width: 100%; + max-width: 100%; } + +.card { + position: relative; + display: block; + background-color: #fff; + width: 100%; + margin-top: 1rem; } + .card .btn-link { + min-width: 0; + padding: 0; } + .card.clickable { + color: inherit; } + .card > .list, + .card > .list-unstyled { + padding: 0.5rem 0.75rem; } + .card .list-group-item { + font-size: clr-getTypePropertyValueForDomElement(card_text, font-size); + border-left-width: 0; + border-right-width: 0; + border-color: #eee; + padding: 0.5rem 0.75rem; } + .card .list-group-item:first-child { + border-top-color: transparent; } + @supports (-ms-ime-align: auto) { + .card .dropdown > .dropdown-toggle::after { + display: inline-block; + margin-top: -0.5rem; } } + +.card-header, +.card-block, +.card-footer { + padding: 0.5rem 0.75rem; } + +.card-header, +.card-title { + color: #000; + font-size: 0.75rem; + font-weight: 200; + letter-spacing: normal; } + +.card-text { + font-size: clr-getTypePropertyValueForDomElement(card_text, font-size); } + +.card-img:first-child > img { + border-radius: 0.125rem 0.125rem 0 0; } + +.card-img:last-child > img { + border-radius: 0 0 0.125rem 0.125rem; } + +.card.card-img > img, +.card > .card-img:first-child:last-child > img { + border-radius: 0.125rem; } + +.card-block .btn, +.card-block .btn.btn-link, +.card-block .card-link, +.card-footer .btn, +.card-footer .btn.btn-link, +.card-footer .card-link { + margin: 0 0.5rem 0 0; } + +.card-block .btn-group .btn, +.card-footer .btn-group .btn { + margin: 0; } + +.card-header, +.card-block { + border-bottom: 1px solid #eee; } + .card-header:last-child, + .card-block:last-child { + border-bottom: none; } + +.card-divider { + display: block; + border-bottom: 1px solid #eee; } + +.card-block .card-divider { + margin-left: -0.75rem; + margin-right: -0.75rem; + width: auto; } + +.card-header + .card-divider, +.card-block + .card-divider { + display: none; } + +.card-media-block { + display: -ms-flexbox; + display: flex; } + .card-media-block .card-media-image { + display: inline-block; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + height: 2.5rem; + width: 2.5rem; + max-height: 2.5rem; + max-width: 2.5rem; } + .card-media-block .card-media-description { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + margin: 0 0 0 0.5rem; } + .card-media-block .card-media-title { + display: inline-block; } + .card-media-block span, + .card-media-block .card-media-text { + display: inline-block; } + .card-media-block.wrap { + -ms-flex-direction: column; + flex-direction: column; } + .card-media-block.wrap .card-media-description { + margin: 0.25rem 0 0 0; } + +.card-block > .list, +.card-block > .list-unstyled { + padding: 0; } + +@media screen and (min-width: 576px) { + .card-columns { + -webkit-column-count: 3; + -moz-column-count: 3; + column-count: 3; + -webkit-column-gap: 0.5rem; + -moz-column-gap: 0.5rem; + column-gap: 0.5rem; + -webkit-column-break-inside: avoid; + page-break-inside: avoid; + break-inside: avoid; + -webkit-column-fill: balance; + -moz-column-fill: balance; + column-fill: balance; + -webkit-perspective: 1; } + .card-columns.card-columns-2 { + -webkit-column-count: 2; + -moz-column-count: 2; + column-count: 2; } + .card-columns.card-columns-4 { + -webkit-column-count: 4; + -moz-column-count: 4; + column-count: 4; } + .card-columns .card { + display: inline-block; + margin: 0.25rem; } + .card-columns .clickable { + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } } + +@supports (-ms-ime-align: auto) { + .card .checkbox.btn label, + .card .checkbox-inline.btn label, + .card .radio.btn label, + .card .radio-inline.btn label { + display: inline-block; } } + +pre, +pre[class*='language-'] { + margin: 0.5rem 0; } + +pre { + border: 1px solid #ccc; + max-height: 15rem; + border-radius: 0.125rem; + overflow: auto; } + +pre code { + white-space: pre; } + +:not(pre) > code[class*='language-'], +pre[class*='language-'], +pre, +code[class*='language-'] { + font-family: Consolas, Monaco, Courier, monospace !important; + line-height: 1rem; + padding: 0; } + +code.clr-code { + color: #c92100; + padding: 0; + background: transparent; } + +.dropdown-menu .dropdown-header, .dropdown-menu .btn, +.dropdown-menu .btn-secondary, +.dropdown-menu .btn-info, +.dropdown-menu .btn-outline, +.dropdown-menu .btn-outline-primary, +.dropdown-menu .btn-outline-secondary, +.dropdown-menu .btn-outline-warning, +.dropdown-menu .btn-outline-danger, +.dropdown-menu .btn-outline-success, +.dropdown-menu .btn-danger, +.dropdown-menu .btn-primary, +.dropdown-menu .btn-warning, +.dropdown-menu .btn-success, +.dropdown-menu .btn-link, +.dropdown-menu .dropdown-item { + overflow: hidden; + text-overflow: ellipsis; + text-align: left; } + +.dropdown { + position: relative; + display: inline-block; } + .dropdown .dropdown-toggle { + display: inline-block; + position: relative; + margin: 0; + white-space: nowrap; + cursor: pointer; } + .dropdown .dropdown-toggle > * { + margin: 0; } + .dropdown .dropdown-toggle clr-icon[shape^='caret'] { + position: absolute; + top: 50%; + transform: translateY(-50%); + color: inherit; + height: 0.416667rem; + width: 0.416667rem; } + .dropdown .dropdown-toggle.btn { + padding-right: 1rem; } + .dropdown .dropdown-toggle.btn clr-icon[shape^='caret'] { + right: 0.5rem; } + .dropdown .dropdown-toggle:not(.btn) { + padding: 0 0.5rem 0 0; + color: #000; } + .dropdown .dropdown-toggle:not(.btn) clr-icon[shape^='caret'] { + right: 0; } + .dropdown button.dropdown-toggle:not(.btn) { + background: transparent; + border: none; + cursor: pointer; + color: #000; } + +.dropdown-menu > * { + display: block; + white-space: nowrap; } + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + margin-top: 0.083333rem; + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + background: #fff; + padding: 0.5rem 0; + border: 1px solid #ccc; + box-shadow: 0 1px 0.125rem rgba(115, 115, 115, 0.25); + min-width: 5rem; + max-width: 15rem; + border-radius: 0.125rem; + visibility: hidden; + z-index: 1000; } + .dropdown-menu .dropdown-header { + font-size: 0.5rem; + font-weight: 600; + letter-spacing: normal; + padding: 0 0.5rem; + line-height: 0.75rem; + margin: 0; + color: #313131; } + .dropdown-menu .btn, + .dropdown-menu .btn-secondary, + .dropdown-menu .btn-info, + .dropdown-menu .btn-outline, + .dropdown-menu .btn-outline-primary, + .dropdown-menu .btn-outline-secondary, + .dropdown-menu .btn-outline-warning, + .dropdown-menu .btn-outline-danger, + .dropdown-menu .btn-outline-success, + .dropdown-menu .btn-danger, + .dropdown-menu .btn-primary, + .dropdown-menu .btn-warning, + .dropdown-menu .btn-success, + .dropdown-menu .btn-link, + .dropdown-menu .dropdown-item { + font-size: 0.583333rem; + letter-spacing: normal; + font-weight: 400; + background: transparent; + border: 0; + color: #565656; + cursor: pointer; + display: block; + margin: 0; + padding: 0.041667rem 1rem 0; + width: 100%; + text-transform: none; } + .dropdown-menu .btn:hover, .dropdown-menu .btn:focus, + .dropdown-menu .btn-secondary:hover, + .dropdown-menu .btn-secondary:focus, + .dropdown-menu .btn-info:hover, + .dropdown-menu .btn-info:focus, + .dropdown-menu .btn-outline:hover, + .dropdown-menu .btn-outline:focus, + .dropdown-menu .btn-outline-primary:hover, + .dropdown-menu .btn-outline-primary:focus, + .dropdown-menu .btn-outline-secondary:hover, + .dropdown-menu .btn-outline-secondary:focus, + .dropdown-menu .btn-outline-warning:hover, + .dropdown-menu .btn-outline-warning:focus, + .dropdown-menu .btn-outline-danger:hover, + .dropdown-menu .btn-outline-danger:focus, + .dropdown-menu .btn-outline-success:hover, + .dropdown-menu .btn-outline-success:focus, + .dropdown-menu .btn-danger:hover, + .dropdown-menu .btn-danger:focus, + .dropdown-menu .btn-primary:hover, + .dropdown-menu .btn-primary:focus, + .dropdown-menu .btn-warning:hover, + .dropdown-menu .btn-warning:focus, + .dropdown-menu .btn-success:hover, + .dropdown-menu .btn-success:focus, + .dropdown-menu .btn-link:hover, + .dropdown-menu .btn-link:focus, + .dropdown-menu .dropdown-item:hover, + .dropdown-menu .dropdown-item:focus { + background-color: #eee; + color: #565656; + text-decoration: none; } + .dropdown-menu .btn.expandable, + .dropdown-menu .btn-secondary.expandable, + .dropdown-menu .btn-info.expandable, + .dropdown-menu .btn-outline.expandable, + .dropdown-menu .btn-outline-primary.expandable, + .dropdown-menu .btn-outline-secondary.expandable, + .dropdown-menu .btn-outline-warning.expandable, + .dropdown-menu .btn-outline-danger.expandable, + .dropdown-menu .btn-outline-success.expandable, + .dropdown-menu .btn-danger.expandable, + .dropdown-menu .btn-primary.expandable, + .dropdown-menu .btn-warning.expandable, + .dropdown-menu .btn-success.expandable, + .dropdown-menu .btn-link.expandable, + .dropdown-menu .dropdown-item.expandable { + margin-right: 1rem; + padding-right: 0.5rem; } + .dropdown-menu .btn.expandable:before, + .dropdown-menu .btn-secondary.expandable:before, + .dropdown-menu .btn-info.expandable:before, + .dropdown-menu .btn-outline.expandable:before, + .dropdown-menu .btn-outline-primary.expandable:before, + .dropdown-menu .btn-outline-secondary.expandable:before, + .dropdown-menu .btn-outline-warning.expandable:before, + .dropdown-menu .btn-outline-danger.expandable:before, + .dropdown-menu .btn-outline-success.expandable:before, + .dropdown-menu .btn-danger.expandable:before, + .dropdown-menu .btn-primary.expandable:before, + .dropdown-menu .btn-warning.expandable:before, + .dropdown-menu .btn-success.expandable:before, + .dropdown-menu .btn-link.expandable:before, + .dropdown-menu .dropdown-item.expandable:before { + content: ''; + float: right; + height: 0.5rem; + width: 0.5rem; + transform: rotate(-90deg); + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2012%2012%22%3E%0A%20%20%20%20%3Cdefs%3E%0A%20%20%20%20%20%20%20%20%3Cstyle%3E.cls-1%7Bfill%3A%239a9a9a%3B%7D%3C%2Fstyle%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%20%20%20%20%3Ctitle%3ECaret%3C%2Ftitle%3E%0A%20%20%20%20%3Cpath%20class%3D%22cls-1%22%20d%3D%22M6%2C9L1.2%2C4.2a0.68%2C0.68%2C0%2C0%2C1%2C1-1L6%2C7.08%2C9.84%2C3.24a0.68%2C0.68%2C0%2C1%2C1%2C1%2C1Z%22%2F%3E%0A%3C%2Fsvg%3E%0A"); + background-repeat: no-repeat; + background-size: contain; + vertical-align: middle; + margin-top: 0.375rem; } + .dropdown-menu .btn.active, + .dropdown-menu .btn-secondary.active, + .dropdown-menu .btn-info.active, + .dropdown-menu .btn-outline.active, + .dropdown-menu .btn-outline-primary.active, + .dropdown-menu .btn-outline-secondary.active, + .dropdown-menu .btn-outline-warning.active, + .dropdown-menu .btn-outline-danger.active, + .dropdown-menu .btn-outline-success.active, + .dropdown-menu .btn-danger.active, + .dropdown-menu .btn-primary.active, + .dropdown-menu .btn-warning.active, + .dropdown-menu .btn-success.active, + .dropdown-menu .btn-link.active, + .dropdown-menu .dropdown-item.active { + background: #d9e4ea; + color: #000; } + .dropdown-menu .btn:active, + .dropdown-menu .btn-secondary:active, + .dropdown-menu .btn-info:active, + .dropdown-menu .btn-outline:active, + .dropdown-menu .btn-outline-primary:active, + .dropdown-menu .btn-outline-secondary:active, + .dropdown-menu .btn-outline-warning:active, + .dropdown-menu .btn-outline-danger:active, + .dropdown-menu .btn-outline-success:active, + .dropdown-menu .btn-danger:active, + .dropdown-menu .btn-primary:active, + .dropdown-menu .btn-warning:active, + .dropdown-menu .btn-success:active, + .dropdown-menu .btn-link:active, + .dropdown-menu .dropdown-item:active { + box-shadow: none; } + .dropdown-menu .btn:focus, + .dropdown-menu .btn-secondary:focus, + .dropdown-menu .btn-info:focus, + .dropdown-menu .btn-outline:focus, + .dropdown-menu .btn-outline-primary:focus, + .dropdown-menu .btn-outline-secondary:focus, + .dropdown-menu .btn-outline-warning:focus, + .dropdown-menu .btn-outline-danger:focus, + .dropdown-menu .btn-outline-success:focus, + .dropdown-menu .btn-danger:focus, + .dropdown-menu .btn-primary:focus, + .dropdown-menu .btn-warning:focus, + .dropdown-menu .btn-success:focus, + .dropdown-menu .btn-link:focus, + .dropdown-menu .dropdown-item:focus { + outline: 0; } + .dropdown-menu .btn.disabled, .dropdown-menu .btn:disabled, + .dropdown-menu .btn-secondary.disabled, + .dropdown-menu .btn-secondary:disabled, + .dropdown-menu .btn-info.disabled, + .dropdown-menu .btn-info:disabled, + .dropdown-menu .btn-outline.disabled, + .dropdown-menu .btn-outline:disabled, + .dropdown-menu .btn-outline-primary.disabled, + .dropdown-menu .btn-outline-primary:disabled, + .dropdown-menu .btn-outline-secondary.disabled, + .dropdown-menu .btn-outline-secondary:disabled, + .dropdown-menu .btn-outline-warning.disabled, + .dropdown-menu .btn-outline-warning:disabled, + .dropdown-menu .btn-outline-danger.disabled, + .dropdown-menu .btn-outline-danger:disabled, + .dropdown-menu .btn-outline-success.disabled, + .dropdown-menu .btn-outline-success:disabled, + .dropdown-menu .btn-danger.disabled, + .dropdown-menu .btn-danger:disabled, + .dropdown-menu .btn-primary.disabled, + .dropdown-menu .btn-primary:disabled, + .dropdown-menu .btn-warning.disabled, + .dropdown-menu .btn-warning:disabled, + .dropdown-menu .btn-success.disabled, + .dropdown-menu .btn-success:disabled, + .dropdown-menu .btn-link.disabled, + .dropdown-menu .btn-link:disabled, + .dropdown-menu .dropdown-item.disabled, + .dropdown-menu .dropdown-item:disabled { + cursor: not-allowed; + opacity: 0.4; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .dropdown-menu .btn.disabled:hover, .dropdown-menu .btn:disabled:hover, + .dropdown-menu .btn-secondary.disabled:hover, + .dropdown-menu .btn-secondary:disabled:hover, + .dropdown-menu .btn-info.disabled:hover, + .dropdown-menu .btn-info:disabled:hover, + .dropdown-menu .btn-outline.disabled:hover, + .dropdown-menu .btn-outline:disabled:hover, + .dropdown-menu .btn-outline-primary.disabled:hover, + .dropdown-menu .btn-outline-primary:disabled:hover, + .dropdown-menu .btn-outline-secondary.disabled:hover, + .dropdown-menu .btn-outline-secondary:disabled:hover, + .dropdown-menu .btn-outline-warning.disabled:hover, + .dropdown-menu .btn-outline-warning:disabled:hover, + .dropdown-menu .btn-outline-danger.disabled:hover, + .dropdown-menu .btn-outline-danger:disabled:hover, + .dropdown-menu .btn-outline-success.disabled:hover, + .dropdown-menu .btn-outline-success:disabled:hover, + .dropdown-menu .btn-danger.disabled:hover, + .dropdown-menu .btn-danger:disabled:hover, + .dropdown-menu .btn-primary.disabled:hover, + .dropdown-menu .btn-primary:disabled:hover, + .dropdown-menu .btn-warning.disabled:hover, + .dropdown-menu .btn-warning:disabled:hover, + .dropdown-menu .btn-success.disabled:hover, + .dropdown-menu .btn-success:disabled:hover, + .dropdown-menu .btn-link.disabled:hover, + .dropdown-menu .btn-link:disabled:hover, + .dropdown-menu .dropdown-item.disabled:hover, + .dropdown-menu .dropdown-item:disabled:hover { + background: none; } + .dropdown-menu .btn.disabled:active, .dropdown-menu .btn.disabled:focus, .dropdown-menu .btn:disabled:active, .dropdown-menu .btn:disabled:focus, + .dropdown-menu .btn-secondary.disabled:active, + .dropdown-menu .btn-secondary.disabled:focus, + .dropdown-menu .btn-secondary:disabled:active, + .dropdown-menu .btn-secondary:disabled:focus, + .dropdown-menu .btn-info.disabled:active, + .dropdown-menu .btn-info.disabled:focus, + .dropdown-menu .btn-info:disabled:active, + .dropdown-menu .btn-info:disabled:focus, + .dropdown-menu .btn-outline.disabled:active, + .dropdown-menu .btn-outline.disabled:focus, + .dropdown-menu .btn-outline:disabled:active, + .dropdown-menu .btn-outline:disabled:focus, + .dropdown-menu .btn-outline-primary.disabled:active, + .dropdown-menu .btn-outline-primary.disabled:focus, + .dropdown-menu .btn-outline-primary:disabled:active, + .dropdown-menu .btn-outline-primary:disabled:focus, + .dropdown-menu .btn-outline-secondary.disabled:active, + .dropdown-menu .btn-outline-secondary.disabled:focus, + .dropdown-menu .btn-outline-secondary:disabled:active, + .dropdown-menu .btn-outline-secondary:disabled:focus, + .dropdown-menu .btn-outline-warning.disabled:active, + .dropdown-menu .btn-outline-warning.disabled:focus, + .dropdown-menu .btn-outline-warning:disabled:active, + .dropdown-menu .btn-outline-warning:disabled:focus, + .dropdown-menu .btn-outline-danger.disabled:active, + .dropdown-menu .btn-outline-danger.disabled:focus, + .dropdown-menu .btn-outline-danger:disabled:active, + .dropdown-menu .btn-outline-danger:disabled:focus, + .dropdown-menu .btn-outline-success.disabled:active, + .dropdown-menu .btn-outline-success.disabled:focus, + .dropdown-menu .btn-outline-success:disabled:active, + .dropdown-menu .btn-outline-success:disabled:focus, + .dropdown-menu .btn-danger.disabled:active, + .dropdown-menu .btn-danger.disabled:focus, + .dropdown-menu .btn-danger:disabled:active, + .dropdown-menu .btn-danger:disabled:focus, + .dropdown-menu .btn-primary.disabled:active, + .dropdown-menu .btn-primary.disabled:focus, + .dropdown-menu .btn-primary:disabled:active, + .dropdown-menu .btn-primary:disabled:focus, + .dropdown-menu .btn-warning.disabled:active, + .dropdown-menu .btn-warning.disabled:focus, + .dropdown-menu .btn-warning:disabled:active, + .dropdown-menu .btn-warning:disabled:focus, + .dropdown-menu .btn-success.disabled:active, + .dropdown-menu .btn-success.disabled:focus, + .dropdown-menu .btn-success:disabled:active, + .dropdown-menu .btn-success:disabled:focus, + .dropdown-menu .btn-link.disabled:active, + .dropdown-menu .btn-link.disabled:focus, + .dropdown-menu .btn-link:disabled:active, + .dropdown-menu .btn-link:disabled:focus, + .dropdown-menu .dropdown-item.disabled:active, + .dropdown-menu .dropdown-item.disabled:focus, + .dropdown-menu .dropdown-item:disabled:active, + .dropdown-menu .dropdown-item:disabled:focus { + background: none; + box-shadow: none; } + .dropdown-menu .btn, + .dropdown-menu .dropdown-item { + height: 1.25rem; + line-height: 1.25rem; } + @media screen and (max-width: 576px) { + .dropdown-menu .btn, + .dropdown-menu .dropdown-item { + height: 1.5rem; + line-height: 1.5rem; } + .dropdown-menu .btn.expandable::before, + .dropdown-menu .dropdown-item.expandable::before { + margin-top: 0.5rem; } } + .dropdown-menu .dropdown-divider { + border-bottom: 1px solid #eee; + margin: 0.25rem 0; } + +.btn-group-overflow.open > .dropdown-menu, +.btn-group-overflow.open > .dropdown-menu-wrapper > .dropdown-menu, +.tabs-overflow.open > .dropdown-menu, +.tabs-overflow.open > .dropdown-menu-wrapper > .dropdown-menu, +.dropdown.open > .dropdown-menu, +.dropdown.open > .dropdown-menu-wrapper > .dropdown-menu { + visibility: visible; } + +.btn-group-overflow.bottom-left > .dropdown-menu, +.btn-group-overflow.bottom-right > .dropdown-menu, +.tabs-overflow.bottom-left > .dropdown-menu, +.tabs-overflow.bottom-right > .dropdown-menu, +.dropdown.bottom-left > .dropdown-menu, +.dropdown.bottom-right > .dropdown-menu { + top: 100%; + bottom: auto; + margin: 0.083333rem 0 0 0; } + +.btn-group-overflow.bottom-left > .dropdown-menu, +.tabs-overflow.bottom-left > .dropdown-menu, +.dropdown.bottom-left > .dropdown-menu { + left: 0; + right: auto; } + +.btn-group-overflow.bottom-right > .dropdown-menu, +.tabs-overflow.bottom-right > .dropdown-menu, +.dropdown.bottom-right > .dropdown-menu { + right: 0; + left: auto; } + +.btn-group-overflow.top-left > .dropdown-menu, +.btn-group-overflow.top-right > .dropdown-menu, +.tabs-overflow.top-left > .dropdown-menu, +.tabs-overflow.top-right > .dropdown-menu, +.dropdown.top-left > .dropdown-menu, +.dropdown.top-right > .dropdown-menu { + top: auto; + bottom: 100%; + margin: 0 0 0.083333rem 0; } + +.btn-group-overflow.top-left > .dropdown-menu, +.tabs-overflow.top-left > .dropdown-menu, +.dropdown.top-left > .dropdown-menu { + left: 0; + right: auto; } + +.btn-group-overflow.top-right > .dropdown-menu, +.tabs-overflow.top-right > .dropdown-menu, +.dropdown.top-right > .dropdown-menu { + right: 0; + left: auto; } + +.btn-group-overflow.left-top > .dropdown-menu, +.btn-group-overflow.left-bottom > .dropdown-menu, +.tabs-overflow.left-top > .dropdown-menu, +.tabs-overflow.left-bottom > .dropdown-menu, +.dropdown.left-top > .dropdown-menu, +.dropdown.left-bottom > .dropdown-menu { + right: 100%; + left: auto; + margin: 0 0.083333rem 0 0; } + +.btn-group-overflow.left-bottom > .dropdown-menu, +.tabs-overflow.left-bottom > .dropdown-menu, +.dropdown.left-bottom > .dropdown-menu { + top: 0; + bottom: auto; } + +.btn-group-overflow.left-top > .dropdown-menu, +.tabs-overflow.left-top > .dropdown-menu, +.dropdown.left-top > .dropdown-menu { + bottom: 0; + top: auto; } + +.btn-group-overflow.right-top > .dropdown-menu, +.btn-group-overflow.right-bottom > .dropdown-menu, +.tabs-overflow.right-top > .dropdown-menu, +.tabs-overflow.right-bottom > .dropdown-menu, +.dropdown.right-top > .dropdown-menu, +.dropdown.right-bottom > .dropdown-menu { + left: 100%; + right: auto; + margin: 0 0 0 0.083333rem; } + +.btn-group-overflow.right-bottom > .dropdown-menu, +.tabs-overflow.right-bottom > .dropdown-menu, +.dropdown.right-bottom > .dropdown-menu { + top: 0; + bottom: auto; } + +.btn-group-overflow.right-top > .dropdown-menu, +.tabs-overflow.right-top > .dropdown-menu, +.dropdown.right-top > .dropdown-menu { + bottom: 0; + top: auto; } + +.btn-group-overflow .dropdown .dropdown-menu, +.tabs-overflow .dropdown .dropdown-menu, +.dropdown .dropdown .dropdown-menu { + border-color: #9a9a9a; + position: absolute; } + +.btn-group-overflow .dropdown.left-top > .dropdown-menu, +.btn-group-overflow .dropdown.left-top > .dropdown-menu-wrapper > .dropdown-menu, +.tabs-overflow .dropdown.left-top > .dropdown-menu, +.tabs-overflow .dropdown.left-top > .dropdown-menu-wrapper > .dropdown-menu, +.dropdown .dropdown.left-top > .dropdown-menu, +.dropdown .dropdown.left-top > .dropdown-menu-wrapper > .dropdown-menu { + top: 0; + bottom: auto; + left: auto; + right: 100%; + margin-top: -0.791667rem; + margin-right: -0.166667rem; } + +.btn-group-overflow .dropdown.right-top > .dropdown-menu, +.btn-group-overflow .dropdown.right-top > .dropdown-menu-wrapper > .dropdown-menu, +.tabs-overflow .dropdown.right-top > .dropdown-menu, +.tabs-overflow .dropdown.right-top > .dropdown-menu-wrapper > .dropdown-menu, +.dropdown .dropdown.right-top > .dropdown-menu, +.dropdown .dropdown.right-top > .dropdown-menu-wrapper > .dropdown-menu { + top: 0; + bottom: auto; + left: 100%; + right: auto; + margin-top: -0.791667rem; + margin-left: -0.166667rem; } + +.btn-group-overflow .dropdown.left-bottom > .dropdown-menu, +.btn-group-overflow .dropdown.left-bottom > .dropdown-menu-wrapper > .dropdown-menu, +.tabs-overflow .dropdown.left-bottom > .dropdown-menu, +.tabs-overflow .dropdown.left-bottom > .dropdown-menu-wrapper > .dropdown-menu, +.dropdown .dropdown.left-bottom > .dropdown-menu, +.dropdown .dropdown.left-bottom > .dropdown-menu-wrapper > .dropdown-menu { + top: auto; + bottom: 0; + left: auto; + right: 100%; + margin-bottom: -0.791667rem; + margin-right: -0.166667rem; } + +.btn-group-overflow .dropdown.right-bottom > .dropdown-menu, +.btn-group-overflow .dropdown.right-bottom > .dropdown-menu-wrapper > .dropdown-menu, +.tabs-overflow .dropdown.right-bottom > .dropdown-menu, +.tabs-overflow .dropdown.right-bottom > .dropdown-menu-wrapper > .dropdown-menu, +.dropdown .dropdown.right-bottom > .dropdown-menu, +.dropdown .dropdown.right-bottom > .dropdown-menu-wrapper > .dropdown-menu { + top: auto; + bottom: 0; + left: 100%; + right: auto; + margin-bottom: -0.791667rem; + margin-left: -0.166667rem; } + +.label, +a.label { + font-size: 0.458333rem; + font-weight: 400; + letter-spacing: 0.03em; + line-height: 0.458333rem; + display: -ms-inline-flexbox; + display: inline-flex; + -ms-flex-pack: center; + justify-content: center; + -ms-flex-align: center; + align-items: center; + padding: 0 0.5rem 1px; + border-radius: 0.5rem; + border: 1px solid #737373; + height: 0.875rem; + margin: 0 0.25rem 0 0; + white-space: nowrap; + color: #565656; } + .label:visited, + a.label:visited { + color: #565656; } + .label:focus, .label:hover, .label:active, + a.label:focus, + a.label:hover, + a.label:active { + text-decoration: none; } + .label.clickable:hover, .label.clickable:active, + a.label.clickable:hover, + a.label.clickable:active { + background: #eee; } + .label.clickable:active, + a.label.clickable:active { + box-shadow: 0 1px 0 0 #737373 inset; + transform: translateY(0.5px); } + .label.label-gray, .label.label-1, + a.label.label-gray, + a.label.label-1 { + border: 1px solid #737373; } + .label.clickable.label-gray:hover, .label.clickable.label-gray:active, + a.label.clickable.label-gray:hover, + a.label.clickable.label-gray:active { + text-decoration: none; + background: #eee; } + .label.clickable.label-gray:active, + a.label.clickable.label-gray:active { + box-shadow: 0 1px 0 0 #737373 inset; + transform: translateY(0.5px); } + .label.label-gray > .badge, + a.label.label-gray > .badge { + background: #737373; + color: #fff; } + .label.label-purple, .label.label-2, + a.label.label-purple, + a.label.label-2 { + border: 1px solid #9460b8; } + .label.clickable.label-purple:hover, .label.clickable.label-purple:active, + a.label.clickable.label-purple:hover, + a.label.clickable.label-purple:active { + text-decoration: none; + background: #eee; } + .label.clickable.label-purple:active, + a.label.clickable.label-purple:active { + box-shadow: 0 1px 0 0 #9460b8 inset; + transform: translateY(0.5px); } + .label.label-purple > .badge, + a.label.label-purple > .badge { + background: #9460b8; + color: #fff; } + .label.label-blue, .label.label-3, + a.label.label-blue, + a.label.label-3 { + border: 1px solid #004a70; } + .label.clickable.label-blue:hover, .label.clickable.label-blue:active, + a.label.clickable.label-blue:hover, + a.label.clickable.label-blue:active { + text-decoration: none; + background: #eee; } + .label.clickable.label-blue:active, + a.label.clickable.label-blue:active { + box-shadow: 0 1px 0 0 #004a70 inset; + transform: translateY(0.5px); } + .label.label-blue > .badge, + a.label.label-blue > .badge { + background: #004a70; + color: #fff; } + .label.label-orange, .label.label-4, + a.label.label-orange, + a.label.label-4 { + border: 1px solid #eb8d00; } + .label.clickable.label-orange:hover, .label.clickable.label-orange:active, + a.label.clickable.label-orange:hover, + a.label.clickable.label-orange:active { + text-decoration: none; + background: #eee; } + .label.clickable.label-orange:active, + a.label.clickable.label-orange:active { + box-shadow: 0 1px 0 0 #eb8d00 inset; + transform: translateY(0.5px); } + .label.label-orange > .badge, + a.label.label-orange > .badge { + background: #eb8d00; + color: #000; } + .label.label-light-blue, .label.label-5, + a.label.label-light-blue, + a.label.label-5 { + border: 1px solid #89cbdf; } + .label.clickable.label-light-blue:hover, .label.clickable.label-light-blue:active, + a.label.clickable.label-light-blue:hover, + a.label.clickable.label-light-blue:active { + text-decoration: none; + background: #eee; } + .label.clickable.label-light-blue:active, + a.label.clickable.label-light-blue:active { + box-shadow: 0 1px 0 0 #89cbdf inset; + transform: translateY(0.5px); } + .label.label-light-blue > .badge, + a.label.label-light-blue > .badge { + background: #89cbdf; + color: #000; } + .label.label-info, + a.label.label-info { + background: #e1f1f6; + color: #004a70; + border: 1px solid #49afd9; } + .label.label-success, + a.label.label-success { + background: #dff0d0; + color: #266900; + border: 1px solid #60b515; } + .label.label-warning, + a.label.label-warning { + background: #feecb5; + color: #313131; + border: 1px solid #ffdc0b; } + .label.label-danger, + a.label.label-danger { + background: #f5dbd9; + color: #a32100; + border: 1px solid #ebafa6; } + .label > .badge, + a.label > .badge { + margin: 0 -0.375rem 0 0.25rem; } + +.badge { + display: -ms-inline-flexbox; + display: inline-flex; + vertical-align: middle; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + min-width: 0.625rem; + background: #737373; + height: 0.625rem; + line-height: normal; + border-radius: 0.416667rem; + font-size: 0.416667rem; + padding: 0 0.166667rem; + margin-right: 0.25rem; + white-space: nowrap; + text-align: center; + color: #fff; } + .badge:visited { + color: #fff; } + .badge.badge-gray, .badge.badge-1 { + background: #737373; + color: #fff; } + .badge.badge-purple, .badge.badge-2 { + background: #9460b8; + color: #fff; } + .badge.badge-blue, .badge.badge-3 { + background: #004a70; + color: #fff; } + .badge.badge-orange, .badge.badge-4 { + background: #eb8d00; + color: #000; } + .badge.badge-light-blue, .badge.badge-5 { + background: #89cbdf; + color: #000; } + .badge.badge-info { + background: #007cbb; + color: #fff; } + .badge.badge-success { + background: #318700; + color: #fff; } + .badge.badge-danger { + background: #c92100; + color: #fff; } + .badge.badge-warning { + background: #ffdc0b; + color: #000; } + +@-moz-document url-prefix() { + .label, + a.label { + vertical-align: bottom; } } + +_:-ms-input-placeholder .badge, +:root .badge { + padding: 0.083333rem 0.125rem 0; } + +@supports (-ms-ime-align: auto) { + .badge { + padding: 0.083333rem 0.125rem 0; } } + +.row.force-fit { + margin-left: 0; + margin-right: 0; } + +.clr-row { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-right: -0.5rem; + margin-left: -0.5rem; } + +.clr-no-gutters { + margin-right: 0; + margin-left: 0; } + .clr-no-gutters > .clr-col, + .clr-no-gutters > [class*='clr-col-'] { + padding-right: 0; + padding-left: 0; } + +.clr-col-1, .clr-col-2, .clr-col-3, .clr-col-4, .clr-col-5, .clr-col-6, .clr-col-7, .clr-col-8, .clr-col-9, .clr-col-10, .clr-col-11, .clr-col-12, .clr-col, +.clr-col-auto, .clr-col-sm-1, .clr-col-sm-2, .clr-col-sm-3, .clr-col-sm-4, .clr-col-sm-5, .clr-col-sm-6, .clr-col-sm-7, .clr-col-sm-8, .clr-col-sm-9, .clr-col-sm-10, .clr-col-sm-11, .clr-col-sm-12, .clr-col-sm, +.clr-col-sm-auto, .clr-col-md-1, .clr-col-md-2, .clr-col-md-3, .clr-col-md-4, .clr-col-md-5, .clr-col-md-6, .clr-col-md-7, .clr-col-md-8, .clr-col-md-9, .clr-col-md-10, .clr-col-md-11, .clr-col-md-12, .clr-col-md, +.clr-col-md-auto, .clr-col-lg-1, .clr-col-lg-2, .clr-col-lg-3, .clr-col-lg-4, .clr-col-lg-5, .clr-col-lg-6, .clr-col-lg-7, .clr-col-lg-8, .clr-col-lg-9, .clr-col-lg-10, .clr-col-lg-11, .clr-col-lg-12, .clr-col-lg, +.clr-col-lg-auto, .clr-col-xl-1, .clr-col-xl-2, .clr-col-xl-3, .clr-col-xl-4, .clr-col-xl-5, .clr-col-xl-6, .clr-col-xl-7, .clr-col-xl-8, .clr-col-xl-9, .clr-col-xl-10, .clr-col-xl-11, .clr-col-xl-12, .clr-col-xl, +.clr-col-xl-auto { + width: 100%; + min-height: 1px; + padding-right: 0.5rem; + padding-left: 0.5rem; } + +.clr-col { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; } + +.clr-col-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: none; } + +.clr-col-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; } + +.clr-col-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; } + +.clr-col-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; } + +.clr-col-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; } + +.clr-col-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; } + +.clr-col-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; } + +.clr-col-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; } + +.clr-col-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; } + +.clr-col-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; } + +.clr-col-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; } + +.clr-col-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; } + +.clr-col-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; } + +.clr-order-first { + -ms-flex-order: -1; + order: -1; } + +.clr-order-last { + -ms-flex-order: 13; + order: 13; } + +.clr-order-0 { + -ms-flex-order: 0; + order: 0; } + +.clr-order-1 { + -ms-flex-order: 1; + order: 1; } + +.clr-order-2 { + -ms-flex-order: 2; + order: 2; } + +.clr-order-3 { + -ms-flex-order: 3; + order: 3; } + +.clr-order-4 { + -ms-flex-order: 4; + order: 4; } + +.clr-order-5 { + -ms-flex-order: 5; + order: 5; } + +.clr-order-6 { + -ms-flex-order: 6; + order: 6; } + +.clr-order-7 { + -ms-flex-order: 7; + order: 7; } + +.clr-order-8 { + -ms-flex-order: 8; + order: 8; } + +.clr-order-9 { + -ms-flex-order: 9; + order: 9; } + +.clr-order-10 { + -ms-flex-order: 10; + order: 10; } + +.clr-order-11 { + -ms-flex-order: 11; + order: 11; } + +.clr-order-12 { + -ms-flex-order: 12; + order: 12; } + +.clr-offset-1 { + margin-left: 8.333333%; } + +.clr-offset-2 { + margin-left: 16.666667%; } + +.clr-offset-3 { + margin-left: 25%; } + +.clr-offset-4 { + margin-left: 33.333333%; } + +.clr-offset-5 { + margin-left: 41.666667%; } + +.clr-offset-6 { + margin-left: 50%; } + +.clr-offset-7 { + margin-left: 58.333333%; } + +.clr-offset-8 { + margin-left: 66.666667%; } + +.clr-offset-9 { + margin-left: 75%; } + +.clr-offset-10 { + margin-left: 83.333333%; } + +.clr-offset-11 { + margin-left: 91.666667%; } + +@media (min-width: 576px) { + .clr-col-sm { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; } + .clr-col-sm-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: none; } + .clr-col-sm-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; } + .clr-col-sm-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; } + .clr-col-sm-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; } + .clr-col-sm-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; } + .clr-col-sm-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; } + .clr-col-sm-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; } + .clr-col-sm-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; } + .clr-col-sm-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; } + .clr-col-sm-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; } + .clr-col-sm-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; } + .clr-col-sm-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; } + .clr-col-sm-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; } + .clr-order-sm-first { + -ms-flex-order: -1; + order: -1; } + .clr-order-sm-last { + -ms-flex-order: 13; + order: 13; } + .clr-order-sm-0 { + -ms-flex-order: 0; + order: 0; } + .clr-order-sm-1 { + -ms-flex-order: 1; + order: 1; } + .clr-order-sm-2 { + -ms-flex-order: 2; + order: 2; } + .clr-order-sm-3 { + -ms-flex-order: 3; + order: 3; } + .clr-order-sm-4 { + -ms-flex-order: 4; + order: 4; } + .clr-order-sm-5 { + -ms-flex-order: 5; + order: 5; } + .clr-order-sm-6 { + -ms-flex-order: 6; + order: 6; } + .clr-order-sm-7 { + -ms-flex-order: 7; + order: 7; } + .clr-order-sm-8 { + -ms-flex-order: 8; + order: 8; } + .clr-order-sm-9 { + -ms-flex-order: 9; + order: 9; } + .clr-order-sm-10 { + -ms-flex-order: 10; + order: 10; } + .clr-order-sm-11 { + -ms-flex-order: 11; + order: 11; } + .clr-order-sm-12 { + -ms-flex-order: 12; + order: 12; } + .clr-offset-sm-0 { + margin-left: 0; } + .clr-offset-sm-1 { + margin-left: 8.333333%; } + .clr-offset-sm-2 { + margin-left: 16.666667%; } + .clr-offset-sm-3 { + margin-left: 25%; } + .clr-offset-sm-4 { + margin-left: 33.333333%; } + .clr-offset-sm-5 { + margin-left: 41.666667%; } + .clr-offset-sm-6 { + margin-left: 50%; } + .clr-offset-sm-7 { + margin-left: 58.333333%; } + .clr-offset-sm-8 { + margin-left: 66.666667%; } + .clr-offset-sm-9 { + margin-left: 75%; } + .clr-offset-sm-10 { + margin-left: 83.333333%; } + .clr-offset-sm-11 { + margin-left: 91.666667%; } } + +@media (min-width: 768px) { + .clr-col-md { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; } + .clr-col-md-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: none; } + .clr-col-md-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; } + .clr-col-md-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; } + .clr-col-md-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; } + .clr-col-md-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; } + .clr-col-md-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; } + .clr-col-md-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; } + .clr-col-md-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; } + .clr-col-md-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; } + .clr-col-md-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; } + .clr-col-md-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; } + .clr-col-md-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; } + .clr-col-md-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; } + .clr-order-md-first { + -ms-flex-order: -1; + order: -1; } + .clr-order-md-last { + -ms-flex-order: 13; + order: 13; } + .clr-order-md-0 { + -ms-flex-order: 0; + order: 0; } + .clr-order-md-1 { + -ms-flex-order: 1; + order: 1; } + .clr-order-md-2 { + -ms-flex-order: 2; + order: 2; } + .clr-order-md-3 { + -ms-flex-order: 3; + order: 3; } + .clr-order-md-4 { + -ms-flex-order: 4; + order: 4; } + .clr-order-md-5 { + -ms-flex-order: 5; + order: 5; } + .clr-order-md-6 { + -ms-flex-order: 6; + order: 6; } + .clr-order-md-7 { + -ms-flex-order: 7; + order: 7; } + .clr-order-md-8 { + -ms-flex-order: 8; + order: 8; } + .clr-order-md-9 { + -ms-flex-order: 9; + order: 9; } + .clr-order-md-10 { + -ms-flex-order: 10; + order: 10; } + .clr-order-md-11 { + -ms-flex-order: 11; + order: 11; } + .clr-order-md-12 { + -ms-flex-order: 12; + order: 12; } + .clr-offset-md-0 { + margin-left: 0; } + .clr-offset-md-1 { + margin-left: 8.333333%; } + .clr-offset-md-2 { + margin-left: 16.666667%; } + .clr-offset-md-3 { + margin-left: 25%; } + .clr-offset-md-4 { + margin-left: 33.333333%; } + .clr-offset-md-5 { + margin-left: 41.666667%; } + .clr-offset-md-6 { + margin-left: 50%; } + .clr-offset-md-7 { + margin-left: 58.333333%; } + .clr-offset-md-8 { + margin-left: 66.666667%; } + .clr-offset-md-9 { + margin-left: 75%; } + .clr-offset-md-10 { + margin-left: 83.333333%; } + .clr-offset-md-11 { + margin-left: 91.666667%; } } + +@media (min-width: 992px) { + .clr-col-lg { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; } + .clr-col-lg-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: none; } + .clr-col-lg-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; } + .clr-col-lg-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; } + .clr-col-lg-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; } + .clr-col-lg-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; } + .clr-col-lg-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; } + .clr-col-lg-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; } + .clr-col-lg-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; } + .clr-col-lg-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; } + .clr-col-lg-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; } + .clr-col-lg-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; } + .clr-col-lg-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; } + .clr-col-lg-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; } + .clr-order-lg-first { + -ms-flex-order: -1; + order: -1; } + .clr-order-lg-last { + -ms-flex-order: 13; + order: 13; } + .clr-order-lg-0 { + -ms-flex-order: 0; + order: 0; } + .clr-order-lg-1 { + -ms-flex-order: 1; + order: 1; } + .clr-order-lg-2 { + -ms-flex-order: 2; + order: 2; } + .clr-order-lg-3 { + -ms-flex-order: 3; + order: 3; } + .clr-order-lg-4 { + -ms-flex-order: 4; + order: 4; } + .clr-order-lg-5 { + -ms-flex-order: 5; + order: 5; } + .clr-order-lg-6 { + -ms-flex-order: 6; + order: 6; } + .clr-order-lg-7 { + -ms-flex-order: 7; + order: 7; } + .clr-order-lg-8 { + -ms-flex-order: 8; + order: 8; } + .clr-order-lg-9 { + -ms-flex-order: 9; + order: 9; } + .clr-order-lg-10 { + -ms-flex-order: 10; + order: 10; } + .clr-order-lg-11 { + -ms-flex-order: 11; + order: 11; } + .clr-order-lg-12 { + -ms-flex-order: 12; + order: 12; } + .clr-offset-lg-0 { + margin-left: 0; } + .clr-offset-lg-1 { + margin-left: 8.333333%; } + .clr-offset-lg-2 { + margin-left: 16.666667%; } + .clr-offset-lg-3 { + margin-left: 25%; } + .clr-offset-lg-4 { + margin-left: 33.333333%; } + .clr-offset-lg-5 { + margin-left: 41.666667%; } + .clr-offset-lg-6 { + margin-left: 50%; } + .clr-offset-lg-7 { + margin-left: 58.333333%; } + .clr-offset-lg-8 { + margin-left: 66.666667%; } + .clr-offset-lg-9 { + margin-left: 75%; } + .clr-offset-lg-10 { + margin-left: 83.333333%; } + .clr-offset-lg-11 { + margin-left: 91.666667%; } } + +@media (min-width: 1200px) { + .clr-col-xl { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; } + .clr-col-xl-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: none; } + .clr-col-xl-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; } + .clr-col-xl-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; } + .clr-col-xl-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; } + .clr-col-xl-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; } + .clr-col-xl-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; } + .clr-col-xl-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; } + .clr-col-xl-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; } + .clr-col-xl-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; } + .clr-col-xl-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; } + .clr-col-xl-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; } + .clr-col-xl-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; } + .clr-col-xl-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; } + .clr-order-xl-first { + -ms-flex-order: -1; + order: -1; } + .clr-order-xl-last { + -ms-flex-order: 13; + order: 13; } + .clr-order-xl-0 { + -ms-flex-order: 0; + order: 0; } + .clr-order-xl-1 { + -ms-flex-order: 1; + order: 1; } + .clr-order-xl-2 { + -ms-flex-order: 2; + order: 2; } + .clr-order-xl-3 { + -ms-flex-order: 3; + order: 3; } + .clr-order-xl-4 { + -ms-flex-order: 4; + order: 4; } + .clr-order-xl-5 { + -ms-flex-order: 5; + order: 5; } + .clr-order-xl-6 { + -ms-flex-order: 6; + order: 6; } + .clr-order-xl-7 { + -ms-flex-order: 7; + order: 7; } + .clr-order-xl-8 { + -ms-flex-order: 8; + order: 8; } + .clr-order-xl-9 { + -ms-flex-order: 9; + order: 9; } + .clr-order-xl-10 { + -ms-flex-order: 10; + order: 10; } + .clr-order-xl-11 { + -ms-flex-order: 11; + order: 11; } + .clr-order-xl-12 { + -ms-flex-order: 12; + order: 12; } + .clr-offset-xl-0 { + margin-left: 0; } + .clr-offset-xl-1 { + margin-left: 8.333333%; } + .clr-offset-xl-2 { + margin-left: 16.666667%; } + .clr-offset-xl-3 { + margin-left: 25%; } + .clr-offset-xl-4 { + margin-left: 33.333333%; } + .clr-offset-xl-5 { + margin-left: 41.666667%; } + .clr-offset-xl-6 { + margin-left: 50%; } + .clr-offset-xl-7 { + margin-left: 58.333333%; } + .clr-offset-xl-8 { + margin-left: 66.666667%; } + .clr-offset-xl-9 { + margin-left: 75%; } + .clr-offset-xl-10 { + margin-left: 83.333333%; } + .clr-offset-xl-11 { + margin-left: 91.666667%; } } + +.clr-break-row { + width: 100%; } + +ul.list-unstyled { + padding-left: 0; + margin-left: 0; + list-style: none; } + +ul, +ol { + list-style-position: inside; + margin-left: 0; + margin-top: 0; + margin-bottom: 0; + padding-left: 0; } + ul.list, + ol.list { + list-style-position: outside; + margin-left: 1.1em; } + ul.list.compact, + ol.list.compact { + line-height: 0.75rem; } + ul.list.compact > li, + ol.list.compact > li { + margin-bottom: 0.25rem; } + ul.list.compact > li:last-child, + ol.list.compact > li:last-child { + margin-bottom: 0; } + +ul:not(.list-unstyled) > li > ul.list-unstyled, +ol > li > ul.list-unstyled { + margin-left: 1.1em; } + +li > ul { + margin-top: 0; + margin-left: 1.1em; } + +ul.list-group { + margin-top: 0; } + +ul.list-spacer, +ol.list-spacer { + margin-top: 1rem; } + +.login-wrapper { + display: -ms-flexbox; + display: flex; + background-image: url(../../resources/img/epping-kitten.png); + background-size: contain; + background-position: 21rem 0; + background-repeat: no-repeat; } + .login-wrapper .login { + background: #313131; + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-pack: center; + justify-content: center; + padding: 1rem 2.5rem; + height: auto; + min-height: 100vh; + width: 21rem; } + .login-wrapper .login .title { + color: #FFF; + font-weight: 200; + font-family: Metropolis, "Avenir Next", "Helvetica Neue", Arial, sans-serif; + font-size: 1.333333rem; + letter-spacing: normal; + line-height: 1.5rem; } + .login-wrapper .login .title .welcome { + line-height: 1.5rem; } + .login-wrapper .login .title .hint { + color: #000; + margin-top: 1.25rem; + font-size: 0.5833rem; } + .login-wrapper .login .trademark { + color: #FFF; + font-weight: 200; + font-family: Metropolis, "Avenir Next", "Helvetica Neue", Arial, sans-serif; + font-size: 1.166667rem; + letter-spacing: normal; } + .login-wrapper .login .subtitle { + color: #FFF; + font-weight: 200; + font-family: Metropolis, "Avenir Next", "Helvetica Neue", Arial, sans-serif; + font-size: 0.916667rem; + letter-spacing: normal; + line-height: 1.5rem; } + .login-wrapper .login .login-group { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + padding: 2rem 0 0 0; } + .login-wrapper .login .login-group .auth-source, + .login-wrapper .login .login-group .username, + .login-wrapper .login .login-group .password, + .login-wrapper .login .login-group .checkbox { + margin: 0.25rem 0 0.75rem 0; } + .login-wrapper .login .login-group .tooltip-validation { + margin-top: 0.25rem; } + .login-wrapper .login .login-group .tooltip-validation .username, + .login-wrapper .login .login-group .tooltip-validation .password { + width: 100%; + margin-top: 0; } + .login-wrapper .login .login-group .error { + display: none; + margin: 0.25rem 0 0 0; + padding: 0.375rem 0.5rem; + background: #c92100; + color: #fafafa; + border-radius: 0.125rem; + line-height: 0.75rem; } + .login-wrapper .login .login-group .error:before { + display: inline-block; + content: ''; + background: url("data:image/svg+xml;charset=utf8,%3Csvg%20version%3D%221.1%22%20viewBox%3D%225%205%2026%2026%22%20preserveAspectRatio%3D%22xMidYMid%20meet%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%3Cdefs%3E%3Cstyle%3E.clr-i-outline%7Bfill%3A%23fafafa%3B%7D%3C%2Fstyle%3E%3C%2Fdefs%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctitle%3Eexclamation-circle-line%3C%2Ftitle%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22clr-i-outline%20clr-i-outline-path-1%22%20d%3D%22M18%2C6A12%2C12%2C0%2C1%2C0%2C30%2C18%2C12%2C12%2C0%2C0%2C0%2C18%2C6Zm0%2C22A10%2C10%2C0%2C1%2C1%2C28%2C18%2C10%2C10%2C0%2C0%2C1%2C18%2C28Z%22%3E%3C%2Fpath%3E%3Cpath%20class%3D%22clr-i-outline%20clr-i-outline-path-2%22%20d%3D%22M18%2C20.07a1.3%2C1.3%2C0%2C0%2C1-1.3-1.3v-6a1.3%2C1.3%2C0%2C1%2C1%2C2.6%2C0v6A1.3%2C1.3%2C0%2C0%2C1%2C18%2C20.07Z%22%3E%3C%2Fpath%3E%3Ccircle%20class%3D%22clr-i-outline%20clr-i-outline-path-3%22%20cx%3D%2217.95%22%20cy%3D%2223.02%22%20r%3D%221.5%22%3E%3C%2Fcircle%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fsvg%3E"); + margin: 0.041667rem 0.25rem 0 0; + height: 0.666667rem; + width: 0.666667rem; } + .login-wrapper .login .login-group .error.active { + display: -ms-flexbox; + display: flex; } + .login-wrapper .login .login-group .error.active:before { + -ms-flex: 0 0 0.666667rem; + flex: 0 0 0.666667rem; } + .login-wrapper .login .login-group .btn { + margin: 3rem 0 0 0; + max-width: none; } + .login-wrapper .login .login-group .error + .btn { + margin: 1rem 0 0 0; } + .login-wrapper .login .login-group .signup { + margin-top: 0.5rem; + font-size: 0.5833rem; + text-align: center; } + .login-wrapper .login:after { + position: absolute; + content: ''; + display: block; + width: 1px; + height: 100%; + background: rgba(0, 0, 0, 0.1); + top: 0; + right: -2px; } + +@media screen and (max-width: 768px) { + .login-wrapper { + -ms-flex-pack: center; + justify-content: center; + background: #fafafa; } + .login-wrapper .login { + width: 100%; + margin-left: 0; + padding: 1rem 20%; } + .login-wrapper .login:after { + content: none; } } + +@media screen and (max-width: 576px) { + .login-wrapper .login { + padding: 1rem 15%; } } + +.main-container { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + height: 100vh; + background: #fafafa; } + .main-container .alert.alert-app-level { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + overflow-x: hidden; } + .main-container header, + .main-container .header { + -ms-flex: 0 0 2.5rem; + flex: 0 0 2.5rem; } + .main-container .sub-nav, + .main-container .subnav { + -ms-flex: 0 0 1.5rem; + flex: 0 0 1.5rem; } + .main-container .u-main-container { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + overflow: hidden; } + .main-container .content-container { + display: -ms-flexbox; + display: flex; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + min-height: 1px; } + .main-container .content-container .content-area { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + padding: 1rem 1rem 1rem 1rem; } + .main-container .content-container .content-area > :first-child { + margin-top: 0; } + .main-container .content-container .sidenav { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + -ms-flex-order: -1; + order: -1; + overflow: hidden; } + .main-container .content-container .clr-vertical-nav { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + -ms-flex-order: -1; + order: -1; } + +@media print { + .main-container { + height: auto; } } + +body.no-scrolling .main-container .content-container .content-area { + overflow: hidden; } + +body.no-scrolling { + overflow: hidden; } + +.modal { + position: fixed; + top: 0; + bottom: 0; + right: 0; + left: 0; + z-index: 1050; + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-pack: center; + justify-content: center; + -ms-flex-align: center; + align-items: center; + padding: 2rem; } + @media screen and (max-width: 576px) { + .modal { + padding: 0.5rem; } } + +.modal-dialog { + position: relative; + z-index: 1050; + width: 24rem; + max-width: 100%; } + .modal-dialog.modal-sm { + width: 12rem; } + .modal-dialog.modal-lg { + width: 36rem; } + .modal-dialog.modal-xl { + width: 48rem; } + .modal-dialog .modal-content { + padding: 1rem 1rem 1rem 1rem; + background-color: #fff; + border-radius: 0.125rem; + box-shadow: 0 1px 2px 2px rgba(0, 0, 0, 0.2); } + +.modal-header { + border-bottom: none; + padding: 0 0 1rem 0; } + .modal-header .modal-title { + color: #000; + font-size: 0.916667rem; + font-family: Metropolis, "Avenir Next", "Helvetica Neue", Arial, sans-serif; + font-weight: 200; + line-height: 1rem; + letter-spacing: normal; + margin: 0; + padding: 0 0.125rem; } + .modal-header .close { + margin-top: -0.0416667rem; + margin-right: -0.208333rem; + font-size: 1.0833rem; + line-height: 1rem; } + .modal-header .close clr-icon { + fill: #737373; + width: 1rem; + height: 1rem; } + +.modal-body { + max-height: 70vh; + overflow-y: auto; + overflow-x: hidden; + padding: 0 0.125rem; } + .modal-body > :first-child { + margin-top: 0; } + .modal-body > :last-child { + margin-bottom: 0; } + +.modal-footer { + display: -ms-flexbox; + display: flex; + -ms-flex-pack: end; + justify-content: flex-end; + padding: 1rem 0 0 0; } + .modal-footer .btn { + margin: 0 0 0 0.5rem; } + +@media screen and (max-width: 768px) and (orientation: landscape) { + .modal-body { + max-height: 55vh; } } + +@media screen and (max-width: 576px) { + .modal-content { + padding: 0.5rem 0 0.5rem 1rem; } + .modal-header { + padding: 0 1rem 0.5rem 0; } + .modal-body { + max-height: 55vh; } + .modal-footer { + padding: 0.5rem 1rem 0 0; } } + +.modal-backdrop { + position: fixed; + top: 0; + bottom: 0; + right: 0; + left: 0; + background-color: #313131; + opacity: 0.85; + z-index: 1040; } + +.modal .modal-nav { + display: none; } + +.modal-outer-wrapper { + height: 100%; + width: 100%; } + +.modal-ghost-wrapper { + display: none; } + +header, +.header { + background-color: #313131; } + header.header-1, + .header.header-1 { + background-color: #313131; } + header.header-2, + .header.header-2 { + background-color: #485969; } + header.header-3, + .header.header-3 { + background-color: #281336; } + header.header-4, + .header.header-4 { + background-color: #006a91; } + header.header-5, + .header.header-5 { + background-color: #004a70; } + header.header-6, + .header.header-6 { + background-color: #002538; } + header.header-7, + .header.header-7 { + background-color: #314351; } + +header, +.header { + display: -ms-flexbox; + display: flex; + color: #fafafa; + height: 2.5rem; + white-space: nowrap; } + header .branding, + header .header-nav, + header .search-box, + header .search, + header .settings, + header .header-actions, + header .divider, + .header .branding, + .header .header-nav, + .header .search-box, + .header .search, + .header .settings, + .header .header-actions, + .header .divider { + height: 2.5rem; } + header .branding, + .header .branding { + display: -ms-flexbox; + display: flex; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + min-width: 8.5rem; + padding: 0 1rem; } + header .branding > a, + header .branding > .nav-link, + .header .branding > a, + .header .branding > .nav-link { + display: -ms-inline-flexbox; + display: inline-flex; + -ms-flex-align: center; + align-items: center; + height: 2.5rem; } + header .branding > a:hover, header .branding > a:active, + header .branding > .nav-link:hover, + header .branding > .nav-link:active, + .header .branding > a:hover, + .header .branding > a:active, + .header .branding > .nav-link:hover, + .header .branding > .nav-link:active { + text-decoration: none; } + header .branding > a:focus, + header .branding > .nav-link:focus, + .header .branding > a:focus, + .header .branding > .nav-link:focus { + outline-offset: -0.208333rem; } + header .branding .clr-icon, + header .branding clr-icon, + .header .branding .clr-icon, + .header .branding clr-icon { + -ms-flex-positive: 0; + flex-grow: 0; + -ms-flex-negative: 0; + flex-shrink: 0; + height: 1.5rem; + width: 1.5rem; + margin-right: 0.375rem; } + header .branding .title, + .header .branding .title { + font-size: 0.666667rem; + font-weight: 400; + font-family: Metropolis, "Avenir Next", "Helvetica Neue", Arial, sans-serif; + letter-spacing: 0.01em; + color: #fafafa; + line-height: 2.5rem; + text-decoration: none; } + header .header-nav, + .header .header-nav { + display: -ms-flexbox; + display: flex; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + header .header-nav .nav-text, + .header .header-nav .nav-text { + padding: 0 1rem; + font-weight: 500; } + header .header-nav .nav-icon, + .header .header-nav .nav-icon { + height: 2.5rem; + width: 2.5rem; } + header .header-nav .nav-link, + .header .header-nav .nav-link { + position: relative; + display: inline-block; + color: #fafafa; + opacity: 0.65; } + header .header-nav .nav-link:hover, header .header-nav .nav-link:active, + .header .header-nav .nav-link:hover, + .header .header-nav .nav-link:active { + text-decoration: none; } + header .header-nav .nav-link:hover, + .header .header-nav .nav-link:hover { + opacity: 1; } + header .header-nav .nav-link .fa, + header .header-nav .nav-link .nav-icon, + header .header-nav .nav-link .nav-text, header .header-nav .nav-link.nav-icon, header .header-nav .nav-link.nav-text, + .header .header-nav .nav-link .fa, + .header .header-nav .nav-link .nav-icon, + .header .header-nav .nav-link .nav-text, + .header .header-nav .nav-link.nav-icon, + .header .header-nav .nav-link.nav-text { + line-height: 2.5rem; } + header .header-nav .nav-link .fa, + header .header-nav .nav-link .nav-icon, + .header .header-nav .nav-link .fa, + .header .header-nav .nav-link .nav-icon { + font-size: 0.916667rem; + text-align: center; } + header .header-nav .nav-link clr-icon, + .header .header-nav .nav-link clr-icon { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + height: 1rem; + width: 1rem; } + header .header-nav .nav-link .nav-icon + .nav-text, + .header .header-nav .nav-link .nav-icon + .nav-text { + display: none; } + header .header-nav .nav-link.active, + .header .header-nav .nav-link.active { + background: rgba(255, 255, 255, 0.15); + opacity: 1; } + header .header-nav .nav-link.active.nav-icon, header .header-nav .nav-link.active.nav-text, + header .header-nav .nav-link.active .nav-icon, + header .header-nav .nav-link.active .nav-text, + .header .header-nav .nav-link.active.nav-icon, + .header .header-nav .nav-link.active.nav-text, + .header .header-nav .nav-link.active .nav-icon, + .header .header-nav .nav-link.active .nav-text { + opacity: 1; } + header .header-nav .nav-link:focus, + .header .header-nav .nav-link:focus { + outline-offset: -0.208333rem; } + header .header-nav .nav-link:first-of-type, + header .header-nav .nav-link:last-of-type, + .header .header-nav .nav-link:first-of-type, + .header .header-nav .nav-link:last-of-type { + position: relative; } + header .header-nav .nav-link:first-of-type::before, + header .header-nav .nav-link:last-of-type::after, + .header .header-nav .nav-link:first-of-type::before, + .header .header-nav .nav-link:last-of-type::after { + position: absolute; + content: ''; + display: inline-block; + background: #fafafa; + opacity: 0.15; + height: 1.666667rem; + width: 1px; + top: 0.416667rem; } + header .header-nav .nav-link:first-of-type::before, + .header .header-nav .nav-link:first-of-type::before { + left: 0; } + header .header-nav .nav-link:last-of-type::after, + .header .header-nav .nav-link:last-of-type::after { + right: 0; } + header .header-nav .nav-link.active:first-of-type::before, + header .header-nav .nav-link.active:last-of-type::after, + .header .header-nav .nav-link.active:first-of-type::before, + .header .header-nav .nav-link.active:last-of-type::after { + content: none; } + header .search-box, + header .search, + .header .search-box, + .header .search { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + max-width: 12rem; + padding: 0; + color: #fafafa; + opacity: 0.65; } + header .search-box:hover, + header .search:hover, + .header .search-box:hover, + .header .search:hover { + opacity: 1; } + header .search-box > .nav-icon, + header .search > .nav-icon, + .header .search-box > .nav-icon, + .header .search > .nav-icon { + margin: 0 0.25rem 0.125rem 1rem; } + header .search-box label, + header .search label, + .header .search-box label, + .header .search label { + display: inline-block; + height: 2.5rem; + line-height: 2.5rem; + padding-left: 1rem; + text-align: center; } + header .search-box label::before, + header .search label::before, + .header .search-box label::before, + .header .search label::before { + display: inline-block; + content: ''; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2036%2036%22%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bfill%3A%23fff%3B%7D%3C%2Fstyle%3E%3C%2Fdefs%3E%3Ctitle%3ESearch%3C%2Ftitle%3E%3Cg%20id%3D%22icons%22%3E%3Cpath%20class%3D%22cls-1%22%20d%3D%22M15%2C4.05A10.95%2C10.95%2C0%2C1%2C1%2C4.05%2C15%2C11%2C11%2C0%2C0%2C1%2C15%2C4.05M15%2C2A13%2C13%2C0%2C1%2C0%2C28%2C15%2C13%2C13%2C0%2C0%2C0%2C15%2C2Z%22%2F%3E%3Cpath%20class%3D%22cls-1%22%20%20d%3D%22M33.71%2C32.29l-7.37-7.42-1.42%2C1.41%2C7.37%2C7.42a1%2C1%2C0%2C1%2C0%2C1.42-1.41Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); + background-repeat: no-repeat; + background-size: contain; + cursor: pointer; + height: 0.833333rem; + width: 0.833333rem; + margin: 0.83335rem 0 0 0; + vertical-align: top; } + header .search-box label input, + header .search label input, + .header .search-box label input, + .header .search label input { + line-height: 1rem; } + header .search-box input[type='text'], + header .search input[type='text'], + .header .search-box input[type='text'], + .header .search input[type='text'] { + border: none; + background: none; + color: #fafafa; + padding: 0; + vertical-align: middle; } + header .search-box input[type='text']:focus, header .search-box input[type='text']:active, + header .search input[type='text']:focus, + header .search input[type='text']:active, + .header .search-box input[type='text']:focus, + .header .search-box input[type='text']:active, + .header .search input[type='text']:focus, + .header .search input[type='text']:active { + background: none; } + header .settings, + header .header-actions, + .header .settings, + .header .header-actions { + -ms-flex: 1 0 auto; + flex: 1 0 auto; + display: -ms-flexbox; + display: flex; + -ms-flex-pack: end; + justify-content: flex-end; } + header .settings .nav-text, + header .header-actions .nav-text, + .header .settings .nav-text, + .header .header-actions .nav-text { + padding: 0 1rem; + font-weight: 500; } + header .settings .nav-icon, + header .header-actions .nav-icon, + .header .settings .nav-icon, + .header .header-actions .nav-icon { + height: 2.5rem; + width: 2.5rem; } + header .settings .nav-link, + header .header-actions .nav-link, + .header .settings .nav-link, + .header .header-actions .nav-link { + position: relative; + display: inline-block; + color: #fafafa; + opacity: 0.65; } + header .settings .nav-link:hover, header .settings .nav-link:active, + header .header-actions .nav-link:hover, + header .header-actions .nav-link:active, + .header .settings .nav-link:hover, + .header .settings .nav-link:active, + .header .header-actions .nav-link:hover, + .header .header-actions .nav-link:active { + text-decoration: none; } + header .settings .nav-link:hover, + header .header-actions .nav-link:hover, + .header .settings .nav-link:hover, + .header .header-actions .nav-link:hover { + opacity: 1; } + header .settings .nav-link .fa, + header .settings .nav-link .nav-icon, + header .settings .nav-link .nav-text, header .settings .nav-link.nav-icon, header .settings .nav-link.nav-text, + header .header-actions .nav-link .fa, + header .header-actions .nav-link .nav-icon, + header .header-actions .nav-link .nav-text, + header .header-actions .nav-link.nav-icon, + header .header-actions .nav-link.nav-text, + .header .settings .nav-link .fa, + .header .settings .nav-link .nav-icon, + .header .settings .nav-link .nav-text, + .header .settings .nav-link.nav-icon, + .header .settings .nav-link.nav-text, + .header .header-actions .nav-link .fa, + .header .header-actions .nav-link .nav-icon, + .header .header-actions .nav-link .nav-text, + .header .header-actions .nav-link.nav-icon, + .header .header-actions .nav-link.nav-text { + line-height: 2.5rem; } + header .settings .nav-link .fa, + header .settings .nav-link .nav-icon, + header .header-actions .nav-link .fa, + header .header-actions .nav-link .nav-icon, + .header .settings .nav-link .fa, + .header .settings .nav-link .nav-icon, + .header .header-actions .nav-link .fa, + .header .header-actions .nav-link .nav-icon { + font-size: 0.916667rem; + text-align: center; } + header .settings .nav-link clr-icon, + header .header-actions .nav-link clr-icon, + .header .settings .nav-link clr-icon, + .header .header-actions .nav-link clr-icon { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + height: 1rem; + width: 1rem; } + header .settings .nav-link .nav-icon + .nav-text, + header .header-actions .nav-link .nav-icon + .nav-text, + .header .settings .nav-link .nav-icon + .nav-text, + .header .header-actions .nav-link .nav-icon + .nav-text { + display: none; } + header .settings .nav-link.active, + header .header-actions .nav-link.active, + .header .settings .nav-link.active, + .header .header-actions .nav-link.active { + background: rgba(255, 255, 255, 0.15); + opacity: 1; } + header .settings .nav-link.active.nav-icon, header .settings .nav-link.active.nav-text, + header .settings .nav-link.active .nav-icon, + header .settings .nav-link.active .nav-text, + header .header-actions .nav-link.active.nav-icon, + header .header-actions .nav-link.active.nav-text, + header .header-actions .nav-link.active .nav-icon, + header .header-actions .nav-link.active .nav-text, + .header .settings .nav-link.active.nav-icon, + .header .settings .nav-link.active.nav-text, + .header .settings .nav-link.active .nav-icon, + .header .settings .nav-link.active .nav-text, + .header .header-actions .nav-link.active.nav-icon, + .header .header-actions .nav-link.active.nav-text, + .header .header-actions .nav-link.active .nav-icon, + .header .header-actions .nav-link.active .nav-text { + opacity: 1; } + header .settings .nav-link:focus, + header .header-actions .nav-link:focus, + .header .settings .nav-link:focus, + .header .header-actions .nav-link:focus { + outline-offset: -0.208333rem; } + header .settings > .dropdown > .dropdown-toggle, + header .header-actions > .dropdown > .dropdown-toggle, + .header .settings > .dropdown > .dropdown-toggle, + .header .header-actions > .dropdown > .dropdown-toggle { + position: relative; + line-height: 2.5rem; + height: 2.5rem; + outline-offset: -0.208333rem; + color: #fafafa; + opacity: 0.65; } + header .settings > .dropdown > .dropdown-toggle:hover, + header .header-actions > .dropdown > .dropdown-toggle:hover, + .header .settings > .dropdown > .dropdown-toggle:hover, + .header .header-actions > .dropdown > .dropdown-toggle:hover { + opacity: 1; } + header .settings > .dropdown .dropdown-toggle.nav-icon clr-icon:not([shape^='caret']), + header .header-actions > .dropdown .dropdown-toggle.nav-icon clr-icon:not([shape^='caret']), + .header .settings > .dropdown .dropdown-toggle.nav-icon clr-icon:not([shape^='caret']), + .header .header-actions > .dropdown .dropdown-toggle.nav-icon clr-icon:not([shape^='caret']) { + position: absolute; + top: 50%; + transform: translateY(-50%); + height: 0.916667rem; + width: 0.916667rem; + right: 1rem; } + header .settings > .dropdown .dropdown-toggle.nav-icon clr-icon[shape^='caret'], + header .header-actions > .dropdown .dropdown-toggle.nav-icon clr-icon[shape^='caret'], + .header .settings > .dropdown .dropdown-toggle.nav-icon clr-icon[shape^='caret'], + .header .header-actions > .dropdown .dropdown-toggle.nav-icon clr-icon[shape^='caret'] { + right: 0.5rem; } + header .settings > .dropdown .dropdown-toggle.nav-text, + header .header-actions > .dropdown .dropdown-toggle.nav-text, + .header .settings > .dropdown .dropdown-toggle.nav-text, + .header .header-actions > .dropdown .dropdown-toggle.nav-text { + padding: 0 1.5rem 0 1rem; } + header .settings > .dropdown .dropdown-toggle.nav-text clr-icon[shape^='caret'], + header .header-actions > .dropdown .dropdown-toggle.nav-text clr-icon[shape^='caret'], + .header .settings > .dropdown .dropdown-toggle.nav-text clr-icon[shape^='caret'], + .header .header-actions > .dropdown .dropdown-toggle.nav-text clr-icon[shape^='caret'] { + right: 1rem; } + header .settings > .dropdown .dropdown-toggle.nav-icon, + header .header-actions > .dropdown .dropdown-toggle.nav-icon, + .header .settings > .dropdown .dropdown-toggle.nav-icon, + .header .header-actions > .dropdown .dropdown-toggle.nav-icon { + width: 2.5rem; + padding-right: 0; } + header .settings > .dropdown.bottom-right > .dropdown-menu, + header .settings > .dropdown.bottom-left > .dropdown-menu, + header .header-actions > .dropdown.bottom-right > .dropdown-menu, + header .header-actions > .dropdown.bottom-left > .dropdown-menu, + .header .settings > .dropdown.bottom-right > .dropdown-menu, + .header .settings > .dropdown.bottom-left > .dropdown-menu, + .header .header-actions > .dropdown.bottom-right > .dropdown-menu, + .header .header-actions > .dropdown.bottom-left > .dropdown-menu { + top: 85%; } + header .settings > .dropdown:last-child.bottom-right > .dropdown-menu, + header .header-actions > .dropdown:last-child.bottom-right > .dropdown-menu, + .header .settings > .dropdown:last-child.bottom-right > .dropdown-menu, + .header .header-actions > .dropdown:last-child.bottom-right > .dropdown-menu { + right: 0.125rem; } + header .settings > .dropdown .dropdown-menu, + header .header-actions > .dropdown .dropdown-menu, + .header .settings > .dropdown .dropdown-menu, + .header .header-actions > .dropdown .dropdown-menu { + margin-top: -0.166667rem; + left: auto; + right: 0; } + header .settings > .dropdown :last-child.dropdown-menu, + header .header-actions > .dropdown :last-child.dropdown-menu, + .header .settings > .dropdown :last-child.dropdown-menu, + .header .header-actions > .dropdown :last-child.dropdown-menu { + margin-right: 0.333333rem; } + header .branding + .search, + header .branding + .search-box, + .header .branding + .search, + .header .branding + .search-box { + position: relative; } + header .branding + .search::after, + header .branding + .search-box::after, + .header .branding + .search::after, + .header .branding + .search-box::after { + position: absolute; + left: 0; + content: ''; + display: inline-block; + background: #fafafa; + opacity: 0.15; + height: 1.666667rem; + width: 1px; + top: 0.416667rem; } + header .header-nav:last-child > .nav-link:last-child::after, + .header .header-nav:last-child > .nav-link:last-child::after { + content: none; } + +@media screen and (max-width: 768px) { + header .search-box, + header .search, + .header .search-box, + .header .search { + -ms-flex: 1 0 auto; + flex: 1 0 auto; + -ms-flex-pack: end; + justify-content: flex-end; + max-width: none; } + header .search-box label, + header .search label, + .header .search-box label, + .header .search label { + padding: 0; + width: 2.5rem; } + header .search-box label::before, + header .search label::before, + .header .search-box label::before, + .header .search label::before { + left: 0.833333rem; } + header .search-box label input, + header .search label input, + .header .search-box label input, + .header .search label input { + display: none; } + header .branding + .search::after, + header .branding + .search-box::after, + .header .branding + .search::after, + .header .branding + .search-box::after { + content: none; } + header .search-box + .settings, + header .search-box + .header-actions, + header .search + .settings, + header .search + .header-actions, + .header .search-box + .settings, + .header .search-box + .header-actions, + .header .search + .settings, + .header .search + .header-actions { + position: relative; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + header .search-box + .settings::after, + header .search-box + .header-actions::after, + header .search + .settings::after, + header .search + .header-actions::after, + .header .search-box + .settings::after, + .header .search-box + .header-actions::after, + .header .search + .settings::after, + .header .search + .header-actions::after { + position: absolute; + content: ''; + display: inline-block; + background: #fafafa; + opacity: 0.15; + height: 1.666667rem; + width: 1px; + top: 0.416667rem; + left: 0; } } + +.nav { + display: -ms-flexbox; + display: flex; + height: 1.5rem; + list-style-type: none; + -ms-flex-align: center; + align-items: center; + box-shadow: 0 -1px 0 #ccc inset; + margin: 0; + width: 100%; + white-space: nowrap; } + .nav .nav-item { + display: inline-block; + margin-right: 1rem; } + .nav .nav-item.active > .nav-link { + color: #000; + box-shadow: 0 -1px 0 #ccc inset; } + .nav .nav-link { + font-size: 0.583333rem; + font-weight: 400; + letter-spacing: normal; + display: inline-block; + color: #737373; + padding: 0 0.125rem; + box-shadow: none; + line-height: 1.5rem; } + .nav .nav-link.btn { + text-transform: none; + margin: 0; + margin-bottom: -1px; + border-radius: 0; } + .nav .nav-link:hover, .nav .nav-link:focus, .nav .nav-link:active { + color: inherit; } + .nav .nav-link:hover, .nav .nav-link.active { + box-shadow: 0 -3px 0 #007cbb inset; + transition: box-shadow 0.2s ease-in; } + .nav .nav-link:hover, .nav .nav-link:focus, .nav .nav-link:active, .nav .nav-link.active { + text-decoration: none; } + .nav .nav-link.active { + color: #000; } + .nav .nav-link.nav-item { + margin-right: 1rem; } + +.sub-nav, +.subnav { + display: -ms-flexbox; + display: flex; + box-shadow: 0 -1px 0 #ccc inset; + -ms-flex-pack: justify; + justify-content: space-between; + -ms-flex-align: center; + align-items: center; + background-color: #fff; + height: 1.5rem; } + .sub-nav .nav, + .subnav .nav { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding-left: 1rem; } + .sub-nav aside, + .subnav aside { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + height: 1.5rem; + padding: 0 1rem; } + .sub-nav aside > :last-child, + .subnav aside > :last-child { + margin-right: 0; + padding-right: 0; } + +.sidenav { + line-height: 1rem; + max-width: 13rem; + min-width: 9rem; + width: 18%; + border-right: 1px solid #ccc; + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; } + .sidenav .sidenav-content { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + overflow-x: hidden; + padding-bottom: 1rem; } + .sidenav .sidenav-content .nav-link { + display: inline-block; + border-radius: 0.125rem 0 0 0.125rem; + color: inherit; + cursor: pointer; + text-decoration: none; + width: 100%; } + .sidenav .sidenav-content > .nav-link { + color: #313131; + font-size: 0.583333rem; + font-weight: 500; + line-height: 1rem; + font-family: Metropolis, "Avenir Next", "Helvetica Neue", Arial, sans-serif; + letter-spacing: normal; + margin: 1rem 0 0 1.25rem; + padding-left: 0.5rem; } + .sidenav .sidenav-content > .nav-link:hover { + background: #eee; } + .sidenav .sidenav-content > .nav-link.active { + background: #d9e4ea; + color: #000; } + .sidenav .nav-group { + color: #565656; + font-size: 0.583333rem; + font-weight: 400; + letter-spacing: normal; + margin-top: 1rem; + width: 100%; } + .sidenav .nav-group .nav-list, + .sidenav .nav-group label { + padding: 0 0 0 1.75rem; } + .sidenav .nav-group .nav-list { + list-style: none; + margin-top: 0; + overflow: hidden; } + .sidenav .nav-group .nav-list .nav-link { + line-height: 0.666667rem; + padding: 0.166667rem 0 0.166667rem 0.5rem; } + .sidenav .nav-group .nav-list .nav-link:hover { + background: #eee; } + .sidenav .nav-group .nav-list .nav-link.active { + background: #d9e4ea; + color: #000; } + .sidenav .nav-group label { + color: #313131; + font-size: 0.583333rem; + font-weight: 500; + line-height: 1rem; + font-family: Metropolis, "Avenir Next", "Helvetica Neue", Arial, sans-serif; + letter-spacing: normal; } + .sidenav .nav-group input[type='checkbox'] { + display: none; } + .sidenav .collapsible label { + cursor: pointer; + display: inline-block; + width: 100%; + padding: 0 0 0 1.333333rem; } + .sidenav .collapsible label:after { + content: ''; + float: left; + height: 0.416667rem; + width: 0.416667rem; + transform: translateX(-0.333333rem) translateY(0.291667rem); + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2012%2012%22%3E%0A%20%20%20%20%3Cdefs%3E%0A%20%20%20%20%20%20%20%20%3Cstyle%3E.cls-1%7Bfill%3A%239a9a9a%3B%7D%3C%2Fstyle%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%20%20%20%20%3Ctitle%3ECaret%3C%2Ftitle%3E%0A%20%20%20%20%3Cpath%20class%3D%22cls-1%22%20d%3D%22M6%2C9L1.2%2C4.2a0.68%2C0.68%2C0%2C0%2C1%2C1-1L6%2C7.08%2C9.84%2C3.24a0.68%2C0.68%2C0%2C1%2C1%2C1%2C1Z%22%2F%3E%0A%3C%2Fsvg%3E%0A"); + background-repeat: no-repeat; + background-size: contain; + vertical-align: middle; + margin: 0; } + .sidenav .collapsible .nav-list, + .sidenav .collapsible ul { + overflow: hidden; } + .sidenav .collapsible input[type='checkbox']:checked ~ .nav-list, + .sidenav .collapsible input[type='checkbox']:checked ~ ul { + height: 0; } + .sidenav .collapsible input[type='checkbox'] ~ .nav-list, + .sidenav .collapsible input[type='checkbox'] ~ ul { + height: auto; } + .sidenav .collapsible input[type='checkbox']:checked ~ label:after { + transform: rotate(-90deg) translateX(-0.291667rem) translateY(-0.333333rem); } + +.clr-vertical-nav { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + padding-top: 0.75rem; + width: 10rem; + min-width: 2rem; + background-color: #eee; + will-change: width; + transition: width 0.2s ease-in-out; } + .clr-vertical-nav .nav-divider { + border: 1px solid #565656; + margin: 0.5rem 0; + opacity: 0.2; } + .clr-vertical-nav .nav-content { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + overflow-y: auto; + overflow-x: hidden; } + .clr-vertical-nav .nav-group { + display: block; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + height: auto; + min-height: 1.5rem; } + .clr-vertical-nav .nav-group-content { + display: -ms-flexbox; + display: flex; + color: #565656; } + .clr-vertical-nav .nav-group-content:hover, .clr-vertical-nav .nav-group-content.active { + color: #565656; + background-color: #fff; } + .clr-vertical-nav .nav-group-content:hover .nav-icon, .clr-vertical-nav .nav-group-content.active .nav-icon { + fill: #007cbb; } + .clr-vertical-nav .nav-group-content:hover { + text-decoration: none; } + .clr-vertical-nav .nav-group-content .nav-link { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding-left: 0; + min-width: 0; } + .clr-vertical-nav .nav-group-content .nav-icon { + margin-left: 1rem; } + .clr-vertical-nav .nav-group-content .nav-text { + padding-left: 1rem; } + .clr-vertical-nav .nav-group-content .nav-icon + .nav-text { + padding-left: 0; } + .clr-vertical-nav .nav-group-content .nav-link + .nav-group-text { + display: none; } + .clr-vertical-nav .nav-trigger, + .clr-vertical-nav .nav-group-trigger { + -ms-flex: 0 0 1.5rem; + flex: 0 0 1.5rem; + border: none; + height: 1.5rem; + padding: 0; + color: #000; + background-color: transparent; + cursor: pointer; + outline-offset: -5px; } + .clr-vertical-nav .nav-trigger { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: start; + justify-content: flex-start; + height: 1.5rem; + margin-top: -0.75rem; } + .clr-vertical-nav .nav-group-trigger { + display: -ms-flexbox; + display: flex; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + color: inherit; + overflow: hidden; + text-align: left; } + .clr-vertical-nav .nav-group-trigger .nav-group-trigger-icon { + -ms-flex-negative: 0; + flex-shrink: 0; + height: 1.5rem; + width: 0.666667rem; + margin-left: 0.416666rem; + margin-right: 0.416666rem; + transition: all 0.2s ease-in-out; } + .clr-vertical-nav .nav-trigger-icon { + margin-left: auto; + margin-right: 0.416666rem; + transition: all 0.2s ease-in-out; } + .clr-vertical-nav .nav-trigger + .nav-content { + border-top: 1px solid rgba(86, 86, 86, 0.2); + padding-top: 0.5rem; } + .clr-vertical-nav .nav-group-text, + .clr-vertical-nav .nav-link { + height: 1.5rem; + padding: 0 0.5rem 0 1rem; + line-height: 1.5rem; + outline-offset: -5px; } + .clr-vertical-nav .nav-group-text, + .clr-vertical-nav .nav-text { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } + .clr-vertical-nav .nav-link { + display: -ms-flexbox; + display: flex; + color: #565656; } + .clr-vertical-nav .nav-link:hover, .clr-vertical-nav .nav-link.active { + color: #565656; + background-color: #fff; } + .clr-vertical-nav .nav-link:hover .nav-icon, .clr-vertical-nav .nav-link.active .nav-icon { + fill: #007cbb; } + .clr-vertical-nav .nav-link:hover { + text-decoration: none; } + .clr-vertical-nav .nav-header { + padding: 0 0.5rem 0 1rem; + font-size: 0.5rem; + font-weight: 600; + letter-spacing: normal; + line-height: 1.5rem; } + .clr-vertical-nav .nav-icon { + -ms-flex: 0 0 0.666667rem; + flex: 0 0 0.666667rem; + -ms-flex-item-align: center; + -ms-grid-row-align: center; + align-self: center; + height: 0.666667rem; + width: 0.666667rem; + margin-right: 0.25rem; + vertical-align: middle; } + .clr-vertical-nav clr-vertical-nav-group-children { + display: block; } + .clr-vertical-nav .nav-btn { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding: 0; + margin: 0; + background: transparent; + border: none; + cursor: pointer; + outline-offset: -5px; } + .clr-vertical-nav > .nav-link, + .clr-vertical-nav .nav-content > .nav-link { + -ms-flex: 0 0 1.5rem; + flex: 0 0 1.5rem; } + .clr-vertical-nav .nav-link + .nav-group-trigger { + -ms-flex: 0 0 1.5rem; + flex: 0 0 1.5rem; } + .clr-vertical-nav .nav-link + .nav-group-trigger .nav-group-text { + display: none; } + .clr-vertical-nav .nav-icon + .nav-group-text { + padding-left: 0; } + .clr-vertical-nav.has-nav-groups .nav-link, + .clr-vertical-nav.has-nav-groups .nav-group .nav-group-text, + .clr-vertical-nav.has-nav-groups .nav-group .nav-group-trigger { + font-weight: 600; } + .clr-vertical-nav.has-nav-groups .nav-group-children .nav-link { + font-weight: normal; } + .clr-vertical-nav.has-icons .nav-group-children .nav-link { + padding-left: 1.916667rem; } + .clr-vertical-nav .nav-group.active:not(.is-expanded) .nav-group-content { + background-color: #fff; } + .clr-vertical-nav .nav-group.active:not(.is-expanded) .nav-group-content .nav-icon { + fill: #007cbb; } + .clr-vertical-nav .nav-group-content .nav-link.active ~ .nav-group-trigger { + background-color: #fff; } + .main-container:not([class*='open-overflow-menu']):not([class*='open-hamburger-menu']) .clr-vertical-nav.is-collapsed { + width: 2rem; + min-width: 2rem; + cursor: pointer; } + .main-container:not([class*='open-overflow-menu']):not([class*='open-hamburger-menu']) .clr-vertical-nav.is-collapsed .nav-trigger { + margin-right: 0.125rem; } + .main-container:not([class*='open-overflow-menu']):not([class*='open-hamburger-menu']) .clr-vertical-nav.is-collapsed .nav-icon { + margin: 0; + margin-left: 0.666667rem; } + .main-container:not([class*='open-overflow-menu']):not([class*='open-hamburger-menu']) .clr-vertical-nav.is-collapsed .nav-group-content .nav-link { + -ms-flex: 0 0 2rem; + flex: 0 0 2rem; } + .main-container:not([class*='open-overflow-menu']):not([class*='open-hamburger-menu']) .clr-vertical-nav.is-collapsed .nav-group-content .nav-link ~ .nav-group-trigger { + -ms-flex: 0 0 0.666667rem; + flex: 0 0 0.666667rem; + transform: translateX(-0.666667rem); + pointer-events: none; } + .main-container:not([class*='open-overflow-menu']):not([class*='open-hamburger-menu']) .clr-vertical-nav.is-collapsed .nav-link, + .main-container:not([class*='open-overflow-menu']):not([class*='open-hamburger-menu']) .clr-vertical-nav.is-collapsed .nav-group-trigger { + padding: 0; } + .main-container:not([class*='open-overflow-menu']):not([class*='open-hamburger-menu']) .clr-vertical-nav.is-collapsed .nav-group-trigger { + padding-left: 0; } + .main-container:not([class*='open-overflow-menu']):not([class*='open-hamburger-menu']) .clr-vertical-nav.is-collapsed .nav-group-trigger .nav-group-trigger-icon { + height: 1.5rem; + width: 0.416667rem; + margin-left: 0.125rem; + margin-right: 0; } + .main-container:not([class*='open-overflow-menu']):not([class*='open-hamburger-menu']) .clr-vertical-nav.is-collapsed .nav-group, + .main-container:not([class*='open-overflow-menu']):not([class*='open-hamburger-menu']) .clr-vertical-nav.is-collapsed .nav-link { + display: none; } + .main-container:not([class*='open-overflow-menu']):not([class*='open-hamburger-menu']) .clr-vertical-nav.is-collapsed.has-icons .nav-group { + display: block; } + .main-container:not([class*='open-overflow-menu']):not([class*='open-hamburger-menu']) .clr-vertical-nav.is-collapsed.has-icons .nav-link { + display: -ms-flexbox; + display: flex; } + .main-container:not([class*='open-overflow-menu']):not([class*='open-hamburger-menu']) .clr-vertical-nav.is-collapsed.has-icons .nav-group-text, + .main-container:not([class*='open-overflow-menu']):not([class*='open-hamburger-menu']) .clr-vertical-nav.is-collapsed.has-icons .nav-text { + display: none; } + .clr-vertical-nav.nav-trigger--bottom .nav-trigger { + -ms-flex-order: 2; + order: 2; + margin-top: 0; } + .clr-vertical-nav.nav-trigger--bottom .nav-trigger + .nav-content { + border-bottom: 1px solid rgba(86, 86, 86, 0.2); + border-top: none; + padding-top: 0; } + +.header-hamburger-trigger, +.header-overflow-trigger { + display: none; } + +.header-hamburger-trigger > span, +.header-hamburger-trigger > span::before, +.header-hamburger-trigger > span::after { + display: inline-block; + height: 0.0833333rem; + width: 1rem; + background: #fff; + border-radius: 0.125rem; } + +.header-hamburger-trigger > span { + position: relative; + vertical-align: middle; } + .header-hamburger-trigger > span::before, .header-hamburger-trigger > span::after { + content: ''; + position: absolute; + left: 0; } + .header-hamburger-trigger > span::before { + top: -0.291667rem; } + .header-hamburger-trigger > span::after { + bottom: -0.291667rem; } + +.header-hamburger-trigger.active > span { + background: transparent; } + .header-hamburger-trigger.active > span::before, .header-hamburger-trigger.active > span::after { + left: 0.125rem; + transform-origin: 9%; + transition: transform 0.6s ease; } + .header-hamburger-trigger.active > span::before { + transform: rotate(45deg); } + .header-hamburger-trigger.active > span::after { + transform: rotate(-45deg); } + +.header-overflow-trigger > span, +.header-overflow-trigger > span::before, +.header-overflow-trigger > span::after { + display: inline-block; + height: 0.166667rem; + width: 0.166667rem; + background: #fff; + border-radius: 0.166667rem; } + +.header-overflow-trigger > span { + position: relative; + vertical-align: middle; } + .header-overflow-trigger > span::before, .header-overflow-trigger > span::after { + content: ''; + position: absolute; + left: 0; } + .header-overflow-trigger > span::before { + top: -0.333333rem; } + .header-overflow-trigger > span::after { + bottom: -0.333333rem; } + +.header-overflow-trigger.active > span { + background: transparent; } + .header-overflow-trigger.active > span::before, .header-overflow-trigger.active > span::after { + height: 0.0833333rem; + width: 1rem; + left: -0.25rem; + transform-origin: -3%; + transition: transform 0.6s ease; } + .header-overflow-trigger.active > span::before { + transform: rotate(45deg); } + .header-overflow-trigger.active > span::after { + transform: rotate(-45deg); } + +@media screen and (max-width: 768px) { + .main-container .header-hamburger-trigger, + .main-container .header-overflow-trigger { + display: inline-block; + border: none; + background: none; + cursor: pointer; + font-size: 1rem; + height: 2.5rem; + width: 2.5rem; + padding: 0 0 0.166667rem 0; + text-align: center; + white-space: nowrap; + color: #fafafa; + opacity: 0.65; } + .main-container .header-hamburger-trigger:focus, + .main-container .header-overflow-trigger:focus { + outline-offset: -0.208333rem; } + .main-container .header-hamburger-trigger:hover, + .main-container .header-overflow-trigger:hover { + opacity: 1; } + .main-container .header-nav.clr-nav-level-1, + .main-container .subnav.clr-nav-level-1, + .main-container .sub-nav.clr-nav-level-1, + .main-container .sidenav.clr-nav-level-1, + .main-container .clr-vertical-nav.clr-nav-level-1 { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + position: fixed; + top: 0; + right: auto; + bottom: 0; + left: 0; + background: #eee; + z-index: 1039; + height: 100vh; + transform: translateX(-15rem); + transition: transform 0.3s ease; } + .main-container .header-nav.clr-nav-level-2, + .main-container .subnav.clr-nav-level-2, + .main-container .sub-nav.clr-nav-level-2, + .main-container .sidenav.clr-nav-level-2, + .main-container .clr-vertical-nav.clr-nav-level-2 { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: auto; + background: #eee; + z-index: 1039; + height: 100vh; + transform: translateX(15rem); + transition: transform 0.3s ease; } + .main-container .subnav.clr-nav-level-1 .nav, + .main-container .subnav.clr-nav-level-1 aside, + .main-container .sub-nav.clr-nav-level-1 .nav, + .main-container .sub-nav.clr-nav-level-1 aside, + .main-container .subnav.clr-nav-level-2 .nav, + .main-container .subnav.clr-nav-level-2 aside, + .main-container .sub-nav.clr-nav-level-2 .nav, + .main-container .sub-nav.clr-nav-level-2 aside { + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-align: stretch; + align-items: stretch; } + .main-container .subnav.clr-nav-level-1 aside, + .main-container .sub-nav.clr-nav-level-1 aside, + .main-container .subnav.clr-nav-level-2 aside, + .main-container .sub-nav.clr-nav-level-2 aside { + -ms-flex-pack: center; + justify-content: center; + width: 100%; } + .main-container .subnav.clr-nav-level-1 .nav, + .main-container .sub-nav.clr-nav-level-1 .nav, + .main-container .subnav.clr-nav-level-2 .nav, + .main-container .sub-nav.clr-nav-level-2 .nav { + padding-left: 0; } + .main-container .subnav.clr-nav-level-1 .nav .nav-item, + .main-container .sub-nav.clr-nav-level-1 .nav .nav-item, + .main-container .subnav.clr-nav-level-2 .nav .nav-item, + .main-container .sub-nav.clr-nav-level-2 .nav .nav-item { + height: 1.5rem; + margin-right: 0; } + .main-container .subnav.clr-nav-level-1 .nav .nav-link, + .main-container .sub-nav.clr-nav-level-1 .nav .nav-link, + .main-container .subnav.clr-nav-level-2 .nav .nav-link, + .main-container .sub-nav.clr-nav-level-2 .nav .nav-link { + padding: 0 0.5rem 0 1rem; + width: 100%; + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + border-radius: 0.125rem 0 0 0.125rem; + color: #565656; } + .main-container .subnav.clr-nav-level-1 .nav .nav-link:hover, .main-container .subnav.clr-nav-level-1 .nav .nav-link.active, + .main-container .sub-nav.clr-nav-level-1 .nav .nav-link:hover, + .main-container .sub-nav.clr-nav-level-1 .nav .nav-link.active, + .main-container .subnav.clr-nav-level-2 .nav .nav-link:hover, + .main-container .subnav.clr-nav-level-2 .nav .nav-link.active, + .main-container .sub-nav.clr-nav-level-2 .nav .nav-link:hover, + .main-container .sub-nav.clr-nav-level-2 .nav .nav-link.active { + color: #565656; + background-color: #fff; } + .main-container .subnav.clr-nav-level-1 .nav .nav-link:hover .nav-icon, .main-container .subnav.clr-nav-level-1 .nav .nav-link.active .nav-icon, + .main-container .sub-nav.clr-nav-level-1 .nav .nav-link:hover .nav-icon, + .main-container .sub-nav.clr-nav-level-1 .nav .nav-link.active .nav-icon, + .main-container .subnav.clr-nav-level-2 .nav .nav-link:hover .nav-icon, + .main-container .subnav.clr-nav-level-2 .nav .nav-link.active .nav-icon, + .main-container .sub-nav.clr-nav-level-2 .nav .nav-link:hover .nav-icon, + .main-container .sub-nav.clr-nav-level-2 .nav .nav-link.active .nav-icon { + fill: #007cbb; } + .main-container .subnav.clr-nav-level-1 .nav .nav-link:hover, + .main-container .sub-nav.clr-nav-level-1 .nav .nav-link:hover, + .main-container .subnav.clr-nav-level-2 .nav .nav-link:hover, + .main-container .sub-nav.clr-nav-level-2 .nav .nav-link:hover { + text-decoration: none; } + .main-container .subnav.clr-nav-level-1 .nav .nav-link:hover, .main-container .subnav.clr-nav-level-1 .nav .nav-link.active, + .main-container .sub-nav.clr-nav-level-1 .nav .nav-link:hover, + .main-container .sub-nav.clr-nav-level-1 .nav .nav-link.active, + .main-container .subnav.clr-nav-level-2 .nav .nav-link:hover, + .main-container .subnav.clr-nav-level-2 .nav .nav-link.active, + .main-container .sub-nav.clr-nav-level-2 .nav .nav-link:hover, + .main-container .sub-nav.clr-nav-level-2 .nav .nav-link.active { + box-shadow: none; } + .main-container .sidenav.clr-nav-level-1 .nav-link:hover, .main-container .sidenav.clr-nav-level-1 .nav-link.active, + .main-container .sidenav.clr-nav-level-2 .nav-link:hover, + .main-container .sidenav.clr-nav-level-2 .nav-link.active { + color: inherit; + background: #fff; } + .main-container .sidenav.clr-nav-level-1, + .main-container .sidenav.clr-nav-level-2, + .main-container .clr-vertical-nav.clr-nav-level-1, + .main-container .clr-vertical-nav.clr-nav-level-2 { + border-right: none; } + .main-container .header-overflow-trigger { + position: relative; } + .main-container .header-overflow-trigger::after { + position: absolute; + content: ''; + display: inline-block; + background: #fafafa; + opacity: 0.15; + height: 1.666667rem; + width: 1px; + top: 0.416667rem; + left: 0; } + .main-container .header .branding { + max-width: 10rem; + min-width: 0; + overflow: hidden; } + .main-container .header .header-hamburger-trigger + .branding { + padding-left: 0; } + .main-container .header .header-hamburger-trigger + .branding .clr-icon, + .main-container .header .header-hamburger-trigger + .branding .logo, + .main-container .header .header-hamburger-trigger + .branding clr-icon { + display: none; } + .main-container .header .branding + .header-overflow-trigger, + .main-container .header .header-nav + .header-overflow-trigger { + margin-left: auto; } + .main-container.open-hamburger-menu .header .header-backdrop, .main-container.open-overflow-menu .header .header-backdrop { + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: rgba(0, 0, 0, 0.85); + cursor: pointer; + z-index: 1038; } + .main-container.open-hamburger-menu .header .header-nav.clr-nav-level-1 .nav-link, + .main-container.open-hamburger-menu .header .header-nav.clr-nav-level-2 .nav-link, .main-container.open-overflow-menu .header .header-nav.clr-nav-level-1 .nav-link, + .main-container.open-overflow-menu .header .header-nav.clr-nav-level-2 .nav-link { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + opacity: 1; + color: #565656; } + .main-container.open-hamburger-menu .header .header-nav.clr-nav-level-1 .nav-link .nav-icon, + .main-container.open-hamburger-menu .header .header-nav.clr-nav-level-1 .nav-link .fa, + .main-container.open-hamburger-menu .header .header-nav.clr-nav-level-2 .nav-link .nav-icon, + .main-container.open-hamburger-menu .header .header-nav.clr-nav-level-2 .nav-link .fa, .main-container.open-overflow-menu .header .header-nav.clr-nav-level-1 .nav-link .nav-icon, + .main-container.open-overflow-menu .header .header-nav.clr-nav-level-1 .nav-link .fa, + .main-container.open-overflow-menu .header .header-nav.clr-nav-level-2 .nav-link .nav-icon, + .main-container.open-overflow-menu .header .header-nav.clr-nav-level-2 .nav-link .fa { + display: none; } + .main-container.open-hamburger-menu .header .header-nav.clr-nav-level-1 .nav-link .nav-text, + .main-container.open-hamburger-menu .header .header-nav.clr-nav-level-2 .nav-link .nav-text, .main-container.open-overflow-menu .header .header-nav.clr-nav-level-1 .nav-link .nav-text, + .main-container.open-overflow-menu .header .header-nav.clr-nav-level-2 .nav-link .nav-text { + display: inline-block; + color: #565656; + line-height: 1rem; + padding: 0.25rem 0 0.25rem 1rem; + white-space: normal; + font-weight: normal; } + .main-container.open-hamburger-menu .header .header-nav.clr-nav-level-1 .nav-link .nav-icon + .nav-text, + .main-container.open-hamburger-menu .header .header-nav.clr-nav-level-2 .nav-link .nav-icon + .nav-text, .main-container.open-overflow-menu .header .header-nav.clr-nav-level-1 .nav-link .nav-icon + .nav-text, + .main-container.open-overflow-menu .header .header-nav.clr-nav-level-2 .nav-link .nav-icon + .nav-text { + display: inline-block; } + .main-container.open-hamburger-menu .header .header-nav.clr-nav-level-1 .nav-link:hover, .main-container.open-hamburger-menu .header .header-nav.clr-nav-level-1 .nav-link.active, + .main-container.open-hamburger-menu .header .header-nav.clr-nav-level-2 .nav-link:hover, + .main-container.open-hamburger-menu .header .header-nav.clr-nav-level-2 .nav-link.active, .main-container.open-overflow-menu .header .header-nav.clr-nav-level-1 .nav-link:hover, .main-container.open-overflow-menu .header .header-nav.clr-nav-level-1 .nav-link.active, + .main-container.open-overflow-menu .header .header-nav.clr-nav-level-2 .nav-link:hover, + .main-container.open-overflow-menu .header .header-nav.clr-nav-level-2 .nav-link.active { + color: #565656; + background-color: #fff; } + .main-container.open-hamburger-menu .header .header-nav.clr-nav-level-1 .nav-link:hover .nav-icon, .main-container.open-hamburger-menu .header .header-nav.clr-nav-level-1 .nav-link.active .nav-icon, + .main-container.open-hamburger-menu .header .header-nav.clr-nav-level-2 .nav-link:hover .nav-icon, + .main-container.open-hamburger-menu .header .header-nav.clr-nav-level-2 .nav-link.active .nav-icon, .main-container.open-overflow-menu .header .header-nav.clr-nav-level-1 .nav-link:hover .nav-icon, .main-container.open-overflow-menu .header .header-nav.clr-nav-level-1 .nav-link.active .nav-icon, + .main-container.open-overflow-menu .header .header-nav.clr-nav-level-2 .nav-link:hover .nav-icon, + .main-container.open-overflow-menu .header .header-nav.clr-nav-level-2 .nav-link.active .nav-icon { + fill: #007cbb; } + .main-container.open-hamburger-menu .header .header-nav.clr-nav-level-1 .nav-link:hover, + .main-container.open-hamburger-menu .header .header-nav.clr-nav-level-2 .nav-link:hover, .main-container.open-overflow-menu .header .header-nav.clr-nav-level-1 .nav-link:hover, + .main-container.open-overflow-menu .header .header-nav.clr-nav-level-2 .nav-link:hover { + text-decoration: none; } + .main-container.open-hamburger-menu .header .header-nav.clr-nav-level-1 .nav-link.active > .nav-text, + .main-container.open-hamburger-menu .header .header-nav.clr-nav-level-2 .nav-link.active > .nav-text, .main-container.open-overflow-menu .header .header-nav.clr-nav-level-1 .nav-link.active > .nav-text, + .main-container.open-overflow-menu .header .header-nav.clr-nav-level-2 .nav-link.active > .nav-text { + color: inherit; } + .main-container.open-hamburger-menu .clr-vertical-nav .nav-trigger, .main-container.open-overflow-menu .clr-vertical-nav .nav-trigger { + display: none; } + .main-container.open-hamburger-menu .header .branding { + position: fixed; + top: 0; + left: 0; + overflow: hidden; + width: 15rem; + max-width: 15rem; + z-index: 1040; + padding-left: 1rem; } + .main-container.open-hamburger-menu .header .branding > .nav-link { + overflow: hidden; } + .main-container.open-hamburger-menu .header .branding .clr-icon, + .main-container.open-hamburger-menu .header .branding .logo, + .main-container.open-hamburger-menu .header .branding clr-icon { + display: inline-block; } + .main-container.open-hamburger-menu .header .branding clr-icon[shape='vm-bug'], + .main-container.open-hamburger-menu .header .branding .clr-vmw-logo { + background-color: #737373; + border-radius: 0.125rem; } + .main-container.open-hamburger-menu .header .branding .title { + color: #565656; + text-overflow: ellipsis; + overflow: hidden; } + .main-container.open-hamburger-menu .header-hamburger-trigger { + position: fixed; + top: 0; + right: auto; + left: 0; + z-index: 1039; + transform: translateX(15.5rem); + transition: transform 0.6s ease; } + .main-container.open-hamburger-menu .header-hamburger-trigger::after { + content: none; } + .main-container.open-hamburger-menu .header-hamburger-trigger > span { + background: transparent; } + .main-container.open-hamburger-menu .header-hamburger-trigger > span::before, .main-container.open-hamburger-menu .header-hamburger-trigger > span::after { + left: 0.125rem; + transform-origin: 9%; + transition: transform 0.6s ease; } + .main-container.open-hamburger-menu .header-hamburger-trigger > span::before { + transform: rotate(45deg); } + .main-container.open-hamburger-menu .header-hamburger-trigger > span::after { + transform: rotate(-45deg); } + .main-container.open-hamburger-menu .header-nav.clr-nav-level-1, + .main-container.open-hamburger-menu .subnav.clr-nav-level-1, + .main-container.open-hamburger-menu .sub-nav.clr-nav-level-1, + .main-container.open-hamburger-menu .sidenav.clr-nav-level-1, + .main-container.open-hamburger-menu .clr-vertical-nav.clr-nav-level-1 { + padding-top: 3.5rem; + transform: translateX(0); + transition: transform 0.3s ease; } + .main-container.open-hamburger-menu .header-nav.clr-nav-level-1 .sidenav-content, + .main-container.open-hamburger-menu .subnav.clr-nav-level-1 .sidenav-content, + .main-container.open-hamburger-menu .sub-nav.clr-nav-level-1 .sidenav-content, + .main-container.open-hamburger-menu .sidenav.clr-nav-level-1 .sidenav-content, + .main-container.open-hamburger-menu .clr-vertical-nav.clr-nav-level-1 .sidenav-content { + padding-bottom: 1rem; } + .main-container.open-overflow-menu .header-nav.clr-nav-level-2, + .main-container.open-overflow-menu .subnav.clr-nav-level-2, + .main-container.open-overflow-menu .sub-nav.clr-nav-level-2, + .main-container.open-overflow-menu .sidenav.clr-nav-level-2, + .main-container.open-overflow-menu .clr-vertical-nav.clr-nav-level-2 { + transform: translateX(0); + transition: transform 0.3s ease; } + .main-container.open-overflow-menu .header-nav.clr-nav-level-2, + .main-container.open-overflow-menu .subnav.clr-nav-level-2, + .main-container.open-overflow-menu .sub-nav.clr-nav-level-2 { + padding-top: 1rem; } + .main-container.open-overflow-menu .header-overflow-trigger { + position: fixed; + top: 0; + right: 0; + left: auto; + z-index: 1039; + transform: translateX(-15.5rem); + transition: transform 0.6s ease; } + .main-container.open-overflow-menu .header-overflow-trigger::after { + content: none; } + .main-container.open-overflow-menu .header-overflow-trigger > span { + background: transparent; } + .main-container.open-overflow-menu .header-overflow-trigger > span::before, .main-container.open-overflow-menu .header-overflow-trigger > span::after { + height: 0.0833333rem; + width: 1rem; + left: -0.25rem; + transform-origin: -3%; + transition: transform 0.6s ease; } + .main-container.open-overflow-menu .header-overflow-trigger > span::before { + transform: rotate(45deg); } + .main-container.open-overflow-menu .header-overflow-trigger > span::after { + transform: rotate(-45deg); } + .main-container.open-hamburger-menu .header-nav.clr-nav-level-1, + .main-container.open-hamburger-menu .subnav.clr-nav-level-1, + .main-container.open-hamburger-menu .sub-nav.clr-nav-level-1, + .main-container.open-hamburger-menu .sidenav.clr-nav-level-1, + .main-container.open-hamburger-menu .clr-vertical-nav.clr-nav-level-1 { + width: 15rem; + max-width: 15rem; } + .main-container.open-overflow-menu .header-nav.clr-nav-level-2, + .main-container.open-overflow-menu .subnav.clr-nav-level-2, + .main-container.open-overflow-menu .sub-nav.clr-nav-level-2, + .main-container.open-overflow-menu .sidenav.clr-nav-level-2, + .main-container.open-overflow-menu .clr-vertical-nav.clr-nav-level-2 { + width: 15rem; + max-width: 15rem; } } + +@media screen and (max-width: 576px) { + .main-container .header .branding { + max-width: 6rem; + min-width: 0; + overflow: hidden; } + .main-container .header-nav.clr-nav-level-1, + .main-container .subnav.clr-nav-level-1, + .main-container .sub-nav.clr-nav-level-1, + .main-container .sidenav.clr-nav-level-1, + .main-container .clr-vertical-nav.clr-nav-level-1 { + transform: translateX(-12rem); } + .main-container .header-nav.clr-nav-level-2, + .main-container .subnav.clr-nav-level-2, + .main-container .sub-nav.clr-nav-level-2, + .main-container .sidenav.clr-nav-level-2, + .main-container .clr-vertical-nav.clr-nav-level-2 { + transform: translateX(12rem); } + .main-container.open-hamburger-menu .header .branding { + width: 12rem; + max-width: 12rem; } + .main-container.open-hamburger-menu .header-nav.clr-nav-level-1, + .main-container.open-hamburger-menu .subnav.clr-nav-level-1, + .main-container.open-hamburger-menu .sub-nav.clr-nav-level-1, + .main-container.open-hamburger-menu .sidenav.clr-nav-level-1, + .main-container.open-hamburger-menu .clr-vertical-nav.clr-nav-level-1 { + width: 12rem; + max-width: 12rem; } + .main-container.open-hamburger-menu .header-hamburger-trigger { + position: fixed; + top: 0; + right: auto; + left: 0; + z-index: 1039; + transform: translateX(12.5rem); + transition: transform 0.6s ease; } + .main-container.open-hamburger-menu .header-hamburger-trigger::after { + content: none; } + .main-container.open-overflow-menu .header-nav.clr-nav-level-2, + .main-container.open-overflow-menu .subnav.clr-nav-level-2, + .main-container.open-overflow-menu .sub-nav.clr-nav-level-2, + .main-container.open-overflow-menu .sidenav.clr-nav-level-2, + .main-container.open-overflow-menu .clr-vertical-nav.clr-nav-level-2 { + width: 12rem; + max-width: 12rem; } + .main-container.open-overflow-menu .header-overflow-trigger { + position: fixed; + top: 0; + right: 0; + left: auto; + z-index: 1039; + transform: translateX(-12.5rem); + transition: transform 0.6s ease; } + .main-container.open-overflow-menu .header-overflow-trigger::after { + content: none; } } + +.progress, +.progress-static { + background-color: transparent; + border-radius: 0; + font-size: inherit; + height: 2em; + margin: 0; + max-height: 0.583333rem; + min-height: 0.166667rem; + overflow: hidden; + display: block; + width: 100%; } + +.progress > progress { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + background-color: #eee; + border: none; + color: #007cbb; + height: 100%; + width: 100%; } + .progress > progress::-moz-progress-bar { + background-color: #007cbb; } + .progress > progress[value='0']::-moz-progress-bar { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + color: #eee; + min-width: 2rem; + background-color: transparent; + background-image: none; } + .progress > progress[value='0']::-webkit-progress-value { + transition: none; } + .progress > progress::-webkit-progress-bar { + background-color: #eee; + border-radius: 0; } + .progress > progress::-webkit-progress-inner-element { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; } + .progress > progress::-webkit-progress-value { + background-color: #007cbb; + transition: width 0.23s ease-in; + border-radius: 0; } + +.progress.success > progress { + color: #60b515; } + .progress.success > progress::-webkit-progress-value { + background-color: #60b515; } + .progress.success > progress::-moz-progress-bar { + background-color: #60b515; } + +.progress.warning > progress { + color: #c92100; } + .progress.warning > progress::-webkit-progress-value { + background-color: #c92100; } + .progress.warning > progress::-moz-progress-bar { + background-color: #c92100; } + +.progress.danger > progress { + color: #c92100; } + .progress.danger > progress::-webkit-progress-value { + background-color: #c92100; } + .progress.danger > progress::-moz-progress-bar { + background-color: #c92100; } + +.progress.labeled, +.progress-static.labeled { + position: relative; + padding-right: 3em; } + .progress.labeled > span, + .progress-static.labeled > span { + display: block; + font-size: 1em; + position: absolute; + top: 50%; + right: 0; + line-height: 1em; + margin-top: -0.375em; } + +@-webkit-keyframes clr-progress-fade { + from { + opacity: 1; } + to { + opacity: 0; } } + +@keyframes clr-progress-fade { + from { + opacity: 1; } + to { + opacity: 0; } } + +.progress.progress-fade > progress[value='100'], +.progress.progress-fade > progress[value='100'] + span { + -webkit-animation: clr-progress-fade 0.3s linear 0.5s forwards; + animation: clr-progress-fade 0.3s linear 0.5s forwards; } + +.progress.flash > progress, .progress.flash-danger > progress { + transition: color 0.1s ease-out 1s; } + .progress.flash > progress::-webkit-progress-value, .progress.flash-danger > progress::-webkit-progress-value { + transition: width 0.23s ease-in, background-color 0.1s ease-out 0.3s; } + .progress.flash > progress[value='0']::-webkit-progress-value, .progress.flash-danger > progress[value='0']::-webkit-progress-value { + transition: none; } + .progress.flash > progress::-moz-progress-bar, .progress.flash-danger > progress::-moz-progress-bar { + transition: width 0.23s ease-in, background-color 0.1s ease-out 0.3s; } + +.progress.flash > progress[value='100'] { + color: #60b515; } + .progress.flash > progress[value='100']::-webkit-progress-value { + background-color: #60b515; } + .progress.flash > progress[value='100']::-moz-progress-bar { + background-color: #60b515; } + +.progress.progress-fade.flash > progress[value='100'], +.progress.progress-fade.flash > progress[value='100'] + span { + -webkit-animation: clr-progress-fade 0.6s linear 1s forwards; + animation: clr-progress-fade 0.6s linear 1s forwards; } + +.progress.flash-danger > progress[value='100'] { + color: #c92100; } + .progress.flash-danger > progress[value='100']::-webkit-progress-value { + background-color: #c92100; } + .progress.flash-danger > progress[value='100']::-moz-progress-bar { + background-color: #c92100; } + +@-webkit-keyframes clr-progress-looper { + from { + left: -100%; } + to { + left: 100%; } } + +@keyframes clr-progress-looper { + from { + left: -100%; } + to { + left: 100%; } } + +.progress.loop { + position: relative; } + .progress.loop > progress { + overflow: hidden; + color: transparent; } + .progress.loop > progress::-webkit-progress-value { + background-color: transparent; } + .progress.loop > progress::-moz-progress-bar { + background-color: transparent; } + .progress.loop::after { + -webkit-animation: clr-progress-looper 2s ease-in-out infinite; + animation: clr-progress-looper 2s ease-in-out infinite; + content: ' '; + top: 0; + bottom: 0; + left: 0; + position: absolute; + display: block; + background-color: #007cbb; + width: 75%; } + .progress.loop.danger::after, .progress.loop.warning::after { + background-color: #c92100; } + .progress.loop.success::after { + background-color: #60b515; } + +.nav-item .progress::after { + top: 0; } + +.progress-static { + position: relative; + border: none; + width: 100%; } + .progress-static > .progress-meter { + background-color: #eee; + display: block; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; } + .progress-static > .progress-meter::before { + background-color: #007cbb; + top: 0; + bottom: 0; + left: 0; + position: absolute; + display: block; + width: 0%; + content: ' '; } + .progress-static > .progress-meter[data-value='1']::before, .progress-static > .progress-meter[data-value='2']::before, .progress-static > .progress-meter[data-value='3']::before { + width: 2%; } + .progress-static > .progress-meter[data-value='4']::before, .progress-static > .progress-meter[data-value='5']::before, .progress-static > .progress-meter[data-value='6']::before, .progress-static > .progress-meter[data-value='7']::before { + width: 5%; } + .progress-static > .progress-meter[data-value='8']::before, .progress-static > .progress-meter[data-value='9']::before, .progress-static > .progress-meter[data-value='10']::before, .progress-static > .progress-meter[data-value='11']::before, .progress-static > .progress-meter[data-value='12']::before { + width: 10%; } + .progress-static > .progress-meter[data-value='13']::before, .progress-static > .progress-meter[data-value='14']::before, .progress-static > .progress-meter[data-value='15']::before, .progress-static > .progress-meter[data-value='16']::before, .progress-static > .progress-meter[data-value='17']::before { + width: 15%; } + .progress-static > .progress-meter[data-value='18']::before, .progress-static > .progress-meter[data-value='19']::before, .progress-static > .progress-meter[data-value='20']::before, .progress-static > .progress-meter[data-value='21']::before, .progress-static > .progress-meter[data-value='22']::before { + width: 20%; } + .progress-static > .progress-meter[data-value='23']::before, .progress-static > .progress-meter[data-value='24']::before, .progress-static > .progress-meter[data-value='25']::before, .progress-static > .progress-meter[data-value='26']::before, .progress-static > .progress-meter[data-value='27']::before { + width: 25%; } + .progress-static > .progress-meter[data-value='28']::before, .progress-static > .progress-meter[data-value='29']::before, .progress-static > .progress-meter[data-value='30']::before, .progress-static > .progress-meter[data-value='31']::before, .progress-static > .progress-meter[data-value='32']::before { + width: 30%; } + .progress-static > .progress-meter[data-value='33']::before, .progress-static > .progress-meter[data-value='34']::before, .progress-static > .progress-meter[data-value='35']::before, .progress-static > .progress-meter[data-value='36']::before, .progress-static > .progress-meter[data-value='37']::before { + width: 35%; } + .progress-static > .progress-meter[data-value='38']::before, .progress-static > .progress-meter[data-value='39']::before, .progress-static > .progress-meter[data-value='40']::before, .progress-static > .progress-meter[data-value='41']::before, .progress-static > .progress-meter[data-value='42']::before { + width: 40%; } + .progress-static > .progress-meter[data-value='43']::before, .progress-static > .progress-meter[data-value='44']::before, .progress-static > .progress-meter[data-value='45']::before, .progress-static > .progress-meter[data-value='46']::before, .progress-static > .progress-meter[data-value='47']::before { + width: 45%; } + .progress-static > .progress-meter[data-value='48']::before, .progress-static > .progress-meter[data-value='49']::before, .progress-static > .progress-meter[data-value='50']::before, .progress-static > .progress-meter[data-value='51']::before, .progress-static > .progress-meter[data-value='52']::before { + width: 50%; } + .progress-static > .progress-meter[data-value='53']::before, .progress-static > .progress-meter[data-value='54']::before, .progress-static > .progress-meter[data-value='55']::before, .progress-static > .progress-meter[data-value='56']::before, .progress-static > .progress-meter[data-value='57']::before { + width: 55%; } + .progress-static > .progress-meter[data-value='58']::before, .progress-static > .progress-meter[data-value='59']::before, .progress-static > .progress-meter[data-value='60']::before, .progress-static > .progress-meter[data-value='61']::before, .progress-static > .progress-meter[data-value='62']::before { + width: 60%; } + .progress-static > .progress-meter[data-value='63']::before, .progress-static > .progress-meter[data-value='64']::before, .progress-static > .progress-meter[data-value='65']::before, .progress-static > .progress-meter[data-value='66']::before, .progress-static > .progress-meter[data-value='67']::before { + width: 65%; } + .progress-static > .progress-meter[data-value='68']::before, .progress-static > .progress-meter[data-value='69']::before, .progress-static > .progress-meter[data-value='70']::before, .progress-static > .progress-meter[data-value='71']::before, .progress-static > .progress-meter[data-value='72']::before { + width: 70%; } + .progress-static > .progress-meter[data-value='73']::before, .progress-static > .progress-meter[data-value='74']::before, .progress-static > .progress-meter[data-value='75']::before, .progress-static > .progress-meter[data-value='76']::before, .progress-static > .progress-meter[data-value='77']::before { + width: 75%; } + .progress-static > .progress-meter[data-value='78']::before, .progress-static > .progress-meter[data-value='79']::before, .progress-static > .progress-meter[data-value='80']::before, .progress-static > .progress-meter[data-value='81']::before, .progress-static > .progress-meter[data-value='82']::before { + width: 80%; } + .progress-static > .progress-meter[data-value='83']::before, .progress-static > .progress-meter[data-value='84']::before, .progress-static > .progress-meter[data-value='85']::before, .progress-static > .progress-meter[data-value='86']::before, .progress-static > .progress-meter[data-value='87']::before { + width: 85%; } + .progress-static > .progress-meter[data-value='88']::before, .progress-static > .progress-meter[data-value='89']::before, .progress-static > .progress-meter[data-value='90']::before, .progress-static > .progress-meter[data-value='91']::before, .progress-static > .progress-meter[data-value='92']::before { + width: 90%; } + .progress-static > .progress-meter[data-value='93']::before, .progress-static > .progress-meter[data-value='94']::before, .progress-static > .progress-meter[data-value='95']::before, .progress-static > .progress-meter[data-value='96']::before { + width: 95%; } + .progress-static > .progress-meter[data-value='97']::before, .progress-static > .progress-meter[data-value='98']::before, .progress-static > .progress-meter[data-value='99']::before { + width: 98%; } + .progress-static > .progress-meter[data-value='100']::before { + width: 100%; } + .progress-static.labeled > .progress-meter { + right: 3em; } + .progress-static.success > .progress-meter::before { + background-color: #60b515; } + .progress-static.warning > .progress-meter::before { + background-color: #c92100; } + .progress-static.danger > .progress-meter::before { + background-color: #c92100; } + +.card-block .progress, +.card-block .progress-static, +.card-footer .progress, +.card-footer .progress-static { + margin: 0; + margin-top: -0.5rem; + height: 0.15625rem; + position: absolute; + left: 0; } + +.card-block .progress > progress, +.card-block .progress-static > .progress-meter, +.card-footer .progress > progress, +.card-footer .progress-static > .progress-meter { + height: 0.15625rem; + position: absolute; } + +.card-block .progress.top, +.card-block .progress-static.top, +.card-footer .progress.top, +.card-footer .progress-static.top { + margin-top: 0; + top: 0; } + +.nav-item .progress, +.nav-item .progress-static { + margin: 0; + height: 0.2rem; + min-height: 0.2rem; + max-height: 0.2rem; + position: absolute; + left: 0; } + +.nav-item .progress > progress, +.nav-item .progress-static > .progress-meter { + height: 0.2rem; + min-height: 0.2rem; + max-height: 0.2rem; + position: absolute; } + +.progress-block { + display: -ms-flexbox; + display: flex; + width: 100%; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; } + .progress-block > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + padding-right: 0.5rem; } + .progress-block > *:first-child { + padding-right: 0.75rem; } + .progress-block > *:last-child { + padding-right: 0; } + .progress-block > label { + font-weight: 600; } + .progress-block > .progress, + .progress-block > .progress-static { + -ms-flex: 0 1 auto; + flex: 0 1 auto; } + .progress-block > .progress-group { + -ms-flex-direction: column; + flex-direction: column; + height: auto; + -ms-flex: 0 1 auto; + flex: 0 1 auto; + display: -ms-flexbox; + display: flex; + width: 100%; } + .progress-block > .progress-group .row { + margin-left: 0; + margin-right: 0; } + .progress-block > .progress-group .row > [class*='col-'] { + padding-left: 0; + padding-right: 0; } + +.card-block .progress-block { + margin-bottom: 0.5rem; + padding: 0; } + .card-block .progress-block:last-child { + margin-bottom: 0; } + .card-block .progress-block > label { + max-width: 33%; + line-height: 0.75rem; } + .card-block .progress-block .progress, + .card-block .progress-block .progress-static { + position: relative; + height: 0.533292rem; + margin-top: 0; } + .card-block .progress-block .progress > progress, + .card-block .progress-block .progress > .progress-meter, + .card-block .progress-block .progress-static > progress, + .card-block .progress-block .progress-static > .progress-meter { + height: 0.533292rem; } + +_:-ms-input-placeholder .progress-block > label, +:root .progress-block > label { + display: inline-block; } + +.spinner { + position: relative; + display: inline-block; + min-height: 3rem; + min-width: 3rem; + height: 3rem; + width: 3rem; + -webkit-animation: spin 1s linear infinite; + animation: spin 1s linear infinite; + margin: 0; + padding: 0; + background: url("data:image/svg+xml;charset=utf8,%3Csvg%20id%3D%22Layer_2%22%20data-name%3D%22Layer%202%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2072%2072%22%3E%0A%20%20%20%20%3Cdefs%3E%0A%20%20%20%20%20%20%20%20%3Cstyle%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20.cls-1%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20.cls-2%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20fill%3A%20none%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stroke-miterlimit%3A%2010%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stroke-width%3A%205px%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20.cls-1%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stroke%3A%20%23000%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stroke-opacity%3A%200.15%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20.cls-2%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stroke%3A%20%23007cbb%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%3C%2Fstyle%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%20%20%20%20%3Ctitle%3EPreloader_72x2%3C%2Ftitle%3E%0A%20%20%20%20%3Ccircle%20class%3D%22cls-1%22%20cx%3D%2236%22%20cy%3D%2236%22%20r%3D%2233%22%2F%3E%0A%20%20%20%20%3Cpath%20class%3D%22cls-2%22%20d%3D%22M14.3%2C60.9A33%2C33%2C0%2C0%2C1%2C36%2C3%22%3E%0A%20%20%20%20%3C%2Fpath%3E%0A%3C%2Fsvg%3E%0A"); + text-indent: 100%; + overflow: hidden; } + .spinner.spinner-md { + min-height: 1.5rem; + min-width: 1.5rem; + height: 1.5rem; + width: 1.5rem; } + .spinner.spinner-inline, .spinner.spinner-sm { + min-height: 0.75rem; + min-width: 0.75rem; + height: 0.75rem; + width: 0.75rem; } + .spinner.spinner-inline { + vertical-align: text-bottom; } + .spinner.spinner-inverse { + background: url("data:image/svg+xml;charset=utf8,%3Csvg%20id%3D%22Layer_2%22%20data-name%3D%22Layer%202%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2072%2072%22%3E%0A%20%20%20%20%3Cdefs%3E%0A%20%20%20%20%20%20%20%20%3Cstyle%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20.cls-1%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20.cls-2%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20fill%3A%20none%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stroke-miterlimit%3A%2010%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stroke-width%3A%205px%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20.cls-1%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stroke%3A%20%23fff%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stroke-opacity%3A%200.15%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20.cls-2%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stroke%3A%20%23007cbb%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%3C%2Fstyle%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%20%20%20%20%3Ctitle%3EPreloader_72x2%3C%2Ftitle%3E%0A%20%20%20%20%3Ccircle%20class%3D%22cls-1%22%20cx%3D%2236%22%20cy%3D%2236%22%20r%3D%2233%22%2F%3E%0A%20%20%20%20%3Cpath%20class%3D%22cls-2%22%20d%3D%22M14.3%2C60.9A33%2C33%2C0%2C0%2C1%2C36%2C3%22%3E%0A%20%20%20%20%3C%2Fpath%3E%0A%3C%2Fsvg%3E%0A"); } + .spinner.spinner-check { + -webkit-animation: none; + animation: none; + background: url("data:image/svg+xml;charset=utf8,%3Csvg%20version%3D%221.1%22%20viewBox%3D%220%200%2036%2036%22%20preserveAspectRatio%3D%22xMidYMid%20meet%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20focusable%3D%22false%22%20aria-hidden%3D%22true%22%20role%3D%22img%22%3E%3Cpath%20fill%3D%22%23007cbb%22%20class%3D%22clr-i-outline%20clr-i-outline-path-1%22%20d%3D%22M13.72%2C27.69%2C3.29%2C17.27a1%2C1%2C0%2C0%2C1%2C1.41-1.41l9%2C9L31.29%2C7.29a1%2C1%2C0%2C0%2C1%2C1.41%2C1.41Z%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E"); } + +.btn-sm .spinner, .alert-app-level .alert-item .btn .spinner { + min-height: 0.541667rem; + min-width: 0.541667rem; + height: 0.541667rem; + width: 0.541667rem; } + +@-webkit-keyframes spin { + 0% { + transform: rotate(0deg); } + 100% { + transform: rotate(360deg); } } + +@keyframes spin { + 0% { + transform: rotate(0deg); } + 100% { + transform: rotate(360deg); } } + +.table { + border-collapse: separate; + border: 1px solid #ccc; + border-radius: 0.125rem; + background-color: #fff; + color: #565656; + margin: 0; + margin-top: 1rem; + max-width: 100%; + width: 100%; } + .table th, + .table td { + font-size: 0.541667rem; + line-height: 0.583333rem; + border-top: 1px solid #eee; + padding: 0.458333rem 0.5rem 0.458333rem; + text-align: center; + vertical-align: top; } + .table th.left, + .table td.left { + text-align: left; } + .table th.left:first-child, + .table td.left:first-child { + padding-left: 0.25rem; } + .table th { + color: #565656; + font-size: 0.458333rem; + font-weight: 600; + letter-spacing: 0.03em; + background-color: #fafafa; + vertical-align: bottom; + border-bottom: 1px solid #ccc; + border-top: 0 none; } + .table tbody tr:first-child td { + border-top: 0 none; } + .table tbody + tbody { + border-top: 1px solid #ccc; } + .table thead th:first-child { + border-radius: calc(0.125rem - 1px) 0 0 0; } + .table thead th:last-child { + border-radius: 0 calc(0.125rem - 1px) 0 0; } + .table tbody:last-child tr:last-child td:first-child { + border-radius: 0 0 0 calc(0.125rem - 1px); } + .table tbody:last-child tr:last-child td:last-child { + border-radius: 0 0 calc(0.125rem - 1px) 0; } + +.table-compact th, +.table-compact td { + padding-top: calc(0.208334rem + 1px); + padding-bottom: calc(0.208334rem); } + +.table.table-vertical thead th { + border: 0 none; + border-radius: 0; + display: none; } + +.table.table-vertical th { + border-bottom: 0; + border-top: 1px solid #ccc; + vertical-align: top; } + +.table.table-vertical td, +.table.table-vertical th { + text-align: left; + border-color: #ccc; } + .table.table-vertical td:first-child, + .table.table-vertical th:first-child { + border-right: 1px solid #ccc; + background-color: #fafafa; + font-weight: 600; } + +.table.table-vertical tbody:first-of-type tr:first-child th, +.table.table-vertical tbody:first-of-type tr:first-child td { + border-top: 0 none; } + .table.table-vertical tbody:first-of-type tr:first-child th:first-child, + .table.table-vertical tbody:first-of-type tr:first-child td:first-child { + border-radius: calc(0.125rem - 1px) 0 0 0; } + .table.table-vertical tbody:first-of-type tr:first-child th:last-child, + .table.table-vertical tbody:first-of-type tr:first-child td:last-child { + border-radius: 0 calc(0.125rem - 1px) 0 0; } + +.table.table-vertical tbody:last-child tr:last-child th:first-child, +.table.table-vertical tbody:last-child tr:last-child td:first-child { + border-radius: 0 0 0 calc(0.125rem - 1px); } + +.table.table-vertical tbody:last-child tr:last-child th:last-child, +.table.table-vertical tbody:last-child tr:last-child td:last-child { + border-radius: 0 0 calc(0.125rem - 1px) 0; } + +.table.table-noborder { + border-radius: 0; + box-shadow: none; + background-color: transparent; + border: 0; } + .table.table-noborder th { + background-color: transparent; + border-bottom-color: #ddd; + border-top: 0 none; } + .table.table-noborder th:first-child { + border-right: 0 none; } + .table.table-noborder td { + border-top: 0 none; + padding-top: calc(0.458333rem + 1px); } + .table.table-noborder td:first-child { + border-right: 0 none; } + .table.table-noborder thead th:first-child, .table.table-noborder thead th:last-child { + border-radius: 0; } + .table.table-noborder th, + .table.table-noborder td { + border-radius: 0 !important; } + .table.table-noborder th:first-child, + .table.table-noborder td:first-child { + padding-left: 0; } + +.table.table-compact th, +.table.table-compact td { + padding-top: calc(0.208334rem + 1px); + padding-bottom: 0.208334rem; } + +.table.table-compact.table-noborder th, +.table.table-compact.table-noborder td { + padding-top: calc(0.208334rem + 2px); + padding-bottom: calc(0.208334rem + 1px); } + +.tooltip { + display: inline-block; + position: relative; + text-align: left; + overflow: visible; } + .tooltip > .tooltip-content { + visibility: hidden; + opacity: 0; + transition: opacity 0.3s linear; + white-space: normal; + z-index: 1070; } + .tooltip:hover { + background: url("data:image/svg+xml;charset=UTF-8,%3Csvg+xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22+width%3D%221%22+height%3D%221%22+viewBox%3D%220+0+1+1%22%3E%3Ctitle%3Etransparent+bcg%3C%2Ftitle%3E%3C%2Fsvg%3E"); } + .tooltip:hover > .tooltip-content, + .tooltip:focus > .tooltip-content { + visibility: visible; + opacity: 1; } + .tooltip:hover > .tooltip-content:empty, + .tooltip:focus > .tooltip-content:empty { + visibility: hidden; + opacity: 0; } + .tooltip:focus { + outline: 0; } + .tooltip:focus > :first-child { + outline-offset: 0.041667rem; + outline-width: 0.041667rem; + outline-color: #3b99fc; + outline-style: solid; } + .tooltip > .tooltip-content, + .tooltip.tooltip-top-right > .tooltip-content, + .tooltip .tooltip-content.tooltip-top-right { + font-size: 0.541667rem; + font-weight: 400; + letter-spacing: normal; + background: #000; + border-radius: 0.125rem; + color: #fff; + line-height: 0.75rem; + margin: 0; + padding: 0.375rem 0.5rem; + width: 10rem; + position: absolute; + top: auto; + bottom: 100%; + left: 50%; + right: auto; + border-bottom-left-radius: 0; + margin-bottom: 0.666667rem; } + .tooltip > .tooltip-content::before, + .tooltip.tooltip-top-right > .tooltip-content::before, + .tooltip .tooltip-content.tooltip-top-right::before { + position: absolute; + bottom: -0.375rem; + left: 0; + top: auto; + right: auto; + content: ''; + border-left: 0.25rem solid #000; + border-top: 0.208333rem solid #000; + border-right: 0.25rem solid transparent; + border-bottom: 0.208333rem solid transparent; } + .tooltip.tooltip-top-left > .tooltip-content, + .tooltip .tooltip-content.tooltip-top-left { + font-size: 0.541667rem; + font-weight: 400; + letter-spacing: normal; + background: #000; + border-radius: 0.125rem; + color: #fff; + line-height: 0.75rem; + margin: 0; + padding: 0.375rem 0.5rem; + width: 10rem; + position: absolute; + top: auto; + bottom: 100%; + right: 50%; + left: auto; + border-bottom-right-radius: 0; + margin-bottom: 0.666667rem; } + .tooltip.tooltip-top-left > .tooltip-content::before, + .tooltip .tooltip-content.tooltip-top-left::before { + position: absolute; + bottom: -0.375rem; + right: 0; + top: auto; + left: auto; + content: ''; + border-right: 0.25rem solid #000; + border-top: 0.208333rem solid #000; + border-left: 0.25rem solid transparent; + border-bottom: 0.208333rem solid transparent; } + .tooltip.tooltip-bottom-right > .tooltip-content, + .tooltip .tooltip-content.tooltip-bottom-right { + font-size: 0.541667rem; + font-weight: 400; + letter-spacing: normal; + background: #000; + border-radius: 0.125rem; + color: #fff; + line-height: 0.75rem; + margin: 0; + padding: 0.375rem 0.5rem; + width: 10rem; + position: absolute; + bottom: auto; + top: 100%; + left: 50%; + right: auto; + border-top-left-radius: 0; + margin-top: 0.666667rem; } + .tooltip.tooltip-bottom-right > .tooltip-content::before, + .tooltip .tooltip-content.tooltip-bottom-right::before { + position: absolute; + top: -0.375rem; + left: 0; + bottom: auto; + right: auto; + content: ''; + border-left: 0.25rem solid #000; + border-bottom: 0.208333rem solid #000; + border-right: 0.25rem solid transparent; + border-top: 0.208333rem solid transparent; } + .tooltip.tooltip-bottom-left > .tooltip-content, + .tooltip .tooltip-content.tooltip-bottom-left { + font-size: 0.541667rem; + font-weight: 400; + letter-spacing: normal; + background: #000; + border-radius: 0.125rem; + color: #fff; + line-height: 0.75rem; + margin: 0; + padding: 0.375rem 0.5rem; + width: 10rem; + position: absolute; + bottom: auto; + top: 100%; + right: 50%; + left: auto; + border-top-right-radius: 0; + margin-top: 0.666667rem; } + .tooltip.tooltip-bottom-left > .tooltip-content::before, + .tooltip .tooltip-content.tooltip-bottom-left::before { + position: absolute; + top: -0.375rem; + right: 0; + bottom: auto; + left: auto; + content: ''; + border-right: 0.25rem solid #000; + border-bottom: 0.208333rem solid #000; + border-left: 0.25rem solid transparent; + border-top: 0.208333rem solid transparent; } + .tooltip.tooltip-right > .tooltip-content, + .tooltip .tooltip-content.tooltip-right { + position: absolute; + right: auto; + left: 100%; + top: 50%; + bottom: auto; + font-size: 0.541667rem; + font-weight: 400; + letter-spacing: normal; + background: #000; + border-radius: 0.125rem; + color: #fff; + line-height: 0.75rem; + margin: 0; + padding: 0.375rem 0.5rem; + width: 10rem; + border-top-left-radius: 0; + margin-left: 0.666667rem; } + .tooltip.tooltip-right > .tooltip-content::before, + .tooltip .tooltip-content.tooltip-right::before { + position: absolute; + top: 0; + left: -0.375rem; + bottom: auto; + right: auto; + content: ''; + border-top: 0.25rem solid #000; + border-right: 0.208333rem solid #000; + border-bottom: 0.25rem solid transparent; + border-left: 0.208333rem solid transparent; } + .tooltip.tooltip-left > .tooltip-content, + .tooltip .tooltip-content.tooltip-left { + position: absolute; + left: auto; + right: 100%; + top: 50%; + bottom: auto; + font-size: 0.541667rem; + font-weight: 400; + letter-spacing: normal; + background: #000; + border-radius: 0.125rem; + color: #fff; + line-height: 0.75rem; + margin: 0; + padding: 0.375rem 0.5rem; + width: 10rem; + border-top-right-radius: 0; + margin-right: 0.666667rem; } + .tooltip.tooltip-left > .tooltip-content::before, + .tooltip .tooltip-content.tooltip-left::before { + position: absolute; + top: 0; + right: -0.375rem; + bottom: auto; + left: auto; + content: ''; + border-top: 0.25rem solid #000; + border-left: 0.208333rem solid #000; + border-bottom: 0.25rem solid transparent; + border-right: 0.208333rem solid transparent; } + .tooltip.tooltip-xs > .tooltip-content, + .tooltip .tooltip-content.tooltip-xs { + width: 3rem; } + .tooltip.tooltip-sm > .tooltip-content, + .tooltip .tooltip-content.tooltip-sm { + width: 5rem; } + .tooltip.tooltip-md > .tooltip-content, + .tooltip .tooltip-content.tooltip-md { + width: 10rem; } + .tooltip.tooltip-lg > .tooltip-content, + .tooltip .tooltip-content.tooltip-lg { + width: 15rem; } + +.tooltip > .btn + .tooltip-content, +.tooltip.tooltip-top-right > .btn + .tooltip-content, +.tooltip.tooltip-top-left > .btn + .tooltip-content { + margin-bottom: 0.416667rem; } + +.tooltip.tooltip-bottom-right > .btn + .tooltip-content, +.tooltip.tooltip-bottom-left > .btn + .tooltip-content { + margin-top: 0.416667rem; } + +.tooltip.tooltip-right > .btn + .tooltip-content { + margin-left: 0.166667rem; } + +.tooltip > .clr-icon { + margin-right: 0; } + +.tooltip clr-icon > svg { + pointer-events: none; } + +.tooltip-trigger:focus + .tooltip-content { + visibility: visible; } + +.clr-form-control { + margin-top: 1rem; + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-align: start; + align-items: flex-start; } + +.clr-form-control-disabled { + opacity: 0.54; } + +.clr-form-control-multi { + -ms-flex-direction: row; + flex-direction: row; + -ms-flex-wrap: wrap; + flex-wrap: wrap; } + .clr-form-control-multi .clr-control-label { + width: 100%; } + +.clr-control-label { + display: block; + color: #444444; + font-size: 0.541667rem; + font-weight: 600; + line-height: 0.75rem; } + +.clr-control-container { + display: inline-block; } + +.clr-subtext { + display: block; + font-size: 0.458333rem; + line-height: 0.5rem; + color: #737373; + margin-top: 0.25rem; } + +.clr-validate-icon { + width: 1rem; + height: 1rem; + min-width: 1rem; + min-height: 1rem; + display: inline-block; + color: #c92100; + display: none; + margin-left: -1rem; } + +.clr-error .clr-validate-icon { + margin-left: -4px; + display: inline-block; } + +.clr-error .clr-subtext { + color: #c92100; } + +.clr-form-horizontal .clr-control-label, +.clr-form-horizontal .clr-form-control.clr-form-control-multi .clr-control-label { + width: 8rem; + -ms-flex-negative: 0; + flex-shrink: 0; } + +.clr-form-horizontal.row .clr-control-label { + width: auto; } + +.clr-form-horizontal .clr-form-control { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: row; + flex-direction: row; } + +.clr-form-compact .clr-form-control > .clr-control-label { + width: 8rem; + min-width: 8rem; } + +.clr-form-compact .clr-form-control.clr-row > .clr-control-label { + width: auto; + min-width: auto; } + +.clr-form-compact .clr-control-label { + margin-top: 0.125rem; } + +.clr-form-compact .clr-form-control { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: row; + flex-direction: row; + margin-top: 0.5rem; } + +.clr-form-compact .clr-control-container { + display: -ms-flexbox; + display: flex; } + +.clr-form-compact .clr-subtext { + margin-top: 0.25rem; + margin-left: 0.25rem; } + +.clr-form { + padding: 0.25rem; } + +.clr-form-group { + padding: 0.25rem; } + +.clr-checkbox-wrapper { + position: relative; } + .clr-checkbox-wrapper .clr-control-label { + font-weight: normal; + display: block; } + .clr-checkbox-wrapper ~ .clr-validate-icon { + margin-left: 0; } + .clr-checkbox-wrapper ~ .clr-subtext { + display: inline-block; } + .clr-checkbox-wrapper input[type='checkbox'] { + position: absolute; + opacity: 0; + top: 5px; + left: 0; + height: 0.66667rem; + width: 0.66667rem; } + .clr-checkbox-wrapper label { + position: relative; + margin-top: 0.25rem; + display: inline-block; + color: #000; + min-height: 1rem; + padding-left: 0.916667rem; + margin-top: 0; + cursor: pointer; + line-height: 1rem; } + .clr-checkbox-wrapper input[type='checkbox'] + label::before { + position: absolute; + top: 0.166666rem; + left: 0; + content: ''; + display: inline-block; + height: 0.666667rem; + width: 0.666667rem; + border: 1px solid #9a9a9a; + border-radius: 0.125rem; } + .clr-checkbox-wrapper input[type='checkbox']:focus + label::before { + outline: 0; + box-shadow: 0 0 2px 2px #6bc1e3; } + .clr-checkbox-wrapper input[type='checkbox'] + label::after { + position: absolute; + content: ''; + display: none; + height: 0.208333rem; + width: 0.333334rem; + border-left: 0.083333rem solid #fff; + border-bottom: 0.083333rem solid #fff; + top: 0.166666rem; + left: 0.166667rem; + transform: translate(0, 0.166667rem) rotate(-45deg); + border-color: #fff; } + .clr-checkbox-wrapper input[type='checkbox']:checked + label::before { + background: #007cbb; + border: none; } + .clr-checkbox-wrapper input[type='checkbox']:checked + label::after { + display: inline-block; } + .clr-checkbox-wrapper input[type='checkbox'].clr-indeterminate + label::before { + border: 1px solid #007cbb; } + .clr-checkbox-wrapper input[type='checkbox'].clr-indeterminate + label::after { + border-left: none; + border-bottom-color: #007cbb; + display: inline-block; + transform: translate(0, 0.166667rem); } + .clr-checkbox-wrapper.clr-checkbox-inline { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-line-pack: start; + align-content: flex-start; } + .clr-checkbox-wrapper.clr-checkbox-inline .clr-control-label { + display: inline-block; + margin-right: 0.5rem; + width: auto; } + +.clr-form-control-disabled .clr-checkbox-wrapper input[type='checkbox'] + label::before, +.clr-form-control-disabled .clr-checkbox-wrapper input[type='checkbox']:checked + label::before { + background-color: #ccc; + border: none; } + +.clr-form-control-disabled .clr-checkbox-wrapper input[type='checkbox']:checked + label::after { + border-left: 0.083333rem solid #000; + border-bottom: 0.083333rem solid #000; } + +.clr-form-control-disabled .clr-checkbox-wrapper input[type='checkbox']:checked.clr-indeterminate + label::after { + border-left: none; } + +.clr-form-compact .clr-checkbox-wrapper { + max-width: 100%; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-line-pack: start; + align-content: flex-start; + height: 1rem; } + .clr-form-compact .clr-checkbox-wrapper ~ .clr-subtext { + margin-left: 0.25rem; } + .clr-form-compact .clr-checkbox-wrapper .clr-control-label { + display: inline-block; + margin-right: 0.5rem; + width: auto; } + .clr-form-compact .clr-checkbox-wrapper .clr-control-label { + margin-top: 0; } + +.clr-file-wrapper { + position: relative; + margin-top: 0.25rem; } + .clr-file-wrapper .clr-control-label { + font-weight: normal; + display: block; } + .clr-file-wrapper ~ .clr-validate-icon { + margin-left: 0; } + .clr-file-wrapper ~ .clr-subtext { + display: inline-block; } + .clr-file-wrapper .btn { + margin: 0; } + +.clr-file { + width: 0; + height: 0; + opacity: 0; + overflow: hidden; + position: absolute; + z-index: -1; } + +.clr-form-compact .clr-file-wrapper { + max-width: 100%; + margin-top: 0; } + .clr-form-compact .clr-file-wrapper ~ .clr-subtext { + margin-left: 0.25rem; } + .clr-form-compact .clr-file-wrapper ~ .clr-validate-icon { + line-height: 1rem; } + .clr-form-compact .clr-file-wrapper ~ .clr-subtext { + line-height: 1rem; + margin-top: 0; } + .clr-form-compact .clr-file-wrapper .clr-control-label { + margin-top: 0; + line-height: 0.9rem; } + .clr-form-compact .clr-file-wrapper .btn { + height: 1rem; } + +.clr-input-wrapper { + white-space: nowrap; + max-height: 1rem; } + +.clr-input { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + margin: 0; + padding: 0; + border: none; + border-radius: 0; + box-shadow: none; + background: none; + height: 1rem; + color: #000; + display: inline-block; + border-bottom: 1px solid #9a9a9a; + padding: 0 0.25rem; + max-height: 1rem; + font-size: 0.541667rem; } + .clr-input:focus { + outline: 0; } + .clr-input[readonly] { + border: none; } + .clr-input:not([readonly]) { + background: linear-gradient(to bottom, transparent 95%, #0094d2 95%) no-repeat; + background-size: 0% 100%; + transition: background-size 0.2s ease; } + .clr-input:not([readonly]):focus, .clr-input:not([readonly]).clr-focus { + border-bottom: 1px solid #0094d2; + background-size: 100% 100%; } + +.clr-error .clr-input:not([readonly]) { + border-bottom-color: #c92100; + background: linear-gradient(to bottom, transparent 95%, #c92100 95%) no-repeat; + background-size: 0% 100%; + transition: background-size 0.2s ease; } + .clr-error .clr-input:not([readonly]):focus, .clr-error .clr-input:not([readonly]).clr-focus { + border-bottom: 1px solid #c92100; + background-size: 100% 100%; } + +.clr-form-control.row .clr-input-wrapper { + max-width: calc(100% - 1rem); } + +.clr-form-compact .clr-input { + max-width: 100%; } + .clr-form-compact .clr-input ~ .clr-subtext { + margin-left: 0.25rem; } + +.clr-form-control-readonly .clr-input { + border: none; } + +.clr-form-control-multi .clr-input { + max-width: calc(100% + 1rem); } + +.clr-input-group { + color: #000; + display: inline-block; + border-bottom: 1px solid #9a9a9a; + background: linear-gradient(to bottom, transparent 95%, #0094d2 95%) no-repeat; + background-size: 0% 100%; + transition: background-size 0.2s ease; + margin-right: 1rem; + max-width: calc(100% - 1rem); } + .clr-input-group:focus, .clr-input-group.clr-focus { + border-bottom: 1px solid #0094d2; + background-size: 100% 100%; } + .clr-input-group .clr-input { + background: none; + border: none; + margin-right: 0; + max-width: 100%; } + .clr-input-group .clr-input:not([readonly]):focus { + background-size: 0%; + border: 0; } + .clr-input-group select { + border: none; } + .clr-input-group .clr-input-group-icon-action { + color: #0094d2; + cursor: pointer; } + +.clr-error .clr-input-group { + border-bottom-color: #c92100; + background: linear-gradient(to bottom, transparent 95%, #c92100 95%) no-repeat; + background-size: 0% 100%; + transition: background-size 0.2s ease; + margin-right: 0.25rem; } + .clr-error .clr-input-group:focus, .clr-error .clr-input-group.clr-focus { + border-bottom: 1px solid #c92100; + background-size: 100% 100%; } + +.clr-radio-wrapper { + position: relative; } + .clr-radio-wrapper .clr-control-label { + font-weight: normal; + display: block; } + .clr-radio-wrapper ~ .clr-validate-icon { + margin-left: 0; } + .clr-radio-wrapper ~ .clr-subtext { + display: inline-block; } + .clr-radio-wrapper input[type='radio'] { + position: absolute; + opacity: 0; + top: 5px; + left: 0; + height: 0.66667rem; + width: 0.66667rem; } + .clr-radio-wrapper label { + position: relative; + margin-top: 0.25rem; + display: inline-block; + color: #000; + min-height: 1rem; + padding-left: 0.916667rem; + margin-top: 0; + cursor: pointer; + line-height: 1rem; } + .clr-radio-wrapper label:empty { + padding-left: 0; } + .clr-radio-wrapper input[type='radio'] + label::before { + position: absolute; + top: 0.166666rem; + left: 0; + content: ''; + display: inline-block; + height: 0.666667rem; + width: 0.666667rem; + border: 1px solid #9a9a9a; + border-radius: 50%; } + .clr-radio-wrapper input[type='radio']:checked + label::before { + box-shadow: inset 0 0 0 0.25rem #007cbb; + border: none; } + .clr-radio-wrapper input[type='radio']:focus + label::before { + outline: 0; + box-shadow: 0 0 2px 2px #6bc1e3; } + .clr-radio-wrapper input[type='radio']:focus:checked + label::before { + outline: 0; + box-shadow: inset 0 0 0 0.25rem #007cbb, 0 0 2px 2px #6bc1e3; } + .clr-radio-wrapper.disabled input[type='radio']:checked + label::before { + background-color: #ccc; + box-shadow: inset 0 0 0 0.25rem #007cbb; } + .clr-radio-wrapper.clr-radio-inline { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-line-pack: start; + align-content: flex-start; } + .clr-radio-wrapper.clr-radio-inline .clr-control-label { + display: inline-block; + margin-right: 0.5rem; + width: auto; } + +.clr-form-compact .clr-radio-wrapper { + max-width: 100%; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-line-pack: start; + align-content: flex-start; + height: 1rem; } + .clr-form-compact .clr-radio-wrapper ~ .clr-subtext { + margin-left: 0.25rem; } + .clr-form-compact .clr-radio-wrapper .clr-control-label { + display: inline-block; + margin-right: 0.5rem; + width: auto; } + .clr-form-compact .clr-radio-wrapper .clr-control-label { + margin-top: 0; } + +.clr-select-wrapper, +.clr-multiselect-wrapper { + position: relative; + white-space: nowrap; } + .clr-select-wrapper select, + .clr-multiselect-wrapper select { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + margin: 0; + padding: 0; + border: none; + border-radius: 0; + box-shadow: none; + background: none; + height: 1rem; + color: #000; + display: inline-block; + border-bottom: 1px solid #9a9a9a; + background: linear-gradient(to bottom, transparent 95%, #0094d2 95%) no-repeat; + background-size: 0% 100%; + transition: background-size 0.2s ease; + position: relative; + padding: 0 0.916667rem 0 0.25rem; + cursor: pointer; + font-size: 0.541667rem; + z-index: 2; } + .clr-select-wrapper select:focus, + .clr-multiselect-wrapper select:focus { + outline: 0; } + .clr-select-wrapper select:focus, .clr-select-wrapper select.clr-focus, + .clr-multiselect-wrapper select:focus, + .clr-multiselect-wrapper select.clr-focus { + border-bottom: 1px solid #0094d2; + background-size: 100% 100%; } + .clr-select-wrapper select:hover, .clr-select-wrapper select:active, + .clr-multiselect-wrapper select:hover, + .clr-multiselect-wrapper select:active { + border-color: rgba(221, 221, 221, 0.5); + background: rgba(221, 221, 221, 0.5); } + .clr-select-wrapper select:disabled, + .clr-multiselect-wrapper select:disabled { + opacity: 0.5; + cursor: not-allowed; } + .clr-select-wrapper select option, + .clr-multiselect-wrapper select option { + color: #000; } + .clr-select-wrapper select::-ms-expand, + .clr-multiselect-wrapper select::-ms-expand { + display: none; } + +.clr-select-wrapper { + max-height: 1rem; + display: inline-block; } + .clr-select-wrapper::after { + position: absolute; + content: ''; + height: 0.416667rem; + width: 0.416667rem; + top: 0.291666rem; + right: 0.25rem; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2012%2012%22%3E%0A%20%20%20%20%3Cdefs%3E%0A%20%20%20%20%20%20%20%20%3Cstyle%3E.cls-1%7Bfill%3A%239a9a9a%3B%7D%3C%2Fstyle%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%20%20%20%20%3Ctitle%3ECaret%3C%2Ftitle%3E%0A%20%20%20%20%3Cpath%20class%3D%22cls-1%22%20d%3D%22M6%2C9L1.2%2C4.2a0.68%2C0.68%2C0%2C0%2C1%2C1-1L6%2C7.08%2C9.84%2C3.24a0.68%2C0.68%2C0%2C1%2C1%2C1%2C1Z%22%2F%3E%0A%3C%2Fsvg%3E%0A"); + background-repeat: no-repeat; + background-size: contain; + vertical-align: middle; + margin: 0; } + .clr-select-wrapper:hover::after { + color: #737373; } + +.clr-error .clr-select-wrapper::after { + right: 1.25rem; } + +.clr-multiselect-wrapper { + margin-top: 0.25rem; + display: -ms-flexbox; + display: flex; } + .clr-multiselect-wrapper .clr-validate-icon { + margin-left: 0; } + +select[multiple], +select[size] { + padding: 0; + background: #fff; + border: 1px solid #ccc; + border-radius: 0.125rem; + height: auto; } + select[multiple]:hover, select[multiple]:active, + select[size]:hover, + select[size]:active { + background: #fff; + border-color: #ccc; } + select[multiple] option, + select[size] option { + padding: 0.125rem 0.25rem; + color: #000; } + +.clr-form-control-disabled .clr-select.disabled { + opacity: 0.5; + cursor: not-allowed; } + .clr-form-control-disabled .clr-select.disabled:hover::after { + color: #9a9a9a; } + +.clr-form-control-disabled .clr-select.disabled > select, +.clr-form-control-disabled .clr-select select:disabled { + opacity: 0.5; + cursor: not-allowed; } + .clr-form-control-disabled .clr-select.disabled > select:hover, + .clr-form-control-disabled .clr-select select:disabled:hover { + background: none; + border-color: #9a9a9a; } + +.clr-form-compact .clr-multiselect-wrapper { + margin-top: 0; } + +.clr-textarea-wrapper { + white-space: nowrap; + display: -ms-flexbox; + display: flex; + margin-top: 0.25rem; } + .clr-textarea-wrapper .clr-validate-icon { + margin-left: 0; } + +.clr-textarea { + max-width: calc(100% - 0.25rem); + height: auto; + resize: vertical; + background: #fff; + border: 1px solid #9a9a9a; + color: #000; + border-radius: 0.125rem; + padding: calc(0.25rem + 2px) 0.5rem; + font-size: 0.541667rem; } + .clr-textarea:focus { + outline: 0; + box-shadow: 0 0 2px 2px #6bc1e3; } + +.clr-error .clr-textarea { + border-color: #c92100; } + .clr-error .clr-textarea:focus { + outline: 0; + box-shadow: 0 0 2px 2px #ff7d63; } + +.clr-control-container textarea { + width: auto; } + +.clr-form-control.row .clr-textarea-wrapper { + max-width: calc(100% - 0.25rem); } + +.clr-form-compact .clr-textarea-wrapper { + margin-top: 0; } + .clr-form-compact .clr-textarea-wrapper .clr-textarea { + max-width: 100%; } + .clr-form-compact .clr-textarea-wrapper .clr-textarea ~ .clr-subtext { + margin-left: 0.25rem; } + +input[type=text], input[type=password], input[type=number], input[type=email], input[type=url], input[type=tel], input[type=date], input[type=time], input[type=datetime-local] { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + margin: 0; + padding: 0; + border: none; + border-radius: 0; + box-shadow: none; + background: none; + height: 1rem; + color: #fff; + display: inline-block; + min-width: 2.5rem; + border-bottom: 1px solid #9a9a9a; + padding: 0 0.25rem; } + input[type=text]:focus, input[type=password]:focus, input[type=number]:focus, input[type=email]:focus, input[type=url]:focus, input[type=tel]:focus, input[type=date]:focus, input[type=time]:focus, input[type=datetime-local]:focus { + outline: 0; } + input[type=text]:not([readonly]), input[type=password]:not([readonly]), input[type=number]:not([readonly]), input[type=email]:not([readonly]), input[type=url]:not([readonly]), input[type=tel]:not([readonly]), input[type=date]:not([readonly]), input[type=time]:not([readonly]), input[type=datetime-local]:not([readonly]) { + background: linear-gradient(to bottom, transparent 95%, #0094d2 95%) no-repeat; + background-size: 0% 100%; + transition: background-size 0.2s ease; } + input[type=text]:not([readonly]):focus, input[type=password]:not([readonly]):focus, input[type=number]:not([readonly]):focus, input[type=email]:not([readonly]):focus, input[type=url]:not([readonly]):focus, input[type=tel]:not([readonly]):focus, input[type=date]:not([readonly]):focus, input[type=time]:not([readonly]):focus, input[type=datetime-local]:not([readonly]):focus { + border-bottom: 1px solid #0094d2; + background-size: 100% 100%; } + input[type=text][readonly], input[type=password][readonly], input[type=number][readonly], input[type=email][readonly], input[type=url][readonly], input[type=tel][readonly], input[type=date][readonly], input[type=time][readonly], input[type=datetime-local][readonly] { + border: none; } + +input[type=text]:disabled, input[type=password]:disabled, input[type=number]:disabled, input[type=email]:disabled, input[type=url]:disabled, input[type=tel]:disabled, input[type=date]:disabled, input[type=time]:disabled, input[type=datetime-local]:disabled, +input[type=button]:disabled, input[type=submit]:disabled, +textarea:disabled { + opacity: 0.5; + cursor: not-allowed; } + +textarea { + resize: vertical; + width: 100%; + background: #fff; + border: 1px solid #ccc; + color: #000; + border-radius: 0.125rem; + padding: 0.25rem 0.5rem; } + textarea:focus { + outline: 0; + box-shadow: 0 0 2px 2px #6bc1e3; } + +.checkbox { + display: block; } + +.checkbox-inline { + display: inline-block; } + +.checkbox, +.checkbox-inline { + position: relative; } + .checkbox input[type='checkbox'], + .checkbox-inline input[type='checkbox'] { + position: absolute; + top: 0.166666rem; + left: 0; + opacity: 0; + height: 0.666667rem; + width: 0.666667rem; } + .checkbox label, + .checkbox-inline label { + position: relative; + display: inline-block; + min-height: 1rem; + padding-left: 0.916667rem; + cursor: pointer; + line-height: 1rem; } + .checkbox input[type='checkbox'] + label::before, + .checkbox-inline input[type='checkbox'] + label::before { + position: absolute; + top: 0.166666rem; + left: 0; + content: ''; + display: inline-block; + height: 0.666667rem; + width: 0.666667rem; + border: 1px solid #9a9a9a; + border-radius: 0.125rem; } + .checkbox input[type='checkbox']:focus + label::before, + .checkbox-inline input[type='checkbox']:focus + label::before { + outline: 0; + box-shadow: 0 0 2px 2px #6bc1e3; } + .checkbox input[type='checkbox'] + label::after, + .checkbox-inline input[type='checkbox'] + label::after { + position: absolute; + content: ''; + display: none; + height: 0.208333rem; + width: 0.333334rem; + border-left: 0.083333rem solid white; + border-bottom: 0.083333rem solid white; + top: 0.166666rem; + left: 0.166667rem; + transform: translate(0, 0.166667rem) rotate(-45deg); + border-color: #fff; } + .checkbox input[type='checkbox']:checked + label::before, + .checkbox-inline input[type='checkbox']:checked + label::before { + background: #0094d2; + border: none; } + .checkbox input[type='checkbox']:checked + label::after, + .checkbox-inline input[type='checkbox']:checked + label::after { + display: inline-block; } + .checkbox input[type='checkbox']:indeterminate + label::before, + .checkbox-inline input[type='checkbox']:indeterminate + label::before { + border: 1px solid #0094d2; } + .checkbox input[type='checkbox']:indeterminate + label::after, + .checkbox-inline input[type='checkbox']:indeterminate + label::after { + border-left: none; + border-bottom-color: #0094d2; + display: inline-block; + transform: translate(0, 0.166667rem); } + .checkbox.disabled label, + .checkbox-inline.disabled label { + opacity: 0.5; + cursor: not-allowed; + color: #565656; } + .checkbox.disabled input[type='checkbox']:checked + label::before, + .checkbox-inline.disabled input[type='checkbox']:checked + label::before { + background-color: #ccc; } + .checkbox.disabled input[type='checkbox']:checked + label::after, + .checkbox-inline.disabled input[type='checkbox']:checked + label::after { + border-left: 0.083333rem solid #737373; + border-bottom: 0.083333rem solid #737373; } + +.radio { + display: block; } + +.radio-inline { + display: inline-block; } + +.radio, +.radio-inline { + position: relative; } + .radio input[type='radio'], + .radio-inline input[type='radio'] { + position: absolute; + top: 0.166666rem; + left: 0; + opacity: 0; + height: 0.666667rem; + width: 0.666667rem; } + .radio label, + .radio-inline label { + position: relative; + display: inline-block; + min-height: 1rem; + padding-left: 0.916667rem; + cursor: pointer; + line-height: 1rem; } + .radio label:empty, + .radio-inline label:empty { + padding-left: 0; } + .radio input[type='radio'] + label::before, + .radio-inline input[type='radio'] + label::before { + position: absolute; + top: 0.166666rem; + left: 0; + content: ''; + display: inline-block; + height: 0.666667rem; + width: 0.666667rem; + border: 1px solid #9a9a9a; + border-radius: 50%; } + .radio input[type='radio']:checked + label::before, + .radio-inline input[type='radio']:checked + label::before { + box-shadow: inset 0 0 0 0.25rem #0094d2; + border: none; } + .radio input[type='radio']:focus + label::before, + .radio-inline input[type='radio']:focus + label::before { + outline: 0; + box-shadow: 0 0 2px 2px #6bc1e3; } + .radio input[type='radio']:focus:checked + label::before, + .radio-inline input[type='radio']:focus:checked + label::before { + outline: 0; + box-shadow: inset 0 0 0 0.25rem #0094d2, 0 0 2px 2px #6bc1e3; } + .radio.disabled label, + .radio-inline.disabled label { + opacity: 0.5; + cursor: not-allowed; + color: #565656; } + .radio.disabled input[type='radio']:checked + label::before, + .radio-inline.disabled input[type='radio']:checked + label::before { + background-color: #ccc; + box-shadow: inset 0 0 0 0.25rem #0094d2; } + +.select { + position: relative; } + .select select { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + margin: 0; + padding: 0; + border: none; + border-radius: 0; + box-shadow: none; + background: none; + height: 1rem; + color: #000; + display: inline-block; + min-width: 2.5rem; + border-bottom: 1px solid #9a9a9a; + background: linear-gradient(to bottom, transparent 95%, #0094d2 95%) no-repeat; + background-size: 0% 100%; + transition: background-size 0.2s ease; + position: relative; + padding: 0 0.916667rem 0 0.25rem; + cursor: pointer; + width: 100%; + z-index: 2; } + .select select:focus { + outline: 0; } + .select select:focus { + border-bottom: 1px solid #0094d2; + background-size: 100% 100%; } + .select select:hover, .select select:active { + border-color: rgba(221, 221, 221, 0.5); + background: rgba(221, 221, 221, 0.5); } + .select select:disabled { + opacity: 0.5; + cursor: not-allowed; } + .select select option { + color: #000; } + .select select::-ms-expand { + display: none; } + .select::after { + position: absolute; + content: ''; + height: 0.416667rem; + width: 0.416667rem; + top: 0.291666rem; + right: 0.25rem; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2012%2012%22%3E%0A%20%20%20%20%3Cdefs%3E%0A%20%20%20%20%20%20%20%20%3Cstyle%3E.cls-1%7Bfill%3A%239a9a9a%3B%7D%3C%2Fstyle%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%20%20%20%20%3Ctitle%3ECaret%3C%2Ftitle%3E%0A%20%20%20%20%3Cpath%20class%3D%22cls-1%22%20d%3D%22M6%2C9L1.2%2C4.2a0.68%2C0.68%2C0%2C0%2C1%2C1-1L6%2C7.08%2C9.84%2C3.24a0.68%2C0.68%2C0%2C1%2C1%2C1%2C1Z%22%2F%3E%0A%3C%2Fsvg%3E%0A"); + background-repeat: no-repeat; + background-size: contain; + vertical-align: middle; + margin: 0; } + .select:hover::after { + color: #737373; } + .select.disabled { + opacity: 0.5; + cursor: not-allowed; } + .select.disabled:hover::after { + color: #9a9a9a; } + .select.disabled > select, + .select select:disabled { + opacity: 0.5; + cursor: not-allowed; } + .select.disabled > select:hover, + .select select:disabled:hover { + background: none; + border-color: #9a9a9a; } + .select.multiple::after { + content: none; } + +select[multiple], +select[size] { + padding: 0; + background: #fff; + border: 1px solid #ccc; + border-radius: 0.125rem; + height: auto; + min-width: 5rem; } + select[multiple]:hover, select[multiple]:active, + select[size]:hover, + select[size]:active { + background: #fff; + border-color: #ccc; } + select[multiple] option, + select[size] option { + padding: 0.125rem 0.25rem; + color: #000; } + +.date-container { + display: -ms-inline-flexbox; + display: inline-flex; + -ms-flex-align: center; + align-items: center; + white-space: nowrap; } + +.datepicker-trigger { + height: 1.5rem; + min-width: 1.5rem; + padding: 0 0; + margin: 0 !important; + color: inherit; + border: none; + border-radius: 0.125rem; + background: none; + cursor: pointer; + line-height: 1.5rem; } + .datepicker-trigger .datepicker-trigger-icon { + fill: #007cbb; } + .datepicker-trigger .datepicker-trigger-icon:hover { + fill: #004a70; } + +.date-input { + -ms-flex: 1 1 auto; + flex: 1 1 auto; } + +.datepicker { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + padding: 0.5rem; + margin-top: 0.25rem; + width: 11.583344rem; + height: 13.083344rem; + background: #fff; + border: 1px solid #ccc; + border-radius: 0.125rem; + box-shadow: 0 1px 0.125rem rgba(115, 115, 115, 0.25); + overflow: hidden; + z-index: 1000; } + +.calendar-header { + display: -ms-flexbox; + display: flex; + -ms-flex-pack: justify; + justify-content: space-between; + -ms-flex-align: center; + align-items: center; } + +.calendar-switchers, +.year-switchers { + display: -ms-flexbox; + display: flex; } + +.year-switchers { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 4.5rem; + -ms-flex-item-align: center; + -ms-grid-row-align: center; + align-self: center; } + +.calendar-table { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + width: 100%; } + +.calendar-cell { + height: 1.5rem; + width: 1.5rem; + min-height: 1.5rem; + min-width: 1.5rem; + padding: 0; + text-align: center; } + +.day { + display: inline-block; } + +.weekdays { + -ms-flex: 0 0 1.5rem; + flex: 0 0 1.5rem; } + +.weekday { + font-size: 0.5rem; + font-weight: 600; } + +.calendar-btn { + height: 1.5rem; + min-width: 1.5rem; + padding: 0 0; + margin: 0 !important; + color: inherit; + border: none; + border-radius: 0.125rem; + background: none; + cursor: pointer; + line-height: 1.5rem; + font-size: 0.75rem; + font-weight: 200; } + .calendar-btn:hover, .calendar-btn:focus { + background: #eee; } + .calendar-btn:focus { + outline: 0; } + +.day-btn { + height: 1.5rem; + min-width: 1.5rem; + padding: 0 0; + margin: 0 !important; + color: inherit; + border: none; + border-radius: 0.125rem; + background: none; + cursor: pointer; + line-height: 1.5rem; + width: 100%; + color: inherit; } + .day-btn:hover, .day-btn:focus { + background: #eee; } + .day-btn:focus { + outline: 0; } + .day-btn.is-today { + color: #000; + font-weight: 600; } + .day-btn.is-selected { + background: #d9e4ea; + color: #000; } + .day-btn.is-selected:focus { + background: #d9e4ea; } + .day-btn.is-disabled { + opacity: 0.25; } + .day-btn.is-disabled:hover { + background: none; } + +.calendar-pickers { + display: -ms-flexbox; + display: flex; } + +.switcher { + color: #0094d2; } + +.monthpicker-trigger, +.yearpicker-trigger { + min-width: 2rem; + max-width: 2.5rem; + color: #0094d2; + text-align: center; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } + +.monthpicker, +.yearpicker { + min-height: 12rem; } + +.monthpicker, +.yearpicker, +.years { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + overflow: hidden; } + +.monthpicker, +.years { + -ms-flex-wrap: wrap; + flex-wrap: wrap; } + +.month, +.year { + height: 2rem; + min-width: 2rem; + padding: 0 0.5rem; + margin: 0 !important; + color: inherit; + border: none; + border-radius: 0.125rem; + background: none; + cursor: pointer; + line-height: 1.5rem; + width: 5.25rem; + font-size: 0.75rem; + font-weight: 200; + outline-offset: -5px; } + .month:hover, .month:focus, + .year:hover, + .year:focus { + background: #eee; } + .month:focus, + .year:focus { + outline: 0; } + .month.is-selected, + .year.is-selected { + background: #d9e4ea; + color: #000; } + .month.is-selected:focus, + .year.is-selected:focus { + background: #d9e4ea; } + +.month { + text-align: center; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } + +.year { + text-align: center; } + +form, +.form { + padding-top: 0.5rem; } + form label, + form span, + .form label, + .form span { + display: inline-block; } + form .form-block, + .form .form-block { + margin: 0.5rem 0 1.5rem 0; } + form .form-block > label, + .form .form-block > label { + font-size: 0.666667rem; + letter-spacing: 0.01em; + font-weight: 400; + color: #000; + margin-bottom: 0.25rem; } + form .form-group, + .form .form-group { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + position: relative; + padding-left: 9.5rem; + margin-bottom: 0.5rem; + font-size: 0.541667rem; + letter-spacing: normal; + line-height: 1rem; } + form .form-group.row, + .form .form-group.row { + padding-left: 0; + position: static; } + form .form-group > label:first-child, + form .form-group > span:first-child, + .form .form-group > label:first-child, + .form .form-group > span:first-child { + position: absolute; + width: 8.5rem; + left: 0; + top: 0.25rem; + margin: 0; } + form .form-group.row > [class*='col-']:first-child > label, + form .form-group.row > [class*='col-']:first-child > span, + .form .form-group.row > [class*='col-']:first-child > label, + .form .form-group.row > [class*='col-']:first-child > span { + position: static; } + form .form-group > label:first-child, + form .form-group > span:first-child, + form .form-group.row > [class*='col-'] > label, + form .form-group.row > [class*='col-'] > span, + .form .form-group > label:first-child, + .form .form-group > span:first-child, + .form .form-group.row > [class*='col-'] > label, + .form .form-group.row > [class*='col-'] > span { + color: #000; } + form .form-group > label:first-child.required:after, + form .form-group > span:first-child.required:after, + form .form-group.row > [class*='col-'] > label.required:after, + form .form-group.row > [class*='col-'] > span.required:after, + .form .form-group > label:first-child.required:after, + .form .form-group > span:first-child.required:after, + .form .form-group.row > [class*='col-'] > label.required:after, + .form .form-group.row > [class*='col-'] > span.required:after { + content: '*'; + font-size: 0.58479532rem; + line-height: 0.5rem; + color: #c92100; + margin-left: 0.25rem; } + form .form-group .form-control, + .form .form-group .form-control { + width: 100%; } + form .form-group > label:not(:first-child), + form .form-group > span:not(:first-child), + form .form-group > input[type=text], form .form-group input[type=password], form .form-group input[type=number], form .form-group input[type=email], form .form-group input[type=url], form .form-group input[type=tel], form .form-group input[type=date], form .form-group input[type=time], form .form-group input[type=datetime-local], + form .form-group > .tooltip-validation, + form .form-group > .select, + form .form-group > .checkbox-inline, + form .form-group > .radio-inline, + form .form-group > button, + form .form-group > a, + form .form-group > input[type=button], form .form-group input[type=submit], + form .form-group > .btn, + .form .form-group > label:not(:first-child), + .form .form-group > span:not(:first-child), + .form .form-group > input[type=text], + .form .form-group input[type=password], + .form .form-group input[type=number], + .form .form-group input[type=email], + .form .form-group input[type=url], + .form .form-group input[type=tel], + .form .form-group input[type=date], + .form .form-group input[type=time], + .form .form-group input[type=datetime-local], + .form .form-group > .tooltip-validation, + .form .form-group > .select, + .form .form-group > .checkbox-inline, + .form .form-group > .radio-inline, + .form .form-group > button, + .form .form-group > a, + .form .form-group > input[type=button], + .form .form-group input[type=submit], + .form .form-group > .btn { + -ms-flex: 0 1 auto; + flex: 0 1 auto; + margin-left: 0; + margin-right: 0.5rem; } + form .form-group > .btn.btn-link, + .form .form-group > .btn.btn-link { + margin-right: 0; } + form .form-group > .checkbox, + form .form-group > .radio, + .form .form-group > .checkbox, + .form .form-group > .radio { + -ms-flex: 1 1 100%; + flex: 1 1 100%; + margin-left: 0; + margin-right: 1rem; } + form .form-group > .toggle-switch, + .form .form-group > .toggle-switch { + -ms-flex: 0 1 auto; + flex: 0 1 auto; + margin-left: 0; + margin-right: 1rem; } + form .form-group > textarea, + .form .form-group > textarea { + margin-left: 0; + margin-right: 0.5rem; } + form .form-group label, + form .form-group span, + form .form-group input[type=text], form .form-group input[type=password], form .form-group input[type=number], form .form-group input[type=email], form .form-group input[type=url], form .form-group input[type=tel], form .form-group input[type=date], form .form-group input[type=time], form .form-group input[type=datetime-local], + form .form-group .tooltip-validation, + form .form-group textarea, + form .form-group .select, + form .form-group .checkbox-inline, + form .form-group .radio-inline, + form .form-group .checkbox, + form .form-group .radio, + form .form-group .toggle-switch, + form .form-group button, + form .form-group a, + form .form-group input[type=button], form .form-group input[type=submit], + form .form-group .btn, + .form .form-group label, + .form .form-group span, + .form .form-group input[type=text], + .form .form-group input[type=password], + .form .form-group input[type=number], + .form .form-group input[type=email], + .form .form-group input[type=url], + .form .form-group input[type=tel], + .form .form-group input[type=date], + .form .form-group input[type=time], + .form .form-group input[type=datetime-local], + .form .form-group .tooltip-validation, + .form .form-group textarea, + .form .form-group .select, + .form .form-group .checkbox-inline, + .form .form-group .radio-inline, + .form .form-group .checkbox, + .form .form-group .radio, + .form .form-group .toggle-switch, + .form .form-group button, + .form .form-group a, + .form .form-group input[type=button], + .form .form-group input[type=submit], + .form .form-group .btn { + margin-top: 0.25rem; + margin-bottom: 0.25rem; } + form .form-group .btn-sm, form .form-group .alert-app-level .alert-item .btn, .alert-app-level .alert-item form .form-group .btn, + .form .form-group .btn-sm, + .form .form-group .alert-app-level .alert-item .btn, + .alert-app-level .alert-item .form .form-group .btn { + margin-top: 0.5rem; + margin-bottom: 0.5rem; } + form .form-group .tooltip-validation, + .form .form-group .tooltip-validation { + height: 1rem; } + form .form-group .tooltip-validation input, + .form .form-group .tooltip-validation input { + margin: 0; } + form .form-group .radio label, + form .form-group .checkbox label, + form .form-group .radio-inline label, + form .form-group .checkbox-inline label, + form .form-group .toggle-switch label, + .form .form-group .radio label, + .form .form-group .checkbox label, + .form .form-group .radio-inline label, + .form .form-group .checkbox-inline label, + .form .form-group .toggle-switch label { + margin-top: 0; + margin-bottom: 0; } + @media screen and (max-width: 576px) { + form .form-group, + .form .form-group { + padding-left: 0; + margin-bottom: 1rem; } + form .form-group > label:first-child, + form .form-group > label:not(:first-child), + form .form-group input[type=text], form .form-group input[type=password], form .form-group input[type=number], form .form-group input[type=email], form .form-group input[type=url], form .form-group input[type=tel], form .form-group input[type=date], form .form-group input[type=time], form .form-group input[type=datetime-local], + form .form-group .tooltip-validation, + form .form-group .select, + form .form-group .toggle-switch, + form .form-group .checkbox, + form .form-group .radio, + form .form-group .checkbox-inline, + form .form-group .radio-inline, + .form .form-group > label:first-child, + .form .form-group > label:not(:first-child), + .form .form-group input[type=text], + .form .form-group input[type=password], + .form .form-group input[type=number], + .form .form-group input[type=email], + .form .form-group input[type=url], + .form .form-group input[type=tel], + .form .form-group input[type=date], + .form .form-group input[type=time], + .form .form-group input[type=datetime-local], + .form .form-group .tooltip-validation, + .form .form-group .select, + .form .form-group .toggle-switch, + .form .form-group .checkbox, + .form .form-group .radio, + .form .form-group .checkbox-inline, + .form .form-group .radio-inline { + -ms-flex: 1 1 100%; + flex: 1 1 100%; } + form .form-group > label:first-child, + .form .form-group > label:first-child { + position: relative; + margin: 0 0 0.5rem 0; } + form .form-group > label:not(:first-child), + form .form-group span, + .form .form-group > label:not(:first-child), + .form .form-group span { + margin: 0.5rem 0.5rem 0 0; } + form .form-group .tooltip-validation input, + .form .form-group .tooltip-validation input { + margin: 0; + width: 100%; } } + +.tooltip.tooltip-validation > input { + padding-right: 1.166667rem; } + +.tooltip.tooltip-validation:hover > .tooltip-content { + visibility: hidden; + opacity: 0; } + +.tooltip.tooltip-validation.invalid > input { + border-bottom: 1px solid #c92100; + background: linear-gradient(to bottom, transparent 95%, #c92100 95%); + transition: none; } + +.tooltip.tooltip-validation.invalid > input:focus + .tooltip-content { + background: #c92100; + visibility: visible; + opacity: 1; } + +.tooltip.tooltip-validation.invalid > input:focus + .tooltip-content, +.tooltip.tooltip-validation.invalid.tooltip-top-right > input:focus + .tooltip-content, +.tooltip.tooltip-validation.invalid.tooltip-bottom-right > input:focus + .tooltip-content { + left: 100%; + right: auto; + margin-left: -0.583333rem; } + +.tooltip.tooltip-validation.invalid.tooltip-top-left > input:focus + .tooltip-content, +.tooltip.tooltip-validation.invalid.tooltip-bottom-left > input:focus + .tooltip-content { + right: 0; + left: auto; + margin-right: 0.583333rem; } + +.tooltip.tooltip-validation.invalid > .tooltip-content::before, +.tooltip.tooltip-validation.invalid.tooltip-top-right > .tooltip-content::before { + border-left-color: #c92100; + border-top-color: #c92100; + border-right-color: transparent; + border-bottom-color: transparent; } + +.tooltip.tooltip-validation.invalid.tooltip-top-left > .tooltip-content::before { + border-right-color: #c92100; + border-top-color: #c92100; + border-left-color: transparent; + border-bottom-color: transparent; } + +.tooltip.tooltip-validation.invalid.tooltip-bottom-right > .tooltip-content::before { + border-left-color: #c92100; + border-bottom-color: #c92100; + border-right-color: transparent; + border-top-color: transparent; } + +.tooltip.tooltip-validation.invalid.tooltip-bottom-left > .tooltip-content::before { + border-right-color: #c92100; + border-bottom-color: #c92100; + border-left-color: transparent; + border-top-color: transparent; } + +.tooltip.tooltip-validation.invalid.tooltip-left > input:focus + .tooltip-content { + right: 100%; + left: auto; + margin: 0 0.583333rem 0 0; } + .tooltip.tooltip-validation.invalid.tooltip-left > input:focus + .tooltip-content::before { + border-top-color: #c92100; + border-left-color: #c92100; + border-bottom-color: transparent; + border-right-color: transparent; } + +.tooltip.tooltip-validation.invalid.tooltip-right > input:focus + .tooltip-content { + left: 100%; + right: auto; + margin: 0 0 0 0.583333rem; } + .tooltip.tooltip-validation.invalid.tooltip-right > input:focus + .tooltip-content::before { + border-top-color: #c92100; + border-right-color: #c92100; + border-bottom-color: transparent; + border-left-color: transparent; } + +.tooltip.tooltip-validation.invalid::before { + position: absolute; + content: ''; + height: 0.666667rem; + width: 0.666667rem; + top: 0.125rem; + right: 0.25rem; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20version%3D%221.1%22%20viewBox%3D%225%205%2026%2026%22%20preserveAspectRatio%3D%22xMidYMid%20meet%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%3Cdefs%3E%3Cstyle%3E.clr-i-outline%7Bfill%3A%23a32100%3B%7D%3C%2Fstyle%3E%3C%2Fdefs%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctitle%3Eexclamation-circle-line%3C%2Ftitle%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22clr-i-outline%20clr-i-outline-path-1%22%20d%3D%22M18%2C6A12%2C12%2C0%2C1%2C0%2C30%2C18%2C12%2C12%2C0%2C0%2C0%2C18%2C6Zm0%2C22A10%2C10%2C0%2C1%2C1%2C28%2C18%2C10%2C10%2C0%2C0%2C1%2C18%2C28Z%22%3E%3C%2Fpath%3E%3Cpath%20class%3D%22clr-i-outline%20clr-i-outline-path-2%22%20d%3D%22M18%2C20.07a1.3%2C1.3%2C0%2C0%2C1-1.3-1.3v-6a1.3%2C1.3%2C0%2C1%2C1%2C2.6%2C0v6A1.3%2C1.3%2C0%2C0%2C1%2C18%2C20.07Z%22%3E%3C%2Fpath%3E%3Ccircle%20class%3D%22clr-i-outline%20clr-i-outline-path-3%22%20cx%3D%2217.95%22%20cy%3D%2223.02%22%20r%3D%221.5%22%3E%3C%2Fcircle%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fsvg%3E"); + background-repeat: no-repeat; + background-size: contain; + vertical-align: middle; + margin: 0; } + +form.compact .form-block, +.form.compact .form-block { + margin: 0.5rem 0 1rem 0; } + form.compact .form-block > label, + .form.compact .form-block > label { + margin-bottom: 0; } + +form.compact .form-group, +.form.compact .form-group { + margin-bottom: 0; } + +_:-ms-input-placeholder input[type=text], _:-ms-input-placeholder input[type=password], _:-ms-input-placeholder input[type=number], _:-ms-input-placeholder input[type=email], _:-ms-input-placeholder input[type=url], _:-ms-input-placeholder input[type=tel], _:-ms-input-placeholder input[type=date], _:-ms-input-placeholder input[type=time], _:-ms-input-placeholder input[type=datetime-local], +:root input[type=text], +:root input[type=password], +:root input[type=number], +:root input[type=email], +:root input[type=url], +:root input[type=tel], +:root input[type=date], +:root input[type=time], +:root input[type=datetime-local] { + padding-bottom: 0.125rem; } + +@supports (-ms-ime-align: auto) { + input[type=text], input[type=password], input[type=number], input[type=email], input[type=url], input[type=tel], input[type=date], input[type=time], input[type=datetime-local] { + padding-bottom: 0; } } + +.stack-header { + font-weight: clr-getTypePropertyValueForDomElement(stackview_text, font-weight); + display: -ms-flexbox; + display: flex; + -ms-flex-align: end; + align-items: flex-end; } + .stack-header .stack-title { + display: block; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding: 0.25rem 0; } + .stack-header .stack-actions { + display: block; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + .stack-header .stack-actions .stack-action { + margin: 0 0 0.25rem 0.5rem; } + .stack-header .stack-actions .stack-action.btn { + min-width: 0; + padding: 0 0.5rem; } + .stack-header .stack-actions .stack-action.btn-link { + margin-right: -0.5rem; } + +.stack-view { + color: #565656; + font-size: 0.541667rem; + font-weight: 400; + line-height: 1rem; + letter-spacing: normal; + margin-top: 0; + border: 1px solid #ccc; + border-radius: 0.125rem; + overflow-y: auto; + background-color: #fafafa; + word-wrap: break-word; + /* this fixes the overflow problem of children elements in a wrapper with a border-radius in Chrome */ + -webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC); + /* + * Styles specific to inputs used in a stack view + */ + /* + * Styles specific to stack views used in a modal + */ } + .stack-view dd, + .stack-view dt { + -webkit-margin-start: 0; + -moz-margin-start: 0; + margin-inline-start: 0; + margin-left: 0; } + .stack-view .stack-block { + display: -ms-flexbox; + display: flex; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + border-bottom: 1px solid #ddd; + overflow-y: hidden; } + .stack-view > .stack-block:last-child, + .stack-view > :last-child .stack-block:last-of-type { + border-bottom: none; + box-shadow: 0 1px 0 #ddd; } + .stack-view .stack-block-changed > .stack-block-label { + margin-left: -0.375rem; } + .stack-view .stack-block-changed::before { + content: ' '; + position: relative; + width: 0; + height: 0; + border-top: 0.375rem solid #006a91; + border-right: 0.375rem solid transparent; } + .stack-view .stack-block-label { + outline: none; } + .stack-view .stack-block-label, + .stack-view .stack-block-content { + padding: 0.25rem 0.5rem; + background-color: #fafafa; } + .stack-view .stack-block-label { + font-size: 0.541667rem; + font-weight: 500; + line-height: 1rem; + letter-spacing: normal; + color: #313131; + -ms-flex: 0 0 40%; + flex: 0 0 40%; + max-width: 40%; } + .stack-view .stack-block-label::before { + display: inline-block; + content: ''; + float: left; + height: 0.416667rem; + width: 0.416667rem; + margin: 0.291667rem 0.25rem 0 0; + text-align: center; } + .stack-view .stack-block-caret { + height: 0.5rem; + width: 0.5rem; + margin-right: 0.125rem; + fill: #9a9a9a; } + .stack-view .stack-block-content { + color: inherit; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + width: 60%; + margin-bottom: 0; + font-weight: clr-getTypePropertyValueForDomElement(stackview_text, font-weight); } + .stack-view .stack-block-content > :first-child { + margin-top: 0; } + .stack-view .stack-block-content > :last-child { + margin-bottom: 0; } + .stack-view .stack-children { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; } + .stack-view .stack-children .stack-block { + border-bottom-color: #eee; } + .stack-view .stack-children > .stack-block:last-child, + .stack-view .stack-children > :last-child .stack-block:last-of-type { + border-bottom: none; + box-shadow: 0 1px 0 #ddd; } + .stack-view .stack-children .stack-block-label, + .stack-view .stack-children .stack-block-content { + background-color: #fff; } + .stack-view .stack-children .stack-block-label { + padding-left: 1rem; } + .stack-view .stack-block-expandable > .stack-block-label { + cursor: pointer; } + .stack-view .stack-block-expandable > .stack-block-label::before { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2012%2012%22%3E%0A%20%20%20%20%3Cdefs%3E%0A%20%20%20%20%20%20%20%20%3Cstyle%3E.cls-1%7Bfill%3A%239a9a9a%3B%7D%3C%2Fstyle%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%20%20%20%20%3Ctitle%3ECaret%3C%2Ftitle%3E%0A%20%20%20%20%3Cpath%20class%3D%22cls-1%22%20d%3D%22M6%2C9L1.2%2C4.2a0.68%2C0.68%2C0%2C0%2C1%2C1-1L6%2C7.08%2C9.84%2C3.24a0.68%2C0.68%2C0%2C1%2C1%2C1%2C1Z%22%2F%3E%0A%3C%2Fsvg%3E%0A"); + background-repeat: no-repeat; + background-size: contain; + vertical-align: middle; + transform: rotate(-90deg); } + .stack-view .stack-block-expandable > .stack-block-label, + .stack-view .stack-block-expandable > .stack-block-content { + transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out; } + .stack-view .stack-block-expandable.on-focus:not(.stack-block-expanded) > .stack-block-label, + .stack-view .stack-block-expandable.on-focus:not(.stack-block-expanded) > .stack-block-content, .stack-view .stack-block-expandable:hover:not(.stack-block-expanded) > .stack-block-label, + .stack-view .stack-block-expandable:hover:not(.stack-block-expanded) > .stack-block-content { + background-color: #eee; } + .stack-view .stack-block-expanded > .stack-block-label::before { + transform: rotate(0deg); } + .stack-view .stack-block-expanded > .stack-block-label, + .stack-view .stack-block-expanded > .stack-block-content { + background-color: #d9e4ea; + color: #000; } + .stack-view input[type=text], .stack-view input[type=password], .stack-view input[type=number], .stack-view input[type=email], .stack-view input[type=url], .stack-view input[type=tel], .stack-view input[type=date], .stack-view input[type=time], .stack-view input[type=datetime-local], + .stack-view .select { + display: inline-block; + vertical-align: top; + margin-right: 0.5rem; + margin-bottom: 0px; } + .stack-view input[type=text], .stack-view input[type=password], .stack-view input[type=number], .stack-view input[type=email], .stack-view input[type=url], .stack-view input[type=tel], .stack-view input[type=date], .stack-view input[type=time], .stack-view input[type=datetime-local], + .stack-view .select select { + height: 1rem; } + .stack-view .stack-block-expandable > .stack-block-content input[type=text], .stack-view .stack-block-expandable > .stack-block-content input[type=password], .stack-view .stack-block-expandable > .stack-block-content input[type=number], .stack-view .stack-block-expandable > .stack-block-content input[type=email], .stack-view .stack-block-expandable > .stack-block-content input[type=url], .stack-view .stack-block-expandable > .stack-block-content input[type=tel], .stack-view .stack-block-expandable > .stack-block-content input[type=date], .stack-view .stack-block-expandable > .stack-block-content input[type=time], .stack-view .stack-block-expandable > .stack-block-content input[type=datetime-local] { + transition: background-size 0.2s ease, border-bottom-color 0.2s ease-in-out; } + .stack-view .stack-block-expandable > .stack-block-content .select select { + transition: border-bottom-color 0.2s ease-in-out; } + .stack-view .stack-block-expandable > .stack-block-content .select::after { + transition: color 0.2s ease-in-out; } + .stack-view .stack-block-expanded > .stack-block-content input[type=text], .stack-view .stack-block-expanded > .stack-block-content input[type=password], .stack-view .stack-block-expanded > .stack-block-content input[type=number], .stack-view .stack-block-expanded > .stack-block-content input[type=email], .stack-view .stack-block-expanded > .stack-block-content input[type=url], .stack-view .stack-block-expanded > .stack-block-content input[type=tel], .stack-view .stack-block-expanded > .stack-block-content input[type=date], .stack-view .stack-block-expanded > .stack-block-content input[type=time], .stack-view .stack-block-expanded > .stack-block-content input[type=datetime-local] { + border-bottom-color: #737373; + background: linear-gradient(to bottom, transparent 95%, #007cbb 95%) no-repeat; + background-size: 0% 100%; + transition: background-size 0.2s ease; } + .stack-view .stack-block-expanded > .stack-block-content input[type=text]:focus, .stack-view .stack-block-expanded > .stack-block-content input[type=password]:focus, .stack-view .stack-block-expanded > .stack-block-content input[type=number]:focus, .stack-view .stack-block-expanded > .stack-block-content input[type=email]:focus, .stack-view .stack-block-expanded > .stack-block-content input[type=url]:focus, .stack-view .stack-block-expanded > .stack-block-content input[type=tel]:focus, .stack-view .stack-block-expanded > .stack-block-content input[type=date]:focus, .stack-view .stack-block-expanded > .stack-block-content input[type=time]:focus, .stack-view .stack-block-expanded > .stack-block-content input[type=datetime-local]:focus { + border-bottom: 1px solid #007cbb; + background-size: 100% 100%; } + .stack-view .stack-block-expanded > .stack-block-content .select select { + border-bottom-color: #737373; } + .stack-view .stack-block-expanded > .stack-block-content .select::after { + color: #737373; } + .modal .stack-view { + height: 55vh; + margin-bottom: 0; } + +.stack-view clr-stack-block.stack-block-expandable .stack-block-label::before { + content: none; } + +.stack-view .stack-children clr-stack-block .stack-block-label { + padding-left: 1.5rem; } + +.clr-tree-node { + display: block; } + +@-moz-document url-prefix() { + .clr-tree-node { + overflow-y: hidden; } } + +.clr-tree-node-content-container { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; } + +.clr-treenode-content { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + border-radius: 0.125rem 0 0 0.125rem; + line-height: 1.25rem; } + .clr-treenode-content:first-child { + padding-left: 1.25rem; } + .clr-treenode-content clr-icon, + .clr-treenode-content .clr-icon { + height: 0.666667rem; + width: 0.666667rem; + margin-right: 0.25rem; + vertical-align: middle; } + +.clr-treenode-caret { + -ms-flex: 0 0 1.25rem; + flex: 0 0 1.25rem; + padding: 0; + margin: 0; + height: 1.25rem; + width: 1.25rem; + background: none; + border: none; + color: #9a9a9a; + cursor: pointer; + outline-offset: -5px; } + .clr-treenode-caret:hover { + color: #000; } + +.clr-tree-node-caret-icon { + height: 0.666667rem; + width: 0.666667rem; + vertical-align: middle; } + +.clr-treenode-spinner-container { + height: 1.25rem; + width: 1.25rem; + padding: 0.291666rem; } + +.clr-treenode-spinner { + min-height: 0.666667rem; + min-width: 0.666667rem; + height: 0.666667rem; + width: 0.666667rem; } + +.clr-treenode-children { + margin-left: 0.875rem; } + +.clr-treenode-link { + display: inline-block; + height: 100%; + margin: 0; + padding: 0 0 0 0.25rem; + width: 100%; + background: transparent; + border-radius: 0.125rem 0 0 0.125rem; + border-color: transparent; + color: #565656; + cursor: pointer; + line-height: inherit; + text-align: left; } + .clr-treenode-link:link, .clr-treenode-link:visited, .clr-treenode-link:active, .clr-treenode-link:hover { + color: inherit; } + .clr-treenode-link:hover, .clr-treenode-link:focus { + background: #eee; + text-decoration: none; } + .clr-treenode-link:focus { + outline: 0; } + .clr-treenode-link.active { + background: #d9e4ea; + color: #000; } + +.clr-treenode-checkbox { + height: 1.25rem; + width: 1.25rem; + padding-top: 0.125rem; + padding-left: 0.291666rem; } + .clr-treenode-checkbox:first-child { + margin-left: 1.25rem; } + +.clr-treenode-content .label { + margin-left: 0.25rem; } + +@supports (-ms-ime-align: auto) { + .clr-treenode-content .label { + margin-left: 0.125rem; } } + +_:-ms-input-placeholder .clr-treenode-content .label, +:root .clr-treenode-content .label { + margin-left: 0.125rem; } + +.datagrid { + border-collapse: separate; + border: 1px solid #ccc; + border-radius: 0.125rem; + background-color: #fff; + color: #565656; + margin: 0; + margin-top: 1rem; + max-width: 100%; + width: 100%; } + .datagrid .datagrid-column, .datagrid .datagrid-head .datagrid-row-actions, + .datagrid .datagrid-cell { + font-size: 0.541667rem; + line-height: 0.583333rem; + border-top: 1px solid #eee; + padding: 0.458333rem 0.5rem 0.458333rem; + text-align: center; + vertical-align: top; } + .datagrid .datagrid-column.left, .datagrid .datagrid-head .left.datagrid-row-actions, + .datagrid .datagrid-cell.left { + text-align: left; } + .datagrid .datagrid-column.left:first-child, .datagrid .datagrid-head .left.datagrid-row-actions:first-child, + .datagrid .datagrid-cell.left:first-child { + padding-left: 0.25rem; } + .datagrid .datagrid-column, .datagrid .datagrid-head .datagrid-row-actions { + color: #565656; + font-size: 0.458333rem; + font-weight: 600; + letter-spacing: 0.03em; + background-color: #fafafa; + vertical-align: bottom; + border-bottom: 1px solid #ccc; + border-top: 0 none; } + .datagrid .datagrid-body .datagrid-row:first-child .datagrid-cell { + border-top: 0 none; } + .datagrid .datagrid-body + .datagrid-body { + border-top: 1px solid #ccc; } + .datagrid .datagrid-head .datagrid-column:first-child, .datagrid .datagrid-head .datagrid-row-actions:first-child { + border-radius: calc(0.125rem - 1px) 0 0 0; } + .datagrid .datagrid-head .datagrid-column:last-child, .datagrid .datagrid-head .datagrid-row-actions:last-child { + border-radius: 0 calc(0.125rem - 1px) 0 0; } + .datagrid .datagrid-body:last-child .datagrid-row:last-child .datagrid-cell:first-child { + border-radius: 0 0 0 calc(0.125rem - 1px); } + .datagrid .datagrid-body:last-child .datagrid-row:last-child .datagrid-cell:last-child { + border-radius: 0 0 calc(0.125rem - 1px) 0; } + +.datagrid-compact .datagrid-column, .datagrid-compact .datagrid .datagrid-head .datagrid-row-actions, .datagrid .datagrid-head .datagrid-compact .datagrid-row-actions, +.datagrid-compact .datagrid-cell { + padding-top: calc(0.208334rem + 1px); + padding-bottom: calc(0.208334rem); } + +.datagrid-host { + display: -ms-flexbox; + display: flex; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + padding-top: 0.5rem; } + +.datagrid-overlay-wrapper { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: row; + flex-direction: row; + -ms-flex: 0 auto; + flex: 0 auto; + width: 100%; + min-height: 100%; + overflow-x: auto; + overflow-y: hidden; } + .datagrid-overlay-wrapper .datagrid-spinner { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + margin-left: -100%; + display: -ms-flexbox; + display: flex; + -ms-flex-pack: center; + justify-content: center; + -ms-flex-align: center; + align-items: center; + background: rgba(255, 255, 255, 0.6); } + +.datagrid-scroll-wrapper { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: row; + flex-direction: row; + min-width: 100%; } + +.datagrid { + display: -ms-flexbox; + display: flex; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + min-height: 1px; + margin-top: 0.5rem; } + +.datagrid-head, +.datagrid-body, +.datagrid-row, +.datagrid-column, +.datagrid .datagrid-head .datagrid-row-actions, +.datagrid-cell, +.datagrid-fixed-column { + display: block; } + +.datagrid-table-wrapper { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + display: -ms-flexbox; + display: flex; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + min-height: 1px; } + +.datagrid-body { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + overflow-y: auto; + -ms-overflow-style: -ms-autohiding-scrollbar; + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + min-height: 3rem; } + +.datagrid-head { + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + +.datagrid-row-flex { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + display: -ms-flexbox; + display: flex; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; } + + +.datagrid-column, +.datagrid .datagrid-head .datagrid-row-actions { + display: -ms-flexbox; + display: flex; + -ms-flex: 1 1 auto; + flex: 1 1 auto; } + .datagrid-column.datagrid-fixed-width, .datagrid .datagrid-head .datagrid-fixed-width.datagrid-row-actions { + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + .datagrid-column--hidden { + display: none; } + +.datagrid-cell { + -ms-flex: 1 1 auto; + flex: 1 1 auto; } + .datagrid-cell.datagrid-fixed-width { + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + .datagrid-cell--hidden { + display: none; } + +.datagrid-no-layout { + display: block; } + .datagrid-no-layout .datagrid-body, + .datagrid-no-layout .datagrid-row, + .datagrid-no-layout .datagrid-cell { + display: none; } + .datagrid-no-layout .datagrid-head, + .datagrid-no-layout .datagrid-head .datagrid-row, + .datagrid-no-layout .datagrid-column, + .datagrid-no-layout .datagrid .datagrid-head .datagrid-row-actions, + .datagrid .datagrid-head .datagrid-no-layout .datagrid-row-actions { + display: block; } + +.datagrid-computing-columns-width { + display: block; } + .datagrid-computing-columns-width .datagrid-body { + display: table; + table-layout: auto; } + .datagrid-computing-columns-width .datagrid-head { + display: table-header-group; } + .datagrid-computing-columns-width .datagrid-row { + display: table-row-group; } + .datagrid-computing-columns-width .datagrid-head .datagrid-row { + display: table-row; } + .datagrid-computing-columns-width .datagrid-row-master { + display: table-row; } + .datagrid-computing-columns-width .datagrid-row-detail { + display: none; } + .datagrid-computing-columns-width .datagrid-column, .datagrid-computing-columns-width .datagrid .datagrid-head .datagrid-row-actions, .datagrid .datagrid-head .datagrid-computing-columns-width .datagrid-row-actions, + .datagrid-computing-columns-width .datagrid-cell { + display: table-cell; } + .datagrid-computing-columns-width .datagrid-column-separator { + display: none; } + .datagrid-computing-columns-width .datagrid-placeholder-container { + display: none; } + .datagrid-computing-columns-width .datagrid-fixed-column { + display: none; } + +.datagrid { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + width: auto; + max-width: none; } + .datagrid .datagrid-body .datagrid-row:last-child .datagrid-cell:first-child { + border-radius: 0; } + .datagrid .datagrid-body .datagrid-row:last-child .datagrid-cell:last-child { + border-radius: 0; } + .datagrid .datagrid-column, .datagrid .datagrid-head .datagrid-row-actions, + .datagrid .datagrid-cell { + text-align: left; + min-width: 4rem; } + .datagrid .datagrid-column.datagrid-fixed-column, .datagrid .datagrid-head .datagrid-fixed-column.datagrid-row-actions, + .datagrid .datagrid-cell.datagrid-fixed-column { + -ms-flex: 0 0 1.583333rem; + flex: 0 0 1.583333rem; + max-width: 1.583333rem; + min-width: 1.583333rem; } + .datagrid .datagrid-head { + background-color: #fafafa; + border-bottom: 2px solid #ccc; } + .datagrid .datagrid-column, .datagrid .datagrid-head .datagrid-row-actions { + vertical-align: top; + background: none; + border-bottom: 0; } + .datagrid .datagrid-column .datagrid-column-title, .datagrid .datagrid-head .datagrid-row-actions .datagrid-column-title { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + margin: 0; + padding: 0; + border: none; + border-radius: 0; + box-shadow: none; + background: none; + color: #565656; + text-align: left; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + -ms-flex-item-align: start; + align-self: flex-start; } + .datagrid .datagrid-column button.datagrid-column-title:hover, .datagrid .datagrid-head .datagrid-row-actions button.datagrid-column-title:hover { + text-decoration: underline; + cursor: pointer; } + .datagrid .datagrid-column .datagrid-column-separator, .datagrid .datagrid-head .datagrid-row-actions .datagrid-column-separator { + position: relative; + left: 0.5rem; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 1px; + -ms-flex-order: 100; + order: 100; + margin-left: auto; } + .datagrid .datagrid-column .datagrid-column-separator::after, .datagrid .datagrid-head .datagrid-row-actions .datagrid-column-separator::after { + content: ''; + position: absolute; + height: calc(100% + 0.5rem - 1px); + width: 0.041667rem; + top: calc(-0.5 * 0.5rem + 1px); + left: 0; + background-color: #ddd; } + .datagrid .datagrid-column .datagrid-column-separator .datagrid-column-handle, .datagrid .datagrid-head .datagrid-row-actions .datagrid-column-separator .datagrid-column-handle { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + margin: 0; + padding: 0; + border: none; + border-radius: 0; + box-shadow: none; + background: none; + display: block; + position: absolute; + width: calc(0.5rem + 1px); + right: -0.25rem; + top: -0.25rem; + cursor: col-resize; + height: calc(100% + 0.5rem - 1px); } + .datagrid .datagrid-column .datagrid-column-separator .datagrid-column-handle-tracker, .datagrid .datagrid-head .datagrid-row-actions .datagrid-column-separator .datagrid-column-handle-tracker { + position: absolute; + right: 0; + top: -0.5rem; + display: none; + width: 0; + height: 100vh; + border-right: 1px dotted #89cbdf; } + .datagrid .datagrid-column .datagrid-column-separator .exceeded-max, .datagrid .datagrid-head .datagrid-row-actions .datagrid-column-separator .exceeded-max { + border-right: 1px dotted rgba(230, 39, 0, 0.3); } + .datagrid .datagrid-column:last-child .datagrid-column-separator, .datagrid .datagrid-head .datagrid-row-actions:last-child .datagrid-column-separator { + display: none; } + .datagrid .datagrid-column .datagrid-column-flex, .datagrid .datagrid-head .datagrid-row-actions .datagrid-column-flex { + display: -ms-flexbox; + display: flex; + -ms-flex: 1 1 auto; + flex: 1 1 auto; } + .datagrid .datagrid-column clr-dg-filter, .datagrid .datagrid-head .datagrid-row-actions clr-dg-filter, + .datagrid .datagrid-column clr-dg-string-filter, + .datagrid .datagrid-head .datagrid-row-actions clr-dg-string-filter { + display: -ms-flexbox; + display: flex; + -ms-flex-order: 99; + order: 99; + margin-left: auto; } + .datagrid .datagrid-column.asc, .datagrid .datagrid-head .asc.datagrid-row-actions, .datagrid .datagrid-column.desc, .datagrid .datagrid-head .desc.datagrid-row-actions { + font-weight: 600; } + .datagrid .datagrid-column.asc .datagrid-column-flex::after, .datagrid .datagrid-head .asc.datagrid-row-actions .datagrid-column-flex::after, .datagrid .datagrid-column.desc .datagrid-column-flex::after, .datagrid .datagrid-head .desc.datagrid-row-actions .datagrid-column-flex::after { + content: ''; + display: -ms-flexbox; + display: flex; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + vertical-align: middle; + width: 0.583333rem; + height: 0.583333rem; + margin-left: 0.25rem; + background-repeat: no-repeat; + background-size: contain; } + .datagrid .datagrid-column.asc .datagrid-column-flex::after, .datagrid .datagrid-head .asc.datagrid-row-actions .datagrid-column-flex::after { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20id%3D%22Layer_1%22%20data-name%3D%22Layer%201%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bfill%3A%23007cbb%3B%7D%3C%2Fstyle%3E%3C%2Fdefs%3E%3Ctitle%3Eicon%20artboards%20patch%202%20strokecenter%3C%2Ftitle%3E%3Cpath%20class%3D%22cls-1%22%20d%3D%22M8.5%2C3a0.5%2C0.5%2C0%2C0%2C0-.35.15l-3.5%2C3.5a0.5%2C0.5%2C0%2C0%2C0%2C.71.71L8.5%2C4.21l3.15%2C3.15a0.5%2C0.5%2C0%2C0%2C0%2C.71-0.71l-3.5-3.5A0.5%2C0.5%2C0%2C0%2C0%2C8.5%2C3Z%22%2F%3E%3Crect%20class%3D%22cls-1%22%20x%3D%228%22%20y%3D%224%22%20width%3D%221%22%20height%3D%2210%22%2F%3E%3C%2Fsvg%3E"); } + .datagrid .datagrid-column.desc .datagrid-column-flex::after, .datagrid .datagrid-head .desc.datagrid-row-actions .datagrid-column-flex::after { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20viewBox%3D%220%200%2016%2016%22%20style%3D%22enable-background%3Anew%200%200%2016%2016%3B%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cstyle%20type%3D%22text%2Fcss%22%3E%0A%09.st0%7Bfill%3A%23007cbb%3B%7D%0A%3C%2Fstyle%3E%0A%3Ctitle%3Eicon%20artboards%20patch%202%20strokecenter%3C%2Ftitle%3E%0A%3Cpath%20class%3D%22st0%22%20d%3D%22M8.5%2C13c-0.1%2C0.1-0.3%2C0-0.4-0.1L4.6%2C9.4c-0.2-0.2-0.2-0.5%2C0-0.7s0.5-0.2%2C0.7%2C0l3.1%2C3.1l3.1-3.2%0A%09c0.2-0.2%2C0.5-0.2%2C0.7%2C0s0.2%2C0.5%2C0%2C0.7C12.2%2C9.3%2C8.6%2C12.9%2C8.5%2C13z%22%2F%3E%0A%3Crect%20x%3D%228%22%20y%3D%223%22%20class%3D%22st0%22%20width%3D%221%22%20height%3D%229.3%22%2F%3E%0A%3C%2Fsvg%3E"); } + .datagrid .datagrid-column .datagrid-filter-toggle, .datagrid .datagrid-head .datagrid-row-actions .datagrid-filter-toggle { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + margin: 0; + padding: 0; + border: none; + border-radius: 0; + box-shadow: none; + background: none; + cursor: pointer; + float: right; + vertical-align: middle; + width: 0.583333rem; + height: 0.583333rem; + margin: 0 0.25rem; + background-repeat: no-repeat; + background-size: contain; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bfill%3A%239a9a9a%3Bfill-rule%3Aevenodd%3B%7D%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cpolygon%20class%3D%22cls-1%22%20points%3D%227%209.32%203%205.38%203%205%2013%205%2013%205.38%209%209.32%209%2012.21%207%2013.29%207%209.32%22%2F%3E%3C%2Fsvg%3E"); } + .datagrid .datagrid-column .datagrid-filter-toggle:hover, .datagrid .datagrid-head .datagrid-row-actions .datagrid-filter-toggle:hover { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bfill%3A%23007cbb%3Bfill-rule%3Aevenodd%3B%7D%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cpolygon%20class%3D%22cls-1%22%20points%3D%227%209.32%203%205.38%203%205%2013%205%2013%205.38%209%209.32%209%2012.21%207%2013.29%207%209.32%22%2F%3E%3C%2Fsvg%3E"); } + .datagrid .datagrid-column .datagrid-filter-toggle.datagrid-filter-open, .datagrid .datagrid-head .datagrid-row-actions .datagrid-filter-toggle.datagrid-filter-open { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bfill%3A%23007cbb%3Bfill-rule%3Aevenodd%3B%7D%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cpolygon%20class%3D%22cls-1%22%20points%3D%227%209.32%203%205.38%203%205%2013%205%2013%205.38%209%209.32%209%2012.21%207%2013.29%207%209.32%22%2F%3E%3C%2Fsvg%3E"); } + .datagrid .datagrid-column .datagrid-filter-toggle.datagrid-filtered, .datagrid .datagrid-head .datagrid-row-actions .datagrid-filter-toggle.datagrid-filtered { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bfill%3A%23007cbb%3Bfill-rule%3Aevenodd%3B%7D%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cpolygon%20class%3D%22cls-1%22%20points%3D%227%209.32%203%205.38%203%205%2013%205%2013%205.38%209%209.32%209%2012.21%207%2013.29%207%209.32%22%2F%3E%3C%2Fsvg%3E"), url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bfill%3Anone%3Bstroke%3A%23007cbb%3Bstroke-miterlimit%3A10%3B%7D%3C%2Fstyle%3E%3C%2Fdefs%3E%3Ccircle%20class%3D%22cls-1%22%20cx%3D%228%22%20cy%3D%228%22%20r%3D%227.5%22%2F%3E%3C%2Fsvg%3E"); } + .datagrid .datagrid-column .datagrid-filter, .datagrid .datagrid-head .datagrid-row-actions .datagrid-filter { + position: absolute; + top: 100%; + right: 0; + margin-top: 0.2rem; + background: #fff; + padding: 0.75rem; + border: 1px solid #ccc; + box-shadow: 0 1px 3px rgba(115, 115, 115, 0.25); + border-radius: 0.125rem; + font-weight: normal; + z-index: 1000; } + .datagrid .datagrid-column .datagrid-filter .datagrid-filter-close-wrapper, .datagrid .datagrid-head .datagrid-row-actions .datagrid-filter .datagrid-filter-close-wrapper { + text-align: right; } + .datagrid .datagrid-column .datagrid-filter .datagrid-filter-close-wrapper .close, .datagrid .datagrid-head .datagrid-row-actions .datagrid-filter .datagrid-filter-close-wrapper .close { + float: none; } + .datagrid .datagrid-column .datagrid-filter .datagrid-filter-apply, .datagrid .datagrid-head .datagrid-row-actions .datagrid-filter .datagrid-filter-apply { + margin-bottom: 0; } + .datagrid .datagrid-select .radio label, + .datagrid .datagrid-select .checkbox label { + display: block; + min-height: 0.541666rem; + padding-left: 0.583333rem; } + .datagrid .datagrid-select .radio label::before, .datagrid .datagrid-select .radio label::after, + .datagrid .datagrid-select .checkbox label::before, + .datagrid .datagrid-select .checkbox label::after { + top: 0; } + .datagrid .datagrid-foot-select.checkbox { + display: block; + line-height: inherit; + -ms-flex: 0 0 1.416667rem; + flex: 0 0 1.416667rem; + margin-right: 0.083333rem; } + .datagrid .datagrid-foot-select.checkbox label { + color: unset; + cursor: default; + opacity: 1; + line-height: inherit; } + .datagrid .datagrid-foot-select.checkbox input[type='checkbox'] + label::before, .datagrid .datagrid-foot-select.checkbox input[type='checkbox'] + label::after { + top: 0.333333rem; } + .datagrid .datagrid-foot-select.checkbox input[type='checkbox'] + label::after { + border-left-color: #fff; + border-bottom-color: #fff; } + .datagrid .datagrid-row-actions { + padding: 0; } + .datagrid .datagrid-row-actions clr-icon { + height: 0.583333rem; + vertical-align: bottom; } + .datagrid .datagrid-signpost-trigger .signpost { + margin: -0.3rem 0; + height: 1.03rem; } + .datagrid .datagrid-signpost-trigger .signpost .signpost-trigger { + height: inherit; + line-height: 1rem; } + .datagrid .datagrid-expandable-caret { + padding: calc(0.125rem - 1px) 0.166667rem 0.125rem; + text-align: center; } + .datagrid .datagrid-expandable-caret .datagrid-expandable-caret-button { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + margin: 0; + padding: 0; + border: none; + border-radius: 0; + box-shadow: none; + background: none; + cursor: pointer; + height: 1.25rem; + width: 1.25rem; } + .datagrid .datagrid-expandable-caret .datagrid-expandable-caret-icon { + color: #737373; + margin-top: 0.125rem; } + .datagrid .datagrid-expandable-caret .datagrid-expandable-caret-icon svg { + transition: transform 0.2s ease-in-out; } + .datagrid .datagrid-expandable-caret .spinner { + margin-top: 0.25rem; } + .datagrid .datagrid-expandable-caret.datagrid-column, .datagrid .datagrid-head .datagrid-expandable-caret.datagrid-row-actions { + padding: 0.458333rem 0.5rem 0.458333rem; } + .datagrid .datagrid-body .datagrid-row { + border-top: 1px solid #ddd; + -ms-flex-negative: 0; + flex-shrink: 0; } + .datagrid .datagrid-body .datagrid-row:first-child { + border-top: 0; } + .datagrid .datagrid-body .datagrid-row:hover { + background-color: #eee; } + .datagrid .datagrid-body .datagrid-row.datagrid-selected { + color: #000; + background-color: #d9e4ea; } + .datagrid .datagrid-body .datagrid-row .datagrid-action-overflow { + position: absolute; + background: #fff; + padding: 0.25rem 0.25rem; + margin-left: 0.25rem; + border: 1px solid #ccc; + box-shadow: 0 1px 3px rgba(115, 115, 115, 0.25); + border-radius: 0.125rem; + font-weight: normal; + z-index: 1000; + white-space: nowrap; } + .datagrid .datagrid-body .datagrid-row .datagrid-action-overflow::before { + content: ''; + position: absolute; + top: 50%; + right: 100%; + width: 0; + height: 0; + margin-top: -0.25rem; + border-right: 0.25rem solid #ccc; + border-top: 0.25rem solid transparent; + border-bottom: 0.25rem solid transparent; } + .datagrid .datagrid-body .datagrid-row .datagrid-action-overflow::after { + content: ''; + position: absolute; + top: 50%; + right: 100%; + width: 0; + height: 0; + margin-top: -0.208333rem; + border-right: 0.208333rem solid #fff; + border-top: 0.208333rem solid transparent; + border-bottom: 0.208333rem solid transparent; } + .datagrid .datagrid-body .datagrid-row .datagrid-action-overflow .action-item { + color: #565656; + font-size: 0.583333rem; + letter-spacing: normal; + background: transparent; + border: 0; + color: #565656; + cursor: pointer; + display: block; + line-height: calc(1rem - 1px); + margin: 0; + padding: 1px 1rem 0; + text-align: left; + width: 100%; } + .datagrid .datagrid-body .datagrid-row .datagrid-action-overflow .action-item:hover, .datagrid .datagrid-body .datagrid-row .datagrid-action-overflow .action-item:focus { + text-decoration: none; + background-color: #eee; } + .datagrid .datagrid-body .datagrid-row .datagrid-action-overflow .action-item.active { + background: #eee; + color: #000; } + .datagrid .datagrid-body .datagrid-row .datagrid-action-overflow .action-item:focus { + outline: 0; } + .datagrid .datagrid-body .datagrid-row .datagrid-action-overflow .action-item.disabled, .datagrid .datagrid-body .datagrid-row .datagrid-action-overflow .action-item:disabled { + cursor: not-allowed; + opacity: 0.4; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .datagrid .datagrid-body .datagrid-row .datagrid-action-overflow .action-item.disabled:hover, .datagrid .datagrid-body .datagrid-row .datagrid-action-overflow .action-item:disabled:hover { + background: none; } + .datagrid .datagrid-body .datagrid-row .datagrid-action-overflow .action-item.disabled:active, .datagrid .datagrid-body .datagrid-row .datagrid-action-overflow .action-item.disabled:focus, .datagrid .datagrid-body .datagrid-row .datagrid-action-overflow .action-item:disabled:active, .datagrid .datagrid-body .datagrid-row .datagrid-action-overflow .action-item:disabled:focus { + background: none; + box-shadow: none; } + .datagrid .datagrid-body .datagrid-row .datagrid-action-overflow .action-item clr-icon { + vertical-align: middle; + transform: translate3d(0px, -1px, 0); } + .datagrid .datagrid-body .datagrid-row .datagrid-action-toggle { + cursor: pointer; + color: #565656; + border: none; + background: none; + padding: calc(0.375rem - 1px); + margin: calc(0.125rem - 1px) 0.166667rem; } + .datagrid .datagrid-body .datagrid-row.datagrid-selected .datagrid-action-toggle { + color: #000; } + .datagrid .datagrid-body .datagrid-row .datagrid-row-detail.datagrid-container { + padding-top: 0; } + .datagrid .datagrid-body .datagrid-row .datagrid-row-detail .datagrid-cell { + padding-top: 0; } + .datagrid .datagrid-cell { + border-top: 0; } + .datagrid .datagrid-container { + font-size: 0.541667rem; + padding: 0.458333rem 0.5rem 0.458333rem; } + +.datagrid-placeholder-container { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + display: -ms-flexbox; + display: flex; + -ms-flex-pack: center; + justify-content: center; } + +.datagrid-placeholder { + background: #fff; + border-top: 1px solid #ddd; + width: 100%; } + .datagrid-placeholder.datagrid-empty { + border-top: 0; + padding: 0.5rem; + display: -ms-flexbox; + display: flex; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + font-size: 0.666667rem; + color: #9a9a9a; } + .datagrid-placeholder.datagrid-empty .datagrid-placeholder-image { + width: 2.5rem; + height: 2.5rem; + margin-bottom: 0.5rem; + background-repeat: no-repeat; + background-size: contain; + background-position: center; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20viewBox%3D%220%200%2060%2072%22%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%0A%20%20%20%20%3Cdefs%3E%0A%20%20%20%20%20%20%20%20%3Cellipse%20id%3D%22path-1%22%20cx%3D%2230%22%20cy%3D%2261.7666667%22%20rx%3D%2215.4512904%22%20ry%3D%224.73333333%22%3E%3C%2Fellipse%3E%0A%20%20%20%20%20%20%20%20%3Cmask%20id%3D%22mask-2%22%20maskContentUnits%3D%22userSpaceOnUse%22%20maskUnits%3D%22objectBoundingBox%22%20x%3D%220%22%20y%3D%220%22%20width%3D%2230.9025808%22%20height%3D%229.46666667%22%20fill%3D%22white%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23path-1%22%3E%3C%2Fuse%3E%0A%20%20%20%20%20%20%20%20%3C%2Fmask%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%20%20%20%20%3Cg%20id%3D%22Page-1%22%20stroke%3D%22none%22%20stroke-width%3D%221%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%20%20%20%20%3Cg%20id%3D%22Artboard%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20id%3D%22Oval-10%22%20stroke%3D%22%23C1DFEF%22%20mask%3D%22url(%23mask-2)%22%20stroke-width%3D%222.8%22%20stroke-linecap%3D%22square%22%20stroke-dasharray%3D%223%2C6%2C3%2C5%22%20xlink%3Ahref%3D%22%23path-1%22%3E%3C%2Fuse%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M38.4613647%2C18.1642456%20L30.9890137%2C34.9141846%20L31%2C47%20L32.5977783%2C46.5167236%20L32.5977783%2C34.9141846%20L51.0673218%2C15.7560425%20C51.0673218%2C15.7560425%2048.6295166%2C16.6542969%2044.9628906%2C17.3392334%20C41.2962646%2C18.0241699%2038.4613647%2C18.1642456%2038.4613647%2C18.1642456%20Z%22%20id%3D%22Path-195%22%20fill%3D%22%23C1DFEF%22%3E%3C%2Fpath%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M4.74639226%2C12.5661855%20L4.62065726%2C12.1605348%20L5.3515414%2C11.1625044%20L5.77622385%2C11.159939%20L6.20936309%2C12.5573481%20L4.74639226%2C12.5661855%20Z%20M6.20936309%2C12.5573481%20L6.32542632%2C12.9317954%20L28.4963855%2C34.8796718%20L28.4963855%2C47.8096691%20L32.6%2C46.4836513%20L32.6%2C34.8992365%20L53.973494%2C12.7035813%20L53.973494%2C12.2688201%20L6.20936309%2C12.5573481%20Z%20M55.373494%2C10.8603376%20L55.373494%2C13.2680664%20L34%2C35.4637216%20L34%2C47.5025401%20L27.0963855%2C49.7333333%20L27.0963855%2C35.4637219%20L5.09179688%2C13.680542%20L4.31325301%2C11.1687764%20L55.373494%2C10.8603376%20Z%22%20id%3D%22Path-149%22%20fill%3D%22%237FBDDD%22%3E%3C%2Fpath%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cellipse%20id%3D%22Oval-9%22%20fill%3D%22%23FFFFFF%22%20cx%3D%2230%22%20cy%3D%2211.785654%22%20rx%3D%2226%22%20ry%3D%226.78565401%22%3E%3C%2Fellipse%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M30%2C17.171308%20C36.8772177%2C17.171308%2043.3112282%2C16.4610701%2048.0312371%2C15.2292106%20C50.2777611%2C14.6428977%2052.0507619%2C13.9579677%2053.2216231%2C13.2354973%20C54.1938565%2C12.6355886%2054.6%2C12.1175891%2054.6%2C11.785654%20C54.6%2C11.4537189%2054.1938565%2C10.9357194%2053.2216231%2C10.3358107%20C52.0507619%2C9.61334032%2050.2777611%2C8.92841034%2048.0312371%2C8.34209746%20C43.3112282%2C7.11023795%2036.8772177%2C6.4%2030%2C6.4%20C23.1227823%2C6.4%2016.6887718%2C7.11023795%2011.9687629%2C8.34209746%20C9.72223886%2C8.92841034%207.94923814%2C9.61334032%206.77837689%2C10.3358107%20C5.8061435%2C10.9357194%205.4%2C11.4537189%205.4%2C11.785654%20C5.4%2C12.1175891%205.8061435%2C12.6355886%206.77837689%2C13.2354973%20C7.94923814%2C13.9579677%209.72223886%2C14.6428977%2011.9687629%2C15.2292106%20C16.6887718%2C16.4610701%2023.1227823%2C17.171308%2030%2C17.171308%20Z%20M30%2C18.571308%20C15.6405965%2C18.571308%204%2C15.5332672%204%2C11.785654%20C4%2C8.03804078%2015.6405965%2C5%2030%2C5%20C44.3594035%2C5%2056%2C8.03804078%2056%2C11.785654%20C56%2C15.5332672%2044.3594035%2C18.571308%2030%2C18.571308%20Z%22%20id%3D%22Oval-9-Copy%22%20fill%3D%22%237FBDDD%22%3E%3C%2Fpath%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M18.2608643%2C7.14562988%20L22.727356%2C16.9047241%20C22.727356%2C16.9047241%2015.3006592%2C16.3911743%2010.276001%2C14.7511597%20C5.25134277%2C13.111145%205.38031006%2C11.8284302%205.38031006%2C11.6882935%20C5.38031006%2C10.4832831%208.16633152%2C9.41877716%2011.114563%2C8.57324219%20C14.549319%2C7.58817492%2018.2608643%2C7.14562988%2018.2608643%2C7.14562988%20Z%22%20id%3D%22Path-196%22%20fill%3D%22%23C1DFEF%22%3E%3C%2Fpath%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E"); } + +.datagrid-action-bar { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + display: -ms-flexbox; + display: flex; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -ms-flex-align: stretch; + align-items: stretch; } + +.datagrid-foot { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + display: -ms-flexbox; + display: flex; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -ms-flex-pack: end; + justify-content: flex-end; + -ms-flex-align: stretch; + align-items: stretch; + height: 1.5rem; + padding: 0 0.5rem; + line-height: calc(1.5rem - 3px); + font-size: 0.458333rem; + background-color: #fafafa; + border-top: 2px solid #ccc; + border-radius: 0 0 0.125rem 0.125rem; } + .datagrid-foot .pagination { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; } + .datagrid-foot .pagination-description { + white-space: nowrap; } + .datagrid-foot .pagination-list { + margin-left: 1.5rem; + height: calc(1.5rem - 2px); } + .datagrid-foot .column-switch-wrapper { + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + .datagrid-foot .column-switch-wrapper.active .column-toggle--action { + color: #007cbb; } + .datagrid-foot .column-switch-wrapper .column-toggle--action { + min-width: 0.75rem; + padding-left: 0; + padding-right: 0; + color: #9a9a9a; } + .datagrid-foot .column-switch-wrapper .column-toggle--action:hover { + color: #007cbb; } + .datagrid-foot .column-switch-wrapper .column-switch { + border-radius: 0.125rem; + padding: 0.75rem; + background-color: #fff; + border: 1px solid #ccc; + box-shadow: 0 1px 3px rgba(116, 116, 116, 0.25); + width: 10.416667rem; + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; } + .datagrid-foot .column-switch-wrapper .column-switch .switch-header { + display: -ms-flexbox; + display: flex; + -ms-flex-pack: justify; + justify-content: space-between; + font-weight: 400; + font-size: 0.666667rem; + padding-bottom: 0.5rem; + line-height: 1rem; } + .datagrid-foot .column-switch-wrapper .column-switch .switch-header button { + min-width: 0.75rem; + margin: 0; + padding: 0; + color: #9a9a9a; } + .datagrid-foot .column-switch-wrapper .column-switch .switch-header button:hover { + color: #007cbb; } + .datagrid-foot .column-switch-wrapper .column-switch .switch-content { + max-height: 12.5rem; + overflow-y: auto; + min-height: calc(1rem + 1px); } + .datagrid-foot .column-switch-wrapper .column-switch .switch-content li { + line-height: 1rem; + padding-left: 0.083333rem; } + .datagrid-foot .column-switch-wrapper .column-switch .switch-footer .btn { + margin: 0; + padding: 0; } + .datagrid-foot .column-switch-wrapper .column-switch .switch-footer .action-right { + display: -ms-flexbox; + display: flex; + -ms-flex-pack: end; + justify-content: flex-end; } + +.datagrid-foot-description { + display: block; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + white-space: nowrap; + text-align: right; } + +.pagination-list { + list-style: none; + display: -ms-flexbox; + display: flex; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -ms-flex-pack: center; + justify-content: center; + -ms-flex-align: stretch; + align-items: stretch; } + .pagination-list > * { + padding: 0 0.1rem; + margin-left: 0.3rem; } + .pagination-list > *:first-child { + margin-left: 0; } + .pagination-list .pagination-current { + font-weight: 600; + border-bottom: 2px solid #007cbb; } + .pagination-list .pagination-previous, + .pagination-list .pagination-next { + display: inline-block; + vertical-align: middle; + width: 0.583333rem; + height: 0.583333rem; + background-repeat: no-repeat; + background-size: contain; } + .pagination-list .pagination-previous { + margin-right: 0.25rem; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cdefs%3E%3Cstyle%3E.cls-3%7Bfill%3A%23737373%3B%7D%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cg%3E%3Cpolygon%20class%3D%22cls-3%22%20points%3D%2210.15%2014.72%203.44%208%2010.15%201.28%2011%202.13%205.14%208%2011%2013.87%2010.15%2014.72%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); } + .pagination-list .pagination-next { + margin-left: 0.25rem; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bfill%3A%23737373%3B%7D%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cg%3E%3Cpolygon%20class%3D%22cls-1%22%20points%3D%225.85%2014.72%2012.56%208%205.85%201.28%205%202.13%2010.86%208%205%2013.87%205.85%2014.72%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); } + .pagination-list button { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + margin: 0; + padding: 0; + border: none; + border-radius: 0; + box-shadow: none; + background: none; + color: #737373; + cursor: pointer; } + +.datagrid-select .radio, +.datagrid-select .checkbox { + margin-top: -0.041667rem; } + +.datagrid-compact .datagrid-column .datagrid-column-separator::after, .datagrid-compact .datagrid .datagrid-head .datagrid-row-actions .datagrid-column-separator::after, .datagrid .datagrid-head .datagrid-compact .datagrid-row-actions .datagrid-column-separator::after { + height: calc(100% + 0.5 * 0.5rem - 1px); + top: calc(-0.25 * 0.5rem + 1px); } + +.datagrid-compact .datagrid-column .datagrid-column-separator .datagrid-column-handle-tracker, .datagrid-compact .datagrid .datagrid-head .datagrid-row-actions .datagrid-column-separator .datagrid-column-handle-tracker, .datagrid .datagrid-head .datagrid-compact .datagrid-row-actions .datagrid-column-separator .datagrid-column-handle-tracker { + top: -0.25rem; } + +.datagrid-compact .datagrid-cell clr-icon { + margin-top: calc(-0.125rem - 1px); + margin-bottom: -0.125rem; } + +.datagrid-compact .datagrid-cell .badge { + margin-top: -0.125rem; + margin-bottom: -1px; } + +.datagrid-compact .datagrid-expandable-caret .spinner { + margin-top: 0.125rem; } + +.datagrid-compact .datagrid-expandable-caret .datagrid-expandable-caret-button { + height: 1rem; + width: 1rem; + outline-offset: -0.166667rem; } + +.datagrid-compact .datagrid-expandable-caret .datagrid-expandable-caret-icon { + margin: 0; } + +.datagrid-compact .datagrid-expandable-caret.datagrid-cell { + padding: 0; } + +.datagrid-compact .datagrid-expandable-caret.datagrid-column, .datagrid-compact .datagrid .datagrid-head .datagrid-expandable-caret.datagrid-row-actions, .datagrid .datagrid-head .datagrid-compact .datagrid-expandable-caret.datagrid-row-actions { + padding-top: calc(0.208334rem + 1px); + padding-bottom: calc(0.208334rem); } + +.datagrid-compact .datagrid-signpost-trigger .signpost .signpost-trigger clr-icon:not([shape='info-circle']):not([shape='exclamation-triangle']):not([shape='exclamation-circle']):not([shape='check-circle']):not([shape='info']):not([shape='error']) { + width: 0.875rem; + height: 0.875rem; } + +.datagrid-compact .datagrid-body .datagrid-row .datagrid-action-toggle { + padding-top: calc(0.208334rem + 1px); + padding-bottom: calc(0.208334rem); + margin-top: 0; + margin-bottom: 0; + outline-offset: -0.166667rem; } + .datagrid-compact .datagrid-body .datagrid-row .datagrid-action-toggle clr-icon { + margin-bottom: 0; } + +.datagrid-compact .datagrid-foot { + height: 1rem; + padding: 0 0.5rem; + line-height: calc(1rem - 1px); } + .datagrid-compact .datagrid-foot .pagination-list { + height: calc(1rem - 2px); } + .datagrid-compact .datagrid-foot .column-switch-wrapper .column-toggle--action { + margin: 0; + outline-offset: -0.166667rem; } + .datagrid-compact .datagrid-foot .datagrid-foot-select.checkbox input[type='checkbox'] + label::before, .datagrid-compact .datagrid-foot .datagrid-foot-select.checkbox input[type='checkbox'] + label::after { + top: 0.11111rem; } + +.datagrid-cell-width-zero { + border: 0 !important; + padding: 0 !important; + width: 0; + -ms-flex: 0 0 auto !important; + flex: 0 0 auto !important; + min-width: 0 !important; } + +@supports (-ms-ime-align: auto) { + .datagrid .datagrid-column .datagrid-filter-toggle, .datagrid .datagrid-head .datagrid-row-actions .datagrid-filter-toggle { + width: 0.59rem; + height: 0.59rem; + margin-top: -1px; } } + +/** + * TODO: figure out if we want to include animate.css or if we prefer sticking to a few, + * controlled animations that we write ourselves. + * + * At the moment, we rely on the fact that each ".foo" animation has the hidden styles by default, + * and ".foo.in" has the displayed styles. This will still be feasible by simply wrapping + * animate.css, if we want. + */ +.fade { + opacity: 0; + transition: opacity 0.2s ease-in-out; + will-change: opacity; } + .fade.in { + opacity: 1; } + +.fadeDown { + opacity: 0; + transform: translate(0, -25%); + transition: opacity 0.2s ease-in-out, transform 0.2s ease-in-out; + will-change: opacity, transform; } + .fadeDown.in { + opacity: 1; + transform: translate(0, 0); } + +@media screen { + section[aria-hidden='true'] { + display: none; } } + +[data-hidden='true'] { + display: none; } + +button.nav-link { + border-radius: 0; + text-transform: capitalize; + min-width: 0; } + +.tabs-overflow { + position: relative; } + .tabs-overflow .nav-item { + margin-right: 0; } + +.clr-wizard .modal-dialog { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-pack: justify; + justify-content: space-between; + -ms-flex-align: center; + align-items: center; + box-shadow: 0 0.041667rem 0.083333rem 0.083333rem rgba(0, 0, 0, 0.2); + height: 50%; + max-height: 100%; } + +.clr-wizard .modal-content { + border-radius: 0 0.125rem 0.125rem 0; + box-shadow: none; + padding: 0; + -ms-flex: 2 2 auto; + flex: 2 2 auto; + width: 66%; + height: 100%; + overflow: hidden; + display: -ms-flexbox; + display: flex; + -ms-flex-pack: justify; + justify-content: space-between; + -ms-flex-align: start; + align-items: flex-start; + -ms-flex-direction: column; + flex-direction: column; } + +.clr-wizard .modal-header { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; + padding: 1rem 0.791667rem 0.25rem 1rem; + display: -ms-flexbox; + display: flex; + -ms-flex-direction: row-reverse; + flex-direction: row-reverse; + -ms-flex-pack: justify; + justify-content: space-between; + -ms-flex-align: start; + align-items: flex-start; } + +.clr-wizard .modal-title { + color: #313131; + display: -ms-flexbox; + display: flex; + -ms-flex-direction: row; + flex-direction: row; + width: 100%; } + +.clr-wizard .modal-body { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + color: #565656; + width: 100%; } + +.clr-wizard .modal-footer { + padding: 0; + display: block; + padding-top: 1rem; + height: 3.5rem; + min-height: 3.5rem; + max-height: 3.5rem; + width: 100%; + -ms-flex: 0 0 3.5rem; + flex: 0 0 3.5rem; } + +.clr-wizard .clr-wizard-btn { + margin: 0; + max-width: 100%; + display: block; } + +.clr-wizard .modal-title-text { + display: inline-block; + -ms-flex: 0 1 auto; + flex: 0 1 auto; + width: 100%; } + +.clr-wizard .modal-header-actions-wrapper { + -ms-flex: 1 0 auto; + flex: 1 0 auto; + padding-left: 0.5rem; + padding-right: 0.166667rem; } + +.clr-wizard .clr-wizard-header-action { + width: 1rem; + height: 1rem; + padding: 0; + margin: 0; + min-width: 1rem; + line-height: 1rem; + font-size: 1.083333rem; + color: #737373; + transition: color linear 0.2s; } + .clr-wizard .clr-wizard-header-action a { + color: #737373; } + .clr-wizard .clr-wizard-header-action:hover, .clr-wizard .clr-wizard-header-action:active, .clr-wizard .clr-wizard-header-action:focus { + color: #313131; } + .clr-wizard .clr-wizard-header-action clr-icon { + height: 0.916667rem; + width: 0.916667rem; } + +.clr-wizard .clr-wizard-stepnav-wrapper { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + width: 34%; + max-width: 34%; + display: block; + -ms-flex-order: -1; + order: -1; + overflow: hidden; + overflow-y: auto; + padding-bottom: 1rem; + line-height: 1rem; + border-right: 1px solid #e4e4e4; + height: 100%; + background-color: #fafafa; + border-radius: 0.125rem 0 0 0.125rem; } + +.clr-wizard .clr-wizard-stepnav { + padding-left: 1rem; + display: block; + font-size: 0.583333rem; + color: #565656; + width: 100%; } + +.clr-wizard .clr-wizard-stepnav-list { + display: block; + box-shadow: none; + counter-reset: a; + white-space: nowrap; + height: auto; + list-style-type: none; + margin: 0; + width: 100%; } + +.clr-wizard .clr-wizard-stepnav-item { + display: block; + box-shadow: 0.166667rem 0 0 #eee inset; + margin: 0 0 -1px 0; + padding: 0.25rem 0; + padding-left: 0.333333rem; + color: #565656; + font-weight: 400; } + .clr-wizard .clr-wizard-stepnav-item.active { + color: #313131; + font-weight: 500; } + .clr-wizard .clr-wizard-stepnav-item.active .clr-wizard-stepnav-link { + background-color: #d9e4ea; + border-radius: 0.125rem 0 0 0.125rem; } + .clr-wizard .clr-wizard-stepnav-item.complete { + box-shadow: 0.166667rem 0 0 #60b515 inset; + transition: box-shadow 0.2s ease-in; } + .clr-wizard .clr-wizard-stepnav-item.no-click button { + pointer-events: none; } + +.clr-wizard .clr-wizard-stepnav-link { + width: 100%; + display: inline-block; + color: inherit; + line-height: 0.666667rem; + padding: 0.416667rem; + padding-right: 0.125rem; + font-size: 0.583333rem; + font-weight: inherit; + letter-spacing: normal; + text-align: left; + text-transform: none; + margin: 0; } + .clr-wizard .clr-wizard-stepnav-link::before { + content: counter(a); + counter-increment: a; + padding-right: 0.291667rem; + min-width: 0.625rem; } + +.clr-wizard .clr-wizard-title { + color: #313131; + margin-top: 0; + padding-top: 1rem; + padding-left: 1rem; + padding-right: 0.5rem; + padding-bottom: 1rem; } + +.clr-wizard .modal-content-wrapper { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: row; + flex-direction: row; + -ms-flex: 1 1 100%; + flex: 1 1 100%; + width: 100%; + height: 100%; } + +.clr-wizard .clr-wizard-footer-buttons { + text-align: right; + padding-right: 1rem; + margin: 0; } + +.clr-wizard .clr-wizard-footer-buttons-wrapper { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: row; + flex-direction: row; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -ms-flex-pack: end; + justify-content: flex-end; } + +.clr-wizard .clr-wizard-btn-wrapper { + -ms-flex: 0 1 auto; + flex: 0 1 auto; + min-width: 3.5rem; + padding-left: 0.5rem; } + +.clr-wizard .clr-wizard-btn-wrapper[aria-hidden='true'] { + display: none; } + +.clr-wizard .clr-wizard-btn.btn-link { + padding: 0; } + +.clr-wizard .clr-wizard-content { + display: block; } + +.clr-wizard .clr-wizard-page:not([aria-hidden='true']) { + padding: 1rem; + padding-top: 0.75rem; + display: block; } + +.clr-wizard .modal-dialog { + height: 75vh; } + +.clr-wizard .modal-body { + max-height: 100%; } + +.clr-wizard.wizard-md .modal-dialog { + min-height: 17.5rem; + max-height: 21rem; } + +.clr-wizard.wizard-md .modal-content, +.clr-wizard.wizard-md .clr-wizard-stepnav-wrapper { + max-height: 21rem; } + +.clr-wizard.wizard-md .clr-wizard-stepnav-wrapper { + min-width: 9rem; + max-width: 10rem; } + +.clr-wizard.wizard-lg .modal-dialog { + min-height: 17.5rem; + max-height: 30rem; } + +.clr-wizard.wizard-lg .modal-content, +.clr-wizard.wizard-lg .clr-wizard-stepnav-wrapper { + max-height: 30rem; } + +.clr-wizard.wizard-lg .nav-panel, +.clr-wizard.wizard-lg .clr-wizard-stepnav-wrapper { + min-width: 10rem; + max-width: 12rem; } + +.clr-wizard.wizard-xl .modal-dialog { + height: 75vh; } + +.clr-wizard.wizard-xl .modal-content, +.clr-wizard.wizard-xl .clr-wizard-stepnav-wrapper { + max-height: 75vh; } + +.clr-wizard.wizard-xl .nav-panel, +.clr-wizard.wizard-xl .clr-wizard-stepnav-wrapper { + min-width: 10rem; + max-width: 13rem; } + +.clr-wizard .spinner:not(.spinner-inline):not(.clr-treenode-spinner) { + left: calc(50% + 4.791667rem); + position: absolute; + top: 40%; } + +.clr-wizard-page > *:first-child { + margin-top: 0; } + .clr-wizard-page > *:first-child > *:first-child { + margin-top: 0; } + +.clr-wizard-page > form:first-child { + padding-top: 0; } + .clr-wizard-page > form:first-child > .form-block:first-child { + margin-top: 0; } + +.clr-wizard--ghosted .modal-dialog { + display: block; + box-shadow: none; } + +.clr-wizard--ghosted .modal-outer-wrapper { + position: static; + display: -ms-flexbox; + display: flex; + -ms-flex-pack: justify; + justify-content: space-between; + -ms-flex-align: center; + align-items: center; + height: 100%; + max-height: 100%; + box-shadow: none; + -ms-flex-direction: row; + flex-direction: row; } + +.clr-wizard--ghosted .modal-content-wrapper { + box-shadow: 0 0.041667rem 0.083333rem 0.083333rem rgba(0, 0, 0, 0.2); } + +.clr-wizard--ghosted .modal-ghost-wrapper { + display: block; + -ms-flex: 0 0 2rem; + flex: 0 0 2rem; + height: 100%; + position: relative; } + +.clr-wizard--ghosted .modal-ghost { + position: absolute; + top: 1rem; + bottom: 1rem; + background: #bbb; + width: 1rem; + border-radius: 0 0.125rem 0.125rem 0; + left: -1rem; + box-shadow: 0 0.041667rem 0.083333rem 0.083333rem rgba(0, 0, 0, 0.2); + z-index: -1; } + +.clr-wizard--ghosted .modal-ghost-2 { + top: 2rem; + bottom: 2rem; + background: #9a9a9a; + z-index: -2; } + +.clr-wizard--ghosted .modal-dialog, +.clr-wizard--ghosted .modal-outer-wrapper { + width: 26rem; } + +.clr-wizard--ghosted .modal-content-wrapper { + width: 24rem; } + +.clr-wizard--ghosted.wizard-md .modal-dialog, +.clr-wizard--ghosted.wizard-md .modal-outer-wrapper { + width: 26rem; } + +.clr-wizard--ghosted.wizard-md .modal-outer-wrapper { + min-height: 17.5rem; } + +.clr-wizard--ghosted.wizard-md .modal-content-wrapper { + width: 24rem; } + +.clr-wizard--ghosted.wizard-lg .modal-dialog, +.clr-wizard--ghosted.wizard-lg .modal-outer-wrapper { + width: 38rem; } + +.clr-wizard--ghosted.wizard-lg .modal-outer-wrapper { + min-height: 17.5rem; } + +.clr-wizard--ghosted.wizard-lg .modal-content-wrapper { + width: 36rem; } + +.clr-wizard--ghosted.wizard-xl .modal-dialog, +.clr-wizard--ghosted.wizard-xl .modal-outer-wrapper { + width: 50rem; } + +.clr-wizard--ghosted.wizard-xl .modal-outer-wrapper { + max-height: 75vh; } + +.clr-wizard--ghosted.wizard-xl .modal-content-wrapper { + width: 48rem; } + +.clr-wizard--inline { + display: block; + width: 100%; } + .clr-wizard--inline > clr-modal > .modal:focus { + outline-style: none; + outline-color: transparent; } + .clr-wizard--inline clr-modal { + height: 100%; + width: 100%; + display: block; } + .clr-wizard--inline .modal { + padding: 0; + position: static; + height: 100%; + max-height: 100%; } + .clr-wizard--inline .modal .content-container { + height: 100%; } + .clr-wizard--inline .modal .content-container .nav-panel { + width: 99%; + height: 99%; } + .clr-wizard--inline .modal .modal-outer-wrapper { + -ms-flex-align: stretch; + align-items: stretch; + width: 100%; } + .clr-wizard--inline .modal .modal-content { + box-shadow: none; } + .clr-wizard--inline .modal .modal-dialog { + min-height: 100%; + height: 100%; + width: 100%; + z-index: auto; } + .clr-wizard--inline .modal-body { + height: 100%; } + .clr-wizard--inline .modal-header .close { + display: none; } + .clr-wizard--inline .nav.navList { + padding-top: 0; } + .clr-wizard--inline .modal-dialog .modal-content .modal-body .content-area { + overflow-y: auto; } + .clr-wizard--inline .modal-backdrop { + height: 0; + width: 0; + display: none; } + .clr-wizard--inline .modal-content-wrapper { + -ms-flex-align: stretch; + align-items: stretch; + height: 100%; } + .clr-wizard--inline .modal-ghost-wrapper { + display: none; } + .clr-wizard--inline .clr-wizard-stepnav-wrapper, + .clr-wizard--inline.clr-wizard .modal-content { + min-height: 100%; + height: auto; + max-height: 100%; } + .clr-wizard--inline .clr-wizard-stepnav-wrapper .clr-wizard-stepnav, + .clr-wizard--inline.clr-wizard .modal-content .clr-wizard-stepnav { + height: 100%; } + +.clr-wizard--no-shadow .modal-content-wrapper, +.clr-wizard--no-shadow .modal-dialog { + box-shadow: none; } + +.clr-wizard--no-title .clr-wizard-title { + display: none; } + +.clr-wizard--no-title .clr-wizard-stepnav { + padding-top: 1rem; } + +@media screen { + .clr-wizard-page[aria-hidden='true'] { + display: none; } } + +@supports (-ms-ime-align: auto) { + .clr-wizard .clr-wizard-header-action { + margin-top: -0.125rem; } } + +@font-face { + font-family: 'Metropolis'; + src: url(data:application/font-woff;charset=utf-8;base64,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) format("woff"); + font-weight: 200; + font-style: normal; } + +@font-face { + font-family: 'Metropolis'; + src: url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAFUkABMAAAAApQgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABqAAAABwAAAAcfNH55kdERUYAAAHEAAAATQAAAGIH1Qf8R1BPUwAAAhQAAAcXAAAOdj58fExHU1VCAAAJLAAAACAAAAAgRHZMdU9TLzIAAAlMAAAATQAAAGBoQKzzY21hcAAACZwAAAJsAAADnndDD7FjdnQgAAAMCAAAADAAAAA8EawBpGZwZ20AAAw4AAAGOgAADRZ2ZH12Z2FzcAAAEnQAAAAIAAAACAAAABBnbHlmAAASfAAAN4wAAHG4/7HGDGhlYWQAAEoIAAAANgAAADYLZYgSaGhlYQAASkAAAAAhAAAAJAd6BCBobXR4AABKZAAAAoYAAATaq1M+VWxvY2EAAEzsAAACcwAAAnpN7jLmbWF4cAAAT2AAAAAgAAAAIAKEApFuYW1lAABPgAAAAXEAAAMQI+x4YXBvc3QAAFD0AAADoQAABiGXFj2KcHJlcAAAVJgAAACBAAAAjRlQAhB3ZWJmAABVHAAAAAYAAAAG9ndYmAAAAAEAAAAA1FG1agAAAADTwZ2GAAAAANS+pvV42g2MQQqEQBDEEkf0MLPof7ypL/DofXfV/z/AIgRC0TQCLR6cdFRkjVso7HzTv1D4B7m4048DOlopNlv645SeXXLT51sXzSa+W3AF3AAAAHjajVcNbJbVFX7Oufe+39evgKWUH6EgIVgb0xRGmAiyaRhURyqSjikaZvbjnIPx12EzFuf4cWgWUheHDAlpEPkx2gCiYkXGuoYxxzYCygxhYFwHyBYm0+lCRHn3vOf9sC/QbuMJD4dz73vvPec8t+cWAqCAEZgKmVxXPwN5eHoQx3D8R6Bwc77dOA8Vc7/ROAeVc+fMncPZoD8ZTWck7PhdAQMwDFXmcRiJeteajkYLbFWJmhHxI+m9iF8MNl9AxWcQ1MXN5ICJWIlPEctgKI/BeTJIjqEUvXiyf8Qd8Zb4SHwcPfyJ3+9x5Pfdeju5d/b/J+Of97jCuz2O9HyeP8W7ehjZEnfGuxNc5j/Cv79L0N0ecTOzpBjOTFcxW9cRilrCYRThMYYI+DwRYRyRw3gijwlECXM7kZVqIgRL8RPOfJQIzPhK+l8mBK8QglcJxSHC403C4zgR8FciwkkiwrtEhLNEDu8TOZwnSli9T7laTBSkTMpQIuVSTq6QCvJgVrbAtUdTJSP5zfWE2LnTE6ud2NmJvZ04YDKRRx1RgtuIAhqIUszHg1whiSSySCKLJOBxPMn5q4kS/AJrOf9pbOL8LUQpthE5bCfyeIHIYQeRx4tEDi8ReewkStBGlGAPUUA7UUAHUcBeooDfEILfEmLZifA2UYq/EGle1PKilhdveQmWl2B58ZYXb3nxMlAGMl9Xy9XkJEeBq9YyQ1WscS1rO4Y1HcfMTGBG5mMBFqIR38ci1nIplmE5HmEWHmX02xjRi6zkK6zgIVbuOCt2kpU6y5Oct5tVxn0rkvulD9s93CeNjLs31bWbumuOP+pGrTbS3R34bORMgm6+PNvj3ThzUfG818fj5fHyy0fSWxevi9d1O/I3+0ZRaZoQ04Tiq4TD3YTHPUTALCKiIp7knEQNYmpQU4OilYiwlYis0mKVFqu0WKXF6qo4QTicIhxOEw6fEAEXiEj6Sl/WtZ/0I/eX/uSkomIVFRkiQ7i+ogZXEaXoS/QypYspXU3prqj0W4ms0r3FE2XiyZnSXVHpXRr3FpW3qHIW1UWlpxpP1b2L6FnXSbTeNKvFCBPlOoszZ/p1pl8txpyoWIuRJ1rWTPxZRTvLQk5Gy3junvz0qmOEDazX3YxrFiNZzUjW4ClG8zQ24BlsZERbGMlW3sY2nradp9zL051gDU7zZBd4gn7cbSB3GcIVh5meFX2so5SbOsq5y820xOyb2YmORcPIncx/h6yQlfKErJEW2SjPyXbZKbulQ16XA3JYjso7ckrOyAdyTi6o14KW6QCt1BFarbU6VifoLVqn9dqgM/VevU9n6wJt0od0mT6mzbpK1+p63aytukPbdI/u1f16UN/SY9qpp/U9/VA/dnCR6+XK3SA3zI1017vR7gY30U1yt7lpboa7x33d3e++5xrdD9zD7hH3U/czt9qtcxvcs26re8ntcu1un/uDe8MdcW+7E+7v7p/u3+4Trz7v+/gKP9gP91W+xo/xN/ov+sl+qp/u7/Sz/Df9A36eX+R/6Jf4FX6lf8Kv8S1+o3/Ob/c7/W7f4V/3B/xhf9S/40/5M/4Df85fCD4UQlkYECrDiFAdasPYMCHcEupCfWgIM8O94b4wOywITeGhsCw8FprDqrA2rA+bQ2vYEdrCnrA37A8Hw1vhWOgMp8N74cPwcYQoinrxdizWbeQlxnUZXpUwmoxbzLO0y1/kacY1xjcZP5iwDjV7uvEk42uVP1Ol2niU8ZSEsdB4k75GbjT/eOOJ5u80Pm+e64w3GFcZ540b3Gzy88aLu2d9Mxuj+a9gTDN+1ripi+WuNHaz5xnvM151JacZMPtKnm58rbb/L9aNl+SqvTvGl42fMV7Yxcxeu2Xvv3Oaz/ZuuSrDizNnvsTO1HSJ+avNn7XTrD5u9l2ZzI/qGr1o22iqiqw/zeqU1LY5qWbS6qRRp/os2kV/MqfF7E2u6aJ6ixp7w+z9iV2saZqxVNup9rL+9Axp3g6a/SOr0Z9N5+dsfqqcTptjNyLV7SX+GrPPp7bNSVWd9ac36KaMZtKKZO0XzP5W6rf5di90qPk3mD9VWlXGnmScN09P9kfpfbHo7jD7sNnZleviXyXVifdcVqnsjlOKt7v9/+BLZyqusXcp+O6qZlaS16ln165hF0xe2BE+x5dYDmNxI3tY0rn7sG9/gT096dx97Y1abp27H3+vmso+VE/0xx3scwPY6e7k7z4ziUrr5UPZ9b7GrjWfb7fh9nobx47ewvXWs/Pdbr3vK+x+r7FD/hIH8B2+6M5isb0q1+BfEvAUO/EQtFpPbeN5Ra6y380iSPxjU+ES3E9ewW5XikHcayQjGo0beOpJPOU0zODor027fzQ+amx3BvsyfMh4rvFm41RVObNL8SXu8wC+KznJS4kUpFR6S58rT/Qf6j6bKQAAAQAAAAoAHAAeAAFERkxUAAgABAAAAAD//wAAAAAAAHjaY2BmcmCcwMDKwMLUxRTBwMDgDaEZ4xhEGM2AfKAUHLAzIIFQ73A/BgcGBdU/zNL/jRkYmI8yqiswMEwGyTGxMq0HUgoMTADJZQpAAAAAeNq1k1lQjlEcxn//t30RKhT19vZp00aiFEX2pci+lKzZsq/ZGusQQ0VSyJ4koxkTU1O2G+64NWOMvs+VW+4MHcdXTDPMuHJm3nPec86c55x5nt8fcKHrC0F0j1TqmTjnrlKsxyWMw42BlHCLOu7SSBPNtNAmHhIggyRMBkucJEmqpEumTJUcyZNCKZISI9V4Zbx3iTKPm63mE/OL5W4FWsFWqGWzoqxhVrp13+Yf+U0pfYfFjR7aj2njmfhKfzHFJrGSKCmSJhmSJdmSKwWyQTZr7ZfGW619yGwx283PlmEFWEFWiFN7qJX2S1t9VC/Uc/VUtatW9Ug1q4eqSTWqBlWv6tQ1VatqVLWqUpWqQpWpM6pUneh805nVmfT9k6PcUeDId8TYB9r97D52L7ub3ej42vG54/CHkHfJXV79p+ZueDuT4I9bBKP7z/iHRtdJF1x1du544IkX3vjgSy/86E0f+uJPAIH0oz8DCCJYZzxIpx6KSZhOJBwbg4kgkiiiiWEIscQRTwKJDGUYSQwnmRGMJIVURpFGOqMZQwaZjNXMZDGeCUxkEpOZwlSmMZ0ZZJPDTGaRy2zmMJd5zGcBC1nEYk1aHvkspYBlLGeFfv8OdrKbYg5xnNOUU0YF5zlHJVVUc5EaLnGFy9Rylevc1BT9ZPQ2DZqle5qmn20Vq7Ud0WzgbLc361mj+12c+O1W4V8cvEA9m1nZY2UtmyRGj1vYzjHsOCRc8xkpUboCIrijdx6gaZYEXQ/x3WeKnGHEso29bGUfezjAQV1L+znCUb11mFJOcZLXupp6sU68xFt82Ch+mn/PH5DNquh42mNgwAL8gdCZwZlpPQMD024mVgaG/yHM0v+NmXb//8J0jEnw/5f/fiA+AM9PDVh42q1WaXfTRhSVvGUjG1loUUvHTJym0cikFIIBA0GK7UK6OFsrQWmlOEn3BbrRfV/wr3ly2nPoN35a7xvZJoGEnvbUH/TuzLszb5t5YzKUIGPdrwRCLN01hpaXKLd6zadTFs0E4bZorvuUKkR/9Rq9RqMhN6x8noyADE8utgzT8ELXIVORCLcdSimxKehenTLT11ozZr9XaVQoV/HzlC4EK9f9vMxbTV9QvY6phcASVGJUCgIRJ+xok2Yw1R4JmmP9HDPv1X0Bb5qRoP66H2JGsK6f0Tyj+dAKgyCwyLSDQJJR97eCwKG0EtgnU4jgWdar+5SVLuWkizgCMkOHMkrCL7EZZzdcwRr22Eo84C9IlQalZ/NQeqIpmjAQz2ULCHLZD+tWtBL4MsgHghZWfegsDq1t36Gsoh7PbhmpJFM5DKUrkXHpRpTa2CazAQOUnXWoRwl2dcBr3M0YG4J3oIUwYEq4qF3tVa2eAcOruLP5bu771N5a9Ce7mDZc8BB3KCpNGXFddL4Mi3NKwoKTHS9RHRktJiYGDlhOU1hlWPdD273okNIBtQb60yi2JfPBbN6hQRWnUhXajBYdGlIgCkGHvKu8HEC6AQ3yaAWjQYwcGsY2IzolAhlowC4NeaFohoKGkDSHRtTSmh9nNheDKRrckrcdGlVLy/7SajJp5TE/pucPq9gY9tb9eHgYBYxcGrb5zOIku/Eh/gziQ+YkKpEu1P2Yk4do3Sbqy2Zn8xLLOthK9LwEV4FnAkRSg/81zO4t1QEFjA1jTCJbHhkXW6Zp6lqNKSM2UpU1n4alKyo0gMPXD8OhK0KY/3N01DSGDNdthvHhnE13bOs40jSO2MZshyZUbLKcRJ5ZHlFxmuVjKs6wfFzFWZZHVZxjaam4h+UTKu5l+aSK+1g+o2Qn75QLkWEpimTe4Avi0Owu5WRXeTNR2ruU013lrUR5TBk0aP+H+J5CfMfgl0B8LPOIj+VxxMdSIj6WU4iPZQHxsZxGfCyfRnwsZxAfS6VEWR9TR8HsaCg8dsHTpcTVU3xWi4ocmxzcwhO4ADVxQBVlVJLcER/JsDj6uW5pzUk6MRtnzYmKj0bGAT67OzMPq08qcVr7+xx4ZuVhI7id+xrneWPyD4N/ixdlKT5pTnBwp5AAeLy/w7gVUcmh06p4pOzQ/D9RcYIboJ9BTYzJgiiKGt985PJKs1mTNbQKH08EOivawbxpTowjpSW0qEkaAS2DrlnQNOrz7K1mUQpRbmK/s3spopjsRRnMgCko5KaxsOzvpERaWDup6fTRwOVG2oueLDVbVnGFvQfvY8jNLHk3Ul64KSntRZtQp7zIAg65kT24JoJbaO+yimJKWKgiPghtBfvtY0QmLTODLoEiZHGysg/tih05ooJ2At960irv20Ltz3XyIDCbnW7nQZaRovNdFfVqfVXW2ChXr9xNHwfTzrCx5hdFGU8ue9+eFOxXpwS5AkZXdr/uSfH2O9btSkk+2xd2eeJ1ShXyX4AHQ+6U9yIaRZGzWKURz69beDJFOSjGRXMcF/TSHu2KVd+jXdh37aNWXFZUsh9l0FV01m7CNz5fCOpAKgpapCJWeDpkPpudmvCxlLgsRdyzZNdF9B08IR3ivzjEtf/r3HIU3KLKEl1o1wnJB20fK+itJbuThypGZ+28bGeiHUk36BqCnkguOP5e4C6PFekU7vPzB8xfwXbm+BidBr6q6AzEEuetggSLKt7STqZeUHyEaQnwRdVCswJ4CcBk8LJqmXqmDqBnlplTAVhhDoNV5jBYYw6DdbWDrncZ6BUgU6NX1Y6ZzPlAyVzAPJPRNeZpdJ15Gr3GPI1usE0P4HW2yeANtskgZJsMIuZUATaYw6DBHAabzGGwpf1ygba1X4ze1H4xekv7xeht7Rejd7RfjN7VfjF6T/vF6H3k+Fy3gB/oEV0E/DCBlwA/4qTr0QJGN/GMtjm3EsicjzXHbHM+weLz3V0/1SO94rME8orPE8j029inTfgigUz4MoFM+Arccne/r/VI079JINO/TSDTv8PKNuH7BDLhhwQy4UdwL3T3+0mPNP3nBDL9lwQy/VesbBN+SyATfk8gE+6onb5MqvNn1bWpd4vSU/XbnXfY+RtlM7osAAAAAQAB//8AD3jatX0JeGPVeeg550q6kjftkmV50S7bsiTb2rxbtrxKtuyxx+PZPJ5hxuMZGAiTGQjLDEsIJSSkSUNC2gRCCDxaaFkmwLBMFghfSiYLJC9tmrRZ2rQp9AXStElL+sDy+88590qyJc8M+b4HY8m+Out//n05QhVoaT2CPyvYkYC0yIxsyI1aUAx1o340gWxJy/BAX08iHmn1e5rqai16nUZBUEV7QOnUO0VzxOw2R2LuWCQmsncRfpWf0mf0nX4CT2Ly71Ib1iERieHP5l7G/f85NPzw8PDDDw+7nM7h4eFDw87bHz7kch5yPvzww85Dh24fG3v48Jjju8IbKafXCf9uPeIaG/McgN/GnH3DrkM3dFnDs8ePP3b8+Gx41Rl2wj+ECJpf/x36GnmC7c2bdCGM0RJCqCaDCBGWFVgQrMKUQqHQKmq8ep1StAaMEcFt8cWi8UinxWxSuZf2mmKCw2G1NDVZyBM5w3cdVrPDYbY6EFpfR+P4MbxIHtS5UAVCOgFen0Z0Xj+83ADz2lETuiHzZOfszmSzVkWQUiCYILxSiTWamkyNrloQRfVSVQVRq/UZBSZES6bsSR99wD5EavFwaT+p4a5kI0JNjQ31MI29zlZrhQUb9fn/xIYAFiOiW3Qn2E8iwn4iIvsR6Yf4v6LXaq8NDgfvgZ/j2uPR92tPSH9do33unug9+Kuv9j8F//W/2v80/Nf/KkAytH6WhMnbqBF5URtqTwbbAi6nva7WajZUVqjFGkSUAGaSBjCQ2xBG+EMAEiuaatLrBQCwRwVoEfP5ExZrLIRj0QGcAPSwWEWf39yIzQge18BbPBaFByR8/Ej2pr0d03sv29+5syt71a72iZnL35c73NUbSWIymRq//EoxOazb3T+tX7PNZzu2x8X+/pq5/tGa39TtnMf2dv1PNUOtuZGRUDBmegsWokTh9f8mb5JnACOMcDph1Iu+lXmyFk4oUImVFRirlHgVqZBao1IfQQoFWiaYYkw1gF5YrhKJIGiFKXvmST90CV+wC4KmrJ+4XIVF0SrC2UbK9CAE2tJuqHyvXbuSvvZ2h8NkQqi9t70nHnWEHaFmn6nJ1FhXazTodbCZGl+NaA4YOEgjnQBKUw124wh2Gygs3S6V2WSJoE2fD+DCZ1+YbG6ZDIXYK/7ocK51+Np4orU13tWCZydb8h8F2MNEK14KZUMdM6HQTLh9Jojn1rbhu1OdkZFUtDOVOxicaQ/Tz6BFMJ6KdI7Qj2B/AmpZ/x05SZ5FDhQAPjOQ7A0HvU0N9XW1FbhCIA6MBJKmGI6XgVwtGSUQKYMMoFBbm9PZFmuLOgPO1jaXSrQElH6V20X3FE8U7ww+ssYTVpVoRbA1K9+lIeHzA2rBTklw99I1/Qe7pmcb64OzncF0YPv2/v3tjUMdoffnPtcVn+jv8DVNnhzuGZzvF/fsD+/sTR10t0z4gpOBwGRgcNo5vjI+33Dl0EmyOxKIj9bHW5rjay9nr5u1Z8K9Y4DzwBfQg+RBVIOCmSdbAFEqKeth54sBCXSI/rkIf+IlSiHTu562eAlsxxDLsx7RJLp36u1Go10vtuEfkeOtRrvd2HqcBKDHwPoOnCBfRtVI9VS1ErcHGMtKWNn2rOKjx46tNC9s377QvPCzW2796ULrzhc+cO25xQCdEOh3B/bLfUXoy8HjT3DAhVi/FRjh5sVz137ghZ2tCz+99ZafLbC+vfg6vES+CjsZTg4uTo0n/PVWUQ2cKd2PUTUc2iS0AuQnNyEiYCKcoiyWH6QwBSMso31zs+0hl0MpmgIGtuZ4QiXC/26Xzw9/J+KD2M9/o2dptcD/Pj87YM6QoS3tQ/+i/E5UabGV/wbY7KJd/RYr24n761o1FhTVtc1WpVJVpVBU1gcDgWB9pUJRpVIprM211QoBq7UVFfl2CtWF2uHrqjXWiErbqDG5GONWVqt0Or1ep1NVK9WiKFS7TJpGrSpi1VRfeksG1xQ6SmpIFFUiX9KNYDrFAuA9ABILaAVYA0UTBZ5mfF2nEusC2E0laoxK1gipeTHzIvzDLS++mH7pJTre9PqN6CW0H/DPmgQyR+My+gEReQwU04A8XAUxJ840V1lAytU7HcGjoTAVd0F342AXHasL/Qr34ihQbm3SzBB3oYC4eh0dzOg0O7uwkFvD0Um2n0mQu8/A/JVUg6BPgCNibMUUBypRhUcAVlUsZY9KErYqL13x+m/Wz+KHyOswrz5ZQwcFYYJP8gkpW8MzC7kHFsjr776GmMztBb5yLTkHrLAJtSVbgKuyHXMOgkHYswXogPZ0TbrGWgvjmSCMAorNPJHEoiFAJkpMjTCT6oOTkx+cn4PXW+f79kWj+/r69sVi+/qq9nxxdfWBPXseWF394p6JyVvn5m6dmKCvHAZ1lBRAB1Ahe7IWjlIAeKU5h8dYi6f0RgY60Z+I6N1PX+d6ZDBLZrM9J9a2Ida/AzZVCfuxodakv6oStgPYQEiagZOxRqrELCEmj/RWj18h1gYGMSVmunqV6I9LzFCL4Xw63pkYah72du/yJZY+3XeoN7P4NF7K+YZ+OLAabe53dEWCH+rc2zd6Y+beNJ+/GeCph/lb0GCyz1YLc7kwkDSsAwtUuAOV4xWYXbEMCAqLAdm6rMJKpVVJT7kFNXs8To9XFG1w0pS5RDqpHArgmNUiCaTCCkUJ9N+/tTnuPtQ/sXPf/GR6fPfiUHyHP7rnE0OrvZme/sW+K8eqhmKRUHSit29gAuOh7vhYZzh8fXghPjCnr9k+0r07wnGhGV4GAPYVwOWCydYq4Ek4rVLCHjAC/fUwgI+JXK1iqrKysrqyGujKoKNr9Tr9OKKnGqw7psf4ztwjFXhh9+pqNvf7Px/Cr+QGx//81/hg7j4Ooy6AUSPM04j6kt0mjBXaGoEo4NzTCF6RAoS8IJAlLuE3AqgRNbj0Rq9HBpAl0ikJY9FP6UmM5xHyZ9cHIzsvD6db9k7MjXdX4HtyZ8WRmcHV/sH3jVX1RLr3N48Fhudi9fhA+vVQ5MBwarULYNAHa4vA+TWgVsqtDXo4O38dUSpIWgVsRaEUFKsoL2ZFWJjMIRpBr2xsbWzxuqFzvdfrU4PehqTFUK5BiQXEDCeSBkC5iEFWJERKMXcdHRi4auz2W9I3T/ftawl4JkLx3THHSr8n07xvfGipWrc4ih+DhQ4e6fvKvSt/caC1ud/tnbljm6YzkftIcMI/CtucO0DlDZxjFaOhpmS9AgiIURDlPZjp8KAFg/ZD1UrsjDnNwBSeyN2Fv5/70W6yku5du4vqG1GAQyvAwQ5w6EEjySGTigCHTYtFQJA4hRqAgOGMGKcIBOrrEQr0BLojHfWt9S0eFwxR16ahrKucxiHBx5AnQMo9rNKf/hrCmMkb7x9eSA1MDF3RP3DFUKZ3eGH4xJhnItwyHhja1T7uBpUpPuvzzcZBqapqX+we2Guu3dadmG8Lzid6Zy2Wvf3di+34E41xryveNBLxxRtI7nlHt9ff58TY2ef3djsY/m86e4cBjr1CAzYEgW0rgXCVZBXQX4C9CoIlUyQd5LOH3cLZ+7xedvYW6eg5HQ/gfkz/lPZvoJDg7NISwU+VnPogw4YUO/YOigHk3OZT57iQ+wg9dnb+sAcmQ/A6yAsr5eeUf7NF6rnxpuTGW1UVQlXWKotBxwQL5eeGIsFCyggZq/SO75alTe6A/BvYdEx24nWw6bQwmYj0QMb3I80ZjJ/D9z8ZCVC6T6CdOEcWAS9VT6kI6FDGmNdcjc0J4BC34dO4p/cXY88/P87OIoXOkRr8T4CJInIlmyj+UlMOFCSBLEgsnAhUtusoB6e0T/9P4W/nYuznn9KfTMOcU2gnMcpzCjBnIohjSrNyCp+GOV/Jdd///PNjv+j9BZ3Tvv47/Bqcfy3yoEQyaqmqpGwPU7YtwMQ3FckQysCVWKGwKqZsNpvH5vbWevwquhBZDhb4dA0G261Ybj/XsyfiHGiOznkje/9oYH80sqdnRi+D95TS0+VoSjg7g5ET7dsjbbO9VbcUmc90nW3rdwmjoCcPoix+JvNkBWjKBqeDqIXhJoOgUPf1EkDQNBhbVRs+0RR9YtqiT7nmu3bt4pM0V2qIAmSCinJoVQUGrfIgkhggMBa1WlgGwOjVU9LUQTC8FViziC61k+k9TtL0h0xCDYsAHKhaI6hXL9pZCYZHBxVCAlKubt1LFFWAYypxmXWf2UX/S9Ymkwgls8npiTE4qwGfr9Xr8fmqRHuJ8uSiNlaRkAAjrINZl50yX5TUqk5mroABmuDagMQ+Rp488v4Xrz702OHoXCjUr26c75hcSh3r6Rw1VKf0Hk9jY7d36b49K4+v7vvC3oGDCUPPVSPNO9U4Hgtmw/2Rk4cfO/S+F48feGg5e2U81OwP758eOZEKeoaVC2etTe6WxeGFTy2uPrGy576leqfd61i7bErURnqiOzpiQxQfAS3JD0DeiKA5BJLNGgxwSQN1ALkoQGugYlzATHtTq9UV6gqujteC1iAyU9tfiUl37tbRBRym/1bu/8K995In1rb9Kz6a+wzAfB+MfxzG14FW50L9yR6QODCDCjgCyGUlVackB5WIudZP57LXGfTOpjqX3VVr0dsMtjaHmindGwWPE0sKltko/7IP9yZ2tHd09A1Fl3pzz2N/9+Rk949/mdy2LflL8kRbtiM61tC4pyu+ox3fNdDePvCT3Lnxrq7xHNNtqNz8KJMhoWSgzlZZQXEkLYsKywYXGjxg0sJHXWh5lMirCMUHjhMP7t//4NLYLR0x30pi8nQmc3oyseKLddwyVgXntvzggURnvCU0fVtm6oPZUEu8g+oyFG4vMH3OzCykPJiYo0ACU1WlyVBprjL7wLoE8MgoGcAJCfcCWL/vjWOPLC8/cuyNNxZuz2RuX/gseWLnvQcP3rdzfOzUzMyNY2s/Z3ufgfn6YL5KFE62yRyb6m6KJRCbNcWaN7NoKrnHDVQ5o1ni33qn+fP4mtxH8edzRvwWWflF+t/T5AlJt5bH16CWpE8en3JhNqqs2sAHGqShIzN+zEZ1y+PO8EFzr/BB+XndD+flRLFkJ5hJSGgiRKFkBoNSgRhykWUY2UI1X8b+QcsxwqG5uUnp1BcJ9dLDi7nxXdjYfvfEEjvAiU+FY97ruvkBtq/6voEvz/22vZsfYXd73N/Oj9Dd8FBhz7cwmPqTHkk9XgGdnO6X+su0aDMsMd0t/ETgldySzV2RzeJPU3LC3XTbub/BbXxcdB/z8RqpY6VgX3HTFIyrmWyW9qI2GcjFv2b0B1jETBmG0Uw5J8sCIJOVgV2HtEavAroXTBdYBaWyJz/Q1G1aDPdns4mDg1XJzq5A195J/FquY+RYH9/n3vw+HckGjVpJmOTFzCMocM+t0WDgsj6ixxEN0ASI1b1ZvHc193McXcm9cwzWm/sQPpX7a8Cf5PtfZeOOwLgaGFdJdWG2aDoaJQ0JdEqk1Ovpor2AJxE90eR6s2nAubXPsf6Uhn5fWJdYZl0mvbwuDRhBbn0lnMC+LFpH69ns+jpdlBP/fG0bEdn7/6D8uA8xXG5M2kVCSkY15EfFsCw3GxM/ms3mdtBj+T4Jw4jhte9T/ktx+Lf/P2x4znT2PbB//wP7Jk+n06cnOeJKLOfAg8vLDx2YyH5wKnPbNMdbpp9QnD0Ie6sCvgNWOKwCSFXA1CVTCCTAFmuqTYZqc41Z73OoaBDBmec9ZrfMlvUz2Dp2MpU6OXY+izULq6sL58gTXSuDgytdb+Oh7MhINveTYhiYaBwm2Ukd+0qiArNSINQ1WjDZFEWeUbPZ3GJuDvv8lAGDELeK/mJipo71eMKfsG4SwuS3zd7pztnw8f4lGUC5V7e7r+i8qq4hDyNcf3U41TPmD+RhlfuXpvqlnmXPYqgYXEXwqoE1gfwEgaHAsim8ApqIxN4kcvd4nHq9kfIeumK3H2xuPYOcUvYVkINH5r+06/GzWQa6XM85BjZ82wlD7u23GfQ+SQEn+TX/i4TJlwFqIK9qrQQkNsFF4KLO5yJ51YKavUEPBZdFtmqoFzREStgf9ycCOO97X0f4qpHIhHfxssyBWN/RoclrIu1th2ItI74dB686kbhquvLK/nDUmXBEE1ZDW6Y7vjsaCfe3hpyJpo5Ibd2u7V27o2ytQYDTJNMzuG8ob9JyZ45kCmA32LRuoBjT66T+9SyYtGmJlncAjnwK+puRM9koBRswLt6eGZlMHpMsjinzkvYo8THsum0yG1/u61uOZydvm6+aumMH/mTuqqHVnp7VIfrbjjumOH3LOpGKzqVkNjhwTolpcs4DJgnnPJSXAe8gP8h9fwH+YRBplPPCzxkyA2N5EVKYGD3BWBWU9wOzoKEtJsrZ5oFbGHRKKkkjdkz/Ce5K7Pbu/OrZxbNf3fmr6a+9OA3D/Q1pYz/byOTas3ydIEfJ3Yy/AX/UqGBoOH7KgmoymOObwWDQU7jCKmFIDRsdZJq4/+/+bhmLuf9h7ztzf4FtudfxIvz2OrbxsQ0w9sdgbDVqSNapBKDDPJOTvBAGFtySxoQj8+d+deCnP9+Xe3MO1+LP5J7C07mjuTfoWD0w1rgs+yk8C269vF8j79Yz6NmKE9y9AQpAD+gTRwnJHcAPrv12gPjTA2s/5vJ/2/rHcD/52SVamRFALPjZ9uajj75Jfta95uyGHuvvrJ/FT2zhcxVAv1Uu4GXucsWoA+ZryM8n+wOpakb9w3Q+VJjPCow/Bj8dMN2bPeTn3e8+QYeP4/vw0xy3zqgOjSQtwOGZlxRmph7jk5J354wKjRgjRrdfdP+o94Ghm25Ogiz69T/8A11zbv39ZG79GZjOwcbYwkdNhxABgIRsX/urTIqf6yBJYpF8D/paWd8q6DkBn5w0gEjmsyas7sGZ63vIVw2f4DyuE3SI3xA9siM/+kHSZMOCohaEgh40+aZGpaBSKtLcyHRAY6WKUGMLbGyq0NsyaqxSoWUJHyXj0lOmHSUt1ljW0ySb8uJjXtpw1KgzU/9Wvb/e53JQz5bH6zZq4KiQxQxnVWTEWQveWgOogXK4EN9+Rca+Ep+/PLGUyO5OTrknA42HdlgO1kzN9s5PdhH9NQdy39jW1rE70zkTaDAOLtos/Z05b3dkxtwXCieQFJ8nEyDrDGANPXdWW0GUIC849BoAaXWZvJPKJnko6TatedA5Nzeiqt8GX6YEt4uMdgkDUYiZjEaEjC6j026DJYPs2uQZ9VOi0svu0GL9474rBwauTPUfaMxkGg/0e2ba2mY6O2fb2mY7iX70xmz21Gh39AA5l/u3aHfOB8Za795odG9v71KU42k74NzbgHPlbTHb1raY5YK22H+dmpw8NR5d9kbrRnyRxQj8843Zo94Dsar06YmJU+lmT6TekdgXTyx1ORsj3lZ6ZnE4s0D+zPRC8ZlR2DEwMkOjGMoFdHdubsSQU2Su1w24fpHRLmGg0jMz+Nx6emZYQvECePRks24UoEeVkg/uFDutTnZy5Nza6IFo9+ipbPZGODhsXTu1+cwIPTPigTMzo3pq6QOPFwhThoigICv5ZdoyqiI9zmIBbbfeYrfVUglu8DH3q4efVmGxZiddn0p0wnLxwaXakPMDXaPXTY5eM3ry1twu9Upm8lAF3qvekU546jo8bWOnpzOnxr545/Rl+DN70uk9HKdAFuPtwPssaHeyQotVSh1GKpLm2Sr1SKVSLoPGVsscHmhJgSXPK8tQqQNjQwVcZrX0w13JCo+bxSlF0c7ljJvyfuY05EioMr90882ZbdvGE/FWr6Zeb3USZSo3gL+eGu9JOxOaKm8904O3kxaAH83R+HayqlFHVEqNmvmwJf4KDA1kjoqsUs1yWVQQiXAZMI0F/ppvR5khrJO2RqVtTZc05qUNx/irA1QnnqkBm2jyeb0eyl+xvtiXHt/gSgc8jJXgYcvQiXT/1R5n4872XYcAJUeP9fcfG92Mkspc5/Bqj6+pt8GxfWp7e2zw6vHxqwdi7btyh0LbopFtodC2SHRbiJ/9NCCoAmjYTKNjBh5XYbQECjvzBtuKTHJARL3JbaI+CMrq4Dglf51e4nb4hl0dmYnuwGRbJmNdihN9ZE9P7lk8ODjrGXDnngW29nZrjNHEILx+kfw16Gha6gXI+/RrKfLoM7JHRVtTXcXc+cpN7nwRVIi9DQ1mU0ODyZfJkIONJvqrqXHf2jsw/vor61lpfDulOS3I5RpQQUlaWTSTIDBcVexXwUbtCh5CsFfVWS1GPZtVLAkiFDsBVPkVXBXUVlV5tbamzHiisJR3f6URB5QqTwOJrH23h+tmwJpYLLUSuZMOjQLoXWCmiY6vRtZP9Uam7WGq6DBRArBt/sm+p5YyGWzfj2tzb/xy750AzjbcyM+RHs9nYFzZ96Er8X1MAZSAW/G2QgToyY3+9Kyjjrk+OB1ZKBErl9WiSlAq9RkFjTQX2DWQOjykTVTQhKhUtuIWpgv0v1BXSh90wW7kcuuNbqPbpAFuUYReqg2/RMycOOCVPLk9nElFB7L8JWOaifTsNOv29hahXabonSinWsK9kc6+At5TnvzhZzjacxAYmfWkpNSulzFf2r+V40sJYUibL9tzy05029UXIynzJZCUch4oisuYcdjPJn+J7aL+EsuF/SVcMRi/cXLyxvFOqhd0cu1AUgvSpyYmTqdTXUuJ+L4EVw+QpM9tB31OX16fo3JaBWIQCL2gWFEgGXGxPqcvVdM2NjRdfLRLGOiS9Dn5OP4gfS73W3LmQDl9jupQ20GH0pfVoQo7sxUpM5kNIo2pPvpNqtHmhqaLj3YJA11Qh9JfTHZdQIdSrs3g6oISdSDXWar3zsPLYYBTFbr+GZ7EwYGkZ6JWwJLuS3USDhizTHgFxZh/aCrfa4sOsOmzehO3vQ3xiDlPms9cPt6zJwLs+G/6U7CJ3M9p0AajIOjnL8I6fagjGTLDQi1gbCNS8NbZNruffMjrCXD3E0/+iLM0ATnTzSr65AyCRkJl0HeOh/y7dkQGXZHgcvbwTHh/q2d6ItRXF+1KjISumKtq9iaG2rx1blO1fSgxOt9k7+lo9oAmadA7ukNjO6i+B2vcTu4GfS+cbLNgFZP5RLiNikayRAMpAAewJPdzTZTpcEYnVeK8NDsvppfSzUAw0XBePIG3t8YT49u2ZW6+2WnV12vMznQPTqf++I9TubP13ioNlTnAnwC5Gb8VaEKbzG+BYUoCf7N5YJU/oso8krIHC0ZB2Z5bdirwW7Pb5GZhlCLNn0pzHpjUE4Gy2S6Z6QJyvgMcFpgunsy9xJgunoT92IF4a4lSzumSvUCy7qs3MG+Fkbut7Nv/6pHtP54AzWweP0b1EwziDgkO6F/q/9Jf2P/lnr31Y0Mfu3X28fE7PzoOIy7jB+jP2jv4vtzBgp9OhLFZDmGFqMAKKt+oFwXGFkhRgMVgMFDEc/pFt9EfsSYiohE/8bl7d37zxZ2funvn11559VWsXnv55bXc7+m4jetTxAXj6qmuWKkGvIYhAbmloSle76drtzO81iOdweSW3KoUTQaxwHZRg8VjXkOdu86lbfyn+Wf+ctubdVOJp/XJalNdkoi5Ofz42kvJbsz3EoeXV2HOLXxk+gv7yOK4I/e3+BO5V3E0d6QX3zbemzs9zsYNrO/Ge8nzwHUBRjamAOgwnnCxDElosCgxAoxm9BaqQilCuB+DbI5RRZ3mqltriNnKg64ipU4Raxa9wVgs6F2cVvX3WrDX5/Nia2+f6vPNI7GPdbYlgp13xVPN6pimrq3lE6FEdU0i9PHWoE0Tg1muXD+LHtnC30a1tyv7+qQER+rf3o2X2dqbk14185PpMYK14/FCOvEyBdUMrQYgoilgBbHu54lKCcpdEo2kAQPKm10qeIcTCfX1WvmKLb39qun8To5rbMHWj4cSNdWJ0Cda2uo0MXVzKn5XZzDR1vmx2Eizen0dDeBWfDN+VC/i6vW13FtIcwbh53JvsQwZKuPm1negrxK9rOuz1VGFxJaRc+KMpETXZ/o2T0wFrTDyeSmXJLjXFCN6OXdkbRT/Wraxz+K3yTSqQ06KKY0NdTarxWTUVStJFY/twawLUtkHqH91LOeSlyBwTz8tPqDHCLIerGyPxQoizYx/OBfK9h3s7j7Ylw3OOqNtA4OhaO7D2d7erKtZOZiqnj4+OHh8umqoX+lvinRocldWdkZOXWnEdxivTPH8IET6QS+vR6lkEo6TJpwhkea1i3hSiQkwX5GwMBIzHWnmmSiyiBIn0npUT3MDwR6garHX7IwlWLZvsSsHjpCmKZL+tf87NDCQODg4em1td/WORH/2W99Kp32ec6k7Ro71SRHKO1Lniv3YFtSdjJsw0uC0GhaGKSc7rMIE1EbQZFcqWJkJz4+0mI0GuaREV0mLSlh5j1lOQIYfRuD4s4+/9tprc/Dz+O+o5xtPpmZTJ07ACz5M3d/c/iMLeA85w3K6OpnH1U+TnAF5WRBkWSlQQOGZMlld1BlbbJR1Fv2+207z5O3Gx6R3smA3GurrDfR3/g742oai+If4RZ0LB1RIJ+AA+o7kA57D15A7L8V/THOzBnE89y1yZ+JS/cdW0f3czB/3kO8ZbuK8zb/+Kl6HM9BSWxAhpijcRMXvB6ngYiEAFgLyMSmAJfWql2pbNBZUM3qkp+vgYG7gmgHc0rGzu3tX51oT+fO1XTxG/FP0l3gEgNaYtBdxBULZxUxR8nW8CHqXNTZazI2N5p82WiwNDRaLZFsOrifR/9AMbnQt25vOagI8NtIsQjXlx2kurx1g4IBgV1xNM8uAS68WGOl+OswsKJmsCWDWTVu14VLahmxGj8dDpTQFHc/id+XVI5YaC8IqHvnf/q5WW1hnbAANx2Q01eic0VqFGPQ2eIK6qlarWa81VuqzVJjAuUfh3H/Gzr1NpOfehr4r5Z6l8T8y/uRBPcmEq9ZapSA8XEkQXStDSM6wQNrsR5KI87jtNrMxj5eomGVJWZ7UvaqSFWPgMLhT4mPNZfLlCnwtd12ZjDm2BxaDE27QuWCtNCcxhf4EPYrUZwh+8lHGcMu0OYrrt2hzQm6DRfTUFm1W822q0We2aLMnP9dh9Fe8Ddnc5hv5cSrRDza24flWwnlGCwY0lkzpKXukcFcjDExIDcegVqxogDeqlkA1lUJjSq4oMavWoDNAZ63EnyqBWWI5ASdGc7JAIQDrKiAn4uR+v3s3vos05Iw/5Rk5ND0rnbsV35y7lefQJFnOUxy9k6yPx/w+haiqEwArbFrA3xoML2k7IP8kx32afgIM62p4QYqrZJepJYOAmUu2Joi6/bBqe94ICdI+CCtuutRObugU2tBJOHWxXsnA5g407ZMcKtOPW3iVPm8rkJ4RDLt6kI9aLDOHzeRXJj4uITxZ+sBQjUJs3EybtTs+uaNcwlc4oXDhjSTbrTl0766SDDDAJZYvxXC7WcL/2xku4SKc3NzmKHp2izYn5DaA/7ds0WZPfpzD6HrepoDb61Ry3MfmauPrWf9YuXGwo6jNUeBvm9qs/zuMs87W08bXs/5kSRsaNFaw9fBxDq8/snE9QEc0MPNtlnfRQCsRNmoYS2pMky40RSqGVgtvDdp6VjZqhm7VIG8qCr4PZiVF9LLfA4gqIoLQxy/z5LnRUTl97lv4fD6FDnencdvan/JEul+m/xNgwHKDGC/pkHjJ/SVwYvkuDE6d0tk+VsJvNrc5ihNbtDkht4GzfXWLNqv5NtXoS1u02ZOf6zB6ZRPfwmgOfRJ/m4AphVRPqWn+N2iQfqAOf8KasOKRO2J3fDj2YfovimfYG/sjhuR6hN+yuh43CmJRMogtWEECrQ31tiqVUqHBSJlPe6YfCUUfYWU+77lsr7Id8pnPtczVQ9MiLBlVmYiqg+cfSv4gC4+DqkoDqluPc/EhKMOpAW4T9LT5jH4jqxEqlBiI7kTBowTiHlmsmDtHEU/RwZYIeTGy/4F9XZcHIws7QxHgLt2Xt8Gva7/xOPAV44vAZPDu02mPI3fP+CKxnR5ZfuiAx9Wz0nF6FLgL/S339/t9+P448Jjcv2Q/OBXZ78sdiCN2/iy3huFal4SPT5fg7OY2R9G/btHmhNwG8PGJLdrsyY9zGP3FZl7DdXY2V58010sbx9mUdxVizF+pwMoVFZaijfnCYhCbWotJa9VZ9T6nTuSZIJGibDVvPltt9pWSbLXrebraTd+Us9UoLWyHuXXkZdRCfV8VYEAwFYrmq63KuecsvIOXVDx12uh1epwBNwsP5n3QoryEWL5OLF8QRUMA21muUuwylsq8mKIpzKmEt9c12d09mSU10flQaD56pJtnM4/TLOZxZ8IRS43G19b5ufK8je8BHEdAcSAodajccwHge0/R8/NyeywuF7f/Sv55dar4+Zn8+Id3Fj0X7Pn2lTcjxgfgufBnoH+2oQhKoiPJlQaAnaseNBwzrlB3YVWFBpRmUaWkVRsVKlKxitRIJapVK9UaIldt2DI1lVUCleUS+UWjwSBC0WR0sLc7GAl2todhgoABqM3r8WoB5HIweUOeflGKB4+ybIwxI1rxI+d9kB/xgPPQSY/z5Mi+oxvSP0aXrZ7L+zdFoXN3TrbRpJD0EI9HD3bFhxazRVkhiY6ORCE8nTvSMtLsM/eF2uM89yHJch/iWJGsbw87HQqlIgqmiJg3RRRpM1bJOlkQTGkVnNbVLEZ7lWxi22icVrUMChALADAvpz3PzUKsk0qkdcuX1otqZeGNvfCpi3VLtpX0oIYQOlSmoyofI4ujuJmrZ9QZoHiPalkNpsocPlKiliWPDZRL/nAttmtLbKluzfQ1wyX5IK4Wwc1tLJ7rQGlogtPWVajMc0pbXyh6fl5uj8Wjxe3P5Mc5fBl7vv4KvN3DxnmVj/9h3j4D0LMXPT9q4u3/D7z9Xzb+q3z8v+TP/5m+sfF5+8MPoXy9XIJ8B7SnINqdNOqYq7qhnt1qYTIaKvBE5sk6GuqU/fn6Ddm39qSJpr+BNFwtfgxWbWNjY7CxzefxeWlNgizkZPlm9VGlgd2FkbCKm4Mn+B8Xkycm0yeH+i5PHRxp2XeDfU/cPtXiOGgft820BWZjnbNtwW0RUvWF5bmbJ1LXZiben9w2OxcfaG42NDXZ2wYcaz9q35GILnSGF2KJxQ5a28bin5R3beO8a7EA93EGxzkO3xvLPafn91jR8/NyeyxeW9z+K/nn1buLn5/Jj3/4fZwHptC1pIb4mI/Qji7j93DQ5A/mhkIKESsVyoMqOXhvo6E9F0Iq5rBaLbRTKhWLQEPKZdZhZlfSwqxDu64OhJ3sYFRTa704mQCMxOJiNmyUrPTXadnd9+Qythdk83w8/VShek3Ix16tYMW25PU4E2hkfl+dzVoJupd6gx4HHwlFHxXrceV6le1QRo+zbanHFcf1Lq7H2crpcRccgulxTqezxdnsNfgNG/S4YjWOanEKq5ErcRaK5X4B5IjLO3nj+OxIw8KwywecaGascSGVu6nlnY44sKJ/X4z43wkn8Cf3RiZOp0Ouac9yBBhQ2J19J459LuBB3+laSgx35/7eCfjF40wUT3dy/D3M8W7jc4q/f1r0/LzcHosHitufyY9zWMJfHgOh4+yVxvlMUbyb58INJvukgHf5XMOi2POlhJ31f3jYWVgtm0eY38cZaR+wv12oyFcTyftzjkh2WrFdxPWbO/P6zZFMcd/L8n4ejaTDlvZ9Lq8DabZzvutYnxdczB9to/CrxSpBpNFTrCRCWsQqRA3Zw8yeYJceZWSN0oimrFarzWrz6PV6s1Mt1gWU3AuX8PNaPK6sdCYqieByd3T01Y/k6/JsziZ7o/7f7v/CJxq6O5vrP8tK9Bw2e6MRj7JCPSnPd54MAn0HUAJfzomunqpo9ZhqaCIJhzSCWgSyVAdA+1DJZF62jbLQxnTRcS48RJ4DtMAaRTURV+U7GGxg4qvV3GdpZaHcjXlwwdIOAE6t1AuVdjK9t1ne4wSUe+jb2toSbXGfxwj6abOzQqyXjzGeiG2ln5r18tn6itKRySA9ZYu+NCV59Qp+4L+SU5PpsVtbq8Y25SbTfGWGBZ8u5ChL/oCPMvvLJ9lf/1Fix/H8XMofxiT+8GdFfU/IfbEavbBF3/NSX4LVXOfhNY+sr1/qe0sJXdFc3B+Rc9BmnLXRCl6hGmmgzXNCNW0EbSTfEFDszUjO3z0GPKsOPvn7swYF0ajlsLyPik+MBCVagYPS5cuNbRkaEeKXuGjzyTqtW7ZmkoJ2YZLDmvd9Xur472VoikYGu93eam/x04wFn1sKU7lLUnzlC3PQ5iyVY0Mb0lQefTQzlPt9ca7K5NqzRfm+/6szmVz78gbumvcbRvJ+wyPoWLmzBv32zrx+e2QBlfM54gr04y36yrqxAG2+zusqgU/RWtJ6NJ4c0YHKoMf0jg+5AoQSn7iERFHynlORpM0wZQmI06iUw40mN63G0lMSlGtY3TKdWSXWWlTUOsNpykGJri73glzhyuinA+jL28DrUmmM9iDLg6a3xd2SNLpdICNrMFGqQGMWQdmg5RJOWi6PVKDIqRQrNBZasIb4OWfkGwtYdpdXbsoAgA+W60EzkXU+n6/NF6h1GXxet5tZTxs3pNqcVM0iN6KcWn06v0W1WrshwToENnBL9kHJwNXWSbs2GXEh2Rps3TYr/i7LuC7je1aX8T1vtovUkl3EanuZjG2VZOzLZfyoNF+aytg0l7Enpb65t2hdMO8LeKMlBskPCe0FK6pBISAIMakPNhG1WGulDiN6Vw6a4EwhUEkDMYJasaqR9fAaGj5QLleoiFLJw/nLPJwvcYZwuS4VWKXS846otJvpvc70niehjMIRDlPXd3gg3J+IaUPaUKDF7ayvMxupC7y2SjYQKA5wm8D6HpO1saPe7nO4NcY6u/E/Lilve4ev0RZttzb77UaDfdulJnGDLUuLn/SM3/C4wJH1e0tiBz+ENlWM33B798hnkJQHM4/eBJ5hpFkTatC4jDy/Rr5Wh6dXcTnt0VucrIRLFsygm8qM4U1KGyZdljMDJlebq8jDkjbF9ChYxTx6kcX8nSiZ7DebiEJwYn4NUeGUJVNDmydglhziaAQL3KKtLpuWbZQXZKVlxfKS9kk5ADN0aU0Wa8bLF1fICVizwzrr2zUi/p+1d6SFAp3QuP1DhTgL8FfNJj8ry+NG9xBlPt9aX5JvnclkaPIYjLcX6O4WkLsuoC9Gd/iH3GcBz/WMHrPS80+z56y+m+kZYUnP0JbQOIAENwh/BG1mpDYWdJa3OSu34XXi5+RxYPy7mE6Ai3QCOs4IazMjtfmTjW14fQjpBxypppnFVZUVGjBCBTWRK+Y3FZ9Xo2pzvvhcjFEkSZhFM+nP9c7PZz/ykXQamwOZAJ7J/Xg8M/5bqf6khuXEO5INlRWiikp8tVSRr5OKS83ssjosgkUkDYpr5jJTU5k5fFlr7ptY78/48XLum60FnekhBsMOCT7/WQJD7gP5nuQDobrao7wvnMtD7Lw6JD5JeHt4riB6uT3A6oWiuU7kY1tqdG6Luc7n/S3qE6goxhTJx5iOSHoh2SQLxhntcp/JkctQuVgYrkHnS2Lvm/w5uOZabtOAGSh8H87UgBpozkP+Zgs1yV9toaEl/HJuHTNUG4z1FhPL++UKgq0QY5dZIQ2zF9SpCFcR1l7e98X9+7+4D3DAODt5OpM+neZKwuKf7Vv+4v702j+TpulbM5nrUkjypwhAGcAlOlAX2pbMWrFaRV3gTJsBVq9UK1aqNESlkv0VlWKFUOSx6Ox0uRDq7OpMxKKuDld7azOM5TB4fB5vNSx6o+O7wMMLwt+xiZkjrgYIbXKFldt7/eg4S40fvc7rOjkiKQO5q4tS5PH1G2uv+nrHedL8WE/vKFULirPm8/VYkn5wkJ1rTMLdr5XgBM+Hpue6wP2d81JfwNGDDHdjEo6+yNvn3qL501J7+rypaK4T8lyAux8uO9cVDHcXOO7W87lYnT1bZ1xa530leM/zoek6d/B1HkNSDmOS1egP0/yKWLSpUaEU7TTrpk4HaoeW5VfUb5lfIYrMNW7JewEuJb/iop3K5ldcpNeW+RWl/aT8Cm+wmeZXGFh+BffJl0+w8F3KbQQkHFmZ0JZLtvjoZRe8o+CPdsYF9+asi8oDF761gJ9dcD3JctwHUS7Z1IFFVWdTo6AUN6bHKC+QHiPBxvaHHJ/tDzo+2x94fLaS4/MEmi8tPQZfNJkfv3hgqmyeTHifb+sU/+yCsiRbRulvukDSf4FWT8i0CnR+eAtaPS/TKlbH8ufN7qhwoheSOlrhjqzVIBmq6CWgUu4fDEAzy69m0V5yivo5pUQtjZowZY4QvB/EuR3LR9VGuyiQcNMl9Um2bGpO7xkg+FBJLwW9JFsP63YiKqRoGqGRmrLsGs2yJ0XdA/R2DbxgLHMY9dX0yo3QJoin8ldwsHqKJKunCKNXkrYWrBZazUSjDpoI0eQjk8q0TAlKhfK2CkzrVzVXgzADMNP6UUFQLKl4FWlJdDFY6KPWkJsu1inZWr69FGEs6iZQWFEbMIzCrMrDCtCiLpMtQou4tPTDykgAt5XicHehHsRb79WVRhLF8WhxkUjCovbyGCK7E4XhakLC1WtKcJXWsPya6a2LXG8lvSW6Lc+piORzKo6gz5Xq0czPf2fez39kujj34xv5nI1K9FpJPgbry+L5LKYAbW4tlxMCetmjZfsGCnEKXLMXSfe5zLP7XDyoN9llBt5UDScL/BQLaemGLPl+eBZCKBhI0MPjqXV7PPy+LJZBsclps+n6F/Kpydvmtea8Z8Ny2Qeke2DIE+zWF12D5MxwNljufV/xpTBSzSmsdQ5sIC96mzsIajRgPKoxFry46LZG6amy8NRUpu3mZnnvdr1UkERrebZyaDukNtTHnC/6KePDvvBYFx+GSoAKDy3YbGb1UBtd1BsLiQq2MZnjDuniuqJMkaHcWjWxucIob44yXKd35TB66OH5Q3ixBI95PRHl3bsZLoroJ0U5QyfknCF4/pGSvjwWdF6OBWFxPyrquyefb3QY3VaCx+wOG4br/ZIO+FTJ+LyGh+L6EtcBr0dFfffIfcHO/tst+p6R+lJf5+eK+p7I91WjU1v0PS/Pi9XDDG9ZbTi13bXU50GrDGjdFfN5sCImsp8aFXZGVFpUU+76N5VbKKr4/tLmMm+pHmCGnL/E+2ys9D6bB8cO98xku8n5O3fsKD9Gvs6MwEkQclKqMpPGSERE92B3dqbn8Bg5v2PHndIY0/ggeQ6scqnKooLQOos0mFPUz1FaF1CNqrxCvspC2jSzlx6ZagybYnV1MVO4YaqFTDfCnxYL/NHE5llAn2O+HR+b54I1B5srOHaXVGtINSLTuFqwsxqRLjZqkD4HDW1ViQVgHYv54mbhkipFir/j4sa+vkAAfmrd7lr6Q6b534G+Nv6g1s1rH+YxJX096mErCNfAZrQUY9JKVuHBKrUApouMGwv0kxle/eaxKKRqEek7GYqc6Df2NVn6847zx5gXyii5zNm5DZF+/EHyFdj5MJs3AbIAa5hvzoTxhBoLrE4NznKV3ey0KF/8QoQZpq1aQJQrJeRA9IsTClld+boEXN1k01uqTbWqkG7WXPQ7GTQYtTUOj/gB+Z2fxyB+jdW4iKiOrUqrBIycoFb3SaMhXxtjFd1eqdgFD/GKl5s/bjjNaG9b7q31p9YfRzXIw0aw1ZSpuPPkxxI3fjnB49yfWltv973L/aTMZ5rnkTfIPBKlcHQLHvk9mUeiFHquiL8W+h4Fm/lifY/i0aK+e/J9D+PZEh7J+57J9z0MfI7Z3uvbabymONbz7jrXYd5dl3SYdpCxHma3T0htvv5ujsf13s1JbXg8YTU/TjU6tEU84Sv5eEL1NCqbU5pCH99CPnwvnyuQWpHuvEdvEg2OXPz7IL6fC+PIuNxH6LmEPgJ5Nyf3GcdfRufIA4AznU8BukxknrQUf5GKbdMXqfDKx11Pcywyyg58Lqifp19v0VRLv96C3E6/38Ls4N9vQX10+KvoJfIgQEELUEnxOkaSytcxwjrwbWwdDajn6YYaIi+lml1+w77rhy3GuKGUTWDsb9dZT63HwG5c27gi65YLfGuLtdaXrhvfSR7U+fm62fq/Ces35NdPUUreCAYs/BKexA+8t9qwB8bHOzrGxjq+xN86xjn+TAJejaL9gBtgc+nc8PpNhuN6TC9JE+l3LCkOFH3H0iDKwGxv8vyuDi1W1vCvQFJjVRWuqFRVFH9tkrHaIFRWCst6jU5UFH/bUuwiHdk3J/HeIu0tSN+51F22X5lvXSrpC4pffGoqmZS/fWlqcWrH3Gwyk0yPjbQPtg90xct+E5PpD/gmJsemvz1FbR3x9/wtTXii6I/cWfk7m+5/z1/eVPaLnApf6ETvXYziCuCdSqR6CrTr9sAgtgLsfA+k7r479c43dE8/q5fuvIxivdxOYO38CasYhFYPPDD67NO6b7zCZMUb0r3TYTSTnKq3EwW9vaIS028uUIAAJAphRYNJBcaVtL4lX9BUhSsrZZcNs21DbYHWFr3BCzar3uitBvu2cI+WHwxaahvB2wApVNTSjED6fVFO5g7G3+bXUmc+vGJdyhLltkN1B2+bkOqYpj/kwoncGZWA53IvOj4y18euqk4eH0/Vae2O1PCRXlbEtDiWqm8ym1LZy/j3/OAWUoNPAB9UPQVKXTvjevym/xOsWJkqOqDqCMCVnXonEdbW6A8q3LvG7wxRP2MzVitJe5l7zN7jHRzvHNjyCg4pv4TZq7hdipWczeedBGismT0vxJr58/P55+LNxc/PyM/R4euKnxfGT6EPFT2/M9/+yBXyvSnz5AaAAY19qJ9pcRsxwKDEHJMhUbDFfJthcgO3zYoBI9lm/10EH8lO21EEIslEu6c0t46tmfoF+F5wJbq/aC9fycOk+mD+bhP0eXZ3k4wLEb17XrquiX6+vh0+V5Z+rlybQf8P2z+c0wABAAAAAQAA35vmhl8PPPUAHwPoAAAAANPBnYYAAAAA1L6m9f9R/u0EYQPFAAAACAACAAAAAAAAeNpjYGRgYD767yYDA8vE/4H/W1gSGYAiyIDREAClIAahAAAAeNp1lD9MU1EUxr9zXgeig8HBQSsaDVQtf6WBKmhtJKLSpi3PoDFaw8Bk0AgJLkYS48RAQuKiAyQdDHEzcXFwctDBRCYHnQhLbYiSyATR53cuLWJb2nz5te/d++453/3elXXcBj+Spo5RjfBlHoNaQETH0O6F0aHzOIkSBmUM56l2eY4+zeGiNCAtk4jjN67IQrCmr9EnozioaXTpVZzQ+9R1xMl+vcE5ecTstxvPuRzTa88hU7KJQ94DtOovHNVXyOsix26Qk8joKPWd/z8jg1X+DnONZ7ilUQx4I8h7SkV4/ykyjjMcwzp1Cm1awog9M3QGzfoWLbqA/TqNs3IPOda8SXZJCT2aDf7IJST0HE7rY/jahE6yR310yh3OfcTnZpHGMhJYDj7oEQxhBSlvGim7rg/deN/myBN6uIY2meC8LO93s7ckjmuEveXQpMoxM4jKAYyT7fKOvjZi2K15l56wRnnBWvagVd4g4eoaRwQ/MCBxdz1Gv7a8qqMQSPPPvNshrAafzD/yJ1X09uJUxbtq6WEMO5p/O2X+0We9gGvOqzryPpLWi/+/zDf6N0SWqBXW1L/tXbUsF8as8/efzD/z2Wj92prVtN5t/QotR9wX61fnuKfmh9W0Gy1rtt9l0qtvrPcLvYuSAXnZ+nAZZA4sh5aFbTIv0o1m89b6q6H5yt4qDDUgFgpzXebWslNDe+eYpxpOlTNWoe2PebQL7R1wObQ9NP/K74LlsZq2VzLL7JkKzPxXMkUlqPdI6j5eQ5CrPLOaNZ6W15R1wCtunTfYoF4CmkTcm0CcZ8KgO1OWyCWygJs6y7OC51JoDh3SixaqTReDosuHx7nc1zpfH/5f7RzwpAAAeNpNwl9IGnEAAGAz/5Sep6Xped6dt/M8r7vTzp+/02MM2UNEiMTwoceIIRE9RA8hETFihEhERA8REj6EjBESMYaIRIyIiOFDhMQIkREyhgzpQSSkh73sYXyfRqNZ/qegORnABta0qvZE+6B9HnQOXg62dTadoEvq0rqSrqZH9Ev6gv6PYcawYmgbk8acMW88M9aN7aH4cHa4bEJMKdO2qWpqmaF53pwxfzbXzV2ERqaQXeTGwlnSlqrlAbWhUTSN7qMVtGU1WAlr3Dpv/WA9tMVtdyPYSGnkZTQ52rdH7Qv2L/amvevIOJpj3FjVOeM8dnZdIdeBq+xqYTYsgWWwC6zuJtySe8594u7hUXwV38QLeAX/5UE8K54Nz52n5ekRQwROSEScyJIpMk1myByZJ0vkBXlLPlIh6i2VotJUhspRearizXnz3pL3wnvrfaRpepXepHfoQ7pIn9Hnr94xDBNiXjNTTIqZY5aYDPOR6fm0PtSH+zgf8MV9R+x7dpldZ7PsPltge36t3+Gn/cAf9+9we9wxd8p942pck3vingPFQDlwGagHfvIy/5W/5u/4Fv/Ev4w3xjvjfUEWtoQDoSRUhCvhXvgt9EVEfCMuiGvilrgnHomnYlWsiT/EttiTJqUr6V56lDpSP4gEsaAQjIYcoc6EZgKZOJIn5Vl5UV6Xs/KhXJTL8mUYC9fCzXA7/AKGAA4koIIEmAWLYBV8AjegHaEi05HtyDW0QQDn4ArcgLswD0uwAr/DBuzAvoIo2H+AklQ2lT2loXSjeFSICjE6BmPTsXLsOlZXURVXORWocTWhzqpF9Uw9V2tq4y9MM8mgAAABAAABPABgAAoAQAAEAAIAKAA5AIsAAACDAbUAAwABeNqNks1OwlAQhc9t0YAa48K4YGG6MO6EggQiLjVsFDQSwS0IApFaLcXErU/i1vcwxp8X0I2P4DN4ejtUJY0xN+V+d86Zmd4pAJbwCBMqkQKwyydkhWWeQjawiBNhE2WcCSewhjvhGaTxIDzL+IdwEnllCKeQVgXheRRUTXgBDXUr/IQV9Sb8DFt9Cr8gaawKv2LOWA/53UTasLEDF5e4gYcBeujDh4V7PnnYyKFIalO16Otrz4hc5+4wa8TcC2RQRZd5nq7kYqhdR4z1MOapRSVHl63XNo6xhyZqpLi8janMOI815Wnw5DE+0O9j/ej2nw4NRk/pcsnBTQ9Yo8s9yO1Qa5EPqQfaPvfOH7MI5ufzVEaW6/pXZVfXdaKqGWouz5OckWT1qPqMjjn5iSfLfdLT0Tf97pmNvWWTsTb/b4HDj2ZSlQlVtGpxFbVWYu8ctvi7iUL09Us4p6+rq3oy3UpUsY4rvuOAikfP8AvcvXhzAAAAeNptk1dsHFUUhr/fsXfdNk7vvVfHXvfEKS5rx7FjJy5x7MRJxrtjZ/F6F8a7cWy6BAIeQPDCM+UJEL0KJHhAolfRewfReaQH79wJXiTuw3z/GZ3znzP33iELd50bYB7/s1SbfpDFDLLJwYefXPLIp4BCAsykiFnMZg5zp+rns4CFLGIxS1jKMpazgpWsYjVrWMs61rOBjWxiM1vYyja2U8wOSiglSBnlVFBJFdXUsJNd1LKbPexlH3XU00AjIZpoZj8tHKCVNg7STgeHOEwnXXTTwxF6OUof/RzjOAOc4CSnsLidq7iam7mBO3if67mWp/mYO7mNu3meZ7mHQcLcSIQXsXmOF3iVl3iZV/iWId7gNV7nXob5hZt4mzd5i9N8z49cxwVEGWGUGHFuIcFFXIjDGCmSnGGc7zjLJBNczKVcwmPcyuVcxhVcyQ/8xOPK0gxlK0c++fmLvzknlKs85UsqUKECmqkizdJszeFXftNczdN8LdBCLeJ33tFiLdFSLdNyreBzvtBKrdJqrdFardN6bdBGbeI+7tdmbdFWbdN2FWuHSviDP/mSr1SqoMpUrgpVqkrVqtFO7VKtdmuP9mofT6hO9WpQI1/zjUK8y2d8wId8xKe8xydqUrP2q0UH1Ko2HVS7OnRIh9WpLnWrR0fUywM8yCM8ykM8zDXcpaM8w5M8pT5+Vr+O6bgGdEIndUqWBhVWRLaG/HWjVthJxP2Woa9u0LHP2D7Lhb8uMZyI2yN+y9DXGLbSSRGDxqkKK+kPeRa2YX4okkha4bAdT+bb/0p/yLOyPauQ8bBdFDaHE6OjlkktHM4I/C2ee9Rji+cTNSxszawcyQh8bVY4lbR9MYM20y9m0G5exl0Utmd6xDM92k163IW/w5shYRjoOJ2KD1tOajRmpZKBRGbk6zQdHNOhM7ODk9mh03RwDLpM1ZgLfyoeLSmtDHos83WbpKSZpsebJmWY0+NE48M5qfQz0POfyVKZkb/H28GUYUFvOOqEU6NDMftswXiG7svQE9Pa129mnHSR3z992pPTp52eOFhW5bIsWOnrHXasqWs1btBrHMZd5PVGorZjj0XH8sbPq3Rdaai+2mONxwaPjb4+YzThIv02WFIS9FjmsdxjhcdKw2BTdijlJNygoqkhxyq2Ysl8y53FSPfup2WRNf3Z6ThgnR/QJLrd07LA+32MNvua1nlW+jRMcjIai7jJudbY1B5FbCcvYnvqH7dltyEAAAB42mPw3sFwIihiIyNjX+QGxp0cDBwMyQUbGdidNkkyMmiBGJt5OBg5ICwxNjCLw2kXswMDIwMnkM3ptIsBymZmcNmowtgRGLHBoSNiI3OKy0Y1EG8XRwMDI4tDR3JIBEhJJBBs5uNg5NHawfi/dQNL70YmBpfNrClsDC4uAP4cJWAAAAAAAViY9nYAAA==) format("woff"); + font-weight: 400; + font-style: normal; } + +@font-face { + font-family: 'Metropolis'; + src: url(data:application/font-woff;charset=utf-8;base64,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) format("woff"); + font-weight: 500; + font-style: normal; } + +@font-face { + font-family: 'Metropolis'; + src: url(data:application/font-woff;charset=utf-8;base64,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) format("woff"); + font-weight: 600; + font-style: normal; } + +.signpost { + display: inline-block; } + .signpost:hover { + cursor: pointer; } + .signpost .signpost-action { + min-width: 1rem; + margin: 0; + padding: 0; + color: #737373; } + .signpost .signpost-action clr-icon { + width: 1rem; + height: 1rem; } + .signpost .signpost-action:hover, .signpost .signpost-action.active { + color: #0065ab; } + .signpost .signpost-content-header button clr-icon { + width: 0.666667rem; + height: 0.666667rem; } + +.signpost-trigger { + margin: 0; + padding: 0; + display: inline-block; } + +.signpost-content { + background-color: transparent; + min-width: 9rem; + max-width: 15rem; + min-height: 2rem; + max-height: 21rem; + display: inline-block; + position: relative; + z-index: 1070; + /*** + The signpost is above the icon top-{HORIZONTAL_POSITION} + */ + /*** + TODO: Create a general mix-in for the poover-pointer that can + 1. Accomadate all 12 positions + 2. Unification for the nomenclature between components + (if possible, I know they all use slightly different terms) + 3. Be used across Tooltips, Signposts (Do we also want it for Dropdowns) + 4. What's up with the namespacing here? Usually we use `clr-*` to denote + Clarity components but we aren't doing that in signposts. We should + consider it. + */ + /* NOTE: signposts need precise pixels for some measurements due to the design + Hence the 1px and 2px values you'll see below. + + I've tested the calcs below while resizing the base font-size for the rem + measurements and they appear to hold up well. + */ + /*** + The signpost is below the icon top-{HORIZONTAL_POSITION} + */ + /*** + The signpost is on the left side of the icon left-{VERTICAL_POSITION} + */ + /*** + The signpost is on the right side of the icon right-{VERTICAL_POSITION} + */ } + .signpost-content .popover-pointer { + width: 0; + height: 0; + position: absolute; } + .signpost-content .popover-pointer:before { + content: ''; + width: 0; + height: 0; + position: absolute; } + .signpost-content.top-left .popover-pointer, .signpost-content.top-middle .popover-pointer, .signpost-content.top-right .popover-pointer { + border-top: 0.5rem solid #9a9a9a; + bottom: -0.5rem; } + .signpost-content.top-left .popover-pointer:before, .signpost-content.top-middle .popover-pointer:before, .signpost-content.top-right .popover-pointer:before { + border-top: 0.5rem solid #fff; + bottom: 2px; } + .signpost-content.top-left .signpost-flex-wrap { + border-bottom-right-radius: 0; } + .signpost-content.top-left .popover-pointer { + border-left: 0.5rem solid transparent; + right: -1px; } + .signpost-content.top-left .popover-pointer:before { + border-left: 0.5rem solid transparent; + right: 1px; } + .signpost-content.top-middle .popover-pointer { + border-right: 0.5rem solid transparent; + left: 50%; } + .signpost-content.top-middle .popover-pointer:before { + border-right: 0.5rem solid transparent; + left: 1px; } + .signpost-content.top-right .signpost-flex-wrap { + border-bottom-left-radius: 0; } + .signpost-content.top-right .popover-pointer { + border-right: 0.5rem solid transparent; + left: 0; } + .signpost-content.top-right .popover-pointer:before { + border-right: 0.5rem solid transparent; + left: 1px; } + .signpost-content.bottom-left .popover-pointer, .signpost-content.bottom-middle .popover-pointer, .signpost-content.bottom-right .popover-pointer { + border-bottom: 0.5rem solid #9a9a9a; + top: calc(-0.5rem + 1px); } + .signpost-content.bottom-left .popover-pointer:before, .signpost-content.bottom-middle .popover-pointer:before, .signpost-content.bottom-right .popover-pointer:before { + border-bottom: 0.5rem solid #fff; + top: 2px; } + .signpost-content.bottom-left .signpost-flex-wrap { + border-top-right-radius: 0; } + .signpost-content.bottom-left .popover-pointer { + border-left: 0.5rem solid transparent; + right: 0; } + .signpost-content.bottom-left .popover-pointer:before { + border-left: 0.5rem solid transparent; + right: 1px; } + .signpost-content.bottom-middle .popover-pointer { + border-right: 0.5rem solid transparent; + right: 50%; } + .signpost-content.bottom-middle .popover-pointer:before { + border-right: 0.5rem solid transparent; + right: calc(-0.5rem - 1px); } + .signpost-content.bottom-right .signpost-flex-wrap { + border-top-left-radius: 0; } + .signpost-content.bottom-right .popover-pointer { + border-right: 0.5rem solid transparent; + left: 0; } + .signpost-content.bottom-right .popover-pointer:before { + border-right: 0.5rem solid transparent; + left: 1px; } + .signpost-content.left-top .popover-pointer, .signpost-content.left-middle .popover-pointer, .signpost-content.left-bottom .popover-pointer { + border-left: 0.5rem solid #9a9a9a; + right: -0.5rem; } + .signpost-content.left-top .popover-pointer:before, .signpost-content.left-middle .popover-pointer:before, .signpost-content.left-bottom .popover-pointer:before { + border-left: 0.5rem solid #fff; } + .signpost-content.left-top .signpost-flex-wrap { + border-bottom-right-radius: 0; } + .signpost-content.left-top .popover-pointer { + border-top: 0.5rem solid transparent; + bottom: 0; } + .signpost-content.left-top .popover-pointer:before { + border-top: 0.5rem solid transparent; + top: calc(-0.5rem - 1px); + right: 2px; } + .signpost-content.left-middle .popover-pointer { + border-bottom: 0.5rem solid transparent; + top: 50%; + transform: translateY(-50%); } + .signpost-content.left-middle .popover-pointer:before { + border-bottom: 0.5rem solid transparent; + top: 1px; + left: calc(-0.5rem - 2px); } + .signpost-content.left-bottom .signpost-flex-wrap { + border-top-right-radius: 0; } + .signpost-content.left-bottom .popover-pointer { + border-bottom: 0.5rem solid transparent; + top: 0; } + .signpost-content.left-bottom .popover-pointer:before { + border-bottom: 0.5rem solid transparent; + top: 1px; + left: calc(-0.5rem - 2px); } + .signpost-content.right-top .popover-pointer, .signpost-content.right-middle .popover-pointer, .signpost-content.right-bottom .popover-pointer { + border-right: 0.5rem solid #9a9a9a; + left: -0.5rem; } + .signpost-content.right-top .popover-pointer:before, .signpost-content.right-middle .popover-pointer:before, .signpost-content.right-bottom .popover-pointer:before { + border-right: 0.5rem solid #fff; + left: 2px; } + .signpost-content.right-top .signpost-flex-wrap { + border-bottom-left-radius: 0; } + .signpost-content.right-top .popover-pointer { + border-top: 0.5rem solid transparent; + bottom: 0; } + .signpost-content.right-top .popover-pointer:before { + border-top: 0.5rem solid transparent; + top: calc(-0.5rem - 1px); } + .signpost-content.right-middle .popover-pointer { + border-bottom: 0.5rem solid transparent; + top: 50%; + transform: translateY(-50%); } + .signpost-content.right-middle .popover-pointer:before { + border-bottom: 0.5rem solid transparent; + top: 1px; } + .signpost-content.right-bottom .signpost-flex-wrap { + border-top-left-radius: 0; } + .signpost-content.right-bottom .popover-pointer { + border-bottom: 0.5rem solid transparent; + top: 0; } + .signpost-content.right-bottom .popover-pointer:before { + border-bottom: 0.5rem solid transparent; + top: 1px; } + +.signpost-content-header { + display: -ms-flexbox; + display: flex; + -ms-flex-pack: end; + justify-content: flex-end; + -ms-flex: 0 0 1rem; + flex: 0 0 1rem; } + +.signpost-flex-wrap { + border: 1px solid #9a9a9a; + border-radius: 0.125rem; + background-color: #fff; + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + z-index: 1070; } + +.signpost-content-body { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding: 0 1rem 1rem; + max-height: 20rem; + overflow-y: auto; } +/*# sourceMappingURL=clr-ui.css.map */ diff --git a/other/unpentry.jsp b/other/unpentry.jsp new file mode 100644 index 0000000..01b81e8 --- /dev/null +++ b/other/unpentry.jsp @@ -0,0 +1,296 @@ +<%-- + * Copyright (c) 2012-2024 Broadcom. All Rights Reserved. + * Broadcom Confidential. The term "Broadcom" refers to Broadcom Inc. + * and/or its subsidiaries. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, without + * warranties or conditions of any kind, EITHER EXPRESS OR IMPLIED. See the + * License for the specific language governing permissions and limitations + * under the License. +--%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ page session="false" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> + + + + + + + + + + Login + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+ +
+
${ext_idp_err_msg}
+
+
+
+
+ + + +
+ +
+ +
+
+ + + + + + + + diff --git a/other/websso.js b/other/websso.js new file mode 100644 index 0000000..89bd9be --- /dev/null +++ b/other/websso.js @@ -0,0 +1,816 @@ +/* + * Copyright (c) 2012-2024 Broadcom. All Rights Reserved. + * Broadcom Confidential. The term "Broadcom" refers to Broadcom Inc. + * and/or its subsidiaries. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, without + * warranties or conditions of any kind, EITHER EXPRESS OR IMPLIED. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +/* + * JS util functions for websso + */ + +// namespace to prevent polluting the world + +// -------------vars -------------------- + var isMac = (navigator.userAgent.indexOf('Mac OS X') !== -1); + var isLinux = (navigator.userAgent.indexOf('Linux') !==-1 || + navigator.userAgent.indexOf('X11') !==-1); + + // jaked using build number 2137170 for CIP_CLN = 2952709 we need to + // update manually once CLN changes + var cipBuildVersion = '6.7.0'; + var _cspId = ''; + + var _VersionStr = null; + var _ishtml5LocalStorageSupported = null; + var _isLogInitialized = false; + var _xml = null; + var userName = ""; + var _url = null; + var _sspiCtxId = null; + var _rsaSessionID = null; + var isFederationLogin = false; + + var api = { + logging: {}, + activeTarget: {}, + session: {}, + sspi: {} + } + //snanda : the conn object will be used for all CSD operation + var conn = new ApiConnection(); + + // Enabling 'enter' on the submit button. + $(document).keypress(function(e){ + if (e.which == 13){ + submitentry(); + } + }); + + // things to do when document is ready + $(document).ready(function() { + // assigning placeholder value to password field + $('#password').prop('placeholder', password_label); + + federationLoginFlow(); + + }); + + var webssoLoginFlow = function webssoLoginFlow() { + + // if both logon banner title and content are set, display logon banner on websso + if (isLogonBannerEnabled()) { + var logonMessageText = tenant_logonbanner_title.replace(/'/g, "'"); + var logonBannerTitleEle = document.getElementById('logonBannerID').querySelector('#logonBannerTitle'); + logonBannerTitleEle.innerHTML = logonMessageText; + var logonMessageTitleEle = document.getElementById('logonMessageDiv').querySelector('#logonBannerTitle'); + logonMessageTitleEle.innerHTML = logonMessageText; + if (!logonBannerCheckboxEnabled) { + // hide checkbox and agreementMsg if checkbox is not enabled + $('#logonBannerID').hide(); + $('#logonMessageDiv').show(); + } else { + $('#logonBannerID').show(); + $('#logonMessageDiv').hide(); + } + } else { + $('#logonBannerID').hide(); + $('#logonMessageDiv').hide(); + } + + if (tlsclient_auth == "true") { + $('#smartcardCheckbox').attr('disabled', false); + var smartcardCheckbox = document.getElementById('smartcardCheckbox'); + checkboxDisableChange(smartcardCheckbox); + + //Remove username and pw widgets if both username/password or RSA are not enabled. + if (password_auth == "false" && rsa_am_auth == "false") { + //disable username field if hint is not enabled + document.getElementById("username").style.display = 'none'; + document.getElementById("password").style.display = 'none'; + } + //default to use smartcard authn if availble. + var smartcardEle = document.getElementById('smartcardCheckbox'); + smartcardEle.checked = true; + enableSmartcard(smartcardEle); + } else { + var smartcardIDEle = document.getElementById("smartcardID"); + smartcardIDEle.parentNode.removeChild(smartcardIDEle); + // Disable login button on page load unless smartcard authn is on + $('#submit').prop('disabled', true); + } + + if (rsa_am_auth == "false") { + var rsaamIDEle = document.getElementById("rsaamID"); + rsaamIDEle.parentNode.removeChild(rsaamIDEle); + } else { + $('#rsaamCheckbox').attr('disabled', false); + var rsaamCheckbox = document.getElementById('rsaamCheckbox'); + checkboxDisableChange(rsaamCheckbox); + + //default to select securID authentication if smartcard is not enabled. + if (tlsclient_auth != "true") { + var rsaCheckbox = document.getElementById('rsaamCheckbox'); + rsaCheckbox.checked = true; + enableRsaam(rsaCheckbox); + displayRsaamMessage(true); + } + } + // Make sure document is ready before checking if cookies are enabled + // and displaying the related error. + if (!areCookiesEnabled()) { + console.log('Failed to write cookie on document'); + } + + //on change of username enable login button + if (password_auth == "true" || rsa_am_auth == "true") { + $('#username').on('keyup keypress blur change', enableLoginButton); + } + if (isFederationLogin) { + enableLoginButton(); + } + //on change of smartcard enable login button + if (tlsclient_auth == "true") { + $('#smartcardCheckbox').on('change', enableLoginButton); + } + + setCSDInstalled(); + enableLoginButton(); + + //create the actual CSD object. this will also enable/disable + //sspi depending upon whether the plugin call succeeds or not + if (!isMac && !isLinux) { + createCsdInstance(); + } + + }; + + // Validation that checks if the browser and OS are supported. + // At the time of writing a minimum of IE10, Firefox 34 or + // Chrome 39 are required on Windows. A minimum of Firefox 34 + // or Chrome 39 are required on Mac OS X. + var isBrowserSupportedVC = function isBrowserSupportedVC(){ + var chromeReg = /Mozilla\/.*? \((Windows|Macintosh)(.*?) AppleWebKit\/(\d.*?).*?Chrome\/(.*?) Safari\/(.*)/i; + var CHROME_VERSION_INDEX = 4; + var ieReg = /Mozilla\/(.*?) \((compatible|Windows;.*?); (MSIE) ([0-9]*?)\.([0-9]*?);? (.*?)?;? ?(.*?)*\) ?( .*?)?/i; + var IE_VERSION_INDEX = 4; + var ie11Reg = /Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i; + var IE11_VERSION_INDEX = 1; + var firefoxReg = /Mozilla\/(.*?) \(.*?(Windows|Macintosh)(.*?) Gecko\/(\d.*?) ((\w.*)\/(\d[^ ]*))?/i; + var FF_VERSION_INDEX = 7; + var usrAgent = navigator.userAgent; + var result; + if ((result = chromeReg.exec(usrAgent)) !== null) { + if (result[CHROME_VERSION_INDEX].split(".")[0] >= 39) { + return true; + } + } + if ((result = ieReg.exec(usrAgent)) !== null) { + if (result[IE_VERSION_INDEX] >= 10) { + return true; + } + } + if ((result = ie11Reg.exec(usrAgent)) !== null) { + if (result[IE11_VERSION_INDEX] >= 11) { + return true; + } + } + if ((result = firefoxReg.exec(usrAgent)) !== null) { + if (result[FF_VERSION_INDEX] >= 34) { + return true; + } + } + return false; + }; + + function handleApiResult(result, err) { + var msg = result != null ? result : err; + if (!msg) { + console.log("Empty result message?"); + return; + } + var text = "Object Id: " + msg.requestObjectId + ", Request Id: " + msg.requestId; + if (err) { + text += ", Error occurred (" + err.errorCode + "): " + err.message; + } else { + text += ", Status (" + result.statusCode + "): " + result.result; + } + doLog("handleApiResult : " + text); + } + + function onAppInit(result, err) { + if (err) { + handleApiResult(result, err); + setCSDInstalled(); + return; + } + this._VersionStr = result["version"] + "." + result["build"]; + if (result["version"] != null) { + cipBuildVersion = result["version"]; + } + doLog("onAppInit : using CIP Build " + this._VersionStr); + setCSDInstalled(); + } + + function createCsdInstance() { + if (conn.isOpen || conn.isOpenning) { + return; + } + doLog("createCsdInstance : Opening the first connection to WebSocket server"); + conn.open(); + + conn.onopen = function (evt) { + console.log("CSD Plugin : Connection Open"); + api.session = new SessionApi(conn); + api.config = new ConfigApi(conn); + api.sspi = new SSPIApi(conn); + //Initiate the logger. log files are kept + // @%ProgramData%\VMware\vSphere Web Client\ui\sessions\... login.log + ActivateLogger(); + + api.session.init( + {appName:"webSSO-NGC"}, + onAppInit + ); + }; + + conn.onerror = function(evt) { + var message = evt == null ? "None" : evt.data; + console.log("No Plugin Detected ... Connection error: " + message); + doLog("No Plugin Detected ... Connection error: " + message); + setCSDInstalled(); + }; + + conn.onclose = function(evt) { + var message = evt == null ? "None" : evt.data; + console.log("Connection Closed: " + message); + doLog("Connection Closed: " + message); + setCSDInstalled(); + }; + } + + // if CIP is installed, writes to browser localStorage to set var "vmwCIPInstalled" to "true" + // then display a redirect link to KB. + // if CIP is not installed, set var to "false" + var setCSDInstalled = function setCSDInstalled(){ + if (this._VersionStr != null || !isVCLogin()) { + if (!isMac && !isLinux) { + var cspDownloadRedirectLink = 'https://www.vmware.com/security/advisories/VMSA-2024-0003.html'; + $('#footer').css('display', 'block'); + $('#downloadCIPRedirectToKBlink').attr('href', cspDownloadRedirectLink); + $('#downloadCIPRedirectToKBlink').empty(); + $('#downloadCIPRedirectToKBlink').append(document.createTextNode(downloadCIPRedirectToKBMsg)); + $('#downloadCIPRedirectToKBlinkBox').show(); + $('#downloadCIPRedirectToKBforAriaLive').append("
Warning " + downloadCIPRedirectToKBMsg + "
"); + } + } + }; + + var isVCLogin = function isVCLogin() { + if (tenant_brandname == null || tenant_brandname == '') { + return true; + } else { + return false; + } + }; + + var federationLoginFlow = function federationLoginFlow() { + if (isDiscovery && isDiscovery.trim() == "true") { + showIdpSignInPage(); + } + showIdpErrorAlert(); + webssoLoginFlow(); + }; + + //-------------- Cookies!! + + // create a Cookie + var createCookie = function createCookie(name, value, days) { + var expires; + if (days) { + var date = new Date(); + date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); + expires = '; expires=' + date.toGMTString(); + } else { + expires = ''; + } + document.cookie = name + '=' + value + expires + '; path=/'; + }; + + var readCookie = function readCookie(name) { + var nameEQ = name + '='; + var ca = document.cookie.split(';'); + for (var i = 0; i < ca.length; i++) { + var c = ca[i]; + while (c.charAt(0) == ' ') c = c.substring(1, c.length); + if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length); + } + return null; + }; + + var eraseCookie = function eraseCookie(name) { + createCookie(name, '', -1); + }; + + var areCookiesEnabled = function areCookiesEnabled() { + var r = false; + createCookie('LoginTest', 'HelloWorld', 1); + if (readCookie('LoginTest') != null) { + r = true; + eraseCookie('LoginTest'); + } + return r; + }; + + var enableLoginButton = function enableLoginButton() { + var userEle = document.getElementById('username'); + var smartcardEle = document.getElementById('smartcardCheckbox'); + if ( (userEle != null && $.trim($('#username').val()).length > 0) || + (smartcardEle != null && smartcardEle.checked==true) || + isFederationLogin) { + $('#submit').prop('disabled', false); + } else { + $('#submit').prop('disabled', true); + } + }; + + var checkboxDisableChange = function checkboxDisableChange(checkboxEle) { + var checkboxLabel = checkboxEle.parentElement.getElementsByTagName("label")[0]; + if (checkboxEle.disabled == true) { + checkboxLabel.style.opacity = '0.5'; + } + else { + checkboxLabel.style.opacity = '1'; + } + }; + + // Status = true if you want the fields to be disabled. + var disableFields = function disableFields(status) { + var userEle = document.getElementById('username'); + var passwordEle = document.getElementById('password'); + if ( userEle != null && passwordEle != null) { + if (password_auth == "true" || rsa_am_auth == "true") { + passwordEle.disabled = status; + } else { + //Not allow to enter user name unless the pw authentication is available + passwordEle.disabled = true; + } + } + disableUserNameEle(status); + document.getElementById('submit').disabled = status; + + var smartcardEle = document.getElementById('smartcardCheckbox'); + if ( smartcardEle != null) { + smartcardEle.disabled = status; + checkboxDisableChange(smartcardEle); + if (smartcardEle.checked && passwordEle != null) { + passwordEle.disabled = true; + } + } + var rsaamEle = document.getElementById('rsaamCheckbox'); + if ( rsaamEle != null) { + rsaamEle.disabled = status; + checkboxDisableChange(rsaamEle); + } + }; + var disableUserNameEle = function disableUserNameEle(disable) { + var userEle = document.getElementById('username'); + var smartcardEle = document.getElementById('smartcardCheckbox'); + + if (userEle == null) { + return; + } + if (disable == true) { + userEle.disabled = true; + } + //enable only if user ele is needed, i.e. when not using smartcard. + else if (smartcardEle == null || + (smartcardEle != null && !smartcardEle.checked)) { + userEle.disabled = false; + } + } + + // return true if only smartcard authentication is supported + var onlySmartcardEnabled = function onlySmartcardEnabled() { + if (password_auth == "true" || rsa_am_auth == "true") { + return false; + } else { + return true; + } + } + var enableSmartcard = function enableSmartcard(cb) { + // reset login guide text + var response = document.getElementById('response'); + response.innerHTML = ''; + response.style.display = 'none'; + clearInfoText(); + + var usernameField = document.getElementById('username'); + var passwordField = document.getElementById('password'); + + usernameField.placeholder = username_placeholder; + + if (usernameField.placeholder.length == 0) { + usernameField.placeholder = getDefaultUsernamePlaceholder(); + } + + //keep it checked if this is the only authentication method. + if (onlySmartcardEnabled()) { + cb.checked = true; + } + + if (usernameField != null && passwordField != null) { + if (cb.checked) { + usernameField.disabled = true; + passwordField.disabled = true; + } else if (password_auth == "true" || rsa_am_auth == "true") { + //usernameField should always be avail if cb is enabled + usernameField.disabled = false; + passwordField.disabled = false; + } + } + + //uncheck RSA checkbox, as only one auth method could be selected. + var rsaamCheckboxEle = document.getElementById('rsaamCheckbox'); + if (rsaamCheckboxEle != null) { + if (cb.checked) { + rsaamCheckboxEle.checked = false; + } else { + rsaamCheckboxEle.disabled = false; + checkboxDisableChange(rsaamCheckboxEle); + } + } + + }; + + var onlyRsaamEnabled = function onlySmartcardEnabled() { + if (password_auth == "true" || tlsclient_auth == "true") { + return false; + } else { + return true; + } + } + + var enableRsaam = function enableRsaam(cb) { + var usernameField = document.getElementById('username'); + var passwordField = document.getElementById('password'); + + //keep it checked if this is the only authentication method. + if (onlyRsaamEnabled()) { + cb.checked = true; + } + + if (usernameField != null && passwordField != null) { + if (cb.checked) { + usernameField.disabled = false; + passwordField.disabled = false; + document.getElementById("password").placeholder = rsaam_passcode_label; + } else { + //password is the non-user definable label. so this is secure. + document.getElementById("password").placeholder = password_label; + } + } + displayRsaamMessage(cb.checked? true:false); + + //uncheck smartcard, as only one auth method could be selected. + var smartcardCheckboxEle = document.getElementById('smartcardCheckbox'); + if (smartcardCheckboxEle != null) { + if (cb.checked) { + smartcardCheckboxEle.checked = false; + } + } + }; + + var readyAcceptingRSANextCode = function readyAcceptingRSANextCode(self) { + var rsaamCheckboxEle = document.getElementById('rsaamCheckbox'); + rsaamCheckboxEle.disabled = false; + checkboxDisableChange(rsaamCheckboxEle); + document.getElementById('submit').disabled = false; + document.getElementById('username').disabled = false; + document.getElementById('password').disabled = false + progressStart(false); + document.getElementById('response').style.display = 'flex'; + var castleError = self.getResponseHeader('CastleError'); + response.innerHTML = castleError != null ? Base64.decode(castleError) : "Please submit the next passcode"; + + console.log('Enter next passcode.'); + doLog("Enter next passcode."); + }; + // handle the sso response + var handleResponse = function (evt) { + var self = this; + var rsaamCheckbox = document.getElementById('rsaamCheckbox'); + //var smartcardLogin = smartcardCheckbox != null && smartcardCheckbox.checked; + var rsaamLogin = rsaamCheckbox != null && rsaamCheckbox.checked; + + if (self.readyState == 4){ + // process response + var rsaSessionID = null; + + if (self.status == 401) { + // Multiple leg authentication + var authHeader = self.getResponseHeader('CastleAuthorization'); + if (authHeader != null) { + authHeaderParts = authHeader.split(' '); + if (rsaamLogin) { + // RSA AM NextCode mode, first leg will return 401 with rsa sessionID in header. + if (authHeaderParts.length == 2 && authHeaderParts[0] == 'RSAAM') { + rsaSessionID = authHeaderParts[1]; + } + } + } + } + + if (self.status == 302) { + // redirect back to original url + document.location = originalurl; + } else if (rsaSessionID != null) { + // next code mode. + _rsaSessionID = rsaSessionID; + readyAcceptingRSANextCode(this); + } else { + //all non second leg scenarios. + var response = document.getElementById('response'); + var progressBar = document.getElementById('progressBar'); + var castleError = null; + + if (self.status == 200) { + if (protocol === 'openidconnect' && responseMode !== 'form_post') { + document.location = self.responseText; + } else { + var postForm = document.getElementById('postForm'); + postForm.style.display = 'none'; + postForm.innerHTML = self.responseText; + } + } else { + // display the result + response.style.display = 'flex'; + progressStart(false); + castleError = self.getResponseHeader('CastleError'); + response.innerHTML = castleError != null ? Base64.decode(castleError) : self.statusText; + doLog("Error received during negotiation. Msg : [ " + response.innerHTML + " ]"); + disableFields(false); + } + + if (!(protocol === 'openidconnect' && responseMode !== 'form_post')) { + // if SamlPostForm is present, submit it + var samlPostForm = document.getElementById('SamlPostForm'); + + if (samlPostForm != null) { + samlPostForm.submit(); + } else { + // Re-enable everything since the user will have to attempt + // logging in again. + progressStart(false); + disableFields(false); + + //give a generic error + response.style.display = 'flex'; + if (castleError == null) { + response.innerHTML = error; + } + doLog("did the login fail? if using SSPI - ensure the logged in user can login to the SSO service"); + } + } + } + } + }; + + function displayRsaamMessage(messageOn) { + if (messageOn == true && rsaam_reminder.length > 0) { + showInfoText(rsaam_reminder); + } else { + document.getElementById('infoID').style.display = 'none'; + } + } + + var progressStart = function progressStart(doStart) { + var submitBtn = document.getElementById('submit'); + var progressBar = document.getElementById('progressBar'); + if(doStart == true) { + submitBtn.style.display = "none"; + progressBar.style.display = "block"; + } + else { + submitBtn.style.display = "block"; + progressBar.style.display = "none"; + } + }; + + var showInfoText = function showInfoText(message) { + var infoElement = document.getElementById('infoID'); + var infoText = document.getElementById('infoText'); + + infoElement.style.display = 'block'; + infoText.innerHTML = message; + }; + + var clearInfoText = function clearInfoText() { + var infoElement = document.getElementById('infoID'); + var infoText = document.getElementById('infoText'); + infoElement.style.display = 'none'; + infoText.innerHTML = ''; + }; + + var showErrorText = function showErrorText(error) { + var response = document.getElementById('response'); + + if (error) { + response.style.display = 'flex'; + response.innerHTML = error; + } + else { + response.style.display = 'none'; + } + }; + + var getDefaultUsernamePlaceholder = function getDefaultUsernamePlaceholder() { + var usernameLength = usernameText.length; + if (usernameLength > 0) { + var username = usernameText.trim(); + if(username.charAt(usernameLength-1) == ':') { + return username.substr(0, usernameLength-1); + } + return username; + } + return ""; + }; + + var submitentry = function submitentry() { + // calculate redirect URL + var originalurl; + originalurl = document.URL; + _url = originalurl.replace(searchString, replaceString); + + // get the field values + var submit = document.getElementById('submit'); + var smartcardCheckbox = document.getElementById('smartcardCheckbox'); + var rsaamCheckbox = document.getElementById('rsaamCheckbox'); + var progressBar = document.getElementById('progressBar'); + var smartcardLogin = smartcardCheckbox != null && smartcardCheckbox.checked; + var rsaamLogin = rsaamCheckbox != null && rsaamCheckbox.checked; + var username = (document.getElementById('username') == null)? '': $.trim(document.getElementById('username').value); + var password = (document.getElementById('password') == null)? '': document.getElementById('password').value; + doLog("Login started for user : " + username); + // Note: it is perfectly fine for the password field to be empty. + if (username != '' || smartcardLogin) { + if (isLogonBannerEnabled() && logonBannerCheckboxEnabled && !isBannerChecked()) { + return; + } + + if ( smartcardLogin ) { + _url = _url.replace(sso_endpoint, cac_endpoint); + } + + // Display progress + progressStart(true); + clearInfoText(); + var response = document.getElementById('response'); + response.style.display = 'none'; + // create a request + var xml = new XMLHttpRequest(); + // function to call after the request is completed + xml.onreadystatechange = handleResponse; + xml.open('POST', _url, true); + // Disable the fields. + disableFields(true); + _xml = null; + doLog("Using username password to login"); + unp = username + ':' + password; + unp = Base64.encode(unp); + var params = 'CastleAuthorization='; + + //temp solution allowing smartcard authentication test. + var authType = ''; //default + + if (tlsclient_auth == "true" && document.getElementById('smartcardCheckbox').checked == true) { + authType = 'TLSClient ' + unp; + } else if (rsaamLogin) { + if (_rsaSessionID != null) { + authType = "RSAAM " + _rsaSessionID+ " "+ unp; + _rsaSessionID = null; + } else { + authType = "RSAAM " + unp; + } + } else if (password_auth == "true") { + authType = 'Basic ' + unp; + } + params += encodeURIComponent(authType); + + // disable http caching + xml.setRequestHeader('Cache-Control', 'no-cache'); + xml.setRequestHeader('Pragma', 'no-cache'); + xml.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); + // send request + xml.send(params); + } else { + doLog("Error : Not ready to login"); + } + }; + + function ActivateLogger () { + if (api.logTarget) { + api.logTarget.close(); + api.logTarget = null; + } + api.logTarget = new LoggingTargetApi(conn); + var config = { + targetName:"login", + logFileSize: 20000, + maxLogFiles: 10, + logTime:"true" + }; + api.logTarget.setConfig(config, function (result, err) { + if (err) { + console.log("Error creating logging target (" + err.errorCode + "): " + err.message); + api.logTarget = null; + return; + } + if (api.logTarget != null) { + console.log("Log Target Activated - (object id = " + api.logTarget.objectId + ")"); + _isLogInitialized = true; + doLog("Log initialized for websso login"); + } + }); + } + + function doLog(strLog) { + if (_isLogInitialized == false) { + return; + } + api.logTarget.log({line:strLog}); + } + + var isBannerChecked = function isBannerChecked() { + var cb = document.getElementById('logonBannerCheckbox'); + var alertMsg = logonBannerAlertMessage + " " + tenant_logonbanner_title; + if (cb && cb.checked) { + clearInfoText(); + return true; + } else { + showInfoText(alertMsg); + return false; + } + } + + var isEmptyString = function isEmptyString(data) { + // checks for null, undefined, '' and "" + if (!data) { + return true; + }; + return data.length === 0; + } + + var isLogonBannerEnabled = function isLogonBannerEnabled() { + return !isEmptyString(tenant_logonbanner_title) && !isEmptyString(tenant_logonbanner_content) + } + + function displayLogonBannerDialog() { + $('#dialogLogonBanner').html( + '
' +
+               '

' + tenant_logonbanner_title + '

' + + '' + tenant_logonbanner_content + '' + '
'); + $('#dialogLogonBanner').dialog( + { + width: 650, + height: 400, + modal: true, + draggable: false + } + ); + $('.ui-dialog-titlebar').html(''); + $('.close-button').click(function() { + $('#dialogLogonBanner').dialog( "close" ); + }); + } + + function getQueryParam(name) { + var value = getQueryParamFromUrl(name, window.location.href); + if (value !== null && value !== "") { + try { + value = decodeURIComponent(value); + } catch(e) { + console.error(e); + value = null; + } + } + return value; + } + + function getQueryParamFromUrl(name, url) { + var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"); + var results = regex.exec(url); + if (!results || !results[2]) { + return null; + } + return results[2].replace(/\+/g, " "); + } From 3ff605298b303ac7c40698de70ffbdf39cf49691 Mon Sep 17 00:00:00 2001 From: William Lam Date: Thu, 6 Feb 2025 12:40:36 -0800 Subject: [PATCH 02/37] Update w/HSM Firmware Details + Fix Description --- .../Get-vLCMClusterImageInformation.ps1 | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/powershell/Get-vLCMClusterImageInformation.ps1 b/powershell/Get-vLCMClusterImageInformation.ps1 index 28cad85..93ce4d8 100644 --- a/powershell/Get-vLCMClusterImageInformation.ps1 +++ b/powershell/Get-vLCMClusterImageInformation.ps1 @@ -1,7 +1,7 @@ <# - .DESCRIPTION Sizing calculator for VMware Cloud Foundation (VCF) and VMware vSphere Foundation (VVF) + .DESCRIPTION Retrieves vLCM vSphere Lifecycle Management (vLCM) Image details for a vSphere Cluster .NOTES Author: William Lam, Broadcom - .NOTES Last Updated: 01/29/2024 + .NOTES Last Updated: 02/06/2025 .PARAMETER ClusterName Name of a vLCM enabled vSphere Cluster .PARAMETER ShowBaseImagDetails @@ -79,6 +79,25 @@ Function Get-vLCMClusterImageInformation { $solutionResults | ft + Write-Host -ForegroundColor Green "FirmwareAddOns: " + + $firmwareResults = @() + $firmwareAddOns = $clusterSoftware.hardware_support.packages + + if($firmwareAddOns) { + $firmwareAddOnsHsm = ($firmwareAddOns | Get-Member -MemberType NoteProperty).Name + $firmwareAddOnsName = ($firmwareAddOns).$firmwareAddOnsHsm.pkg + $firmwareAddOnsVersion = ($firmwareAddOns.$firmwareAddOnsHsm).version + + $firmwareResults = [PSCustomObject] [ordered] @{ + "HSM Name" = "$firmwareAddOnsHsm" + "FirmwareAddOn Name" = "$firmwareAddOnsName" + "Version" = "$firmwareAddOnsVersion" + } + + $firmwareResults | ft + } + Write-Host -ForegroundColor Magenta "Components: " $componentResults = @() From c6387a17894b40054803a1bdea41d75b169d479a Mon Sep 17 00:00:00 2001 From: William Lam Date: Fri, 14 Feb 2025 07:28:42 -0800 Subject: [PATCH 03/37] Update TLS cert function based on user feedback --- .../deploy_vsan_data_protection_ova.ps1 | 42 +++++-------------- 1 file changed, 11 insertions(+), 31 deletions(-) diff --git a/powershell/deploy_vsan_data_protection_ova.ps1 b/powershell/deploy_vsan_data_protection_ova.ps1 index bc020aa..465c654 100644 --- a/powershell/deploy_vsan_data_protection_ova.ps1 +++ b/powershell/deploy_vsan_data_protection_ova.ps1 @@ -24,41 +24,21 @@ $vsanDPvCenterServerSSODomain = "vsphere.local" #### DO NOT EDIT BEYOND HERE # https://gist.github.com/jstangroome/5945820 -Function Get-VCCertificate { - [CmdletBinding()] +function Get-VCCertificate { param ( - [Parameter(Mandatory=$true)] - [string] - $ComputerName, - [int] - $Port = 443 + [string]$Server, + [int]$Port ) - $Certificate = $null - $TcpClient = New-Object -TypeName System.Net.Sockets.TcpClient try { - - $TcpClient.Connect($ComputerName, $Port) - $TcpStream = $TcpClient.GetStream() - - $Callback = { param($sender, $cert, $chain, $errors) return $true } - - $SslStream = New-Object -TypeName System.Net.Security.SslStream -ArgumentList @($TcpStream, $true, $Callback) - try { - $SslStream.AuthenticateAsClient('') - $Certificate = $SslStream.RemoteCertificate - } finally { - $SslStream.Dispose() - } - } finally { - $TcpClient.Dispose() - } - - if ($Certificate) { - if ($Certificate -isnot [System.Security.Cryptography.X509Certificates.X509Certificate2]) { - $Certificate = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Certificate2 -ArgumentList $Certificate - } - return $Certificate + $tcpClient = New-Object System.Net.Sockets.TcpClient($Server, $Port) + $sslStream = New-Object System.Net.Security.SslStream($tcpClient.GetStream(), $false, ({ $true })) + $sslStream.AuthenticateAsClient($Server, $null, [System.Security.Authentication.SslProtocols]::Tls12, $false) + $cert = $sslStream.RemoteCertificate + $tcpClient.Close() + return $cert + } catch { + Write-Error "Failed to retrieve SSL certificate: $_" } } From f5e1fbe7b07a40f0ab45a0d3924da7ab0131856a Mon Sep 17 00:00:00 2001 From: William Lam Date: Fri, 21 Mar 2025 13:50:47 -0700 Subject: [PATCH 04/37] Add DNS Override to OPNsense --- powershell/add_opnsense_host_overrides.ps1 | 44 ++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 powershell/add_opnsense_host_overrides.ps1 diff --git a/powershell/add_opnsense_host_overrides.ps1 b/powershell/add_opnsense_host_overrides.ps1 new file mode 100644 index 0000000..098c81e --- /dev/null +++ b/powershell/add_opnsense_host_overrides.ps1 @@ -0,0 +1,44 @@ +$opnsense_uri = "https://FILL_ME_IN" +$key = 'FILL_ME_IN' +$secret = 'FILL_ME_IN' +$csv_input = "dns.csv" + +### DO NOT EDIT BEYOND HERE ### + +$csv = Import-Csv $csv_input + +$addHostOverrideURL = "${opnsense_uri}/api/unbound/settings/AddHostOverride" + +$encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes("$($key):$($secret)")) +$basicAuthValue = "Basic $encodedCreds" + +$headers = @{ + "Content-Type" = "application/json" + "Authorization" = $basicAuthValue +} + +foreach ($item in $csv) { + $hostname,$domain = $item.FQDN -split "\.", 2 + + $payload = @{ + "host" = [ordered]@{ + "enabled" = "1" + "hostname" = $hostname + "domain" = $domain + "rr" = "A" + "mxprio" = "" + "mx" = "" + "server" = $item.IP + "description" = $item.DESCRIPTION + } + } + + $body = $payload | ConvertTo-Json + + $results = Invoke-WebRequest -Uri $addHostOverrideURL -Method POST -Headers $headers -body $body -SkipCertificateCheck + if($results.StatusCode) { + Write-Host -ForegroundColor Cyan "Successfully added ${hostname}.${domain} ($(${item}.IP) ..." + } else { + $results + } +} \ No newline at end of file From 8386e8b66d38ae0f18704892fc453be89b0d04d5 Mon Sep 17 00:00:00 2001 From: William Lam Date: Wed, 26 Mar 2025 14:57:02 -0700 Subject: [PATCH 05/37] VM to vCenter KMS Provider Mapping --- powershell/vm-to-kms-association.ps1 | 29 ++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 powershell/vm-to-kms-association.ps1 diff --git a/powershell/vm-to-kms-association.ps1 b/powershell/vm-to-kms-association.ps1 new file mode 100644 index 0000000..9b30d06 --- /dev/null +++ b/powershell/vm-to-kms-association.ps1 @@ -0,0 +1,29 @@ +$cryptoManager = Get-View $global:DefaultVIServer.ExtensionData.Content.CryptoManager + +$kmsServers = @{} +foreach ($i in $cryptoManager.KmipServers) { + if($i.ManagementType -eq "nativeProvider") { + $type = "NKP" + } else { $type = "SKP"} + + $kmsServers.add($i.ClusterId.id,$type) +} + +$vms = Get-View -ViewType VirtualMachine -Property Name, Config + +$kmsVms = @() +foreach ($vm in $vms) { + if($vm.Config.KeyId -ne $null) { + $tmp = [pscustomobject]@{ + Name = $vm.Name + KMS = $vm.Config.KeyId.ProviderId.id + } + $kmsVms+=$tmp + } +} + +Write-Host -ForegroundColor Cyan "`n==== vCenter Key Providers ====" +$kmsServers + +Write-Host -ForegroundColor yellow "`n==== VM Key Provider Mapping ====" +$kmsVms | ft \ No newline at end of file From 65481f7afc4a4fc68a5d34e786c04886ac299d74 Mon Sep 17 00:00:00 2001 From: William Lam Date: Sun, 30 Mar 2025 11:06:04 -0700 Subject: [PATCH 06/37] Add KeyId --- powershell/vm-to-kms-association.ps1 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/powershell/vm-to-kms-association.ps1 b/powershell/vm-to-kms-association.ps1 index 9b30d06..f9cac25 100644 --- a/powershell/vm-to-kms-association.ps1 +++ b/powershell/vm-to-kms-association.ps1 @@ -12,11 +12,12 @@ foreach ($i in $cryptoManager.KmipServers) { $vms = Get-View -ViewType VirtualMachine -Property Name, Config $kmsVms = @() -foreach ($vm in $vms) { +foreach ($vm in $vms | Sort-Object -Property Name) { if($vm.Config.KeyId -ne $null) { $tmp = [pscustomobject]@{ Name = $vm.Name KMS = $vm.Config.KeyId.ProviderId.id + KeyId = $vm.Config.KeyId.keyId } $kmsVms+=$tmp } @@ -26,4 +27,4 @@ Write-Host -ForegroundColor Cyan "`n==== vCenter Key Providers ====" $kmsServers Write-Host -ForegroundColor yellow "`n==== VM Key Provider Mapping ====" -$kmsVms | ft \ No newline at end of file +$kmsVms | ft From 4c5672892ef2549034e4594b2660b9a2952d8366 Mon Sep 17 00:00:00 2001 From: William Lam Date: Sat, 5 Apr 2025 08:14:17 -0700 Subject: [PATCH 07/37] Listing Global Permissions --- powershell/GlobalPermissions.ps1 | 169 ++++++++++++++++++++++++++++++- 1 file changed, 166 insertions(+), 3 deletions(-) diff --git a/powershell/GlobalPermissions.ps1 b/powershell/GlobalPermissions.ps1 index b2b9c8e..e602788 100755 --- a/powershell/GlobalPermissions.ps1 +++ b/powershell/GlobalPermissions.ps1 @@ -1,3 +1,58 @@ +# Courtesy of ChatGPT 4o ... after 25 iterations +Function Get-GlobalPermissionFromMOB { + param ( + [Parameter(Mandatory)] + [Microsoft.PowerShell.Commands.BasicHtmlWebResponseObject]$WebResponse + ) + + $vcRoles = @{} + Get-VIRole | Select-Object Name, Id | ForEach-Object { + $vcRoles[$_.Id] = $_.Name + } + + $html = $WebResponse.Content + $results = @() + + # Match each
  • representing a single ACL entry + $aclPattern = '(?s)
  • \s*
  • (.*?)
    \s*
  • ' + $aclEntries = [regex]::Matches($html, $aclPattern) + + foreach ($entry in $aclEntries) { + $block = $entry.Groups[1].Value + $name = $null + $roles = @() + + # Extract nested principal name + $principalMatch = [regex]::Match($block, '(?s)principal.*?(.*?)
    ', 'Singleline') + if ($principalMatch.Success) { + $nested = $principalMatch.Groups[1].Value + $nameMatch = [regex]::Match($nested, 'name.*?(VSPHERE\.LOCAL\\[^<]+)', 'Singleline') + if ($nameMatch.Success) { + $name = $nameMatch.Groups[1].Value.Trim() + } + } + + # Extract role IDs from roles field + $rolesMatch = [regex]::Match($block, '(?s)roles.*?
      (.*?)
    ', 'Singleline') + if ($rolesMatch.Success) { + $liMatches = [regex]::Matches($rolesMatch.Groups[1].Value, '
  • (-?\d+)
  • ') + foreach ($li in $liMatches) { + $roles += [int]$li.Groups[1].Value + } + } + + # Add result + if ($name) { + $results += [pscustomobject]@{ + Name = $name + Role = if ($roles.Count -eq 1) { $vcRoles[$roles[0]] } else { $vcRoles[$roles] } + } + } + } + + return $results | Sort-Object -Property Name +} + Function New-GlobalPermission { <# .DESCRIPTION Script to add/remove vSphere Global Permission @@ -214,13 +269,119 @@ vmware-session-nonce=$sessionnonce&principals=%3Cprincipals%3E%0D%0A+++%3Cname%3 $results = Invoke-WebRequest -Uri $mob_logout_url -WebSession $vmware -Method GET } +Function Get-GlobalPermission { + <# + .DESCRIPTION Script to add/remove vSphere Global Permission + .NOTES Author: William Lam + .NOTES Site: www.williamlam.com + .NOTES Reference: https://williamlam.com/2017/03/automating-vsphere-global-permissions-with-powercli.html + .PARAMETER vc_server + vCenter Server Hostname or IP Address + .PARAMETER vc_username + VC Username + .PARAMETER vc_password + VC Password + .PARAMETER vc_user + Name of the user to remove global permission on + .PARAMETER vc_role_id + The ID of the vSphere Role (retrieved from Get-VIRole) + .PARAMETER propagate + Whether or not to propgate the permission assignment (true/false) +#> + param( + [Parameter(Mandatory=$true)][string]$vc_server, + [Parameter(Mandatory=$true)][String]$vc_username, + [Parameter(Mandatory=$true)][String]$vc_password + ) + + $secpasswd = ConvertTo-SecureString $vc_password -AsPlainText -Force + $credential = New-Object System.Management.Automation.PSCredential($vc_username, $secpasswd) + + # vSphere MOB URL to private enableMethods + $mob_url = "https://$vc_server/invsvc/mob3/?moid=authorizationService&method=AuthorizationService.GetAllPermissions" + +$Code = @' +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Net.Security; +using System.Security.Cryptography.X509Certificates; + +namespace CertificateCapture +{ + public class Utility + { + public static Func ValidationCallback = + (message, cert, chain, errors) => { + var newCert = new X509Certificate2(cert); + var newChain = new X509Chain(); + newChain.Build(newCert); + CapturedCertificates.Add(new CapturedCertificate(){ + Certificate = newCert, + CertificateChain = newChain, + PolicyErrors = errors, + URI = message.RequestUri + }); + return true; + }; + public static List CapturedCertificates = new List(); + } + + public class CapturedCertificate + { + public X509Certificate2 Certificate { get; set; } + public X509Chain CertificateChain { get; set; } + public SslPolicyErrors PolicyErrors { get; set; } + public Uri URI { get; set; } + } +} +'@ +if ($PSEdition -ne 'Core'){ + Add-Type -AssemblyName System.Net.Http + if (-not ("CertificateCapture" -as [type])) { + Add-Type $Code -ReferencedAssemblies System.Net.Http + } +} else { + if (-not ("CertificateCapture" -as [type])) { + Add-Type $Code + } +} + + # Initial login to vSphere MOB using GET and store session using $vmware variable + $results = Invoke-WebRequest -Uri $mob_url -SessionVariable vmware -Credential $credential -Method GET -SkipCertificateCheck + + # Extract hidden vmware-session-nonce which must be included in future requests to prevent CSRF error + # Credit to https://blog.netnerds.net/2013/07/use-powershell-to-keep-a-cookiejar-and-post-to-a-web-form/ for parsing vmware-session-nonce via Powershell + if($results.StatusCode -eq 200) { + $null = $results -match 'name="vmware-session-nonce" type="hidden" value="?([^\s^"]+)"' + $sessionnonce = $matches[1] + } else { + Write-host "Failed to login to vSphere MOB" + exit 1 + } + + # The POST data payload must include the vmware-session-nonce variable + URL-encoded + $body = @" +vmware-session-nonce=$sessionnonce +"@ + # Second request using a POST and specifying our session from initial login + body request + Write-Host "`nListing Global Permissions" + $results = Invoke-WebRequest -Uri $mob_url -WebSession $vmware -Method POST -Body $body -SkipCertificateCheck + + Get-GlobalPermissionFromMOB -WebResponse $results + + # Logout out of vSphere MOB + $mob_logout_url = "https://$vc_server/invsvc/mob3/logout" + $results = Invoke-WebRequest -Uri $mob_logout_url -WebSession $vmware -Method GET -SkipCertificateCheck +} + ### Sample Usage of Enable/Disable functions ### -$vc_server = "192.168.1.51" +$vc_server = "vc03.williamlam.local" $vc_username = "administrator@vsphere.local" $vc_password = "VMware1!" $vc_role_id = "-1" -$vc_user = "VGHETTO\lamw" +$vc_user = "WILLIAMLAM.LOCAL\lamw" $propagate = "true" # Connect to vCenter Server @@ -230,5 +391,7 @@ $server = Connect-VIServer -Server $vc_server -User $vc_username -Password $vc_p #Remove-GlobalPermission -vc_server $vc_server -vc_username $vc_username -vc_password $vc_password -vc_user $vc_user +#Get-GlobalPermission -vc_server $vc_server -vc_username $vc_username -vc_password $vc_password + # Disconnect from vCenter Server -Disconnect-viserver $server -confirm:$false +Disconnect-viserver $server -confirm:$false \ No newline at end of file From 58b579ccdde0bf3ea8fa7a0f8cb8227e8c5016e3 Mon Sep 17 00:00:00 2001 From: William Lam Date: Mon, 7 Apr 2025 15:57:11 -0700 Subject: [PATCH 08/37] Improve Get-GlobalPermissionFromMOB function --- powershell/GlobalPermissions.ps1 | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/powershell/GlobalPermissions.ps1 b/powershell/GlobalPermissions.ps1 index e602788..cae3d8d 100755 --- a/powershell/GlobalPermissions.ps1 +++ b/powershell/GlobalPermissions.ps1 @@ -1,4 +1,4 @@ -# Courtesy of ChatGPT 4o ... after 25 iterations +# Courtesy of ChatGPT 4o ... after 25+ iterations Function Get-GlobalPermissionFromMOB { param ( [Parameter(Mandatory)] @@ -21,12 +21,13 @@ Function Get-GlobalPermissionFromMOB { $block = $entry.Groups[1].Value $name = $null $roles = @() + $document = $null # Extract nested principal name $principalMatch = [regex]::Match($block, '(?s)principal.*?(.*?)
    ', 'Singleline') if ($principalMatch.Success) { $nested = $principalMatch.Groups[1].Value - $nameMatch = [regex]::Match($nested, 'name.*?(VSPHERE\.LOCAL\\[^<]+)', 'Singleline') + $nameMatch = [regex]::Match($nested, 'name.*?([A-Z.]+\\[^<]+)', 'Singleline') if ($nameMatch.Success) { $name = $nameMatch.Groups[1].Value.Trim() } @@ -41,11 +42,18 @@ Function Get-GlobalPermissionFromMOB { } } + # Extract the associated document value (correctly matching the 3rd ) + $docMatch = [regex]::Match($html, [regex]::Escape($entry.Value) + '.*?document\s*[^<]*\s*(.*?)', 'Singleline') + if ($docMatch.Success) { + $document = $docMatch.Groups[1].Value.Trim() + } + # Add result if ($name) { $results += [pscustomobject]@{ - Name = $name - Role = if ($roles.Count -eq 1) { $vcRoles[$roles[0]] } else { $vcRoles[$roles] } + Name = $name + Role = if ($roles.Count -eq 1) { $vcRoles[$roles[0]] } else { $vcRoles[$roles] } + Definition = $document } } } @@ -385,7 +393,7 @@ $vc_user = "WILLIAMLAM.LOCAL\lamw" $propagate = "true" # Connect to vCenter Server -$server = Connect-VIServer -Server $vc_server -User $vc_username -Password $vc_password +#$server = Connect-VIServer -Server $vc_server -User $vc_username -Password $vc_password #New-GlobalPermission -vc_server $vc_server -vc_username $vc_username -vc_password $vc_password -vc_user $vc_user -vc_role_id $vc_role_id -propagate $propagate @@ -394,4 +402,4 @@ $server = Connect-VIServer -Server $vc_server -User $vc_username -Password $vc_p #Get-GlobalPermission -vc_server $vc_server -vc_username $vc_username -vc_password $vc_password # Disconnect from vCenter Server -Disconnect-viserver $server -confirm:$false \ No newline at end of file +#Disconnect-viserver $server -confirm:$false \ No newline at end of file From 1b8c6aa41a46330d3b5682d2d9c5691ee9ae8a8a Mon Sep 17 00:00:00 2001 From: Brian Wuchner Date: Wed, 30 Apr 2025 13:55:52 -0400 Subject: [PATCH 09/37] Update Get-VCenterPrivileges.ps1 Added support for `size` parameter to specify the maximum number of results to return. --- powershell/Get-VCenterPrivileges.ps1 | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/powershell/Get-VCenterPrivileges.ps1 b/powershell/Get-VCenterPrivileges.ps1 index ed1240a..5145f31 100644 --- a/powershell/Get-VCenterPrivileges.ps1 +++ b/powershell/Get-VCenterPrivileges.ps1 @@ -13,6 +13,10 @@ Function Get-VCenterPrivileges { Array of vSphere Operation Ids to filter from privilege checks .PARAMETER Sessions Array of vSphere Session IDs to filter from privilege checks + .PARAMETER Marker + String of an opaque token which determines where the returned page should begin. If unset or empty, privilege checks will be returned from the first record. + .PARAMETER Size + Integer specifies the maximum number of results to return. If unset defaults to default page size, which is controlled by config.vpxd.privilegeChecks.pageSize advanced option. .EXAMPLE # Filter privileges for Object of type VirtualMachine with MoRef ID vm-121005 Get-VCenterPrivileges -SessionToken $sessionToken -Troubleshoot -Objects @(@{"type"="VirtualMachine";"id"="vm-121005"}) @@ -36,6 +40,7 @@ Function Get-VCenterPrivileges { [Parameter(Mandatory=$false)][string[]]$OpIds, [Parameter(Mandatory=$false)][string[]]$Sessions, [Parameter(Mandatory=$false)][string]$Marker, + [Parameter(Mandatory=$false)][int]$Size, [Switch]$Troubleshoot ) @@ -79,6 +84,11 @@ Function Get-VCenterPrivileges { $privCheckURL = "${privCheckURL}&marker=${Marker}" } + # Include Size + if($Size) { + $privCheckURL = "${privCheckURL}&size=${Size}" + } + if($Troubleshoot) { Write-Host -ForegroundColor cyan "`n[DEBUG] - `n$privCheckURL`n" Write-Host -ForegroundColor cyan "[DEBUG]`n$body`n" From 3077a6440a022fe444d03225de3c637c2ca9b03a Mon Sep 17 00:00:00 2001 From: William Lam Date: Sat, 3 May 2025 06:28:29 -0700 Subject: [PATCH 10/37] Improve Code --- powershell/queryHostPCIInfo.ps1 | 45 +++++++++++++++------------------ 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/powershell/queryHostPCIInfo.ps1 b/powershell/queryHostPCIInfo.ps1 index 237c686..1603b78 100644 --- a/powershell/queryHostPCIInfo.ps1 +++ b/powershell/queryHostPCIInfo.ps1 @@ -1,33 +1,30 @@ # Author: William Lam -# Website: www.virtuallyghetto -# Product: VMware vSphere +# Website: www.williamlam.com # Description: Script to extract ESXi PCI Device details such as Name, Vendor, VID, DID & SVID # Reference: http://www.williamlam.com/2015/05/extracting-vid-did-svid-from-pci-devices-in-esxi-using-vsphere-api.html -$server = Connect-VIServer -Server 192.168.1.60 -User administrator@vghetto.local -Password VMware1! +$vmhost = Get-View -ViewType HostSystem -Property Name,Hardware.PciDevice -Filter @{"name"="mgmt-esx01.vcf.lab"} +$pciDevices = $vmhost.Hardware.PciDevice -$vihosts = Get-View -Server $server -ViewType HostSystem -Property Name,Hardware.PciDevice +# Exclude any devices you do not wish to see, partial or full match supported +$excludeDevices = @(" System peripheral"," Performance counters"," PCI bridge"," ISA bridge","Series Chipset Family","Ice Lake RAS","Ice Lake IEH","MSM","UPI","Memory Map/VT-d","Mesh 2 PCIe") -$devices_results = @() +$deviceResults = @() +foreach ($pciDevice in $pciDevices) { + $vid = [String]::Format("{0:x}", $pciDevice.VendorId) + $did = [String]::Format("{0:x}", $pciDevice.DeviceId) + $svid = [String]::Format("{0:x}", $pciDevice.SubVendorId) -foreach ($vihost in $vihosts) { - $pciDevices = $vihost.Hardware.PciDevice - foreach ($pciDevice in $pciDevices) { - $details = "" | select HOST, DEVICE, VENDOR, VID, DID, SVID - $vid = [String]::Format("{0:x}", $pciDevice.VendorId) - $did = [String]::Format("{0:x}", $pciDevice.DeviceId) - $svid = [String]::Format("{0:x}", $pciDevice.SubVendorId) - - $details.HOST = $vihost.Name - $details.DEVICE = $pciDevice.DeviceName - $details.VENDOR = $pciDevice.VendorName - $details.VID = $vid - $details.DID = $did - $details.SVID = $svid - $devices_results += $details - } + if(-not ($excludeDevices | Where-Object { $pciDevice.DeviceName -like "*$_*" }) -and $svid -ne 0) { + $tmp = [pscustomobject] [ordered]@{ + Vendor = $pciDevice.VendorName + Device = $pciDevice.DeviceName + VID = $vid + DID = $did + SVID = $svid + } + $deviceResults+=$tmp + } } -$devices_results - -Disconnect-VIServer $server -Confirm:$false +$deviceResults | FT \ No newline at end of file From c8033c5d4c9c0e5d658394400df60a69181760ea Mon Sep 17 00:00:00 2001 From: William Lam Date: Sat, 3 May 2025 06:41:43 -0700 Subject: [PATCH 11/37] Pad with leading 0 --- powershell/queryHostPCIInfo.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/powershell/queryHostPCIInfo.ps1 b/powershell/queryHostPCIInfo.ps1 index 1603b78..66ba381 100644 --- a/powershell/queryHostPCIInfo.ps1 +++ b/powershell/queryHostPCIInfo.ps1 @@ -11,9 +11,9 @@ $excludeDevices = @(" System peripheral"," Performance counters"," $deviceResults = @() foreach ($pciDevice in $pciDevices) { - $vid = [String]::Format("{0:x}", $pciDevice.VendorId) - $did = [String]::Format("{0:x}", $pciDevice.DeviceId) - $svid = [String]::Format("{0:x}", $pciDevice.SubVendorId) + $vid = [String]::Format("{0:x4}", $pciDevice.VendorId) + $did = [String]::Format("{0:x4}", $pciDevice.DeviceId) + $svid = [String]::Format("{0:x4}", $pciDevice.SubVendorId) if(-not ($excludeDevices | Where-Object { $pciDevice.DeviceName -like "*$_*" }) -and $svid -ne 0) { $tmp = [pscustomobject] [ordered]@{ @@ -27,4 +27,4 @@ foreach ($pciDevice in $pciDevices) { } } -$deviceResults | FT \ No newline at end of file +$deviceResults | FT From a8e2450ef0badd09658b5cd9f305ca35a3f167f2 Mon Sep 17 00:00:00 2001 From: Brian Wuchner Date: Wed, 30 Apr 2025 13:55:52 -0400 Subject: [PATCH 12/37] Update Get-VCenterPrivileges.ps1 Added support for `size` parameter to specify the maximum number of results to return. --- powershell/Get-VCenterPrivileges.ps1 | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/powershell/Get-VCenterPrivileges.ps1 b/powershell/Get-VCenterPrivileges.ps1 index ed1240a..5145f31 100644 --- a/powershell/Get-VCenterPrivileges.ps1 +++ b/powershell/Get-VCenterPrivileges.ps1 @@ -13,6 +13,10 @@ Function Get-VCenterPrivileges { Array of vSphere Operation Ids to filter from privilege checks .PARAMETER Sessions Array of vSphere Session IDs to filter from privilege checks + .PARAMETER Marker + String of an opaque token which determines where the returned page should begin. If unset or empty, privilege checks will be returned from the first record. + .PARAMETER Size + Integer specifies the maximum number of results to return. If unset defaults to default page size, which is controlled by config.vpxd.privilegeChecks.pageSize advanced option. .EXAMPLE # Filter privileges for Object of type VirtualMachine with MoRef ID vm-121005 Get-VCenterPrivileges -SessionToken $sessionToken -Troubleshoot -Objects @(@{"type"="VirtualMachine";"id"="vm-121005"}) @@ -36,6 +40,7 @@ Function Get-VCenterPrivileges { [Parameter(Mandatory=$false)][string[]]$OpIds, [Parameter(Mandatory=$false)][string[]]$Sessions, [Parameter(Mandatory=$false)][string]$Marker, + [Parameter(Mandatory=$false)][int]$Size, [Switch]$Troubleshoot ) @@ -79,6 +84,11 @@ Function Get-VCenterPrivileges { $privCheckURL = "${privCheckURL}&marker=${Marker}" } + # Include Size + if($Size) { + $privCheckURL = "${privCheckURL}&size=${Size}" + } + if($Troubleshoot) { Write-Host -ForegroundColor cyan "`n[DEBUG] - `n$privCheckURL`n" Write-Host -ForegroundColor cyan "[DEBUG]`n$body`n" From 336be2bb1184f11e748fc0b7b3d5881e35b908ea Mon Sep 17 00:00:00 2001 From: William Lam Date: Sat, 3 May 2025 06:41:43 -0700 Subject: [PATCH 13/37] Pad with leading 0 --- powershell/queryHostPCIInfo.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/powershell/queryHostPCIInfo.ps1 b/powershell/queryHostPCIInfo.ps1 index 1603b78..66ba381 100644 --- a/powershell/queryHostPCIInfo.ps1 +++ b/powershell/queryHostPCIInfo.ps1 @@ -11,9 +11,9 @@ $excludeDevices = @(" System peripheral"," Performance counters"," $deviceResults = @() foreach ($pciDevice in $pciDevices) { - $vid = [String]::Format("{0:x}", $pciDevice.VendorId) - $did = [String]::Format("{0:x}", $pciDevice.DeviceId) - $svid = [String]::Format("{0:x}", $pciDevice.SubVendorId) + $vid = [String]::Format("{0:x4}", $pciDevice.VendorId) + $did = [String]::Format("{0:x4}", $pciDevice.DeviceId) + $svid = [String]::Format("{0:x4}", $pciDevice.SubVendorId) if(-not ($excludeDevices | Where-Object { $pciDevice.DeviceName -like "*$_*" }) -and $svid -ne 0) { $tmp = [pscustomobject] [ordered]@{ @@ -27,4 +27,4 @@ foreach ($pciDevice in $pciDevices) { } } -$deviceResults | FT \ No newline at end of file +$deviceResults | FT From 0c3e070614aeda11149ae3cfabb9fc4f3d38136e Mon Sep 17 00:00:00 2001 From: William Lam Date: Sat, 3 May 2025 06:49:40 -0700 Subject: [PATCH 14/37] Fix SVID=0 --- powershell/queryHostPCIInfo.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/powershell/queryHostPCIInfo.ps1 b/powershell/queryHostPCIInfo.ps1 index 66ba381..924430e 100644 --- a/powershell/queryHostPCIInfo.ps1 +++ b/powershell/queryHostPCIInfo.ps1 @@ -15,7 +15,7 @@ foreach ($pciDevice in $pciDevices) { $did = [String]::Format("{0:x4}", $pciDevice.DeviceId) $svid = [String]::Format("{0:x4}", $pciDevice.SubVendorId) - if(-not ($excludeDevices | Where-Object { $pciDevice.DeviceName -like "*$_*" }) -and $svid -ne 0) { + if(-not ($excludeDevices | Where-Object { $pciDevice.DeviceName -like "*$_*" }) -and $svid -ne "0000") { $tmp = [pscustomobject] [ordered]@{ Vendor = $pciDevice.VendorName Device = $pciDevice.DeviceName From 17fc8ed33fabb99addd54dc7ece66f51252299aa Mon Sep 17 00:00:00 2001 From: William Lam Date: Mon, 5 May 2025 17:25:22 -0700 Subject: [PATCH 15/37] Example accessing BCG API --- .../broadcom-compatibility-guide-api.ps1 | 178 ++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 powershell/broadcom-compatibility-guide-api.ps1 diff --git a/powershell/broadcom-compatibility-guide-api.ps1 b/powershell/broadcom-compatibility-guide-api.ps1 new file mode 100644 index 0000000..6d29b16 --- /dev/null +++ b/powershell/broadcom-compatibility-guide-api.ps1 @@ -0,0 +1,178 @@ +<# + .SYNOPSIS Checks ESXi IO/Device against Broadcom Compatibility Guide (https://compatibilityguide.broadcom.com/) + .NOTES Author: William Lam + .NOTES Site: www.williamlam.com + .PARAMETER VID + VendorID of IO/Device from queryHostPCIInfo.ps1 + .PARAMETER DID + DeviceID of IO/Device from queryHostPCIInfo.ps1 + .PARAMETER SVID + SubSystemVendorID of IO/Device from queryHostPCIInfo.ps1 + .PARAMETER ShowNumberOfSupportedReleases + Show the number of supported ESXi releases + .EXAMPLE + Check-BroadcomCompatIoDevice -VID "14e4" -DID "1751" -SVID "14e4" + .EXAMPLE + Check-BroadcomCompatIoDevice -VID "14e4" -DID "1751" -SVID "14e4" -ShowNumberOfSupportedReleases 2 +#> +Function Check-BroadcomCompatIoDevice { + param( + [Parameter(Mandatory=$true)][string]$VID, + [Parameter(Mandatory=$true)][string]$DID, + [Parameter(Mandatory=$true)][string]$SVID, + [Parameter(Mandatory=$false)][string]$ShowNumberOfSupportedReleases=4 + ) + + + $spec = [ordered]@{ + "programId" = "io" + "filters" = @( + @{ + "displayKey" = "vid" + "filterValues" = @($VID) + } + @{ + "displayKey" = "did" + "filterValues" = @($DID) + } + @{ + "displayKey" = "svid" + "filterValues" = @($SVID) + } + ) + "keyword" = @() + "date" = @{ + "startDate" = $null + "endDate" = $null + } + } + + $body = $spec | ConvertTo-Json -Depth 4 + + $requests = Invoke-WebRequest -UseBasicParsing -Uri "https://compatibilityguide.broadcom.com/compguide/programs/viewResults?limit=20&page=1&sortBy=&sortType=ASC" -Method "POST" -ContentType "application/json" -Body $body + $results = $requests.Content | ConvertFrom-Json + + $hclResults = @() + if($results.data.count -gt 0) { + foreach($item in $results.data.fieldValues) { + $tmp = [pscustomobject] [ordered]@{ + Brand = $item.brandName + Model = $item.model.name + DeviceType = $item.deviceType + SupportedReleases = ($item.supportedReleases.name | select -First $ShowNumberOfSupportedReleases) -join "," + } + $hclResults+=$tmp + } + } + + $hclResults +} + +<# + .SYNOPSIS Checks ESXi SSD device against Broadcom Compatibility Guide (https://compatibilityguide.broadcom.com/) + .NOTES Author: William Lam + .NOTES Site: www.williamlam.com + .PARAMETER VID + VendorID of IO/Device from queryHostPCIInfo.ps1 + .PARAMETER DID + DeviceID of IO/Device from queryHostPCIInfo.ps1 + .PARAMETER SVID + SubSystemVendorID of IO/Device from queryHostPCIInfo.ps1 + .PARAMETER ShowNumberOfSupportedReleases + Show the number of supported ESXi releases + .PARAMETER ShowHybridCacheTier + Show only vSAN Hybrid Cache Tier supported devices + .PARAMETER ShowAFCacheTier + Show only vSAN All-Flash Cache Tier supported devices + .PARAMETER ShowAFCapacityTier + Show only vSAN All-Flash Capacity Tier supported devices + .PARAMETER ShowESATier + Show only vSAN ESA supported devices + .EXAMPLE + Check-BroadcomCompatVsanSsdDevice -VID "8086" -DID "0b60" -SVID "1028" + .EXAMPLE + Check-BroadcomCompatVsanSsdDevice -VID "8086" -DID "0b60" -SVID "1028" -ShowNumberOfSupportedReleases 2 + .EXAMPLE + Check-BroadcomCompatVsanSsdDevice -VID "8086" -DID "0b60" -SVID "1028" -ShowNumberOfSupportedReleases 2 -ShowESATier + .EXAMPLE + Check-BroadcomCompatVsanSsdDevice -VID "8086" -DID "0b60" -SVID "1028" -ShowNumberOfSupportedReleases 2 -ShowAFCacheTier -ShowESATier +#> +Function Check-BroadcomCompatVsanSsdDevice { + param( + [Parameter(Mandatory=$true)][string]$VID, + [Parameter(Mandatory=$true)][string]$DID, + [Parameter(Mandatory=$true)][string]$SVID, + [Switch]$ShowHybridCacheTier=$false, + [Switch]$ShowAFCacheTier=$false, + [Switch]$ShowAFCapacityTier=$false, + [Switch]$ShowESATier=$false, + [Parameter(Mandatory=$false)][string]$ShowNumberOfSupportedReleases=4 + ) + + $spec = [ordered]@{ + "programId" = "ssd" + "filters" = @( + @{ + "displayKey" = "vid" + "filterValues" = @($VID) + } + @{ + "displayKey" = "did" + "filterValues" = @($DID) + } + @{ + "displayKey" = "svid" + "filterValues" = @($SVID) + } + ) + "keyword" = @() + "date" = @{ + "startDate" = $null + "endDate" = $null + } + } + + $tierFilterValues = @() + if($ShowHybridCacheTier) { + $tierFilterValues+="vSAN Hybrid Caching Tier" + } + + if($ShowAFCacheTier) { + $tierFilterValues+="vSAN All Flash Caching Tier" + } + + if($ShowAFCapacityTier) { + $tierFilterValues+="vSAN All Flash Capacity Tier" + } + + if($ShowESATier) { + $tierFilterValues+="vSAN ESA Storage Tier" + } + + if($tierFilterValues -ne $null) { + $spec.filters+= @{ + "displayKey" = "tier" + "filterValues" =$tierFilterValues + } + } + + $body = $spec | ConvertTo-Json -Depth 4 + + $requests = Invoke-WebRequest -UseBasicParsing -Uri "https://compatibilityguide.broadcom.com/compguide/programs/viewResults?limit=20&page=1&sortBy=&sortType=ASC" -Method "POST" -ContentType "application/json" -Body $body + $results = $requests.Content | ConvertFrom-Json + + $hclResults = @() + if($results.data.count -gt 0) { + foreach($item in $results.data.fieldValues) { + $tmp = [pscustomobject] [ordered]@{ + PartnerName = $item.partnerName + Model = $item.model.name + Tier = $item.tier + SupportedReleases = $item.supportedReleases | select -First $ShowNumberOfSupportedReleases + } + $hclResults+=$tmp + } + } + + $hclResults +} \ No newline at end of file From 9be80023c577dc24d5b8efbdd88c6987eddcf157 Mon Sep 17 00:00:00 2001 From: William Lam Date: Mon, 2 Jun 2025 11:04:54 -0700 Subject: [PATCH 16/37] Fix typo, missing e --- powershell/Get-vLCMClusterImageInformation.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/powershell/Get-vLCMClusterImageInformation.ps1 b/powershell/Get-vLCMClusterImageInformation.ps1 index 93ce4d8..6c57f54 100644 --- a/powershell/Get-vLCMClusterImageInformation.ps1 +++ b/powershell/Get-vLCMClusterImageInformation.ps1 @@ -4,17 +4,17 @@ .NOTES Last Updated: 02/06/2025 .PARAMETER ClusterName Name of a vLCM enabled vSphere Cluster - .PARAMETER ShowBaseImagDetails + .PARAMETER ShowBaseImageDetails Output the component details for ESXi base image .EXAMPLE Get-vLCMClusterImageInformation -ClusterName "ML Cluster" .EXAMPLE - Get-vLCMClusterImageInformation -ClusterName "ML Cluster" -ShowBaseImagDetails + Get-vLCMClusterImageInformation -ClusterName "ML Cluster" -ShowBaseImageDetails #> Function Get-vLCMClusterImageInformation { param( [Parameter(Mandatory=$true)]$ClusterName, - [Switch]$ShowBaseImagDetails=$false + [Switch]$ShowBaseImageDetails=$false ) Write-host -ForegroundColor Yellow "`nvSphere Lifecycle Management (vLCM) Image for vSphere Cluster: ${clusterName}" @@ -38,7 +38,7 @@ Function Get-vLCMClusterImageInformation { $tmp | ft - if($ShowBaseImagDetails) { + if($ShowBaseImageDetails) { $baseImageComponentsResults = @() Write-host -ForegroundColor Cyan "Base Image Details: " From 7f22c4d310876933390bcc70f5ef7f6b3f66ea4c Mon Sep 17 00:00:00 2001 From: William Lam Date: Fri, 20 Jun 2025 13:32:58 -0700 Subject: [PATCH 17/37] Edge Script on AMD Ryzen --- powershell/configure_nsx_edge_on_amd_ryzen.ps1 | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 powershell/configure_nsx_edge_on_amd_ryzen.ps1 diff --git a/powershell/configure_nsx_edge_on_amd_ryzen.ps1 b/powershell/configure_nsx_edge_on_amd_ryzen.ps1 new file mode 100644 index 0000000..b08764e --- /dev/null +++ b/powershell/configure_nsx_edge_on_amd_ryzen.ps1 @@ -0,0 +1,15 @@ +Connect-VIServer -Server vc01.vcf.lab -User administrator@vsphere.local -Password VMware1!VMware1! + +$edges = @("edge01a","edge01b") +$edgeUser = "root" +$edgePass = "VMware1!VMware1!" + +### DO NOT EDIT BEYOND HEREx + +$edgeScript = "sed -i `'/if `"AMD`" in vendor_info and `"AMD EPYC`" not in model_name:/s/^/ #/;/self.error_exit(`"Unsupported CPU: %s`" % model_name)/s/^/ #/`' /opt/vmware/nsx-edge/bin/config.py" + +foreach ($edge in $edges) { + Invoke-VMScript -VM (Get-VM $edge) -ScriptText $edgeScript -GuestUser $edgeUser -GuestPassword $edgePass +} + +Disconnect-VIServer * -Confirm:$false \ No newline at end of file From e6e6740feab367fe80b1137dede47a48ea636f0e Mon Sep 17 00:00:00 2001 From: William Lam Date: Thu, 17 Jul 2025 07:37:11 -0700 Subject: [PATCH 18/37] Single AVI Deployment VCF 9 --- powershell/deploy_one_node_nsx_alb.ps1 | 69 ++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 powershell/deploy_one_node_nsx_alb.ps1 diff --git a/powershell/deploy_one_node_nsx_alb.ps1 b/powershell/deploy_one_node_nsx_alb.ps1 new file mode 100644 index 0000000..f544035 --- /dev/null +++ b/powershell/deploy_one_node_nsx_alb.ps1 @@ -0,0 +1,69 @@ +$sddcmFQDN = "sddcm01.vcf.lab" +$sddcmUsername = "administrator@vsphere.local" +$sddcmPassword = "VMware1!VMware1!" + +$aviVersion = "31.1.1-24544104" +$aviClusterName = "nsx-alb" +$aviFormFactor = "SMALL" +$aviAdminPassword = "VMware1!VMware1!" +$aviFQDN = "lb01.vcf.lab" +$aviNodeIP = "172.30.0.51" + +### DO NOT EDIT BEYOND HERE ### + +$payload = @{ + "username" = $sddcmUsername + "password" = $sddcmPassword +} + +$body = $payload | ConvertTo-Json + +Write-Host -ForegroundColor Cyan "`nLogging into SDDC Manager ..." +$requests = Invoke-WebRequest -Uri "https://${sddcmFQDN}/v1/tokens" -Method POST -Headers @{"Content-Type"="application/json"} -Body $body -SkipCertificateCheck -TimeoutSec 5 +if($requests.StatusCode -eq 200) { + $accessToken = ($requests.Content | ConvertFrom-Json).accessToken +} else { + Write-Error "Failed to login to SDDC Manager, please verify credentials are correct" +} + +$headers = @{ + "Content-Type" = "application/json" + "Authorization" = "Bearer ${accessToken}" +} + +Write-Host -ForegroundColor Cyan "Retrieving information about VCF Management Domain ..." +$requests = Invoke-WebRequest -Uri "https://${sddcmFQDN}/v1/domains?type=MANAGEMENT" -Method GET -Headers $headers -SkipCertificateCheck -TimeoutSec 5 +if($requests.StatusCode -eq 200) { + $nsxClusterId = ($requests.Content | ConvertFrom-Json).elements.nsxtCluster.id +} else { + Write-Error "Failed to retrieve VCF Management Domain information" +} + +Write-Host -ForegroundColor Cyan "Retrieving NSX ALB Bundle ID ..." +$requests = Invoke-WebRequest -Uri "https://${sddcmFQDN}/v1/product-version-catalogs" -Method GET -Headers $headers -SkipCertificateCheck -TimeoutSec 5 +if($requests.StatusCode -eq 200) { + $aviBundleId = (($requests.Content | ConvertFrom-Json).patches.NSX_ALB | where {$_.productVersion -eq $aviVersion}).artifacts.bundles.id +} else { + Write-Error "Failed to retrieve VCF Product Version Catalog" +} + +$payload = [ordered]@{ + "clusterName" = $aviClusterName + "formFactor" = $aviFormFactor + "adminPassword" = $aviAdminPassword + "clusterFqdn" = $aviFQDN + "nodes" = @(@{"ipAddress" = $aviNodeIP}) + "nsxIds" = @($nsxClusterId) + "bundleId" = $aviBundleId +} + +$body = $payload | ConvertTo-Json + +Write-Host -ForegroundColor Cyan "Initiating deployment of 1-Node NSX-ALB ..." +$requests = Invoke-WebRequest -Uri "https://${sddcmFQDN}/v1/alb-clusters?skipCompatibilityCheck=true" -Method POST -Body $body -Headers $headers -SkipCertificateCheck +if($requests.StatusCode -eq 202) { + Write-Host -ForegroundColor Green "Deployment started, you can monitor the progress using the SDDC Manager UI`n" +} else { + Write-Error "Failed to initiate deployment" +} + From 9661da97b83a87410aa895f1af1f4aa609538989 Mon Sep 17 00:00:00 2001 From: William Lam Date: Fri, 5 Sep 2025 17:58:48 -0700 Subject: [PATCH 19/37] Updated pyvmomi script to add host to vSphere cluster --- python/add_host_to_cluster.py | 246 ++++++++++++++++++++++++++++++++++ 1 file changed, 246 insertions(+) create mode 100644 python/add_host_to_cluster.py diff --git a/python/add_host_to_cluster.py b/python/add_host_to_cluster.py new file mode 100644 index 0000000..cbd0644 --- /dev/null +++ b/python/add_host_to_cluster.py @@ -0,0 +1,246 @@ +#!/usr/bin/env python +# Pyvmomi (vSphere SDK for Python) script for adding ESXi host to vSphere Cluster connected to vCenter Server, which can run directly on ESXi host +# Credit goes to ChatGPT for creating nthe script based on my requirements :) +# +# Example: +# python add_host_to_cluster.py \ +# --vcenter vc03.williamlam.local --vc-user 'administrator@vsphere.local' --vc-pass 'VMware1!' \ +# --datacenter 'Datacenter' --cluster 'Cluster-01' \ +# --host-user 'root' --host-pass 'VMware1!' --insecure --vmk vmk0 +# + +import argparse, atexit, hashlib, json, os, re, socket, ssl, subprocess, time, ipaddress +from pyVim import connect +from pyVmomi import vim + +ESXCLI = "/usr/sbin/esxcli" + +def run(cmd): + return subprocess.check_output(cmd, stderr=subprocess.STDOUT, text=True) + +def is_valid_ipv4(s): + try: + ip = ipaddress.IPv4Address(s) + # reject obvious masks/bad placeholders + if s in {"0.0.0.0", "255.255.255.255"}: + return False + return True + except Exception: + return False + +def parse_esxcli_csv_for_ip(text, vmk): + # Expect header line then values. Normalize header names. + lines = [l for l in text.splitlines() if l.strip()] + if not lines: + return None + headers = [h.strip().lower().replace(" ", "") for h in lines[0].split(",")] + # Common header names: name,ipv4address,address,netmask,broadcast,dhcp,mtu,... + try: + name_idx = headers.index("name") + except ValueError: + return None + # Prefer a precise IPv4 address column + for cand in ("ipv4address", "address"): + if cand in headers: + addr_idx = headers.index(cand) + break + else: + return None + + for line in lines[1:]: + cols = [c.strip() for c in line.split(",")] + if len(cols) <= max(name_idx, addr_idx): + continue + if cols[name_idx] == vmk and is_valid_ipv4(cols[addr_idx]): + return cols[addr_idx] + return None + +def parse_esxcli_text_for_ip(text, vmk): + """ + Parse plain text table from: + esxcli network ip interface ipv4 get -i + ESXi varies, but usually shows key:value lines for single interface. + """ + # Look for a line like 'IPv4 Address: 192.168.30.4' + for line in text.splitlines(): + if "IPv4 Address" in line: + m = re.search(r"IPv4 Address\s*:\s*([0-9.]+)", line) + if m and is_valid_ipv4(m.group(1)): + return m.group(1) + # Fallback older tabular formats: + # Try to find a line that starts with vmk and pick the token after it if it looks like IPv4 + for line in text.splitlines(): + if line.strip().startswith(vmk): + parts = line.split() + # scan each token for IPv4 + for tok in parts: + if re.match(r"^\d{1,3}(\.\d{1,3}){3}$", tok) and is_valid_ipv4(tok): + return tok + return None + +def parse_esxcfg_vmknic_for_ip(text, vmk): + # Example: "vmk0 ... IPv4: 192.168.30.4 Netmask: 255.255.255.0 ..." + # Use a regex that anchors on the interface name and the "IPv4:" label specifically. + pattern = rf"^{re.escape(vmk)}.*?IPv4:\s*([0-9.]+)\b" + for line in text.splitlines(): + m = re.search(pattern, line) + if m and is_valid_ipv4(m.group(1)): + return m.group(1) + return None + +def get_vmk_ip(vmk="vmk0", vcenter_hint=None): + # 1) esxcli CSV + for csv_flag in ("--formatter=csv", "--format=csv"): + try: + out = run([ESXCLI, csv_flag, "network", "ip", "interface", "ipv4", "get", "-i", vmk]) + ip = parse_esxcli_csv_for_ip(out, vmk) + if ip: + return ip + except Exception: + pass + + # 2) esxcli JSON + for json_flag in ("--formatter=json", "--format=json"): + try: + out = run([ESXCLI, json_flag, "network", "ip", "interface", "ipv4", "get", "-i", vmk]) + data = json.loads(out) + items = None + if isinstance(data, dict): + for key in ("ip", "Interfaces", "vmknics", "Items", "items"): + if key in data and isinstance(data[key], list): + items = data[key] + break + elif isinstance(data, list): + items = data + if items: + for it in items: + name = it.get("Name") or it.get("name") or it.get("Interface") + addr = it.get("IPv4Address") or it.get("Address") or it.get("address") + if name == vmk and addr and is_valid_ipv4(addr): + return addr + except Exception: + pass + + # 3) esxcli text (single interface) + try: + out = run([ESXCLI, "network", "ip", "interface", "ipv4", "get", "-i", vmk]) + ip = parse_esxcli_text_for_ip(out, vmk) + if ip: + return ip + except Exception: + pass + + # 4) esxcfg-vmknic -l + try: + out = run(["/sbin/esxcfg-vmknic", "-l"]) + ip = parse_esxcfg_vmknic_for_ip(out, vmk) + if ip: + return ip + except Exception: + pass + + # 5) UDP socket trick using vCenter hint, last-resort + try: + target = (vcenter_hint or "8.8.8.8", 443) + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + s.connect(target) + ip = s.getsockname()[0] + s.close() + if is_valid_ipv4(ip): + return ip + except Exception: + pass + + raise RuntimeError(f"Unable to determine IPv4 for {vmk}. Try --host or --vmk .") + +def get_ssl_thumbprint(host, port=443, timeout=5): + ctx = ssl.create_default_context() + ctx.check_hostname = False + ctx.verify_mode = ssl.CERT_NONE + with socket.create_connection((host, port), timeout=timeout) as sock: + with ctx.wrap_socket(sock, server_hostname=host) as ssock: + der = ssock.getpeercert(binary_form=True) + fp = hashlib.sha1(der).hexdigest().upper() + return ":".join(fp[i:i+2] for i in range(0, len(fp), 2)) + +def find_obj_by_name(content, vimtype, name): + view = content.viewManager.CreateContainerView(content.rootFolder, [vimtype], True) + try: + for obj in view.view: + if obj.name == name: + return obj + finally: + view.Destroy() + return None + +def wait_for_task(task, action_name='task'): + while True: + st = task.info.state + if st == 'success': + return task.info.result + if st == 'error': + msg = task.info.error.msg if task.info.error else 'unknown error' + raise RuntimeError(f"{action_name} failed: {msg}") + time.sleep(1) + +def main(): + ap = argparse.ArgumentParser(description="Add the (local) ESXi host to a vSphere Cluster via pyVmomi") + ap.add_argument("--vcenter", required=True) + ap.add_argument("--vc-user", required=True) + ap.add_argument("--vc-pass", required=True) + ap.add_argument("--datacenter", required=True) + ap.add_argument("--cluster", required=True) + ap.add_argument("--host", default="", help="ESXi host IP/FQDN to add (omit to auto-detect)") + ap.add_argument("--vmk", default="vmk0", help="VMkernel to read IP from when auto-detecting (default: vmk0)") + ap.add_argument("--host-user", default="root") + ap.add_argument("--host-pass", required=True) + ap.add_argument("--license", default="") + ap.add_argument("--insecure", action="store_true") + args = ap.parse_args() + + # Determine host IP to add + if args.host.strip(): + host_to_add = args.host.strip() + else: + host_to_add = get_vmk_ip(args.vmk, vcenter_hint=args.vcenter) + print(f"[i] Using ESXi host: {host_to_add}") + + # vCenter connection + if args.insecure: + ctx = ssl._create_unverified_context() + si = connect.SmartConnect(host=args.vcenter, user=args.vc_user, pwd=args.vc_pass, sslContext=ctx) + else: + si = connect.SmartConnect(host=args.vcenter, user=args.vc_user, pwd=args.vc_pass) + atexit.register(connect.Disconnect, si) + content = si.RetrieveContent() + + # Inventory lookup + dc = find_obj_by_name(content, vim.Datacenter, args.datacenter) + if not dc: + raise SystemExit(f"Datacenter not found: {args.datacenter}") + cluster = find_obj_by_name(content, vim.ClusterComputeResource, args.cluster) + if not cluster: + raise SystemExit(f"Cluster not found: {args.cluster}") + + # Thumbprint + add + print("[i] Fetching ESXi SSL thumbprint…") + thumb = get_ssl_thumbprint(host_to_add) + print(f"[i] Thumbprint: {thumb}") + + spec = vim.host.ConnectSpec( + hostName=host_to_add, + userName=args.host_user, + password=args.host_pass, + sslThumbprint=thumb, + force=True, + ) + + print(f"[i] Adding host {host_to_add} to cluster '{args.cluster}'…") + task = cluster.AddHost_Task(spec=spec, asConnected=True, resourcePool=cluster.resourcePool, + license=(args.license or None)) + wait_for_task(task, action_name="AddHost_Task") + print(f"✅ Host {host_to_add} added to cluster '{args.cluster}' in datacenter '{args.datacenter}'") + +if __name__ == "__main__": + main() + From 420b6cd14538598e2be6bdd0086b79a8bcee4095 Mon Sep 17 00:00:00 2001 From: William Lam Date: Wed, 10 Sep 2025 05:18:21 -0700 Subject: [PATCH 20/37] Fix hostname property --- powershell/get-nvme-tiering-info.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/powershell/get-nvme-tiering-info.ps1 b/powershell/get-nvme-tiering-info.ps1 index 3848e85..dbe00f7 100644 --- a/powershell/get-nvme-tiering-info.ps1 +++ b/powershell/get-nvme-tiering-info.ps1 @@ -25,7 +25,7 @@ foreach ($vmhost in Get-Cluster -Name $clusterName | Get-VMhost | Sort-Object -P } $tmp = [pscustomobject] @{ - VMHost = $vmhostName + VMHost = $vmhost.Name TieringEnabled = $tieringEnabled TieringRatio = $tieringRatio DRAMMemory = $dramTotal @@ -36,4 +36,4 @@ foreach ($vmhost in Get-Cluster -Name $clusterName | Get-VMhost | Sort-Object -P $results+=$tmp } -$results | FT \ No newline at end of file +$results | FT From 6640c79dde99e0bccf9951da9154ea8d9ea30f3e Mon Sep 17 00:00:00 2001 From: William Lam Date: Mon, 15 Sep 2025 11:25:52 -0700 Subject: [PATCH 21/37] vGPU / DirectPath Profiles Samples --- powershell/get_directpath_profile_usage.ps1 | 20 ++++++++++++ powershell/get_directpath_profiles.ps1 | 29 +++++++++++++++++ powershell/get_vgpu_profiles.ps1 | 36 +++++++++++++++++++++ 3 files changed, 85 insertions(+) create mode 100644 powershell/get_directpath_profile_usage.ps1 create mode 100644 powershell/get_directpath_profiles.ps1 create mode 100644 powershell/get_vgpu_profiles.ps1 diff --git a/powershell/get_directpath_profile_usage.ps1 b/powershell/get_directpath_profile_usage.ps1 new file mode 100644 index 0000000..63a632e --- /dev/null +++ b/powershell/get_directpath_profile_usage.ps1 @@ -0,0 +1,20 @@ +$cluster = Get-Cluster $VICLUSTER + +$dpMgr = Get-View $global:DefaultVIServer.ExtensionData.Content.DirectPathProfileManager + +$utilizationResults = @() +$targetSpec = New-Object VMware.Vim.DirectPathProfileManagerTargetCluster +$targetSpec.Cluster = $cluster.ExtensionData.MoRef + +$utilizations = $dpMgr.DirectPathProfileManagerQueryCapacity($targetSpec,$null) +foreach($utilization in $utilizations | Sort-Object -Property Name) { + $tmp = [PSCustomObject] [ordered]@{ + Name = $utilization.Profile.Name + Consumed = $utilization.Consumed + Remaining = $utilization.Remaining + Maximum = $utilization.max + } + $utilizationResults+=$tmp +} + +$utilizationResults | FT \ No newline at end of file diff --git a/powershell/get_directpath_profiles.ps1 b/powershell/get_directpath_profiles.ps1 new file mode 100644 index 0000000..4194813 --- /dev/null +++ b/powershell/get_directpath_profiles.ps1 @@ -0,0 +1,29 @@ +$cluster = Get-Cluster $VICLUSTER + +$dpManager = Get-View $global:DefaultVIServer.ExtensionData.Content.DirectPathProfileManager + +$filterSpec = New-Object VMware.Vim.DirectPathProfileManagerFilterSpec +$filterSpec.clusters = @($cluster.ExtensionData.MoRef) + +$dpProfiles = $dpManager.DirectPathProfileManagerList($filterSpec) + +$dppResults = @() +foreach($dpProfile in $dpProfiles | Sort-Object -Property Name) { + if($dpProfile.name -notmatch "unnamed-") { + if($dpProfile.DeviceConfig.getType().Name -eq "DirectPathProfileManagerVirtualDeviceGroupDirectPathConfig") { + $dgName = $dpProfile.DeviceConfig.DeviceGroupName + } elseif($dpProfile.DeviceConfig.getType().Name -eq "DirectPathProfileManagerVmiopDirectPathConfig") { + $dgName = $dpProfile.DeviceConfig.VgpuProfile + } else { + $dgName = "Other" + } + + $tmp = [PSCustomObject] [ordered]@{ + DeviceGroupName = $dgName + Vendor = $dpProfile.VendorName + } + $dppResults+=$tmp + } +} + +$dppResults | FT \ No newline at end of file diff --git a/powershell/get_vgpu_profiles.ps1 b/powershell/get_vgpu_profiles.ps1 new file mode 100644 index 0000000..d0c5b1b --- /dev/null +++ b/powershell/get_vgpu_profiles.ps1 @@ -0,0 +1,36 @@ +$cluster = Get-Cluster $VICLUSTER + +$envBrowser = Get-View $cluster.ExtensionData.EnvironmentBrowser + +$directPathDevices = $envBrowser.QueryConfigTarget($null).DynamicPassthrough +$vgpuDevices = $envBrowser.QueryConfigTarget($null).VgpuProfileInfo +$deviceGroupDevices = $envBrowser.QueryConfigTarget($null).VendorDeviceGroupInfo + +$deviceResults = @() +foreach($device in $directPathDevices) { + $tmp = [PSCustomObject] [ordered]@{ + Name = $device.DeviceName + AccessType = "Dynamic DirectPath IO" + } + $deviceResults+=$tmp +} + +foreach($device in $vgpuDevices) { + $vendorId = $device.DeviceVendorId + + $tmp = [PSCustomObject] [ordered]@{ + Name = $device.ProfileName + AccessType = "NVIDIA GRID vGPU" + } + $deviceResults+=$tmp +} + +foreach($device in $deviceGroupDevices) { + $tmp = [PSCustomObject] [ordered]@{ + Name = $device.DeviceGroupName + AccessType = "Group" + } + $deviceResults+=$tmp +} + +$deviceResults | Sort-Object -Property Name | FT \ No newline at end of file From af4433898b3bccf92956873f208237d4860dda08 Mon Sep 17 00:00:00 2001 From: William Lam Date: Sat, 20 Sep 2025 11:28:24 -0700 Subject: [PATCH 22/37] VCF Operations Registration & Usage Automation --- ...wnload_vcf_operations_registration_file.sh | 32 ++++++++++++++ shell/download_vcf_operations_usage_file.sh | 43 +++++++++++++++++++ shell/import_vcf_operations_license_file.sh | 36 ++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100755 shell/download_vcf_operations_registration_file.sh create mode 100755 shell/download_vcf_operations_usage_file.sh create mode 100755 shell/import_vcf_operations_license_file.sh diff --git a/shell/download_vcf_operations_registration_file.sh b/shell/download_vcf_operations_registration_file.sh new file mode 100755 index 0000000..5cb399e --- /dev/null +++ b/shell/download_vcf_operations_registration_file.sh @@ -0,0 +1,32 @@ +#!/bin/bash -e +# Author: William Lam +# Website: williamlam.com +# Description: Download License Registration File from VCF Operations 9.0 + +VCF_OPERATIONS_HOSTNAME="vcf01.vcf.lab" +VCF_OPERATIONS_USERNAME="admin" +VCF_OPERATIONS_PASSWORD='VMware1!VMware1!' + +echo -e "\nAcquiring auth token from VCF Ops: ${VCF_OPERATIONS_HOSTNAME} ..." +RESULTS=$(curl -s -k -X POST "https://${VCF_OPERATIONS_HOSTNAME}/suite-api/api/auth/token/acquire" \ +-H "Content-Type: application/json" \ +-H "Accept: application/json" \ +-d "$(printf '{"username":"%s","password":"%s","authSource":"local"}' \ + "$VCF_OPERATIONS_USERNAME" \ + "$VCF_OPERATIONS_PASSWORD")") + +VCF_OPERATIONS_AUTH_TOKEN=$(echo ${RESULTS} | jq -r .token) + +echo -e "\nDownloading VCF Ops Registration File ..." +RESULTS=$(curl -s -X POST "https://${VCF_OPERATIONS_HOSTNAME}/suite-api/internal/extension/vcf-license-cloud-integration/registration/offline/request" \ +-H 'accept: application/json' \ +-H 'content-type: application/json' \ +-H "Authorization: OpsToken ${VCF_OPERATIONS_AUTH_TOKEN}" \ +-H 'X-Ops-API-use-unsupported: true' \ +--insecure) + +VCFO_REG_DATA=$(echo $RESULTS | jq -r .jwsEncodedData) +VCFO_REG_FILENAME=$(echo $RESULTS | jq -r .fileName) + +echo -e "\nSaving VCF Ops Registration File: ${VCFO_REG_FILENAME} ..." +echo ${VCFO_REG_DATA} > ${VCFO_REG_FILENAME} \ No newline at end of file diff --git a/shell/download_vcf_operations_usage_file.sh b/shell/download_vcf_operations_usage_file.sh new file mode 100755 index 0000000..82dce22 --- /dev/null +++ b/shell/download_vcf_operations_usage_file.sh @@ -0,0 +1,43 @@ +#!/bin/bash -e +# Author: William Lam +# Website: williamlam.com +# Description: Download License Usage File from VCF Operations 9.0 + +VCF_OPERATIONS_HOSTNAME="vcf01.vcf.lab" +VCF_OPERATIONS_USERNAME="admin" +VCF_OPERATIONS_PASSWORD='VMware1!VMware1!' + +echo -e "\nAcquiring auth token from VCF Ops: ${VCF_OPERATIONS_HOSTNAME} ..." +RESULTS=$(curl -s -k -X POST "https://${VCF_OPERATIONS_HOSTNAME}/suite-api/api/auth/token/acquire" \ +-H "Content-Type: application/json" \ +-H "Accept: application/json" \ +-d "$(printf '{"username":"%s","password":"%s","authSource":"local"}' \ + "$VCF_OPERATIONS_USERNAME" \ + "$VCF_OPERATIONS_PASSWORD")") + +VCF_OPERATIONS_AUTH_TOKEN=$(echo ${RESULTS} | jq -r .token) + +if date --version >/dev/null 2>&1; then + # GNU date (Linux) + STARTDATE=$(date -d "now +1 day" +%s)000 + ENDDATE=$(date -d "now +1 month" +%s)000 +else + # BSD date (macOS) + STARTDATE=$(date -v+1d +%s)000 + ENDDATE=$(date -v+3m +%s)000 +fi + +echo -e "\nGenerating VCF Ops Usage File ..." +RESULTS=$(curl -s -X POST "https://${VCF_OPERATIONS_HOSTNAME}/suite-api/internal/extension/vcf-license-cloud-integration/usage/offline/report?startDate=${STARTDATE}&endDate=${ENDDATE}" \ +-H 'accept: application/json' \ +-H 'content-type: application/json' \ +-H "Authorization: OpsToken ${VCF_OPERATIONS_AUTH_TOKEN}" \ +-H 'X-Ops-API-use-unsupported: true' \ +--insecure) + +VCFO_USAGE_DATA=$(echo $RESULTS | jq -r .gzipJwsEncodedData) +VCFO_USAGE_FILENAME=$(echo $RESULTS | jq -r .fileName) + +echo -e "\nSaving VCF Ops Usage File: ${VCFO_USAGE_FILENAME} ..." +echo ${VCFO_USAGE_DATA} | base64 -d > ${VCFO_USAGE_FILENAME} + diff --git a/shell/import_vcf_operations_license_file.sh b/shell/import_vcf_operations_license_file.sh new file mode 100755 index 0000000..0246a3a --- /dev/null +++ b/shell/import_vcf_operations_license_file.sh @@ -0,0 +1,36 @@ +#!/bin/bash -e +# Author: William Lam +# Website: williamlam.com +# Description: Import license file into VCF Operations 9.0 + +VCF_OPERATIONS_HOSTNAME="vcf01.vcf.lab" +VCF_OPERATIONS_USERNAME="admin" +VCF_OPERATIONS_PASSWORD='VMware1!VMware1!' +VCF_OPERATIONS_LICENSE_FILE=$1 + +# Check if it's a valid file +if [[ ! -f "$VCF_OPERATIONS_LICENSE_FILE" ]]; then + echo "Error: '$VCF_OPERATIONS_LICENSE_FILE' is not a valid file." + exit 1 +fi + +echo -e "\nAcquiring auth token from VCF Ops: ${VCF_OPERATIONS_HOSTNAME} ..." +RESULTS=$(curl -s -k -X POST "https://${VCF_OPERATIONS_HOSTNAME}/suite-api/api/auth/token/acquire" \ +-H "Content-Type: application/json" \ +-H "Accept: application/json" \ +-d "$(printf '{"username":"%s","password":"%s","authSource":"local"}' \ + "$VCF_OPERATIONS_USERNAME" \ + "$VCF_OPERATIONS_PASSWORD")") + +VCF_OPERATIONS_AUTH_TOKEN=$(echo ${RESULTS} | jq -r .token) + +echo -e "\nUploading License File to VCF Ops ..." +RESULTS=$(curl -s -X POST "https://${VCF_OPERATIONS_HOSTNAME}/suite-api/internal/extension/vcf-license-cloud-integration/registration/offline/response" \ +-H 'accept: application/json' \ +-H 'content-type: multipart/form-data' \ +-H "Authorization: OpsToken ${VCF_OPERATIONS_AUTH_TOKEN}" \ +-H 'X-Ops-API-use-unsupported: true' \ +-F "file=@${VCF_OPERATIONS_LICENSE_FILE}" \ +--insecure) + + From b6226a8340078efe383232c1cf68d903a04d5746 Mon Sep 17 00:00:00 2001 From: William Lam Date: Mon, 29 Sep 2025 13:13:24 -0700 Subject: [PATCH 23/37] Automate VCF Operations VCF SSO ADoverLDAP Sync --- ...erations_active_directory_over_ldap_idp.sh | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100755 shell/sync_vcf_operations_active_directory_over_ldap_idp.sh diff --git a/shell/sync_vcf_operations_active_directory_over_ldap_idp.sh b/shell/sync_vcf_operations_active_directory_over_ldap_idp.sh new file mode 100755 index 0000000..2b426b2 --- /dev/null +++ b/shell/sync_vcf_operations_active_directory_over_ldap_idp.sh @@ -0,0 +1,47 @@ +#!/bin/bash -e +# Author: William Lam +# Website: williamlam.com +# Description: Manually Sync VCF SSO Active Directory over LDAP in VCF Operations 9.0 + +VCF_OPERATIONS_HOSTNAME="FILL_ME" +VCF_OPERATIONS_USERNAME="FILL_ME" +VCF_OPERATIONS_PASSWORD='FILL_ME' + +RESULTS=$(curl -s -k -X POST "https://${VCF_OPERATIONS_HOSTNAME}/suite-api/api/auth/token/acquire" \ +-H "Content-Type: application/json" \ +-H "Accept: application/json" \ +-d "$(printf '{"username":"%s","password":"%s","authSource":"local"}' \ + "$VCF_OPERATIONS_USERNAME" \ + "$VCF_OPERATIONS_PASSWORD")") + +VCF_OPERATIONS_AUTH_TOKEN=$(echo ${RESULTS} | jq -r .token) + +RESULTS=$(curl -s -X GET "https://${VCF_OPERATIONS_HOSTNAME}/suite-api/internal/vidb/identityproviders" \ +-H 'accept: application/json' \ +-H 'content-type: application/json' \ +-H "Authorization: OpsToken ${VCF_OPERATIONS_AUTH_TOKEN}" \ +-H 'X-Ops-API-use-unsupported: true' \ +--insecure) + +VCF_OPERATIONS_IDP_ID=$(echo ${RESULTS} | jq -r .identityProviderInfoList[0].id) + +RESULTS=$(curl -s -X GET "https://${VCF_OPERATIONS_HOSTNAME}/suite-api/internal/vidb/identityproviders/${VCF_OPERATIONS_IDP_ID}/ldapdirectories" \ +-H 'accept: application/json' \ +-H 'content-type: application/json' \ +-H "Authorization: OpsToken ${VCF_OPERATIONS_AUTH_TOKEN}" \ +-H 'X-Ops-API-use-unsupported: true' \ +--insecure) + +VCF_OPERATIONS_LDAP_ID=$(echo ${RESULTS} | jq -r .items[0].id) + +LDAP_SSO_SYNC_URL="https://${VCF_OPERATIONS_HOSTNAME}/suite-api/internal/vidb/identityproviders/${VCF_OPERATIONS_IDP_ID}/ldapdirectories/${VCF_OPERATIONS_LDAP_ID}/sync" + +echo -e "\nSync'ing LDAP SSO Directory ..." +RESULTS=$(curl -s -X PUT ${LDAP_SSO_SYNC_URL} \ +-H 'accept: application/json' \ +-H 'content-type: application/json' \ +-H "Authorization: OpsToken ${VCF_OPERATIONS_AUTH_TOKEN}" \ +-H 'X-Ops-API-use-unsupported: true' \ +--data-raw '{}' \ +--insecure) + From 131a035faa29100a246f24f00e4f8f3532cc9862 Mon Sep 17 00:00:00 2001 From: William Lam Date: Sun, 5 Oct 2025 13:33:02 -0700 Subject: [PATCH 24/37] Adding -k for self-signed TLS certs --- shell/create_snapshot_for_vm.sh | 6 +++--- shell/list_advanced_settings_for_vm.sh | 10 +++++----- shell/list_custom_attributes_for_vm.sh | 12 ++++++------ 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/shell/create_snapshot_for_vm.sh b/shell/create_snapshot_for_vm.sh index 2963196..da16e48 100644 --- a/shell/create_snapshot_for_vm.sh +++ b/shell/create_snapshot_for_vm.sh @@ -5,12 +5,12 @@ VC_API_RELEASE='8.0.1.0' VM_NAME="esx-1.0" # vCenter REST API -VCREST_API_SESSION_ID=$(curl -s -u "${VC_USERNAME}:${VC_PASSWORD}" -X POST "https://${VC}/api/session" | jq -j) +VCREST_API_SESSION_ID=$(curl -k -s -u "${VC_USERNAME}:${VC_PASSWORD}" -X POST "https://${VC}/api/session" | jq -j) VM_MOREF=$(curl -s -H "vmware-api-session-id: ${VCREST_API_SESSION_ID}" -X GET "https://${VC}/api/vcenter/vm?names=${VM_NAME}" | jq -r '.[0].vm') # vCenter VI JSON API -SESSION_MANAGER_MOID=$(curl -s https://$VC/sdk/vim25/${VC_API_RELEASE}/ServiceInstance/ServiceInstance/content | jq -j .sessionManager.value) -VIJSON_API_SESSION_ID=$(curl -s -o /dev/null -D - "https://$VC/sdk/vim25/${VC_API_RELEASE}/SessionManager/$SESSION_MANAGER_MOID/Login" -H 'Content-Type: application/json' -d "{\"userName\":\"${VC_USERNAME}\", \"password\": \"${VC_PASSWORD}\"}" | awk 'BEGIN {FS=": "}/^vmware-api-session-id/{print $2}') +SESSION_MANAGER_MOID=$(curl -k -s https://$VC/sdk/vim25/${VC_API_RELEASE}/ServiceInstance/ServiceInstance/content | jq -j .sessionManager.value) +VIJSON_API_SESSION_ID=$(curl -k -s -o /dev/null -D - "https://$VC/sdk/vim25/${VC_API_RELEASE}/SessionManager/$SESSION_MANAGER_MOID/Login" -H 'Content-Type: application/json' -d "{\"userName\":\"${VC_USERNAME}\", \"password\": \"${VC_PASSWORD}\"}" | awk 'BEGIN {FS=": "}/^vmware-api-session-id/{print $2}') # Create Snapshot spec cat > snapshot_spec.json < Date: Sun, 5 Oct 2025 13:37:59 -0700 Subject: [PATCH 25/37] Add missing -k --- shell/create_snapshot_for_vm.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shell/create_snapshot_for_vm.sh b/shell/create_snapshot_for_vm.sh index da16e48..2b1bc45 100644 --- a/shell/create_snapshot_for_vm.sh +++ b/shell/create_snapshot_for_vm.sh @@ -22,7 +22,7 @@ cat > snapshot_spec.json < Date: Sun, 5 Oct 2025 14:14:52 -0700 Subject: [PATCH 26/37] Add Update VM Advanced Setting VI JSON API Example --- shell/create_snapshot_for_vm.sh | 3 ++ shell/list_advanced_settings_for_vm.sh | 3 ++ shell/list_custom_attributes_for_vm.sh | 3 ++ shell/update_advanced_settings_for_vm.sh | 54 ++++++++++++++++++++++++ 4 files changed, 63 insertions(+) create mode 100644 shell/update_advanced_settings_for_vm.sh diff --git a/shell/create_snapshot_for_vm.sh b/shell/create_snapshot_for_vm.sh index 2b1bc45..5e01a6b 100644 --- a/shell/create_snapshot_for_vm.sh +++ b/shell/create_snapshot_for_vm.sh @@ -1,3 +1,6 @@ +#!/bin/bash +## VI JSON API example for Creating VM Snapshot + VC='vcsa.primp-industries.local' VC_USERNAME='administrator@vsphere.local' VC_PASSWORD='VMware1!' diff --git a/shell/list_advanced_settings_for_vm.sh b/shell/list_advanced_settings_for_vm.sh index 1ead8c8..1dbf61e 100644 --- a/shell/list_advanced_settings_for_vm.sh +++ b/shell/list_advanced_settings_for_vm.sh @@ -1,3 +1,6 @@ +#!/bin/bash +# VI JSON API example for Listing VM Advanced Setting + VC='vcsa.primp-industries.local' VC_USERNAME='administrator@vsphere.local' VC_PASSWORD='VMware1!' diff --git a/shell/list_custom_attributes_for_vm.sh b/shell/list_custom_attributes_for_vm.sh index dfde765..f5f1972 100644 --- a/shell/list_custom_attributes_for_vm.sh +++ b/shell/list_custom_attributes_for_vm.sh @@ -1,3 +1,6 @@ +#!/bin/bash +# VI JSON API example for Listing VM Custom Attributes + VC='vcsa.primp-industries.local' VC_USERNAME='administrator@vsphere.local' VC_PASSWORD='VMware1!' diff --git a/shell/update_advanced_settings_for_vm.sh b/shell/update_advanced_settings_for_vm.sh new file mode 100644 index 0000000..2f65778 --- /dev/null +++ b/shell/update_advanced_settings_for_vm.sh @@ -0,0 +1,54 @@ +#!/bin/bash +# VI JSON API example for Updating VM Advanced Setting + +VC='vcsa.primp-industries.local' +VC_USERNAME='administrator@vsphere.local' +VC_PASSWORD='VMware1!' +VC_API_RELEASE='9.0.0.0' +VM_NAME='MyVM' + +# vCenter REST API +VCREST_API_SESSION_ID=$(curl -k -s -u "${VC_USERNAME}:${VC_PASSWORD}" -X POST "https://${VC}/api/session" | jq -j) +VM_MOREF=$(curl -k -s -H "vmware-api-session-id: ${VCREST_API_SESSION_ID}" -X GET "https://${VC}/api/vcenter/vm?names=${VM_NAME}" | jq -r '.[0].vm') + +# Update disk.EnableUUID & svga.present +# Add blog +cat > extra-config-spec.json < Date: Sun, 19 Oct 2025 08:31:10 -0700 Subject: [PATCH 27/37] VCF Automation TF Provider Example --- terraform/vcfa-provider-example-main.tf | 221 ++++++++++++++++++ .../vcfa-provider-example-terraform.tfvars | 54 +++++ ...ovider-example-william_custom_variables.tf | 70 ++++++ 3 files changed, 345 insertions(+) create mode 100644 terraform/vcfa-provider-example-main.tf create mode 100644 terraform/vcfa-provider-example-terraform.tfvars create mode 100644 terraform/vcfa-provider-example-william_custom_variables.tf diff --git a/terraform/vcfa-provider-example-main.tf b/terraform/vcfa-provider-example-main.tf new file mode 100644 index 0000000..3452699 --- /dev/null +++ b/terraform/vcfa-provider-example-main.tf @@ -0,0 +1,221 @@ +# William Lam +# Example configuring VCF Automation Provider Portal using Terraform Provider for VCFA +# Automates the following configuration from https://williamlam.com/2025/08/ms-a2-vcf-9-0-lab-configuring-vcf-automation.html + +terraform { + required_providers { + vcfa = { + source = "vmware/vcfa" + version = "~> 1.0.0" + } + } +} + +# Configure the VMware Cloud Foundation Automation Provider +provider "vcfa" { + user = var.username + password = var.password + auth_type = "integrated" + org = "System" + url = var.url + allow_unverified_ssl = true + logging = true + logging_file = "vcfa.log" +} + +# Fetch the VCFA version +data "vcfa_version" "version" { + condition = ">= 9.0.0" + fail_if_not_match = false +} + +# Fetch vCenter Server attached to VCFA +data "vcfa_vcenter" "vc" { + name = replace(var.vcenter_url, "https://", "") +} + +# Fetch vSphere Supervisor Cluster attached to vCenter Server +data "vcfa_supervisor" "sv" { + name = var.supervisor_name + vcenter_id = data.vcfa_vcenter.vc.id +} + +# Fetch NSX Manager attached to vCenter Server & vSphere Supervisor +data "vcfa_nsx_manager" "nsx" { + name = replace(var.nsx_manager_url, "https://", "") +} + +# Fetch vSphere Supervisor Zone Name +data "vcfa_region_zone" "zone" { + region_id = vcfa_region.region.id + name = var.supervisor_zone_name +} + +# Fetch 1st VM Class that will be used within VCFA Region +data "vcfa_region_vm_class" "vm_class1" { + name = tolist(var.region_vm_class_names)[0] + region_id = vcfa_region.region.id +} + +# Fetch 2nd VM Class that will be used within VCFA Region +data "vcfa_region_vm_class" "vm_class2" { + name = tolist(var.region_vm_class_names)[1] + region_id = vcfa_region.region.id +} + +# Fetch 3rd VM Class that will be used within VCFA Region +data "vcfa_region_vm_class" "vm_class3" { + name = tolist(var.region_vm_class_names)[2] + region_id = vcfa_region.region.id +} + +# Fetch 4th VM Class that will be used within VCFA Region +data "vcfa_region_vm_class" "vm_class4" { + name = tolist(var.region_vm_class_names)[3] + region_id = vcfa_region.region.id +} + +# Fetch VM Storage Policy for use by VCFA Region +data "vcfa_region_storage_policy" "region-sc" { + name = tolist(var.region_storage_policy_names)[0] + region_id = vcfa_region.region.id +} + +# Create VCFA Region +resource "vcfa_region" "region" { + name = var.region_name + nsx_manager_id = data.vcfa_nsx_manager.nsx.id + supervisor_ids = [data.vcfa_supervisor.sv.id] + storage_policy_names = var.region_storage_policy_names +} + +# Create VCFA Org +resource "vcfa_org" "org" { + name = var.org_name + display_name = var.org_name + description = "${var.org_name} Organization" + is_enabled = true +} + +# Create VCFA Region Quota +resource "vcfa_org_region_quota" "region_quota" { + org_id = vcfa_org.org.id + region_id = vcfa_region.region.id + supervisor_ids = [data.vcfa_supervisor.sv.id] + zone_resource_allocations { + region_zone_id = data.vcfa_region_zone.zone.id + cpu_limit_mhz = var.region_quota_cpu_limit_mhz + cpu_reservation_mhz = var.region_quota_cpu_reservation_mhz + memory_limit_mib = var.region_quota_mem_limit_mb + memory_reservation_mib = var.region_quota_mem_reservation_mb + } + region_vm_class_ids = [ + data.vcfa_region_vm_class.vm_class1.id, + data.vcfa_region_vm_class.vm_class2.id, + data.vcfa_region_vm_class.vm_class3.id, + data.vcfa_region_vm_class.vm_class4.id, + ] + region_storage_policy { + region_storage_policy_id = data.vcfa_region_storage_policy.region-sc.id + storage_limit_mib = var.region_quota_storage_limit_mb + } +} + +# Create VCFA Network Logs Label +resource "vcfa_org_networking" "network" { + org_id = vcfa_org.org.id + log_name = lower(var.org_name) +} + +# Fetch VCFA Org Admin Role +data "vcfa_role" "org-admin" { + org_id = vcfa_org.org.id + name = "Organization Administrator" +} + +# Create First User for VCFA Org +resource "vcfa_org_local_user" "user" { + org_id = vcfa_org.org.id + role_ids = [data.vcfa_role.org-admin.id] + username = var.org_local_username + password = var.org_local_password +} + +# Fetch NSX Edge Cluster for use with VCFA Region +data "vcfa_edge_cluster" "edge-cluster" { + name = var.nsx_edge_cluster_name + region_id = vcfa_region.region.id + sync_before_read = true +} + +# Fetch NSX T0 Gateway for use with VCFA Region +data "vcfa_tier0_gateway" "t0-gw" { + name = var.tier0_gateway_name + region_id = vcfa_region.region.id +} + +# Create VCFA Edge Cluster QoS +resource "vcfa_edge_cluster_qos" "edge-cluster-qos" { + edge_cluster_id = data.vcfa_edge_cluster.edge-cluster.id + + egress_committed_bandwidth_mbps = -1 + egress_burst_size_bytes = -1 + ingress_committed_bandwidth_mbps = -1 + ingress_burst_size_bytes = -1 +} + +# Create VCFA IP Space +resource "vcfa_ip_space" "ipspace" { + name = "${var.org_name}-ipspace" + description = "${var.org_name} IP Space" + region_id = vcfa_region.region.id + external_scope = "0.0.0.0/0" + default_quota_max_subnet_size = var.ipspace_max_subnet_size + default_quota_max_cidr_count = var.ipspace_max_cidr_count + default_quota_max_ip_count = var.ipspace_max_ip_count + + internal_scope { + name = "scope1" + cidr = var.ipspace_scope_cidr1 + } +} +# Create VCFA Provider Gateway +resource "vcfa_provider_gateway" "provider-gw" { + name = "${var.org_name}-provider-gw" + description = "${var.org_name} Provider Gateway" + region_id = vcfa_region.region.id + tier0_gateway_id = data.vcfa_tier0_gateway.t0-gw.id + ip_space_ids = [vcfa_ip_space.ipspace.id] +} + +# Create VCFA Regional Networking +resource "vcfa_org_regional_networking" "regional-network" { + name = "${var.org_name}-regional-network" + + org_id = vcfa_org_networking.network.id + + provider_gateway_id = vcfa_provider_gateway.provider-gw.id + region_id = vcfa_region.region.id + + edge_cluster_id = data.vcfa_edge_cluster.edge-cluster.id +} + +# Fetch VM Storage Class for use by Content Library in VCFA Region +data "vcfa_storage_class" "sc" { + region_id = vcfa_region.region.id + name = tolist(var.region_storage_policy_names)[0] +} + +data "vcfa_org" "system" { + name = "System" +} + +# Create Content Library +resource "vcfa_content_library" "cl" { + org_id = data.vcfa_org.system.id + name = var.global_content_library_name + description = var.global_content_library_name + storage_class_ids = [ + data.vcfa_storage_class.sc.id + ] +} \ No newline at end of file diff --git a/terraform/vcfa-provider-example-terraform.tfvars b/terraform/vcfa-provider-example-terraform.tfvars new file mode 100644 index 0000000..1c9b01c --- /dev/null +++ b/terraform/vcfa-provider-example-terraform.tfvars @@ -0,0 +1,54 @@ +# VCF Automation Information +url = "https://auto01.vcf.lab" +username = "admin" +password = "VMware1!VMware1!" + +# vCenter Server Information +vcenter_url = "https://vc01.vcf.lab" +vcenter_username = "administrator@vsphere.local" +vcenter_password = "VMware1!VMware1!" +vcenter_storage_policy_names = ["vcf-vsan-esa-policy"] + +# NSX Manager Inforation +nsx_manager_url = "https://nsx01.vcf.lab" +nsx_manager_username = "admin" +nsx_manager_password = "VMware1!VMware1!" +tier0_gateway_name = "transit-gw" +nsx_edge_cluster_name = "ec-01" + +# vSphere Supervisor Information +supervisor_name = "sv-01" +supervisor_zone_name = "vz-01" + +# Region Configuration +region_storage_policy_names = ["vcf-vsan-esa-policy"] +region_vm_class_names = ["best-effort-large", "best-effort-medium", "best-effort-small", "best-effort-xsmall"] + +#### --- Start Custom Variables from William Lam --- #### + +# Name of VCFA Organization +org_name = "Legal" + +# First User for VCFA Organization +org_local_username = "admin" +org_local_password = "VMware1!VMware1!" + +# Name of VCFA Region +region_name = "west" + +# Regional Quota Configuration +region_quota_cpu_limit_mhz = 85000 +region_quota_cpu_reservation_mhz = 0 +region_quota_mem_limit_mb = 450000 +region_quota_mem_reservation_mb = 0 +region_quota_storage_limit_mb = 48000 + +# IP Space Configuration +ipspace_scope_cidr1 = "31.32.0.0/16" +ipspace_max_subnet_size = 28 +ipspace_max_cidr_count = 5 +ipspace_max_ip_count = 5 + +# Name of VCFA Global Content Library +global_content_library_name = "Shared Content Library" + diff --git a/terraform/vcfa-provider-example-william_custom_variables.tf b/terraform/vcfa-provider-example-william_custom_variables.tf new file mode 100644 index 0000000..2769b5d --- /dev/null +++ b/terraform/vcfa-provider-example-william_custom_variables.tf @@ -0,0 +1,70 @@ +variable "region_name" { + description = "Name of VCFA Region" + type = string +} + +variable "org_name" { + description = "Name of VCFA Organization" + type = string +} + +variable "ipspace_scope_cidr1" { + description = "IP Space Scope CIDR 1" + type = string +} + +variable "ipspace_max_subnet_size" { + description = "IP Space Max Subnet Size" + type = number +} + +variable "ipspace_max_cidr_count" { + description = "IP Space Max CIDR Count" + type = number +} + +variable "ipspace_max_ip_count" { + description = "IP Space Max IP Count" + type = number +} + +variable "region_quota_cpu_limit_mhz" { + description = "Region Quota CPU Limit" + type = number +} + +variable "region_quota_cpu_reservation_mhz" { + description = "Region Quota CPU Reservation" + type = number +} + +variable "region_quota_mem_limit_mb" { + description = "Region Quota Mem Limit " + type = number +} + +variable "region_quota_mem_reservation_mb" { + description = "Region Quota Mem Reservation" + type = number +} + +variable "region_quota_storage_limit_mb" { + description = "Region Quota Storage Limit" + type = number +} + +variable "org_local_username" { + description = "Username for local org user" + type = string +} + +variable "org_local_password" { + description = "Password for local org user" + type = string + sensitive = true +} + +variable "global_content_library_name" { + description = "Name of VCFA Global Content Library" + type = string +} \ No newline at end of file From 36b9a07a77907b0ef836b66ba127426836982c2c Mon Sep 17 00:00:00 2001 From: William Lam Date: Sat, 25 Oct 2025 07:02:25 -0700 Subject: [PATCH 28/37] VCF Fleet Simple/HA Mix Examples --- json/vcf-fleet-ha-nsx-sample.json | 275 ++++++++++++++++++ json/vcf-fleet-ha-vcf-automation-sample.json | 271 +++++++++++++++++ json/vcf-fleet-ha-vcf-operations-sample.json | 280 ++++++++++++++++++ json/vcf-fleet-high-availablity-sample.json | 288 +++++++++++++++++++ json/vcf-fleet-simple-sample.json | 269 +++++++++++++++++ 5 files changed, 1383 insertions(+) create mode 100644 json/vcf-fleet-ha-nsx-sample.json create mode 100644 json/vcf-fleet-ha-vcf-automation-sample.json create mode 100644 json/vcf-fleet-ha-vcf-operations-sample.json create mode 100644 json/vcf-fleet-high-availablity-sample.json create mode 100644 json/vcf-fleet-simple-sample.json diff --git a/json/vcf-fleet-ha-nsx-sample.json b/json/vcf-fleet-ha-nsx-sample.json new file mode 100644 index 0000000..a4142b9 --- /dev/null +++ b/json/vcf-fleet-ha-nsx-sample.json @@ -0,0 +1,275 @@ +{ + "sddcId": "vcf-m01", + "vcfInstanceName": "VCF 9 - NSX HA", + "workflowType": "VCF", + "version": "9.0.1.0", + "ceipEnabled": false, + "fipsEnabled": true, + "skipEsxThumbprintValidation": true, + "skipGatewayPingValidation": true, + "sddcManagerSpec": { + "rootUserCredentials": { + "username": "root", + "password": "VMware1!VMware1!" + }, + "secondUserCredentials": { + "username": "vcf", + "password": "VMware1!VMware1!" + }, + "hostname": "sddcm01", + "useExistingDeployment": true, + "rootPassword": "VMware1!VMware1!", + "sshPassword": "VMware1!VMware1!", + "localUserPassword": "VMware1!VMware1!" + }, + "dnsSpec": { + "nameservers": [ + "192.168.30.29" + ], + "subdomain": "vcf.lab" + }, + "ntpServers": [ + "104.167.215.195" + ], + "vcenterSpec": { + "vcenterHostname": "vc01", + "rootVcenterPassword": "VMware1!VMware1!", + "vmSize": "small", + "storageSize": "", + "adminUserSsoPassword": "VMware1!VMware1!", + "ssoDomain": "vsphere.local", + "useExistingDeployment": false + }, + "hostSpecs": [ + { + "hostname": "esx01", + "credentials": { + "username": "root", + "password": "VMware1!" + } + }, + { + "hostname": "esx02", + "credentials": { + "username": "root", + "password": "VMware1!" + } + }, + { + "hostname": "esx03", + "credentials": { + "username": "root", + "password": "VMware1!" + } + } + ], + "clusterSpec": { + "clusterName": "VCF-Mgmt-Cluster", + "datacenterName": "VCF-Datacenter", + "clusterEvcMode": "", + "clusterImageEnabled": true + }, + "datastoreSpec": { + "vsanSpec": { + "failuresToTolerate": 0, + "vsanDedup": false, + "esaConfig": { + "enabled": true + }, + "datastoreName": "vsanDatastore" + } + }, + "nsxtSpec": { + "nsxtManagerSize": "medium", + "nsxtManagers": [ + { + "hostname": "nsx01a" + }, + { + "hostname": "nsx01b" + }, + { + "hostname": "nsx01c" + } + ], + "vipFqdn": "nsx01", + "useExistingDeployment": false, + "nsxtAdminPassword": "VMware1!VMware1!", + "nsxtAuditPassword": "VMware1!VMware1!", + "rootNsxtManagerPassword": "VMware1!VMware1!", + "skipNsxOverlayOverManagementNetwork": true, + "ipAddressPoolSpec": { + "name": "tep01", + "description": "ESXi Host Overlay TEP IP Pool", + "subnets": [ + { + "cidr": "172.30.60.0/24", + "ipAddressPoolRanges": [ + { + "start": "172.30.60.150", + "end": "172.30.60.160" + } + ], + "gateway": "172.30.60.1" + } + ] + }, + "transportVlanId": "60" + }, + "vcfOperationsSpec": { + "nodes": [ + { + "hostname": "vcf01", + "rootUserPassword": "VMware1!VMware1!", + "type": "master" + } + ], + "adminUserPassword": "VMware1!VMware1!", + "applianceSize": "medium", + "useExistingDeployment": false, + "loadBalancerFqdn": "" + }, + "vcfOperationsFleetManagementSpec": { + "hostname": "opsfm01", + "rootUserPassword": "VMware1!VMware1!", + "adminUserPassword": "VMware1!VMware1!", + "useExistingDeployment": false + }, + "vcfOperationsCollectorSpec": { + "hostname": "opsproxy01", + "applicationSize": "small", + "rootUserPassword": "VMware1!VMware1!", + "useExistingDeployment": false + }, + "vcfAutomationSpec": { + "hostname": "auto01", + "adminUserPassword": "VMware1!VMware1!", + "ipPool": [ + "172.30.0.31", + "172.30.0.32" + ], + "nodePrefix": "auto01", + "internalClusterCidr": "198.18.0.0/15", + "useExistingDeployment": false + }, + "networkSpecs": [ + { + "networkType": "MANAGEMENT", + "subnet": "172.30.0.0/24", + "gateway": "172.30.0.1", + "subnetMask": null, + "includeIpAddress": null, + "includeIpAddressRanges": null, + "vlanId": "30", + "mtu": "1500", + "teamingPolicy": "loadbalance_loadbased", + "activeUplinks": [ + "uplink1" + ], + "standbyUplinks": [], + "portGroupKey": "DVPG_FOR_MANAGEMENT" + }, + { + "networkType": "VM_MANAGEMENT", + "subnet": "172.30.0.0/24", + "gateway": "172.30.0.1", + "subnetMask": null, + "includeIpAddress": null, + "includeIpAddressRanges": null, + "vlanId": "30", + "mtu": "1500", + "teamingPolicy": "loadbalance_loadbased", + "activeUplinks": [ + "uplink1" + ], + "standbyUplinks": [], + "portGroupKey": "DVPG_FOR_VM_MANAGEMENT" + }, + { + "networkType": "VMOTION", + "subnet": "172.30.40.0/24", + "gateway": "172.30.40.1", + "subnetMask": null, + "includeIpAddress": null, + "includeIpAddressRanges": [ + { + "startIpAddress": "172.30.40.150", + "endIpAddress": "172.30.40.160" + } + ], + "vlanId": "40", + "mtu": "9000", + "teamingPolicy": "loadbalance_loadbased", + "activeUplinks": [ + "uplink1" + ], + "standbyUplinks": [], + "portGroupKey": "DVPG_FOR_VMOTION" + }, + { + "networkType": "VSAN", + "subnet": "172.30.50.0/24", + "gateway": "172.30.50.1", + "subnetMask": null, + "includeIpAddress": null, + "includeIpAddressRanges": [ + { + "startIpAddress": "172.30.50.150", + "endIpAddress": "172.30.50.160" + } + ], + "vlanId": "50", + "mtu": "9000", + "teamingPolicy": "loadbalance_loadbased", + "activeUplinks": [ + "uplink1" + ], + "standbyUplinks": [], + "portGroupKey": "DVPG_FOR_VSAN" + } + ], + "dvsSpecs": [ + { + "dvsName": "sddc1-cl01-vds01", + "networks": [ + "MANAGEMENT", + "VM_MANAGEMENT", + "VMOTION", + "VSAN" + ], + "mtu": "9000", + "nsxtSwitchConfig": { + "transportZones": [ + { + "transportType": "OVERLAY", + "name": "vcf-overlay-TZ" + }, + { + "transportType": "VLAN", + "name": "vcf-vlan-TZ" + } + ], + "hostSwitchOperationalMode": "STANDARD" + }, + "vmnicsToUplinks": [ + { + "uplink": "uplink1", + "id": "vmnic0" + } + ], + "nsxTeamings": [ + { + "standByUplinks": [], + "policy": "LOADBALANCE_SRCID", + "activeUplinks": [ + "uplink1" + ] + } + ], + "lagSpecs": null, + "vmnics": [ + "vmnic0" + ] + } + ] +} \ No newline at end of file diff --git a/json/vcf-fleet-ha-vcf-automation-sample.json b/json/vcf-fleet-ha-vcf-automation-sample.json new file mode 100644 index 0000000..5cfb0e4 --- /dev/null +++ b/json/vcf-fleet-ha-vcf-automation-sample.json @@ -0,0 +1,271 @@ +{ + "sddcId": "vcf-m01", + "vcfInstanceName": "VCF 9 - VCF Automation HA", + "workflowType": "VCF", + "version": "9.0.1.0", + "ceipEnabled": false, + "fipsEnabled": true, + "skipEsxThumbprintValidation": true, + "skipGatewayPingValidation": true, + "sddcManagerSpec": { + "rootUserCredentials": { + "username": "root", + "password": "VMware1!VMware1!" + }, + "secondUserCredentials": { + "username": "vcf", + "password": "VMware1!VMware1!" + }, + "hostname": "sddcm01", + "useExistingDeployment": true, + "rootPassword": "VMware1!VMware1!", + "sshPassword": "VMware1!VMware1!", + "localUserPassword": "VMware1!VMware1!" + }, + "dnsSpec": { + "nameservers": [ + "192.168.30.29" + ], + "subdomain": "vcf.lab" + }, + "ntpServers": [ + "104.167.215.195" + ], + "vcenterSpec": { + "vcenterHostname": "vc01", + "rootVcenterPassword": "VMware1!VMware1!", + "vmSize": "small", + "storageSize": "", + "adminUserSsoPassword": "VMware1!VMware1!", + "ssoDomain": "vsphere.local", + "useExistingDeployment": false + }, + "hostSpecs": [ + { + "hostname": "esx01", + "credentials": { + "username": "root", + "password": "VMware1!" + } + }, + { + "hostname": "esx02", + "credentials": { + "username": "root", + "password": "VMware1!" + } + }, + { + "hostname": "esx03", + "credentials": { + "username": "root", + "password": "VMware1!" + } + } + ], + "clusterSpec": { + "clusterName": "VCF-Mgmt-Cluster", + "datacenterName": "VCF-Datacenter", + "clusterEvcMode": "", + "clusterImageEnabled": true + }, + "datastoreSpec": { + "vsanSpec": { + "failuresToTolerate": 0, + "vsanDedup": false, + "esaConfig": { + "enabled": true + }, + "datastoreName": "vsanDatastore" + } + }, + "nsxtSpec": { + "nsxtManagerSize": "medium", + "nsxtManagers": [ + { + "hostname": "nsx01a" + } + ], + "vipFqdn": "nsx01", + "useExistingDeployment": false, + "nsxtAdminPassword": "VMware1!VMware1!", + "nsxtAuditPassword": "VMware1!VMware1!", + "rootNsxtManagerPassword": "VMware1!VMware1!", + "skipNsxOverlayOverManagementNetwork": true, + "ipAddressPoolSpec": { + "name": "tep01", + "description": "ESXi Host Overlay TEP IP Pool", + "subnets": [ + { + "cidr": "172.30.60.0/24", + "ipAddressPoolRanges": [ + { + "start": "172.30.60.150", + "end": "172.30.60.160" + } + ], + "gateway": "172.30.60.1" + } + ] + }, + "transportVlanId": "60" + }, + "vcfOperationsSpec": { + "nodes": [ + { + "hostname": "vcf01", + "rootUserPassword": "VMware1!VMware1!", + "type": "master" + } + ], + "adminUserPassword": "VMware1!VMware1!", + "applianceSize": "medium", + "useExistingDeployment": false, + "loadBalancerFqdn": "" + }, + "vcfOperationsFleetManagementSpec": { + "hostname": "opsfm01", + "rootUserPassword": "VMware1!VMware1!", + "adminUserPassword": "VMware1!VMware1!", + "useExistingDeployment": false + }, + "vcfOperationsCollectorSpec": { + "hostname": "opsproxy01", + "applicationSize": "small", + "rootUserPassword": "VMware1!VMware1!", + "useExistingDeployment": false + }, + "vcfAutomationSpec": { + "hostname": "auto01", + "adminUserPassword": "VMware1!VMware1!", + "ipPool": [ + "172.30.0.31", + "172.30.0.32", + "172.30.0.33", + "172.30.0.34" + ], + "nodePrefix": "auto01", + "internalClusterCidr": "198.18.0.0/15", + "useExistingDeployment": false + }, + "networkSpecs": [ + { + "networkType": "MANAGEMENT", + "subnet": "172.30.0.0/24", + "gateway": "172.30.0.1", + "subnetMask": null, + "includeIpAddress": null, + "includeIpAddressRanges": null, + "vlanId": "30", + "mtu": "1500", + "teamingPolicy": "loadbalance_loadbased", + "activeUplinks": [ + "uplink1" + ], + "standbyUplinks": [], + "portGroupKey": "DVPG_FOR_MANAGEMENT" + }, + { + "networkType": "VM_MANAGEMENT", + "subnet": "172.30.0.0/24", + "gateway": "172.30.0.1", + "subnetMask": null, + "includeIpAddress": null, + "includeIpAddressRanges": null, + "vlanId": "30", + "mtu": "1500", + "teamingPolicy": "loadbalance_loadbased", + "activeUplinks": [ + "uplink1" + ], + "standbyUplinks": [], + "portGroupKey": "DVPG_FOR_VM_MANAGEMENT" + }, + { + "networkType": "VMOTION", + "subnet": "172.30.40.0/24", + "gateway": "172.30.40.1", + "subnetMask": null, + "includeIpAddress": null, + "includeIpAddressRanges": [ + { + "startIpAddress": "172.30.40.150", + "endIpAddress": "172.30.40.160" + } + ], + "vlanId": "40", + "mtu": "9000", + "teamingPolicy": "loadbalance_loadbased", + "activeUplinks": [ + "uplink1" + ], + "standbyUplinks": [], + "portGroupKey": "DVPG_FOR_VMOTION" + }, + { + "networkType": "VSAN", + "subnet": "172.30.50.0/24", + "gateway": "172.30.50.1", + "subnetMask": null, + "includeIpAddress": null, + "includeIpAddressRanges": [ + { + "startIpAddress": "172.30.50.150", + "endIpAddress": "172.30.50.160" + } + ], + "vlanId": "50", + "mtu": "9000", + "teamingPolicy": "loadbalance_loadbased", + "activeUplinks": [ + "uplink1" + ], + "standbyUplinks": [], + "portGroupKey": "DVPG_FOR_VSAN" + } + ], + "dvsSpecs": [ + { + "dvsName": "sddc1-cl01-vds01", + "networks": [ + "MANAGEMENT", + "VM_MANAGEMENT", + "VMOTION", + "VSAN" + ], + "mtu": "9000", + "nsxtSwitchConfig": { + "transportZones": [ + { + "transportType": "OVERLAY", + "name": "vcf-overlay-TZ" + }, + { + "transportType": "VLAN", + "name": "vcf-vlan-TZ" + } + ], + "hostSwitchOperationalMode": "STANDARD" + }, + "vmnicsToUplinks": [ + { + "uplink": "uplink1", + "id": "vmnic0" + } + ], + "nsxTeamings": [ + { + "standByUplinks": [], + "policy": "LOADBALANCE_SRCID", + "activeUplinks": [ + "uplink1" + ] + } + ], + "lagSpecs": null, + "vmnics": [ + "vmnic0" + ] + } + ] +} \ No newline at end of file diff --git a/json/vcf-fleet-ha-vcf-operations-sample.json b/json/vcf-fleet-ha-vcf-operations-sample.json new file mode 100644 index 0000000..9129974 --- /dev/null +++ b/json/vcf-fleet-ha-vcf-operations-sample.json @@ -0,0 +1,280 @@ +{ + "sddcId": "vcf-m01", + "vcfInstanceName": "VCF 9 - VCF Operations HA", + "workflowType": "VCF", + "version": "9.0.1.0", + "ceipEnabled": false, + "fipsEnabled": true, + "skipEsxThumbprintValidation": true, + "skipGatewayPingValidation": true, + "sddcManagerSpec": { + "rootUserCredentials": { + "username": "root", + "password": "VMware1!VMware1!" + }, + "secondUserCredentials": { + "username": "vcf", + "password": "VMware1!VMware1!" + }, + "hostname": "sddcm01", + "useExistingDeployment": true, + "rootPassword": "VMware1!VMware1!", + "sshPassword": "VMware1!VMware1!", + "localUserPassword": "VMware1!VMware1!" + }, + "dnsSpec": { + "nameservers": [ + "192.168.30.29" + ], + "subdomain": "vcf.lab" + }, + "ntpServers": [ + "104.167.215.195" + ], + "vcenterSpec": { + "vcenterHostname": "vc01", + "rootVcenterPassword": "VMware1!VMware1!", + "vmSize": "small", + "storageSize": "", + "adminUserSsoPassword": "VMware1!VMware1!", + "ssoDomain": "vsphere.local", + "useExistingDeployment": false + }, + "hostSpecs": [ + { + "hostname": "esx01", + "credentials": { + "username": "root", + "password": "VMware1!" + } + }, + { + "hostname": "esx02", + "credentials": { + "username": "root", + "password": "VMware1!" + } + }, + { + "hostname": "esx03", + "credentials": { + "username": "root", + "password": "VMware1!" + } + } + ], + "clusterSpec": { + "clusterName": "VCF-Mgmt-Cluster", + "datacenterName": "VCF-Datacenter", + "clusterEvcMode": "", + "clusterImageEnabled": true + }, + "datastoreSpec": { + "vsanSpec": { + "failuresToTolerate": 0, + "vsanDedup": false, + "esaConfig": { + "enabled": true + }, + "datastoreName": "vsanDatastore" + } + }, + "nsxtSpec": { + "nsxtManagerSize": "medium", + "nsxtManagers": [ + { + "hostname": "nsx01a" + } + ], + "vipFqdn": "nsx01", + "useExistingDeployment": false, + "nsxtAdminPassword": "VMware1!VMware1!", + "nsxtAuditPassword": "VMware1!VMware1!", + "rootNsxtManagerPassword": "VMware1!VMware1!", + "skipNsxOverlayOverManagementNetwork": true, + "ipAddressPoolSpec": { + "name": "tep01", + "description": "ESXi Host Overlay TEP IP Pool", + "subnets": [ + { + "cidr": "172.30.60.0/24", + "ipAddressPoolRanges": [ + { + "start": "172.30.60.150", + "end": "172.30.60.160" + } + ], + "gateway": "172.30.60.1" + } + ] + }, + "transportVlanId": "60" + }, + "vcfOperationsSpec": { + "nodes": [ + { + "hostname": "vcf01a", + "rootUserPassword": "VMware1!VMware1!", + "type": "master" + }, + { + "hostname": "vcf01b", + "rootUserPassword": "VMware1!VMware1!", + "type": "replica", + "sslThumbprint": "" + }, + { + "hostname": "vcf01c", + "rootUserPassword": "VMware1!VMware1!", + "type": "data" + } + ], + "adminUserPassword": "VMware1!VMware1!", + "applianceSize": "medium", + "useExistingDeployment": false, + "loadBalancerFqdn": "vcf01" + }, + "vcfOperationsFleetManagementSpec": { + "hostname": "opsfm01", + "rootUserPassword": "VMware1!VMware1!", + "adminUserPassword": "VMware1!VMware1!", + "useExistingDeployment": false + }, + "vcfOperationsCollectorSpec": { + "hostname": "opsproxy01", + "applicationSize": "small", + "rootUserPassword": "VMware1!VMware1!", + "useExistingDeployment": false + }, + "vcfAutomationSpec": { + "hostname": "auto01", + "adminUserPassword": "VMware1!VMware1!", + "ipPool": [ + "172.30.0.31", + "172.30.0.32" + ], + "nodePrefix": "auto01", + "internalClusterCidr": "198.18.0.0/15", + "useExistingDeployment": false + }, + "networkSpecs": [ + { + "networkType": "MANAGEMENT", + "subnet": "172.30.0.0/24", + "gateway": "172.30.0.1", + "subnetMask": null, + "includeIpAddress": null, + "includeIpAddressRanges": null, + "vlanId": "30", + "mtu": "1500", + "teamingPolicy": "loadbalance_loadbased", + "activeUplinks": [ + "uplink1" + ], + "standbyUplinks": [], + "portGroupKey": "DVPG_FOR_MANAGEMENT" + }, + { + "networkType": "VM_MANAGEMENT", + "subnet": "172.30.0.0/24", + "gateway": "172.30.0.1", + "subnetMask": null, + "includeIpAddress": null, + "includeIpAddressRanges": null, + "vlanId": "30", + "mtu": "1500", + "teamingPolicy": "loadbalance_loadbased", + "activeUplinks": [ + "uplink1" + ], + "standbyUplinks": [], + "portGroupKey": "DVPG_FOR_VM_MANAGEMENT" + }, + { + "networkType": "VMOTION", + "subnet": "172.30.40.0/24", + "gateway": "172.30.40.1", + "subnetMask": null, + "includeIpAddress": null, + "includeIpAddressRanges": [ + { + "startIpAddress": "172.30.40.150", + "endIpAddress": "172.30.40.160" + } + ], + "vlanId": "40", + "mtu": "9000", + "teamingPolicy": "loadbalance_loadbased", + "activeUplinks": [ + "uplink1" + ], + "standbyUplinks": [], + "portGroupKey": "DVPG_FOR_VMOTION" + }, + { + "networkType": "VSAN", + "subnet": "172.30.50.0/24", + "gateway": "172.30.50.1", + "subnetMask": null, + "includeIpAddress": null, + "includeIpAddressRanges": [ + { + "startIpAddress": "172.30.50.150", + "endIpAddress": "172.30.50.160" + } + ], + "vlanId": "50", + "mtu": "9000", + "teamingPolicy": "loadbalance_loadbased", + "activeUplinks": [ + "uplink1" + ], + "standbyUplinks": [], + "portGroupKey": "DVPG_FOR_VSAN" + } + ], + "dvsSpecs": [ + { + "dvsName": "sddc1-cl01-vds01", + "networks": [ + "MANAGEMENT", + "VM_MANAGEMENT", + "VMOTION", + "VSAN" + ], + "mtu": "9000", + "nsxtSwitchConfig": { + "transportZones": [ + { + "transportType": "OVERLAY", + "name": "vcf-overlay-TZ" + }, + { + "transportType": "VLAN", + "name": "vcf-vlan-TZ" + } + ], + "hostSwitchOperationalMode": "STANDARD" + }, + "vmnicsToUplinks": [ + { + "uplink": "uplink1", + "id": "vmnic0" + } + ], + "nsxTeamings": [ + { + "standByUplinks": [], + "policy": "LOADBALANCE_SRCID", + "activeUplinks": [ + "uplink1" + ] + } + ], + "lagSpecs": null, + "vmnics": [ + "vmnic0" + ] + } + ] +} \ No newline at end of file diff --git a/json/vcf-fleet-high-availablity-sample.json b/json/vcf-fleet-high-availablity-sample.json new file mode 100644 index 0000000..972b834 --- /dev/null +++ b/json/vcf-fleet-high-availablity-sample.json @@ -0,0 +1,288 @@ +{ + "sddcId": "vcf-m01", + "vcfInstanceName": "VCF 9 - High Avaialblity", + "workflowType": "VCF", + "version": "9.0.1.0", + "ceipEnabled": false, + "fipsEnabled": true, + "skipEsxThumbprintValidation": true, + "skipGatewayPingValidation": true, + "sddcManagerSpec": { + "rootUserCredentials": { + "username": "root", + "password": "VMware1!VMware1!" + }, + "secondUserCredentials": { + "username": "vcf", + "password": "VMware1!VMware1!" + }, + "hostname": "sddcm01", + "useExistingDeployment": true, + "rootPassword": "VMware1!VMware1!", + "sshPassword": "VMware1!VMware1!", + "localUserPassword": "VMware1!VMware1!" + }, + "dnsSpec": { + "nameservers": [ + "192.168.30.29" + ], + "subdomain": "vcf.lab" + }, + "ntpServers": [ + "104.167.215.195" + ], + "vcenterSpec": { + "vcenterHostname": "vc01", + "rootVcenterPassword": "VMware1!VMware1!", + "vmSize": "small", + "storageSize": "", + "adminUserSsoPassword": "VMware1!VMware1!", + "ssoDomain": "vsphere.local", + "useExistingDeployment": false + }, + "hostSpecs": [ + { + "hostname": "esx01", + "credentials": { + "username": "root", + "password": "VMware1!" + } + }, + { + "hostname": "esx02", + "credentials": { + "username": "root", + "password": "VMware1!" + } + }, + { + "hostname": "esx03", + "credentials": { + "username": "root", + "password": "VMware1!" + } + } + ], + "clusterSpec": { + "clusterName": "VCF-Mgmt-Cluster", + "datacenterName": "VCF-Datacenter", + "clusterEvcMode": "", + "clusterImageEnabled": true + }, + "datastoreSpec": { + "vsanSpec": { + "failuresToTolerate": 0, + "vsanDedup": false, + "esaConfig": { + "enabled": true + }, + "datastoreName": "vsanDatastore" + } + }, + "nsxtSpec": { + "nsxtManagerSize": "medium", + "nsxtManagers": [ + { + "hostname": "nsx01a" + }, + { + "hostname": "nsx01b" + }, + { + "hostname": "nsx01c" + } + ], + "vipFqdn": "nsx01", + "useExistingDeployment": false, + "nsxtAdminPassword": "VMware1!VMware1!", + "nsxtAuditPassword": "VMware1!VMware1!", + "rootNsxtManagerPassword": "VMware1!VMware1!", + "skipNsxOverlayOverManagementNetwork": true, + "ipAddressPoolSpec": { + "name": "tep01", + "description": "ESXi Host Overlay TEP IP Pool", + "subnets": [ + { + "cidr": "172.30.60.0/24", + "ipAddressPoolRanges": [ + { + "start": "172.30.60.150", + "end": "172.30.60.160" + } + ], + "gateway": "172.30.60.1" + } + ] + }, + "transportVlanId": "60" + }, + "vcfOperationsSpec": { + "nodes": [ + { + "hostname": "vcf01a", + "rootUserPassword": "VMware1!VMware1!", + "type": "master" + }, + { + "hostname": "vcf01b", + "rootUserPassword": "VMware1!VMware1!", + "type": "replica", + "sslThumbprint": "" + }, + { + "hostname": "vcf01c", + "rootUserPassword": "VMware1!VMware1!", + "type": "data" + } + ], + "adminUserPassword": "VMware1!VMware1!", + "applianceSize": "medium", + "useExistingDeployment": false, + "loadBalancerFqdn": "vcf01" + }, + "vcfOperationsFleetManagementSpec": { + "hostname": "opsfm01", + "rootUserPassword": "VMware1!VMware1!", + "adminUserPassword": "VMware1!VMware1!", + "useExistingDeployment": false + }, + "vcfOperationsCollectorSpec": { + "hostname": "opsproxy01", + "applicationSize": "small", + "rootUserPassword": "VMware1!VMware1!", + "useExistingDeployment": false + }, + "vcfAutomationSpec": { + "hostname": "auto01", + "adminUserPassword": "VMware1!VMware1!", + "ipPool": [ + "172.30.0.31", + "172.30.0.32", + "172.30.0.33", + "172.30.0.34" + ], + "nodePrefix": "auto01", + "internalClusterCidr": "198.18.0.0/15", + "useExistingDeployment": false + }, + "networkSpecs": [ + { + "networkType": "MANAGEMENT", + "subnet": "172.30.0.0/24", + "gateway": "172.30.0.1", + "subnetMask": null, + "includeIpAddress": null, + "includeIpAddressRanges": null, + "vlanId": "30", + "mtu": "1500", + "teamingPolicy": "loadbalance_loadbased", + "activeUplinks": [ + "uplink1" + ], + "standbyUplinks": [], + "portGroupKey": "DVPG_FOR_MANAGEMENT" + }, + { + "networkType": "VM_MANAGEMENT", + "subnet": "172.30.0.0/24", + "gateway": "172.30.0.1", + "subnetMask": null, + "includeIpAddress": null, + "includeIpAddressRanges": null, + "vlanId": "30", + "mtu": "1500", + "teamingPolicy": "loadbalance_loadbased", + "activeUplinks": [ + "uplink1" + ], + "standbyUplinks": [], + "portGroupKey": "DVPG_FOR_VM_MANAGEMENT" + }, + { + "networkType": "VMOTION", + "subnet": "172.30.40.0/24", + "gateway": "172.30.40.1", + "subnetMask": null, + "includeIpAddress": null, + "includeIpAddressRanges": [ + { + "startIpAddress": "172.30.40.150", + "endIpAddress": "172.30.40.160" + } + ], + "vlanId": "40", + "mtu": "9000", + "teamingPolicy": "loadbalance_loadbased", + "activeUplinks": [ + "uplink1" + ], + "standbyUplinks": [], + "portGroupKey": "DVPG_FOR_VMOTION" + }, + { + "networkType": "VSAN", + "subnet": "172.30.50.0/24", + "gateway": "172.30.50.1", + "subnetMask": null, + "includeIpAddress": null, + "includeIpAddressRanges": [ + { + "startIpAddress": "172.30.50.150", + "endIpAddress": "172.30.50.160" + } + ], + "vlanId": "50", + "mtu": "9000", + "teamingPolicy": "loadbalance_loadbased", + "activeUplinks": [ + "uplink1" + ], + "standbyUplinks": [], + "portGroupKey": "DVPG_FOR_VSAN" + } + ], + "dvsSpecs": [ + { + "dvsName": "sddc1-cl01-vds01", + "networks": [ + "MANAGEMENT", + "VM_MANAGEMENT", + "VMOTION", + "VSAN" + ], + "mtu": "9000", + "nsxtSwitchConfig": { + "transportZones": [ + { + "transportType": "OVERLAY", + "name": "vcf-overlay-TZ" + }, + { + "transportType": "VLAN", + "name": "vcf-vlan-TZ" + } + ], + "hostSwitchOperationalMode": "STANDARD" + }, + "vmnicsToUplinks": [ + { + "uplink": "uplink1", + "id": "vmnic0" + } + ], + "nsxTeamings": [ + { + "standByUplinks": [], + "policy": "LOADBALANCE_SRCID", + "activeUplinks": [ + "uplink1" + ] + } + ], + "lagSpecs": null, + "vmnics": [ + "vmnic0" + ] + } + ] +} \ No newline at end of file diff --git a/json/vcf-fleet-simple-sample.json b/json/vcf-fleet-simple-sample.json new file mode 100644 index 0000000..226bd39 --- /dev/null +++ b/json/vcf-fleet-simple-sample.json @@ -0,0 +1,269 @@ +{ + "sddcId": "vcf-m01", + "vcfInstanceName": "VCF 9 - Simple", + "workflowType": "VCF", + "version": "9.0.1.0", + "ceipEnabled": false, + "fipsEnabled": true, + "skipEsxThumbprintValidation": true, + "skipGatewayPingValidation": true, + "sddcManagerSpec": { + "rootUserCredentials": { + "username": "root", + "password": "VMware1!VMware1!" + }, + "secondUserCredentials": { + "username": "vcf", + "password": "VMware1!VMware1!" + }, + "hostname": "sddcm01", + "useExistingDeployment": true, + "rootPassword": "VMware1!VMware1!", + "sshPassword": "VMware1!VMware1!", + "localUserPassword": "VMware1!VMware1!" + }, + "dnsSpec": { + "nameservers": [ + "192.168.30.29" + ], + "subdomain": "vcf.lab" + }, + "ntpServers": [ + "104.167.215.195" + ], + "vcenterSpec": { + "vcenterHostname": "vc01", + "rootVcenterPassword": "VMware1!VMware1!", + "vmSize": "small", + "storageSize": "", + "adminUserSsoPassword": "VMware1!VMware1!", + "ssoDomain": "vsphere.local", + "useExistingDeployment": false + }, + "hostSpecs": [ + { + "hostname": "esx01", + "credentials": { + "username": "root", + "password": "VMware1!" + } + }, + { + "hostname": "esx02", + "credentials": { + "username": "root", + "password": "VMware1!" + } + }, + { + "hostname": "esx03", + "credentials": { + "username": "root", + "password": "VMware1!" + } + } + ], + "clusterSpec": { + "clusterName": "VCF-Mgmt-Cluster", + "datacenterName": "VCF-Datacenter", + "clusterEvcMode": "", + "clusterImageEnabled": true + }, + "datastoreSpec": { + "vsanSpec": { + "failuresToTolerate": 0, + "vsanDedup": false, + "esaConfig": { + "enabled": true + }, + "datastoreName": "vsanDatastore" + } + }, + "nsxtSpec": { + "nsxtManagerSize": "medium", + "nsxtManagers": [ + { + "hostname": "nsx01a" + } + ], + "vipFqdn": "nsx01", + "useExistingDeployment": false, + "nsxtAdminPassword": "VMware1!VMware1!", + "nsxtAuditPassword": "VMware1!VMware1!", + "rootNsxtManagerPassword": "VMware1!VMware1!", + "skipNsxOverlayOverManagementNetwork": true, + "ipAddressPoolSpec": { + "name": "tep01", + "description": "ESXi Host Overlay TEP IP Pool", + "subnets": [ + { + "cidr": "172.30.60.0/24", + "ipAddressPoolRanges": [ + { + "start": "172.30.60.150", + "end": "172.30.60.160" + } + ], + "gateway": "172.30.60.1" + } + ] + }, + "transportVlanId": "60" + }, + "vcfOperationsSpec": { + "nodes": [ + { + "hostname": "vcf01", + "rootUserPassword": "VMware1!VMware1!", + "type": "master" + } + ], + "adminUserPassword": "VMware1!VMware1!", + "applianceSize": "small", + "useExistingDeployment": false, + "loadBalancerFqdn": "" + }, + "vcfOperationsFleetManagementSpec": { + "hostname": "opsfm01", + "rootUserPassword": "VMware1!VMware1!", + "adminUserPassword": "VMware1!VMware1!", + "useExistingDeployment": false + }, + "vcfOperationsCollectorSpec": { + "hostname": "opsproxy01", + "applicationSize": "small", + "rootUserPassword": "VMware1!VMware1!", + "useExistingDeployment": false + }, + "vcfAutomationSpec": { + "hostname": "auto01", + "adminUserPassword": "VMware1!VMware1!", + "ipPool": [ + "172.30.0.31", + "172.30.0.32" + ], + "nodePrefix": "auto01", + "internalClusterCidr": "198.18.0.0/15", + "useExistingDeployment": false + }, + "networkSpecs": [ + { + "networkType": "MANAGEMENT", + "subnet": "172.30.0.0/24", + "gateway": "172.30.0.1", + "subnetMask": null, + "includeIpAddress": null, + "includeIpAddressRanges": null, + "vlanId": "30", + "mtu": "1500", + "teamingPolicy": "loadbalance_loadbased", + "activeUplinks": [ + "uplink1" + ], + "standbyUplinks": [], + "portGroupKey": "DVPG_FOR_MANAGEMENT" + }, + { + "networkType": "VM_MANAGEMENT", + "subnet": "172.30.0.0/24", + "gateway": "172.30.0.1", + "subnetMask": null, + "includeIpAddress": null, + "includeIpAddressRanges": null, + "vlanId": "30", + "mtu": "1500", + "teamingPolicy": "loadbalance_loadbased", + "activeUplinks": [ + "uplink1" + ], + "standbyUplinks": [], + "portGroupKey": "DVPG_FOR_VM_MANAGEMENT" + }, + { + "networkType": "VMOTION", + "subnet": "172.30.40.0/24", + "gateway": "172.30.40.1", + "subnetMask": null, + "includeIpAddress": null, + "includeIpAddressRanges": [ + { + "startIpAddress": "172.30.40.150", + "endIpAddress": "172.30.40.160" + } + ], + "vlanId": "40", + "mtu": "9000", + "teamingPolicy": "loadbalance_loadbased", + "activeUplinks": [ + "uplink1" + ], + "standbyUplinks": [], + "portGroupKey": "DVPG_FOR_VMOTION" + }, + { + "networkType": "VSAN", + "subnet": "172.30.50.0/24", + "gateway": "172.30.50.1", + "subnetMask": null, + "includeIpAddress": null, + "includeIpAddressRanges": [ + { + "startIpAddress": "172.30.50.150", + "endIpAddress": "172.30.50.160" + } + ], + "vlanId": "50", + "mtu": "9000", + "teamingPolicy": "loadbalance_loadbased", + "activeUplinks": [ + "uplink1" + ], + "standbyUplinks": [], + "portGroupKey": "DVPG_FOR_VSAN" + } + ], + "dvsSpecs": [ + { + "dvsName": "sddc1-cl01-vds01", + "networks": [ + "MANAGEMENT", + "VM_MANAGEMENT", + "VMOTION", + "VSAN" + ], + "mtu": "9000", + "nsxtSwitchConfig": { + "transportZones": [ + { + "transportType": "OVERLAY", + "name": "vcf-overlay-TZ" + }, + { + "transportType": "VLAN", + "name": "vcf-vlan-TZ" + } + ], + "hostSwitchOperationalMode": "STANDARD" + }, + "vmnicsToUplinks": [ + { + "uplink": "uplink1", + "id": "vmnic0" + } + ], + "nsxTeamings": [ + { + "standByUplinks": [], + "policy": "LOADBALANCE_SRCID", + "activeUplinks": [ + "uplink1" + ] + } + ], + "lagSpecs": null, + "vmnics": [ + "vmnic0" + ] + } + ] +} \ No newline at end of file From 0ff51f0efedd91cff0b230048adae4220e2e0943 Mon Sep 17 00:00:00 2001 From: William Lam Date: Sat, 25 Oct 2025 13:45:25 -0700 Subject: [PATCH 29/37] VCFA Tenant OIDC IdP Configuration Example --- terraform/vcfa-tenant-example-main.tf | 57 +++++++++++++++++++ .../vcfa-tenant-example-terraform.tfvars | 25 ++++++++ ...tenant-example-william_custom_variables.tf | 39 +++++++++++++ 3 files changed, 121 insertions(+) create mode 100644 terraform/vcfa-tenant-example-main.tf create mode 100644 terraform/vcfa-tenant-example-terraform.tfvars create mode 100644 terraform/vcfa-tenant-example-william_custom_variables.tf diff --git a/terraform/vcfa-tenant-example-main.tf b/terraform/vcfa-tenant-example-main.tf new file mode 100644 index 0000000..983533a --- /dev/null +++ b/terraform/vcfa-tenant-example-main.tf @@ -0,0 +1,57 @@ +terraform { + required_providers { + vcfa = { + source = "vmware/vcfa" + version = "~> 1.0.0" + } + } +} + +# Configure the VMware Cloud Foundation Automation Provider +provider "vcfa" { + user = var.username + password = var.password + auth_type = "integrated" + org = var.org + url = var.url + allow_unverified_ssl = true + logging = true + logging_file = "vcfa.log" +} + +# Fetch VCF Org +data "vcfa_org" "org" { + name = var.org +} + +# Create OIDC IdP Connection +resource "vcfa_org_oidc" "oidc" { + org_id = data.vcfa_org.org.id + enabled = true + prefer_id_token = false + client_id = var.oidc_client_id + client_secret = var.oidc_client_secret + max_clock_skew_seconds = 60 + wellknown_endpoint = var.oidc_client_well_known_url + scopes = var.oidc_client_scopes + claims_mapping { + email = "email" + subject = "email" + last_name = "family_name" + first_name = "given_name" + full_name = "name" + } + ui_button_label = "${var.org} SSO" + /* + key { + id = var.rsa_key1_id + algorithm = "RSA" + certificate = file(var.rsa_key1_filename) + } + key { + id = var.rsa_key2_id + algorithm = "RSA" + certificate = file(var.rsa_key2_filename) + } + */ +} diff --git a/terraform/vcfa-tenant-example-terraform.tfvars b/terraform/vcfa-tenant-example-terraform.tfvars new file mode 100644 index 0000000..409fa32 --- /dev/null +++ b/terraform/vcfa-tenant-example-terraform.tfvars @@ -0,0 +1,25 @@ +url = "https://auto01.vcf.lab" + +username = "admin" +password = "VMware1!VMware1!" +org = "Legal" +region_name = "west" + +storage_class = "vcf-vsan-esa-policy" + +supervisor_zone = "vz-01" + +#### --- Start Custom Variables from William Lam --- #### + +oidc_client_id = "vcfa-legal" +oidc_client_secret = "XXX" +oidc_client_well_known_url = "https://auth.vcf.lab:8443/realms/it/.well-known/openid-configuration" +oidc_client_scopes = ["openid", "profile", "email"] + +/* +rsa_key1_filename = "rsa-key1.pub.pem" +rsa_key1_id = "vKzob1blphOoku-LCMUHQQ0R80NMa3pgxQQF-vDXd5Y" + +rsa_key2_filename = "rsa-key2.pub.pem" +rsa_key2_id = "YPC-UzCfw3ub1icQ4T_40gUOeswNCNGj5pgBue9bo0Q" +*/ \ No newline at end of file diff --git a/terraform/vcfa-tenant-example-william_custom_variables.tf b/terraform/vcfa-tenant-example-william_custom_variables.tf new file mode 100644 index 0000000..2ad1f44 --- /dev/null +++ b/terraform/vcfa-tenant-example-william_custom_variables.tf @@ -0,0 +1,39 @@ +variable "oidc_client_id" { + description = "OIDC Clien ID" + type = string +} + +variable "oidc_client_secret" { + description = "OIDC Client Secret" + type = string +} + +variable "oidc_client_well_known_url" { + description = "OIDC Well Known URL" + type = string +} + +variable "oidc_client_scopes" { + description = "OIDC Scopes" + type = set(string) +} + +variable "rsa_key1_filename" { + description = "Filename of JWKS Public Key 1" + type = string +} + +variable "rsa_key1_id" { + description = "ID of JWKS Public Key 1" + type = string +} + +variable "rsa_key2_filename" { + description = "Filename of JWKS Public Key 2" + type = string +} + +variable "rsa_key2_id" { + description = "ID of JWKS Public Key 2" + type = string +} \ No newline at end of file From 903550f181a8ca024b8ea930ce5e5bf765b339d3 Mon Sep 17 00:00:00 2001 From: William Lam Date: Thu, 30 Oct 2025 06:35:12 -0700 Subject: [PATCH 30/37] List VC 9.x Service Accounts --- .../list_all_vcenter_service_accounts.ps1 | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 powershell/list_all_vcenter_service_accounts.ps1 diff --git a/powershell/list_all_vcenter_service_accounts.ps1 b/powershell/list_all_vcenter_service_accounts.ps1 new file mode 100644 index 0000000..fa4153a --- /dev/null +++ b/powershell/list_all_vcenter_service_accounts.ps1 @@ -0,0 +1,42 @@ +# William Lam +# List all Service Accounts in vCenter Server 9.x + +$vcenterVMName = "vc01" +$vcenterSSOAdminPassword = "VMware1!VMware1!" +$vcenterRootPassword = "VMware1!VMware1!" + +# Extract the vCenter SCA ID +$venterSCAId = (Invoke-VMScript -ScriptText "cat /etc/vmware/install-defaults/sca.hostid" -vm (Get-VM $vcenterVMName) -GuestUser "root" -GuestPassword $vcenterRootPassword).ScriptOutput + +# Retreive vCenter Service Accounts +$results = (Invoke-VMScript -ScriptText "/usr/lib/vmware-vmafd/bin/dir-cli svcaccount list --password ${vcenterSSOAdminPassword}" -vm (Get-VM $vcenterVMName) -GuestUser "root" -GuestPassword $VCSARootPassword).ScriptOutput + +# Split by newlines, remove numbering, and trim +$entries = $results -split "`r?`n" | + ForEach-Object { $_ -replace '^\s*\d+\.\s*', '' } | + Where-Object { $_.Trim() -ne "" } + +$vcenterServiceAccounts = @() +$vcfServiceAccounts = @() +$otherAccounts = @() + +foreach ($entry in $entries) { + if ($entry -match $venterSCAId) { + $vcenterServiceAccounts += $entry + } + elseif ($entry -match '^svc-') { + $vcfServiceAccounts += $entry + } + else { + $otherAccounts += $entry + } +} + +Write-Host "`nVCF Service Accounts:" +$vcfServiceAccounts + +Write-Host "`nOther vCenter Service Accounts:" +$otherAccounts + +Write-Host "`nvCenter Service Accounts ($venterSCAId):" +$vcenterServiceAccounts \ No newline at end of file From f21a8f45ad4723caa4d309d71a069cbaf36fe2e3 Mon Sep 17 00:00:00 2001 From: William Lam Date: Sun, 2 Nov 2025 16:56:21 -0800 Subject: [PATCH 31/37] Retrieve vSAN clusterPowerOffPrecheck perspective results --- .../VsanClusterShutdownPrecheckResults.ps1 | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 powershell/VsanClusterShutdownPrecheckResults.ps1 diff --git a/powershell/VsanClusterShutdownPrecheckResults.ps1 b/powershell/VsanClusterShutdownPrecheckResults.ps1 new file mode 100644 index 0000000..171907f --- /dev/null +++ b/powershell/VsanClusterShutdownPrecheckResults.ps1 @@ -0,0 +1,43 @@ +Function Get-VsanClusterShutdownPrecheckResults { +<# + .NOTES + =========================================================================== + Created by: William Lam + Blog: www.williamlam.com + =========================================================================== + .DESCRIPTION + This function demonstrates the use of vSAN Management API to retrieve + the "clusterPowerOffPrecheck" Perspective results + .PARAMETER Cluster + The name of a vSAN Cluster + .EXAMPLE + Get-VsanClusterShutdownPrecheckResults -Cluster VCF-Mgmt-Cluster +#> + param( + [Parameter(Mandatory=$true)][String]$Cluster + ) + $vchs = Get-VSANView -Id "VsanVcClusterHealthSystem-vsan-cluster-health-system" + $cluster_view = (Get-Cluster -Name $Cluster).ExtensionData.MoRef + $results = $vchs.VsanQueryVcClusterHealthSummary($cluster_view,$null,$null,$false,$null,$null,'clusterPowerOffPrecheck',$null,$null) + $shutdownGroupTests = $results.Groups | where {$_.GroupId -eq "com.vmware.vsan.health.test.clusterpower"} + + $vmsNotShutdown = @() + if($shutdownGroupTests.GroupHealth -eq "red") { + $shutdownGroupTest = $shutdownGroupTests.GroupTests | where {$_.TestId -eq "com.vmware.vsan.health.test.allvmsshutdown"} + if($shutdownGroupTest.TestHealth -eq "red") { + $testDetailValues = $shutdownGroupTest.TestDetails.Rows.Values + foreach ($testDetailValue in $testDetailValues) { + $vmMoref = $testDetailValue.replace("mor:ManagedObjectReference:VirtualMachine:","") + + $vm = New-Object VMware.Vim.ManagedObjectReference + $vm.Type = "VirtualMachine" + $vm.Value = $vmMoref + + $vmsNotShutdown += (Get-View $vm).Name + } + } + } + Write-Host + $vmsNotShutdown | Sort-Object + Write-Host +} \ No newline at end of file From 06b679c66905485eaf621dc67a43e80d3347c71a Mon Sep 17 00:00:00 2001 From: William Lam Date: Wed, 5 Nov 2025 17:36:53 -0800 Subject: [PATCH 32/37] Retrieve Kasa Smart Plug Power Metrics --- python/kasa_power_monitor.py | 415 +++++++++++++++++++++++++++++++++++ 1 file changed, 415 insertions(+) create mode 100644 python/kasa_power_monitor.py diff --git a/python/kasa_power_monitor.py b/python/kasa_power_monitor.py new file mode 100644 index 0000000..256ed21 --- /dev/null +++ b/python/kasa_power_monitor.py @@ -0,0 +1,415 @@ +# Author: William Lam prompting Google Gemini +# Description: Simple HTTP endpoint for serving metrics from Kasa Smart Plug using python-kasa library +# http://ip:8080/power for JSON output +# http://ip:8080/power?output=ui for HTML output + +import asyncio +import os +from http import HTTPStatus +from typing import Dict, Any, Optional +import warnings +from datetime import datetime +import pytz +from kasa import Discover +from kasa.iot import IotDevice +from dotenv import load_dotenv +import json +from urllib.parse import urlparse, parse_qs + +# --- GLOBAL STATE & CONFIGURATION --- +current_power_data: Dict[str, Any] = { + "alias": "Unknown", + "power_mw": 0, + "voltage_mv": 0, + "current_ma": 0, + "total_kwh": 0, + "last_updated": "Never", + "status": "Initializing..." +} + +# --- KASA DEVICE INITIALIZATION --- + +async def initialize_device(ip: str, username: str, password: str) -> Optional[IotDevice]: + """ + Attempts to discover and perform an initial update on the Kasa device. + Returns the initialized IotDevice object or None on critical failure. + """ + global current_power_data + + print(f"Starting Kasa device discovery at {ip}...") + + # 1. Initial device creation attempt, passing username and password directly + try: + device = await Discover.discover_single(ip, username=username, password=password) + except Exception as e: + current_power_data['status'] = f"FATAL ERROR: Failed to create device object: {e.__class__.__name__}. Check credentials, IP, or network." + print(f"FATAL ERROR: Could not create device object: {e}") + return None + + # 2. Check if discovery was successful + if device is None: + current_power_data['status'] = "FATAL ERROR: Device not found or connection/authentication failed. Check IP, Credentials, and Local Control status." + print("\n" + "="*50) + print("❌ DEVICE DISCOVERY FAILED") + print(f"IP Target: {ip}") + print("ACTION: Ensure KASA_DEVICE_IP is correct, and Local Control is enabled in the Kasa App.") + print("Also double-check KASA_USERNAME/KASA_PASSWORD.") + print("="*50 + "\n") + return None + + # 3. Force an update immediately after discovery to fully populate alias and state + try: + await device.update() + except Exception as e: + current_power_data['status'] = f"FATAL ERROR: Device found but failed initial update: {e.__class__.__name__}" + print(f"FATAL ERROR: Device found but failed initial update: {e}") + return None + + # Log successful discovery and device properties + print("\n" + "="*50) + print("✅ DEVICE DISCOVERY SUCCESSFUL") + print(f"Device Alias: {device.alias}") + print(f"Device Model: {device.model}") + print(f"Supports Energy Monitoring: Confirmed (KP125M)") + print("="*50 + "\n") + + return device + + +# --- KASA DEVICE POLLING LOGIC --- + +async def kasa_poller(device: IotDevice, ip: str, poll_interval: int, quiet_mode: bool, timezone_name: str): + """ + Updates its status and retrieves power data in a continuous loop, + using robust fallback logic to handle library/firmware inconsistencies. + This function assumes the device has already been successfully initialized. + """ + global current_power_data + + print(f"Kasa poller started for '{device.alias}' at {ip}.") + + # Pre-cache timezone object + try: + local_tz = pytz.timezone(timezone_name) + except pytz.UnknownTimeZoneError: + print(f"WARNING: Unknown timezone '{timezone_name}'. Defaulting to UTC.") + local_tz = pytz.utc + + while True: + try: + # Update the device status (state, voltage, etc.) + await device.update() + + # --- FETCH ONLY THE REQUESTED PROPERTIES USING ROBUST FALLBACK --- + + # Initialize with default values in case of partial error + emeter_info = {} + total_kwh = 0.0 + + try: + # MODERN APPROACH: Use the Energy module (preferred, non-deprecated) + emeter_info = await device.modules.Energy.get_realtime() + total_kwh = device.modules.Energy.total_kwh + except AttributeError: + # FALLBACK APPROACH: Use the deprecated method if the Energy module is not loaded + + # Locally suppress ALL DeprecationWarnings within this specific fallback block + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=DeprecationWarning) + emeter_info = await device.get_emeter_realtime() + + # Try to get total_kwh from the deprecated property, default to 0.0 if missing + try: + total_kwh = device.total_kwh + except AttributeError: + total_kwh = 0.0 + + if not quiet_mode: + # Changed from WARNING to INFO + print("INFO: Falling back to deprecated get_emeter_realtime() and total_kwh property.") + + + # --- TIMEZONE CONVERSION AND FORMATTING (FIXED) --- + # Get the current time localized directly to the configured timezone + updated_time_tz_aware = datetime.now(local_tz) + + # Format the time string in 12-hour format + updated_time_str = updated_time_tz_aware.strftime("%Y-%m-%d %I:%M:%S %p %Z") + + + # --- UPDATE GLOBAL STATE --- + if not device.is_on: + current_power_data = { + "alias": device.alias, + "status": "Device is OFF.", + "power_mw": 0, + "voltage_mv": emeter_info.get("voltage_mv", 0), + "current_ma": 0, + "total_kwh": total_kwh, + "last_updated": updated_time_str # Use formatted string here + } + if not quiet_mode: + # Conditionally print status updates + print(f"Device Alias: {device.alias}") + print(f"Device at {ip} is OFF. Power: 0W. Next check in {poll_interval}s.") + + else: + # Update global state with the fetched metrics + current_power_data = { + "alias": device.alias, + "status": "Device is ON.", + "power_mw": emeter_info.get("power_mw", 0), + "voltage_mv": emeter_info.get("voltage_mv", 0), + "current_ma": emeter_info.get("current_ma", 0), + "total_kwh": total_kwh, + "last_updated": updated_time_str # Use formatted string here + } + + # Print a clean update for the console + power_w = current_power_data["power_mw"] / 1000.0 + if not quiet_mode: + # Conditionally print status updates + print(f"Device Alias: {device.alias}") + print(f"✅ Polled {device.alias} ({ip}). Power: {power_w:.2f} W.") + + except Exception as e: + # Error handling also uses the absolute time now + # Time is localized directly to the configured timezone for error logging + updated_time_tz_aware = datetime.now(local_tz) + error_time_str = updated_time_tz_aware.strftime("%Y-%m-%d %I:%M:%S %p %Z") + + current_power_data = { + "alias": device.alias if 'device' in locals() else "Unknown", + "status": f"ERROR: Could not fetch data from device: {e.__class__.__name__}", + "power_mw": 0, "voltage_mv": 0, "current_ma": 0, "total_kwh": 0, + "last_updated": error_time_str + } + # Errors are always printed regardless of quiet mode + print(f"❌ Kasa Polling Error: {e}") + + # Wait for the next poll interval + await asyncio.sleep(poll_interval) + + +# --- HTTP SERVER LOGIC --- + +async def handle_http_request(reader, writer): + """ + Handles incoming TCP connections, parses simple HTTP GET requests, + and serves the latest power data in JSON (default) or HTML (via ?output=ui) format. + """ + global current_power_data + + addr = writer.get_extra_info('peername') + + # Read the request line + request_line = await reader.readline() + if not request_line: + writer.close() + await writer.wait_closed() + return + + # Parse request line + try: + method, full_path, _ = request_line.decode().strip().split() + except ValueError: + # Malformed request + writer.close() + await writer.wait_closed() + return + + # Parse the URL and query parameters + parsed_url = urlparse(full_path) + path = parsed_url.path + query_params = parse_qs(parsed_url.query) + + response = b"" + + if method == "GET" and path == "/power": + # Prepare the core data structure (used for both HTML and JSON) + response_data = { + "device_status": current_power_data['status'], + "device_alias": current_power_data['alias'], + # Convert millivolts/milliwatts to standard units for output + "current_power_watts": current_power_data['power_mw'] / 1000.0, + "current_voltage_volts": current_power_data['voltage_mv'] / 1000.0, + "current_amps": current_power_data['current_ma'] / 1000.0, + "total_kwh": current_power_data['total_kwh'], + "last_updated_ts": current_power_data['last_updated'], + "unit": "W", + "polling_interval_seconds": int(os.environ.get('KASA_POLL_INTERVAL', 15)) + } + + # Check if the user explicitly requested the HTML UI (?output=ui) + if query_params.get('output') == ['ui']: + # --- HTML RESPONSE (?output=ui) --- + + # Simple HTML response for better browser viewing + body = f""" + + + + + + Kasa Power Monitor + + + +
    +

    Kasa Power Monitor

    + +

    Device Alias: {response_data['device_alias']}

    +

    Status: {current_power_data['status']}

    +

    Current Power: {response_data['current_power_watts']:.2f} W

    +

    Current Voltage: {response_data['current_voltage_volts']:.2f} V

    +

    Current Amperage: {response_data['current_amps']:.2f} A

    +

    Total kWh Used: {response_data['total_kwh']:.4f} kWh

    +

    Last Updated: {response_data['last_updated_ts']}

    +

    Data is refreshed every {response_data['polling_interval_seconds']} seconds.

    +
    + + + """.encode('utf-8') + + # Construct HTTP response headers + headers = [ + 'HTTP/1.1 200 OK', + f'Content-Type: text/html; charset=utf-8', + f'Content-Length: {len(body)}', + 'Connection: close', + '\r\n' + ] + response = '\r\n'.join(headers).encode('utf-8') + body + + else: + # --- JSON RESPONSE (Default) --- + body = json.dumps(response_data, indent=4).encode('utf-8') + + headers = [ + 'HTTP/1.1 200 OK', + f'Content-Type: application/json; charset=utf-8', + f'Content-Length: {len(body)}', + 'Connection: close', + '\r\n' + ] + response = '\r\n'.join(headers).encode('utf-8') + body + + else: + # 404 Not Found for any other path + status_line = f"HTTP/1.1 {HTTPStatus.NOT_FOUND.value} {HTTPStatus.NOT_FOUND.phrase}\r\n" + body = b"Not Found. Access /power path for JSON or /power?output=ui for HTML." + response = status_line.encode() + b"Content-Length: " + str(len(body)).encode() + b"\r\n\r\n" + body + + writer.write(response) + await writer.drain() + writer.close() + await writer.wait_closed() + + +# --- MAIN ENTRY POINT --- + +async def main(): + # 1. Load environment variables + env_path = 'kasa.env' + if not os.path.exists(env_path): + print(f"FATAL ERROR: Configuration file not found: {env_path}") + print("Please ensure 'kasa.env' is in the same directory as the script.") + return + + load_dotenv(dotenv_path=env_path) + + # 2. Get configuration variables + try: + kasa_ip = os.environ['KASA_DEVICE_IP'] + kasa_username = os.environ['KASA_USERNAME'] + kasa_password = os.environ['KASA_PASSWORD'] + kasa_timezone = os.environ.get('KASA_TIMEZONE', 'UTC') + + server_port = int(os.environ.get('SERVER_PORT', 8080)) + poll_interval = int(os.environ.get('KASA_POLL_INTERVAL', 15)) + quiet_mode = os.environ.get('KASA_QUIET_MODE', 'False').lower() == 'true' + except KeyError as e: + print(f"FATAL ERROR: Missing required environment variable {e}. Check {env_path}.") + print("Ensure KASA_DEVICE_IP, KASA_USERNAME, and KASA_PASSWORD are set.") + return + + # 3. CRITICAL: Discover and Initialize Device BEFORE starting the server + initialized_device = await initialize_device(kasa_ip, kasa_username, kasa_password) + + if initialized_device is None: + # Initialization failed, exit gracefully + print("Initialization failed. Cannot start monitoring server.") + return + + # 4. Start the background Kasa polling task + polling_task = asyncio.create_task( + kasa_poller(initialized_device, kasa_ip, poll_interval, quiet_mode, kasa_timezone) + ) + + # 5. Start the HTTP server + server = await asyncio.start_server( + handle_http_request, '0.0.0.0', server_port + ) + + addr = server.sockets[0].getsockname() + print(f"\n--- HTTP Server is running ---") + print(f"Access JSON data (Default) at http://127.0.0.1:{addr[1]}/power") + print(f"Access HTML UI (Optional) at http://127.0.0.1:{addr[1]}/power?output=ui") + print(f"Serving on: {addr}") + print("------------------------------\n") + + # 6. Run until terminated + async with server: + await asyncio.gather(server.serve_forever(), polling_task) + +if __name__ == "__main__": + try: + # Set a default event loop policy for Windows compatibility, but safe on Linux too + if os.name == 'nt': + asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) + + asyncio.run(main()) + except KeyboardInterrupt: + print("\nApplication shutting down gracefully.") + except Exception as e: + print(f"\nAn unexpected error occurred: {e}") From e032489f05bef492e7a4c1e6e4864a36bfb6a6d2 Mon Sep 17 00:00:00 2001 From: William Lam Date: Sat, 22 Nov 2025 08:07:40 -0800 Subject: [PATCH 33/37] Updated Custom ESXi ISO Script for 9.x --- powershell/create_custom_esxi_iso.ps1 | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/powershell/create_custom_esxi_iso.ps1 b/powershell/create_custom_esxi_iso.ps1 index 4003b20..a8dc0aa 100644 --- a/powershell/create_custom_esxi_iso.ps1 +++ b/powershell/create_custom_esxi_iso.ps1 @@ -1,23 +1,19 @@ # Author: William Lam # Website: www.williamlam.com -# Path to ESXi Base Offline Image -$ESXIBaseImagePath = "C:\Users\william\Desktop\custom-esxi-image\VMware-ESXi-7.0U3c-19193900-depot.zip" +# ESXi Offline Depot +$ESXIBaseImagePath = "VMware-ESXi-9.0.1.0.24957456-depot.zip" -# List of ESXi Offline Bundle Paths -$ESXIDriverPaths = @( -"C:\Users\william\Desktop\custom-esxi-image\Net-Community-Driver_1.2.2.0-1vmw.700.1.0.15843807_18835109.zip", -"C:\Users\william\Desktop\custom-esxi-image\nvme-community-driver_1.0.1.0-3vmw.700.1.0.15843807-component-18902434.zip" -) +# List of ESXi Offline Bundle Drivers +$ESXIDriverPaths = @("VMware-Re-Driver_1.101.01-5vmw.800.1.0.20613240.zip") -$ESXICustomIsoSpec = "C:\Users\william\Desktop\custom-esxi-image\spec.json" - -$ESXICustomIsoPath = "C:\Users\william\Desktop\custom-esxi-image\custom.iso" +$ESXICustomIsoSpec = "esx-9.0.1.0-realtek.spec" +$ESXICustomIsoPath = "esx-9.0.1.0-realtek.iso" ##### DO NOT EDIT BEYOND HERE ##### -if($PSVersionTable.PSEdition -ne "Desktop") { - Write-Error "This script is only supported with PowerShell on Windows`n" +if((Get-PowerCLIVersion).Major -lt "9") { + Write-Error "This script requires VCF.PowerCLI 9.x or greater`n" exit } @@ -48,4 +44,4 @@ $ESXICustomIsoPath = '"' + $ESXICustomIsoPath + '"' # Create New Custom ISO Write-Host -Foreground green "`nCreating Custom ESXi ISO and saving to ${ESXICustomIsoPath} ...`n" -Invoke-Expression "New-IsoImage -Depots $ESXIDepots -SoftwareSpec $ESXICustomIsoSpec -Destination $ESXICustomIsoPath" +Invoke-Expression "New-IsoImage -Depots $ESXIDepots -SoftwareSpec $ESXICustomIsoSpec -Destination $ESXICustomIsoPath" \ No newline at end of file From 222aa7b4c7d6f4246c5bead236d23b4400ad1ca7 Mon Sep 17 00:00:00 2001 From: William Lam Date: Wed, 3 Dec 2025 15:59:19 -0800 Subject: [PATCH 34/37] VCF Import Validation Pre-Check Reporting --- powershell/VCFImportFunctions.ps1 | 304 ++++++++++++++++++++++++++++++ 1 file changed, 304 insertions(+) create mode 100644 powershell/VCFImportFunctions.ps1 diff --git a/powershell/VCFImportFunctions.ps1 b/powershell/VCFImportFunctions.ps1 new file mode 100644 index 0000000..8b0a678 --- /dev/null +++ b/powershell/VCFImportFunctions.ps1 @@ -0,0 +1,304 @@ +# Author: William Lam +# Description: Set of functions to initiate and retrieve VCF Brownfield Import Validation + +Function Get-SSLThumbprint256 { + param( + [Parameter( + Position=0, + Mandatory=$true, + ValueFromPipeline=$true, + ValueFromPipelineByPropertyName=$true + )] + [Alias('FullName')] + [String]$URL + ) + + # Convert the FQDN/URL to a useable hostname (strips scheme/path) + try { + $Uri = [System.Uri]$URL + } + catch { + Write-Error "Invalid URL provided: $($URL)" + return + } + + $Hostname = $Uri.Host + # Use 443 if no port is explicitly specified + $Port = if ($Uri.Port -eq -1) { 443 } else { $Uri.Port } + + # 1. Define the Validation Callback + # This delegate tells the SslStream to always accept the certificate, + # bypassing name mismatch and chain errors. + $ValidationCallback = { + param( + [System.Object]$sender, + [System.Security.Cryptography.X509Certificates.X509Certificate]$certificate, + [System.Security.Cryptography.X509Certificates.X509Chain]$chain, + [System.Net.Security.SslPolicyErrors]$sslPolicyErrors + ) + # Always return $true to accept any certificate + $true + } + + # 2. Establish a TCP connection + $TcpClient = New-Object System.Net.Sockets.TcpClient + try { + $TcpClient.Connect($Hostname, $Port) + } + catch { + Write-Error "Could not connect to $($Hostname):$($Port). Error: $($_.Exception.Message)" + $TcpClient.Dispose() + return + } + + # 3. Establish the SSL stream using the validation callback + # The correct constructor requires the NetworkStream, the leaveInnerStreamOpen boolean ($false), + # and the validation callback delegate. + $SslStream = New-Object System.Net.Security.SslStream($TcpClient.GetStream(), $false, $ValidationCallback) + + try { + # Perform the SSL handshake, passing the FQDN for SNI + $SslStream.AuthenticateAsClient($Hostname) + } + catch { + Write-Error "SSL handshake failed for $($Hostname). Error: $($_.Exception.Message)" + $SslStream.Dispose() + $TcpClient.Dispose() + return + } + + # 4. Retrieve the certificate object + $Certificate = $SslStream.RemoteCertificate + + # Clean up the streams/connections + $SslStream.Dispose() + $TcpClient.Dispose() + + if (-not $Certificate) { + Write-Error "Failed to retrieve RemoteCertificate from the SSL stream." + return + } + + # 5. Calculate the SHA256 hash (Thumbprint) + $CertHashBytes = $Certificate.GetCertHash([System.Security.Cryptography.HashAlgorithmName]::SHA256) + + # 6. Format the output + $SSL_THUMBPRINT = [System.BitConverter]::ToString($CertHashBytes).Replace('-', '') + + # Add colons back for the traditional Thumbprint format + return $SSL_THUMBPRINT -replace '(..(?!$))','$1:' +} + +Function Get-VCFSDDCmToken { + param( + [Parameter(Mandatory=$true)]$SddcManagerFQDN, + [Parameter(Mandatory=$true)]$VCSASSOUsername, + [Parameter(Mandatory=$true)]$VCSASSOPassword + ) + + $payload = @{ + "username" = $VCSASSOUsername + "password" = $VCSASSOPassword + } + + $body = $payload | ConvertTo-Json + + try { + $requests = Invoke-WebRequest -Uri "https://${SddcManagerFQDN}/v1/tokens" -Method POST -SkipCertificateCheck -Headers @{"Content-Type"="application/json";"Accept"="application/json"} -Body $body + + if($requests.StatusCode -eq 200) { + $accessToken = ($requests.Content | ConvertFrom-Json).accessToken + } + } catch { + Write-Error "Unable to retrieve SDDC Manager Token ..." + $requests + exit + } + + $headers = @{ + "Content-Type"="application/json" + "Accept"="application/json" + "Authorization"="Bearer ${accessToken}" + } + + return $headers +} + +Function New-VCFImportValidation { + param( + [Parameter(Mandatory=$true)]$VCSAFQDN, + [Parameter(Mandatory=$true)]$SddcManagerFQDN, + [Parameter(Mandatory=$true)]$VCSASSOUsername, + [Parameter(Mandatory=$true)]$VCSASSOPassword, + [Parameter(Mandatory=$true)]$VCSARootPassword + ) + + $headers = Get-VCFSDDCmToken -SddcManagerFQDN $SddcManagerFQDN -VCSASSOUsername $VCSASSOUsername -VCSASSOPassword $VCSASSOPassword + + $VCSAThumbprint = Get-SSLThumbprint256 -URL "https://${VCSAFQDN}" + + $payload = @{ + "vcenterAddress" = $VCSAFQDN + "vcenterSslThumbprint" = $VCSAThumbprint + "vcenterSsoUsername" = $VCSASSOUsername + "vcenterSsoPassword" = $VCSASSOPassword + "vcenterRootSshPassword" = $VCSARootPassword + } + + $body = $payload | ConvertTo-Json + + try { + $requests = Invoke-WebRequest -Uri "https://${SddcManagerFQDN}/v1/sddcs/imports/validations" -Method POST -SkipCertificateCheck -Headers $headers -Body $body + + if($requests.StatusCode -eq 202) { + ($requests.Content | ConvertFrom-Json) | Select taskId, status + } + } catch { + Write-Error "Unable to begin VCF Import Validation ..." + exit + } +} + +Function Get-ValidationResultsTable { + param( + [Parameter(Mandatory=$true)] + [PSObject[]]$Errors, + + # Optional filter parameter + [String]$FilterStatus = $null + ) + + # Define the statuses that should be included in the output + $AllowedStatuses = @('VALIDATION_SUCCESSFUL', 'VALIDATION_FAILED') + + # Validation Check for FilterStatus (allows $null or "") + if ($FilterStatus -ne $null -and $FilterStatus -ne "") { + if ($FilterStatus -notin $AllowedStatuses) { + Write-Error "Invalid value '$FilterStatus' provided for FilterStatus. Must be 'VALIDATION_SUCCESSFUL' or 'VALIDATION_FAILED'." + return + } + } + + # If FilterStatus is "" or $null, treat it as no filter. + $EffectiveFilter = if ($FilterStatus -eq "") { $null } else { $FilterStatus } + + $Results = @() + + foreach ($Error in $Errors) { + + # 1. Check for nested errors and recurse + if ($Error.PSObject.Properties.Name -contains "nestedErrors" -and $Error.nestedErrors) { + + # Recurse: Call the function again with the nested array, passing the filter down + $Results += Get-ValidationResultsTable -Errors $Error.nestedErrors -FilterStatus $EffectiveFilter + + } + # 2. Base Case: No nestedErrors found, and a message exists. + elseif ($Error.PSObject.Properties.Name -contains "message" -and $Error.message) { + + $CurrentStatus = $null + $CurrentImportance = "N/A" # Initialize importance level + $CurrentRemediation = "N/A" # Initialize remediation message + + # --- Status and Importance Extraction (from CONTEXT) --- + if ($Error.PSObject.Properties.Name -contains "context") { + $ContextObject = $Error.context + + # Check for context object type + if ($ContextObject -is [System.Management.Automation.PSCustomObject] -or $ContextObject -is [System.Collections.Hashtable]) { + + # Extract validationStatus + if ($ContextObject.PSObject.Properties.Name -contains "validationStatus" -and $ContextObject.validationStatus) { + $ExtractedStatus = $ContextObject.validationStatus + } + + # Extract importanceLevel + if ($ContextObject.PSObject.Properties.Name -contains "importanceLevel" -and $ContextObject.importanceLevel) { + $CurrentImportance = $ContextObject.importanceLevel + } + } + # Handle cases where context might be a plain object + elseif ($ContextObject) { + if ($ContextObject.validationStatus) { + $ExtractedStatus = $ContextObject.validationStatus + } + if ($ContextObject.importanceLevel) { + $CurrentImportance = $ContextObject.importanceLevel + } + } + } + # --- Remediation Message Extraction (from $ERROR object) --- + if ($Error.PSObject.Properties.Name -contains "remediationMessage" -and $Error.remediationMessage) { + $CurrentRemediation = $Error.remediationMessage + } + # ----------------------------------------------------------- + + # 3. Apply the Status Inclusion Filter + if ($ExtractedStatus -in $AllowedStatuses) { + $CurrentStatus = $ExtractedStatus + } + + # 4. Create output object ONLY if the status was allowed AND it matches the effective filter. + if ($CurrentStatus) { + + # Apply filter logic: If no filter is set, or if the status matches the filter + if (-not $EffectiveFilter -or ($CurrentStatus -ceq $EffectiveFilter)) { + + # Create the structured object with all four properties + $Results += [PSCustomObject]@{ + Message = $Error.message + Status = $CurrentStatus + ImportanceLevel = $CurrentImportance + RemediationMessage = $CurrentRemediation # Extracted from the main error object + } + } + } + } + } + + # Return the collected results + return $Results +} + +Function Get-VCFImportValidation { + param( + [Parameter(Mandatory=$true)]$VCSAFQDN, + [Parameter(Mandatory=$true)]$SddcManagerFQDN, + [Parameter(Mandatory=$true)]$VCSASSOUsername, + [Parameter(Mandatory=$true)]$VCSASSOPassword, + [Parameter(Mandatory=$true)]$VCSARootPassword, + [Parameter(Mandatory=$true)]$TaskId, + [Parameter(Mandatory=$false)]$FailedValidationsOnly=$true + ) + + $headers = Get-VCFSDDCmToken -SddcManagerFQDN $SddcManagerFQDN -VCSASSOUsername $VCSASSOUsername -VCSASSOPassword $VCSASSOPassword + + try { + $requests = Invoke-WebRequest -Uri "https://${SddcManagerFQDN}/v1/sddcs/imports/validations/${TaskId}" -Method GET -SkipCertificateCheck -Headers $headers + + if($requests.StatusCode -eq 200) { + $response = $requests.Content | ConvertFrom-Json + + if($response.status -eq "SUCCESS") { + $validations = $response.validationResult + + if($FailedValidationsOnly) { + return (Get-ValidationResultsTable -Errors $validations -FilterStatus 'VALIDATION_FAILED') | select Status,ImportanceLevel,RemediationMessage,Message | Sort-Object -Property Status + } else { + return (Get-ValidationResultsTable -Errors $validations) | select Status,ImportanceLevel,RemediationMessage,Message | Sort-Object -Property Status + } + } elseif($response.status -eq "IN_PROGRESS") { + Write-Host "VCF Import Validation is still running, please check back in a few minutes" + } else { + Write-Error "VCF Import Validation Task ID is either invalid or failed" + $response + } + } + } catch { + Write-Error "Unable to retrieve VCF Import Validation Results ..." + exit + } +} + + + From a3fd3680edf2c38c98d50a7662f5648677b9d723 Mon Sep 17 00:00:00 2001 From: William Lam Date: Sat, 6 Dec 2025 07:38:10 -0800 Subject: [PATCH 35/37] Retrieve VCF Operations 9.x Objects & Metrics Collection --- ...get-vcf-operations-objects-and-metrics.ps1 | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 powershell/get-vcf-operations-objects-and-metrics.ps1 diff --git a/powershell/get-vcf-operations-objects-and-metrics.ps1 b/powershell/get-vcf-operations-objects-and-metrics.ps1 new file mode 100644 index 0000000..29bdb39 --- /dev/null +++ b/powershell/get-vcf-operations-objects-and-metrics.ps1 @@ -0,0 +1,62 @@ +#!/bin/bash -e +# Author: William Lam +# Website: williamlam.com +# Description: Retrieve Objects/Metrics Stats from VCF Operations 9.0 + +$VCF_OPERATIONS_HOSTNAME="vcf01.vcf.lab" +$VCF_OPERATIONS_USERNAME="admin" +$VCF_OPERATIONS_PASSWORD='VMware1!VMware1!' + + +$payload = @{ + "username" = $VCF_OPERATIONS_USERNAME + "password" = $VCF_OPERATIONS_PASSWORD + "authSource" = "local" +} + +$body = $payload | ConvertTo-Json + +$requests = Invoke-WebRequest -Uri "https://${VCF_OPERATIONS_HOSTNAME}/suite-api/api/auth/token/acquire" -Method POST -Headers @{"Content-Type" = "application/json";"Accept" = "application/json"} -Body $body -SkipCertificateCheck + +$VCF_OPERATIONS_AUTH_TOKEN=$(($requests.Content | ConvertFrom-Json).token) + +$headers = @{ + "Content-Type" = "application/json" + "Accept" = "application/json" + "Authorization" = "OpsToken ${VCF_OPERATIONS_AUTH_TOKEN}" +} + +$requests = Invoke-WebRequest -Uri "https://${VCF_OPERATIONS_HOSTNAME}/suite-api/api/adapters" -Method GET -Headers $headers -SkipCertificateCheck + +$adapterResults = ($requests.content | ConvertFrom-Json).adapterInstancesInfoDto + +$results = @() +foreach($adapterResult in $adapterResults) { + if($adapterResult.numberOfResourcesCollected -eq $null) { + $objectCount = 0 + } else { + $objectCount = $adapterResult.numberOfResourcesCollected + } + + if($adapterResult.numberOfMetricsCollected -eq $null) { + $metricCount = 0 + } else { + $metricCount = $adapterResult.numberOfMetricsCollected + } + + $tmp = [pscustomobject][ordered]@{ + Adapter = $adapterResult.resourceKey.name + Objects = $objectCount + Metrics = $metricCount + } + $results+=$tmp +} + +$results | Sort-Object -Property Adapter | FT + +Write-Host "Total Number of Objects: $(($results.Objects | Measure-Object -Sum).Sum)" + +Write-Host "Total Number of Metrics: $(($results.Metrics | Measure-Object -Sum).Sum)" + +Write-Host + From 40ccc7405877e13baca411178f7d8a58de771157 Mon Sep 17 00:00:00 2001 From: William Lam Date: Wed, 31 Dec 2025 13:08:49 -0800 Subject: [PATCH 36/37] Programmatically access Broadcom Product Lifecycle --- powershell/BroadcomProductLifecycle.ps1 | 124 ++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 powershell/BroadcomProductLifecycle.ps1 diff --git a/powershell/BroadcomProductLifecycle.ps1 b/powershell/BroadcomProductLifecycle.ps1 new file mode 100644 index 0000000..29602d2 --- /dev/null +++ b/powershell/BroadcomProductLifecycle.ps1 @@ -0,0 +1,124 @@ +Function Get-BroadcomProductLifecycle { + <# + .NOTES + =========================================================================== + Created by: William Lam + Organization: Broadcom + Blog: http://www.williamlam.com + Twitter: @lamw + =========================================================================== + .SYNOPSIS + Retrieves information from the Broadcom Product Support Lifecycle Portal + .DESCRIPTION + This cmdlet retrieves information from the Broadcom Product Support Lifecycle Portal + .PARAMETER Division + The Broadcom Software Division to filter the product support lifecycle + .PARAMETER SecretId + The Broadcom software Product to filter the product support lifecycle + .PARAMETER Support + The default support period to filter product support lifecycle + + .EXAMPLE + $results = Get-BroadcomProductLifecycle -Division VCF -Product "VMware Cloud Foundation" + $results | ft + + .EXAMPLE + $results = Get-BroadcomProductLifecycle -Division VCF -Product "VMware Cloud Foundation" -Support 'EOS in 12 months' + $results | ft + + .EXAMPLE + $results = Get-BroadcomProductLifecycle -Division VCF -Product "VMware Cloud Foundation" -Support 'EOL in 6 months' + $results | ft + #> + [CmdletBinding()] + param( + [Parameter(Mandatory=$true, Position=0)] + [ValidateSet("Mainframe", "Enterprise", "Cyber Security", "Payment Security", "Tanzu", "VCF", "ANS")] + [string]$Division, + + [Parameter(Mandatory=$true, Position=1)] + [ArgumentCompleter({ + param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters) + + # Master Data Dictionary (Mapping to the Friendly Names) + $ProductData = @{ + "Mainframe" = @("90S SERVICES", "Accucheck", "ACF2", "ACF2 - DB2 Option", "ACF2 for zVM", "ACF2 - VSE", "ACF2 - z/OS", "ACM/MLINK", "Activator", "Advanced Authentication Mainframe", "Aion Business Rules Expert", "Alert Central", "Allocate DASD Space and Placement", "APAS Insight Monitor for Adabas", "APCDDS Automated Report Balancing", "APCDOC Automated Job Documentation", "Application Lifecycle Conductor", "ARCserve Backup Client", "ARS Resource Management", "ASM2 Backup and Restore", "ASTEX Performance", "Auditor for z/OS", "AutoAction", "Automate", "Automation Analytics & Intelligence", "Automation Point", "Balancing", "Bind Analyzer for DB2 for z/OS", "Blockmaster", "Brightside", "BrightStor SAN Manager - Base", "Bundl", "CA 1 Flexible Storage", "CA 1 Tape Management - Add-On Options", "CA 1 Tape Management - Copycat Utility", "CA 7 Smart Console", "CA 7 Workload Automation", "Calendar Routines", "CA Productivity Accelerator", "Chorus Infrastructure Discipline", "Chorus Platform", "CHORUS SOFTWARE MANAGER", "CICSORT Z/OS", "CIS", "Cleanup", "CleverPath", "Cleverpath Reporter", "Cloud Storage For System Z", "CMA Connection", "CMDB for z/OS", "COBOLVISION Analyzer", "COBOL/XE", "Common Components and Services for z/OS", "COMMON PRODUCT SERVICES COMPONENT", "COMMON SECURITY SERVICES", "Common Services", "Compile/PRF for CICS", "Compile/PRF for TSO", "Compliance Event Manager", "Compliance Manager for z/OS", "Compress Data Compression for Fujitsu", "Compress Data Compression for MVS", "Compress Data Compression (IMS Tools)", "Connect", "Console Management for OpenVMS", "Converter", "CORPORATE TIE", "Cortana", "CREWS Catalog Recovery", "Cross Enterprise Application Performance Management (APM)", "DADS Plus", "DADS Plus for CICS", "Dart", "Database Analyzer for DB2 for z/OS", "Database Analyzer for IMS for z/OS", "Database Command Center Mnt", "Database Copier for IMS for z/OS", "DATABASE MANAGEMENT SOLUTIONS FOR DB2 FOR Z/OS", "DATABASE MANAGEMENT SOLUTIONS FOR IMS FOR Z/OS", "Database Organizer for IMS for z/OS", "Database Organizer (IMS Tools)", "Datacom", "Datacom/AD", "Datacom/DB", "Datacom/Server", "Data Content Discovery", "Datamacs Test Data Generator", "Date Simulator", "Datesolver/2000", "Deliver VSE", "Detector for DB2 for z/OS", "Development Environment for Mainframe", "DISK BACKUP AND RESTORE", "DISK BACKUP AND RESTORE FOR MSP", "Disk Backup and Restore - MVS", "DISK VOS3", "Dispatch Output Mgmt", "Disspla", "Distribulink", "DRIVER", "DUO", "Dynam for VM", "Dynam for VSE", "Dynamic Capacity Intelligence", "DYNAM VM", "Earl", "EASYPROCLIB", "Easytrieve Plus Report Generator Toolkit", "Easytrieve Report Generator", "Easytrieve Report Generator for Common Services", "Email", "Endevor", "Endevor - Enterprise Workbench", "Endevor for Unix", "Endevor Interface for Db2 for z/OS", "Endevor Interface for Remote Db2 for z/OS", "Endevor Natural Integration", "Enterprise Tester", "EPIC Backup", "EPIC Fastcat VSE", "EPIC for CMS System", "EPIC for z/VSE", "EPIC SUPER SYS", "EPIC TAPE MANAGEMENT", "ESM Corp.Misc Products", "ESP Workload Automation", "ETC", "eTrust ALERT", "eTrust Content Inspection Gateway Option for MSP/ISA EE", "eTrust Director", "eTrust VPN Enterprise Edition", "EUREKA:Reporter", "EUREKA:Strategy", "Explore Performance Management", "Explore Performance Management for z/VSE", "ExpressPrint", "Extend DASD VSAM Compression for z/VSE", "EZTEST", "FAQS - Automated Systems Operation", "FAQS Automated Systems Operation", "Fast Check for DB2 for z/OS", "Fast Index for DB2 for z/OS", "Fast Load for DB2 for z/OS", "Fast Recover for DB2 for z/OS", "Fast Unload for DB2 for z/OS", "FAVER VSAM Data Protection", "FAVER VSAM Data Protection for z/OS", "FileAge", "File Master Plus", "File Master Plus for DB2 for z/OS", "File Master Plus for IMS", "Filesave", "FLEE for VSE", "Forest & Trees", "Gen", "GENERIC UNISERVICE FOR CICS", "GENERIC UNISERVICE II", "Gener/OL", "Gen - Host Encyclopedia", "Gen - Workstation Toolset", "Global Subsystem (GSS)", "GRAPHICAL MANAGEMENT INTERFACE", "GRAPHICS", "HB.js", "High Performance Recovery for IMS for z/OS", "Host EDIT", "HTAC", "HYPER-BUF VSAM Buffer Optimizer", "Hyper-Buf VSAM Buffer Optimizer for z/VSE", "iDash Workload Automation", "iDash Workload Automation for CA 7", "Ideal", "Identity Manager MF", "IDMS", "Impact/2000", "IMS TOOLS - MISC", "Index Expert for DB2 for z/OS", "INFOCAI MAINTENANCE", "Innovation Data Processing (UPSTREAM)", "InterTest - Batch", "InterTest - CICS", "InterTest VSE - CICS", "Inventory Discovery Server", "IPC", "ISS", "JARS", "JARS For IDMS", "JARS Performance Management ESA VSE Option", "JARS Resource Accounting", "JARS Resource Accounting VSE", "JARS SMF Director", "JCLCheck Workload Automation", "JMR", "Job Management for OpenVMS", "Jobtrac", "JOBWATCH", "Joe", "Launch Express", "LDAP SERVER FOR Z/OS", "LDM", "Librarian", "Link", "Log Analyzer for DB2 for z/OS", "Look", "Look CICS", "LPD", "Mainframe Application Tuner", "Mainframe Chorus DBA Discipline", "Mainframe Chorus Security Discipline", "Mainframe Chorus Storage Discipline", "Mainframe Configuration Manager for IMS for z/OS", "MAINFRAME CONNECTOR FOR LINUX ON MAINFRAME", "Mainframe Extended Terminal Manager (IMS Tools)", "MAINFRAME MISCELLANEOUS", "MAINFRAME NETWORK MANAGEMENT", "Mainframe Operational Intelligence", "Mainframe Program Restart Manager for IMS for z/OS", "MAINFRAME SECURITY INSIGHTS PLATFORM", "Mainframe Software Manager (Chorus Software Manager)", "Mainframe VM Product Manager", "MasterCat VSAM Catalog Management", "MasterCat VSE", "Max", "MAZDAMON", "Merge/Modify for DB2 for z/OS", "MetaCOBOL Plus", "Metanet", "MF - MISC OLD CODES", "MF PPM - Project Engineer (AllFusion)", "MICS Resource Management", "Migrate COBOL", "MIM Data Sharing (MII)", "MIM Message Sharing (MIC)", "MIM Resource Sharing (MIM)", "MIM Tape Sharing (MIA)", "Nastel AutoPilot for WebSphere MQ", "NetCompress", "Netman", "NetMaster File Transfer Management", "NetMaster Network Automation", "NetMaster Network Management for SNA", "NetMaster Network Management for TCP/IP", "NetSpy Network Performance", "netViz", "Nine/R+", "NXBRIDGE - SYSVIEW/ENDEVOR", "OLAP", "OM Deliver", "OM Spool", "OM View", "Opera", "Opera VM", "Opera VSE", "OPS/MVS Event Management & Automation", "Optimizer/II", "Output Management Document Viewer", "OUTPUT MANAGEMENT WEB SERVICES", "Output Management Web Viewer", "PAM CLIENT FOR LINUX ON MAINFRAME", "PanApt", "PanAudit", "PanAudit Plus", "PAN/SQL", "Panvalet", "Paramount FOR NAVIGRAPH/HOST", "PDSMAN", "Performance Management for OpenVMS", "Plan Analyzer for DB2 for z/OS", "PLEU", "PMO Runtime Performance Optimizer", "Portal", "Process Automation Manager", "Project Planner", "Quick Copy for DB2 for z/OS", "QuickFetch", "Ramis Reporter", "Rapid Reorg for DB2 for z/OS", "Raps VSE", "RC Compare for DB2 for z/OS", "RC/Extract for DB2 for z/OS", "RC/Migrator for DB2 for z/OS", "RC/Query for DB2 for z/OS", "RC/Secure for DB2 for z/OS", "RC/Update for DB2 for z/OS", "RDX", "Realia", "REALIA- MISC", "Recovery Analyzer for DB2 for z/OS", "Remote Console", "Report Facility", "Report Facility for CICS", "Report Facility for IMS", "Report Facility for TSO", "Repository", "Research Planmacs Unlimited", "RLX", "RLX CLIST", "RLX Compile", "RLX ISPF", "RLX SQL", "RLX TSO", "Roscoe", "RSVP", "Scheduler Job Management", "Scheduler Smart Console", "Scheduler VSE", "ShareOption/5", "Smart Restart", "Smart RRSAF", "SMR", "SOLVE", "SOLVE: Access Session Management", "SOLVE:Central Service Desk", "Solve:CPT", "SOLVE:FTS", "SOLVE LINK", "SOLVE:Operations Automation", "Sort System", "SORT Z/OS", "SpaceMan", "SPOOLMAN", "SQL-Ease for DB2 for z/OS", "SRAM", "SRAM z/OS", "Stabilize", "Storage Command Center", "Storage Resource Mgmt", "Subsystem Analyzer for DB2 for z/OS", "SuperCalc", "SUPERPROJECT MISC", "Support Offerings", "SymDump Batch", "SymDump for CICS", "SYSTEMS MANAGEMENT FOR OPENVMS", "System Watchdog for OpenVMS", "SYSVIEW Performance Management", "SYSVIEW Performance Management Option for DB2 for z/OS", "Tape Encryption", "Tape Management z/OS", "Tape/Manager VSE-ESA OPTION", "TASKLIB", "TCPaccess", "TCPAccess X.25 Server", "Team Build", "Teleview", "Telon Application Generator", "Test4z", "TestCoverage", "Thread Sentry", "Thread Stopper", "TLMS Tape Management", "Topology", "Top Secret", "Top Secret - LDAP", "Top Secret - VSE", "TPX - Session Management", "Training", "TRILOGexpert - TriTune", "Trusted Access Manager for Z", "TSO", "Ucandu", "UFO", "UNICENTER JCLCHECK COMMON COMPONENT", "Unicenter Job Management Option", "Unicenter Network and Systems Management Database Performance Monitor Option", "Unicenter Performance Management", "Unified Infrastructure Management for Mainframe", "Vantage for VM", "Vantage Storage Resource Manager", "Velocity Software Performance Suite", "Verify", "VISION:ASSESS", "Vision:Builder", "VISION:DAGER", "VISION:EIGHTY", "Vision:Excel", "Vision:Forms", "Vision:Inform", "Vision:Inquiry", "Vision:Intraccess", "Vision:Legacy", "Vision:Recode", "Vision:Redocument", "VISION:RENAISSANCE", "Vision:Report", "Vision:Results", "Vision:Sixty", "VISION:SUBROUTINES", "Vision:Transact", "Vision:Transact for IMS", "Vision:Two", "VISION:VAM", "VISUAL EXPRESS", "VM:Account", "Vman Session Management for z/OS", "VM:Archiver for z/VM", "VM:Backup for z/VM", "VM:Backup High-Speed Disaster Recovery Option (HiDRO)", "VM:Batch", "VM:DBA", "VM:DB Admin", "VM:DB Center", "VM:DB Developer", "VM:DB Editor", "VM:DB Monitor", "VM:DB Reorganizer", "VM:DB Reporter", "VM:DB Restore", "VM:DB REXX", "VM:DB SQLMAP", "VM:DB Suite", "VM:Director for z/VM", "VMLIB for z/OS", "VM:Monitor", "VM:Notekeeper", "VM:Operator", "VM:Prorexx", "VM:Schedule", "VM:Secure for z/VM", "VM:Sort", "VM:Spool", "VM:Tape for z/VM", "Vollie", "VSAMAid VSAM Tools for z/VSE", "V/Solver", "Vtape Virtual Tape System", "VTERM", "WatchTower", "WEB ADMINISTRATOR FOR ACF2", "WEB ADMINISTRATOR FOR TOP SECRET", "Workload Automation Agent", "Workload Automation Restart Option for z/OS Schedulers (CA 11)", "XCOM Data Transport", "XCOM Data Transport - z/OS", "XMENU for z/VM", "Xpertware", "Zowe") + "Enterprise" = @("Advantage Data Transformer", "Automation Analytics & Intelligence", "Autosys Workload Automation", "CA 2E", "CA Agile Requirements Designer", "CA Agile Vision", "CA App Experience Analytics", "CA Application Delivery Analysis MTP (NetQoS / ADA)", "CA Application Delivery Analysis (NetQoS / ADA)", "CA Application Performance Management Agent (APM / Wily / Introscope)", "CA Application Performance Management (APM / Wily / Introscope)", "CA Application Performance Management SaaS", "CA Application Test", "CA Automation Suite for Clouds", "CA Automation Suite For Data Centers", "CA Automation Suite for Data Centers - Configuration Automation", "CA Automic Applications Manager (AM)", "CA Automic Dollar Universe", "CA Automic One Automation", "CA Automic Operations Manager", "CA Automic Oracle", "CA Automic Service Orchestration - Automation Engine", "CA Automic Sysload", "CA Automic Workload Automation - Automation Engine", "CA Business Service Insight", "CA Capacity Manager", "CA Client Automation - Asset Intelligence", "CA Client Automation - Asset Management", "CA Client Automation - IT Client Manager", "CA Client Automation - Remote Control", "CA Client Automation - Software Delivery", "CA Configuration Automation", "CA Continuous Application Insight (PathFinder)", "CA Continuous Delivery Automation - Automation Engine", "CA Database Analyzer for DB2 for Oracle", "CA Distributed Database Management", "CA ecoMeter", "CA ECOMETER SERVER COMPONENT FOC", "CA eHealth", "CA eHealth Application Response", "CA Executive Insight", "CA Harvest Software Change Manager", "CA Harvest Software Change Manager - OpenMake Meister", "CA Infrastructure Management", "CA IT Asset Manager", "CA IT Asset Manager Asset Portfolio Management", "CA Mediation Manager", "CA Mobile Device Management", "CA NetVoyant (NetQoS / NV)", "CA Performance Management", "CA Plex", "CA Process Automation Base", "CA Process Automation Power Pack for Spectrum, IM, and BMC Remedy", "CA Productivity Accelerator", "CA Release Automation Connector", "CA Release Automation - DataManagement Server (Nolio)", "CA Release Automation - Release Operations Center (Nolio)", "CA Service Catalog", "CA Service Desk Manager", "CA Service Desk Manager - Mobile Application", "CA Service Desk Manager - Unified Self Service", "CA Service Desk Manager - Xtraction", "CA Service Management - Asset Portfolio Management", "CA Service Management - Service Desk Manager", "CA Service Operations Insight (SOI)", "CA Software Asset Manager (CA SAM)", "CA Test Data Manager (Data Finder / Grid Tools)", "CA Unicenter NSM", "CA Unified Communications Monitor (NetQoS / UCM)", "CA Virtual Assurance for IM", "CA Visual Infrastructure", "CA Workload Automation Advanced Integration", "CA Workload Automation Advanced Integration for Hadoop", "CA Workload Automation iXP", "CENDURA", "Clarity PPM On Premise", "CleverPath Portal", "CleverPath Predictive Analysis Server", "ConnectALL", "ConnectAll On-Prem", "Continuous Delivery Director", "Continuous Delivery Director SAAS", "DX Application Performance Management", "DX Operational Intelligence", "DX Operational Observability", "DX SaaS", "DX Unified Infrastructure Management (Nimsoft / UIM)", "ESP dSeries Workload Automation", "ESP dSeries Workload Automation - Business Agents (dSeries)", "Insights On-Prem", "Network Flow Analysis", "Network Observability", "Rally On-Premise", "Service Virtualization", "Spectrum", "SUPPORT AUTOMATION- SERVER", "Support Offerings", "SystemEDGE Agent", "Training", "VIP Authentication Hub", "Virtual Network Assurance", "VMware Smart Assurance", "VMware Telco Cloud Operations", "VMware Telco Cloud Service Assurance", "Workload Automation Agent") + "Cyber Security" = @("Advanced Endpoint Defense (with SEP)", "Advanced RP-VA", "Advanced Threat Protection Platform", "AntiSpam", "API SECURITY", "ASG-S200", "ASG-S400", "ASG-S500", "Asset Management Suite", "Blue Coat DLP Subscription", "CA Advanced Authentication - Strong Authentication (AuthMinder / WebFort)", "CA API Developer Portal", "CA API Gateway", "CA API Gateway Enterprise Service Manager (Layer 7)", "CA API Gateway Precision API Monitoring Module for API Gateway (Layer 7)", "CA Audit", "CA Data Protection (DataMinder)", "CA Directory", "CA Enterprise Log Manager", "CA Identity Governance", "CA Identity Manager", "CA Identity Portal", "CA Identity Service", "CA Identity Suite", "CA Live API Creator", "CA Microgateway", "CA Mobile API Gateway", "CA Mobile - APP Services", "CA Policy and Configuration Mgr", "CA Privileged Access Manager - Cloakware Password Authority (PA)", "CA Privileged Access Manager (PAM)", "CA Privileged Access Manager - Server Control (PAMSC)", "CA Privileged Identity Management Endpoint (PIM)", "CA Rapid App Security", "Carbon Black App Control", "Carbon Black Cloud Endpoint Standard", "Carbon Black Cloud Endpoint Standard (formerly Cb Defense)", "Carbon Black Cloud Enterprise EDR", "Carbon Black Cloud Managed Detection and Response", "Carbon Black Cloud Workload", "Carbon Black EDR", "Carbon Black EDR (formerly Cb Response)", "CA Risk Authentication", "CASB Audit SpanVA", "CASB Security Advanced", "CASB Securlet SAAS With DLP-CDS", "CA Secure Cloud SaaS - Advanced Authentication", "CA Secure Cloud SaaS - Single Sign On", "CA Security Command Center", "CA Single Sign-On", "CA Single Sign On Agents (SiteMinder)", "CA Single Sign On Federation (SiteMinder)", "CA Single Sign On Secure Proxy Server (SiteMinder)", "CAS-S200", "CAS-S400", "CAS-S500", "CA Strong Authentication", "CAS-VA", "CA Threat Analytics for PAM", "CA User Activity Reporting", "CA Virtual Privilege Manager", "CF-500", "CF-5000", "Client Management Suite", "Cloud Access Security Broker for IaaS", "Cloud Access Security Broker for SaaS", "Cloud Secure Web Gateway", "Cloud Secure Web Gateway - Cloud SWG", "CloudSOC Data Retention", "Cloud Workload Protection for Storage", "Cloud Workload Protection for Storage DLP", "Complete Endpoint Defense (with SEP)", "Control Compliance Suite", "Control Compliance Suite Assessment Manager", "Control Compliance Suite Databases Oracle", "Control Compliance Suite Data Privacy", "Control Compliance Suite Directory Services", "Control Compliance Suite Policy Manager", "Control Compliance Suite Risk Manager", "Control Compliance Suite Standards Database", "Control Compliance Suite Standards Middleware", "Control Compliance Suite Standards Module", "Control Compliance Suite Standards Network Devices", "Control Compliance Suite Standards Server", "Control Compliance Suite Standards Virtual Server", "Control Compliance Suite Vulnerability Manager", "Critical System Protection", "Data Center Security Monitoring Edition", "Data Center Security Server", "Data Center Security Server Advanced", "Data Insight for DLP", "Data Loss Prevention", "Data Loss Prevention API Detection", "Data Loss Prevention API Detection for Developer Apps Virtual Appliance", "Data Loss Prevention API Detection Virtual Appliance", "Data Loss Prevention Cloud Detection Service", "Data Loss Prevention Cloud Detection Service for API Detection", "Data Loss Prevention Cloud Detection Service for ICAP", "Data Loss Prevention Cloud Detection Service for REST", "Data Loss Prevention Cloud Package", "Data Loss Prevention Cloud Prevent for Microsoft Office 365", "Data Loss Prevention Cloud Service for Discovery/Connector", "Data Loss Prevention Cloud Service for Email", "Data Loss Prevention Cloud Storage", "Data Loss Prevention Core API Detection", "Data Loss Prevention Core Package", "Data Loss Prevention Data Access Governance", "Data Loss Prevention Discover Suite", "Data Loss Prevention Endpoint Discover", "Data Loss Prevention Endpoint Prevent", "Data Loss Prevention Endpoint Suite", "Data Loss Prevention Enforce", "Data Loss Prevention Enterprise Suite", "Data Loss Prevention for Mobile", "Data Loss Prevention Form Recognition", "Data Loss Prevention for Office 365 Email and Gmail with Email Safeguard", "Data Loss Prevention Network Discover", "Data Loss Prevention Network Email", "Data Loss Prevention Network Monitor", "Data Loss Prevention Network Monitor and Prevent for Email", "Data Loss Prevention Network Monitor and Prevent for Email and Web", "Data Loss Prevention Network Monitor and Prevent for Web", "Data Loss Prevention Network Prevent for Email", "Data Loss Prevention Network Prevent for Email Virtual Appliance", "Data Loss Prevention Network Prevent for Web Virtual Appliance", "Data Loss Prevention Network Protect", "Data Loss Prevention Network Web", "Data Loss Prevention Oracle Standard Edition 2", "Data Loss Prevention Plus Suite", "Data Loss Prevention Sensitive Image Recognition", "Data Loss Protection Oracle Standard Edition", "Deployment Solution", "Desktop Email Encryption", "DLP-1700", "DLP-2700", "DLP-700", "DLP-S500", "Drive Encryption", "Email", "Email Security.cloud", "Embedded Security Critical System Protection", "Encryption Management Server", "Endpoint Detection and Response", "Endpoint Detection and Response with Email", "Endpoint Detection and Response with Network Sensor", "Endpoint Encryption", "Endpoint Hardening", "Endpoint Hardening Application Control", "Endpoint Protection", "Endpoint Protection for VDI", "Endpoint Protection with Endpoint Detection and Response", "Endpoint Security", "Endpoint Security Complete", "Endpoint Security for Servers", "Endpoint Threat Defense for Active Directory", "eTrust 20/20", "File Share Encryption", "Gateway Email Encryption", "Generic Non Product", "Ghost Solution Suite", "Industrial Control System Protection", "Information Centric Analytics", "Information Centric Encryption", "Information Centric Security", "Information Centric Tagging", "Insight for Private Clouds Endpoint Edition", "IntelligenceCenter", "Inventory Solution", "ISG Content Analysis", "ISG Proxy", "ISG SSLV", "IT Analytics", "IT Management Suite", "Mail Security for Microsoft Exchange", "Management Center", "Management Center - VA", "Messaging Gateway", "Messaging Gateway for Service Providers", "Mobile Encryption for iOS", "MTD-S400", "PacketShaper", "PacketShaper S-Series", "Patch Management Solution", "Patch Management Solution for Servers", "PGP Command Line", "PGP Encryption Suite", "PGP Key Management Server", "PGP Key Mgmt Client Access and CLI API", "PGP SDK", "PolicyCenter", "PolicyCenter S-Series", "Protection Engine for Cloud Services", "Protection Engine for NAS", "Protection for SharePoint Servers", "Protection Suite Enterprise Edition", "Reporter-S500", "Reporter-VA", "Security Analytics", "Server Management Suite", "SG-300", "SG-510", "SG-600", "SG-900", "SG-9000", "SG-S200", "SG-S200-RP", "SG-S400", "SG-S400-RP", "SG-S500", "SG-S500-RP", "SGVA", "SG-VA", "SITEMINDER", "Software Management Solution", "SSL Visibility Appliance Software", "SSP-S210 PLATFORM", "SSP-S410", "SSP-S410 PLATFORM", "SSP-S620 PLATFORM", "Standard RP-VA", "Support Offerings", "SV-1800", "SV-2800", "SV-3800", "SV-800", "SV-S550", "SWG VA-100", "Threat Hunting Center", "Unicenter Network and Systems Management Wireless Network Mgmt Option", "VIP Authentication Hub", "VIP Service", "VMware Carbon Black", "VMware Carbon Black Cloud Container", "VMware Live Recovery", "Web Isolation", "Web Isolation for Cloud SWG") + "Payment Security" = @("ARCOT ECOMMERCE", "CA Payment Security") + "Tanzu" = @("Advanced Cyber Compliance", "App Suite", "Azure Spring Enterprise", "Concourse for VMware Tanzu", "Generic Non Product", "On Demand Services SDK", "Operations Manager", "Pivotal Web Server", "RabbitMQ", "Redis for VMware Tanzu", "Services Suite", "Support Offerings", "Support Only for Apache HTTP", "Support Only for Apache Tomcat", "Tanzu Kubernetes Runtime", "VCF Automation", "VCF Operations", "VCF Operations/Automation (formerly VMware Aria Suite)", "VCF Operations for Networks", "VMware Chiseled Ubuntu Containers", "VMware Cloud Foundation", "VMware Cloud Foundation Edge", "VMware Cloud Native Runtimes", "VMware Container Networking with Antrea", "VMware SaltStack", "VMware Tanzu Advanced", "VMware Tanzu Application Catalog", "VMware Tanzu Application Platform", "VMware Tanzu Application Service", "VMware Tanzu Build Service", "VMware Tanzu CLI", "VMware Tanzu Data Intelligence", "VMware Tanzu Data Services", "VMware Tanzu Data Services Pack", "VMware Tanzu Data Services Solutions", "VMware Tanzu Data Suite", "VMware Tanzu for Kubernetes Operations", "VMware Tanzu for MySQL", "VMware Tanzu for Postgres", "VMware Tanzu for Valkey", "VMware Tanzu Gemfire", "VMware Tanzu Greenplum", "VMware Tanzu Greenplum Decision Support Benchmark", "VMware Tanzu Guardrails", "VMware Tanzu Insights", "VMware Tanzu Kubernetes Grid Integrated Edition", "VMware Tanzu Kubernetes Grid Management", "VMware Tanzu Kubernetes Grid Plus", "VMware Tanzu Mission Control", "VMware Tanzu Mission Control - SM", "VMware Tanzu Platform", "VMware Tanzu Platform - Cloud Foundry", "VMware Tanzu Platform Core", "VMware Tanzu Platform Data", "VMware Tanzu Platform - Hub", "VMware Tanzu Platform - Kubernetes", "VMware Tanzu Platform - SaaS Components", "Vmware Tanzu Platform - SM", "VMware Tanzu Platform Spring", "VMware Tanzu Platform - TAP", "VMware Tanzu RabbitMQ", "VMware Tanzu Service Mesh", "VMware Tanzu Spring Essentials", "VMware Tanzu Spring Runtime", "VMware Tanzu Spring Runtime - SM", "VMware Tanzu Spring SaaS", "VMware Tanzu SQL", "VMware Tanzu tc Server", "VMware Tanzu Toolkit for Kubernetes", "VMware Telco Cloud Platform", "VMware vFabric", "VMware vSphere ESXi") + "VCF" = @("Advanced Cyber Compliance", "Flings", "Holodeck", "Support Offerings", "Uhana by VMware", "VCF Automation", "VCF Operations", "VCF Operations/Automation (formerly VMware Aria Suite)", "VCF Operations for Networks", "VMmark", "VMware", "VMware Aria Automation", "VMware Aria Operations", "VMware Aria Operations for Integrations Management Packs", "VMware Aria Suite", "VMware Bare Metal Automation", "VMware Centralized RAN Intelligence Controller", "VMware Chiseled Ubuntu Containers", "VMware Cloud Director", "VMware Cloud Director App Launchpad", "VMware Cloud Director Availability", "VMware Cloud Director Extension for VMware Data Solutions", "VMware Cloud Director Object Storage Extension", "VMware Cloud Foundation", "VMware Cloud Foundation Edge", "VMware Cloud Gateway for VMC HLM", "VMware Cloud on AWS", "VMware Cloud On-Premise Components", "VMware Cloud Provider Lifecycle Manager", "VMware Container Networking with Antrea", "VMware Data Services Manager", "VMware Data Services Manager for PAIF", "VMware Data Services Manager for VCF", "VMware Desktop Hypervisor", "VMware Distributed RAN Intelligence Controller", "VMware Edge Cloud Orchestrator", "VMware Edge Compute Stack", "VMware Edge Intelligence", "VMware Fusion", "VMware HCX", "VMware Identity Manager", "VMware Integrated OpenStack", "VMware Live Recovery", "VMware NSX", "VMware NSX Data Center for vSphere", "VMware Photon Platform", "VMware Private AI Foundation", "VMware Private Mobile Network", "VMware Salt", "VMware SaltStack", "VMware SDDC Manager", "VMware Site Recovery Manager", "VMware Skyline Collector", "VMware Tanzu Data Services Pack", "VMware Tanzu Data Suite", "VMware Tanzu Guardrails", "VMware Tanzu Kubernetes Grid Integrated Edition", "VMware Tanzu Mission Control", "VMware Tanzu Platform Services - SALT", "VMware Tanzu Service Mesh", "VMware Tanzu SQL", "VMware Telco Cloud Automation", "VMware Telco Cloud Infrastructure", "VMware Telco Cloud Infrastructure - Cloud Director Edition", "VMware Telco Cloud Infrastructure - OpenStack Edition", "VMware Telco Cloud Platform", "VMware Telco Cloud Platform - 5G Edition", "VMware Telco Cloud Service Assurance", "VMware Tools", "VMware Usage Meter", "VMware Validated Design for Software-Defined Data Center", "VMware vCenter converter", "VMware vCenter Server", "VMware vCloud NFV", "VMware vCloud NFV OpenStack Edition", "VMware vCloud Suite", "VMware vCloud Suite Platinum", "VMware vCloud Suite Subscription", "VMware vCloud Usage Meter", "VMware vDefend Firewall", "VMware vDefend Firewall with Advanced Threat Prevention", "VMware vDefend Network Detection and Response", "VMware VeloCloud SD-Access", "VMware VeloCloud SD-WAN", "VMware VeloCloud SD-WAN Edge Appliance", "VMware vRealize Automation", "VMware vRealize Business for Cloud", "VMware vRealize Code Stream", "VMware vRealize Configuration Manager", "VMware vRealize Hyperic", "VMware vRealize Log Insight", "VMware vRealize Network Insight", "VMware vRealize Operations", "VMware vRealize Operations Insight", "VMware vRealize Operations Management Pack for MEDITECH", "VMware vSAN", "VMware vSphere", "VMware vSphere ESX Drivers", "VMware vSphere ESXi", "VMware vSphere Foundation", "VMware vSphere Kubernetes Service", "VMware Workstation", "VMware Workstation Player", "VMware Workstation Pro", "vSphere Kubernetes releases", "vSphere Supervisor Service") + "ANS" = @("Tanzu Kubernetes Runtime", "vDefend Security Services Platform", "VMware Avi Load Balancer", "VMware Cloud Foundation", "VMware Cloud Foundation Edge", "VMware Firewall", "VMware NSX", "VMware Tanzu for Kubernetes Operations", "VMware Tanzu Service Mesh", "VMware Telco Cloud Platform", "VMware vDefend Firewall", "VMware vDefend Firewall with Advanced Threat Prevention", "VMware vDefend Network Detection and Response", "VMware vSphere Foundation", "VMware vSphere Kubernetes Service") + } + + $SelectedDivision = $fakeBoundParameters['Division'] + $Choices = $ProductData[$SelectedDivision] + + $Choices | Where-Object { $_ -like "*$wordToComplete*" } | ForEach-Object { + [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_) + } + })] + [string]$Product, + + [Parameter(Mandatory = $false, HelpMessage = "Filter results based on support timelines.")] + [ValidateSet( + 'Supported Products', + 'EOS in 6 months', + 'EOS in 12 months', + 'EOL in 6 months', + 'EOL in 12 months' + )] + [string]$Support + ) + + process { + # Division Key Mapping Table + $DivisionKeyMap = @{ + "Mainframe" = "ME" + "Enterprise" = "ES" + "Cyber Security" = "SE" + "Payment Security" = "PZ" + "Tanzu" = "VT" + "VCF" = "VC" + "ANS" = "VA" + } + + $DivisionCode = $DivisionKeyMap[$Division] + + Write-Verbose "Querying lifecycle data for $Product ..." + + $uri = "https://support.broadcom.com/web/ecx/productlifecycle/-/productLifecycle/getproductlifecycledetail" + + $payload = @{ + "dateFilter" = $Support + "description" = "" + "dropSupportDate" = "" + "eolDate" = "" + "gaDate" = "" + "genLevel" = "" + "isEntitled" = "false" + "os" = "" + "page" = "0" + "productLine" = $DivisionKeyMap[$Division] + "productName" = "$Product" + "release" = "" + "size" = "1000" + "sort" = "productName,asc" + "stabilizationDate" = "" + } + + $headers = @{ + "Accept" = "application/json" + "Content-Type" = "application/json" + } + + $body = $payload | ConvertTo-Json + $response = Invoke-WebRequest -Uri $uri -Method POST -Body $body -Headers $headers + + if ($response.StatusCode -eq 200) { + $rawList = ($response.Content | ConvertFrom-Json).data.lifecycleList + + $rawList + } + } +} \ No newline at end of file From acf2939704dd5dc70f02b411966eff558cbe58ae Mon Sep 17 00:00:00 2001 From: William Lam Date: Tue, 6 Jan 2026 18:32:15 -0800 Subject: [PATCH 37/37] Retrieve VCF 3/4/5/9 Component Bundle IDs --- powershell/VcfComponentBundleName.ps1 | 84 +++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 powershell/VcfComponentBundleName.ps1 diff --git a/powershell/VcfComponentBundleName.ps1 b/powershell/VcfComponentBundleName.ps1 new file mode 100644 index 0000000..77648ab --- /dev/null +++ b/powershell/VcfComponentBundleName.ps1 @@ -0,0 +1,84 @@ +Function Get-Vcf9ComponentBundleName { + param( + [Parameter(Mandatory=$true)] + [ValidateSet( + "9.0.0.0", "9.0.1.0" + )] + [string]$Version, + + [Parameter(Mandatory=$true)][string]$BroadcomDownloadToken + ) + + $pvcUrl = "https://dl.broadcom.com/${BroadcomDownloadToken}/PROD/metadata/productVersionCatalog/v1/productVersionCatalog.json" + + $patches = ((Invoke-WebRequest -Uri $pvcUrl | ConvertFrom-Json).patches) + + $results = @() + foreach ($componentName in ($patches | Get-Member -MemberType NoteProperty).Name) { + $components = ${patches}.${componentName} + foreach ($component in $components) { + if($component.productVersion -match $Version) { + $bundles = $component.artifacts.bundles + + foreach ($bundle in $bundles) { + $tmp = [pscustomobject] @{ + Name = $componentName + Version = $component.productVersion + Type = $bundle.type + BundleID = $bundle.name + FileName = $bundle.binaries.filename + } + $results+=$tmp + } + } + } + } + + $results | Sort-Object -Property Name | ft +} + +Function Get-Vcf345ComponentBundleName { + param( + [Parameter(Mandatory=$true)] + [ValidateSet( + "3.10.1.1", "3.10.1.2", "3.10.2.0", "3.10.2.1", "3.10.2.2", + "3.11.0.0", "3.11.0.1", "4.0.0.0", "4.0.0.1", "4.0.1.0", + "4.0.1.1", "4.1.0.0", "4.1.0.1", "4.2.0.0", "4.2.1.0", + "4.3.0.0", "4.3.1.0", "4.3.1.1", "4.4.0.0", "4.4.1.0", + "4.4.1.1", "4.5.0.0", "4.5.1.0", "4.5.2.0", "5.0.0.0", + "5.0.0.1", "5.1.0.0", "5.1.1.0", "5.2.0.0", "5.2.1.0", + "5.2.2.0" + )] + [string]$Version, + + [Parameter(Mandatory=$true)][string]$BroadcomDownloadToken + ) + + $lcmManifestUrl = "https://dl.broadcom.com/${BroadcomDownloadToken}/PROD/COMP/SDDC_MANAGER_VCF/lcm/manifest/v1/lcmManifest.json" + $indexUrl = "https://dl.broadcom.com/${BroadcomDownloadToken}/PROD/COMP/SDDC_MANAGER_VCF/index.v3" + + $release = ((Invoke-WebRequest -Uri $lcmManifestUrl | ConvertFrom-Json).releases | where {$_.version -eq ${Version}}) + $bom = $release.bom + $patches = $release.patchBundles + + $indexConnect = (Invoke-WebRequest -Uri $indexUrl).RawContent + + $results = @() + foreach ($patch in $patches) { + $componentName = $patch.bundleElements[0] + $bundleVersion = ($bom | where {$_.name -eq $patch[0].bundleElements[0]}).version + + $lines = $indexConnect -split "`n" | Where-Object { $_ -match $patch.bundleId } + $bundleId = ($lines.Trim() -split '\s+')[1] -replace '\.manifest$', '' + + $tmp = [pscustomobject] @{ + Name = $componentName + Version = $bundleVersion + BundleID = $bundleId + Id = $patch.bundleId + } + $results+=$tmp + } + + $results | Sort-Object -Property Name | ft +} \ No newline at end of file