Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
No results found
Select Git revision
Show changes
......@@ -7,21 +7,27 @@
-- | basic types for the linter to eat and produce
-- The dark magic making thse useful is in LintWriter
module Types where
module Types
( Level(..)
, Lint(..)
, Dep(..)
, Hint(..)
, hint
, lintLevel
, lintsToHints
) where
import Universum
import Control.Monad.Trans.Maybe ()
import Data.Aeson (FromJSON, ToJSON (toJSON),
ToJSONKey, (.=))
import Data.Text (Text)
import GHC.Generics (Generic)
import Badges (Badge)
import qualified Data.Aeson as A
import Data.Maybe (mapMaybe)
import Paths (RelPath)
import Util (PrettyPrint (..), showText)
import WithCli (Argument, Proxy (..),
atomicArgumentsParser)
import Util (PrettyPrint (..))
import WithCli (Argument, atomicArgumentsParser)
import WithCli.Pure (Argument (argumentType, parseArgument),
HasArguments (argumentsParser))
......@@ -29,7 +35,7 @@ import WithCli.Pure (Argument (argumentType, parseArgumen
-- | Levels of errors and warnings, collectively called
-- "Hints" until I can think of some better name
data Level = Info | Suggestion | Warning | Forbidden | Error | Fatal
deriving (Show, Generic, Ord, Eq, ToJSON, FromJSON)
deriving (Show, Generic, Ord, Eq, ToJSON, FromJSON, NFData)
instance Argument Level where
argumentType Proxy = "Lint Level"
......@@ -48,16 +54,16 @@ instance HasArguments Level where
-- | a hint comes with an explanation (and a level), or is a dependency
-- (in which case it'll be otherwise treated as an info hint)
data Lint = Depends Dep | Offers Text | Lint Hint | Badge Badge
data Lint = Depends Dep | Offers Text | Lint Hint | Badge Badge | CW [Text]
deriving (Ord, Eq, Generic, ToJSONKey)
data Dep = Local RelPath | Link Text | MapLink Text | LocalMap RelPath
deriving (Generic, Ord, Eq)
deriving (Generic, Ord, Eq, NFData)
data Hint = Hint
{ hintLevel :: Level
, hintMsg :: Text
} deriving (Generic, Ord, Eq)
} deriving (Generic, Ord, Eq, NFData)
-- | shorter constructor (called hint because (a) older name and
-- (b) lint also exists and is monadic)
......@@ -74,16 +80,18 @@ lintsToHints = mapMaybe (\case {Lint hint -> Just hint ; _ -> Nothing})
instance PrettyPrint Lint where
prettyprint (Lint Hint { hintMsg, hintLevel } ) =
" " <> showText hintLevel <> ": " <> hintMsg
" " <> show hintLevel <> ": " <> hintMsg
prettyprint (Depends dep) =
" Info: found dependency: " <> prettyprint dep
prettyprint (Offers dep) =
" Info: map offers entrypoint " <> prettyprint dep
prettyprint (Badge _) =
" Info: found a badge."
prettyprint (CW cws) =
" CWs: " <> show cws
instance PrettyPrint Hint where
prettyprint (Hint level msg) = " " <> showText level <> ": " <> msg
prettyprint (Hint level msg) = " " <> show level <> ": " <> msg
instance ToJSON Lint where
toJSON (Lint h) = toJSON h
......@@ -96,6 +104,9 @@ instance ToJSON Lint where
toJSON (Badge _) = A.object
[ "msg" .= A.String "found a badge"
, "level" .= A.String "Badge Info"]
toJSON (CW cws) = A.object
[ "msg" .= A.String "Content Warning"
, "level" .= A.String "CW Info" ]
instance ToJSON Hint where
toJSON (Hint l m) = A.object
......
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeApplications #-}
-- | Functions to deal with uris and custom uri schemes
module Uris where
import Universum
import Control.Monad (unless, when)
import Data.Aeson (FromJSON (..), Options (..),
SumEncoding (UntaggedValue),
defaultOptions, genericParseJSON)
import Data.Data (Proxy)
import Data.Either.Combinators (maybeToRight, rightToMaybe)
import Data.Map.Strict (Map)
import qualified Data.Map.Strict as M
import Data.Text (Text, pack)
import qualified Data.Text as T
import GHC.Generics (Generic)
import GHC.TypeLits (KnownSymbol, symbolVal)
import Network.URI.Encode as URI
import Text.Regex.TDFA ((=~))
import Witherable (mapMaybe)
import Data.Aeson (FromJSON (..), Options (..),
SumEncoding (UntaggedValue),
defaultOptions, genericParseJSON)
import qualified Data.Map.Strict as M
import qualified Data.Text as T
import GHC.TypeLits (KnownSymbol, symbolVal)
import Network.URI (URI (..), URIAuth (..), parseURI,
uriToString)
import qualified Network.URI.Encode as URI
data Substitution =
Prefixed { prefix :: Text, blocked :: [Text], allowed :: [Text], scope :: [String] }
| DomainSubstitution { substs :: Map Text Text, scope :: [String] }
| Allowed { scope :: [String], allowed :: [Text] }
deriving (Generic, Show)
| Unrestricted { scope :: [String] }
deriving (Generic, Show, NFData)
instance FromJSON Substitution where
......@@ -39,22 +35,24 @@ instance FromJSON Substitution where
, rejectUnknownFields = True
}
type SchemaSet = [(Text, Substitution)]
type SchemaSet = Map Text [Substitution]
extractDomain :: Text -> Maybe Text
extractDomain url =
let (_,_,_,matches) = url =~ "^https://([^/]+)/?.*$" :: (Text,Text,Text,[Text])
in case matches of
[domain] -> Just domain
_ -> Nothing
-- | deconstruct a URI into a triple of [schema:]//[domain]/[tail...],
-- and a normalised version of the same URI
parseUri :: Text -> Maybe (Text, Text, Text, Text)
parseUri raw =
case parseURI (toString (T.strip raw)) of
Nothing -> Nothing
Just uri@URI{..} -> case uriAuthority of
Nothing -> Nothing
Just URIAuth {..} -> Just
( fromString uriScheme
, fromString $ uriUserInfo <> uriRegName <> uriPort
, fromString $ uriPath <> uriQuery <> uriFragment
, fromString $ uriToString id uri ""
)
parseUri :: Text -> Maybe (Text, Text, Text)
parseUri uri =
let (_,_,_,matches) = uri =~ "^([a-zA-Z0-9]+)://([^/]+)(/?.*)$" :: (Text,Text,Text,[Text])
in case matches of
[schema, domain, rest] -> Just (schema, domain, rest)
_ -> Nothing
data SubstError =
SchemaDoesNotExist Text
......@@ -63,43 +61,46 @@ data SubstError =
| IsBlocked
| DomainIsBlocked [Text]
| VarsDisallowed
| WrongScope Text [Text]
-- ^ This link's schema exists, but cannot be used in this scope.
-- The second field contains a list of schemas that may be used instead.
| WrongScope Text [Text]
deriving (Eq, Ord) -- errors are ordered so we can show more specific ones
applySubsts :: KnownSymbol s
=> Proxy s -> SchemaSet -> Text -> Either SubstError Text
applySubsts s substs uri = do
when (T.isInfixOf (pack "{{") uri || T.isInfixOf (pack "}}") uri)
when (T.isInfixOf "{{" uri || T.isInfixOf "}}" uri)
$ Left VarsDisallowed
parts@(schema, _, _) <- note NotALink $ parseUri uri
parts@(schema, _, _, _) <- maybeToRight NotALink $ parseUri uri
let rules = filter ((==) schema . fst) substs
case fmap (applySubst parts . snd) rules of
[] -> Left (SchemaDoesNotExist schema)
results@(_:_) -> case mapMaybe rightToMaybe results of
suc:_ -> Right suc
_ -> minimum results
let rules = filter (elem thisScope . scope) . concat $ M.lookup schema substs
case nonEmpty $ map (applySubst parts) rules of
Nothing -> Left (SchemaDoesNotExist schema)
Just result -> minimum result
where
note = maybeToRight
applySubst (schema, domain, rest) rule = do
thisScope = symbolVal s
applySubst (schema, domain, rest, uri) rule = do
-- is this scope applicable?
unless (symbolVal s `elem` scope rule)
$ Left (WrongScope schema
(fmap fst . filter (elem (symbolVal s) . scope . snd) $ substs))
$ map fst -- make list of available uri schemes
. filter (any (elem thisScope . scope) . snd)
$ toPairs substs)
case rule of
DomainSubstitution table _ -> do
prefix <- note (DomainDoesNotExist (schema <> pack "://" <> domain))
$ M.lookup domain table
prefix <- case M.lookup domain table of
Nothing -> Left (DomainDoesNotExist (schema <> "//" <> domain))
Just a -> Right a
pure (prefix <> rest)
Prefixed {..}
| domain `elem` blocked -> Left IsBlocked
| domain `elem` allowed || pack "streamproxy.rc3.world" `T.isSuffixOf` domain -> Right uri
| domain `elem` allowed -> Right uri
| otherwise -> Right (prefix <> URI.encodeText uri)
Allowed _ domains -> if domain `elem` domains
|| pack "streamproxy.rc3.world" `T.isSuffixOf` domain
then Right uri
else Left (DomainIsBlocked domains)
Allowed _ allowlist
| domain `elem` allowlist -> Right uri
| otherwise -> Left (DomainIsBlocked allowlist)
Unrestricted _ -> Right uri
......@@ -2,28 +2,26 @@
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
-- | has (perhaps inevitably) morphed into a module that mostly
-- concerns itself with wrangling haskell's string types
module Util where
module Util
( mkProxy
, PrettyPrint(..)
, printPretty
, naiveEscapeHTML
, ellipsis
) where
import Universum
import Data.Aeson as Aeson
import Data.Proxy (Proxy (..))
import Data.Set (Set)
import qualified Data.Set as S
import Data.Text (Text)
import qualified Data.Text as T
import Tiled (Layer (layerData), PropertyValue (..),
import Data.Tiled (Layer (layerData), PropertyValue (..),
Tileset (tilesetName), layerName, mkTiledId)
-- | helper function to create proxies
mkProxy :: a -> Proxy a
mkProxy = const Proxy
-- | haskell's many string types are FUN …
showText :: Show a => a -> Text
showText = T.pack . show
-- | a class to address all the string conversions necessary
-- when using Show to much that just uses Text instead
class PrettyPrint a where
......@@ -37,7 +35,7 @@ instance PrettyPrint Text where
instance PrettyPrint Aeson.Value where
prettyprint = \case
Aeson.String s -> prettyprint s
v -> (T.pack . show) v
v -> show v
instance PrettyPrint t => PrettyPrint (Set t) where
prettyprint = prettyprint . S.toList
......@@ -46,8 +44,8 @@ instance PrettyPrint PropertyValue where
prettyprint = \case
StrProp str -> str
BoolProp bool -> if bool then "true" else "false"
IntProp int -> showText int
FloatProp float -> showText float
IntProp int -> show int
FloatProp float -> show float
-- | here since Unit is sometimes used as dummy type
instance PrettyPrint () where
......@@ -63,13 +61,13 @@ instance PrettyPrint a => PrettyPrint [a] where
prettyprint = T.intercalate ", " . fmap prettyprint
printPretty :: PrettyPrint a => a -> IO ()
printPretty = putStr . T.unpack . prettyprint
printPretty = putStr . toString . prettyprint
-- | for long lists which shouldn't be printed out in their entirety
ellipsis :: Int -> [Text] -> Text
ellipsis i texts
| i < l = prettyprint (take i texts) <> " ... (and " <> showText (l-i) <> " more)"
| i < l = prettyprint (take i texts) <> " ... (and " <> show (l-i) <> " more)"
| otherwise = prettyprint texts
where l = length texts
......
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE ScopedTypeVariables #-}
-- | Module for writing an already linted map Repository back out again.
module WriteRepo where
module WriteRepo (writeAdjustedRepository) where
import Universum
import CheckDir (DirResult (..), resultIsFatal)
import CheckMap (MapResult (..))
import Control.Monad (forM_, unless)
import Control.Monad.Extra (ifM)
import CheckMap (MapResult (..), ResultKind (..))
import Data.Aeson (encodeFile)
import Data.Map.Strict (toList)
import Data.Maybe (mapMaybe)
import Data.Set (Set)
import qualified Data.Set as S
import LintConfig (LintConfig (configDontCopyAssets),
LintConfig')
......@@ -26,8 +24,8 @@ import System.FilePath.Posix ((</>))
import Types (Dep (Local))
writeAdjustedRepository :: LintConfig' -> FilePath -> FilePath -> DirResult -> IO ExitCode
-- TODO: make this return a custom error type, not an exitcode
writeAdjustedRepository :: LintConfig' -> FilePath -> FilePath -> DirResult Full -> IO ExitCode
writeAdjustedRepository config inPath outPath result
| resultIsFatal config result =
pure (ExitFailure 1)
......@@ -36,7 +34,7 @@ writeAdjustedRepository config inPath outPath result
createDirectoryIfMissing True outPath
-- write out all maps
forM_ (toList $ dirresultMaps result) $ \(path,out) -> do
forM_ (toPairs $ dirresultMaps result) $ \(path,out) -> do
createDirectoryIfMissing True (takeDirectory (outPath </> path))
encodeFile (outPath </> path) $ mapresultAdjusted out
......@@ -51,7 +49,7 @@ writeAdjustedRepository config inPath outPath result
Local path -> Just . normalise mapdir $ path
_ -> Nothing)
$ mapresultDepends mapresult)
. toList $ dirresultMaps result
. toPairs $ dirresultMaps result
-- copy all assets
forM_ localdeps $ \path ->
......
{
"haskellNix": {
"branch": "master",
"description": "Alternative Haskell Infrastructure for Nixpkgs",
"homepage": "https://input-output-hk.github.io/haskell.nix",
"owner": "input-output-hk",
"repo": "haskell.nix",
"rev": "659b73698e06c02cc0f3029383bd383c8acdbe98",
"sha256": "0i91iwa11sq0v82v0zl82npnb4qqfm71y7gn3giyaixslm73kspk",
"type": "tarball",
"url": "https://github.com/input-output-hk/haskell.nix/archive/659b73698e06c02cc0f3029383bd383c8acdbe98.tar.gz",
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
},
"niv": {
"branch": "master",
"description": "Easy dependency management for Nix projects",
......
name: walint
version: 0.1
homepage: https://stuebinm.eu/git/walint
# TODO: license
author: stuebinm
maintainer: stuebinm@disroot.org
copyright: 2022 stuebinm
ghc-options: -Wall -Wno-name-shadowing -Wno-unticked-promoted-constructors
default-extensions: NoImplicitPrelude
dependencies:
- base
- universum
- aeson
- bytestring
- text
internal-libraries:
tiled:
source-dirs: 'tiled'
dependencies:
- vector
exposed-modules:
- Data.Tiled
- Data.Tiled.Abstract
library:
source-dirs: 'lib'
dependencies:
- containers
- tiled
- text
- vector
- transformers
- either
- filepath
- getopt-generics
- regex-tdfa
- extra
- deepseq
- dotgen
- text-metrics
- uri-encode
- network-uri
exposed-modules:
- CheckDir
- CheckMap
- WriteRepo
- Util
- Types
- LintConfig
executables:
walint:
main: Main.hs
source-dirs: 'src'
dependencies:
- walint
- getopt-generics
- aeson-pretty
- template-haskell
- process
cwality-maps:
main: Main.hs
source-dirs: 'cwality-maps'
ghc-options: -rtsopts -threaded
dependencies:
- tiled
- servant
- servant-server
- wai
- wai-extra
- warp
- monad-logger
- fmt
- tomland
- microlens-platform
- directory
- filepath
- containers
- base64
- parsec
- mustache
walint-mapserver:
main: Main.hs
source-dirs: 'server'
ghc-options: -rtsopts -threaded
dependencies:
- walint
- containers
- base-compat
- time
- directory
- filepath
- warp
- wai
- wai-extra
- monad-logger
- lucid
- servant
- servant-server
- servant-client
- servant-lucid
- servant-websockets
- http-types
- http-client
- websockets
- process
- extra
- microlens-platform
- fmt
- tomland
- stm
- getopt-generics
- async
- cryptohash-sha1
- uuid
- base64-bytestring
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ExplicitForAll #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
module Handlers (
-- , submitImpl
statusImpl
-- , relintImpl
, stateImpl
, AdminOverview(..)
, MapService(..),relintImpl,realtimeImpl) where
import Universum
import CheckDir (DirResult (dirresultMaps))
import CheckMap (MapResult (MapResult, mapresultBadges))
import Control.Concurrent.STM (TQueue, dupTChan, readTChan,
writeTQueue)
import Data.Aeson (ToJSON (..), (.=))
import qualified Data.Aeson as A
import qualified Data.Aeson.Key as A
import Data.Coerce (coerce)
import qualified Data.Map as M
import Network.WebSockets (PendingConnection, acceptRequest,
rejectRequest, sendTextData,
withPingThread)
import Servant (Handler, err404, throwError)
import Server (JobStatus (..), Org (orgUrl),
RemoteRef (reponame), ServerState,
Sha1, getJobStatus,
unState, adjustedWebPath)
import Worker (Job (Job))
-- | an info type wrapped around the server state, to carry serialisation instances.
newtype AdminOverview =
AdminOverview { unAdminOverview :: ServerState }
newtype MapService =
MapService { unMapService :: ServerState }
instance ToJSON MapService where
toJSON (MapService state) =
toJSON . map orgObject $ view unState state
where
orgObject (org, statuses) =
A.object
. mapMaybe worldObject
$ M.elems statuses
where
worldObject (remote, _current, result) = case result of
Just (Linted res rev _) ->
Just (A.fromText (reponame remote) .=
M.mapWithKey (mapInfo rev) (dirresultMaps res))
_ -> Nothing
mapInfo rev mappath MapResult { .. } = A.object
[ "badges" .= mapresultBadges
-- TODO: type-safe url library for adding the slash?
, "url" .= (orgUrl org <> adjustedWebPath rev org <> "/" <> toText mappath) ]
statusImpl :: MVar ServerState -> Text -> Sha1 -> Handler (Org True, RemoteRef, JobStatus, Maybe JobStatus)
statusImpl state orgslug sha1 = do
status <- liftIO $ getJobStatus state orgslug sha1
case status of
Just stuff -> pure stuff
Nothing -> throwError err404
-- | since there are multiple apis that just get state information …
stateImpl
:: forall s
. Coercible s ServerState
=> MVar ServerState
-> Handler s
stateImpl state = readMVar state <&> coerce
relintImpl :: TQueue Job -> MVar ServerState -> Text -> Sha1 -> Handler Text
relintImpl queue state orgslug sha1 =
liftIO $ getJobStatus state orgslug sha1 >>= \case
Nothing -> pure "there isn't a job here to restart"
Just (org, ref, _oldjob, _veryoldjob) -> do
atomically $ writeTQueue queue (Job ref org)
pure "hello"
realtimeImpl :: MVar ServerState -> Text -> Sha1 -> PendingConnection -> Handler ()
realtimeImpl state orgslug sha1 pending =
liftIO (getJobStatus state orgslug sha1) >>= \case
Just (_org, _ref, Linted _ _ (_, realtime), _) -> do
conn <- liftIO $ acceptRequest pending
incoming <- atomically $ dupTChan realtime
liftIO $ withPingThread conn 30 pass $ forever $ do
next <- atomically $ readTChan incoming
sendTextData conn (A.encode next)
_ -> liftIO $ rejectRequest pending "no!"
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
-- the ToHtml class also provides a method without escaping which we don't use,
-- so it's safe to never define it
{-# OPTIONS_GHC -Wno-missing-methods #-}
{-# OPTIONS_GHC -Wno-orphans #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
-- | Module containing orphan instances of Lucid's ToHtml, used for rendering
-- linter results as html
module HtmlOrphans () where
import Universum
import CheckDir (DirResult (..), MissingAsset (MissingAsset),
MissingDep (..), maximumLintLevel)
import CheckMap (MapResult (..))
import Data.List.Extra (escapeJSON)
import qualified Data.Map as M
import qualified Data.Text as T
import Handlers (AdminOverview (..))
import Lucid (HtmlT, ToHtml)
import Lucid.Base (ToHtml (toHtml))
import Lucid.Html5 (a_, body_, button_, class_, code_, disabled_,
div_, em_, h1_, h2_, h3_, h4_, h5_, head_,
href_, html_, id_, li_, link_, main_,
onclick_, p_, rel_, script_, span_, src_,
title_, type_, ul_)
import Server (JobStatus (..),
Org (Org, orgBacklinkPrefix, orgContactMail, orgHowtoLink, orgSlug),
RemoteRef (RemoteRef, reponame, reporef, repourl),
prettySha, unState)
import Types (Hint (Hint), Level (..))
import Fmt
mono :: Monad m => HtmlT m () -> HtmlT m ()
mono = code_ [class_ "small text-muted"]
htmldoc :: Monad m => HtmlT m () -> HtmlT m ()
htmldoc inner = html_ $ do
head_ $ do
title_ "Job Status"
link_ [rel_ "stylesheet", type_ "text/css", href_ "/bootstrap.min.css" ]
link_ [rel_ "stylesheet", type_ "text/css", href_ "/style.css" ]
body_ $ main_ [class_ "main-content"] inner
instance ToHtml (Org True, RemoteRef, JobStatus, Maybe JobStatus) where
toHtml (org@Org{..}, ref@RemoteRef{..}, status, published) = htmldoc $ case status of
Pending _ -> do
h1_ "Pending …"
autoReloadScript
Linted res rev (pending, _) -> do
h1_ $ do
"Linter Result"
if pending
then button_ [class_ "btn btn-primary btn-disabled", disabled_ "true"] "pending …"
else button_ [onclick_ "relint()", class_ "btn btn-primary", id_ "relint_button"] "Relint"
whenJust orgHowtoLink $ \link ->
a_ [class_ "btn btn-primary", href_ link] "Howto"
a_ [class_ "btn btn-primary"
, href_ ("mailto:" <> orgContactMail <> "?subject=[Help-walint] " <> reponame <> " " <> rev)]
"Help?"
p_ $ do
"For commit "; code_ (toHtml $ T.take 7 rev); " of repository "
code_ (toHtml repourl); " (on "; code_ (toHtml reporef); ")"
p_ $ case published of
Just (Linted _ rev _) ->
do "Currently published commit: "; code_ (toHtml $ T.take 7 rev); "."
_ -> "This Map has not yet been published."
toHtml (org,ref,res)
script_
"function relint() {\n\
\ var xhr = new XMLHttpRequest ();\n\
\ xhr.open('POST', 'relint', true);\n\
\ xhr.onreadystatechange = (e) => {if (xhr.status == 200) {\n\
\ console.log(e);\n\
\ }}\n\
\ xhr.send(null);\n\
\}"
autoReloadScript
Failed err -> do
h1_ "System Error"
p_ $ "error: " <> toHtml err
p_ "you should probably ping an admin about this or sth"
where
autoReloadScript = script_
"let proto = window.location.protocol === 'https://' ? 'wss' : 'ws://';\
\let ws = new WebSocket(proto + window.location.host + window.location.pathname + 'realtime');\n\
\ws.onmessage = (event) => {\n\
\ let resp = JSON.parse(event.data);\n\
\ if (resp == 'RelintPending') {\n\
\ let btn = document.getElementById('relint_button');\n\
\ btn.innerText = 'pending …';\n\
\ btn.disabled = true;\n\
\ btn.class = 'btn btn-disabled';\n\
\ } else if (resp == 'Reload') {\n\
\ location.reload();\n\
\ }\n\
\}"
instance ToHtml AdminOverview where
toHtml (AdminOverview state) = htmldoc $ do
h1_ "Map List"
forM_ (view unState state) $ \(org, jobs) -> do
h2_ (toHtml $ orgSlug org)
if null jobs then em_ "(nothing yet)"
else flip M.foldMapWithKey jobs $ \sha1 (ref, status, _lastvalid) -> li_ $ do
case status of
Pending _ -> badge Info "pending"
(Linted res rev _) -> toHtml $ maximumLintLevel res
(Failed _) -> badge Error "system error"
" "; a_ [href_ ("/status/"+|orgSlug org|+"/"+|prettySha sha1|+"/")] $ do
mono $ toHtml $ reporef ref; " on "; mono $ toHtml $ repourl ref
badge :: Monad m => Level -> HtmlT m () -> HtmlT m ()
badge level = span_ [class_ badgetype]
where badgetype = case level of
Info -> "badge badge-info"
Suggestion -> "badge badge-info"
Warning -> "badge badge-warning"
Forbidden -> "badge badge-danger"
Error -> "badge badge-danger"
Fatal -> "badge badge-danger"
-- | pseudo-level badge when we don't even have an info lint
-- (rare, but it does happen!)
badgeHurray :: Monad m => HtmlT m() -> HtmlT m ()
badgeHurray = span_ [class_ "badge badge-success"]
-- | Lint Levels directly render into badges
instance ToHtml Level where
toHtml level = do badge level (show level); " "
-- | Hints are just text with a level
instance ToHtml Hint where
toHtml (Hint level msg) = do
toHtml level; " "; toHtml msg
headerText :: Monad m => Level -> HtmlT m ()
headerText = \case
Info ->
"Couldn't find a thing to complain about. Congratulations!"
Suggestion ->
"There's a couple smaller nitpicks; maybe take a look at those? \
\But overall the map looks great!"
Warning ->
"The map is fine, but some things look like they might be mistakes; \
\perhaps you want to take a look at those?"
Forbidden ->
"While this map might work well with workadventure, it contains \
\things that are not allowed at this event. Please change those \
\so we can publish the map"
Error ->
"Your map currently contains errors. You will have to fix those before \
\we can publish your map."
Fatal ->
"Something broke while linting; if you're not sure why or how to make \
\it work, feel free to tell an admin about it."
-- | The fully monky
instance ToHtml (Org True, RemoteRef, DirResult a) where
toHtml (Org {..}, RemoteRef {..}, res@DirResult { .. }) = do
p_ $ do badge maxlevel "Linted:"; " "; headerText maxlevel
h2_ "Exits"
p_ $ do
"Note: to link back to the lobby, please use "
code_ $ toHtml $ orgBacklinkPrefix <> reponame
" as exitUrl."
-- the exit graph thing
script_ [ src_ "/dot-wasm.js" ] (""::Text)
script_ [ src_ "/d3.js" ] (""::Text)
script_ [ src_ "/d3-graphviz.js" ] (""::Text)
div_ [ id_ "exitGraph" ] ""
script_ $
"\
\d3.select(\"#exitGraph\")\n\
\ .graphviz().engine(\"fdp\")\n\
\ .dot(\"" <> toText (escapeJSON $ toString dirresultGraph) <> "\")\n\
\ .render()\n\
\"
unless (null dirresultDeps) $ ul_ $
forM_ dirresultDeps $ \missing -> do
li_ $ do
-- TODO: the whole Maybe Bool thing is annoying; I think that was a
-- remnant of talking to python stuff and can probably be removed?
if depFatal missing == Just True
then do { toHtml Error; "Map " }
else do { toHtml Warning; "Entrypoint " }
code_ $ toHtml (entrypoint missing)
" does not exist"
unless (depFatal missing /= Just True) $ do
" (no layer with that name is a "; mono "startLayer"; ")"
", but is used as "; mono "exitUrl"; " in "
placeList (neededBy missing); "."
unless (null dirresultMissingAssets) $ do
h2_ [class_ "border-bottom"] "Assets"
ul_ $ forM_ dirresultMissingAssets $
\(MissingAsset MissingDep { .. }) -> li_ $ do
toHtml Error; "File "; mono $ toHtml entrypoint
" does not exist, but is referenced in "; placeList neededBy; ")"
unless (null dirresultMaps) $ do
h2_ "Maps"
flip M.foldMapWithKey dirresultMaps $ \name MapResult { .. } -> do
h3_ (toHtml name)
if null mapresultGeneral && null mapresultLayer && null mapresultTileset
then ul_ $ li_ $ badgeHurray "All good!"
else do
ul_ $ forM_ mapresultGeneral $ \lint ->
li_ (toHtml lint)
unless (null mapresultLayer) $ do
h4_ "Layers"
ul_ (listMapWithKey mapresultLayer)
unless (null mapresultTileset) $ do
h4_ "Tilesets"
ul_ (listMapWithKey mapresultTileset)
where
maxlevel = maximumLintLevel res
placeList :: (Monad m, ToHtml a) => [a] -> HtmlT m ()
placeList occurances =
sequence_ . intersperse ", " $ occurances <&> \place ->
code_ [class_ "small text-muted"] (toHtml place)
listMapWithKey map =
flip M.foldMapWithKey map $ \lint places ->
li_ $ do toHtml lint; " (in "; placeList places; ")"
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
-- | simple server offering linting "as a service"
module Main where
import Universum
import Control.Concurrent (threadDelay)
import Control.Concurrent.Async (async, link, waitEither_)
import Control.Concurrent.STM.TQueue (TQueue, newTQueueIO,
writeTQueue)
import qualified Data.Text as T
import Fmt ((+|), (|+))
import Handlers (AdminOverview (AdminOverview),
MapService (MapService),
realtimeImpl, relintImpl,
stateImpl, statusImpl)
import HtmlOrphans ()
import Network.HTTP.Client (defaultManagerSettings,
newManager)
import Network.Wai.Handler.Warp (defaultSettings,
runSettings, setPort)
import Network.Wai.Middleware.Gzip (def)
import Network.Wai.Middleware.RequestLogger (OutputFormat (..),
RequestLoggerSettings (..),
mkRequestLogger)
import Servant (Application, Capture,
Get, JSON, PlainText,
Post, Raw, ReqBody,
Server, serve,
type (:<|>) (..),
type (:>))
import Servant.HTML.Lucid (HTML)
import Servant.Server.StaticFiles (serveDirectoryWebApp)
import Server (CliOptions (..),
JobStatus, Org (..),
RemoteRef, ServerState,
Sha1, emptyState,
exneuland, interval,
loadConfig, orgs, port,
token, verbose)
import Worker (Job (Job), linterThread)
import Control.Monad.Logger (logInfoN,
runStdoutLoggingT)
import Servant.API (Header)
import Servant.API.WebSocket (WebSocketPending)
import Servant.Client (ClientM, client,
mkClientEnv, runClientM)
import WithCli (withCli)
type family PolyEndpoint method format payload where
PolyEndpoint Get format payload =
Get format payload
PolyEndpoint Post format payload =
Header "Auth" Text :> ReqBody format payload :> Post '[PlainText] Text
type MapServiceAPI method =
"api" :> "maps" :> "list" :> PolyEndpoint method '[JSON] MapService
-- | abstract api
type API format =
"status" :> Capture "org" Text :> Capture "jobid" Sha1 :> Get '[format] (Org True, RemoteRef, JobStatus, Maybe JobStatus)
:<|> "status" :> Capture "org" Text :> Capture "jobid" Sha1 :> "relint" :> Post '[format] Text
:<|> "status" :> Capture "org" Text :> Capture "jobid" Sha1 :> "realtime" :> WebSocketPending
:<|> "admin" :> "overview" :> Get '[format] AdminOverview
-- | actual set of routes: api for json & html + static pages from disk
type Routes = -- "api" :> API JSON
MapServiceAPI Get
:<|> API HTML -- websites mirror the API exactly
:<|> Raw
-- | API's implementation
jsonAPI :: forall format. TQueue Job -> MVar ServerState -> Server (API format)
jsonAPI queue state = statusImpl state
:<|> relintImpl queue state
:<|> realtimeImpl state
:<|> stateImpl @AdminOverview state
-- | Complete set of routes: API + HTML sites
server :: TQueue Job -> MVar ServerState -> Server Routes
server queue state = -- jsonAPI @JSON queue state
stateImpl @MapService state
:<|> jsonAPI @HTML queue state
:<|> serveDirectoryWebApp "./static"
app :: TQueue Job -> MVar ServerState -> Application
app queue = serve (Proxy @Routes) . server queue
postNewMaps :: Maybe Text -> MapService -> ClientM Text
postNewMaps = client (Proxy @(MapServiceAPI Post))
main :: IO ()
main = withCli $ \CliOptions {..} -> do
config <- loadConfig (fromMaybe "./config.toml" config)
state <- newMVar (emptyState config)
queue :: TQueue Job <- newTQueueIO
loggerMiddleware <- mkRequestLogger
$ def { outputFormat = Detailed (view verbose config) }
putTextLn "reading config …"
putTextLn $ T.concat $ map showInfo (view orgs config)
-- periodically ‘pokes’ jobs to re-lint each repo
poker <- async $ forever $ do
atomically $ forM_ (view orgs config) $ \org ->
forM_ (orgRepos org) $ \repo ->
writeTQueue queue (Job repo org)
-- microseconds for some reason
threadDelay (view interval config * 1000000)
-- TODO: what about tls / https?
unless offline $ whenJust (view exneuland config) $ \baseurl -> do
manager' <- newManager defaultManagerSettings
updater <- async $ runStdoutLoggingT $ forever $ do
done <- readMVar state
res <- liftIO $ runClientM
(postNewMaps (view token config) (MapService done))
(mkClientEnv manager' baseurl)
logInfoN $ "exneuland maps POST request: " <> show res
liftIO $ threadDelay (view interval config * 1000000)
link updater
-- spawns threads for each job in the queue
linter <- async $ void $ linterThread offline config queue state
link linter
link poker
let warpsettings =
setPort (view port config)
defaultSettings
putTextLn $ "starting server on port " <> show (view port config)
runSettings warpsettings
. loggerMiddleware
$ app queue state
waitEither_ linter poker
where
showInfo org =
"→ org "+|orgSlug org|+" ("+|length (orgRepos org)|+" repositories)\n" :: Text
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE ExplicitForAll #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
module Server ( loadConfig
, Org(..)
, Sha1, toSha
, Config, tmpdir, port, verbose, orgs, interval, exneuland, token
, CliOptions(..)
, OfflineException
, RemoteRef(..)
, ServerState, emptyState, unState
, JobStatus(..)
, prettySha,getJobStatus,overJobStatus
, adjustedPath,RealtimeMsg(..),newRealtimeChannel,adjustedWebPath) where
import Universum
import CheckDir (DirResult)
import CheckMap (ResultKind (Shrunk))
import Control.Arrow ((>>>))
import Control.Concurrent (modifyMVar, withMVar)
import Control.Concurrent.STM.TChan (TChan, newBroadcastTChan)
import Crypto.Hash.SHA1 (hash)
import Data.Aeson (FromJSON, ToJSON, ToJSONKey (..),
eitherDecodeFileStrict')
import qualified Data.Aeson as A
import qualified Data.ByteString.Base64.URL as Base64
import Data.Coerce (coerce)
import Data.Either.Extra (mapLeft)
import Data.Functor.Contravariant (contramap)
import qualified Data.Map.Strict as M
import Lens.Micro.Platform (at, ix, makeLenses, traverseOf)
import LintConfig (ConfigKind (..), LintConfig,
feedConfig)
import Servant (FromHttpApiData)
import Servant.Client (BaseUrl, parseBaseUrl)
import qualified Text.Show as TS
import Toml (BiMap (BiMap), TomlBiMap,
TomlBiMapError (ArbitraryError),
TomlCodec,
prettyTomlDecodeErrors, (.=))
import qualified Toml as T
import WithCli (HasArguments)
-- | a reference in a remote git repository
data RemoteRef = RemoteRef
{ repourl :: Text
, reporef :: Text
, reponame :: Text
-- ^ the "world name" for the hub / world:// links
} deriving (Generic, FromJSON, ToJSON, Eq, Ord, Show, NFData)
type family ConfigRes (b :: Bool) a where
ConfigRes True a = a
ConfigRes False a = FilePath
-- | the internal text is actually already base64-encoded
newtype Sha1 = Sha1 Text
deriving newtype (Eq, Show, Ord, FromHttpApiData, ToJSON, NFData)
-- | base64-encoded sha1
prettySha :: Sha1 -> Text
prettySha (Sha1 text) = text
instance ToJSONKey Sha1
toSha :: RemoteRef -> Sha1
toSha ref = Sha1
. decodeUtf8
. Base64.encode
. hash
. encodeUtf8
$ (show ref :: Text)
data Org (loaded :: Bool) = Org
{ orgSlug :: Text
, orgLintconfig :: ConfigRes loaded (LintConfig Skeleton)
, orgEntrypoint :: FilePath
, orgGeneration :: Int
, orgRepos :: [RemoteRef]
, orgUrl :: Text
, orgWebdir :: Text
, orgBacklinkPrefix :: Text
, orgContactMail :: Text
, orgHowtoLink :: Maybe Text
} deriving (Generic)
instance NFData (LintConfig Skeleton) => NFData (Org True)
deriving instance Show (LintConfig Skeleton) => Show (Org True)
-- | Orgs are compared via their slugs only
-- TODO: the server should probably refuse to start if two orgs have the
-- same slug … (or really the toml format shouldn't allow that syntactically)
instance Eq (Org True) where
a == b = orgSlug a == orgSlug b
instance Ord (Org True) where
a <= b = orgSlug a <= orgSlug b
-- this instance exists since it's required for ToJSONKey,
-- but it shouldn't really be used
instance ToJSON (Org True) where
toJSON Org { .. } = A.object [ "slug" A..= orgSlug ]
-- orgs used as keys just reduce to their slug
instance ToJSONKey (Org True) where
toJSONKey = contramap orgSlug (toJSONKey @Text)
-- | the server's configuration
data Config (loaded :: Bool) = Config
{ _tmpdir :: FilePath
-- ^ dir to clone git things in
, _port :: Int
, _verbose :: Bool
, _interval :: Int
-- ^ port to bind to
, _exneuland :: Maybe BaseUrl
, _token :: Maybe Text
, _orgs :: [Org loaded]
} deriving Generic
makeLenses ''Config
data CliOptions = CliOptions
{ offline :: Bool
, config :: Maybe FilePath
} deriving (Show, Generic, HasArguments)
data OfflineException = OfflineException
deriving (Show, Exception)
remoteCodec :: TomlCodec RemoteRef
remoteCodec = RemoteRef
<$> T.text "url" .= repourl
<*> T.text "ref" .= reporef
<*> T.text "name" .= reponame
orgCodec :: TomlCodec (Org False)
orgCodec = Org
<$> T.text "slug" .= orgSlug
<*> T.string "lintconfig" .= orgLintconfig
<*> T.string "entrypoint" .= orgEntrypoint
<*> T.int "generation" .= orgGeneration
<*> T.list remoteCodec "repo" .= orgRepos
<*> T.text "url" .= orgUrl
<*> T.text "webdir" .= orgWebdir
<*> T.text "backlink_prefix" .= orgBacklinkPrefix
<*> T.text "contact_mail" .= orgContactMail
<*> coerce (T.first T.text "howto_link") .= orgHowtoLink
-- why exactly does everything in tomland need to be invertable
urlBimap :: TomlBiMap BaseUrl String
urlBimap = BiMap
(Right . show)
(mapLeft (ArbitraryError . show) . parseBaseUrl)
configCodec :: TomlCodec (Config False)
configCodec = Config
<$> T.string "tmpdir" .= _tmpdir
<*> T.int "port" .= _port
<*> T.bool "verbose" .= _verbose
<*> T.int "interval" .= _interval
<*> coerce (T.first (T.match (urlBimap >>> T._String)) "exneuland") .= _exneuland
-- First is just Maybe but with different semantics
<*> coerce (T.first T.text "token") .= _token
<*> T.list orgCodec "org" .= _orgs
-- | loads a config, along with all things linked in it
-- (e.g. linterconfigs for each org)
loadConfig :: FilePath -> IO (Config True)
loadConfig path = do
res <- T.decodeFileEither configCodec path
case res of
Right config -> traverseOf orgs (mapM loadOrg) config
Left err -> error $ prettyTomlDecodeErrors err
where
loadOrg :: Org False -> IO (Org True)
loadOrg org@Org{..} = do
lintconfig <-
eitherDecodeFileStrict' orgLintconfig >>= \case
Right (c :: LintConfig Basic) -> pure c
Left err -> error $ show err
pure $ org { orgLintconfig =
feedConfig lintconfig (map reponame orgRepos) orgSlug }
data RealtimeMsg = RelintPending | Reload
deriving (Generic, ToJSON)
type RealtimeChannel = TChan RealtimeMsg
-- | a job status (of a specific uuid)
data JobStatus
= Pending RealtimeChannel
| Linted !(DirResult Shrunk) Text (Bool, RealtimeChannel)
| Failed Text
-- deriving (Generic, ToJSON, NFData)
instance TS.Show JobStatus where
show = \case
Pending _ -> "Pending"
Linted res rev _ -> "Linted result"
Failed err -> "Failed with: " <> show err
-- | the server's global state; might eventually end up with more
-- stuff in here, hence the newtype
newtype ServerState = ServerState
{ _unState :: Map Text (Org True, Map Sha1 (RemoteRef, JobStatus, Maybe JobStatus)) }
deriving Generic
-- instance NFData LintConfig' => NFData ServerState
makeLenses ''ServerState
-- | the inital state must already contain empty orgs, since setJobStatus
-- will default to a noop otherwise
emptyState :: Config True -> ServerState
emptyState config = ServerState
$ M.fromList $ map (\org -> (orgSlug org, (org, mempty))) (view orgs config)
-- | NOTE: this does not create the org if it does not yet exist!
overJobStatus
:: MVar ServerState
-> Org True
-> RemoteRef
-> (Maybe (RemoteRef, JobStatus, Maybe JobStatus) ->
Maybe (RemoteRef, JobStatus, Maybe JobStatus))
-> IO (Maybe (RemoteRef, JobStatus, Maybe JobStatus))
overJobStatus mvar !org !ref overState = do
modifyMVar mvar $ \state -> do
-- will otherwise cause a thunk leak, since Data.Map is annoyingly un-strict
-- even in its strict variety. for some reason it also doesn't work when
-- moved inside the `over` though …
bla <- evaluateWHNF (view (unState . ix (orgSlug org) . _2) state)
let thing = state & (unState . ix (orgSlug org) . _2 . at (toSha ref)) %~ overState
pure (thing, view (at (toSha ref)) bla)
getJobStatus
:: MVar ServerState
-> Text
-> Sha1
-> IO (Maybe (Org True, RemoteRef, JobStatus, Maybe JobStatus))
getJobStatus mvar orgslug sha = withMVar mvar $ \state -> pure $ do
(org, jobs) <- view (unState . at orgslug) state
(ref, status, rev) <- M.lookup sha jobs
Just (org, ref, status, rev)
-- | the path (relative to a baseurl / webdir) where an adjusted
-- map should go
adjustedPath :: Text -> Org True -> Text -- TODO: filepath library using Text?
adjustedPath rev org@Org {..} =
orgWebdir <> "/" <> adjustedWebPath rev org
adjustedWebPath :: Text -> Org True -> Text
adjustedWebPath rev Org {..} =
rev <> show orgGeneration
newRealtimeChannel :: IO RealtimeChannel
newRealtimeChannel = atomically newBroadcastTChan
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -Wno-deferred-out-of-scope-variables #-}
module Worker (linterThread, Job(..)) where
import Universum
import CheckDir (recursiveCheckDir,
resultIsFatal, shrinkDirResult)
import Control.Concurrent.Async (async, link)
import Control.Concurrent.STM (writeTChan)
import Control.Concurrent.STM.TQueue
import Control.Exception (IOException, handle, throw)
import Control.Monad.Logger (logError, logErrorN, logInfoN,
runStdoutLoggingT)
import qualified Data.Text as T
import qualified Data.UUID as UUID
import qualified Data.UUID.V4 as UUID
import Fmt ((+|), (|+))
import GHC.IO.Exception (ioException)
import LintConfig (stuffConfig)
import Server (Config, JobStatus (..),
Org (..),
RealtimeMsg (RelintPending, Reload),
RemoteRef (..), ServerState,
adjustedPath,
newRealtimeChannel,
overJobStatus, tmpdir)
import System.Directory (doesDirectoryExist)
import System.Exit (ExitCode (ExitFailure, ExitSuccess))
import System.FilePath ((</>))
import System.Process
import WriteRepo (writeAdjustedRepository)
data Job = Job
{ jobRef :: RemoteRef
, jobOrg :: Org True
}
linterThread :: Bool -> Config True -> TQueue Job -> MVar ServerState -> IO Void
linterThread offline config queue done = forever $ do
next <- atomically (readTQueue queue)
-- TODO: this doesn't guard against two jobs running on the same repo!
job <- async $ runJob offline config next done
-- TODO: is this a good idea? will crash the server if a job thread fails
link job
-- | the actual check function. Calls out to git to update the
-- repository, create a new worktree, lints it, then tells git to
-- delete that tree again.
--
-- May occasionally be brittle (if someone else changed files)
-- TODO: re-add proper fancy (colourful?) logging
runJob :: Bool -> Config True -> Job -> MVar ServerState -> IO ()
runJob offline config Job {..} done = do
rand <- UUID.nextRandom
let workdir = "/tmp" </> ("worktree-" <> UUID.toString rand)
handle whoops
$ finally (lint workdir) (cleanup workdir)
where
lintConfig = stuffConfig (orgLintconfig jobOrg) (reponame jobRef)
lint workdir = runStdoutLoggingT $ do
-- set the "is being linted" flag in the assembly's state
-- (to show on the site even after reloads etc.)
oldstate <- liftIO $ overJobStatus done jobOrg jobRef $ \case
Just (ref, Linted res rev (_, realtime), oldstatus) ->
Just (ref, Linted res rev (True, realtime), oldstatus)
a -> a
-- send an update message to all connected websocket clients
maybeRealtime <- case oldstate of
Just (_, Linted _ _ (_, realtime), _) -> do
atomically $ writeTChan realtime RelintPending
pure (Just realtime)
_ -> pure Nothing
-- TODO: these calls fail for dumb http, add some fallback!
liftIO (doesDirectoryExist gitdir) >>= \case
False | offline -> logErrorN $ "offline mode but not cached; linting "
<> show gitdir <> " will fail"
| otherwise ->
(liftIO $ callProcess "git"
[ "clone", toString url, "--bare"
, "--depth", "1", "-b", toString ref, gitdir])
True | offline -> logInfoN $ "offline mode: not updating " <> show gitdir
| otherwise ->
(liftIO $ callgit gitdir
[ "fetch", "origin", toString (ref <> ":" <> ref) ])
rev <- map T.strip -- git returns a newline here
$ readgit' gitdir ["rev-parse", toString ref]
let outPath = adjustedPath rev jobOrg
callgit gitdir [ "worktree", "add", "--force", workdir, toString ref ]
res <- liftIO $ recursiveCheckDir lintConfig workdir (orgEntrypoint jobOrg)
>>= evaluateNF
liftIO (writeAdjustedRepository lintConfig workdir (toString outPath) res)
>>= \case
ExitSuccess ->
logInfoN $ "linted map "+| (show jobRef :: Text) |+"."
ExitFailure 1 ->
logInfoN $ "linted map "+| (show jobRef :: Text) |+ ", which failed."
ExitFailure 2 ->
-- TODO: shouldn't have linted this map at all
logErrorN $ "outpath "+|outPath|+" already exists!"
ExitFailure _ ->
-- writeAdjustedRepository does not return other codes
$(logError) "wtf, this is impossible"
realtime <- case maybeRealtime of
Just realtime -> do
atomically $ writeTChan realtime Reload
pure realtime
Nothing ->
liftIO newRealtimeChannel
-- the fact that `realtime` can't be defined in here is horrifying
void $ liftIO $ overJobStatus done jobOrg jobRef $ \maybeOld ->
let status = Linted (shrinkDirResult res) rev (False, realtime)
lastvalid = case maybeOld of
Just (_,_,lastvalid) -> lastvalid
Nothing -> Nothing
in Just ( jobRef
, status
, if resultIsFatal lintConfig res
then lastvalid
else Just status
)
cleanup workdir = do
callgit gitdir [ "worktree", "remove", "-f", "-f", workdir ]
whoops (error :: IOException) = runStdoutLoggingT $ do
logErrorN (show error)
void $ liftIO $ overJobStatus done jobOrg jobRef $ \case
Nothing -> Just (jobRef, Failed (show error), Nothing)
Just (_,_,lastvalid) -> Just (jobRef, Failed (show error), lastvalid)
url = repourl jobRef
ref = reporef jobRef
gitdir = view tmpdir config </> toString hashedname
hashedname = T.map escapeSlash url
where escapeSlash = \case { '/' -> '-'; a -> a }
readgit' :: MonadIO m => FilePath -> [String] -> m Text
readgit' dir args = map toText $
liftIO $ do
print args
readProcess "git" ([ "-C", toString dir ] <> args) ""
callgit :: MonadIO m => FilePath -> [String] -> m ()
callgit dir args =
liftIO $ do
print args
callProcess "git" ([ "-C", toString dir ] <> args)
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE MultiWayIf #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Main where
import Control.Monad (unless)
import Control.Monad.Identity (Identity)
import Data.Aeson (eitherDecode, encode)
import Universum
import Data.Aeson (eitherDecodeFileStrict', encode)
import Data.Aeson.Encode.Pretty (encodePretty)
import Data.Aeson.KeyMap (coercionToHashMap)
import qualified Data.ByteString.Lazy as LB
import Data.Maybe (fromMaybe)
import qualified Data.Text.Encoding as T
import qualified Data.Text.IO as T
import System.Exit (ExitCode (..), exitWith)
import WithCli
import WithCli (HasArguments, withCli)
import CheckDir (recursiveCheckDir, resultIsFatal, DirResult (dirresultGraph))
import Control.Monad (when)
import LintConfig (LintConfig (..), patchConfig)
import System.IO (hPutStrLn, stderr)
import CheckDir (recursiveCheckDir, resultIsFatal)
import LintConfig (ConfigKind (..), LintConfig (..),
patchConfig)
import System.Exit (ExitCode (ExitFailure))
import Types (Level (..))
import Util (printPretty)
import qualified Version as V (version)
import WriteRepo (writeAdjustedRepository)
import Text.Dot (showDot)
-- | the options this cli tool can take
data Options = Options
......@@ -45,7 +41,7 @@ data Options = Options
-- ^ path to write the (possibly adjusted) maps to after linting
, configFile :: Maybe FilePath
-- ^ path to a config file. Currently required.
, config :: Maybe (LintConfig Maybe)
, config :: Maybe (LintConfig Patch)
-- ^ a "patch" for the configuration file
, version :: Bool
, dot :: Bool
......@@ -56,52 +52,46 @@ main :: IO ()
main = withCli run
run :: Options -> IO ()
run options = do
run Options { .. } = do
aesonWarning
when (version options) $ do
if version then
putStrLn V.version
exitWith ExitSuccess
let repo = fromMaybe "." (repository options)
let entry = fromMaybe "main.json" (entrypoint options)
let level = fromMaybe Suggestion (lintlevel options)
lintconfig <- case configFile options of
Nothing -> error "Need a config file!"
Just path -> LB.readFile path >>= \res ->
case eitherDecode res :: Either String (LintConfig Identity) of
Left err -> error $ "config file invalid: " <> err
Right file -> pure (patchConfig file (config options))
lints <- recursiveCheckDir lintconfig repo entry
if | dot options ->
putStrLn (showDot $ dirresultGraph lints)
| json options ->
printLB
$ if pretty options then encodePretty lints else encode lints
| otherwise -> printPretty (level, lints)
case out options of
Nothing -> exitWith $ case resultIsFatal lintconfig lints of
False -> ExitSuccess
True -> ExitFailure 1
Just outpath -> do
c <- writeAdjustedRepository lintconfig repo outpath lints
unless (json options) $
case c of
ExitFailure 1 -> putStrLn "\nMap failed linting!"
ExitFailure 2 -> putStrLn "\nOutpath already exists, not writing anything."
_ -> pure ()
exitWith c
-- | haskell's many string types are FUN …
printLB :: LB.ByteString -> IO ()
printLB a = T.putStrLn $ T.decodeUtf8 $ LB.toStrict a
else do
let repo = fromMaybe "." repository
let entry = fromMaybe "main.json" entrypoint
let level = fromMaybe Suggestion lintlevel
configFile' <- case configFile of
Nothing -> do
hPutStrLn stderr ("option --config-file=FILEPATH required" :: Text)
exitFailure
Just path -> pure path
lintconfig <- eitherDecodeFileStrict' configFile' >>= \case
Left err -> error $ "config file invalid: " <> toText err
Right file -> pure (patchConfig file config)
lints <- recursiveCheckDir lintconfig repo entry
if json
then putText
$ decodeUtf8 (if pretty then encodePretty lints else encode lints)
else printPretty (level, lints)
case out of
Nothing
| resultIsFatal lintconfig lints -> exitWith (ExitFailure 1)
| otherwise -> exitSuccess
Just outpath -> do
c <- writeAdjustedRepository lintconfig repo outpath lints
unless json $
case c of
ExitFailure 1 ->
putTextLn "\nMap failed linting!"
ExitFailure 2 ->
putTextLn "\nOutpath already exists, not writing anything."
_ -> pass
exitWith c
-- if Aesons's internal map and HashMap are the same type, then coercionToHashMap
......@@ -112,10 +102,10 @@ printLB a = T.putStrLn $ T.decodeUtf8 $ LB.toStrict a
aesonWarning :: IO ()
aesonWarning = case coercionToHashMap of
Just _ -> hPutStrLn stderr
"Warning: this program was compiled using an older version of the Aeson Library\n\
("Warning: this program was compiled using an older version of the Aeson Library\n\
\used for parsing JSON, which is susceptible to hash flooding attacks.\n\
\n\
\Recompiling with a newer version is recommended when handling untrusted inputs.\n\
\n\
\See https://cs-syd.eu/posts/2021-09-11-json-vulnerability for details."
_ -> pure ()
\See https://cs-syd.eu/posts/2021-09-11-json-vulnerability for details." :: Text)
_ -> pass
......@@ -3,13 +3,15 @@
module Version ( version ) where
import Control.Monad.Trans (liftIO)
import Universum
import qualified Language.Haskell.TH as TH
import System.Process (readProcess)
version :: String
version = "walint rc3 2021 (" <>
version = "walint divoc bb3 2022 (" <>
$(do
hash <- liftIO $ readProcess "git" ["rev-parse", "HEAD"] ""
hash <- liftIO $ catchAny (readProcess "git" ["rev-parse", "HEAD"] "")
(\_ -> pure "[unknown]")
pure . TH.LitE . TH.StringL $ take 40 hash) ++
")"
# This file was automatically generated by 'stack init'
#
# Some commonly used options have been documented as comments in this file.
# For advanced use and comprehensive documentation of the format, please see:
# https://docs.haskellstack.org/en/stable/yaml_configuration/
# Resolver to choose a 'specific' stackage snapshot or a compiler version.
# A snapshot resolver dictates the compiler version and the set of packages
# to be used for project dependencies. For example:
#
# resolver: lts-3.5
# resolver: nightly-2015-09-21
# resolver: ghc-7.10.2
#
# The location of a snapshot can be provided as a file or url. Stack assumes
# a snapshot provided as a file might change, whereas a url resource does not.
#
# resolver: ./custom-snapshot.yaml
# resolver: https://example.com/snapshots/2018-01-01.yaml
resolver:
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/18/16.yaml
resolver: lts-18.25
# User packages to be built.
# Various formats can be used as shown in the example below.
......@@ -41,36 +21,27 @@ extra-deps:
- semialign-1.2.0.1@sha256:5efc30d6f53f8d2a8a26d9bf3a57c0f20f4ba3086797ccaa615f644abc21d42e,2814
- text-short-0.1.4@sha256:4f7a76e78baf391d262883007e8f8d8fb23a2805d56d9725d6abdf1428542e11,3575
- time-compat-1.9.6.1@sha256:381a2e8ed6e41d20ff5929d12d25c1d9337d459de5964ef1d90b06d115b31f07,5033
- HList-0.5.1.0@sha256:3ecb2d10ad2b3d36ad28e2f08505f9c3d7143ca737ef13b3e64db503635966c2,7525
- cli-extras-0.1.0.2@sha256:404552a3e5e844f332fcf74858999b9b9b6d5dcab6017a9d5a48868715a21468,1996
- logging-effect-1.3.12@sha256:72d168dd09887649ba9501627219b6027cbec2d5541931555b7885b133785ce3,1679
- which-0.2@sha256:db82ca7d83d64cce8ad579756f02d27c5bd289806ee02474726f7fafb87318e8,858
- cli-git-0.1.0.2@sha256:4e62e6b7357e4fe698df8b58ba53919f9d4a056e9617dbc00c869a365e316387,1122
- servant-lucid-0.9.0.4@sha256:698db96903a145fdef40cc897f8790728642af917c37b941a98b2da872b65f08,1787
- servant-websockets-2.0.0@sha256:6e9e3600bced90fd52ed3d1bf632205cb21479075b20d6637153cc4567000234,2253
# mustache is on stackage, but in a version that doesn't yet support aeson 2.0
- mustache-2.4.0@sha256:bd1cfbd027c04d8329877e95413d34dc357d4bee041dd8978cd6a23b114fbda1,3180
allow-newer: true
# - acme-missiles-0.3
# - git: https://github.com/commercialhaskell/stack.git
# commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a
#
# extra-deps: []
# Override default flag values for local packages and extra-deps
# use aeson with a non-hash-floodable implementation
flags:
aeson:
ordered-keymap: true
# Extra package databases containing global packages
# extra-package-dbs: []
# Control whether we use the GHC we find on the path
# system-ghc: true
#
# Require a specific version of stack, using version ranges
# require-stack-version: -any # Default
# require-stack-version: ">=2.7"
#
# Override the architecture used by stack, especially useful on Windows
# arch: i386
# arch: x86_64
#
# Extra directories used by stack for building
# extra-include-dirs: [/path/to/dir]
# extra-lib-dirs: [/path/to/dir]
#
# Allow a newer minor version of GHC than the snapshot specifies
# compiler-check: newer-minor
nix:
enable: true
packages:
- zlib.dev
- zlib
- openssl
- git
- cacert
......@@ -39,10 +39,65 @@ packages:
sha256: dd54303f712dd2b8dc05942061921b0d06e0bd501b42c965a9ac6a0a37cd3128
original:
hackage: time-compat-1.9.6.1@sha256:381a2e8ed6e41d20ff5929d12d25c1d9337d459de5964ef1d90b06d115b31f07,5033
snapshots:
- completed:
size: 586286
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/18/16.yaml
sha256: cdead65fca0323144b346c94286186f4969bf85594d649c49c7557295675d8a5
hackage: HList-0.5.1.0@sha256:3ecb2d10ad2b3d36ad28e2f08505f9c3d7143ca737ef13b3e64db503635966c2,7525
pantry-tree:
size: 5800
sha256: fe9d53555847bd16ffd46e3fb6013751c23f375a95d05b4d4c8de0bb22911e72
original:
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/18/16.yaml
hackage: HList-0.5.1.0@sha256:3ecb2d10ad2b3d36ad28e2f08505f9c3d7143ca737ef13b3e64db503635966c2,7525
- completed:
hackage: cli-extras-0.1.0.2@sha256:404552a3e5e844f332fcf74858999b9b9b6d5dcab6017a9d5a48868715a21468,1996
pantry-tree:
size: 849
sha256: 0f78dd9ad144dd81d2567ff0c47c111e2764db1b48341b34a2026018fb7f01ff
original:
hackage: cli-extras-0.1.0.2@sha256:404552a3e5e844f332fcf74858999b9b9b6d5dcab6017a9d5a48868715a21468,1996
- completed:
hackage: logging-effect-1.3.12@sha256:72d168dd09887649ba9501627219b6027cbec2d5541931555b7885b133785ce3,1679
pantry-tree:
size: 330
sha256: 3907e21147987af4f1590abce025e7439f0d338444f259791068c361d586117f
original:
hackage: logging-effect-1.3.12@sha256:72d168dd09887649ba9501627219b6027cbec2d5541931555b7885b133785ce3,1679
- completed:
hackage: which-0.2@sha256:db82ca7d83d64cce8ad579756f02d27c5bd289806ee02474726f7fafb87318e8,858
pantry-tree:
size: 262
sha256: bef8458bddea924f3162e51fcef66cb3071f73c31d3dbb6d4029b0115af88a54
original:
hackage: which-0.2@sha256:db82ca7d83d64cce8ad579756f02d27c5bd289806ee02474726f7fafb87318e8,858
- completed:
hackage: cli-git-0.1.0.2@sha256:4e62e6b7357e4fe698df8b58ba53919f9d4a056e9617dbc00c869a365e316387,1122
pantry-tree:
size: 269
sha256: 1e81c51e2b60db2b1784901cf0af33c67384f5412ad8edaad8a7068135f5217f
original:
hackage: cli-git-0.1.0.2@sha256:4e62e6b7357e4fe698df8b58ba53919f9d4a056e9617dbc00c869a365e316387,1122
- completed:
hackage: servant-lucid-0.9.0.4@sha256:698db96903a145fdef40cc897f8790728642af917c37b941a98b2da872b65f08,1787
pantry-tree:
size: 392
sha256: 39e0e7b2b25980bfe4df036e89959188f9ef9e8c78c85e241fa9a682d1d78cf3
original:
hackage: servant-lucid-0.9.0.4@sha256:698db96903a145fdef40cc897f8790728642af917c37b941a98b2da872b65f08,1787
- completed:
hackage: servant-websockets-2.0.0@sha256:6e9e3600bced90fd52ed3d1bf632205cb21479075b20d6637153cc4567000234,2253
pantry-tree:
size: 523
sha256: 085c6620bff7671bef1d969652a349271c3703fbf10dd753cb63ee1cd700bca5
original:
hackage: servant-websockets-2.0.0@sha256:6e9e3600bced90fd52ed3d1bf632205cb21479075b20d6637153cc4567000234,2253
- completed:
hackage: mustache-2.4.0@sha256:bd1cfbd027c04d8329877e95413d34dc357d4bee041dd8978cd6a23b114fbda1,3180
pantry-tree:
size: 1182
sha256: 44c4d43ecfe1fee11fb03ffd49b0580ed00eec5144067092801ef4256df77ef8
original:
hackage: mustache-2.4.0@sha256:bd1cfbd027c04d8329877e95413d34dc357d4bee041dd8978cd6a23b114fbda1,3180
snapshots:
- completed:
size: 587393
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/18/25.yaml
sha256: 1b74fb5e970497b5aefae56703f1bd44aa648bd1a5ef95c1eb8c29775087e2bf
original: lts-18.25
File added
File added
/*!
* Bootstrap v4.0.0 (https://getbootstrap.com)
* Copyright 2011-2018 The Bootstrap Authors
* Copyright 2011-2018 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.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-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.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;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.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;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.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;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.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%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.input-group-append>.form-control-plaintext.btn,.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.input-group-append>.form-control-plaintext.btn,.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.875rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(40,167,69,.8);border-radius:.2rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{background-color:#71dd8a}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label::before,.was-validated .custom-file-input:valid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(220,53,69,.8);border-radius:.2rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{background-color:#efa2a9}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label::before,.was-validated .custom-file-input:invalid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group{width:auto}.form-inline .form-check{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled).active,.btn:not(:disabled):not(.disabled):active{background-image:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;background-color:transparent}.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link.focus,.btn-link:focus{text-decoration:underline;border-color:transparent;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;transition:opacity .15s linear}.fade.show{opacity:1}.collapse{display:none}.collapse.show{display:block}tr.collapse.show{display:table-row}tbody.collapse.show{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}.dropdown,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropup .dropdown-menu{margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after{margin-left:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file:focus,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::before{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-file:not(:first-child) .custom-file-label::before{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-webkit-box;display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:active~.custom-control-label::before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 5px rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-control{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:focus~.custom-file-control::before{border-color:#80bdff}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(calc(2.25rem + 2px) - 1px * 2);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.nav{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .dropup .dropdown-menu{top:auto;bottom:100%}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .dropup .dropdown-menu{top:auto;bottom:100%}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%}}.breadcrumb{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-webkit-box;display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;background-color:#007bff;transition:width .6s ease}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-ms-flex:1;flex:1}.list-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}.close:not(:disabled):not(.disabled){cursor:pointer}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-dialog-centered{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-content{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.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-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-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}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;-webkit-clip-path:inset(50%);clip-path:inset(50%);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal;-webkit-clip-path:none;clip-path:none}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-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-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-muted{color:#6c757d!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}
/*# sourceMappingURL=bootstrap.min.css.map */
\ No newline at end of file
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-selection'), require('d3-dispatch'), require('d3-transition'), require('d3-timer'), require('d3-interpolate'), require('d3-zoom'), require('@hpcc-js/wasm'), require('d3-format'), require('d3-path')) :
typeof define === 'function' && define.amd ? define(['exports', 'd3-selection', 'd3-dispatch', 'd3-transition', 'd3-timer', 'd3-interpolate', 'd3-zoom', '@hpcc-js/wasm', 'd3-format', 'd3-path'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global['d3-graphviz'] = {}, global.d3, global.d3, global.d3, global.d3, global.d3, global.d3, global['@hpcc-js/wasm'], global.d3, global.d3));
}(this, (function (exports, d3, d3Dispatch, d3Transition, d3Timer, d3Interpolate, d3Zoom, wasm, d3Format, d3Path) { 'use strict';
function _interopNamespace(e) {
if (e && e.__esModule) return e;
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () {
return e[k];
}
});
}
});
}
n['default'] = e;
return Object.freeze(n);
}
var d3__namespace = /*#__PURE__*/_interopNamespace(d3);
function extractElementData(element) {
var datum = {};
var tag = element.node().nodeName;
datum.tag = tag;
if (tag == '#text') {
datum.text = element.text();
} else if (tag == '#comment') {
datum.comment = element.text();
}
datum.attributes = {};
var attributes = element.node().attributes;
if (attributes) {
for (var i = 0; i < attributes.length; i++) {
var attribute = attributes[i];
var name = attribute.name;
var value = attribute.value;
datum.attributes[name] = value;
}
}
var transform = element.node().transform;
if (transform && transform.baseVal.numberOfItems != 0) {
var matrix = transform.baseVal.consolidate().matrix;
datum.translation = {x: matrix.e, y: matrix.f};
datum.scale = matrix.a;
}
if (tag == 'ellipse') {
datum.center = {
x: datum.attributes.cx,
y: datum.attributes.cy,
};
}
if (tag == 'polygon') {
var points = element.attr('points').split(' ');
var x = points.map(function(p) {return p.split(',')[0]});
var y = points.map(function(p) {return p.split(',')[1]});
var xmin = Math.min.apply(null, x);
var xmax = Math.max.apply(null, x);
var ymin = Math.min.apply(null, y);
var ymax = Math.max.apply(null, y);
var bbox = {
x: xmin,
y: ymin,
width: xmax - xmin,
height: ymax - ymin,
};
datum.bbox = bbox;
datum.center = {
x: (xmin + xmax) / 2,
y: (ymin + ymax) / 2,
};
}
if (tag == 'path') {
var d = element.attr('d');
var points = d.split(/[A-Z ]/);
points.shift();
var x = points.map(function(p) {return +p.split(',')[0]});
var y = points.map(function(p) {return +p.split(',')[1]});
var xmin = Math.min.apply(null, x);
var xmax = Math.max.apply(null, x);
var ymin = Math.min.apply(null, y);
var ymax = Math.max.apply(null, y);
var bbox = {
x: xmin,
y: ymin,
width: xmax - xmin,
height: ymax - ymin,
};
datum.bbox = bbox;
datum.center = {
x: (xmin + xmax) / 2,
y: (ymin + ymax) / 2,
};
datum.totalLength = element.node().getTotalLength();
}
if (tag == 'text') {
datum.center = {
x: element.attr('x'),
y: element.attr('y'),
};
}
if (tag == '#text') {
datum.text = element.text();
} else if (tag == '#comment') {
datum.comment = element.text();
}
return datum
}
function extractAllElementsData(element) {
var datum = extractElementData(element);
datum.children = [];
var children = d3__namespace.selectAll(element.node().childNodes);
children.each(function () {
var childData = extractAllElementsData(d3__namespace.select(this));
childData.parent = datum;
datum.children.push(childData);
});
return datum;
}
function createElement(data) {
if (data.tag == '#text') {
return document.createTextNode("");
} else if (data.tag == '#comment') {
return document.createComment(data.comment);
} else {
return document.createElementNS('http://www.w3.org/2000/svg', data.tag);
}
}
function createElementWithAttributes(data) {
var elementNode = createElement(data);
var element = d3__namespace.select(elementNode);
var attributes = data.attributes;
for (var attributeName of Object.keys(attributes)) {
var attributeValue = attributes[attributeName];
element.attr(attributeName, attributeValue);
}
return elementNode;
}
function replaceElement(element, data) {
var parent = d3__namespace.select(element.node().parentNode);
var newElementNode = createElementWithAttributes(data);
var newElement = parent.insert(function () {
return newElementNode;
}, function () {
return element.node();
});
element.remove();
return newElement;
}
function insertElementData(element, datum) {
element.datum(datum);
element.data([datum], function (d) {
return d.key;
});
}
function insertAllElementsData(element, datum) {
insertElementData(element, datum);
var children = d3__namespace.selectAll(element.node().childNodes);
children.each(function (d, i) {
insertAllElementsData(d3__namespace.select(this), datum.children[i]);
});
}
function insertChildren(element, index) {
var children = element.selectAll(function () {
return element.node().childNodes;
});
children = children
.data(function (d) {
return d.children;
}, function (d) {
return d.tag + '-' + index;
});
var childrenEnter = children
.enter()
.append(function(d) {
return createElement(d);
});
var childrenExit = children
.exit();
childrenExit = childrenExit
.remove();
children = childrenEnter
.merge(children);
var childTagIndexes = {};
children.each(function(childData) {
var childTag = childData.tag;
if (childTagIndexes[childTag] == null) {
childTagIndexes[childTag] = 0;
}
var childIndex = childTagIndexes[childTag]++;
attributeElement.call(this, childData, childIndex);
});
}
function attributeElement(data, index=0) {
var element = d3__namespace.select(this);
data.tag;
var attributes = data.attributes;
var currentAttributes = element.node().attributes;
if (currentAttributes) {
for (var i = 0; i < currentAttributes.length; i++) {
var currentAttribute = currentAttributes[i];
var name = currentAttribute.name;
if (name.split(':')[0] != 'xmlns' && currentAttribute.namespaceURI) {
var namespaceURIParts = currentAttribute.namespaceURI.split('/');
var namespace = namespaceURIParts[namespaceURIParts.length - 1];
name = namespace + ':' + name;
}
if (!(name in attributes)) {
attributes[name] = null;
}
}
}
for (var attributeName of Object.keys(attributes)) {
element
.attr(attributeName, attributes[attributeName]);
}
if (data.text) {
element
.text(data.text);
}
insertChildren(element, index);
}
function shallowCopyObject(obj) {
return Object.assign({}, obj);
}
function roundTo2Decimals(x) {
return Math.round(x * 100.0) / 100.0
}
function zoom(enable) {
this._options.zoom = enable;
if (this._options.zoom && !this._zoomBehavior) {
createZoomBehavior.call(this);
} else if (!this._options.zoom && this._zoomBehavior) {
this._zoomSelection.on(".zoom", null);
this._zoomBehavior = null;
}
return this;
}
function createZoomBehavior() {
function zoomed(event) {
var g = d3__namespace.select(svg.node().querySelector("g"));
g.attr('transform', event.transform);
}
var root = this._selection;
var svg = d3__namespace.select(root.node().querySelector("svg"));
if (svg.size() == 0) {
return this;
}
this._zoomSelection = svg;
var zoomBehavior = d3Zoom.zoom()
.scaleExtent(this._options.zoomScaleExtent)
.translateExtent(this._options.zoomTranslateExtent)
.interpolate(d3Interpolate.interpolate)
.on("zoom", zoomed);
this._zoomBehavior = zoomBehavior;
var g = d3__namespace.select(svg.node().querySelector("g"));
svg.call(zoomBehavior);
if (!this._active) {
translateZoomBehaviorTransform.call(this, g);
}
this._originalTransform = d3Zoom.zoomTransform(svg.node());
return this;
}
function getTranslatedZoomTransform(selection) {
// Get the current zoom transform for the top level svg and
// translate it uniformly with the given selection, using the
// difference between the translation specified in the selection's
// data and it's saved previous translation. The selection is
// normally the top level g element of the graph.
var oldTranslation = this._translation;
var oldScale = this._scale;
var newTranslation = selection.datum().translation;
var newScale = selection.datum().scale;
var t = d3Zoom.zoomTransform(this._zoomSelection.node());
if (oldTranslation) {
t = t.scale(1 / oldScale);
t = t.translate(-oldTranslation.x, -oldTranslation.y);
}
t = t.translate(newTranslation.x, newTranslation.y);
t = t.scale(newScale);
return t;
}
function translateZoomBehaviorTransform(selection) {
// Translate the current zoom transform for the top level svg
// uniformly with the given selection, using the difference
// between the translation specified in the selection's data and
// it's saved previous translation. The selection is normally the
// top level g element of the graph.
this._zoomBehavior.transform(this._zoomSelection, getTranslatedZoomTransform.call(this, selection));
// Save the selections's new translation and scale.
this._translation = selection.datum().translation;
this._scale = selection.datum().scale;
// Set the original zoom transform to the translation and scale specified in
// the selection's data.
this._originalTransform = d3Zoom.zoomIdentity.translate(selection.datum().translation.x, selection.datum().translation.y).scale(selection.datum().scale);
}
function resetZoom(transition) {
// Reset the zoom transform to the original zoom transform.
var selection = this._zoomSelection;
if (transition) {
selection = selection
.transition(transition);
}
selection
.call(this._zoomBehavior.transform, this._originalTransform);
return this;
}
function zoomScaleExtent(extent) {
this._options.zoomScaleExtent = extent;
return this;
}
function zoomTranslateExtent(extent) {
this._options.zoomTranslateExtent = extent;
return this;
}
function zoomBehavior() {
return this._zoomBehavior || null;
}
function zoomSelection() {
return this._zoomSelection || null;
}
function pathTween(points, d1) {
return function() {
const pointInterpolators = points.map(function(p) {
return d3Interpolate.interpolate([p[0][0], p[0][1]], [p[1][0], p[1][1]]);
});
return function(t) {
return t < 1 ? "M" + pointInterpolators.map(function(p) { return p(t); }).join("L") : d1;
};
};
}
function pathTweenPoints(node, d1, precision, precisionIsRelative) {
const path0 = node;
const path1 = path0.cloneNode();
const n0 = path0.getTotalLength();
const n1 = (path1.setAttribute("d", d1), path1).getTotalLength();
// Uniform sampling of distance based on specified precision.
const distances = [0];
let i = 0;
const dt = precisionIsRelative ? precision : precision / Math.max(n0, n1);
while ((i += dt) < 1) {
distances.push(i);
}
distances.push(1);
// Compute point-interpolators at each distance.
const points = distances.map(function(t) {
const p0 = path0.getPointAtLength(t * n0);
const p1 = path1.getPointAtLength(t * n1);
return ([[p0.x, p0.y], [p1.x, p1.y]]);
});
return points;
}
function data() {
return this._data || null;
}
function isEdgeElementParent(datum) {
return (datum.attributes.class == 'edge' || (
datum.tag == 'a' &&
datum.parent.tag == 'g' &&
datum.parent.parent.attributes.class == 'edge'
));
}
function isEdgeElement(datum) {
return datum.parent && isEdgeElementParent(datum.parent);
}
function getEdgeGroup(datum) {
if (datum.parent.attributes.class == 'edge') {
return datum.parent;
} else { // datum.parent.tag == 'g' && datum.parent.parent.tag == 'g' && datum.parent.parent.parent.attributes.class == 'edge'
return datum.parent.parent.parent;
}
}
function getEdgeTitle(datum) {
return getEdgeGroup(datum).children.find(function (e) {
return e.tag == 'title';
});
}
function render(callback) {
if (this._busy) {
this._queue.push(this.render.bind(this, callback));
return this;
}
this._dispatch.call('renderStart', this);
if (this._transitionFactory) {
d3Timer.timeout(function () { // Decouple from time spent. See https://github.com/d3/d3-timer/issues/27
this._transition = d3Transition.transition(this._transitionFactory());
_render.call(this, callback);
}.bind(this), 0);
} else {
_render.call(this, callback);
}
return this;
}
function _render(callback) {
var transitionInstance = this._transition;
var fade = this._options.fade && transitionInstance != null;
var tweenPaths = this._options.tweenPaths;
var tweenShapes = this._options.tweenShapes;
var convertEqualSidedPolygons = this._options.convertEqualSidedPolygons;
var growEnteringEdges = this._options.growEnteringEdges && transitionInstance != null;
var attributer = this._attributer;
var graphvizInstance = this;
function insertChildren(element) {
var children = element.selectAll(function () {
return element.node().childNodes;
});
children = children
.data(function (d) {
return d.children;
}, function (d) {
return d.key;
});
var childrenEnter = children
.enter()
.append(function(d) {
var element = createElement(d);
if (d.tag == '#text' && fade) {
element.nodeValue = d.text;
}
return element;
});
if (fade || (growEnteringEdges && isEdgeElementParent(element.datum()))) {
var childElementsEnter = childrenEnter
.filter(function(d) {
return d.tag[0] == '#' ? null : this;
})
.each(function (d) {
var childEnter = d3__namespace.select(this);
for (var attributeName of Object.keys(d.attributes)) {
var attributeValue = d.attributes[attributeName];
childEnter
.attr(attributeName, attributeValue);
}
});
childElementsEnter
.filter(function(d) {
return d.tag == 'svg' || d.tag == 'g' ? null : this;
})
.style("opacity", 0.0);
}
var childrenExit = children
.exit();
if (attributer) {
childrenExit.each(attributer);
}
if (transitionInstance) {
childrenExit = childrenExit
.transition(transitionInstance);
if (fade) {
childrenExit
.filter(function(d) {
return d.tag[0] == '#' ? null : this;
})
.style("opacity", 0.0);
}
}
childrenExit = childrenExit
.remove();
children = childrenEnter
.merge(children);
children.each(attributeElement);
}
function attributeElement(data) {
var element = d3__namespace.select(this);
if (data.tag == "svg") {
var options = graphvizInstance._options;
if (options.width != null || options.height != null) {
var width = options.width;
var height = options.height;
if (width == null) {
width = data.attributes.width.replace('pt', '') * 4 / 3;
} else {
element
.attr("width", width);
data.attributes.width = width;
}
if (height == null) {
height = data.attributes.height.replace('pt', '') * 4 / 3;
} else {
element
.attr("height", height);
data.attributes.height = height;
}
if (!options.fit) {
element
.attr("viewBox", `0 0 ${width * 3 / 4 / options.scale} ${height * 3 / 4 / options.scale}`);
data.attributes.viewBox = `0 0 ${width * 3 / 4 / options.scale} ${height * 3 / 4 / options.scale}`;
}
}
if (options.scale != 1 && (options.fit || (options.width == null && options.height == null))) {
width = data.attributes.viewBox.split(' ')[2];
height = data.attributes.viewBox.split(' ')[3];
element
.attr("viewBox", `0 0 ${width / options.scale} ${height / options.scale}`);
data.attributes.viewBox = `0 0 ${width / options.scale} ${height / options.scale}`;
}
}
if (attributer) {
element.each(attributer);
}
var tag = data.tag;
var attributes = data.attributes;
var currentAttributes = element.node().attributes;
if (currentAttributes) {
for (var i = 0; i < currentAttributes.length; i++) {
var currentAttribute = currentAttributes[i];
var name = currentAttribute.name;
if (name.split(':')[0] != 'xmlns' && currentAttribute.namespaceURI) {
var namespaceURIParts = currentAttribute.namespaceURI.split('/');
var namespace = namespaceURIParts[namespaceURIParts.length - 1];
name = namespace + ':' + name;
}
if (!(name in attributes)) {
attributes[name] = null;
}
}
}
var convertShape = false;
var convertPrevShape = false;
if (tweenShapes && transitionInstance) {
if ((this.nodeName == 'polygon' || this.nodeName == 'ellipse') && data.alternativeOld) {
convertPrevShape = true;
}
if ((tag == 'polygon' || tag == 'ellipse') && data.alternativeNew) {
convertShape = true;
}
if (this.nodeName == 'polygon' && tag == 'polygon' && data.alternativeOld) {
var prevData = extractElementData(element);
var prevPoints = prevData.attributes.points;
if (!convertEqualSidedPolygons) {
var nPrevPoints = prevPoints.split(' ').length;
var points = data.attributes.points;
var nPoints = points.split(' ').length;
if (nPoints == nPrevPoints) {
convertShape = false;
convertPrevShape = false;
}
}
}
if (convertPrevShape) {
var prevPathData = data.alternativeOld;
var pathElement = replaceElement(element, prevPathData);
pathElement.data([data], function () {
return data.key;
});
element = pathElement;
}
if (convertShape) {
var newPathData = data.alternativeNew;
tag = 'path';
attributes = newPathData.attributes;
}
}
var elementTransition = element;
if (transitionInstance) {
elementTransition = elementTransition
.transition(transitionInstance);
if (fade) {
elementTransition
.filter(function(d) {
return d.tag[0] == '#' ? null : this;
})
.style("opacity", 1.0);
}
elementTransition
.filter(function(d) {
return d.tag[0] == '#' ? null : this;
})
.on("end", function(d) {
d3__namespace.select(this)
.attr('style', (d && d.attributes && d.attributes.style) || null);
});
}
var growThisPath = growEnteringEdges && tag == 'path' && data.offset;
if (growThisPath) {
var totalLength = data.totalLength;
element
.attr("stroke-dasharray", totalLength + " " + totalLength)
.attr("stroke-dashoffset", totalLength)
.attr('transform', 'translate(' + data.offset.x + ',' + data.offset.y + ')');
attributes["stroke-dashoffset"] = 0;
attributes['transform'] = 'translate(0,0)';
elementTransition
.attr("stroke-dashoffset", attributes["stroke-dashoffset"])
.attr('transform', attributes['transform'])
.on("start", function() {
d3__namespace.select(this)
.style('opacity', null);
})
.on("end", function() {
d3__namespace.select(this)
.attr('stroke-dashoffset', null)
.attr('stroke-dasharray', null)
.attr('transform', null);
});
}
var moveThisPolygon = growEnteringEdges && tag == 'polygon' && isEdgeElement(data) && data.offset && data.parent.children[3].tag == 'path';
if (moveThisPolygon) {
var edgePath = d3__namespace.select(element.node().parentNode.querySelector("path"));
var p0 = edgePath.node().getPointAtLength(0);
var p1 = edgePath.node().getPointAtLength(data.totalLength);
var p2 = edgePath.node().getPointAtLength(data.totalLength - 1);
var angle1 = Math.atan2(p1.y - p2.y, p1.x - p2.x) * 180 / Math.PI;
var x = p0.x - p1.x + data.offset.x;
var y = p0.y - p1.y + data.offset.y;
element
.attr('transform', 'translate(' + x + ',' + y + ')');
elementTransition
.attrTween("transform", function () {
return function (t) {
var p = edgePath.node().getPointAtLength(data.totalLength * t);
var p2 = edgePath.node().getPointAtLength(data.totalLength * t + 1);
var angle = Math.atan2(p2.y - p.y, p2.x - p.x) * 180 / Math.PI - angle1;
x = p.x - p1.x + data.offset.x * (1 - t);
y = p.y - p1.y + data.offset.y * (1 - t);
return 'translate(' + x + ',' + y + ') rotate(' + angle + ' ' + p1.x + ' ' + p1.y + ')';
}
})
.on("start", function() {
d3__namespace.select(this)
.style('opacity', null);
})
.on("end", function() {
d3__namespace.select(this).attr('transform', null);
});
}
var tweenThisPath = tweenPaths && transitionInstance && tag == 'path' && element.attr('d') != null;
for (var attributeName of Object.keys(attributes)) {
var attributeValue = attributes[attributeName];
if (tweenThisPath && attributeName == 'd') {
var points = (data.alternativeOld || data).points;
if (points) {
elementTransition
.attrTween("d", pathTween(points, attributeValue));
}
} else {
if (attributeName == 'transform' && data.translation) {
if (transitionInstance) {
var onEnd = elementTransition.on("end");
elementTransition
.on("start", function () {
if (graphvizInstance._zoomBehavior) {
// Update the transform to transition to, just before the transition starts
// in order to catch changes between the transition scheduling to its start.
elementTransition
.tween("attr.transform", function() {
var node = this;
return function(t) {
node.setAttribute("transform", d3Interpolate.interpolateTransformSvg(d3Zoom.zoomTransform(graphvizInstance._zoomSelection.node()).toString(), getTranslatedZoomTransform.call(graphvizInstance, element).toString())(t));
};
});
}
})
.on("end", function () {
onEnd.call(this);
// Update the zoom transform to the new translated transform
if (graphvizInstance._zoomBehavior) {
translateZoomBehaviorTransform.call(graphvizInstance, element);
}
});
} else {
if (graphvizInstance._zoomBehavior) {
// Update the transform attribute to set with the current pan translation
translateZoomBehaviorTransform.call(graphvizInstance, element);
attributeValue = getTranslatedZoomTransform.call(graphvizInstance, element).toString();
}
}
}
elementTransition
.attr(attributeName, attributeValue);
}
}
if (convertShape) {
elementTransition
.on("end", function (d, i, nodes) {
pathElement = d3__namespace.select(this);
var newElement = replaceElement(pathElement, d);
newElement.data([d], function () {
return d.key;
});
});
}
if (data.text) {
elementTransition
.text(data.text);
}
insertChildren(element);
}
var root = this._selection;
if (transitionInstance != null) {
// Ensure original SVG shape elements are restored after transition before rendering new graph
var jobs = this._jobs;
if (graphvizInstance._active) {
jobs.push(null);
return this;
} else {
root
.transition(transitionInstance)
.transition()
.duration(0)
.on("end" , function () {
graphvizInstance._active = false;
if (jobs.length != 0) {
jobs.shift();
graphvizInstance.render();
}
});
this._active = true;
}
}
if (transitionInstance != null) {
root
.transition(transitionInstance)
.on("start" , function () {
graphvizInstance._dispatch.call('transitionStart', graphvizInstance);
})
.on("end" , function () {
graphvizInstance._dispatch.call('transitionEnd', graphvizInstance);
})
.transition()
.duration(0)
.on("start" , function () {
graphvizInstance._dispatch.call('restoreEnd', graphvizInstance);
graphvizInstance._dispatch.call('end', graphvizInstance);
if (callback) {
callback.call(graphvizInstance);
}
});
}
var data = this._data;
var svg = root
.selectAll("svg")
.data([data], function (d) {return d.key});
svg = svg
.enter()
.append("svg")
.merge(svg);
attributeElement.call(svg.node(), data);
if (this._options.zoom && !this._zoomBehavior) {
createZoomBehavior.call(this);
}
graphvizInstance._dispatch.call('renderEnd', graphvizInstance);
if (transitionInstance == null) {
this._dispatch.call('end', this);
if (callback) {
callback.call(this);
}
}
return this;
}
function convertToPathData(originalData, guideData) {
if (originalData.tag == 'polygon') {
var newData = shallowCopyObject(originalData);
newData.tag = 'path';
var originalAttributes = originalData.attributes;
var newAttributes = shallowCopyObject(originalAttributes);
var newPointsString = originalAttributes.points;
if (guideData.tag == 'polygon') {
var bbox = originalData.bbox;
bbox.cx = bbox.x + bbox.width / 2;
bbox.cy = bbox.y + bbox.height / 2;
var pointsString = originalAttributes.points;
var pointStrings = pointsString.split(' ');
var normPoints = pointStrings.map(function(p) {var xy = p.split(','); return [xy[0] - bbox.cx, xy[1] - bbox.cy]});
var x0 = normPoints[normPoints.length - 1][0];
var y0 = normPoints[normPoints.length - 1][1];
for (var i = 0; i < normPoints.length; i++, x0 = x1, y0 = y1) {
var x1 = normPoints[i][0];
var y1 = normPoints[i][1];
var dx = x1 - x0;
var dy = y1 - y0;
if (dy == 0) {
continue;
} else {
var x2 = x0 - y0 * dx / dy;
}
if (0 <= x2 && x2 < Infinity && ((x0 <= x2 && x2 <= x1) || (x1 <= x2 && x2 <= x0))) {
break;
}
}
var newPointStrings = [[bbox.cx + x2, bbox.cy + 0].join(',')];
newPointStrings = newPointStrings.concat(pointStrings.slice(i));
newPointStrings = newPointStrings.concat(pointStrings.slice(0, i));
newPointsString = newPointStrings.join(' ');
}
newAttributes['d'] = 'M' + newPointsString + 'z';
delete newAttributes.points;
newData.attributes = newAttributes;
} else /* if (originalData.tag == 'ellipse') */ {
var newData = shallowCopyObject(originalData);
newData.tag = 'path';
var originalAttributes = originalData.attributes;
var newAttributes = shallowCopyObject(originalAttributes);
var cx = originalAttributes.cx;
var cy = originalAttributes.cy;
var rx = originalAttributes.rx;
var ry = originalAttributes.ry;
if (guideData.tag == 'polygon') {
var bbox = guideData.bbox;
bbox.cx = bbox.x + bbox.width / 2;
bbox.cy = bbox.y + bbox.height / 2;
var p = guideData.attributes.points.split(' ')[0].split(',');
var sx = p[0];
var sy = p[1];
var dx = sx - bbox.cx;
var dy = sy - bbox.cy;
var l = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));
var cosA = dx / l;
var sinA = -dy / l;
} else { // if (guideData.tag == 'path') {
// FIXME: add support for getting start position from path
var cosA = 1;
var sinA = 0;
}
var x1 = rx * cosA;
var y1 = -ry * sinA;
var x2 = rx * (-cosA);
var y2 = -ry * (-sinA);
var dx = x2 - x1;
var dy = y2 - y1;
newAttributes['d'] = 'M ' + cx + ' ' + cy + ' m ' + x1 + ',' + y1 + ' a ' + rx + ',' + ry + ' 0 1,0 ' + dx + ',' + dy + ' a ' + rx + ',' + ry + ' 0 1,0 ' + -dx + ',' + -dy + 'z';
delete newAttributes.cx;
delete newAttributes.cy;
delete newAttributes.rx;
delete newAttributes.ry;
newData.attributes = newAttributes;
}
return newData;
}
function translatePointsAttribute(pointsString, x, y) {
var pointStrings = pointsString.split(' ');
var points = pointStrings.map(function(p) {return p.split(',')});
var points = pointStrings.map(function(p) {return [roundTo2Decimals(+x + +p.split(',')[0]), roundTo2Decimals(+y + +p.split(',')[1])]});
var pointStrings = points.map(function(p) {return p.join(',')});
var pointsString = pointStrings.join(' ');
return pointsString;
}
function translateDAttribute(d, x, y) {
var pointStrings = d.split(/[A-Z ]/);
pointStrings.shift();
var commands = d.split(/[^[A-Z ]+/);
var points = pointStrings.map(function(p) {return p.split(',')});
var points = pointStrings.map(function(p) {return [roundTo2Decimals(+x + +p.split(',')[0]), roundTo2Decimals(+y + +p.split(',')[1])]});
var pointStrings = points.map(function(p) {return p.join(',')});
d = commands.reduce(function(arr, v, i) {
return arr.concat(v, pointStrings[i]);
}, []).join('');
return d;
}
function initViz() {
// force JIT compilation of Viz.js
try {
wasm.graphviz.layout("", "svg", "dot").then(() => {
wasm.graphvizSync().then((graphviz1) => {
this.layoutSync = graphviz1.layout.bind(graphviz1);
if (this._worker == null) {
this._dispatch.call("initEnd", this);
}
if (this._afterInit) {
this._afterInit();
}
});
});
} catch(error) {
}
if (this._worker != null) {
var vizURL = this._vizURL;
var graphvizInstance = this;
this._workerPort.onmessage = function(event) {
var callback = graphvizInstance._workerCallbacks.shift();
callback.call(graphvizInstance, event);
};
if (!vizURL.match(/^https?:\/\/|^\/\//i)) {
// Local URL. Prepend with local domain to be usable in web worker
vizURL = (new window.URL(vizURL, document.location.href)).href;
}
postMessage.call(this, {dot: "", engine: 'dot', vizURL: vizURL}, function(event) {
switch (event.data.type) {
case "init":
graphvizInstance._dispatch.call("initEnd", this);
break;
}
});
}
}
function postMessage(message, callback) {
this._workerCallbacks.push(callback);
this._workerPort.postMessage(message);
}
function layout(src, engine, vizOptions, callback) {
this._worker;
if (this._worker) {
postMessage.call(this, {
dot: src,
engine: engine,
options: vizOptions,
}, function (event) {
callback.call(this, event.data);
});
} else {
try {
var svgDoc = this.layoutSync(src, "svg", engine, vizOptions);
callback.call(this, {type: 'done', svg: svgDoc});
}
catch(error) {
callback.call(this, {type: 'error', error: error.message});
}
}
}
function dot(src, callback) {
var graphvizInstance = this;
this._worker;
var engine = this._options.engine;
var images = this._images;
this._dispatch.call("start", this);
this._busy = true;
this._dispatch.call("layoutStart", this);
var vizOptions = {
images: images,
};
if (!this._worker && this.layoutSync == null) {
this._afterInit = this.dot.bind(this, src, callback);
return this;
}
this.layout(src, engine, vizOptions, function (data) {
switch (data.type) {
case "error":
if (graphvizInstance._onerror) {
graphvizInstance._onerror(data.error);
} else {
throw data.error.message
}
break;
case "done":
var svgDoc = data.svg;
layoutDone.call(this, svgDoc, callback);
break;
}
});
return this;
}
function layoutDone(svgDoc, callback) {
var keyMode = this._options.keyMode;
var tweenPaths = this._options.tweenPaths;
var tweenShapes = this._options.tweenShapes;
if (typeof this._options.tweenPrecision == 'string' && this._options.tweenPrecision.includes('%')) {
var tweenPrecision = +this._options.tweenPrecision.split('%')[0] / 100;
var tweenPrecisionIsRelative = this._options.tweenPrecision.includes('%');
} else {
var tweenPrecision = this._options.tweenPrecision;
var tweenPrecisionIsRelative = false;
}
var growEnteringEdges = this._options.growEnteringEdges;
var dictionary = {};
var prevDictionary = this._dictionary || {};
var nodeDictionary = {};
var prevNodeDictionary = this._nodeDictionary || {};
function setKey(datum, index) {
var tag = datum.tag;
if (keyMode == 'index') {
datum.key = index;
} else if (tag[0] != '#') {
if (keyMode == 'id') {
datum.key = datum.attributes.id;
} else if (keyMode == 'title') {
var title = datum.children.find(function (childData) {
return childData.tag == 'title';
});
if (title) {
if (title.children.length > 0) {
datum.key = title.children[0].text;
} else {
datum.key = '';
}
}
}
}
if (datum.key == null) {
if (tweenShapes) {
if (tag == 'ellipse' || tag == 'polygon') {
tag = 'path';
}
}
datum.key = tag + '-' + index;
}
}
function setId(datum, parentData) {
var id = (parentData ? parentData.id + '.' : '') + datum.key;
datum.id = id;
}
function addToDictionary(datum) {
dictionary[datum.id] = datum;
}
function calculateAlternativeShapeData(datum, prevDatum) {
if (tweenShapes && datum.id in prevDictionary) {
if ((prevDatum.tag == 'polygon' || prevDatum.tag == 'ellipse' || prevDatum.tag == 'path') && (prevDatum.tag != datum.tag || datum.tag == 'polygon')) {
if (prevDatum.tag != 'path') {
datum.alternativeOld = convertToPathData(prevDatum, datum);
}
if (datum.tag != 'path') {
datum.alternativeNew = convertToPathData(datum, prevDatum);
}
}
}
}
function calculatePathTweenPoints(datum, prevDatum) {
if (tweenPaths && prevDatum && (prevDatum.tag == 'path' || (datum.alternativeOld && datum.alternativeOld.tag == 'path'))) {
var attribute_d = (datum.alternativeNew || datum).attributes.d;
if (datum.alternativeOld) {
var oldNode = createElementWithAttributes(datum.alternativeOld);
} else {
var oldNode = createElementWithAttributes(prevDatum);
}
(datum.alternativeOld || (datum.alternativeOld = {})).points = pathTweenPoints(oldNode, attribute_d, tweenPrecision, tweenPrecisionIsRelative);
}
}
function postProcessDataPass1Local(datum, index=0, parentData) {
setKey(datum, index);
setId(datum, parentData);
var id = datum.id;
var prevDatum = prevDictionary[id];
addToDictionary(datum);
calculateAlternativeShapeData(datum, prevDatum);
calculatePathTweenPoints(datum, prevDatum);
var childTagIndexes = {};
datum.children.forEach(function (childData) {
var childTag = childData.tag;
if (childTag == 'ellipse' || childTag == 'polygon') {
childTag = 'path';
}
if (childTagIndexes[childTag] == null) {
childTagIndexes[childTag] = 0;
}
var childIndex = childTagIndexes[childTag]++;
postProcessDataPass1Local(childData, childIndex, datum);
});
}
function addToNodeDictionary(datum) {
var tag = datum.tag;
if (growEnteringEdges && datum.parent) {
if (datum.parent.attributes.class == 'node') {
if (tag == 'title') {
if (datum.children.length > 0) {
var child = datum.children[0];
var nodeId = child.text;
} else {
var nodeId = '';
}
nodeDictionary[nodeId] = datum.parent;
}
}
}
}
function extractGrowingEdgesData(datum) {
var id = datum.id;
var tag = datum.tag;
var prevDatum = prevDictionary[id];
if (growEnteringEdges && !prevDatum && datum.parent) {
if (isEdgeElement(datum)) {
if (tag == 'path' || tag == 'polygon') {
if (tag == 'polygon') {
var path = datum.parent.children.find(function (e) {
return e.tag == 'path';
});
if (path) {
datum.totalLength = path.totalLength;
}
}
var title = getEdgeTitle(datum);
var child = title.children[0];
var nodeIds = child.text.split('->');
if (nodeIds.length != 2) {
nodeIds = child.text.split('--');
}
var startNodeId = nodeIds[0];
var startNode = nodeDictionary[startNodeId];
var prevStartNode = prevNodeDictionary[startNodeId];
if (prevStartNode) {
var i = startNode.children.findIndex(function (element, index) {
return element.tag == 'g';
});
if (i >= 0) {
var j = startNode.children[i].children.findIndex(function (element, index) {
return element.tag == 'a';
});
startNode = startNode.children[i].children[j];
}
var i = prevStartNode.children.findIndex(function (element, index) {
return element.tag == 'g';
});
if (i >= 0) {
var j = prevStartNode.children[i].children.findIndex(function (element, index) {
return element.tag == 'a';
});
prevStartNode = prevStartNode.children[i].children[j];
}
var startShapes = startNode.children;
for (var i = 0; i < startShapes.length; i++) {
if (startShapes[i].tag == 'polygon' || startShapes[i].tag == 'ellipse' || startShapes[i].tag == 'path' || startShapes[i].tag == 'text') {
var startShape = startShapes[i];
break;
}
}
var prevStartShapes = prevStartNode.children;
for (var i = 0; i < prevStartShapes.length; i++) {
if (prevStartShapes[i].tag == 'polygon' || prevStartShapes[i].tag == 'ellipse' || prevStartShapes[i].tag == 'path' || prevStartShapes[i].tag == 'text') {
var prevStartShape = prevStartShapes[i];
break;
}
}
if (prevStartShape && startShape) {
datum.offset = {
x: prevStartShape.center.x - startShape.center.x,
y: prevStartShape.center.y - startShape.center.y,
};
} else {
datum.offset = {x: 0, y: 0};
}
}
}
}
}
}
function postProcessDataPass2Global(datum) {
addToNodeDictionary(datum);
extractGrowingEdgesData(datum);
datum.children.forEach(function (childData) {
postProcessDataPass2Global(childData);
});
}
this._dispatch.call("layoutEnd", this);
var newDoc = d3__namespace.select(document.createDocumentFragment())
.append('div');
var parser = new window.DOMParser();
var doc = parser.parseFromString(svgDoc, "image/svg+xml");
newDoc
.append(function() {
return doc.documentElement;
});
var newSvg = newDoc
.select('svg');
var data = extractAllElementsData(newSvg);
this._dispatch.call('dataExtractEnd', this);
postProcessDataPass1Local(data);
this._dispatch.call('dataProcessPass1End', this);
postProcessDataPass2Global(data);
this._dispatch.call('dataProcessPass2End', this);
this._data = data;
this._dictionary = dictionary;
this._nodeDictionary = nodeDictionary;
this._extractData = function (element, childIndex, parentData) {
var data = extractAllElementsData(element);
postProcessDataPass1Local(data, childIndex, parentData);
postProcessDataPass2Global(data);
return data;
};
this._busy = false;
this._dispatch.call('dataProcessEnd', this);
if (callback) {
callback.call(this);
}
if (this._queue.length > 0) {
var job = this._queue.shift();
job.call(this);
}
}
function renderDot(src, callback) {
var graphvizInstance = this;
this
.dot(src, render);
function render() {
graphvizInstance
.render(callback);
}
return this;
}
function transition(name) {
if (name instanceof Function) {
this._transitionFactory = name;
} else {
this._transition = d3Transition.transition(name);
}
return this;
}
function active(name) {
var root = this._selection;
var svg = root.selectWithoutDataPropagation("svg");
if (svg.size() != 0) {
return d3Transition.active(svg.node(), name);
} else {
return null;
}
}
function options(options) {
if (typeof options == 'undefined') {
return Object.assign({}, this._options);
} else {
for (var option of Object.keys(options)) {
this._options[option] = options[option];
}
return this;
}
}
function width(width) {
this._options.width = width;
return this;
}
function height(height) {
this._options.height = height;
return this;
}
function scale(scale) {
this._options.scale = scale;
return this;
}
function fit(fit) {
this._options.fit = fit;
return this;
}
function attributer(callback) {
this._attributer = callback;
return this;
}
function engine(engine) {
this._options.engine = engine;
return this;
}
function images(path, width, height) {
this._images.push({path:path, width: width, height:height});
return this;
}
function keyMode(keyMode) {
if (!this._keyModes.has(keyMode)) {
throw Error('Illegal keyMode: ' + keyMode);
}
if (keyMode != this._options.keyMode && this._data != null) {
throw Error('Too late to change keyMode');
}
this._options.keyMode = keyMode;
return this;
}
function fade(enable) {
this._options.fade = enable;
return this;
}
function tweenPaths(enable) {
this._options.tweenPaths = enable;
return this;
}
function tweenShapes(enable) {
this._options.tweenShapes = enable;
if (enable) {
this._options.tweenPaths = true;
}
return this;
}
function convertEqualSidedPolygons(enable) {
this._options.convertEqualSidedPolygons = enable;
return this;
}
function tweenPrecision(precision) {
this._options.tweenPrecision = precision;
return this;
}
function growEnteringEdges(enable) {
this._options.growEnteringEdges = enable;
return this;
}
function on(typenames, callback) {
this._dispatch.on(typenames, callback);
return this;
}
function onerror(callback) {
this._onerror = callback;
return this;
}
function logEvents(enable) {
var t0 = Date.now();
var times = {};
var eventTypes = this._eventTypes;
var maxEventTypeLength = Math.max(...(eventTypes.map(eventType => eventType.length)));
for (let i = 0; i < eventTypes.length; i++) {
let eventType = eventTypes[i];
times[eventType] = [];
var graphvizInstance = this;
var expectedDelay;
var expectedDuration;
this
.on(eventType + '.log', enable ? function () {
var t = Date.now();
var seqNo = times[eventType].length;
times[eventType].push(t);
var string = '';
string += 'Event ';
string += d3Format.format(' >2')(i) + ' ';
string += eventType + ' '.repeat(maxEventTypeLength - eventType.length);
string += d3Format.format(' >5')(t - t0) + ' ';
if (eventType != 'initEnd') {
string += d3Format.format(' >5')(t - times['start'][seqNo]);
}
if (eventType == 'dataProcessEnd') {
string += ' prepare ' + d3Format.format(' >5')((t - times['layoutEnd'][seqNo]));
}
if (eventType == 'renderEnd' && graphvizInstance._transition) {
string += ' transition start margin ' + d3Format.format(' >5')(graphvizInstance._transition.delay() - (t - times['renderStart'][seqNo]));
expectedDelay = graphvizInstance._transition.delay();
expectedDuration = graphvizInstance._transition.duration();
}
if (eventType == 'transitionStart') {
var actualDelay = (t - times['renderStart'][seqNo]);
string += ' transition delay ' + d3Format.format(' >5')(t - times['renderStart'][seqNo]);
string += ' expected ' + d3Format.format(' >5')(expectedDelay);
string += ' diff ' + d3Format.format(' >5')(actualDelay - expectedDelay);
}
if (eventType == 'transitionEnd') {
var actualDuration = t - times['transitionStart'][seqNo];
string += ' transition duration ' + d3Format.format(' >5')(actualDuration);
string += ' expected ' + d3Format.format(' >5')(expectedDuration);
string += ' diff ' + d3Format.format(' >5')(actualDuration - expectedDuration);
}
console.log(string);
t0 = t;
} : null);
}
return this;
}
function destroy() {
delete this._selection.node().__graphviz__;
if (this._worker) {
this._workerPortClose();
}
return this;
}
function rotate(x, y, cosA, sinA) {
// (x + j * y) * (cosA + j * sinA) = x * cosA - y * sinA + j * (x * sinA + y * cosA)
y = -y;
sinA = -sinA;
[x, y] = [x * cosA - y * sinA, x * sinA + y * cosA];
y = -y;
return [x, y];
}
function drawEdge(x1, y1, x2, y2, attributes, options={}) {
attributes = Object.assign({}, attributes);
if (attributes.style && attributes.style.includes('invis')) {
var newEdge = d3__namespace.select(null);
} else {
var root = this._selection;
var svg = root.selectWithoutDataPropagation("svg");
var graph0 = svg.selectWithoutDataPropagation("g");
var newEdge0 = createEdge.call(this, attributes);
var edgeData = extractAllElementsData(newEdge0);
var newEdge = graph0.append('g')
.data([edgeData]);
attributeElement.call(newEdge.node(), edgeData);
_updateEdge.call(this, newEdge, x1, y1, x2, y2, attributes, options);
}
this._drawnEdge = {
g: newEdge,
x1: x1,
y1: y1,
x2: x2,
y2: y2,
attributes: attributes,
};
return this;
}
function updateDrawnEdge(x1, y1, x2, y2, attributes={}, options={}) {
if (!this._drawnEdge) {
throw Error('No edge has been drawn');
}
var edge = this._drawnEdge.g;
attributes = Object.assign(this._drawnEdge.attributes, attributes);
this._drawnEdge.x1 = x1;
this._drawnEdge.y1 = y1;
this._drawnEdge.x2 = x2;
this._drawnEdge.y2 = y2;
if (edge.empty() && !(attributes.style && attributes.style.includes('invis'))) {
var root = this._selection;
var svg = root.selectWithoutDataPropagation("svg");
var graph0 = svg.selectWithoutDataPropagation("g");
var edge = graph0.append('g');
this._drawnEdge.g = edge;
}
if (!edge.empty()) {
_updateEdge.call(this, edge, x1, y1, x2, y2, attributes, options);
}
return this;
}
function _updateEdge(edge, x1, y1, x2, y2, attributes, options) {
var newEdge = createEdge.call(this, attributes);
var edgeData = extractAllElementsData(newEdge);
edge.data([edgeData]);
attributeElement.call(edge.node(), edgeData);
_moveEdge(edge, x1, y1, x2, y2, attributes, options);
}
function _moveEdge(edge, x1, y1, x2, y2, attributes, options) {
var shortening = options.shortening || 0;
var arrowHeadLength = 10;
var arrowHeadWidth = 7;
var margin = 0.1;
var arrowHeadPoints = [
[0, -arrowHeadWidth / 2],
[arrowHeadLength, 0],
[0, arrowHeadWidth / 2],
[0, -arrowHeadWidth / 2],
];
var dx = x2 - x1;
var dy = y2 - y1;
var length = Math.sqrt(dx * dx + dy * dy);
if (length == 0) {
var cosA = 1;
var sinA = 0;
} else {
var cosA = dx / length;
var sinA = dy / length;
}
x2 = x1 + (length - shortening - arrowHeadLength - margin) * cosA;
y2 = y1 + (length - shortening - arrowHeadLength - margin) * sinA;
if (attributes.URL || attributes.tooltip) {
var a = edge.selectWithoutDataPropagation("g").selectWithoutDataPropagation("a");
var line = a.selectWithoutDataPropagation("path");
var arrowHead = a.selectWithoutDataPropagation("polygon");
} else {
var line = edge.selectWithoutDataPropagation("path");
var arrowHead = edge.selectWithoutDataPropagation("polygon");
}
var path1 = d3Path.path();
path1.moveTo(x1, y1);
path1.lineTo(x2, y2);
line
.attr("d", path1);
x2 = x1 + (length - shortening - arrowHeadLength) * cosA;
y2 = y1 + (length - shortening - arrowHeadLength) * sinA;
for (var i = 0; i < arrowHeadPoints.length; i++) {
var point = arrowHeadPoints[i];
arrowHeadPoints[i] = rotate(point[0], point[1], cosA, sinA);
}
for (var i = 0; i < arrowHeadPoints.length; i++) {
var point = arrowHeadPoints[i];
arrowHeadPoints[i] = [x2 + point[0], y2 + point[1]];
}
var allPoints = [];
for (var i = 0; i < arrowHeadPoints.length; i++) {
var point = arrowHeadPoints[i];
allPoints.push(point.join(','));
}
var pointsAttr = allPoints.join(' ');
arrowHead
.attr("points", pointsAttr);
return this;
}
function moveDrawnEdgeEndPoint(x2, y2, options={}) {
if (!this._drawnEdge) {
throw Error('No edge has been drawn');
}
var edge = this._drawnEdge.g;
var x1 = this._drawnEdge.x1;
var y1 = this._drawnEdge.y1;
var attributes = this._drawnEdge.attributes;
this._drawnEdge.x2 = x2;
this._drawnEdge.y2 = y2;
_moveEdge(edge, x1, y1, x2, y2, attributes, options);
return this
}
function removeDrawnEdge() {
if (!this._drawnEdge) {
return this;
}
var edge = this._drawnEdge.g;
edge.remove();
this._drawnEdge = null;
return this
}
function insertDrawnEdge(name) {
if (!this._drawnEdge) {
throw Error('No edge has been drawn');
}
var edge = this._drawnEdge.g;
if (edge.empty()) {
return this;
}
this._drawnEdge.attributes;
var title = edge.selectWithoutDataPropagation("title");
title
.text(name);
var root = this._selection;
var svg = root.selectWithoutDataPropagation("svg");
var graph0 = svg.selectWithoutDataPropagation("g");
var graph0Datum = graph0.datum();
var edgeData = this._extractData(edge, graph0Datum.children.length, graph0.datum());
graph0Datum.children.push(edgeData);
insertAllElementsData(edge, edgeData);
this._drawnEdge = null;
return this
}
function drawnEdgeSelection() {
if (this._drawnEdge) {
return this._drawnEdge.g;
} else {
return d3__namespace.select(null);
}
}
function createEdge(attributes) {
var attributesString = '';
for (var name of Object.keys(attributes)) {
if (attributes[name] != null) {
attributesString += ' "' + name + '"="' + attributes[name] + '"';
}
}
var dotSrc = 'digraph {a -> b [' + attributesString + ']}';
var svgDoc = this.layoutSync(dotSrc, 'svg', 'dot');
var parser = new window.DOMParser();
var doc = parser.parseFromString(svgDoc, "image/svg+xml");
var newDoc = d3__namespace.select(document.createDocumentFragment())
.append(function() {
return doc.documentElement;
});
var edge = newDoc.select('.edge');
return edge;
}
function drawNode(x, y, nodeId, attributes={}, options={}) {
attributes = Object.assign({}, attributes);
if (attributes.style && attributes.style.includes('invis')) {
var newNode = d3__namespace.select(null);
} else {
var root = this._selection;
var svg = root.selectWithoutDataPropagation("svg");
var graph0 = svg.selectWithoutDataPropagation("g");
var newNode0 = createNode.call(this, nodeId, attributes);
var nodeData = extractAllElementsData(newNode0);
var newNode = graph0.append('g')
.data([nodeData]);
attributeElement.call(newNode.node(), nodeData);
_updateNode.call(this, newNode, x, y, nodeId, attributes, options);
}
this._drawnNode = {
g: newNode,
nodeId: nodeId,
x: x,
y: y,
attributes: attributes,
};
return this;
}
function updateDrawnNode(x, y, nodeId, attributes={}, options={}) {
if (!this._drawnNode) {
throw Error('No node has been drawn');
}
var node = this._drawnNode.g;
if (nodeId == null) {
nodeId = this._drawnNode.nodeId;
}
attributes = Object.assign(this._drawnNode.attributes, attributes);
this._drawnNode.nodeId = nodeId;
this._drawnNode.x = x;
this._drawnNode.y = y;
if (node.empty() && !(attributes.style && attributes.style.includes('invis'))) {
var root = this._selection;
var svg = root.selectWithoutDataPropagation("svg");
var graph0 = svg.selectWithoutDataPropagation("g");
var node = graph0.append('g');
this._drawnNode.g = node;
}
if (!node.empty()) {
_updateNode.call(this, node, x, y, nodeId, attributes, options);
}
return this;
}
function _updateNode(node, x, y, nodeId, attributes, options) {
var newNode = createNode.call(this, nodeId, attributes);
var nodeData = extractAllElementsData(newNode);
node.data([nodeData]);
attributeElement.call(node.node(), nodeData);
_moveNode(node, x, y, attributes);
return this;
}
function _moveNode(node, x, y, attributes, options) {
if (attributes.URL || attributes.tooltip) {
var subParent = node.selectWithoutDataPropagation("g").selectWithoutDataPropagation("a");
} else {
var subParent = node;
}
var svgElements = subParent.selectAll('ellipse,polygon,path,polyline');
var text = node.selectWithoutDataPropagation("text");
if (svgElements.size() != 0) {
var bbox = svgElements.node().getBBox();
bbox.cx = bbox.x + bbox.width / 2;
bbox.cy = bbox.y + bbox.height / 2;
} else if (text.size() != 0) {
bbox = {
x: +text.attr('x'),
y: +text.attr('y'),
width: 0,
height: 0,
cx: +text.attr('x'),
cy: +text.attr('y'),
};
}
svgElements.each(function(data, index) {
var svgElement = d3__namespace.select(this);
if (svgElement.attr("cx")) {
svgElement
.attr("cx", roundTo2Decimals(x))
.attr("cy", roundTo2Decimals(y));
} else if (svgElement.attr("points")) {
var pointsString = svgElement.attr('points').trim();
svgElement
.attr("points", translatePointsAttribute(pointsString, x - bbox.cx, y - bbox.cy));
} else {
var d = svgElement.attr('d');
svgElement
.attr("d", translateDAttribute(d, x - bbox.cx, y - bbox.cy));
}
});
if (text.size() != 0) {
text
.attr("x", roundTo2Decimals(+text.attr("x") + x - bbox.cx))
.attr("y", roundTo2Decimals(+text.attr("y") + y - bbox.cy));
}
return this;
}
function moveDrawnNode(x, y, options={}) {
if (!this._drawnNode) {
throw Error('No node has been drawn');
}
var node = this._drawnNode.g;
var attributes = this._drawnNode.attributes;
this._drawnNode.x = x;
this._drawnNode.y = y;
if (!node.empty()) {
_moveNode(node, x, y, attributes);
}
return this
}
function removeDrawnNode() {
if (!this._drawnNode) {
return this;
}
var node = this._drawnNode.g;
if (!node.empty()) {
node.remove();
}
this._drawnNode = null;
return this
}
function insertDrawnNode(nodeId) {
if (!this._drawnNode) {
throw Error('No node has been drawn');
}
if (nodeId == null) {
nodeId = this._drawnNode.nodeId;
}
var node = this._drawnNode.g;
if (node.empty()) {
return this;
}
var attributes = this._drawnNode.attributes;
var title = node.selectWithoutDataPropagation("title");
title
.text(nodeId);
if (attributes.URL || attributes.tooltip) {
var ga = node.selectWithoutDataPropagation("g");
var a = ga.selectWithoutDataPropagation("a");
a.selectWithoutDataPropagation('ellipse,polygon,path,polyline');
var text = a.selectWithoutDataPropagation('text');
} else {
node.selectWithoutDataPropagation('ellipse,polygon,path,polyline');
var text = node.selectWithoutDataPropagation('text');
}
text
.text(attributes.label || nodeId);
var root = this._selection;
var svg = root.selectWithoutDataPropagation("svg");
var graph0 = svg.selectWithoutDataPropagation("g");
var graph0Datum = graph0.datum();
var nodeData = this._extractData(node, graph0Datum.children.length, graph0.datum());
graph0Datum.children.push(nodeData);
insertAllElementsData(node, nodeData);
this._drawnNode = null;
return this
}
function drawnNodeSelection() {
if (this._drawnNode) {
return this._drawnNode.g;
} else {
return d3__namespace.select(null);
}
}
function createNode(nodeId, attributes) {
var attributesString = '';
for (var name of Object.keys(attributes)) {
if (attributes[name] != null) {
attributesString += ' "' + name + '"="' + attributes[name] + '"';
}
}
var dotSrc = 'graph {"' + nodeId + '" [' + attributesString + ']}';
var svgDoc = this.layoutSync(dotSrc, 'svg', 'dot');
var parser = new window.DOMParser();
var doc = parser.parseFromString(svgDoc, "image/svg+xml");
var newDoc = d3__namespace.select(document.createDocumentFragment())
.append(function() {
return doc.documentElement;
});
var node = newDoc.select('.node');
return node;
}
/* This file is excluded from coverage because the intrumented code
* translates "self" which gives a reference error.
*/
/* istanbul ignore next */
function workerCodeBody(port) {
self.document = {}; // Workaround for "ReferenceError: document is not defined" in hpccWasm
port.addEventListener('message', function(event) {
let hpccWasm = self["@hpcc-js/wasm"];
if (hpccWasm == undefined && event.data.vizURL) {
importScripts(event.data.vizURL);
hpccWasm = self["@hpcc-js/wasm"];
hpccWasm.wasmFolder(event.data.vizURL.match(/.*\//)[0]);
// This is an alternative workaround where wasmFolder() is not needed
// document = {currentScript: {src: event.data.vizURL}};
}
hpccWasm.graphviz.layout(event.data.dot, "svg", event.data.engine, event.data.options).then((svg) => {
if (svg) {
port.postMessage({
type: "done",
svg: svg,
});
} else if (event.data.vizURL) {
port.postMessage({
type: "init",
});
} else {
port.postMessage({
type: "skip",
});
}
}).catch(error => {
port.postMessage({
type: "error",
error: error.message,
});
});
});
}
/* istanbul ignore next */
function workerCode() {
const port = self;
workerCodeBody(port);
}
/* istanbul ignore next */
function sharedWorkerCode() {
self.onconnect = function(e) {
const port = e.ports[0];
workerCodeBody(port);
port.start();
};
}
function Graphviz(selection, options) {
this._options = {
useWorker: true,
useSharedWorker: false,
engine: 'dot',
keyMode: 'title',
fade: true,
tweenPaths: true,
tweenShapes: true,
convertEqualSidedPolygons: true,
tweenPrecision: 1,
growEnteringEdges: true,
zoom: true,
zoomScaleExtent: [0.1, 10],
zoomTranslateExtent: [[-Infinity, -Infinity], [+Infinity, +Infinity]],
width: null,
height: null,
scale: 1,
fit: false,
};
if (options instanceof Object) {
for (var option of Object.keys(options)) {
this._options[option] = options[option];
}
} else if (typeof options == 'boolean') {
this._options.useWorker = options;
}
var useWorker = this._options.useWorker;
var useSharedWorker = this._options.useSharedWorker;
if (typeof Worker == 'undefined') {
useWorker = false;
}
if (typeof SharedWorker == 'undefined') {
useSharedWorker = false;
}
if (useWorker || useSharedWorker) {
var scripts = d3__namespace.selectAll('script');
var vizScript = scripts.filter(function() {
return d3__namespace.select(this).attr('type') == 'javascript/worker' || (d3__namespace.select(this).attr('src') && d3__namespace.select(this).attr('src').match(/.*\/@hpcc-js\/wasm/));
});
if (vizScript.size() == 0) {
console.warn('No script tag of type "javascript/worker" was found and "useWorker" is true. Not using web worker.');
useWorker = false;
useSharedWorker = false;
} else {
this._vizURL = vizScript.attr('src');
if (!this._vizURL) {
console.warn('No "src" attribute of was found on the "javascript/worker" script tag and "useWorker" is true. Not using web worker.');
useWorker = false;
useSharedWorker = false;
}
}
}
if (useSharedWorker) {
const url = 'data:application/javascript;base64,' + btoa(workerCodeBody.toString() + '(' + sharedWorkerCode.toString() + ')()');
this._worker = this._worker = new SharedWorker(url);
this._workerPort = this._worker.port;
this._workerPortClose = this._worker.port.close.bind(this._workerPort);
this._worker.port.start();
this._workerCallbacks = [];
}
else if (useWorker) {
var blob = new Blob([workerCodeBody.toString() + '(' + workerCode.toString() + ')()']);
var blobURL = window.URL.createObjectURL(blob);
this._worker = new Worker(blobURL);
this._workerPort = this._worker;
this._workerPortClose = this._worker.terminate.bind(this._worker);
this._workerCallbacks = [];
}
this._selection = selection;
this._active = false;
this._busy = false;
this._jobs = [];
this._queue = [];
this._keyModes = new Set([
'title',
'id',
'tag-index',
'index'
]);
this._images = [];
this._translation = undefined;
this._scale = undefined;
this._eventTypes = [
'initEnd',
'start',
'layoutStart',
'layoutEnd',
'dataExtractEnd',
'dataProcessPass1End',
'dataProcessPass2End',
'dataProcessEnd',
'renderStart',
'renderEnd',
'transitionStart',
'transitionEnd',
'restoreEnd',
'end'
];
this._dispatch = d3Dispatch.dispatch(...this._eventTypes);
initViz.call(this);
selection.node().__graphviz__ = this;
}
function graphviz(selector, options) {
var g = d3__namespace.select(selector).graphviz(options);
return g;
}
Graphviz.prototype = graphviz.prototype = {
constructor: Graphviz,
engine: engine,
addImage: images,
keyMode: keyMode,
fade: fade,
tweenPaths: tweenPaths,
tweenShapes: tweenShapes,
convertEqualSidedPolygons: convertEqualSidedPolygons,
tweenPrecision: tweenPrecision,
growEnteringEdges: growEnteringEdges,
zoom: zoom,
resetZoom: resetZoom,
zoomBehavior: zoomBehavior,
zoomSelection: zoomSelection,
zoomScaleExtent: zoomScaleExtent,
zoomTranslateExtent: zoomTranslateExtent,
render: render,
layout: layout,
dot: dot,
data: data,
renderDot: renderDot,
transition: transition,
active: active,
options: options,
width: width,
height: height,
scale: scale,
fit: fit,
attributer: attributer,
on: on,
onerror: onerror,
logEvents: logEvents,
destroy: destroy,
drawEdge: drawEdge,
updateDrawnEdge: updateDrawnEdge,
moveDrawnEdgeEndPoint,
insertDrawnEdge,
removeDrawnEdge, removeDrawnEdge,
drawnEdgeSelection, drawnEdgeSelection,
drawNode: drawNode,
updateDrawnNode: updateDrawnNode,
moveDrawnNode: moveDrawnNode,
insertDrawnNode,
removeDrawnNode, removeDrawnNode,
drawnNodeSelection, drawnNodeSelection,
};
function selection_graphviz(options) {
var g = this.node().__graphviz__;
if (g) {
g.options(options);
// Ensure a possible new initEnd event handler is attached before calling it
d3Timer.timeout(function () {
g._dispatch.call("initEnd", this);
}.bind(this), 0);
} else {
g = new Graphviz(this, options);
}
return g;
}
function selection_selectWithoutDataPropagation(name) {
return d3__namespace.select(this.size() > 0 ? this.node().querySelector(name) : null);
}
d3.selection.prototype.graphviz = selection_graphviz;
d3.selection.prototype.selectWithoutDataPropagation = selection_selectWithoutDataPropagation;
exports.graphviz = graphviz;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=d3-graphviz.js.map
{"version":3,"file":"d3-graphviz.js","sources":["../src/element.js","../src/utils.js","../src/zoom.js","../src/tweening.js","../src/data.js","../src/render.js","../src/svg.js","../src/dot.js","../src/renderDot.js","../src/transition.js","../src/options.js","../src/width.js","../src/height.js","../src/scale.js","../src/fit.js","../src/attributer.js","../src/engine.js","../src/images.js","../src/keyMode.js","../src/fade.js","../src/tweenPaths.js","../src/tweenShapes.js","../src/convertEqualSidedPolygons.js","../src/tweenPrecision.js","../src/growEnteringEdges.js","../src/on.js","../src/onerror.js","../src/logEvents.js","../src/destroy.js","../src/geometry.js","../src/drawEdge.js","../src/drawNode.js","../src/workerCode.js","../src/graphviz.js","../src/selection/graphviz.js","../src/selection/selectWithoutDataPropagation.js","../src/selection/index.js"],"sourcesContent":["import * as d3 from \"d3-selection\";\n\nexport function extractElementData(element) {\n\n var datum = {};\n var tag = element.node().nodeName;\n datum.tag = tag;\n if (tag == '#text') {\n datum.text = element.text();\n } else if (tag == '#comment') {\n datum.comment = element.text();\n }\n datum.attributes = {};\n var attributes = element.node().attributes;\n if (attributes) {\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n var name = attribute.name;\n var value = attribute.value;\n datum.attributes[name] = value;\n }\n }\n var transform = element.node().transform;\n if (transform && transform.baseVal.numberOfItems != 0) {\n var matrix = transform.baseVal.consolidate().matrix;\n datum.translation = {x: matrix.e, y: matrix.f};\n datum.scale = matrix.a;\n }\n if (tag == 'ellipse') {\n datum.center = {\n x: datum.attributes.cx,\n y: datum.attributes.cy,\n };\n }\n if (tag == 'polygon') {\n var points = element.attr('points').split(' ');\n var x = points.map(function(p) {return p.split(',')[0]});\n var y = points.map(function(p) {return p.split(',')[1]});\n var xmin = Math.min.apply(null, x);\n var xmax = Math.max.apply(null, x);\n var ymin = Math.min.apply(null, y);\n var ymax = Math.max.apply(null, y);\n var bbox = {\n x: xmin,\n y: ymin,\n width: xmax - xmin,\n height: ymax - ymin,\n };\n datum.bbox = bbox;\n datum.center = {\n x: (xmin + xmax) / 2,\n y: (ymin + ymax) / 2,\n };\n }\n if (tag == 'path') {\n var d = element.attr('d');\n var points = d.split(/[A-Z ]/);\n points.shift();\n var x = points.map(function(p) {return +p.split(',')[0]});\n var y = points.map(function(p) {return +p.split(',')[1]});\n var xmin = Math.min.apply(null, x);\n var xmax = Math.max.apply(null, x);\n var ymin = Math.min.apply(null, y);\n var ymax = Math.max.apply(null, y);\n var bbox = {\n x: xmin,\n y: ymin,\n width: xmax - xmin,\n height: ymax - ymin,\n };\n datum.bbox = bbox;\n datum.center = {\n x: (xmin + xmax) / 2,\n y: (ymin + ymax) / 2,\n };\n datum.totalLength = element.node().getTotalLength();\n }\n if (tag == 'text') {\n datum.center = {\n x: element.attr('x'),\n y: element.attr('y'),\n };\n }\n if (tag == '#text') {\n datum.text = element.text();\n } else if (tag == '#comment') {\n datum.comment = element.text();\n }\n return datum\n}\n\nexport function extractAllElementsData(element) {\n\n var datum = extractElementData(element);\n datum.children = [];\n var children = d3.selectAll(element.node().childNodes);\n children.each(function () {\n var childData = extractAllElementsData(d3.select(this));\n childData.parent = datum;\n datum.children.push(childData);\n });\n return datum;\n}\n\nexport function createElement(data) {\n\n if (data.tag == '#text') {\n return document.createTextNode(\"\");\n } else if (data.tag == '#comment') {\n return document.createComment(data.comment);\n } else {\n return document.createElementNS('http://www.w3.org/2000/svg', data.tag);\n }\n}\n\nexport function createElementWithAttributes(data) {\n\n var elementNode = createElement(data);\n var element = d3.select(elementNode);\n var attributes = data.attributes;\n for (var attributeName of Object.keys(attributes)) {\n var attributeValue = attributes[attributeName];\n element.attr(attributeName, attributeValue);\n }\n return elementNode;\n}\n\nexport function replaceElement(element, data) {\n var parent = d3.select(element.node().parentNode);\n var newElementNode = createElementWithAttributes(data);\n var newElement = parent.insert(function () {\n return newElementNode;\n }, function () {\n return element.node();\n });\n element.remove();\n return newElement;\n}\n\nexport function insertElementData(element, datum) {\n element.datum(datum);\n element.data([datum], function (d) {\n return d.key;\n });\n}\n\nexport function insertAllElementsData(element, datum) {\n insertElementData(element, datum);\n var children = d3.selectAll(element.node().childNodes);\n children.each(function (d, i) {\n insertAllElementsData(d3.select(this), datum.children[i]);\n });\n}\n\nfunction insertChildren(element, index) {\n var children = element.selectAll(function () {\n return element.node().childNodes;\n });\n\n children = children\n .data(function (d) {\n return d.children;\n }, function (d) {\n return d.tag + '-' + index;\n });\n var childrenEnter = children\n .enter()\n .append(function(d) {\n return createElement(d);\n });\n\n var childrenExit = children\n .exit();\n childrenExit = childrenExit\n .remove()\n children = childrenEnter\n .merge(children);\n var childTagIndexes = {};\n children.each(function(childData) {\n var childTag = childData.tag;\n if (childTagIndexes[childTag] == null) {\n childTagIndexes[childTag] = 0;\n }\n var childIndex = childTagIndexes[childTag]++;\n attributeElement.call(this, childData, childIndex);\n });\n}\n\nexport function attributeElement(data, index=0) {\n var element = d3.select(this);\n var tag = data.tag;\n var attributes = data.attributes;\n var currentAttributes = element.node().attributes;\n if (currentAttributes) {\n for (var i = 0; i < currentAttributes.length; i++) {\n var currentAttribute = currentAttributes[i];\n var name = currentAttribute.name;\n if (name.split(':')[0] != 'xmlns' && currentAttribute.namespaceURI) {\n var namespaceURIParts = currentAttribute.namespaceURI.split('/');\n var namespace = namespaceURIParts[namespaceURIParts.length - 1];\n name = namespace + ':' + name;\n }\n if (!(name in attributes)) {\n attributes[name] = null;\n }\n }\n }\n for (var attributeName of Object.keys(attributes)) {\n element\n .attr(attributeName, attributes[attributeName]);\n }\n if (data.text) {\n element\n .text(data.text);\n }\n insertChildren(element, index);\n}\n","export function shallowCopyObject(obj) {\n return Object.assign({}, obj);\n}\n\nexport function roundTo2Decimals(x) {\n return Math.round(x * 100.0) / 100.0\n}\n","import * as d3 from \"d3-selection\";\nimport {zoom, zoomTransform, zoomIdentity} from \"d3-zoom\";\nimport {interpolate} from \"d3-interpolate\";\n\nexport default function(enable) {\n\n this._options.zoom = enable;\n\n if (this._options.zoom && !this._zoomBehavior) {\n createZoomBehavior.call(this);\n } else if (!this._options.zoom && this._zoomBehavior) {\n this._zoomSelection.on(\".zoom\", null);\n this._zoomBehavior = null;\n }\n\n return this;\n}\n\nexport function createZoomBehavior() {\n\n function zoomed(event) {\n var g = d3.select(svg.node().querySelector(\"g\"));\n g.attr('transform', event.transform);\n }\n\n var root = this._selection;\n var svg = d3.select(root.node().querySelector(\"svg\"));\n if (svg.size() == 0) {\n return this;\n }\n this._zoomSelection = svg;\n var zoomBehavior = zoom()\n .scaleExtent(this._options.zoomScaleExtent)\n .translateExtent(this._options.zoomTranslateExtent)\n .interpolate(interpolate)\n .on(\"zoom\", zoomed);\n this._zoomBehavior = zoomBehavior;\n var g = d3.select(svg.node().querySelector(\"g\"));\n svg.call(zoomBehavior);\n if (!this._active) {\n translateZoomBehaviorTransform.call(this, g);\n }\n this._originalTransform = zoomTransform(svg.node());\n\n return this;\n};\n\nexport function getTranslatedZoomTransform(selection) {\n\n // Get the current zoom transform for the top level svg and\n // translate it uniformly with the given selection, using the\n // difference between the translation specified in the selection's\n // data and it's saved previous translation. The selection is\n // normally the top level g element of the graph.\n var oldTranslation = this._translation;\n var oldScale = this._scale;\n var newTranslation = selection.datum().translation;\n var newScale = selection.datum().scale;\n var t = zoomTransform(this._zoomSelection.node());\n if (oldTranslation) {\n t = t.scale(1 / oldScale);\n t = t.translate(-oldTranslation.x, -oldTranslation.y);\n }\n t = t.translate(newTranslation.x, newTranslation.y);\n t = t.scale(newScale);\n return t;\n}\n\nexport function translateZoomBehaviorTransform(selection) {\n\n // Translate the current zoom transform for the top level svg\n // uniformly with the given selection, using the difference\n // between the translation specified in the selection's data and\n // it's saved previous translation. The selection is normally the\n // top level g element of the graph.\n this._zoomBehavior.transform(this._zoomSelection, getTranslatedZoomTransform.call(this, selection));\n\n // Save the selections's new translation and scale.\n this._translation = selection.datum().translation;\n this._scale = selection.datum().scale;\n\n // Set the original zoom transform to the translation and scale specified in\n // the selection's data.\n this._originalTransform = zoomIdentity.translate(selection.datum().translation.x, selection.datum().translation.y).scale(selection.datum().scale);\n}\n\nexport function resetZoom(transition) {\n\n // Reset the zoom transform to the original zoom transform.\n var selection = this._zoomSelection;\n if (transition) {\n selection = selection\n .transition(transition);\n }\n selection\n .call(this._zoomBehavior.transform, this._originalTransform);\n\n return this;\n}\n\nexport function zoomScaleExtent(extent) {\n\n this._options.zoomScaleExtent = extent;\n\n return this;\n}\n\nexport function zoomTranslateExtent(extent) {\n\n this._options.zoomTranslateExtent = extent;\n\n return this;\n}\n\nexport function zoomBehavior() {\n return this._zoomBehavior || null;\n}\n\nexport function zoomSelection() {\n return this._zoomSelection || null;\n}\n","import {interpolate} from \"d3-interpolate\";\n\nexport function pathTween(points, d1) {\n return function() {\n const pointInterpolators = points.map(function(p) {\n return interpolate([p[0][0], p[0][1]], [p[1][0], p[1][1]]);\n });\n return function(t) {\n return t < 1 ? \"M\" + pointInterpolators.map(function(p) { return p(t); }).join(\"L\") : d1;\n };\n };\n}\n\nexport function pathTweenPoints(node, d1, precision, precisionIsRelative) {\n const path0 = node;\n const path1 = path0.cloneNode();\n const n0 = path0.getTotalLength();\n const n1 = (path1.setAttribute(\"d\", d1), path1).getTotalLength();\n\n // Uniform sampling of distance based on specified precision.\n const distances = [0];\n let i = 0;\n const dt = precisionIsRelative ? precision : precision / Math.max(n0, n1);\n while ((i += dt) < 1) {\n distances.push(i);\n }\n distances.push(1);\n\n // Compute point-interpolators at each distance.\n const points = distances.map(function(t) {\n const p0 = path0.getPointAtLength(t * n0);\n const p1 = path1.getPointAtLength(t * n1);\n return ([[p0.x, p0.y], [p1.x, p1.y]]);\n });\n return points;\n}\n","export default function() {\n return this._data || null;\n}\n\nexport function isEdgeElementParent(datum) {\n return (datum.attributes.class == 'edge' || (\n datum.tag == 'a' &&\n datum.parent.tag == 'g' &&\n datum.parent.parent.attributes.class == 'edge'\n ));\n}\n\nexport function isEdgeElement(datum) {\n return datum.parent && isEdgeElementParent(datum.parent);\n}\n\nexport function getEdgeGroup(datum) {\n if (datum.parent.attributes.class == 'edge') {\n return datum.parent;\n } else { // datum.parent.tag == 'g' && datum.parent.parent.tag == 'g' && datum.parent.parent.parent.attributes.class == 'edge'\n return datum.parent.parent.parent;\n }\n}\n\nexport function getEdgeTitle(datum) {\n return getEdgeGroup(datum).children.find(function (e) {\n return e.tag == 'title';\n });\n}\n","import * as d3 from \"d3-selection\";\nimport {transition} from \"d3-transition\";\nimport {timeout} from \"d3-timer\";\nimport {interpolateTransformSvg} from \"d3-interpolate\";\nimport {zoomTransform} from \"d3-zoom\";\nimport {createElement, extractElementData, replaceElement} from \"./element\";\nimport {shallowCopyObject} from \"./utils\";\nimport {createZoomBehavior, getTranslatedZoomTransform, translateZoomBehaviorTransform} from \"./zoom\";\nimport {pathTween} from \"./tweening\";\nimport {isEdgeElement} from \"./data\";\nimport {isEdgeElementParent} from \"./data\";\n\nexport default function(callback) {\n\n if (this._busy) {\n this._queue.push(this.render.bind(this, callback));\n return this;\n }\n this._dispatch.call('renderStart', this);\n\n if (this._transitionFactory) {\n timeout(function () { // Decouple from time spent. See https://github.com/d3/d3-timer/issues/27\n this._transition = transition(this._transitionFactory());\n _render.call(this, callback);\n }.bind(this), 0);\n } else {\n _render.call(this, callback);\n }\n return this;\n}\n\nfunction _render(callback) {\n\n var transitionInstance = this._transition;\n var fade = this._options.fade && transitionInstance != null;\n var tweenPaths = this._options.tweenPaths;\n var tweenShapes = this._options.tweenShapes;\n var convertEqualSidedPolygons = this._options.convertEqualSidedPolygons;\n var growEnteringEdges = this._options.growEnteringEdges && transitionInstance != null;\n var attributer = this._attributer;\n var graphvizInstance = this;\n\n function insertChildren(element) {\n var children = element.selectAll(function () {\n return element.node().childNodes;\n });\n\n children = children\n .data(function (d) {\n return d.children;\n }, function (d) {\n return d.key;\n });\n var childrenEnter = children\n .enter()\n .append(function(d) {\n var element = createElement(d);\n if (d.tag == '#text' && fade) {\n element.nodeValue = d.text;\n }\n return element;\n });\n\n if (fade || (growEnteringEdges && isEdgeElementParent(element.datum()))) {\n var childElementsEnter = childrenEnter\n .filter(function(d) {\n return d.tag[0] == '#' ? null : this;\n })\n .each(function (d) {\n var childEnter = d3.select(this);\n for (var attributeName of Object.keys(d.attributes)) {\n var attributeValue = d.attributes[attributeName];\n childEnter\n .attr(attributeName, attributeValue);\n }\n });\n childElementsEnter\n .filter(function(d) {\n return d.tag == 'svg' || d.tag == 'g' ? null : this;\n })\n .style(\"opacity\", 0.0);\n }\n var childrenExit = children\n .exit();\n if (attributer) {\n childrenExit.each(attributer);\n }\n if (transitionInstance) {\n childrenExit = childrenExit\n .transition(transitionInstance);\n if (fade) {\n childrenExit\n .filter(function(d) {\n return d.tag[0] == '#' ? null : this;\n })\n .style(\"opacity\", 0.0);\n }\n }\n childrenExit = childrenExit\n .remove()\n children = childrenEnter\n .merge(children);\n children.each(attributeElement);\n }\n\n function attributeElement(data) {\n var element = d3.select(this);\n if (data.tag == \"svg\") {\n var options = graphvizInstance._options;\n if (options.width != null || options.height != null) {\n var width = options.width;\n var height = options.height;\n if (width == null) {\n width = data.attributes.width.replace('pt', '') * 4 / 3;\n } else {\n element\n .attr(\"width\", width);\n data.attributes.width = width;\n }\n if (height == null) {\n height = data.attributes.height.replace('pt', '') * 4 / 3;\n } else {\n element\n .attr(\"height\", height);\n data.attributes.height = height;\n }\n if (!options.fit) {\n element\n .attr(\"viewBox\", `0 0 ${width * 3 / 4 / options.scale} ${height * 3 / 4 / options.scale}`);\n data.attributes.viewBox = `0 0 ${width * 3 / 4 / options.scale} ${height * 3 / 4 / options.scale}`;\n }\n }\n if (options.scale != 1 && (options.fit || (options.width == null && options.height == null))) {\n width = data.attributes.viewBox.split(' ')[2];\n height = data.attributes.viewBox.split(' ')[3];\n element\n .attr(\"viewBox\", `0 0 ${width / options.scale} ${height / options.scale}`);\n data.attributes.viewBox = `0 0 ${width / options.scale} ${height / options.scale}`;\n }\n }\n if (attributer) {\n element.each(attributer);\n }\n var tag = data.tag;\n var attributes = data.attributes;\n var currentAttributes = element.node().attributes;\n if (currentAttributes) {\n for (var i = 0; i < currentAttributes.length; i++) {\n var currentAttribute = currentAttributes[i];\n var name = currentAttribute.name;\n if (name.split(':')[0] != 'xmlns' && currentAttribute.namespaceURI) {\n var namespaceURIParts = currentAttribute.namespaceURI.split('/');\n var namespace = namespaceURIParts[namespaceURIParts.length - 1];\n name = namespace + ':' + name;\n }\n if (!(name in attributes)) {\n attributes[name] = null;\n }\n }\n }\n var convertShape = false;\n var convertPrevShape = false;\n if (tweenShapes && transitionInstance) {\n if ((this.nodeName == 'polygon' || this.nodeName == 'ellipse') && data.alternativeOld) {\n convertPrevShape = true;\n }\n if ((tag == 'polygon' || tag == 'ellipse') && data.alternativeNew) {\n convertShape = true;\n }\n if (this.nodeName == 'polygon' && tag == 'polygon' && data.alternativeOld) {\n var prevData = extractElementData(element);\n var prevPoints = prevData.attributes.points;\n if (!convertEqualSidedPolygons) {\n var nPrevPoints = prevPoints.split(' ').length;\n var points = data.attributes.points;\n var nPoints = points.split(' ').length;\n if (nPoints == nPrevPoints) {\n convertShape = false;\n convertPrevShape = false;\n }\n }\n }\n if (convertPrevShape) {\n var prevPathData = data.alternativeOld;\n var pathElement = replaceElement(element, prevPathData);\n pathElement.data([data], function () {\n return data.key;\n });\n element = pathElement;\n }\n if (convertShape) {\n var newPathData = data.alternativeNew;\n tag = 'path';\n attributes = newPathData.attributes;\n }\n }\n var elementTransition = element;\n if (transitionInstance) {\n elementTransition = elementTransition\n .transition(transitionInstance);\n if (fade) {\n elementTransition\n .filter(function(d) {\n return d.tag[0] == '#' ? null : this;\n })\n .style(\"opacity\", 1.0);\n }\n elementTransition\n .filter(function(d) {\n return d.tag[0] == '#' ? null : this;\n })\n .on(\"end\", function(d) {\n d3.select(this)\n .attr('style', (d && d.attributes && d.attributes.style) || null);\n });\n }\n var growThisPath = growEnteringEdges && tag == 'path' && data.offset;\n if (growThisPath) {\n var totalLength = data.totalLength;\n element\n .attr(\"stroke-dasharray\", totalLength + \" \" + totalLength)\n .attr(\"stroke-dashoffset\", totalLength)\n .attr('transform', 'translate(' + data.offset.x + ',' + data.offset.y + ')');\n attributes[\"stroke-dashoffset\"] = 0;\n attributes['transform'] = 'translate(0,0)';\n elementTransition\n .attr(\"stroke-dashoffset\", attributes[\"stroke-dashoffset\"])\n .attr('transform', attributes['transform'])\n .on(\"start\", function() {\n d3.select(this)\n .style('opacity', null);\n })\n .on(\"end\", function() {\n d3.select(this)\n .attr('stroke-dashoffset', null)\n .attr('stroke-dasharray', null)\n .attr('transform', null);\n });\n }\n var moveThisPolygon = growEnteringEdges && tag == 'polygon' && isEdgeElement(data) && data.offset && data.parent.children[3].tag == 'path';\n if (moveThisPolygon) {\n var edgePath = d3.select(element.node().parentNode.querySelector(\"path\"));\n var p0 = edgePath.node().getPointAtLength(0);\n var p1 = edgePath.node().getPointAtLength(data.totalLength);\n var p2 = edgePath.node().getPointAtLength(data.totalLength - 1);\n var angle1 = Math.atan2(p1.y - p2.y, p1.x - p2.x) * 180 / Math.PI;\n var x = p0.x - p1.x + data.offset.x;\n var y = p0.y - p1.y + data.offset.y;\n element\n .attr('transform', 'translate(' + x + ',' + y + ')');\n elementTransition\n .attrTween(\"transform\", function () {\n return function (t) {\n var p = edgePath.node().getPointAtLength(data.totalLength * t);\n var p2 = edgePath.node().getPointAtLength(data.totalLength * t + 1);\n var angle = Math.atan2(p2.y - p.y, p2.x - p.x) * 180 / Math.PI - angle1;\n x = p.x - p1.x + data.offset.x * (1 - t);\n y = p.y - p1.y + data.offset.y * (1 - t);\n return 'translate(' + x + ',' + y + ') rotate(' + angle + ' ' + p1.x + ' ' + p1.y + ')';\n }\n })\n .on(\"start\", function() {\n d3.select(this)\n .style('opacity', null);\n })\n .on(\"end\", function() {\n d3.select(this).attr('transform', null);\n });\n }\n var tweenThisPath = tweenPaths && transitionInstance && tag == 'path' && element.attr('d') != null;\n for (var attributeName of Object.keys(attributes)) {\n var attributeValue = attributes[attributeName];\n if (tweenThisPath && attributeName == 'd') {\n var points = (data.alternativeOld || data).points;\n if (points) {\n elementTransition\n .attrTween(\"d\", pathTween(points, attributeValue));\n }\n } else {\n if (attributeName == 'transform' && data.translation) {\n if (transitionInstance) {\n var onEnd = elementTransition.on(\"end\");\n elementTransition\n .on(\"start\", function () {\n if (graphvizInstance._zoomBehavior) {\n // Update the transform to transition to, just before the transition starts\n // in order to catch changes between the transition scheduling to its start.\n elementTransition\n .tween(\"attr.transform\", function() {\n var node = this;\n return function(t) {\n node.setAttribute(\"transform\", interpolateTransformSvg(zoomTransform(graphvizInstance._zoomSelection.node()).toString(), getTranslatedZoomTransform.call(graphvizInstance, element).toString())(t));\n };\n });\n }\n })\n .on(\"end\", function () {\n onEnd.call(this);\n // Update the zoom transform to the new translated transform\n if (graphvizInstance._zoomBehavior) {\n translateZoomBehaviorTransform.call(graphvizInstance, element);\n }\n })\n } else {\n if (graphvizInstance._zoomBehavior) {\n // Update the transform attribute to set with the current pan translation\n translateZoomBehaviorTransform.call(graphvizInstance, element);\n attributeValue = getTranslatedZoomTransform.call(graphvizInstance, element).toString();\n }\n }\n }\n elementTransition\n .attr(attributeName, attributeValue);\n }\n }\n if (convertShape) {\n elementTransition\n .on(\"end\", function (d, i, nodes) {\n pathElement = d3.select(this);\n var newElement = replaceElement(pathElement, d);\n newElement.data([d], function () {\n return d.key;\n });\n })\n }\n if (data.text) {\n elementTransition\n .text(data.text);\n }\n insertChildren(element);\n }\n\n var root = this._selection;\n\n if (transitionInstance != null) {\n // Ensure original SVG shape elements are restored after transition before rendering new graph\n var jobs = this._jobs;\n if (graphvizInstance._active) {\n jobs.push(null);\n return this;\n } else {\n root\n .transition(transitionInstance)\n .transition()\n .duration(0)\n .on(\"end\" , function () {\n graphvizInstance._active = false;\n if (jobs.length != 0) {\n jobs.shift();\n graphvizInstance.render();\n }\n });\n this._active = true;\n }\n }\n\n if (transitionInstance != null) {\n root\n .transition(transitionInstance)\n .on(\"start\" , function () {\n graphvizInstance._dispatch.call('transitionStart', graphvizInstance);\n })\n .on(\"end\" , function () {\n graphvizInstance._dispatch.call('transitionEnd', graphvizInstance);\n })\n .transition()\n .duration(0)\n .on(\"start\" , function () {\n graphvizInstance._dispatch.call('restoreEnd', graphvizInstance);\n graphvizInstance._dispatch.call('end', graphvizInstance);\n if (callback) {\n callback.call(graphvizInstance);\n }\n });\n }\n\n var data = this._data;\n\n var svg = root\n .selectAll(\"svg\")\n .data([data], function (d) {return d.key});\n svg = svg\n .enter()\n .append(\"svg\")\n .merge(svg);\n\n attributeElement.call(svg.node(), data);\n\n\n if (this._options.zoom && !this._zoomBehavior) {\n createZoomBehavior.call(this);\n }\n\n graphvizInstance._dispatch.call('renderEnd', graphvizInstance);\n\n if (transitionInstance == null) {\n this._dispatch.call('end', this);\n if (callback) {\n callback.call(this);\n }\n }\n\n return this;\n};\n","import {shallowCopyObject} from \"./utils\";\nimport {roundTo2Decimals} from \"./utils\";\n\nexport function convertToPathData(originalData, guideData) {\n if (originalData.tag == 'polygon') {\n var newData = shallowCopyObject(originalData);\n newData.tag = 'path';\n var originalAttributes = originalData.attributes;\n var newAttributes = shallowCopyObject(originalAttributes);\n var newPointsString = originalAttributes.points;\n if (guideData.tag == 'polygon') {\n var bbox = originalData.bbox;\n bbox.cx = bbox.x + bbox.width / 2;\n bbox.cy = bbox.y + bbox.height / 2;\n var pointsString = originalAttributes.points;\n var pointStrings = pointsString.split(' ');\n var normPoints = pointStrings.map(function(p) {var xy = p.split(','); return [xy[0] - bbox.cx, xy[1] - bbox.cy]});\n var x0 = normPoints[normPoints.length - 1][0];\n var y0 = normPoints[normPoints.length - 1][1];\n for (var i = 0; i < normPoints.length; i++, x0 = x1, y0 = y1) {\n var x1 = normPoints[i][0];\n var y1 = normPoints[i][1];\n var dx = x1 - x0;\n var dy = y1 - y0;\n if (dy == 0) {\n continue;\n } else {\n var x2 = x0 - y0 * dx / dy;\n }\n if (0 <= x2 && x2 < Infinity && ((x0 <= x2 && x2 <= x1) || (x1 <= x2 && x2 <= x0))) {\n break;\n }\n }\n var newPointStrings = [[bbox.cx + x2, bbox.cy + 0].join(',')];\n newPointStrings = newPointStrings.concat(pointStrings.slice(i));\n newPointStrings = newPointStrings.concat(pointStrings.slice(0, i));\n newPointsString = newPointStrings.join(' ');\n }\n newAttributes['d'] = 'M' + newPointsString + 'z';\n delete newAttributes.points;\n newData.attributes = newAttributes;\n } else /* if (originalData.tag == 'ellipse') */ {\n var newData = shallowCopyObject(originalData);\n newData.tag = 'path';\n var originalAttributes = originalData.attributes;\n var newAttributes = shallowCopyObject(originalAttributes);\n var cx = originalAttributes.cx;\n var cy = originalAttributes.cy;\n var rx = originalAttributes.rx;\n var ry = originalAttributes.ry;\n if (guideData.tag == 'polygon') {\n var bbox = guideData.bbox;\n bbox.cx = bbox.x + bbox.width / 2;\n bbox.cy = bbox.y + bbox.height / 2;\n var p = guideData.attributes.points.split(' ')[0].split(',');\n var sx = p[0];\n var sy = p[1];\n var dx = sx - bbox.cx;\n var dy = sy - bbox.cy;\n var l = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));\n var cosA = dx / l;\n var sinA = -dy / l;\n } else { // if (guideData.tag == 'path') {\n // FIXME: add support for getting start position from path\n var cosA = 1;\n var sinA = 0;\n }\n var x1 = rx * cosA;\n var y1 = -ry * sinA;\n var x2 = rx * (-cosA);\n var y2 = -ry * (-sinA);\n var dx = x2 - x1;\n var dy = y2 - y1;\n newAttributes['d'] = 'M ' + cx + ' ' + cy + ' m ' + x1 + ',' + y1 + ' a ' + rx + ',' + ry + ' 0 1,0 ' + dx + ',' + dy + ' a ' + rx + ',' + ry + ' 0 1,0 ' + -dx + ',' + -dy + 'z';\n delete newAttributes.cx;\n delete newAttributes.cy;\n delete newAttributes.rx;\n delete newAttributes.ry;\n newData.attributes = newAttributes;\n }\n return newData;\n}\n\nexport function translatePointsAttribute(pointsString, x, y) {\n var pointStrings = pointsString.split(' ');\n var points = pointStrings.map(function(p) {return p.split(',')});\n var points = pointStrings.map(function(p) {return [roundTo2Decimals(+x + +p.split(',')[0]), roundTo2Decimals(+y + +p.split(',')[1])]});\n var pointStrings = points.map(function(p) {return p.join(',')});\n var pointsString = pointStrings.join(' ');\n return pointsString;\n}\n\nexport function translateDAttribute(d, x, y) {\n var pointStrings = d.split(/[A-Z ]/);\n pointStrings.shift();\n var commands = d.split(/[^[A-Z ]+/);\n var points = pointStrings.map(function(p) {return p.split(',')});\n var points = pointStrings.map(function(p) {return [roundTo2Decimals(+x + +p.split(',')[0]), roundTo2Decimals(+y + +p.split(',')[1])]});\n var pointStrings = points.map(function(p) {return p.join(',')});\n d = commands.reduce(function(arr, v, i) {\n return arr.concat(v, pointStrings[i]);\n }, []).join('');\n return d;\n}\n","import { graphviz } from \"@hpcc-js/wasm\";\nimport { graphvizSync } from \"@hpcc-js/wasm\";\nimport * as d3 from \"d3-selection\";\nimport {extractAllElementsData, extractElementData, createElementWithAttributes} from \"./element\";\nimport {convertToPathData} from \"./svg\";\nimport {pathTweenPoints} from \"./tweening\";\nimport {isEdgeElement} from \"./data\";\nimport {getEdgeTitle} from \"./data\";\n\n\nexport function initViz() {\n\n // force JIT compilation of Viz.js\n try {\n graphviz.layout(\"\", \"svg\", \"dot\").then(() => {\n graphvizSync().then((graphviz1) => {\n this.layoutSync = graphviz1.layout.bind(graphviz1);\n if (this._worker == null) {\n this._dispatch.call(\"initEnd\", this);\n }\n if (this._afterInit) {\n this._afterInit();\n }\n });\n });\n } catch(error) {\n }\n if (this._worker != null) {\n var vizURL = this._vizURL;\n var graphvizInstance = this;\n this._workerPort.onmessage = function(event) {\n var callback = graphvizInstance._workerCallbacks.shift();\n callback.call(graphvizInstance, event);\n }\n if (!vizURL.match(/^https?:\\/\\/|^\\/\\//i)) {\n // Local URL. Prepend with local domain to be usable in web worker\n vizURL = (new window.URL(vizURL, document.location.href)).href;\n }\n postMessage.call(this, {dot: \"\", engine: 'dot', vizURL: vizURL}, function(event) {\n switch (event.data.type) {\n case \"init\":\n graphvizInstance._dispatch.call(\"initEnd\", this);\n break;\n }\n });\n }\n}\n\nfunction postMessage(message, callback) {\n this._workerCallbacks.push(callback);\n this._workerPort.postMessage(message);\n}\n\nexport function layout(src, engine, vizOptions, callback) {\n var graphvizInstance = this;\n var worker = this._worker;\n if (this._worker) {\n postMessage.call(this, {\n dot: src,\n engine: engine,\n options: vizOptions,\n }, function (event) {\n callback.call(this, event.data);\n });\n } else {\n try {\n var svgDoc = this.layoutSync(src, \"svg\", engine, vizOptions);\n callback.call(this, {type: 'done', svg: svgDoc});\n }\n catch(error) {\n callback.call(this, {type: 'error', error: error.message});\n }\n }\n}\n\nexport default function(src, callback) {\n\n var graphvizInstance = this;\n var worker = this._worker;\n var engine = this._options.engine;\n var images = this._images;\n\n this._dispatch.call(\"start\", this);\n this._busy = true;\n this._dispatch.call(\"layoutStart\", this);\n var vizOptions = {\n images: images,\n };\n if (!this._worker && this.layoutSync == null) {\n this._afterInit = this.dot.bind(this, src, callback);\n return this;\n }\n this.layout(src, engine, vizOptions, function (data) {\n switch (data.type) {\n case \"error\":\n if (graphvizInstance._onerror) {\n graphvizInstance._onerror(data.error);\n } else {\n throw data.error.message\n }\n break;\n case \"done\":\n var svgDoc = data.svg;\n layoutDone.call(this, svgDoc, callback);\n break;\n }\n });\n\n return this;\n};\n\nfunction layoutDone(svgDoc, callback) {\n var keyMode = this._options.keyMode;\n var tweenPaths = this._options.tweenPaths;\n var tweenShapes = this._options.tweenShapes;\n if (typeof this._options.tweenPrecision == 'string' && this._options.tweenPrecision.includes('%')) {\n var tweenPrecision = +this._options.tweenPrecision.split('%')[0] / 100;\n var tweenPrecisionIsRelative = this._options.tweenPrecision.includes('%');\n } else {\n var tweenPrecision = this._options.tweenPrecision;\n var tweenPrecisionIsRelative = false;\n }\n var growEnteringEdges = this._options.growEnteringEdges;\n var dictionary = {};\n var prevDictionary = this._dictionary || {};\n var nodeDictionary = {};\n var prevNodeDictionary = this._nodeDictionary || {};\n\n function setKey(datum, index) {\n var tag = datum.tag;\n if (keyMode == 'index') {\n datum.key = index;\n } else if (tag[0] != '#') {\n if (keyMode == 'id') {\n datum.key = datum.attributes.id;\n } else if (keyMode == 'title') {\n var title = datum.children.find(function (childData) {\n return childData.tag == 'title';\n });\n if (title) {\n if (title.children.length > 0) {\n datum.key = title.children[0].text;\n } else {\n datum.key = '';\n }\n }\n }\n }\n if (datum.key == null) {\n if (tweenShapes) {\n if (tag == 'ellipse' || tag == 'polygon') {\n tag = 'path';\n }\n }\n datum.key = tag + '-' + index;\n }\n }\n\n function setId(datum, parentData) {\n var id = (parentData ? parentData.id + '.' : '') + datum.key;\n datum.id = id;\n }\n\n function addToDictionary(datum) {\n dictionary[datum.id] = datum;\n }\n\n function calculateAlternativeShapeData(datum, prevDatum) {\n if (tweenShapes && datum.id in prevDictionary) {\n if ((prevDatum.tag == 'polygon' || prevDatum.tag == 'ellipse' || prevDatum.tag == 'path') && (prevDatum.tag != datum.tag || datum.tag == 'polygon')) {\n if (prevDatum.tag != 'path') {\n datum.alternativeOld = convertToPathData(prevDatum, datum);\n }\n if (datum.tag != 'path') {\n datum.alternativeNew = convertToPathData(datum, prevDatum);\n }\n }\n }\n }\n\n function calculatePathTweenPoints(datum, prevDatum) {\n if (tweenPaths && prevDatum && (prevDatum.tag == 'path' || (datum.alternativeOld && datum.alternativeOld.tag == 'path'))) {\n var attribute_d = (datum.alternativeNew || datum).attributes.d;\n if (datum.alternativeOld) {\n var oldNode = createElementWithAttributes(datum.alternativeOld);\n } else {\n var oldNode = createElementWithAttributes(prevDatum);\n }\n (datum.alternativeOld || (datum.alternativeOld = {})).points = pathTweenPoints(oldNode, attribute_d, tweenPrecision, tweenPrecisionIsRelative);\n }\n }\n\n function postProcessDataPass1Local(datum, index=0, parentData) {\n setKey(datum, index);\n setId(datum, parentData);\n var id = datum.id;\n var prevDatum = prevDictionary[id];\n addToDictionary(datum);\n calculateAlternativeShapeData(datum, prevDatum);\n calculatePathTweenPoints(datum, prevDatum);\n var childTagIndexes = {};\n datum.children.forEach(function (childData) {\n var childTag = childData.tag;\n if (childTag == 'ellipse' || childTag == 'polygon') {\n childTag = 'path';\n }\n if (childTagIndexes[childTag] == null) {\n childTagIndexes[childTag] = 0;\n }\n var childIndex = childTagIndexes[childTag]++;\n postProcessDataPass1Local(childData, childIndex, datum);\n });\n }\n\n function addToNodeDictionary(datum) {\n var tag = datum.tag;\n if (growEnteringEdges && datum.parent) {\n if (datum.parent.attributes.class == 'node') {\n if (tag == 'title') {\n if (datum.children.length > 0) {\n var child = datum.children[0];\n var nodeId = child.text;\n } else {\n var nodeId = '';\n }\n nodeDictionary[nodeId] = datum.parent;\n }\n }\n }\n }\n\n function extractGrowingEdgesData(datum) {\n var id = datum.id;\n var tag = datum.tag;\n var prevDatum = prevDictionary[id];\n if (growEnteringEdges && !prevDatum && datum.parent) {\n if (isEdgeElement(datum)) {\n if (tag == 'path' || tag == 'polygon') {\n if (tag == 'polygon') {\n var path = datum.parent.children.find(function (e) {\n return e.tag == 'path';\n });\n if (path) {\n datum.totalLength = path.totalLength;\n }\n }\n var title = getEdgeTitle(datum);\n var child = title.children[0];\n var nodeIds = child.text.split('->');\n if (nodeIds.length != 2) {\n nodeIds = child.text.split('--');\n }\n var startNodeId = nodeIds[0];\n var startNode = nodeDictionary[startNodeId];\n var prevStartNode = prevNodeDictionary[startNodeId];\n if (prevStartNode) {\n var i = startNode.children.findIndex(function (element, index) {\n return element.tag == 'g';\n });\n if (i >= 0) {\n var j = startNode.children[i].children.findIndex(function (element, index) {\n return element.tag == 'a';\n });\n startNode = startNode.children[i].children[j];\n }\n var i = prevStartNode.children.findIndex(function (element, index) {\n return element.tag == 'g';\n });\n if (i >= 0) {\n var j = prevStartNode.children[i].children.findIndex(function (element, index) {\n return element.tag == 'a';\n });\n prevStartNode = prevStartNode.children[i].children[j];\n }\n var startShapes = startNode.children;\n for (var i = 0; i < startShapes.length; i++) {\n if (startShapes[i].tag == 'polygon' || startShapes[i].tag == 'ellipse' || startShapes[i].tag == 'path' || startShapes[i].tag == 'text') {\n var startShape = startShapes[i];\n break;\n }\n }\n var prevStartShapes = prevStartNode.children;\n for (var i = 0; i < prevStartShapes.length; i++) {\n if (prevStartShapes[i].tag == 'polygon' || prevStartShapes[i].tag == 'ellipse' || prevStartShapes[i].tag == 'path' || prevStartShapes[i].tag == 'text') {\n var prevStartShape = prevStartShapes[i];\n break;\n }\n }\n if (prevStartShape && startShape) {\n datum.offset = {\n x: prevStartShape.center.x - startShape.center.x,\n y: prevStartShape.center.y - startShape.center.y,\n }\n } else {\n datum.offset = {x: 0, y: 0};\n }\n }\n }\n }\n }\n }\n\n function postProcessDataPass2Global(datum) {\n addToNodeDictionary(datum);\n extractGrowingEdgesData(datum);\n datum.children.forEach(function (childData) {\n postProcessDataPass2Global(childData);\n });\n }\n\n this._dispatch.call(\"layoutEnd\", this);\n\n var newDoc = d3.select(document.createDocumentFragment())\n .append('div');\n\n var parser = new window.DOMParser();\n var doc = parser.parseFromString(svgDoc, \"image/svg+xml\");\n\n newDoc\n .append(function() {\n return doc.documentElement;\n });\n\n var newSvg = newDoc\n .select('svg');\n\n var data = extractAllElementsData(newSvg);\n this._dispatch.call('dataExtractEnd', this);\n postProcessDataPass1Local(data);\n this._dispatch.call('dataProcessPass1End', this);\n postProcessDataPass2Global(data);\n this._dispatch.call('dataProcessPass2End', this);\n this._data = data;\n this._dictionary = dictionary;\n this._nodeDictionary = nodeDictionary;\n\n this._extractData = function (element, childIndex, parentData) {\n var data = extractAllElementsData(element);\n postProcessDataPass1Local(data, childIndex, parentData);\n postProcessDataPass2Global(data);\n return data;\n }\n this._busy = false;\n this._dispatch.call('dataProcessEnd', this);\n if (callback) {\n callback.call(this);\n }\n if (this._queue.length > 0) {\n var job = this._queue.shift();\n job.call(this);\n }\n}\n","export default function(src, callback) {\n\n var graphvizInstance = this;\n\n this\n .dot(src, render);\n\n function render() {\n graphvizInstance\n .render(callback);\n }\n\n return this;\n};\n","import {transition} from \"d3-transition\";\nimport {active as d3_active} from \"d3-transition\";\n\nexport default function(name) {\n\n if (name instanceof Function) {\n this._transitionFactory = name;\n } else {\n this._transition = transition(name);\n }\n\n return this;\n};\n\nexport function active(name) {\n\n var root = this._selection;\n var svg = root.selectWithoutDataPropagation(\"svg\");\n if (svg.size() != 0) {\n return d3_active(svg.node(), name);\n } else {\n return null;\n }\n};\n","export default function(options) {\n\n if (typeof options == 'undefined') {\n return Object.assign({}, this._options);\n } else {\n for (var option of Object.keys(options)) {\n this._options[option] = options[option];\n }\n return this;\n }\n};\n","export default function(width) {\n\n this._options.width = width;\n\n return this;\n};\n","export default function(height) {\n\n this._options.height = height;\n\n return this;\n};\n","export default function(scale) {\n\n this._options.scale = scale;\n\n return this;\n};\n","export default function(fit) {\n\n this._options.fit = fit;\n\n return this;\n};\n","export default function(callback) {\n\n this._attributer = callback;\n\n return this;\n};\n","export default function(engine) {\n\n this._options.engine = engine;\n\n return this;\n};\n","export default function(path, width, height) {\n\n this._images.push({path:path, width: width, height:height})\n\n return this;\n};\n","export default function(keyMode) {\n\n if (!this._keyModes.has(keyMode)) {\n throw Error('Illegal keyMode: ' + keyMode);\n }\n if (keyMode != this._options.keyMode && this._data != null) {\n throw Error('Too late to change keyMode');\n }\n this._options.keyMode = keyMode;\n\n return this;\n};\n","export default function(enable) {\n\n this._options.fade = enable\n\n return this;\n};\n","export default function(enable) {\n\n this._options.tweenPaths = enable;\n\n return this;\n};\n","export default function(enable) {\n\n this._options.tweenShapes = enable;\n if (enable) {\n this._options.tweenPaths = true;\n }\n\n return this;\n};\n","export default function(enable) {\n\n this._options.convertEqualSidedPolygons = enable;\n\n return this;\n};\n","export default function(precision) {\n\n this._options.tweenPrecision = precision;\n\n return this;\n};\n","export default function(enable) {\n\n this._options.growEnteringEdges = enable;\n\n return this;\n};\n","export default function(typenames, callback) {\n\n this._dispatch.on(typenames, callback);\n\n return this;\n};\n","export default function(callback) {\n\n this._onerror = callback\n\n return this;\n};\n","import {format} from \"d3-format\";\n\nexport default function(enable) {\n\n var t0 = Date.now();\n var times = {};\n var eventTypes = this._eventTypes;\n var maxEventTypeLength = Math.max(...(eventTypes.map(eventType => eventType.length)));\n for (let i = 0; i < eventTypes.length; i++) {\n let eventType = eventTypes[i];\n times[eventType] = [];\n var graphvizInstance = this;\n var expectedDelay;\n var expectedDuration;\n this\n .on(eventType + '.log', enable ? function () {\n var t = Date.now();\n var seqNo = times[eventType].length;\n times[eventType].push(t);\n var string = '';\n string += 'Event ';\n string += format(' >2')(i) + ' ';\n string += eventType + ' '.repeat(maxEventTypeLength - eventType.length);\n string += format(' >5')(t - t0) + ' ';\n if (eventType != 'initEnd') {\n string += format(' >5')(t - times['start'][seqNo]);\n }\n if (eventType == 'dataProcessEnd') {\n string += ' prepare ' + format(' >5')((t - times['layoutEnd'][seqNo]));\n }\n if (eventType == 'renderEnd' && graphvizInstance._transition) {\n string += ' transition start margin ' + format(' >5')(graphvizInstance._transition.delay() - (t - times['renderStart'][seqNo]));\n expectedDelay = graphvizInstance._transition.delay();\n expectedDuration = graphvizInstance._transition.duration();\n }\n if (eventType == 'transitionStart') {\n var actualDelay = (t - times['renderStart'][seqNo])\n string += ' transition delay ' + format(' >5')(t - times['renderStart'][seqNo]);\n string += ' expected ' + format(' >5')(expectedDelay);\n string += ' diff ' + format(' >5')(actualDelay - expectedDelay);\n }\n if (eventType == 'transitionEnd') {\n var actualDuration = t - times['transitionStart'][seqNo]\n string += ' transition duration ' + format(' >5')(actualDuration);\n string += ' expected ' + format(' >5')(expectedDuration);\n string += ' diff ' + format(' >5')(actualDuration - expectedDuration);\n }\n console.log(string);\n t0 = t;\n } : null);\n }\n return this;\n}\n","export default function() {\n\n delete this._selection.node().__graphviz__;\n if (this._worker) {\n this._workerPortClose();\n }\n return this;\n};\n","export function rotate(x, y, cosA, sinA) {\n // (x + j * y) * (cosA + j * sinA) = x * cosA - y * sinA + j * (x * sinA + y * cosA)\n y = -y;\n sinA = -sinA;\n [x, y] = [x * cosA - y * sinA, x * sinA + y * cosA];\n y = -y;\n return [x, y];\n}\n","import * as d3 from \"d3-selection\";\nimport {path as d3_path} from \"d3-path\";\nimport {rotate} from \"./geometry\";\nimport {extractAllElementsData} from \"./element\";\nimport {attributeElement} from \"./element\";\nimport {insertAllElementsData} from \"./element\";\n\nexport function drawEdge(x1, y1, x2, y2, attributes, options={}) {\n attributes = Object.assign({}, attributes);\n if (attributes.style && attributes.style.includes('invis')) {\n var newEdge = d3.select(null);\n } else {\n var root = this._selection;\n var svg = root.selectWithoutDataPropagation(\"svg\");\n var graph0 = svg.selectWithoutDataPropagation(\"g\");\n var newEdge0 = createEdge.call(this, attributes);\n var edgeData = extractAllElementsData(newEdge0);\n var newEdge = graph0.append('g')\n .data([edgeData]);\n attributeElement.call(newEdge.node(), edgeData);\n _updateEdge.call(this, newEdge, x1, y1, x2, y2, attributes, options);\n }\n this._drawnEdge = {\n g: newEdge,\n x1: x1,\n y1: y1,\n x2: x2,\n y2: y2,\n attributes: attributes,\n };\n\n return this;\n}\n\nexport function updateDrawnEdge(x1, y1, x2, y2, attributes={}, options={}) {\n if (!this._drawnEdge) {\n throw Error('No edge has been drawn');\n }\n var edge = this._drawnEdge.g\n attributes = Object.assign(this._drawnEdge.attributes, attributes);\n this._drawnEdge.x1 = x1;\n this._drawnEdge.y1 = y1;\n this._drawnEdge.x2 = x2;\n this._drawnEdge.y2 = y2;\n if (edge.empty() && !(attributes.style && attributes.style.includes('invis'))) {\n var root = this._selection;\n var svg = root.selectWithoutDataPropagation(\"svg\");\n var graph0 = svg.selectWithoutDataPropagation(\"g\");\n var edge = graph0.append('g');\n this._drawnEdge.g = edge;\n }\n if (!edge.empty()) {\n _updateEdge.call(this, edge, x1, y1, x2, y2, attributes, options);\n }\n\n return this;\n}\n\nfunction _updateEdge(edge, x1, y1, x2, y2, attributes, options) {\n\n var newEdge = createEdge.call(this, attributes);\n var edgeData = extractAllElementsData(newEdge);\n edge.data([edgeData]);\n attributeElement.call(edge.node(), edgeData);\n _moveEdge(edge, x1, y1, x2, y2, attributes, options);\n}\n\nfunction _moveEdge(edge, x1, y1, x2, y2, attributes, options) {\n\n var shortening = options.shortening || 0;\n var arrowHeadLength = 10;\n var arrowHeadWidth = 7;\n var margin = 0.1;\n\n var arrowHeadPoints = [\n [0, -arrowHeadWidth / 2],\n [arrowHeadLength, 0],\n [0, arrowHeadWidth / 2],\n [0, -arrowHeadWidth / 2],\n ];\n\n var dx = x2 - x1;\n var dy = y2 - y1;\n var length = Math.sqrt(dx * dx + dy * dy);\n if (length == 0) {\n var cosA = 1;\n var sinA = 0;\n } else {\n var cosA = dx / length;\n var sinA = dy / length;\n }\n x2 = x1 + (length - shortening - arrowHeadLength - margin) * cosA;\n y2 = y1 + (length - shortening - arrowHeadLength - margin) * sinA;\n\n if (attributes.URL || attributes.tooltip) {\n var a = edge.selectWithoutDataPropagation(\"g\").selectWithoutDataPropagation(\"a\");\n var line = a.selectWithoutDataPropagation(\"path\");\n var arrowHead = a.selectWithoutDataPropagation(\"polygon\");\n } else {\n var line = edge.selectWithoutDataPropagation(\"path\");\n var arrowHead = edge.selectWithoutDataPropagation(\"polygon\");\n }\n\n var path1 = d3_path();\n path1.moveTo(x1, y1);\n path1.lineTo(x2, y2);\n\n line\n .attr(\"d\", path1);\n\n x2 = x1 + (length - shortening - arrowHeadLength) * cosA;\n y2 = y1 + (length - shortening - arrowHeadLength) * sinA;\n for (var i = 0; i < arrowHeadPoints.length; i++) {\n var point = arrowHeadPoints[i];\n arrowHeadPoints[i] = rotate(point[0], point[1], cosA, sinA);\n }\n for (var i = 0; i < arrowHeadPoints.length; i++) {\n var point = arrowHeadPoints[i];\n arrowHeadPoints[i] = [x2 + point[0], y2 + point[1]];\n }\n var allPoints = [];\n for (var i = 0; i < arrowHeadPoints.length; i++) {\n var point = arrowHeadPoints[i];\n allPoints.push(point.join(','));\n }\n var pointsAttr = allPoints.join(' ');\n\n arrowHead\n .attr(\"points\", pointsAttr);\n\n return this;\n}\n\nexport function moveDrawnEdgeEndPoint(x2, y2, options={}) {\n\n if (!this._drawnEdge) {\n throw Error('No edge has been drawn');\n }\n var edge = this._drawnEdge.g;\n var x1 = this._drawnEdge.x1;\n var y1 = this._drawnEdge.y1;\n var attributes = this._drawnEdge.attributes;\n\n this._drawnEdge.x2 = x2;\n this._drawnEdge.y2 = y2;\n _moveEdge(edge, x1, y1, x2, y2, attributes, options);\n\n return this\n}\n\nexport function removeDrawnEdge() {\n\n if (!this._drawnEdge) {\n return this;\n }\n\n var edge = this._drawnEdge.g;\n\n edge.remove();\n\n this._drawnEdge = null;\n\n return this\n}\n\nexport function insertDrawnEdge(name) {\n\n if (!this._drawnEdge) {\n throw Error('No edge has been drawn');\n }\n\n var edge = this._drawnEdge.g;\n if (edge.empty()) {\n return this;\n }\n var attributes = this._drawnEdge.attributes;\n\n var title = edge.selectWithoutDataPropagation(\"title\");\n title\n .text(name);\n\n var root = this._selection;\n var svg = root.selectWithoutDataPropagation(\"svg\");\n var graph0 = svg.selectWithoutDataPropagation(\"g\");\n var graph0Datum = graph0.datum();\n var edgeData = this._extractData(edge, graph0Datum.children.length, graph0.datum());\n graph0Datum.children.push(edgeData);\n\n insertAllElementsData(edge, edgeData);\n\n this._drawnEdge = null;\n\n return this\n\n}\n\nexport function drawnEdgeSelection() {\n\n if (this._drawnEdge) {\n return this._drawnEdge.g;\n } else {\n return d3.select(null);\n }\n\n}\n\n\nfunction createEdge(attributes) {\n var attributesString = ''\n for (var name of Object.keys(attributes)) {\n if (attributes[name] != null) {\n attributesString += ' \"' + name + '\"=\"' + attributes[name] + '\"';\n }\n }\n var dotSrc = 'digraph {a -> b [' + attributesString + ']}';\n var svgDoc = this.layoutSync(dotSrc, 'svg', 'dot');\n var parser = new window.DOMParser();\n var doc = parser.parseFromString(svgDoc, \"image/svg+xml\");\n var newDoc = d3.select(document.createDocumentFragment())\n .append(function() {\n return doc.documentElement;\n });\n var edge = newDoc.select('.edge');\n\n return edge;\n}\n","import * as d3 from \"d3-selection\";\nimport {rotate} from \"./geometry\";\nimport {extractAllElementsData} from \"./element\";\nimport {translatePointsAttribute} from \"./svg\";\nimport {translateDAttribute} from \"./svg\";\nimport {insertAllElementsData} from \"./element\";\nimport {attributeElement} from \"./element\";\nimport {roundTo2Decimals} from \"./utils\";\n\nexport function drawNode(x, y, nodeId, attributes={}, options={}) {\n attributes = Object.assign({}, attributes);\n if (attributes.style && attributes.style.includes('invis')) {\n var newNode = d3.select(null);\n } else {\n var root = this._selection;\n var svg = root.selectWithoutDataPropagation(\"svg\");\n var graph0 = svg.selectWithoutDataPropagation(\"g\");\n var newNode0 = createNode.call(this, nodeId, attributes);\n var nodeData = extractAllElementsData(newNode0);\n var newNode = graph0.append('g')\n .data([nodeData]);\n attributeElement.call(newNode.node(), nodeData);\n _updateNode.call(this, newNode, x, y, nodeId, attributes, options);\n }\n this._drawnNode = {\n g: newNode,\n nodeId: nodeId,\n x: x,\n y: y,\n attributes: attributes,\n };\n\n return this;\n}\n\nexport function updateDrawnNode(x, y, nodeId, attributes={}, options={}) {\n if (!this._drawnNode) {\n throw Error('No node has been drawn');\n }\n\n var node = this._drawnNode.g\n if (nodeId == null) {\n nodeId = this._drawnNode.nodeId;\n }\n attributes = Object.assign(this._drawnNode.attributes, attributes);\n this._drawnNode.nodeId = nodeId;\n this._drawnNode.x = x;\n this._drawnNode.y = y;\n if (node.empty() && !(attributes.style && attributes.style.includes('invis'))) {\n var root = this._selection;\n var svg = root.selectWithoutDataPropagation(\"svg\");\n var graph0 = svg.selectWithoutDataPropagation(\"g\");\n var node = graph0.append('g');\n this._drawnNode.g = node;\n }\n if (!node.empty()) {\n _updateNode.call(this, node, x, y, nodeId, attributes, options);\n }\n\n return this;\n}\n\nfunction _updateNode(node, x, y, nodeId, attributes, options) {\n\n var newNode = createNode.call(this, nodeId, attributes);\n var nodeData = extractAllElementsData(newNode);\n node.data([nodeData]);\n attributeElement.call(node.node(), nodeData);\n _moveNode(node, x, y, attributes, options);\n\n return this;\n}\n\nfunction _moveNode(node, x, y, attributes, options) {\n if (attributes.URL || attributes.tooltip) {\n var subParent = node.selectWithoutDataPropagation(\"g\").selectWithoutDataPropagation(\"a\");\n } else {\n var subParent = node;\n }\n var svgElements = subParent.selectAll('ellipse,polygon,path,polyline');\n var text = node.selectWithoutDataPropagation(\"text\");\n\n if (svgElements.size() != 0) {\n var bbox = svgElements.node().getBBox();\n bbox.cx = bbox.x + bbox.width / 2;\n bbox.cy = bbox.y + bbox.height / 2;\n } else if (text.size() != 0) {\n bbox = {\n x: +text.attr('x'),\n y: +text.attr('y'),\n width: 0,\n height: 0,\n cx: +text.attr('x'),\n cy: +text.attr('y'),\n }\n }\n svgElements.each(function(data, index) {\n var svgElement = d3.select(this);\n if (svgElement.attr(\"cx\")) {\n svgElement\n .attr(\"cx\", roundTo2Decimals(x))\n .attr(\"cy\", roundTo2Decimals(y));\n } else if (svgElement.attr(\"points\")) {\n var pointsString = svgElement.attr('points').trim();\n svgElement\n .attr(\"points\", translatePointsAttribute(pointsString, x - bbox.cx, y - bbox.cy));\n } else {\n var d = svgElement.attr('d');\n svgElement\n .attr(\"d\", translateDAttribute(d, x - bbox.cx, y - bbox.cy));\n }\n });\n\n if (text.size() != 0) {\n text\n .attr(\"x\", roundTo2Decimals(+text.attr(\"x\") + x - bbox.cx))\n .attr(\"y\", roundTo2Decimals(+text.attr(\"y\") + y - bbox.cy));\n }\n return this;\n}\n\nexport function moveDrawnNode(x, y, options={}) {\n\n if (!this._drawnNode) {\n throw Error('No node has been drawn');\n }\n var node = this._drawnNode.g;\n var attributes = this._drawnNode.attributes;\n\n this._drawnNode.x = x;\n this._drawnNode.y = y;\n\n if (!node.empty()) {\n _moveNode(node, x, y, attributes, options);\n }\n\n return this\n}\n\nexport function removeDrawnNode() {\n\n if (!this._drawnNode) {\n return this;\n }\n\n var node = this._drawnNode.g;\n\n if (!node.empty()) {\n node.remove();\n }\n\n this._drawnNode = null;\n\n return this\n}\n\nexport function insertDrawnNode(nodeId) {\n\n if (!this._drawnNode) {\n throw Error('No node has been drawn');\n }\n\n if (nodeId == null) {\n nodeId = this._drawnNode.nodeId;\n }\n var node = this._drawnNode.g;\n if (node.empty()) {\n return this;\n }\n var attributes = this._drawnNode.attributes;\n\n var title = node.selectWithoutDataPropagation(\"title\");\n title\n .text(nodeId);\n if (attributes.URL || attributes.tooltip) {\n var ga = node.selectWithoutDataPropagation(\"g\");\n var a = ga.selectWithoutDataPropagation(\"a\");\n var svgElement = a.selectWithoutDataPropagation('ellipse,polygon,path,polyline');\n var text = a.selectWithoutDataPropagation('text');\n } else {\n var svgElement = node.selectWithoutDataPropagation('ellipse,polygon,path,polyline');\n var text = node.selectWithoutDataPropagation('text');\n }\n text\n .text(attributes.label || nodeId);\n\n var root = this._selection;\n var svg = root.selectWithoutDataPropagation(\"svg\");\n var graph0 = svg.selectWithoutDataPropagation(\"g\");\n var graph0Datum = graph0.datum();\n var nodeData = this._extractData(node, graph0Datum.children.length, graph0.datum());\n graph0Datum.children.push(nodeData);\n\n insertAllElementsData(node, nodeData);\n\n this._drawnNode = null;\n\n return this\n\n}\n\nexport function drawnNodeSelection() {\n\n if (this._drawnNode) {\n return this._drawnNode.g;\n } else {\n return d3.select(null);\n }\n\n}\n\nfunction createNode(nodeId, attributes) {\n var attributesString = ''\n for (var name of Object.keys(attributes)) {\n if (attributes[name] != null) {\n attributesString += ' \"' + name + '\"=\"' + attributes[name] + '\"';\n }\n }\n var dotSrc = 'graph {\"' + nodeId + '\" [' + attributesString + ']}';\n var svgDoc = this.layoutSync(dotSrc, 'svg', 'dot');\n var parser = new window.DOMParser();\n var doc = parser.parseFromString(svgDoc, \"image/svg+xml\");\n var newDoc = d3.select(document.createDocumentFragment())\n .append(function() {\n return doc.documentElement;\n });\n var node = newDoc.select('.node');\n\n return node;\n}\n","/* This file is excluded from coverage because the intrumented code\n * translates \"self\" which gives a reference error.\n */\n\n/* istanbul ignore next */\n\nexport function workerCodeBody(port) {\n\n self.document = {}; // Workaround for \"ReferenceError: document is not defined\" in hpccWasm\n\n port.addEventListener('message', function(event) {\n let hpccWasm = self[\"@hpcc-js/wasm\"];\n if (hpccWasm == undefined && event.data.vizURL) {\n importScripts(event.data.vizURL);\n hpccWasm = self[\"@hpcc-js/wasm\"];\n hpccWasm.wasmFolder(event.data.vizURL.match(/.*\\//)[0]);\n // This is an alternative workaround where wasmFolder() is not needed\n// document = {currentScript: {src: event.data.vizURL}};\n }\n hpccWasm.graphviz.layout(event.data.dot, \"svg\", event.data.engine, event.data.options).then((svg) => {\n if (svg) {\n port.postMessage({\n type: \"done\",\n svg: svg,\n });\n } else if (event.data.vizURL) {\n port.postMessage({\n type: \"init\",\n });\n } else {\n port.postMessage({\n type: \"skip\",\n });\n }\n }).catch(error => {\n port.postMessage({\n type: \"error\",\n error: error.message,\n });\n });\n });\n}\n\n/* istanbul ignore next */\n\nexport function workerCode() {\n\n const port = self;\n workerCodeBody(port);\n}\n\n/* istanbul ignore next */\n\nexport function sharedWorkerCode() {\n self.onconnect = function(e) {\n const port = e.ports[0];\n workerCodeBody(port);\n port.start();\n }\n}\n","import * as d3 from \"d3-selection\";\nimport {dispatch} from \"d3-dispatch\";\nimport render from \"./render\";\nimport {layout} from \"./dot\";\nimport dot from \"./dot\";\nimport data from \"./data\";\nimport {initViz} from \"./dot\";\nimport renderDot from \"./renderDot\";\nimport transition from \"./transition\";\nimport {active} from \"./transition\";\nimport options from \"./options\";\nimport width from \"./width\";\nimport height from \"./height\";\nimport scale from \"./scale\";\nimport fit from \"./fit\";\nimport attributer from \"./attributer\";\nimport engine from \"./engine\";\nimport images from \"./images\";\nimport keyMode from \"./keyMode\";\nimport fade from \"./fade\";\nimport tweenPaths from \"./tweenPaths\";\nimport tweenShapes from \"./tweenShapes\";\nimport convertEqualSidedPolygons from \"./convertEqualSidedPolygons\";\nimport tweenPrecision from \"./tweenPrecision\";\nimport growEnteringEdges from \"./growEnteringEdges\";\nimport zoom from \"./zoom\";\nimport {resetZoom} from \"./zoom\";\nimport {zoomBehavior} from \"./zoom\";\nimport {zoomSelection} from \"./zoom\";\nimport {zoomScaleExtent} from \"./zoom\";\nimport {zoomTranslateExtent} from \"./zoom\";\nimport on from \"./on\";\nimport onerror from \"./onerror\";\nimport logEvents from \"./logEvents\";\nimport destroy from \"./destroy\";\nimport {drawEdge} from \"./drawEdge\";\nimport {updateDrawnEdge} from \"./drawEdge\";\nimport {moveDrawnEdgeEndPoint} from \"./drawEdge\";\nimport {insertDrawnEdge} from \"./drawEdge\";\nimport {removeDrawnEdge} from \"./drawEdge\";\nimport {drawnEdgeSelection} from \"./drawEdge\";\nimport {drawNode} from \"./drawNode\";\nimport {updateDrawnNode} from \"./drawNode\";\nimport {moveDrawnNode} from \"./drawNode\";\nimport {insertDrawnNode} from \"./drawNode\";\nimport {removeDrawnNode} from \"./drawNode\";\nimport {drawnNodeSelection} from \"./drawNode\";\nimport {workerCode} from \"./workerCode\";\nimport {sharedWorkerCode} from \"./workerCode\";\nimport {workerCodeBody} from \"./workerCode\";\n\nexport function Graphviz(selection, options) {\n this._options = {\n useWorker: true,\n useSharedWorker: false,\n engine: 'dot',\n keyMode: 'title',\n fade: true,\n tweenPaths: true,\n tweenShapes: true,\n convertEqualSidedPolygons: true,\n tweenPrecision: 1,\n growEnteringEdges: true,\n zoom: true,\n zoomScaleExtent: [0.1, 10],\n zoomTranslateExtent: [[-Infinity, -Infinity], [+Infinity, +Infinity]],\n width: null,\n height: null,\n scale: 1,\n fit: false,\n };\n if (options instanceof Object) {\n for (var option of Object.keys(options)) {\n this._options[option] = options[option];\n }\n } else if (typeof options == 'boolean') {\n this._options.useWorker = options;\n }\n var useWorker = this._options.useWorker;\n var useSharedWorker = this._options.useSharedWorker;\n if (typeof Worker == 'undefined') {\n useWorker = false;\n }\n if (typeof SharedWorker == 'undefined') {\n useSharedWorker = false;\n }\n if (useWorker || useSharedWorker) {\n var scripts = d3.selectAll('script');\n var vizScript = scripts.filter(function() {\n return d3.select(this).attr('type') == 'javascript/worker' || (d3.select(this).attr('src') && d3.select(this).attr('src').match(/.*\\/@hpcc-js\\/wasm/));\n });\n if (vizScript.size() == 0) {\n console.warn('No script tag of type \"javascript/worker\" was found and \"useWorker\" is true. Not using web worker.');\n useWorker = false;\n useSharedWorker = false;\n } else {\n this._vizURL = vizScript.attr('src');\n if (!this._vizURL) {\n console.warn('No \"src\" attribute of was found on the \"javascript/worker\" script tag and \"useWorker\" is true. Not using web worker.');\n useWorker = false;\n useSharedWorker = false;\n }\n }\n }\n if (useSharedWorker) {\n const url = 'data:application/javascript;base64,' + btoa(workerCodeBody.toString() + '(' + sharedWorkerCode.toString() + ')()');\n this._worker = this._worker = new SharedWorker(url);\n this._workerPort = this._worker.port;\n this._workerPortClose = this._worker.port.close.bind(this._workerPort);\n this._worker.port.start();\n this._workerCallbacks = [];\n }\n else if (useWorker) {\n var blob = new Blob([workerCodeBody.toString() + '(' + workerCode.toString() + ')()']);\n var blobURL = window.URL.createObjectURL(blob);\n this._worker = new Worker(blobURL);\n this._workerPort = this._worker;\n this._workerPortClose = this._worker.terminate.bind(this._worker);\n this._workerCallbacks = [];\n }\n this._selection = selection;\n this._active = false;\n this._busy = false;\n this._jobs = [];\n this._queue = [];\n this._keyModes = new Set([\n 'title',\n 'id',\n 'tag-index',\n 'index'\n ]);\n this._images = [];\n this._translation = undefined;\n this._scale = undefined;\n this._eventTypes = [\n 'initEnd',\n 'start',\n 'layoutStart',\n 'layoutEnd',\n 'dataExtractEnd',\n 'dataProcessPass1End',\n 'dataProcessPass2End',\n 'dataProcessEnd',\n 'renderStart',\n 'renderEnd',\n 'transitionStart',\n 'transitionEnd',\n 'restoreEnd',\n 'end'\n ];\n this._dispatch = dispatch(...this._eventTypes);\n initViz.call(this);\n selection.node().__graphviz__ = this;\n}\n\nexport default function graphviz(selector, options) {\n var g = d3.select(selector).graphviz(options);\n return g;\n}\n\nGraphviz.prototype = graphviz.prototype = {\n constructor: Graphviz,\n engine: engine,\n addImage: images,\n keyMode: keyMode,\n fade: fade,\n tweenPaths: tweenPaths,\n tweenShapes: tweenShapes,\n convertEqualSidedPolygons: convertEqualSidedPolygons,\n tweenPrecision: tweenPrecision,\n growEnteringEdges: growEnteringEdges,\n zoom: zoom,\n resetZoom: resetZoom,\n zoomBehavior: zoomBehavior,\n zoomSelection: zoomSelection,\n zoomScaleExtent: zoomScaleExtent,\n zoomTranslateExtent: zoomTranslateExtent,\n render: render,\n layout: layout,\n dot: dot,\n data: data,\n renderDot: renderDot,\n transition: transition,\n active: active,\n options: options,\n width: width,\n height: height,\n scale: scale,\n fit: fit,\n attributer: attributer,\n on: on,\n onerror: onerror,\n logEvents: logEvents,\n destroy: destroy,\n drawEdge: drawEdge,\n updateDrawnEdge: updateDrawnEdge,\n moveDrawnEdgeEndPoint,\n insertDrawnEdge,\n removeDrawnEdge, removeDrawnEdge,\n drawnEdgeSelection, drawnEdgeSelection,\n drawNode: drawNode,\n updateDrawnNode: updateDrawnNode,\n moveDrawnNode: moveDrawnNode,\n insertDrawnNode,\n removeDrawnNode, removeDrawnNode,\n drawnNodeSelection, drawnNodeSelection,\n};\n","import {Graphviz} from \"../graphviz\";\nimport {timeout} from \"d3-timer\";\n\nexport default function(options) {\n\n var g = this.node().__graphviz__;\n if (g) {\n g.options(options);\n // Ensure a possible new initEnd event handler is attached before calling it\n timeout(function () {\n g._dispatch.call(\"initEnd\", this);\n }.bind(this), 0);\n } else {\n g = new Graphviz(this, options);\n }\n return g;\n}\n","import * as d3 from \"d3-selection\";\n\nexport default function(name) {\n\n return d3.select(this.size() > 0 ? this.node().querySelector(name) : null);\n}\n","import {selection} from \"d3-selection\";\nimport selection_graphviz from \"./graphviz\";\nimport selection_selectWithoutDataPropagation from \"./selectWithoutDataPropagation\";\n\nselection.prototype.graphviz = selection_graphviz;\nselection.prototype.selectWithoutDataPropagation = selection_selectWithoutDataPropagation;\n"],"names":["d3","zoom","interpolate","zoomTransform","zoomIdentity","timeout","transition","interpolateTransformSvg","graphviz","graphvizSync","d3_active","format","d3_path","dispatch","selection"],"mappings":"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"}
\ No newline at end of file