diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index e343e3b0..e46c41c4 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -37,6 +37,12 @@ "commands": [ "dotnet-fsharplint" ] + }, + "fsdocs-tool": { + "version": "19.1.1", + "commands": [ + "fsdocs" + ] } } } \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3dffe463..9ec06e01 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -40,8 +40,14 @@ jobs: steps: - uses: actions/checkout@v2 - name: Self-hosted_build + if: runner.os != 'Windows' run: | chmod +x ./build.sh ./build.sh env: CI: true + - name: Self-hosted_build + if: runner.os == 'Windows' + run: ./build.cmd + env: + CI: true \ No newline at end of file diff --git a/.gitignore b/.gitignore index d107ea00..7f160216 100644 --- a/.gitignore +++ b/.gitignore @@ -267,4 +267,9 @@ coverage.*.xml .paket/.store .paket/paket +# FSharp.Formatting +.fsdocs/ +output/ +temp/ + out/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 83a2bd8c..775dbf48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,18 @@ # Changelog + All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] - -## [0.1.0] - 2017-03-17 -First release +## [1.0.0] - 2023-12-19 ### Added -- This release already has lots of features +- Processing images by applying filters +- Rotating, reflecting images +- Parallel image processing using agents +- Processing using the CPU or any GPU on your device -[0.1.0]: https://github.com/user/MyCoolNewApp.git/releases/tag/v0.1.0 +[Unreleased]: https://github.com/LeonidLodygin/ImageProcessing/compare/v1.0.0...HEAD +[1.0.0]: https://github.com/LeonidLodygin/ImageProcessing/releases/tag/v1.0.0 +[0.1.0]: https://github.com/LeonidLodygin/ImageProcessing/releases/tag/v1.0.0 diff --git a/Directory.Build.props b/Directory.Build.props index 26cc6fe2..5e6cc1d4 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -2,12 +2,12 @@ f#, fsharp - https://github.com/gsvgit/ImageProcessing - https://github.com/gsvgit/ImageProcessing/blob/master/LICENSE.md + https://github.com/LeonidLodygin/ImageProcessing + https://github.com/LeonidLodygin/ImageProcessing/blob/main/LICENSE.md false git - gsvgit - https://github.com/gsvgit/ImageProcessing + LeonidLodygin + https://github.com/LeonidLodygin/ImageProcessing diff --git a/README.md b/README.md index 321ad269..101e70ef 100644 --- a/README.md +++ b/README.md @@ -1,45 +1,36 @@ -# ImageProcessing - -Simple image processing on GPGPU in F# using [Brahma.FSharp](https://github.com/YaccConstructor/Brahma.FSharp). - ---- - -## Builds - - -GitHub Actions | -:---: | -[![GitHub Actions](https://github.com/gsvgit/ImageProcessing/workflows/Build%20master/badge.svg)](https://github.com/gsvgit/ImageProcessing/actions?query=branch%3Amaster) | -[![Build History](https://buildstats.info/github/chart/gsvgit/ImageProcessing)](https://github.com/gsvgit/ImageProcessing/actions?query=branch%3Amaster) | - -## NuGet - -Package | Stable | Prerelease ---- | --- | --- -ImageProcessing | | +# LeonidLodygin.ImageProcessing ---- - -### Developing - -Make sure the following **requirements** are installed on your system: - -- [dotnet SDK](https://dotnet.microsoft.com/en-us/download/dotnet/7.0) 7.0 or higher -- OpenCL-compatible device with respective driver installed. - ---- +Simple image processing on GPGPU in F# using [Brahma.FSharp](https://github.com/YaccConstructor/Brahma.FSharp). -### Building +## Features +* Apply built-in or custom filters to an image +* Rotating, reflecting the image +* Applying fish-eye to an image +* Image processing using CPU or specific GPU +* Ability to process images in multiple threads using agents (mailbox processor based). +* Process one image or a whole set of images at a time +## Installation +```sh +> dotnet add package LeonidLodygin.ImageProcessing --version 1.0.0 +``` +## Quick start ```sh -> build.cmd // on windows -$ ./build.sh // on unix +> dotnet run -i *input path* -o *output path* -mod FishEye -gpu AnyGpu ``` +## Result +| Original | Fisheye | +|:------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------| +| ![image](https://raw.githubusercontent.com/LeonidLodygin/ImageProcessing/gh-pages/images/example.jpg) | ![image](https://raw.githubusercontent.com/LeonidLodygin/ImageProcessing/gh-pages/images/processed.jpg) | + +## Contributors ---- +- Leonid Lodygin (Github: [@LeonidLodygin](https://github.com/LeonidLodygin)) +- Semyon Grigorev (Github: [@gsvgit](https://github.com/gsvgit)) -### Build Targets +## License -For details look at [MiniScaffold](https://github.com/TheAngryByrd/MiniScaffold), we use it in our project. +This project licensed under MIT License. License text can be found in the +[license file](https://github.com/LeonidLodygin/ImageProcessing/blob/main/LICENSE.md). diff --git a/build/FsDocs.fs b/build/FsDocs.fs new file mode 100644 index 00000000..8dbc0c93 --- /dev/null +++ b/build/FsDocs.fs @@ -0,0 +1,244 @@ +namespace Fake.DotNet + +open Fake.Core +open Fake.IO +open Fake.IO.FileSystemOperators + +/// +/// Contains tasks to interact with fsdocs tool to +/// process F# script files, markdown and for generating API documentation. +/// +[] +module Fsdocs = + + /// + /// Fsdocs build command parameters and options + /// + type BuildCommandParams = + { + /// Input directory of content (default: docs) + Input: string option + + /// Project files to build API docs for outputs, defaults to all packable projects + Projects: seq option + + /// Output Directory (default output for build and tmp/watch for watch) + Output: string option + + /// Disable generation of API docs + NoApiDocs: bool option + + /// Evaluate F# fragments in scripts + Eval: bool option + + /// Save images referenced in docs + SaveImages: bool option + + /// Add line numbers + LineNumbers: bool option + + /// Additional substitution parameters for templates + Parameters: seq option + + /// Disable project cracking. + IgnoreProjects: bool option + + /// In API doc generation qualify the output by the collection name, e.g. 'reference/FSharp.Core/...' instead of 'reference/...' . + Qualify: bool option + + /// The tool will also generate documentation for non-public members + NoPublic: bool option + + /// Do not copy default content styles, javascript or use default templates + NoDefaultContent: bool option + + /// Clean the output directory + Clean: bool option + + /// Display version information + Version: bool option + + /// Provide properties to dotnet msbuild, e.g. --properties Configuration=Release Version=3.4 + Properties: string option + + /// Additional arguments passed down as otherflags to the F# compiler when the API is being generated. + /// Note that these arguments are trimmed, this is to overcome a limitation in the command line argument + /// processing. A typical use-case would be to pass an addition assembly reference. + /// Example --fscoptions " -r:MyAssembly.dll" + FscOptions: string option + + /// Fail if docs are missing or can't be generated + Strict: bool option + + /// Source folder at time of component build (<FsDocsSourceFolder>) + SourceFolder: string option + + /// Source repository for github links (<FsDocsSourceRepository>) + SourceRepository: string option + + /// Assume comments in F# code are markdown (<UsesMarkdownComments>) + MdComments: bool option + } + + /// Parameter default values. + static member Default = { + Input = None + Projects = None + Output = None + NoApiDocs = None + Eval = None + SaveImages = None + LineNumbers = None + Parameters = None + IgnoreProjects = None + Qualify = None + NoPublic = None + NoDefaultContent = None + Clean = None + Version = None + Properties = None + FscOptions = None + Strict = None + SourceFolder = None + SourceRepository = None + MdComments = None + } + + /// + /// Fsdocs watch command parameters and options + /// + type WatchCommandParams = + { + /// Do not serve content when watching. + NoServer: bool option + + /// Do not launch a browser window. + NoLaunch: bool option + + /// URL extension to launch http://localhost:/%s. + Open: string option + + /// Port to serve content for http://localhost serving. + Port: int option + + /// Build Commands + BuildCommandParams: BuildCommandParams option + } + + /// Parameter default values. + static member Default = { + NoServer = None + NoLaunch = None + Open = None + Port = None + BuildCommandParams = None + } + + let internal buildBuildCommandParams (buildParams: BuildCommandParams) = + let buildSubstitutionParameters (subParameters: seq) = + let subParameters = + subParameters + |> Seq.map (fun (key, value) -> (sprintf "%s %s" key value)) + |> String.concat " " + + sprintf "--parameters %s" subParameters + + System.Text.StringBuilder() + |> StringBuilder.appendIfSome buildParams.Input (sprintf "--input %s") + |> StringBuilder.appendIfSome + buildParams.Projects + (fun projects -> + sprintf + "--projects %s" + (projects + |> String.concat " ") + ) + |> StringBuilder.appendIfSome buildParams.Output (sprintf "--output %s") + |> StringBuilder.appendIfSome buildParams.NoApiDocs (fun _ -> "--noapidocs") + |> StringBuilder.appendIfSome buildParams.Eval (fun _ -> "--eval") + |> StringBuilder.appendIfSome buildParams.SaveImages (fun _ -> "--saveimages") + |> StringBuilder.appendIfSome buildParams.LineNumbers (fun _ -> "--linenumbers") + |> StringBuilder.appendIfSome + buildParams.Parameters + (fun parameters -> buildSubstitutionParameters parameters) + |> StringBuilder.appendIfSome buildParams.IgnoreProjects (fun _ -> "--ignoreprojects") + |> StringBuilder.appendIfSome buildParams.Qualify (fun _ -> "--qualify") + |> StringBuilder.appendIfSome buildParams.NoPublic (fun _ -> "--nonpublic") + |> StringBuilder.appendIfSome buildParams.NoDefaultContent (fun _ -> "--nodefaultcontent") + |> StringBuilder.appendIfSome buildParams.Clean (fun _ -> "--clean") + |> StringBuilder.appendIfSome buildParams.Version (fun _ -> "--version") + |> StringBuilder.appendIfSome buildParams.Properties (sprintf "--properties %s") + |> StringBuilder.appendIfSome buildParams.FscOptions (sprintf "--fscoptions %s") + |> StringBuilder.appendIfSome buildParams.Strict (fun _ -> "--strict") + |> StringBuilder.appendIfSome buildParams.SourceFolder (sprintf "--sourcefolder %s") + |> StringBuilder.appendIfSome buildParams.SourceRepository (sprintf "--sourcerepo %s") + |> StringBuilder.appendIfSome buildParams.MdComments (fun _ -> "--mdcomments") + |> StringBuilder.toText + |> String.trim + + let internal buildWatchCommandParams (watchParams: WatchCommandParams) = + System.Text.StringBuilder() + |> StringBuilder.appendIfSome watchParams.NoServer (fun _ -> "--noserver") + |> StringBuilder.appendIfSome watchParams.NoLaunch (fun _ -> "--nolaunch") + |> StringBuilder.appendIfSome watchParams.Open (sprintf "--open %s") + |> StringBuilder.appendIfSome watchParams.Port (sprintf "--port %i") + |> StringBuilder.appendIfSome watchParams.BuildCommandParams buildBuildCommandParams + |> StringBuilder.toText + |> String.trim + + + let cleanCache (workingDirectory) = + Shell.cleanDirs [ + workingDirectory + ".fsdocs" + ] + + /// + /// Build documentation using fsdocs build command + /// + /// + /// Function used to overwrite the dotnetOptions. + /// Function used to overwrite the build command default parameters. + /// + /// + /// + /// Fsdocs.build (fun p -> { p with Clean = Some(true); Strict = Some(true) }) + /// + /// + let build dotnetOptions setBuildParams = + let buildParams = setBuildParams BuildCommandParams.Default + let formattedParameters = buildBuildCommandParams buildParams + + // let dotnetOptions = (fun (buildOptions: DotNet.Options) -> buildOptions) + let result = DotNet.exec dotnetOptions "fsdocs build" formattedParameters + + if + 0 + <> result.ExitCode + then + failwithf "fsdocs build failed with exit code '%d'" result.ExitCode + + /// + /// Watch documentation using fsdocs watch command + /// + /// + /// Function used to overwrite the dotnetOptions. + /// Function used to overwrite the watch command default parameters. + /// + /// + /// + /// Fsdocs.watch (fun p -> { p with Port = Some(3005) }) + /// + /// + let watch dotnetOptions setWatchParams = + let watchParams = setWatchParams WatchCommandParams.Default + let formattedParameters = buildWatchCommandParams watchParams + + // let dotnetOptions = (fun (buildOptions: DotNet.Options) -> buildOptions) + let result = DotNet.exec dotnetOptions "fsdocs watch" formattedParameters + + if + 0 + <> result.ExitCode + then + failwithf "fsdocs watch failed with exit code '%d'" result.ExitCode diff --git a/build/build.fs b/build/build.fs index 21333cca..7ce40ceb 100644 --- a/build/build.fs +++ b/build/build.fs @@ -34,6 +34,10 @@ let environVarAsBoolOrDefault varName defaultValue = let productName = "ImageProcessing" let sln = __SOURCE_DIRECTORY__ ".." "ImageProcessing.sln" +let rootDirectory = + __SOURCE_DIRECTORY__ + ".." + let src = __SOURCE_DIRECTORY__ ".." "src" let srcCodeGlob = @@ -49,6 +53,13 @@ let testsCodeGlob = let srcGlob = src @@ "**/*.??proj" let testsGlob = __SOURCE_DIRECTORY__ ".." "tests/**/*.??proj" +let docsDir = + rootDirectory + "docs" +let docsSrcDir = + rootDirectory + "docsSrc" + let mainApp = src @@ productName let srcAndTest = @@ -63,18 +74,34 @@ let distGlob = let coverageThresholdPercent = 0 let coverageReportDir = __SOURCE_DIRECTORY__ ".." "docs" @@ "coverage" - -let gitOwner = "gsvgit" +let temp = + rootDirectory + "temp" +let watchDocsDir = + temp + "watch-docs" + +let gitOwner = "LeonidLodygin" let gitRepoName = "ImageProcessing" let gitHubRepoUrl = sprintf "https://github.com/%s/%s" gitOwner gitRepoName +let documentationRootUrl = "https://LeonidLodygin.github.io/ImageProcessing/" + let releaseBranch = "main" +let readme = "README.md" +let changelogFile = "CHANGELOG.md" let tagFromVersionNumber versionNumber = sprintf "v%s" versionNumber let changelogFilename = __SOURCE_DIRECTORY__ ".." "CHANGELOG.md" let changelog = Fake.Core.Changelog.load changelogFilename + +let READMElink = Uri(Uri(gitHubRepoUrl), $"{productName}/blob/{releaseBranch}/{readme}") +let CHANGELOGlink = Uri(Uri(gitHubRepoUrl), $"{productName}/blob/{releaseBranch}/{changelogFile}") + +let LICENSElink = Uri(Uri(gitHubRepoUrl), $"{productName}/blob/{releaseBranch}/LICENSE.md") + let mutable latestEntry = if Seq.isEmpty changelog.Entries then Changelog.ChangelogEntry.New("0.0.1", "0.0.1-alpha.1", Some DateTime.Today, None, [], false) @@ -218,6 +245,62 @@ module dotnet = let fsharpLint args = DotNet.exec id "fsharplint lint --file-type solution" args +module DocsTool = + let quoted s = $"\"%s{s}\"" + + let fsDocsDotnetOptions (o: DotNet.Options) = { + o with + WorkingDirectory = __SOURCE_DIRECTORY__ ".." + } + + let fsDocsBuildParams configuration (p: Fsdocs.BuildCommandParams) = { + p with + Clean = Some true + Input = Some(quoted docsSrcDir) + Output = Some(quoted docsDir) + Eval = Some true + Projects = Some(Seq.map quoted (!!srcGlob)) + Properties = Some($"Configuration=%s{configuration}") + Parameters = + Some [ + // https://fsprojects.github.io/FSharp.Formatting/content.html#Templates-and-Substitutions + "root", quoted documentationRootUrl + "fsdocs-collection-name", quoted productName + "fsdocs-repository-branch", quoted releaseBranch + "fsdocs-repository-link", quoted (gitHubRepoUrl) + "fsdocs-package-version", quoted latestEntry.NuGetVersion + "fsdocs-readme-link", quoted (READMElink.ToString()) + "fsdocs-release-notes-link", quoted (CHANGELOGlink.ToString()) + "fsdocs-license-link", quoted (LICENSElink.ToString()) + ] + Strict = Some true + } + + let cleanDocsCache () = Fsdocs.cleanCache rootDirectory + + let build (configuration) = + Fsdocs.build fsDocsDotnetOptions (fsDocsBuildParams configuration) + + + let watch (configuration) = + let buildParams bp = + let bp = + Option.defaultValue Fsdocs.BuildCommandParams.Default bp + |> fsDocsBuildParams configuration + + { + bp with + Output = Some watchDocsDir + Strict = None + } + + Fsdocs.watch + fsDocsDotnetOptions + (fun p -> { + p with + BuildCommandParams = Some(buildParams p.BuildCommandParams) + }) + module FSharpAnalyzers = type Arguments = | Project of string @@ -586,6 +669,16 @@ let fsharpLint _ = else failwith "Some files need formatting, please check output for more info" +let cleanDocsCache _ = DocsTool.cleanDocsCache () + +let buildDocs ctx = + let configuration = configuration (ctx.Context.AllExecutingTargets) + DocsTool.build (string configuration) + +let watchDocs ctx = + let configuration = configuration (ctx.Context.AllExecutingTargets) + DocsTool.watch (string configuration) + let initTargets () = BuildServer.install [ GitHubActions.Installer @@ -622,6 +715,9 @@ let initTargets () = Target.create "CheckFormatCode" checkFormatCode Target.create "Release" ignore //Target.create "FsharpLint" fsharpLint + Target.create "CleanDocsCache" cleanDocsCache + Target.create "BuildDocs" buildDocs + Target.create "WatchDocs" watchDocs //----------------------------------------------------------------------------- // Target Dependencies @@ -644,6 +740,18 @@ let initTargets () = "UpdateChangelog" ?=>! "AssemblyInfo" "UpdateChangelog" ==>! "GitRelease" + "CleanDocsCache" + ==>! "BuildDocs" + + "DotnetBuild" + ?=>! "BuildDocs" + + "DotnetBuild" + ==>! "BuildDocs" + + "DotnetBuild" + ==>! "WatchDocs" + "DotnetRestore" ==> "CheckFormatCode" //==> "FsharpLint" diff --git a/build/build.fsproj b/build/build.fsproj index 1402f64d..4378f2cc 100644 --- a/build/build.fsproj +++ b/build/build.fsproj @@ -7,6 +7,7 @@ false + diff --git a/docs/Dockerfile b/docs/Dockerfile new file mode 100644 index 00000000..989c9abb --- /dev/null +++ b/docs/Dockerfile @@ -0,0 +1,29 @@ +FROM mcr.microsoft.com/dotnet/sdk:7.0 + +RUN apt-get update \ + && apt-get -y upgrade \ + && apt-get -y install python3 python3-pip python3-dev ipython3 + +RUN python3 -m pip install --no-cache-dir notebook jupyterlab + +ARG NB_USER=fsdocs-user +ARG NB_UID=1000 +ENV USER ${NB_USER} +ENV NB_UID ${NB_UID} +ENV HOME /home/${NB_USER} + +RUN adduser --disabled-password \ + --gecos "Default user" \ + --uid ${NB_UID} \ + ${NB_USER} + +COPY . ${HOME} +USER root +RUN chown -R ${NB_UID} ${HOME} +USER ${NB_USER} + +ENV PATH="${PATH}:$HOME/.dotnet/tools/" + +RUN dotnet tool install --global Microsoft.dotnet-interactive --version 1.0.410202 + +RUN dotnet-interactive jupyter install diff --git a/docs/Explanations/Structure.html b/docs/Explanations/Structure.html new file mode 100644 index 00000000..5fa30205 --- /dev/null +++ b/docs/Explanations/Structure.html @@ -0,0 +1,183 @@ + + + + + + Structure + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/How_Tos/Code.html b/docs/How_Tos/Code.html new file mode 100644 index 00000000..622270a2 --- /dev/null +++ b/docs/How_Tos/Code.html @@ -0,0 +1,222 @@ + + + + + + How to code + + + + + + + + + + + + + + + + + + + + + + +
+ +

How to code

+

In this tutorial, we will look at how to work with the ImageProcessing library using code rather than console commands.

+

Installing ImageProcessing

+
> dotnet add package LeonidLodygin.ImageProcessing --version 1.0.0
+
+ +

Load your image using the loadAsImage function from the MyImage module.

+
let image = loadAsImage "path to the image"
+
+

For CPU and GPU the list of transforms is identical, decide what you want to process your image on and select the appropriate function to process from the CpuProcessing module or the GpuProcessing module respectively.

+

In the case of CPU processing:

+

Apply the fisheye filter to the uploaded image.

+
let newImage = fishEye image
+
+

Don't forget to save the processed image using the saveImage function from the MyImage module!

+
let newImage = saveImage "path"
+
+

In the case of GPU processing:

+

In the case of GPU processing, you have to go through a few extra steps to achieve your goal:

+

Prepare OpenCl context and queue(from Brahma.FSharp module):

+
let clContext = ClContext(ClDevice.GetFirstAppropriateDevice(device))
+let queue = clContext.QueueProvider.CreateQueue()
+
+

Compile the kernel to apply the filter using the fishEyeKernel function from the GpuKernels module:

+
let fishKernel = fishEyeKernel clContext
+
+

Process the image using the fishEye function from the GpuProcessing module:

+
let newImage = fishEye fishKernel clContext 64 queue image
+
+

Don't forget to save the new image:

+
let newImage = saveImage "path"
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/NuGet.config b/docs/NuGet.config new file mode 100644 index 00000000..cf1ace51 --- /dev/null +++ b/docs/NuGet.config @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Tutorials/Tutorial.html b/docs/Tutorials/Tutorial.html new file mode 100644 index 00000000..424389b7 --- /dev/null +++ b/docs/Tutorials/Tutorial.html @@ -0,0 +1,224 @@ + + + + + + Get Started + + + + + + + + + + + + + + + + + + + + + + +
+ +

Get Started

+

In this tutorial we will look at how to get started with the ImageProcessing library and process your first images.

+

Installing ImageProcessing

+
> dotnet add package LeonidLodygin.ImageProcessing --version 1.0.0
+
+

Processing of images

+

Prepare your images

+

Decide on the image you want to process. You can also process several images at once, in which case specify the path to the directory with your images.

+

In the command line parameter "-i" use the path to the image, for "-o" use the path where you want to save the image. +

+

Choose the desired modifications

+

Decide on the modifications you want to apply to the image. Here is a complete list of available modifications:

+
    +
  • Gauss5x5
  • +
  • Gauss7x7
  • +
  • Edges
  • +
  • Sharpen
  • +
  • Emboss
  • +
  • ClockwiseRotation
  • +
  • CounterClockwiseRotation
  • +
  • MirrorVertical
  • +
  • MirrorHorizontal
  • +
  • FishEye
  • +
+

Use the selected modification or modification list for the "-mod" parameter.

+

CPU or GPU processing?

+

By default, all processing will be done at the expense of the CPU. If you want to process images using GPGPU, use the "-gpu" parameter (if the device has a video card):

+
    +
  • AnyGpu
  • +
  • Nvidia
  • +
  • Amd
  • +
  • Intel
  • +
+

How many logical cores does your system have?

+

In the case of processing a large number of images, it would be logical to utilize the parallel processing power of your device. To do this, use the "-ag" or "-sag" parameter. The "-ag" parameter will split image processing and saving tasks into two separate computational threads. The "-sag" parameter will allocate the number of threads you need to process and save images independently. For this parameter you should specify the number of threads you need.

+

Let's start processing!

+

The end result may look like the following:

+
> dotnet run -i *input path* -o *output path* -mod FishEye -gpu AnyGpu
+
+ + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_menu-item_template.html b/docs/_menu-item_template.html new file mode 100644 index 00000000..dc1b656a --- /dev/null +++ b/docs/_menu-item_template.html @@ -0,0 +1 @@ +
  • {{fsdocs-menu-item-content}}
  • \ No newline at end of file diff --git a/docs/_menu_template.html b/docs/_menu_template.html new file mode 100644 index 00000000..066716c9 --- /dev/null +++ b/docs/_menu_template.html @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/docs/content/fsdocs-custom.css b/docs/content/fsdocs-custom.css new file mode 100644 index 00000000..c2da89ad --- /dev/null +++ b/docs/content/fsdocs-custom.css @@ -0,0 +1,15 @@ +.fsharp-icon-logo { + width: 25px; + margin-top: -2px; + -webkit-filter: grayscale(100%) brightness(1) invert(1); /* Safari 6.0 - 9.0 */ + filter: grayscale(100%) brightness(1) invert(1); +} + + +body .navbar .dropdown-menu .active .bi { + display: block !important; +} + +nav.navbar .dropdown-item img.fsharp-icon-logo { + margin-right: 0px; +} \ No newline at end of file diff --git a/docs/content/fsdocs-dark.css b/docs/content/fsdocs-dark.css new file mode 100644 index 00000000..001b6530 --- /dev/null +++ b/docs/content/fsdocs-dark.css @@ -0,0 +1,50 @@ +@import url('https://raw.githubusercontent.com/tonsky/FiraCode/fixed/distr/fira_code.css'); +@import url('https://fonts.googleapis.com/css2?family=Hind+Vadodara&family=Roboto+Mono&display=swap'); +/*-------------------------------------------------------------------------- + Formatting for page & standard document content +/*--------------------------------------------------------------------------*/ + +:root { + --fsdocs-text-color:#d1d1d1; + --fsdocs-pre-border-color: #000000; + --fsdocs-pre-border-color-top: #070707; + --fsdocs-pre-background-color: #1E1E1E; + --fsdocs-pre-color: #e2e2e2; + --fsdocs-table-pre-background-color: #1d1d1d; + --fsdocs-table-pre-color: #c9c9c9; + + --fsdocs-code-strings-color: #ea9a75; + --fsdocs-code-printf-color: #E0C57F; + --fsdocs-code-escaped-color: #EA8675; + --fsdocs-code-identifiers-color: var(--fsdocs-text-color); + --fsdocs-code-module-color: #43AEC6; + --fsdocs-code-reference-color: #6a8dd8; + --fsdocs-code-value-color: #43AEC6; + --fsdocs-code-interface-color: #43AEC6; + --fsdocs-code-typearg-color: #43AEC6; + --fsdocs-code-disposable-color: #2f798a; + --fsdocs-code-property-color: #43AEC6; + --fsdocs-code-punctuation-color: #43AEC6; + --fsdocs-code-punctuation2-color: #e1e1e1; + --fsdocs-code-function-color: #e1e1e1; + --fsdocs-code-function2-color: #43AEC6; + --fsdocs-code-activepattern-color: #4ec9b0; + --fsdocs-code-unioncase-color: #4ec9b0; + --fsdocs-code-enumeration-color: #4ec9b0; + --fsdocs-code-keywords-color: #2248c4; + --fsdocs-code-comment-color: #329215; + --fsdocs-code-operators-color: #af75c1; + --fsdocs-code-numbers-color: #96C71D; + --fsdocs-code-linenumbers-color: #80b0b0; + --fsdocs-code-mutable-color: #997f0c; + --fsdocs-code-inactive-color: #808080; + --fsdocs-code-preprocessor-color: #af75c1; + --fsdocs-code-fsioutput-color: #808080; + --fsdocs-code-tooltip-color: #d1d1d1; +} + + +.fsdocs-source-link img { + -webkit-filter: grayscale(100%) brightness(1) invert(1); /* Safari 6.0 - 9.0 */ + filter: grayscale(100%) brightness(1) invert(1); +} \ No newline at end of file diff --git a/docs/content/fsdocs-default.css b/docs/content/fsdocs-default.css new file mode 100644 index 00000000..bf73bfa5 --- /dev/null +++ b/docs/content/fsdocs-default.css @@ -0,0 +1,613 @@ +@import url('https://fonts.googleapis.com/css2?family=Hind+Vadodara&family=Roboto+Mono:wght@400;500;600&display=swap'); +/*-------------------------------------------------------------------------- + Formatting for page & standard document content +/*--------------------------------------------------------------------------*/ + +body { + font-family: 'Hind Vadodara', sans-serif; + /* padding-top: 0px; + padding-bottom: 40px; +*/ +} + +blockquote { + margin: 0 1em 0 0.25em; + margin-top: 0px; + margin-right: 1em; + margin-bottom: 0px; + margin-left: 0.25em; + padding: 0 .75em 0 1em; + border-left: 1px solid #777; + border-right: 0px solid #777; +} + +/* Format the heading - nicer spacing etc. */ +.masthead { + overflow: hidden; +} + + .masthead .muted a { + text-decoration: none; + color: #999999; + } + + .masthead ul, .masthead li { + margin-bottom: 0px; + } + + .masthead .nav li { + margin-top: 15px; + font-size: 110%; + } + + .masthead h3 { + margin-top: 15px; + margin-bottom: 5px; + font-size: 170%; + } + +/*-------------------------------------------------------------------------- + Formatting fsdocs-content +/*--------------------------------------------------------------------------*/ + +/* Change font sizes for headings etc. */ +#fsdocs-content h1 { + margin: 30px 0px 15px 0px; + /* font-weight: 400; */ + font-size: 2rem; + letter-spacing: 1.78px; + line-height: 2.5rem; + font-weight: 400; +} + +#fsdocs-content h2 { + font-size: 1.6rem; + margin: 20px 0px 10px 0px; + font-weight: 400; +} + +#fsdocs-content h3 { + font-size: 1.2rem; + margin: 15px 0px 10px 0px; + font-weight: 400; +} + +#fsdocs-content hr { + margin: 0px 0px 20px 0px; +} + +#fsdocs-content li { + font-size: 1.0rem; + line-height: 1.375rem; + letter-spacing: 0.01px; + font-weight: 500; + margin: 0px 0px 15px 0px; +} + +#fsdocs-content p { + font-size: 1.0rem; + line-height: 1.375rem; + letter-spacing: 0.01px; + font-weight: 500; + color: #262626; +} + +#fsdocs-content a { + color: #4974D1; +} +/* remove the default bootstrap bold on dt elements */ +#fsdocs-content dt { + font-weight: normal; +} + + + +/*-------------------------------------------------------------------------- + Formatting tables in fsdocs-content, using learn.microsoft.com tables +/*--------------------------------------------------------------------------*/ + +#fsdocs-content .table { + table-layout: auto; + width: 100%; + font-size: 0.875rem; +} + + #fsdocs-content .table caption { + font-size: 0.8rem; + font-weight: 600; + letter-spacing: 2px; + text-transform: uppercase; + padding: 1.125rem; + border-width: 0 0 1px; + border-style: solid; + border-color: #e3e3e3; + text-align: right; + } + + #fsdocs-content .table td, + #fsdocs-content .table th { + display: table-cell; + word-wrap: break-word; + padding: 0.75rem 1rem 0.75rem 0rem; + line-height: 1.5; + vertical-align: top; + border-top: 1px solid #e3e3e3; + border-right: 0; + border-left: 0; + border-bottom: 0; + border-style: solid; + } + + /* suppress the top line on inner lists such as tables of exceptions */ + #fsdocs-content .table .fsdocs-exception-list td, + #fsdocs-content .table .fsdocs-exception-list th { + border-top: 0 + } + + #fsdocs-content .table td p:first-child, + #fsdocs-content .table th p:first-child { + margin-top: 0; + } + + #fsdocs-content .table td.nowrap, + #fsdocs-content .table th.nowrap { + white-space: nowrap; + } + + #fsdocs-content .table td.is-narrow, + #fsdocs-content .table th.is-narrow { + width: 15%; + } + + #fsdocs-content .table th:not([scope='row']) { + border-top: 0; + border-bottom: 1px; + } + + #fsdocs-content .table > caption + thead > tr:first-child > td, + #fsdocs-content .table > colgroup + thead > tr:first-child > td, + #fsdocs-content .table > thead:first-child > tr:first-child > td { + border-top: 0; + } + + #fsdocs-content .table table-striped > tbody > tr:nth-of-type(odd) { + background-color: var(--box-shadow-light); + } + + #fsdocs-content .table.min { + width: unset; + } + + #fsdocs-content .table.is-left-aligned td:first-child, + #fsdocs-content .table.is-left-aligned th:first-child { + padding-left: 0; + } + + #fsdocs-content .table.is-left-aligned td:first-child a, + #fsdocs-content .table.is-left-aligned th:first-child a { + outline-offset: -0.125rem; + } + +@media screen and (max-width: 767px), screen and (min-resolution: 120dpi) and (max-width: 767.9px) { + #fsdocs-content .table.is-stacked-mobile td:nth-child(1) { + display: block; + width: 100%; + padding: 1rem 0; + } + + #fsdocs-content .table.is-stacked-mobile td:not(:nth-child(1)) { + display: block; + border-width: 0; + padding: 0 0 1rem; + } +} + +#fsdocs-content .table.has-inner-borders th, +#fsdocs-content .table.has-inner-borders td { + border-right: 1px solid #e3e3e3; +} + + #fsdocs-content .table.has-inner-borders th:last-child, + #fsdocs-content .table.has-inner-borders td:last-child { + border-right: none; + } + +.fsdocs-entity-list .fsdocs-entity-name { + width: 25%; + font-weight: bold; +} + +.fsdocs-member-list .fsdocs-member-usage { + width: 35%; +} + +/*-------------------------------------------------------------------------- + Formatting xmldoc sections in fsdocs-content +/*--------------------------------------------------------------------------*/ + +.fsdocs-summary { + display: inline; +} + +.fsdocs-xmldoc, .fsdocs-entity-xmldoc, .fsdocs-member-xmldoc { + font-size: 1.0rem; + line-height: 1.375rem; + letter-spacing: 0.01px; + font-weight: 500; + color: #262626; +} + +.fsdocs-xmldoc h1 { + font-size: 1.2rem; + margin: 10px 0px 0px 0px; +} + +.fsdocs-xmldoc h2 { + font-size: 1.2rem; + margin: 10px 0px 0px 0px; +} + +.fsdocs-xmldoc h3 { + font-size: 1.1rem; + margin: 10px 0px 0px 0px; +} + +.fsdocs-member-xmldoc details[open] summary + * { + margin-top: 1rem; +} + +/* #fsdocs-nav .searchbox { + margin-top: 30px; + margin-bottom: 30px; +} */ + +#fsdocs-nav img.logo{ + width:90%; + /* height:140px; */ + /* margin:10px 0px 0px 20px; */ + margin-top:40px; + border-style:none; +} + +#fsdocs-nav input{ + /* margin-left: 20px; */ + margin-right: 20px; + margin-top: 20px; + margin-bottom: 20px; + width: 93%; + -webkit-border-radius: 0; + border-radius: 0; +} + +#fsdocs-nav { + /* margin-left: -5px; */ + /* width: 90%; */ + font-size:0.95rem; +} + +#fsdocs-nav li.nav-header{ + /* margin-left: -5px; */ + /* width: 90%; */ + padding-left: 0; + color: #262626; + text-transform: none; + font-size:16px; + margin-top: 9px; + font-weight: bold; +} + +#fsdocs-nav a{ + padding-left: 0; + color: #6c6c6d; + /* margin-left: 5px; */ + /* width: 90%; */ +} + +/*-------------------------------------------------------------------------- + Formatting pre and code sections in fsdocs-content (code highlighting is + further below) +/*--------------------------------------------------------------------------*/ + +#fsdocs-content code { + /* font-size: 0.83rem; */ + font: 0.85rem 'Roboto Mono', monospace; + background-color: #f7f7f900; + border: 0px; + padding: 0px; + /* word-wrap: break-word; */ + /* white-space: pre; */ +} + +/* omitted */ +#fsdocs-content span.omitted { + background: #3c4e52; + border-radius: 5px; + color: #808080; + padding: 0px 0px 1px 0px; +} + +#fsdocs-content pre .fssnip code { + font: 0.86rem 'Roboto Mono', monospace; +} + +#fsdocs-content table.pre, +#fsdocs-content pre.fssnip, +#fsdocs-content pre { + line-height: 13pt; + border: 0px solid #d8d8d8; + border-top: 0px solid #e3e3e3; + border-collapse: separate; + white-space: pre; + font: 0.86rem 'Roboto Mono', monospace; + width: 100%; + margin: 10px 0px 20px 0px; + background-color: #f3f4f7; + padding: 10px; + border-radius: 5px; + color: #8e0e2b; + max-width: none; + box-sizing: border-box; +} + +#fsdocs-content pre.fssnip code { + font: 0.86rem 'Roboto Mono', monospace; + font-weight: 600; +} + +#fsdocs-content table.pre { + background-color: #fff7ed; +} + +#fsdocs-content table.pre pre { + padding: 0px; + margin: 0px; + border-radius: 0px; + width: 100%; + background-color: #fff7ed; + color: #837b79; +} + +#fsdocs-content table.pre td { + padding: 0px; + white-space: normal; + margin: 0px; + width: 100%; +} + +#fsdocs-content table.pre td.lines { + width: 30px; +} + + +#fsdocs-content pre { + word-wrap: inherit; +} + +.fsdocs-example-header { + font-size: 1.0rem; + line-height: 1.375rem; + letter-spacing: 0.01px; + font-weight: 700; + color: #262626; +} + +/*-------------------------------------------------------------------------- + Formatting github source links +/*--------------------------------------------------------------------------*/ + +.fsdocs-source-link { + float: right; + text-decoration: none; +} + + .fsdocs-source-link img { + border-style: none; + margin-left: 10px; + width: auto; + height: 1.4em; + } + + .fsdocs-source-link .hover { + display: none; + } + + .fsdocs-source-link:hover .hover { + display: block; + } + + .fsdocs-source-link .normal { + display: block; + } + + .fsdocs-source-link:hover .normal { + display: none; + } + +/*-------------------------------------------------------------------------- + Formatting logo +/*--------------------------------------------------------------------------*/ + +#fsdocs-logo { + width:140px; + height:140px; + margin:10px 0px 0px 0px; + border-style:none; +} + +/*-------------------------------------------------------------------------- + +/*--------------------------------------------------------------------------*/ + +#fsdocs-content table.pre pre { + padding: 0px; + margin: 0px; + border: none; +} + +/*-------------------------------------------------------------------------- + Remove formatting from links +/*--------------------------------------------------------------------------*/ + +#fsdocs-content h1 a, +#fsdocs-content h1 a:hover, +#fsdocs-content h1 a:focus, +#fsdocs-content h2 a, +#fsdocs-content h2 a:hover, +#fsdocs-content h2 a:focus, +#fsdocs-content h3 a, +#fsdocs-content h3 a:hover, +#fsdocs-content h3 a:focus, +#fsdocs-content h4 a, +#fsdocs-content h4 a:hover, #fsdocs-content +#fsdocs-content h4 a:focus, +#fsdocs-content h5 a, +#fsdocs-content h5 a:hover, +#fsdocs-content h5 a:focus, +#fsdocs-content h6 a, +#fsdocs-content h6 a:hover, +#fsdocs-content h6 a:focus { + color: #262626; + text-decoration: none; + text-decoration-style: none; + /* outline: none */ +} + +/*-------------------------------------------------------------------------- + Formatting for F# code snippets +/*--------------------------------------------------------------------------*/ + +.fsdocs-param-name, +.fsdocs-return-name, +.fsdocs-param { + font-weight: 900; + font-size: 0.85rem; + font-family: 'Roboto Mono', monospace; +} +/* strings --- and stlyes for other string related formats */ +#fsdocs-content span.s { + color: #dd1144; +} +/* printf formatters */ +#fsdocs-content span.pf { + color: #E0C57F; +} +/* escaped chars */ +#fsdocs-content span.e { + color: #EA8675; +} + +/* identifiers --- and styles for more specific identifier types */ +#fsdocs-content span.id { + color: #262626; +} +/* module */ +#fsdocs-content span.m { + color: #009999; +} +/* reference type */ +#fsdocs-content span.rt { + color: #4974D1; +} +/* value type */ +#fsdocs-content span.vt { + color: #43AEC6; +} +/* interface */ +#fsdocs-content span.if { + color: #43AEC6; +} +/* type argument */ +#fsdocs-content span.ta { + color: #43AEC6; +} +/* disposable */ +#fsdocs-content span.d { + color: #43AEC6; +} +/* property */ +#fsdocs-content span.prop { + color: #43AEC6; +} +/* punctuation */ +#fsdocs-content span.p { + color: #43AEC6; +} +#fsdocs-content span.pn { + color: #262626; +} +/* function */ +#fsdocs-content span.f { + color: #e1e1e1; +} +#fsdocs-content span.fn { + color: #990000; +} +/* active pattern */ +#fsdocs-content span.pat { + color: #4ec9b0; +} +/* union case */ +#fsdocs-content span.u { + color: #4ec9b0; +} +/* enumeration */ +#fsdocs-content span.e { + color: #4ec9b0; +} +/* keywords */ +#fsdocs-content span.k { + color: #b68015; + /* font-weight: bold; */ +} +/* comment */ +#fsdocs-content span.c { + color: #808080; + font-weight: 400; + font-style: italic; +} +/* operators */ +#fsdocs-content span.o { + color: #af75c1; +} +/* numbers */ +#fsdocs-content span.n { + color: #009999; +} +/* line number */ +#fsdocs-content span.l { + color: #80b0b0; +} +/* mutable var or ref cell */ +#fsdocs-content span.v { + color: #d1d1d1; + font-weight: bold; +} +/* inactive code */ +#fsdocs-content span.inactive { + color: #808080; +} +/* preprocessor */ +#fsdocs-content span.prep { + color: #af75c1; +} +/* fsi output */ +#fsdocs-content span.fsi { + color: #808080; +} + +/* tool tip */ +div.fsdocs-tip { + background: #475b5f; + border-radius: 4px; + font: 0.85rem 'Roboto Mono', monospace; + padding: 6px 8px 6px 8px; + display: none; + color: #d1d1d1; + pointer-events: none; +} + + div.fsdocs-tip code { + color: #d1d1d1; + font: 0.85rem 'Roboto Mono', monospace; + } + diff --git a/docs/content/fsdocs-light.css b/docs/content/fsdocs-light.css new file mode 100644 index 00000000..474512dc --- /dev/null +++ b/docs/content/fsdocs-light.css @@ -0,0 +1,43 @@ +@import url('https://fonts.googleapis.com/css2?family=Hind+Vadodara&family=Roboto+Mono&display=swap'); +/*-------------------------------------------------------------------------- + Formatting for page & standard document content +/*--------------------------------------------------------------------------*/ + +:root { + --fsdocs-text-color:#262626; + --fsdocs-pre-border-color: #d8d8d8; + --fsdocs-pre-border-color-top: #e3e3e3; + --fsdocs-pre-background-color: #f3f4f7; + --fsdocs-pre-color: #8e0e2b; + --fsdocs-table-pre-background-color: #fff7ed; + --fsdocs-table-pre-color: #837b79; + + --fsdocs-code-strings-color: #dd1144; + --fsdocs-code-printf-color: #E0C57F; + --fsdocs-code-escaped-color: #EA8675; + --fsdocs-code-identifiers-color: var(--fsdocs-text-color); + --fsdocs-code-module-color: #009999; + --fsdocs-code-reference-color: #4974D1; + --fsdocs-code-value-color: #43AEC6; + --fsdocs-code-interface-color: #43AEC6; + --fsdocs-code-typearg-color: #43AEC6; + --fsdocs-code-disposable-color: #43AEC6; + --fsdocs-code-property-color: #43AEC6; + --fsdocs-code-punctuation-color: #43AEC6; + --fsdocs-code-punctuation2-color: #var(--fsdocs-text-color); + --fsdocs-code-function-color: #e1e1e1; + --fsdocs-code-function2-color: #990000; + --fsdocs-code-activepattern-color: #4ec9b0; + --fsdocs-code-unioncase-color: #4ec9b0; + --fsdocs-code-enumeration-color: #4ec9b0; + --fsdocs-code-keywords-color: #b68015; + --fsdocs-code-comment-color: #808080; + --fsdocs-code-operators-color: #af75c1; + --fsdocs-code-numbers-color: #009999; + --fsdocs-code-linenumbers-color: #80b0b0; + --fsdocs-code-mutable-color: #d1d1d1; + --fsdocs-code-inactive-color: #808080; + --fsdocs-code-preprocessor-color: #af75c1; + --fsdocs-code-fsioutput-color: #808080; + --fsdocs-code-tooltip-color: #d1d1d1; +} \ No newline at end of file diff --git a/docs/content/fsdocs-main.css b/docs/content/fsdocs-main.css new file mode 100644 index 00000000..a1748d2f --- /dev/null +++ b/docs/content/fsdocs-main.css @@ -0,0 +1,604 @@ +@import url('https://fonts.googleapis.com/css2?family=Hind+Vadodara&family=Roboto+Mono&display=swap'); +/*-------------------------------------------------------------------------- + Formatting for page & standard document content +/*--------------------------------------------------------------------------*/ + +body { + font-family: 'Hind Vadodara', sans-serif; + /* padding-top: 0px; + padding-bottom: 40px; +*/ +} + +blockquote { + margin: 0 1em 0 0.25em; + margin-top: 0px; + margin-right: 1em; + margin-bottom: 0px; + margin-left: 0.25em; + padding: 0 .75em 0 1em; + border-left: 1px solid #777; + border-right: 0px solid #777; +} + +/* Format the heading - nicer spacing etc. */ +.masthead { + overflow: hidden; +} + + .masthead .muted a { + text-decoration: none; + color: #999999; + } + + .masthead ul, .masthead li { + margin-bottom: 0px; + } + + .masthead .nav li { + margin-top: 15px; + font-size: 110%; + } + + .masthead h3 { + margin-top: 15px; + margin-bottom: 5px; + font-size: 170%; + } + +/*-------------------------------------------------------------------------- + Formatting fsdocs-content +/*--------------------------------------------------------------------------*/ + +/* Change font sizes for headings etc. */ +#fsdocs-content h1 { + margin: 30px 0px 15px 0px; + /* font-weight: 400; */ + font-size: 2rem; + letter-spacing: 1.78px; + line-height: 2.5rem; + font-weight: 400; +} + +#fsdocs-content h2 { + font-size: 1.6rem; + margin: 20px 0px 10px 0px; + font-weight: 400; +} + +#fsdocs-content h3 { + font-size: 1.2rem; + margin: 15px 0px 10px 0px; + font-weight: 400; +} + +#fsdocs-content hr { + margin: 0px 0px 20px 0px; +} + +#fsdocs-content li { + font-size: 1.0rem; + line-height: 1.375rem; + letter-spacing: 0.01px; + font-weight: 500; + margin: 0px 0px 15px 0px; +} + +#fsdocs-content p { + font-size: 1.0rem; + line-height: 1.375rem; + letter-spacing: 0.01px; + font-weight: 500; + color: var(--fsdocs-text-color);; +} + +#fsdocs-content a:not(.btn) { + color: #4974D1; +} +/* remove the default bootstrap bold on dt elements */ +#fsdocs-content dt { + font-weight: normal; +} + + + +/*-------------------------------------------------------------------------- + Formatting tables in fsdocs-content, using learn.microsoft.com tables +/*--------------------------------------------------------------------------*/ + +#fsdocs-content .table { + table-layout: auto; + width: 100%; + font-size: 0.875rem; +} + + #fsdocs-content .table caption { + font-size: 0.8rem; + font-weight: 600; + letter-spacing: 2px; + text-transform: uppercase; + padding: 1.125rem; + border-width: 0 0 1px; + border-style: solid; + border-color: #e3e3e3; + text-align: right; + } + + #fsdocs-content .table td, + #fsdocs-content .table th { + display: table-cell; + word-wrap: break-word; + padding: 0.75rem 1rem 0.75rem 0rem; + line-height: 1.5; + vertical-align: top; + border-top: 1px solid #e3e3e3; + border-right: 0; + border-left: 0; + border-bottom: 0; + border-style: solid; + } + + /* suppress the top line on inner lists such as tables of exceptions */ + #fsdocs-content .table .fsdocs-exception-list td, + #fsdocs-content .table .fsdocs-exception-list th { + border-top: 0 + } + + #fsdocs-content .table td p:first-child, + #fsdocs-content .table th p:first-child { + margin-top: 0; + } + + #fsdocs-content .table td.nowrap, + #fsdocs-content .table th.nowrap { + white-space: nowrap; + } + + #fsdocs-content .table td.is-narrow, + #fsdocs-content .table th.is-narrow { + width: 15%; + } + + #fsdocs-content .table th:not([scope='row']) { + border-top: 0; + border-bottom: 1px; + } + + #fsdocs-content .table > caption + thead > tr:first-child > td, + #fsdocs-content .table > colgroup + thead > tr:first-child > td, + #fsdocs-content .table > thead:first-child > tr:first-child > td { + border-top: 0; + } + + #fsdocs-content .table table-striped > tbody > tr:nth-of-type(odd) { + background-color: var(--box-shadow-light); + } + + #fsdocs-content .table.min { + width: unset; + } + + #fsdocs-content .table.is-left-aligned td:first-child, + #fsdocs-content .table.is-left-aligned th:first-child { + padding-left: 0; + } + + #fsdocs-content .table.is-left-aligned td:first-child a, + #fsdocs-content .table.is-left-aligned th:first-child a { + outline-offset: -0.125rem; + } + +@media screen and (max-width: 767px), screen and (min-resolution: 120dpi) and (max-width: 767.9px) { + #fsdocs-content .table.is-stacked-mobile td:nth-child(1) { + display: block; + width: 100%; + padding: 1rem 0; + } + + #fsdocs-content .table.is-stacked-mobile td:not(:nth-child(1)) { + display: block; + border-width: 0; + padding: 0 0 1rem; + } +} + +#fsdocs-content .table.has-inner-borders th, +#fsdocs-content .table.has-inner-borders td { + border-right: 1px solid #e3e3e3; +} + + #fsdocs-content .table.has-inner-borders th:last-child, + #fsdocs-content .table.has-inner-borders td:last-child { + border-right: none; + } + +.fsdocs-entity-list .fsdocs-entity-name { + width: 25%; + font-weight: bold; +} + +.fsdocs-member-list .fsdocs-member-usage { + width: 35%; +} + +/*-------------------------------------------------------------------------- + Formatting xmldoc sections in fsdocs-content +/*--------------------------------------------------------------------------*/ + +.fsdocs-xmldoc, .fsdocs-entity-xmldoc, .fsdocs-member-xmldoc { + font-size: 1.0rem; + line-height: 1.375rem; + letter-spacing: 0.01px; + font-weight: 500; + color: var(--fsdocs-text-color);; +} + +.fsdocs-xmldoc h1 { + font-size: 1.2rem; + margin: 10px 0px 0px 0px; +} + +.fsdocs-xmldoc h2 { + font-size: 1.2rem; + margin: 10px 0px 0px 0px; +} + +.fsdocs-xmldoc h3 { + font-size: 1.1rem; + margin: 10px 0px 0px 0px; +} + +/* #fsdocs-nav .searchbox { + margin-top: 30px; + margin-bottom: 30px; +} */ + +#fsdocs-nav img.logo{ + width:90%; + /* height:140px; */ + /* margin:10px 0px 0px 20px; */ + margin-top:40px; + border-style:none; +} + +#fsdocs-nav input{ + /* margin-left: 20px; */ + margin-right: 20px; + margin-top: 20px; + margin-bottom: 20px; + width: 93%; + -webkit-border-radius: 0; + border-radius: 0; +} + +#fsdocs-nav { + /* margin-left: -5px; */ + /* width: 90%; */ + font-size:0.95rem; +} + +#fsdocs-nav li.nav-header{ + /* margin-left: -5px; */ + /* width: 90%; */ + padding-left: 0; + color: var(--fsdocs-text-color);; + text-transform: none; + font-size:16px; + margin-top: 9px; + font-weight: bold; +} + +#fsdocs-nav a{ + padding-left: 0; + color: #6c6c6d; + /* margin-left: 5px; */ + /* width: 90%; */ +} + +/*-------------------------------------------------------------------------- + Formatting pre and code sections in fsdocs-content (code highlighting is + further below) +/*--------------------------------------------------------------------------*/ + +#fsdocs-content code { + /* font-size: 0.83rem; */ + font: 0.85rem 'Roboto Mono', monospace; + background-color: #f7f7f900; + border: 0px; + padding: 0px; + /* word-wrap: break-word; */ + /* white-space: pre; */ +} + +/* omitted */ +#fsdocs-content span.omitted { + background: #3c4e52; + border-radius: 5px; + color: #808080; + padding: 0px 0px 1px 0px; +} + +#fsdocs-content pre .fssnip code { + font: 0.86rem 'Roboto Mono', monospace; +} + +#fsdocs-content table.pre, +#fsdocs-content pre.fssnip, +#fsdocs-content pre { + line-height: 13pt; + border: 0px solid var(--fsdocs-pre-border-color); + border-top: 0px solid var(--fsdocs-pre-border-color-top); + border-collapse: separate; + white-space: pre; + font: 0.86rem 'Roboto Mono', monospace; + width: 100%; + margin: 10px 0px 20px 0px; + background-color: var(--fsdocs-pre-background-color); + padding: 10px; + border-radius: 5px; + color: var(--fsdocs-pre-color); + max-width: none; + box-sizing: border-box; +} + +#fsdocs-content pre.fssnip code { + font: 0.86rem 'Roboto Mono', monospace; + font-weight: 600; +} + +#fsdocs-content table.pre { + background-color: var(--fsdocs-table-pre-background-color);; +} + +#fsdocs-content table.pre pre { + padding: 0px; + margin: 0px; + border-radius: 0px; + width: 100%; + background-color: var(--fsdocs-table-pre-background-color); + color: var(--fsdocs-table-pre-color); +} + +#fsdocs-content table.pre td { + padding: 0px; + white-space: normal; + margin: 0px; + width: 100%; +} + +#fsdocs-content table.pre td.lines { + width: 30px; +} + + +#fsdocs-content pre { + word-wrap: inherit; +} + +.fsdocs-example-header { + font-size: 1.0rem; + line-height: 1.375rem; + letter-spacing: 0.01px; + font-weight: 700; + color: var(--fsdocs-text-color);; +} + +/*-------------------------------------------------------------------------- + Formatting github source links +/*--------------------------------------------------------------------------*/ + +.fsdocs-source-link { + float: right; + text-decoration: none; +} + + .fsdocs-source-link img { + border-style: none; + margin-left: 10px; + width: auto; + height: 1.4em; + } + + .fsdocs-source-link .hover { + display: none; + } + + .fsdocs-source-link:hover .hover { + display: block; + } + + .fsdocs-source-link .normal { + display: block; + } + + .fsdocs-source-link:hover .normal { + display: none; + } + +/*-------------------------------------------------------------------------- + Formatting logo +/*--------------------------------------------------------------------------*/ + +#fsdocs-logo { + width:40px; + height:40px; + margin:10px 0px 0px 0px; + border-style:none; +} + +/*-------------------------------------------------------------------------- + +/*--------------------------------------------------------------------------*/ + +#fsdocs-content table.pre pre { + padding: 0px; + margin: 0px; + border: none; +} + +/*-------------------------------------------------------------------------- + Remove formatting from links +/*--------------------------------------------------------------------------*/ + +#fsdocs-content h1 a, +#fsdocs-content h1 a:hover, +#fsdocs-content h1 a:focus, +#fsdocs-content h2 a, +#fsdocs-content h2 a:hover, +#fsdocs-content h2 a:focus, +#fsdocs-content h3 a, +#fsdocs-content h3 a:hover, +#fsdocs-content h3 a:focus, +#fsdocs-content h4 a, +#fsdocs-content h4 a:hover, #fsdocs-content +#fsdocs-content h4 a:focus, +#fsdocs-content h5 a, +#fsdocs-content h5 a:hover, +#fsdocs-content h5 a:focus, +#fsdocs-content h6 a, +#fsdocs-content h6 a:hover, +#fsdocs-content h6 a:focus { + color: var(--fsdocs-text-color);; + text-decoration: none; + text-decoration-style: none; + /* outline: none */ +} + +/*-------------------------------------------------------------------------- + Formatting for F# code snippets +/*--------------------------------------------------------------------------*/ + +.fsdocs-param-name, +.fsdocs-return-name, +.fsdocs-param { + font-weight: 900; + font-size: 0.85rem; + font-family: 'Roboto Mono', monospace; +} +/* strings --- and stlyes for other string related formats */ +#fsdocs-content span.s { + color: var(--fsdocs-code-strings-color); +} +/* printf formatters */ +#fsdocs-content span.pf { + color: var(--fsdocs-code-printf-color); +} +/* escaped chars */ +#fsdocs-content span.e { + color: var(--fsdocs-code-escaped-color); +} + +/* identifiers --- and styles for more specific identifier types */ +#fsdocs-content span.id { + color: var(--fsdocs-identifiers-color);; +} +/* module */ +#fsdocs-content span.m { + color:var(--fsdocs-code-module-color); +} +/* reference type */ +#fsdocs-content span.rt { + color: var(--fsdocs-code-reference-color); +} +/* value type */ +#fsdocs-content span.vt { + color: var(--fsdocs-code-value-color); +} +/* interface */ +#fsdocs-content span.if { + color: var(--fsdocs-code-interface-color); +} +/* type argument */ +#fsdocs-content span.ta { + color: var(--fsdocs-code-typearg-color); +} +/* disposable */ +#fsdocs-content span.d { + color: var(--fsdocs-code-disposable-color); +} +/* property */ +#fsdocs-content span.prop { + color: var(--fsdocs-code-property-color); +} +/* punctuation */ +#fsdocs-content span.p { + color: var(--fsdocs-code-punctuation-color); +} +#fsdocs-content span.pn { + color: var(--fsdocs-code-punctuation2-color); +} +/* function */ +#fsdocs-content span.f { + color: var(--fsdocs-code-function-color); +} +#fsdocs-content span.fn { + color: var(--fsdocs-code-function2-color); +} +/* active pattern */ +#fsdocs-content span.pat { + color: var(--fsdocs-code-activepattern-color); +} +/* union case */ +#fsdocs-content span.u { + color: var(--fsdocs-code-unioncase-color); +} +/* enumeration */ +#fsdocs-content span.e { + color: var(--fsdocs-code-enumeration-color); +} +/* keywords */ +#fsdocs-content span.k { + color: var(--fsdocs-code-keywords-color); + /* font-weight: bold; */ +} +/* comment */ +#fsdocs-content span.c { + color: var(--fsdocs-code-comment-color); + font-weight: 400; + font-style: italic; +} +/* operators */ +#fsdocs-content span.o { + color: var(--fsdocs-code-operators-color); +} +/* numbers */ +#fsdocs-content span.n { + color: var(--fsdocs-code-numbers-color); +} +/* line number */ +#fsdocs-content span.l { + color: var(--fsdocs-code-linenumbers-color); +} +/* mutable var or ref cell */ +#fsdocs-content span.v { + color: var(--fsdocs-code-mutable-color); + font-weight: bold; +} +/* inactive code */ +#fsdocs-content span.inactive { + color: var(--fsdocs-code-inactive-color); +} +/* preprocessor */ +#fsdocs-content span.prep { + color: var(--fsdocs-code-preprocessor-color); +} +/* fsi output */ +#fsdocs-content span.fsi { + color: var(--fsdocs-code-fsioutput-color); +} + +/* tool tip */ +div.fsdocs-tip { + background: #475b5f; + border-radius: 4px; + font: 0.85rem 'Roboto Mono', monospace; + padding: 6px 8px 6px 8px; + display: none; + color: var(--fsdocs-code-tooltip-color); + pointer-events: none; +} + + div.fsdocs-tip code { + color: var(--fsdocs-code-tooltip-color); + font: 0.85rem 'Roboto Mono', monospace; + } \ No newline at end of file diff --git a/docs/content/fsdocs-search.js b/docs/content/fsdocs-search.js new file mode 100644 index 00000000..3d543cf3 --- /dev/null +++ b/docs/content/fsdocs-search.js @@ -0,0 +1,84 @@ +var lunrIndex, pagesIndex; + +function endsWith(str, suffix) { + return str.indexOf(suffix, str.length - suffix.length) !== -1; +} + +// Initialize lunrjs using our generated index file +function initLunr() { + if (!endsWith(fsdocs_search_baseurl,"/")){ + fsdocs_search_baseurl = fsdocs_search_baseurl+'/' + }; + + // First retrieve the index file + $.getJSON(fsdocs_search_baseurl +"index.json") + .done(function(index) { + pagesIndex = index; + // Set up lunrjs by declaring the fields we use + // Also provide their boost level for the ranking + lunrIndex = lunr(function() { + this.ref("uri"); + this.field('title', { + boost: 15 + }); + this.field('tags', { + boost: 10 + }); + this.field("content", { + boost: 5 + }); + + this.pipeline.remove(lunr.stemmer); + this.searchPipeline.remove(lunr.stemmer); + + // Feed lunr with each file and let lunr actually index them + pagesIndex.forEach(function(page) { + this.add(page); + }, this); + }) + }) + .fail(function(jqxhr, textStatus, error) { + var err = textStatus + ", " + error; + console.error("Error getting Hugo index file:", err); + }); +} + +/** + * Trigger a search in lunr and transform the result + * + * @param {String} query + * @return {Array} results + */ +function search(queryTerm) { + // Find the item in our index corresponding to the lunr one to have more info + return lunrIndex.search(queryTerm+"^100"+" "+queryTerm+"*^10"+" "+"*"+queryTerm+"^10"+" "+queryTerm+"~2^1").map(function(result) { + return pagesIndex.filter(function(page) { + return page.uri === result.ref; + })[0]; + }); +} + +// Let's get started +initLunr(); + +$( document ).ready(function() { + var searchList = new autoComplete({ + /* selector for the search box element */ + minChars: 1, + selector: $("#search-by").get(0), + /* source is the callback to perform the search */ + source: function(term, response) { + response(search(term)); + }, + /* renderItem displays individual search results */ + renderItem: function(item, search) { + search = search.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + var re = new RegExp("(" + search.split(' ').join('|') + ")", "gi"); + return '
    ' + item.title.replace(re, "$1") + '
    '; + }, + /* onSelect callback fires when a search suggestion is chosen */ + onSelect: function(e, term, item) { + location.href = item.getAttribute('data-uri'); + } + }); +}); diff --git a/docs/content/fsdocs-tips.js b/docs/content/fsdocs-tips.js new file mode 100644 index 00000000..bcd04cb1 --- /dev/null +++ b/docs/content/fsdocs-tips.js @@ -0,0 +1,54 @@ +var currentTip = null; +var currentTipElement = null; + +function hideTip(evt, name, unique) { + var el = document.getElementById(name); + el.style.display = "none"; + currentTip = null; +} + +function findPos(obj) { + // no idea why, but it behaves differently in webbrowser component + if (window.location.search == "?inapp") + return [obj.offsetLeft + 10, obj.offsetTop + 30]; + + var curleft = 0; + var curtop = obj.offsetHeight; + while (obj) { + curleft += obj.offsetLeft; + curtop += obj.offsetTop; + obj = obj.offsetParent; + }; + return [curleft, curtop]; +} + +function hideUsingEsc(e) { + if (!e) { e = event; } + hideTip(e, currentTipElement, currentTip); +} + +function showTip(evt, name, unique, owner) { + document.onkeydown = hideUsingEsc; + if (currentTip == unique) return; + currentTip = unique; + currentTipElement = name; + + var pos = findPos(owner ? owner : (evt.srcElement ? evt.srcElement : evt.target)); + var posx = pos[0]; + var posy = pos[1]; + + var el = document.getElementById(name); + var parent = (document.documentElement == null) ? document.body : document.documentElement; + el.style.position = "absolute"; + el.style.left = posx + "px"; + el.style.top = posy + "px"; + el.style.display = "block"; +} +function Clipboard_CopyTo(value) { + var tempInput = document.createElement("input"); + tempInput.value = value; + document.body.appendChild(tempInput); + tempInput.select(); + document.execCommand("copy"); + document.body.removeChild(tempInput); +} \ No newline at end of file diff --git a/docs/content/img/copy-md-hover.png b/docs/content/img/copy-md-hover.png new file mode 100644 index 00000000..b14e9412 Binary files /dev/null and b/docs/content/img/copy-md-hover.png differ diff --git a/docs/content/img/copy-md.png b/docs/content/img/copy-md.png new file mode 100644 index 00000000..72de7381 Binary files /dev/null and b/docs/content/img/copy-md.png differ diff --git a/docs/content/img/copy-xml-hover.png b/docs/content/img/copy-xml-hover.png new file mode 100644 index 00000000..60fea167 Binary files /dev/null and b/docs/content/img/copy-xml-hover.png differ diff --git a/docs/content/img/copy-xml.png b/docs/content/img/copy-xml.png new file mode 100644 index 00000000..e5606b90 Binary files /dev/null and b/docs/content/img/copy-xml.png differ diff --git a/docs/content/img/github-hover.png b/docs/content/img/github-hover.png new file mode 100644 index 00000000..65971d4d Binary files /dev/null and b/docs/content/img/github-hover.png differ diff --git a/docs/content/img/github.png b/docs/content/img/github.png new file mode 100644 index 00000000..ff34f354 Binary files /dev/null and b/docs/content/img/github.png differ diff --git a/docs/content/navbar-fixed-left.css b/docs/content/navbar-fixed-left.css new file mode 100644 index 00000000..28e4c574 --- /dev/null +++ b/docs/content/navbar-fixed-left.css @@ -0,0 +1,91 @@ +/* CSS for Bootstrap 5 Fixed Left Sidebar Navigation */ + + + +@media (min-width: 992px){ + + body { + padding-left: 300px; + padding-right: 60px; + } + + #fsdocs-logo { + width:140px; + height:140px; + margin:10px 0px 0px 0px; + border-style:none; + } + + + nav.navbar { + position: fixed; + left: 0; + width: 300px; + bottom: 0; + top: 0; + overflow-y: auto; + overflow-x: hidden; + display: block; + border-right: 1px solid #cecece; + } + + nav.navbar>.container { + flex-direction: column; + padding: 0; + } + + nav.navbar .navbar-nav { + flex-direction: column; + } + nav.navbar .navbar-collapse { + width: 100%; + } + + nav.navbar .navbar-nav { + width: 100%; + } + + nav.navbar .navbar-nav .dropdown-menu { + position: static; + display: block; + } + + nav.navbar .dropdown { + margin-bottom: 5px; + font-size: 14px; + } + + nav.navbar .dropdown-item { + white-space: normal; + font-size: 14px; + vertical-align: middle; + } + + nav.navbar .dropdown-item img { + margin-right: 5px; + } + + nav.navbar .dropdown-toggle { + cursor: default; + } + + nav.navbar .dropdown-menu { + border-radius: 0; + border-left: 0; + border-right: 0; + } + + nav.navbar .dropdown-toggle:not(#bd-theme)::after { + display: none; + } + + .dropdown-menu[data-bs-popper] { + top: auto; + left: auto; + margin-top: auto; + } + + .nav-link:focus, .nav-link:hover { + color: auto; + } +} \ No newline at end of file diff --git a/docs/content/navbar-fixed-right.css b/docs/content/navbar-fixed-right.css new file mode 100644 index 00000000..ad6cef83 --- /dev/null +++ b/docs/content/navbar-fixed-right.css @@ -0,0 +1,78 @@ +body { + padding-top: 90px; +} + +@media (min-width: 768px) { + body { + padding-top: 0; + } +} + +@media (min-width: 768px) { + body { + margin-right: 252px; + } +} + +.navbar { + overflow-y: auto; + overflow-x: hidden; + box-shadow: none; +} +.navbar.fixed-right { + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 1030; +} +.navbar-nav .nav-link { + padding-top: 0.3rem; + padding-bottom: 0.3rem; +} +@media (min-width: 768px) { + .navbar.fixed-right { + bottom: 0; + width: 252px; + flex-flow: column nowrap; + align-items: flex-start; + } + + .navbar.fixed-right .navbar-collapse { + flex-grow: 0; + flex-direction: column; + width: 100%; + } + + .navbar.fixed-right .navbar-collapse .navbar-nav { + flex-direction: column; + width: 100%; + } + + .navbar.fixed-right .navbar-collapse .navbar-nav .nav-item { + width: 100%; + } + + .navbar.fixed-right .navbar-collapse .navbar-nav .nav-item .dropdown-menu { + top: 0; + } +} + +@media (min-width: 768px) { + .navbar.fixed-right { + left: auto; + } + + .navbar.fixed-right .navbar-nav .nav-item .dropdown-toggle:after { + border-top: 0.3em solid transparent; + border-left: none; + border-bottom: 0.3em solid transparent; + border-right: 0.3em solid; + vertical-align: baseline; + } + + .navbar.fixed-right .navbar-nav .nav-item .dropdown-menu { + left: auto; + right: 100%; + } +} diff --git a/docs/content/theme-toggle.js b/docs/content/theme-toggle.js new file mode 100644 index 00000000..c208c082 --- /dev/null +++ b/docs/content/theme-toggle.js @@ -0,0 +1,68 @@ +/*! + * Color mode toggler for Bootstrap's docs (https://getbootstrap.com/) + * Copyright 2011-2022 The Bootstrap Authors + * Licensed under the Creative Commons Attribution 3.0 Unported License. + */ + +(() => { + 'use strict' + + const storedTheme = localStorage.getItem('theme') + + const getPreferredTheme = () => { + if (storedTheme) { + return storedTheme + } + + return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' + } + + const setTheme = function (theme) { + const fsdocsTheme = document.getElementById("fsdocs-theme") + const re = /fsdocs-.*.css/ + if (theme === 'auto' && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.documentElement.setAttribute('data-bs-theme', 'dark') + fsdocsTheme.setAttribute("href", fsdocsTheme.getAttribute("href").replace(re,"fsdocs-dark.css")) + + } else { + document.documentElement.setAttribute('data-bs-theme', theme) + + fsdocsTheme.setAttribute("href", fsdocsTheme.getAttribute("href").replace(re,`fsdocs-${theme}.css`)) + } + } + + setTheme(getPreferredTheme()) + + const showActiveTheme = theme => { + const activeThemeIcon = document.getElementById('theme-icon-active') + const btnToActive = document.querySelector(`[data-bs-theme-value="${theme}"]`) + const svgOfActiveBtn = btnToActive.querySelector('i').getAttribute('class') + + document.querySelectorAll('[data-bs-theme-value]').forEach(element => { + element.classList.remove('active') + }) + + btnToActive.classList.add('active') + activeThemeIcon.setAttribute('class', svgOfActiveBtn) + } + + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => { + if (storedTheme !== 'light' || storedTheme !== 'dark') { + setTheme(getPreferredTheme()) + } + }) + + window.addEventListener('DOMContentLoaded', () => { + showActiveTheme(getPreferredTheme()) + + document.querySelectorAll('[data-bs-theme-value]') + .forEach(toggle => { + toggle.addEventListener('click', () => { + const theme = toggle.getAttribute('data-bs-theme-value') + localStorage.setItem('theme', theme) + setTheme(theme) + showActiveTheme(theme) + }) + }) + }) +})() \ No newline at end of file diff --git a/docs/coverage/ImageProcessing_Agents.html b/docs/coverage/ImageProcessing_Agents.html deleted file mode 100644 index d2fbde5a..00000000 --- a/docs/coverage/ImageProcessing_Agents.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - -Agents - Coverage Report - -
    -

    < Summary

    - ---- - - - - - - - - - - - - - - - - -
    Class:Agents
    Assembly:ImageProcessing
    File(s):C:\Users\Леонид\ImageProcessing\src\ImageProcessing\Agents.fs
    Covered lines:0
    Uncovered lines:39
    Coverable lines:39
    Total lines:59
    Line coverage:0% (0 of 39)
    Covered branches:0
    Total branches:4
    Branch coverage:0% (0 of 4)
    Covered methods:0
    Total methods:12
    Method coverage:0% (0 of 12)
    -

    Metrics

    - - - - - - - - - - - - - - - - -
    MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
    listAllFiles(...)0%2100%
    Invoke(...)0%2100%
    imgSaver(...)0%2100%
    Invoke(...)0%2100%
    Invoke(...)0%2100%
    Invoke(...)0%6220%
    Invoke(...)0%2100%
    imgProcessor(...)0%2100%
    Invoke(...)0%2100%
    Invoke(...)0%2100%
    Invoke(...)0%6220%
    Invoke(...)0%2100%
    -

    File(s)

    -

    C:\Users\Леонид\ImageProcessing\src\ImageProcessing\Agents.fs

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #LineLine coverage
     1module Agents
     2
     3open CpuImageProcessing
     4
     5let listAllFiles dir =
     06    let files = System.IO.Directory.GetFiles dir
     07    List.ofArray files
     8
     9type Msg =
     10    | Img of MyImage
     11    | EOS of AsyncReplyChannel<unit>
     12
     13type AgentStatus =
     14    | On
     15    | Off
     16
     17let imgSaver outDir =
     018    let outFile (imgName: string) = System.IO.Path.Combine(outDir, imgName)
     19
     020    MailboxProcessor.Start(fun inbox ->
     021        let rec loop () =
     022            async {
     023                let! msg = inbox.Receive()
     024
     025                match msg with
     026                | EOS ch ->
     027                    printfn "Image saver is finished!"
     028                    ch.Reply()
     029                | Img img ->
     030                    printfn $"Save: %A{img.Name}"
     031                    saveImage img (outFile img.Name)
     032                    return! loop ()
     033            }
     034
     035        loop ())
     36
     37let imgProcessor filterApplicator (imgSaver: MailboxProcessor<_>) =
     38
     039    let filter = filterApplicator
     40
     041    MailboxProcessor.Start(fun inbox ->
     042        let rec loop () =
     043            async {
     044                let! msg = inbox.Receive()
     045
     046                match msg with
     047                | EOS ch ->
     048                    printfn "Image processor is ready to finish!"
     049                    imgSaver.PostAndReply EOS
     050                    printfn "Image processor is finished!"
     051                    ch.Reply()
     052                | Img img ->
     053                    printfn $"Filter: %A{img.Name}"
     054                    let filtered = filter img
     055                    imgSaver.Post(Img filtered)
     056                    return! loop ()
     057            }
     058
     059        loop ())
    -
    -
    - - \ No newline at end of file diff --git a/docs/coverage/ImageProcessing_Arguments.html b/docs/coverage/ImageProcessing_Arguments.html deleted file mode 100644 index bd11ad63..00000000 --- a/docs/coverage/ImageProcessing_Arguments.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - -Arguments - Coverage Report - -
    -

    < Summary

    - ---- - - - - - - - - - - - - - - - - -
    Class:Arguments
    Assembly:ImageProcessing
    File(s):C:\Users\Леонид\ImageProcessing\src\ImageProcessing\Arguments.fs
    Covered lines:8
    Uncovered lines:5
    Coverable lines:13
    Total lines:37
    Line coverage:61.5% (8 of 13)
    Covered branches:7
    Total branches:11
    Branch coverage:63.6% (7 of 11)
    Covered methods:1
    Total methods:2
    Method coverage:50% (1 of 2)
    -

    Metrics

    - - - - - - -
    MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
    modificationParser(...)100%777100%
    Argu.IArgParserTemplate.get_Usage()0%20440%
    -

    File(s)

    -

    C:\Users\Леонид\ImageProcessing\src\ImageProcessing\Arguments.fs

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #LineLine coverage
     1module Arguments
     2
     3open CpuImageProcessing
     4open Argu
     5
     6type Modifications =
     7    | Gauss5x5
     8    | Gauss7x7
     9    | Edges
     10    | Sharpen
     11    | Emboss
     12    | ClockwiseRotation
     13    | CounterClockwiseRotation
     14
     15let modificationParser modification =
     10016    match modification with
     1517    | Gauss5x5 -> applyFilterToImage gaussianBlurKernel
     1118    | Gauss7x7 -> applyFilterToImage gaussianBlur7x7Kernel
     1019    | Edges -> applyFilterToImage edgesKernel
     1520    | Sharpen -> applyFilterToImage sharpenKernel
     1421    | Emboss -> applyFilterToImage embossKernel
     1522    | ClockwiseRotation -> rotate90DegreesImage Right
     2023    | CounterClockwiseRotation -> rotate90DegreesImage Left
     24
     25type CliArguments =
     26    | [<Mandatory; AltCommandLine("-i")>] InputPath of inputPath: string
     27    | [<Mandatory; AltCommandLine("-o")>] OutputPath of outputPath: string
     28    | [<AltCommandLine("-ag")>] Agents
     29    | [<AltCommandLine("-mod")>] Modifications of modifications: List<Modifications>
     30
     31    interface IArgParserTemplate with
     32        member s.Usage =
     033            match s with
     034            | Agents -> "Apply modifications to an image using agents"
     035            | Modifications _ -> "Set of modifications to image or image array"
     036            | InputPath _ -> "Input directory or path to the image"
     037            | OutputPath _ -> "Output directory or path to saved image"
    -
    -
    - - \ No newline at end of file diff --git a/docs/coverage/ImageProcessing_CpuImageProcessing.html b/docs/coverage/ImageProcessing_CpuImageProcessing.html deleted file mode 100644 index 9a9e5239..00000000 --- a/docs/coverage/ImageProcessing_CpuImageProcessing.html +++ /dev/null @@ -1,297 +0,0 @@ - - - - - - -CpuImageProcessing - Coverage Report - -
    -

    < Summary

    - ---- - - - - - - - - - - - - - - - - -
    Class:CpuImageProcessing
    Assembly:ImageProcessing
    File(s):C:\Users\Леонид\ImageProcessing\src\ImageProcessing\CpuImageProcessing.fs
    Covered lines:62
    Uncovered lines:7
    Coverable lines:69
    Total lines:167
    Line coverage:89.8% (62 of 69)
    Covered branches:48
    Total branches:50
    Branch coverage:96% (48 of 50)
    Covered methods:15
    Total methods:17
    Method coverage:88.2% (15 of 17)
    -

    Metrics

    - - - - - - - - - - - - - - - - - - - - - -
    MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
    .ctor(...)0%110100%
    loadAs2DArray(...)77.78%5516100%
    loadAsImage(...)0%110100%
    flat2dArray(...)0%110100%
    GenerateNext(...)100%884100%
    save2DByteArrayAsImage(...)0%2100%
    saveImage(...)0%2100%
    applyFilter(...)0%110100%
    Invoke(...)100%9964100%
    Invoke(...)0%110100%
    Invoke(...)0%110100%
    applyFilterToImage(...)0%110100%
    Invoke(...)100%9964100%
    Invoke(...)0%110100%
    Invoke(...)0%110100%
    rotate90Degrees(...)100%6632100%
    rotate90DegreesImage(...)100%334100%
    -

    File(s)

    -

    C:\Users\Леонид\ImageProcessing\src\ImageProcessing\CpuImageProcessing.fs

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #LineLine coverage
     1module CpuImageProcessing
     2
     3open System
     4open SixLabors.ImageSharp
     5open SixLabors.ImageSharp.PixelFormats
     6
     7type Side =
     8    | Right
     9    | Left
     10
     11[<Struct>]
     12type MyImage =
     13    val Data: array<byte>
     14    val Width: int
     15    val Height: int
     16    val Name: string
     17
     18    new(data, width, height, name) =
     70919        { Data = data
     70920          Width = width
     70921          Height = height
     70922          Name = name }
     23
     24let loadAs2DArray (filePath: string) =
     225    let img = Image.Load<L8> filePath
     226    let res = Array2D.zeroCreate img.Height img.Width
     27
     217828    for i in 0 .. img.Width - 1 do
     191091229        for j in 0 .. img.Height - 1 do
     190873630            res[j, i] <- img.Item(i, j).PackedValue
     31
     232    printfn $"%A{System.IO.Path.GetFileName filePath} successfully loaded."
     233    res
     34
     35let loadAsImage (file: string) =
     236    let img = Image.Load<L8> file
     37
     238    let buf = Array.zeroCreate<byte> (img.Width * img.Height)
     39
     240    img.CopyPixelDataTo(Span<byte> buf)
     241    MyImage(buf, img.Width, img.Height, System.IO.Path.GetFileName file)
     42
     43let flat2dArray arr =
     20044    seq {
     355845        for x in [ 0 .. (Array2D.length1 arr) - 1 ] do
     12873346            for y in [ 0 .. (Array2D.length2 arr) - 1 ] do
     11985947                yield arr[x, y]
     20048    }
     20049    |> Array.ofSeq
     50
     51let save2DByteArrayAsImage (imageData: byte[,]) filePath =
     052    let height = Array2D.length1 imageData
     053    let width = Array2D.length2 imageData
     054    let img = Image.LoadPixelData<L8>(flat2dArray imageData, width, height)
     055    img.Save filePath
     056    printfn $"%A{System.IO.Path.GetFileName filePath} successfully saved."
     57
     58let saveImage (image: MyImage) file =
     059    let img = Image.LoadPixelData<L8>(image.Data, image.Width, image.Height)
     060    img.Save file
     61
     62let gaussianBlurKernel =
     63    [| [| 1; 4; 6; 4; 1 |]
     64       [| 4; 16; 24; 16; 4 |]
     65       [| 6; 24; 36; 24; 6 |]
     66       [| 4; 16; 24; 16; 4 |]
     67       [| 1; 4; 6; 4; 1 |] |]
     68    |> Array.map (Array.map (fun x -> (float32 x) / 100.0f))
     69
     70let edgesKernel =
     71    [| [| 0; 0; -1; 0; 0 |]
     72       [| 0; 0; -1; 0; 0 |]
     73       [| 0; 0; 2; 0; 0 |]
     74       [| 0; 0; 0; 0; 0 |]
     75       [| 0; 0; 0; 0; 0 |] |]
     76    |> Array.map (Array.map float32)
     77
     78let gaussianBlur7x7Kernel =
     79    [| [| 0; 0; 1; 2; 1; 0; 0 |]
     80       [| 0; 3; 13; 22; 13; 3; 0 |]
     81       [| 1; 13; 59; 97; 59; 13; 1 |]
     82       [| 2; 22; 97; 159; 97; 22; 2 |]
     83       [| 1; 13; 59; 97; 59; 13; 1 |]
     84       [| 0; 3; 13; 22; 13; 3; 0 |]
     85       [| 0; 0; 1; 2; 1; 0; 0 |] |]
     86    |> Array.map (Array.map (fun x -> (float32 x) / 1003.0f))
     87
     88let sharpenKernel =
     89    [| [| -1; -1; -1; -1; -1 |]
     90       [| -1; 2; 2; 2; -1 |]
     91       [| -1; 2; 8; 2; -1 |]
     92       [| -1; 2; 2; 2; -1 |]
     93       [| -1; -1; -1; -1; -1 |] |]
     94    |> Array.map (Array.map (fun x -> (float32 x) / 8.0f))
     95
     96let embossKernel =
     97    [| [| -1f; -1f; -1f; -1f; 0f |]
     98       [| -1f; -1f; -1f; 0f; 1f |]
     99       [| -1f; -1f; 0f; 1f; 1f |]
     100       [| -1f; 0f; 1f; 1f; 1f |]
     101       [| 0f; 1f; 1f; 1f; 1f |] |]
     102
     103let applyFilter (filter: float32[][]) (img: byte[,]) =
     1104    let imgHeight = Array2D.length1 img
     1105    let imgWidth = Array2D.length2 img
     106
     1107    let filterD = (Array.length filter) / 2
     108
     1109    let filter = Array.concat filter
     110
     111    let processPixel px py =
     65536112        let dataToHandle =
     655360113            [| for i in px - filterD .. px + filterD do
     4653056114                   for j in py - filterD .. py + filterD do
     16057416115                       if i < 0 || i >= imgHeight || j < 0 || j >= imgWidth then
     108400116                           float32 img[px, py]
     65536117                       else
     3233936118                           float32 img[i, j] |]
     119
     3276800120        Array.fold2 (fun s x y -> s + x * y) 0.0f filter dataToHandle
     121
     65537122    Array2D.mapi (fun x y _ -> byte (processPixel x y)) img
     123
     124let applyFilterToImage (filter: float32[][]) (img: MyImage) =
     66125    let filterD = (Array.length filter) / 2
     66126    let filter = Array.concat filter
     127
     128    let processPixel p =
     136837129        let pw = p % img.Width
     136837130        let ph = p / img.Width
     131
     136837132        let dataToHandle =
     1258134133            [| for i in ph - filterD .. ph + filterD do
     8061887134                   for j in pw - filterD .. pw + filterD do
     26784114135                       if i < 0 || i >= img.Height || j < 0 || j >= img.Width then
     310141136                           float32 img.Data[p]
     136837137                       else
     5345714138                           float32 img.Data[i * img.Width + j] |]
     139
     5519018140        Array.fold2 (fun s x y -> s + x * y) 0.0f filter dataToHandle
     141
     136903142    MyImage(Array.mapi (fun p _ -> byte (processPixel p)) img.Data, img.Width, img.Height, img.Name)
     143
     144let rotate90Degrees (side: Side) (image: byte[,]) =
     405145    let height = Array2D.length1 image
     405146    let width = Array2D.length2 image
     405147    let res = Array2D.zeroCreate width height
     148
     7378149    for i in 0 .. width - 1 do
     7383770150        for j in 0 .. height - 1 do
     7376797151            if side = Right then
     7374803152                res[i, height - 1 - j] <- image[j, i]
     153            else
     1994154                res[width - 1 - i, j] <- image[j, i]
     155
     405156    res
     157
     158let rotate90DegreesImage (side: Side) (image: MyImage) =
     440159    let res = Array.zeroCreate image.Data.Length
     160
     7425764161    for p in 0 .. image.Data.Length - 1 do
     7424884162        if side = Right then
     7398922163            res[(p % image.Width) * image.Height + image.Height - 1 - p / image.Width] <- image.Data[p]
     164        else
     25962165            res[image.Height * (image.Width - 1 - p % image.Width) + p / image.Width] <- image.Data[p]
     166
     440167    MyImage(res, image.Height, image.Width, image.Name)
    -
    -
    - - \ No newline at end of file diff --git a/docs/coverage/ImageProcessing_CpuProcessing.html b/docs/coverage/ImageProcessing_CpuProcessing.html deleted file mode 100644 index e2692ca4..00000000 --- a/docs/coverage/ImageProcessing_CpuProcessing.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - -CpuProcessing - Coverage Report - -
    -

    < Summary

    - ---- - - - - - - - - - - - - - - - - -
    Class:CpuProcessing
    Assembly:ImageProcessing
    File(s):C:\Users\Леонид\ImageProcessing\src\ImageProcessing\CpuProcessing.fs
    Covered lines:42
    Uncovered lines:0
    Coverable lines:42
    Total lines:72
    Line coverage:100% (42 of 42)
    Covered branches:32
    Total branches:32
    Branch coverage:100% (32 of 32)
    Covered methods:8
    Total methods:8
    Method coverage:100% (8 of 8)
    -

    Metrics

    - - - - - - - - - - - - -
    MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
    applyFilter(...)0%110100%
    Invoke(...)100%9964100%
    Invoke(...)0%110100%
    Invoke(...)0%110100%
    rotate(...)100%334100%
    mirror(...)100%334100%
    fishEye(...)100%6632100%
    Invoke(...)100%222100%
    -

    File(s)

    -

    C:\Users\Леонид\ImageProcessing\src\ImageProcessing\CpuProcessing.fs

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #LineLine coverage
     1module CpuProcessing
     2
     3open MyImage
     4open Types
     5
     6let applyFilter (filter: float32[][]) (img: MyImage) =
     537    let filterD = (Array.length filter) / 2
     538    let filter = Array.concat filter
     9
     10    let processPixel p =
     12067911        let pw = p % img.Width
     12067912        let ph = p / img.Width
     13
     12067914        let dataToHandle =
     111628815            [| for i in ph - filterD .. ph + filterD do
     721067916                   for j in pw - filterD .. pw + filterD do
     2403202017                       if i < 0 || i >= img.Height || j < 0 || j >= img.Width then
     26845918                           float32 img.Data[p]
     12067919                       else
     480014620                           float32 img.Data[i * img.Width + j] |]
     21
     494792622        Array.fold2 (fun s x y -> s + x * y) 0.0f filter dataToHandle
     23
     12073224    MyImage(Array.mapi (fun p _ -> byte (processPixel p)) img.Data, img.Width, img.Height, img.Name)
     25
     26let rotate (side: Side) (image: MyImage) =
     42527    let res = Array.zeroCreate image.Data.Length
     28
     741128829    for p in 0 .. image.Data.Length - 1 do
     741043830        if side = Right then
     739936731            res[(p % image.Width) * image.Height + image.Height - 1 - p / image.Width] <- image.Data[p]
     32        else
     1107133            res[image.Height * (image.Width - 1 - p % image.Width) + p / image.Width] <- image.Data[p]
     34
     42535    MyImage(res, image.Height, image.Width, image.Name)
     36
     37let mirror (side: MirrorDirection) (image: MyImage) =
     1938    let res = Array.zeroCreate image.Data.Length
     39
     2369440    for p in 0 .. image.Data.Length - 1 do
     2365641        if side = Vertical then
     1443742            res[p - p % image.Width + image.Width - 1 - p % image.Width] <- image.Data[p]
     43        else
     921944            res[(image.Height - 1 - p / image.Width) * image.Width + p % image.Width] <- image.Data[p]
     45
     1946    MyImage(res, image.Width, image.Height, image.Name)
     47
     48let fishEye (image: MyImage) =
     949    let distortion = 0.5
     50
     51    let getFishCoordinates (x: float) (y: float) (r: float) =
     998852        if 1.0 - distortion * r = 0 then
     953            x, y
     54        else
     997955            x / (1.0 - distortion * r), y / (1.0 - distortion * r)
     56
     957    let h = float image.Height
     958    let w = float image.Width
     959    let res = Array.zeroCreate image.Data.Length
     60
     1000661    for p in 0 .. image.Data.Length - 1 do
     998862        let xnd = (2.0 * float (p / image.Width) - h) / h
     998863        let ynd = (2.0 * float (p % image.Width) - w) / w
     998864        let radius = xnd * xnd + ynd * ynd
     998865        let xdu, ydu = getFishCoordinates xnd ynd radius
     998866        let xu = int ((xdu + 1.0) * h) / 2
     998867        let yu = int ((ydu + 1.0) * w) / 2
     68
     4011769        if 0 <= xu && xu < int h && 0 <= yu && yu < int w then
     488470            res[p] <- image.Data[xu * image.Width + yu]
     71
     972    MyImage(res, image.Width, image.Height, image.Name)
    -
    -
    - - \ No newline at end of file diff --git a/docs/coverage/ImageProcessing_GpuKernels.html b/docs/coverage/ImageProcessing_GpuKernels.html deleted file mode 100644 index 376e534a..00000000 --- a/docs/coverage/ImageProcessing_GpuKernels.html +++ /dev/null @@ -1,254 +0,0 @@ - - - - - - -GpuKernels - Coverage Report - -
    -

    < Summary

    - ---- - - - - - - - - - - - - - - - - -
    Class:GpuKernels
    Assembly:ImageProcessing
    File(s):C:\Users\Леонид\ImageProcessing\src\ImageProcessing\GpuKernels.fs
    Covered lines:0
    Uncovered lines:97
    Coverable lines:97
    Total lines:134
    Line coverage:0% (0 of 97)
    Covered branches:0
    Total branches:4
    Branch coverage:0% (0 of 4)
    Covered methods:0
    Total methods:12
    Method coverage:0% (0 of 12)
    -

    Metrics

    - - - - - - - - - - - - - - - - -
    MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
    applyFilterKernel(...)0%2100%
    Invoke(...)0%2100%
    Invoke(...)0%2100%
    rotateKernel(...)0%6220%
    Invoke(...)0%2100%
    Invoke(...)0%2100%
    mirrorKernel(...)0%6220%
    Invoke(...)0%2100%
    Invoke(...)0%2100%
    fishEyeKernel(...)0%2100%
    Invoke(...)0%2100%
    Invoke(...)0%2100%
    -

    File(s)

    -

    C:\Users\Леонид\ImageProcessing\src\ImageProcessing\GpuKernels.fs

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #LineLine coverage
     1module GpuKernels
     2
     3open Types
     4open Brahma.FSharp
     5
     6let applyFilterKernel (clContext: ClContext) localWorkSize =
     7
     08    let kernel =
     09        <@
     010            fun (r: Range1D) (img: ClArray<_>) imgW imgH (filter: ClArray<_>) filterD (result: ClArray<_>) ->
     011                let p = r.GlobalID0
     012                let pw = p % imgW
     013                let ph = p / imgW
     014                let mutable res = 0.0f
     015
     016                for i in ph - filterD .. ph + filterD do
     017                    for j in pw - filterD .. pw + filterD do
     018                        let mutable d = 0uy
     019
     020                        if i < 0 || i >= imgH || j < 0 || j >= imgW then
     021                            d <- img[p]
     022                        else
     023                            d <- img[i * imgW + j]
     024
     025                        let f = filter[(i - ph + filterD) * (2 * filterD + 1) + (j - pw + filterD)]
     026                        res <- res + (float32 d) * f
     027
     028                result[p] <- byte (int res)
     029        @>
     30
     031    let kernel = clContext.Compile kernel
     32
     33    fun (commandQueue: MailboxProcessor<_>) (filter: ClArray<float32>) filterD (img: ClArray<byte>) imgH imgW (result: C
     034        let ndRange = Range1D.CreateValid(imgH * imgW, localWorkSize)
     035        let kernel = kernel.GetKernel()
     036        commandQueue.Post(Msg.MsgSetArguments(fun () -> kernel.KernelFunc ndRange img imgW imgH filter filterD result))
     037        commandQueue.Post(Msg.CreateRunMsg<_, _> kernel)
     038        result
     39
     40let rotateKernel (clContext: ClContext) localWorkSize side =
     41
     42    let kernel =
     043        match side with
     44        | Right ->
     045            <@
     046                fun (r: Range1D) (img: ClArray<_>) imgW imgH (result: ClArray<_>) ->
     047                    let p = r.GlobalID0
     048
     049                    if p / imgW < imgH then
     050                        result[(p % imgW) * imgH + imgH - 1 - p / imgW] <- img[p]
     051            @>
     52        | Left ->
     053            <@
     054                fun (r: Range1D) (img: ClArray<_>) imgW imgH (result: ClArray<_>) ->
     055                    let p = r.GlobalID0
     056                    result[imgH * (imgW - 1 - p % imgW) + p / imgW] <- img[p]
     057            @>
     58
     59
     060    let kernel = clContext.Compile kernel
     61
     62    fun (commandQueue: MailboxProcessor<_>) (img: ClArray<byte>) imgH imgW (result: ClArray<_>) ->
     063        let ndRange = Range1D.CreateValid(imgH * imgW, localWorkSize)
     064        let kernel = kernel.GetKernel()
     065        commandQueue.Post(Msg.MsgSetArguments(fun () -> kernel.KernelFunc ndRange img imgW imgH result))
     066        commandQueue.Post(Msg.CreateRunMsg<_, _> kernel)
     067        result
     68
     69let mirrorKernel (clContext: ClContext) localWorkSize side =
     70
     71    let kernel =
     072        match side with
     73        | Vertical ->
     074            <@
     075                fun (r: Range1D) (img: ClArray<_>) imgW imgH (result: ClArray<_>) ->
     076                    let p = r.GlobalID0
     077
     078                    if p / imgW < imgH then
     079                        result[p - p % imgW + imgW - 1 - p % imgW] <- img[p]
     080            @>
     81        | Horizontal ->
     082            <@
     083                fun (r: Range1D) (img: ClArray<_>) imgW imgH (result: ClArray<_>) ->
     084                    let p = r.GlobalID0
     085                    result[(imgH - 1 - p / imgW) * imgW + p % imgW] <- img[p]
     086            @>
     87
     88
     089    let kernel = clContext.Compile kernel
     90
     91    fun (commandQueue: MailboxProcessor<_>) (img: ClArray<byte>) imgH imgW (result: ClArray<_>) ->
     092        let ndRange = Range1D.CreateValid(imgH * imgW, localWorkSize)
     093        let kernel = kernel.GetKernel()
     094        commandQueue.Post(Msg.MsgSetArguments(fun () -> kernel.KernelFunc ndRange img imgW imgH result))
     095        commandQueue.Post(Msg.CreateRunMsg<_, _> kernel)
     096        result
     97
     98let fishEyeKernel (clContext: ClContext) localWorkSize =
     99
     0100    let kernel =
     0101        <@
     0102            fun (r: Range1D) (img: ClArray<_>) imgW imgH (result: ClArray<_>) ->
     0103                let distortion = 1f
     0104                let p = r.GlobalID0
     0105
     0106                if p / imgW < imgH then
     0107                    let h = float32 imgH
     0108                    let w = float32 imgW
     0109                    let xnd = (2.0f * float32 (p / imgW) - h) / h
     0110                    let ynd = (2.0f * float32 (p % imgW) - w) / w
     0111                    let radius = xnd * xnd + ynd * ynd
     0112
     0113                    let xdu, ydu =
     0114                        if 1.0f - distortion * radius = 0.0f then
     0115                            xnd, ynd
     0116                        else
     0117                            xnd / (1.0f - distortion * radius), ynd / (1.0f - distortion * radius)
     0118
     0119                    let xu = int ((xdu + 1.0f) * h) / 2
     0120                    let yu = int ((ydu + 1.0f) * w) / 2
     0121
     0122                    if 0 <= xu && xu < int h && 0 <= yu && yu < int w then
     0123                        result[p] <- img[xu * imgW + yu]
     0124        @>
     125
     126
     0127    let kernel = clContext.Compile kernel
     128
     129    fun (commandQueue: MailboxProcessor<_>) (img: ClArray<byte>) imgH imgW (result: ClArray<_>) ->
     0130        let ndRange = Range1D.CreateValid(imgH * imgW, localWorkSize)
     0131        let kernel = kernel.GetKernel()
     0132        commandQueue.Post(Msg.MsgSetArguments(fun () -> kernel.KernelFunc ndRange img imgW imgH result))
     0133        commandQueue.Post(Msg.CreateRunMsg<_, _> kernel)
     0134        result
    -
    -
    - - \ No newline at end of file diff --git a/docs/coverage/ImageProcessing_GpuProcessing.html b/docs/coverage/ImageProcessing_GpuProcessing.html deleted file mode 100644 index ceb776ef..00000000 --- a/docs/coverage/ImageProcessing_GpuProcessing.html +++ /dev/null @@ -1,235 +0,0 @@ - - - - - - -GpuProcessing - Coverage Report - -
    -

    < Summary

    - ---- - - - - - - - - - - - - - - - -
    Class:GpuProcessing
    Assembly:ImageProcessing
    File(s):C:\Users\Леонид\ImageProcessing\src\ImageProcessing\GpuProcessing.fs
    Covered lines:0
    Uncovered lines:72
    Coverable lines:72
    Total lines:116
    Line coverage:0% (0 of 72)
    Covered branches:0
    Total branches:0
    Covered methods:0
    Total methods:12
    Method coverage:0% (0 of 12)
    -

    Metrics

    - - - - - - - - - - - - - - - - -
    MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
    applyFilter(...)0%2100%
    Invoke(...)0%2100%
    Invoke(...)0%2100%
    rotate(...)0%2100%
    Invoke(...)0%2100%
    Invoke(...)0%2100%
    mirror(...)0%2100%
    Invoke(...)0%2100%
    Invoke(...)0%2100%
    fishEye(...)0%2100%
    Invoke(...)0%2100%
    Invoke(...)0%2100%
    -

    File(s)

    -

    C:\Users\Леонид\ImageProcessing\src\ImageProcessing\GpuProcessing.fs

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #LineLine coverage
     1module GpuProcessing
     2
     3open Brahma.FSharp
     4open MyImage
     5open GpuKernels
     6
     7
     8let applyFilter (filter: float32[][]) (clContext: ClContext) localWorkSize =
     09    let kernel = applyFilterKernel clContext localWorkSize
     010    let queue = clContext.QueueProvider.CreateQueue()
     11
     12    fun (img: MyImage) ->
     13
     014        let mutable input =
     015            clContext.CreateClArray<_>(img.Data, HostAccessMode.NotAccessible)
     16
     017        let mutable output =
     018            clContext.CreateClArray(
     019                img.Data.Length,
     020                HostAccessMode.NotAccessible,
     021                allocationMode = AllocationMode.Default
     022            )
     23
     024        let filterD = (Array.length filter) / 2
     025        let filter = Array.concat filter
     26
     027        let clFilter =
     028            clContext.CreateClArray<_>(filter, HostAccessMode.NotAccessible, DeviceAccessMode.ReadOnly)
     29
     030        let result = Array.zeroCreate (img.Height * img.Width)
     31
     032        let result =
     033            queue.PostAndReply(fun ch ->
     034                Msg.CreateToHostMsg(kernel queue clFilter filterD input img.Height img.Width output, result, ch))
     35
     036        queue.Post(Msg.CreateFreeMsg clFilter)
     037        queue.Post(Msg.CreateFreeMsg input)
     038        queue.Post(Msg.CreateFreeMsg output)
     039        MyImage(result, img.Width, img.Height, img.Name)
     40
     41let rotate side (clContext: ClContext) localWorkSize =
     042    let kernel = rotateKernel clContext localWorkSize
     043    let queue = clContext.QueueProvider.CreateQueue()
     44
     45    fun (img: MyImage) ->
     46
     047        let mutable input =
     048            clContext.CreateClArray<_>(img.Data, HostAccessMode.NotAccessible)
     49
     050        let mutable output =
     051            clContext.CreateClArray(
     052                img.Data.Length,
     053                HostAccessMode.NotAccessible,
     054                allocationMode = AllocationMode.Default
     055            )
     56
     057        let result = Array.zeroCreate img.Data.Length
     58
     059        let result =
     060            queue.PostAndReply(fun ch ->
     061                Msg.CreateToHostMsg(kernel side queue input img.Height img.Width output, result, ch))
     62
     063        queue.Post(Msg.CreateFreeMsg input)
     064        queue.Post(Msg.CreateFreeMsg output)
     065        MyImage(result, img.Height, img.Width, img.Name)
     66
     67let mirror side (clContext: ClContext) localWorkSize =
     068    let kernel = mirrorKernel clContext localWorkSize
     069    let queue = clContext.QueueProvider.CreateQueue()
     70
     71    fun (img: MyImage) ->
     72
     073        let mutable input =
     074            clContext.CreateClArray<_>(img.Data, HostAccessMode.NotAccessible)
     75
     076        let mutable output =
     077            clContext.CreateClArray(
     078                img.Data.Length,
     079                HostAccessMode.NotAccessible,
     080                allocationMode = AllocationMode.Default
     081            )
     82
     083        let result = Array.zeroCreate img.Data.Length
     84
     085        let result =
     086            queue.PostAndReply(fun ch ->
     087                Msg.CreateToHostMsg(kernel side queue input img.Height img.Width output, result, ch))
     88
     089        queue.Post(Msg.CreateFreeMsg input)
     090        queue.Post(Msg.CreateFreeMsg output)
     091        MyImage(result, img.Width, img.Height, img.Name)
     92
     93let fishEye (clContext: ClContext) localWorkSize =
     094    let kernel = fishEyeKernel clContext localWorkSize
     095    let queue = clContext.QueueProvider.CreateQueue()
     96
     97    fun (img: MyImage) ->
     98
     099        let mutable input =
     0100            clContext.CreateClArray<_>(img.Data, HostAccessMode.NotAccessible)
     101
     0102        let mutable output =
     0103            clContext.CreateClArray(
     0104                img.Data.Length,
     0105                HostAccessMode.NotAccessible,
     0106                allocationMode = AllocationMode.Default
     0107            )
     108
     0109        let result = Array.zeroCreate img.Data.Length
     110
     0111        let result =
     0112            queue.PostAndReply(fun ch -> Msg.CreateToHostMsg(kernel queue input img.Height img.Width output, result, ch)
     113
     0114        queue.Post(Msg.CreateFreeMsg input)
     0115        queue.Post(Msg.CreateFreeMsg output)
     0116        MyImage(result, img.Width, img.Height, img.Name)
    -
    -
    - - \ No newline at end of file diff --git a/docs/coverage/ImageProcessing_ImageArrayProcessing.html b/docs/coverage/ImageProcessing_ImageArrayProcessing.html deleted file mode 100644 index d209ecce..00000000 --- a/docs/coverage/ImageProcessing_ImageArrayProcessing.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - -ImageArrayProcessing - Coverage Report - -
    -

    < Summary

    - ---- - - - - - - - - - - - - - - - - -
    Class:ImageArrayProcessing
    Assembly:ImageProcessing
    File(s):C:\Users\Леонид\ImageProcessing\src\ImageProcessing\ImageArrayProcessing.fs
    Covered lines:0
    Uncovered lines:14
    Coverable lines:14
    Total lines:42
    Line coverage:0% (0 of 14)
    Covered branches:0
    Total branches:6
    Branch coverage:0% (0 of 6)
    Covered methods:0
    Total methods:4
    Method coverage:0% (0 of 4)
    -

    Metrics

    - - - - - - - - -
    MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
    listAllFiles(...)0%2100%
    Invoke(...)0%20400%
    arrayOfImagesProcessing(...)0%20480%
    Invoke(...)0%2100%
    -

    File(s)

    -

    C:\Users\Леонид\ImageProcessing\src\ImageProcessing\ImageArrayProcessing.fs

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #LineLine coverage
     1module ImageArrayProcessing
     2
     3open CpuImageProcessing
     4open Agents
     5
     6let extensions =
     7    [| ".png"
     8       ".jpeg"
     9       ".jpg"
     10       ".gif"
     11       ".jfif"
     12       ".webp"
     13       ".pbm"
     14       ".bmp"
     15       ".tga"
     16       ".tiff" |]
     17
     18let listAllFiles dir =
     019    let files = System.IO.Directory.GetFiles dir
     20
     021    let filtered =
     022        Array.filter (fun (x: string) -> Array.contains (System.IO.Path.GetExtension x) extensions) files
     23
     024    List.ofArray filtered
     25
     26let arrayOfImagesProcessing inputDir outputDir conversion switcher =
     027    let list = listAllFiles inputDir
     28
     029    if switcher = On then
     030        let agentSaver = imgSaver outputDir
     031        let procAgent = imgProcessor conversion agentSaver
     32
     033        for file in list do
     034            procAgent.Post(Img(loadAsImage file))
     35
     036        procAgent.PostAndReply EOS
     37    else
     38        let helper filePath =
     039            let filtered = conversion (loadAsImage filePath)
     040            saveImage filtered (System.IO.Path.Combine(outputDir, System.IO.Path.GetFileName filePath))
     41
     042        List.iter helper list
    -
    -
    - - \ No newline at end of file diff --git a/docs/coverage/ImageProcessing_Kernels.html b/docs/coverage/ImageProcessing_Kernels.html deleted file mode 100644 index c05652a0..00000000 --- a/docs/coverage/ImageProcessing_Kernels.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - -Kernels - Coverage Report - -
    -

    < Summary

    - ---- - - - - - - - - - - - - - - - -
    Class:Kernels
    Assembly:ImageProcessing
    File(s):
    Covered lines:0
    Uncovered lines:0
    Coverable lines:0
    Total lines:0
    Line coverage:100% (0 of 0)
    Covered branches:0
    Total branches:0
    Covered methods:0
    Total methods:0
    Method coverage:
    -

    File(s)

    -

    No files found. This usually happens if a file isn't covered by a test or the class does not contain any sequence points (e.g. a class that only contains auto properties).

    -
    - - \ No newline at end of file diff --git a/docs/coverage/ImageProcessing_Main.html b/docs/coverage/ImageProcessing_Main.html deleted file mode 100644 index 5708be1f..00000000 --- a/docs/coverage/ImageProcessing_Main.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - -ImageProcessing.Main - Coverage Report - -
    -

    < Summary

    - ---- - - - - - - - - - - - - - - - - -
    Class:ImageProcessing.Main
    Assembly:ImageProcessing
    File(s):C:\Users\Леонид\ImageProcessing\src\ImageProcessing\Main.fs
    Covered lines:0
    Uncovered lines:17
    Coverable lines:17
    Total lines:37
    Line coverage:0% (0 of 17)
    Covered branches:0
    Total branches:8
    Branch coverage:0% (0 of 8)
    Covered methods:0
    Total methods:1
    Method coverage:0% (0 of 1)
    -

    Metrics

    - - - - - -
    MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
    main(...)0%305160%
    -

    File(s)

    -

    C:\Users\Леонид\ImageProcessing\src\ImageProcessing\Main.fs

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #LineLine coverage
     1namespace ImageProcessing
     2
     3open Argu
     4open Arguments
     5open CpuImageProcessing
     6open ImageArrayProcessing
     7
     8module Main =
     9
     10    [<EntryPoint>]
     11    let main (argv: string array) =
     012        let parser = ArgumentParser.Create<CliArguments>().ParseCommandLine argv
     013        let inputPath = parser.GetResult(InputPath)
     014        let outputPath = parser.GetResult(OutputPath)
     15
     016        if parser.Contains(Modifications) then
     017            let listOfFunc = parser.GetResult(Modifications) |> List.map modificationParser
     18
     019            match listOfFunc with
     020            | [] -> printfn $"List of modifications is empty"
     21            | _ ->
     022                let composition = List.reduce (>>) listOfFunc
     23
     024                match System.IO.Path.GetExtension inputPath with
     25                | "" ->
     026                    if parser.Contains(Agents) then
     027                        arrayOfImagesProcessing inputPath outputPath composition Agents.On
     28                    else
     029                        arrayOfImagesProcessing inputPath outputPath composition Agents.Off
     30                | _ ->
     031                    let image = loadAsImage inputPath
     032                    let filtered = composition image
     033                    saveImage filtered outputPath
     34        else
     035            printfn $"No modifications for image processing"
     36
     037        0
    -
    -
    -
    -

    Methods/Properties

    -main(System.String[])
    -
    -
    - - \ No newline at end of file diff --git a/docs/coverage/ImageProcessing_MyImage.html b/docs/coverage/ImageProcessing_MyImage.html deleted file mode 100644 index e29ebc19..00000000 --- a/docs/coverage/ImageProcessing_MyImage.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - -MyImage - Coverage Report - -
    -

    < Summary

    - ---- - - - - - - - - - - - - - - - -
    Class:MyImage
    Assembly:ImageProcessing
    File(s):C:\Users\Леонид\ImageProcessing\src\ImageProcessing\MyImage.fs
    Covered lines:8
    Uncovered lines:2
    Coverable lines:10
    Total lines:30
    Line coverage:80% (8 of 10)
    Covered branches:0
    Total branches:0
    Covered methods:2
    Total methods:3
    Method coverage:66.6% (2 of 3)
    -

    Metrics

    - - - - - - - -
    MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
    .ctor(...)0%110100%
    loadAsImage(...)0%110100%
    saveImage(...)0%2100%
    -

    File(s)

    -

    C:\Users\Леонид\ImageProcessing\src\ImageProcessing\MyImage.fs

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #LineLine coverage
     1module MyImage
     2
     3open System
     4open SixLabors.ImageSharp
     5open SixLabors.ImageSharp.PixelFormats
     6
     7[<Struct>]
     8type MyImage =
     9    val Data: array<byte>
     10    val Width: int
     11    val Height: int
     12    val Name: string
     13
     14    new(data, width, height, name) =
     70915        { Data = data
     70916          Width = width
     70917          Height = height
     70918          Name = name }
     19
     20let loadAsImage (file: string) =
     221    let img = Image.Load<L8> file
     22
     223    let buf = Array.zeroCreate<byte> (img.Width * img.Height)
     24
     225    img.CopyPixelDataTo(Span<byte> buf)
     226    MyImage(buf, img.Width, img.Height, System.IO.Path.GetFileName file)
     27
     28let saveImage (image: MyImage) file =
     029    let img = Image.LoadPixelData<L8>(image.Data, image.Width, image.Height)
     030    img.Save file
    -
    -
    - - \ No newline at end of file diff --git a/docs/coverage/class.js b/docs/coverage/class.js deleted file mode 100644 index dafc9a5c..00000000 --- a/docs/coverage/class.js +++ /dev/null @@ -1,221 +0,0 @@ -/* Chartist.js 0.11.0 - * Copyright © 2017 Gion Kunz - * Free to use under either the WTFPL license or the MIT license. - * https://raw.githubusercontent.com/gionkunz/chartist-js/master/LICENSE-WTFPL - * https://raw.githubusercontent.com/gionkunz/chartist-js/master/LICENSE-MIT - */ - -!function (a, b) { "function" == typeof define && define.amd ? define("Chartist", [], function () { return a.Chartist = b() }) : "object" == typeof module && module.exports ? module.exports = b() : a.Chartist = b() }(this, function () { - var a = { version: "0.11.0" }; return function (a, b, c) { "use strict"; c.namespaces = { svg: "http://www.w3.org/2000/svg", xmlns: "http://www.w3.org/2000/xmlns/", xhtml: "http://www.w3.org/1999/xhtml", xlink: "http://www.w3.org/1999/xlink", ct: "http://gionkunz.github.com/chartist-js/ct" }, c.noop = function (a) { return a }, c.alphaNumerate = function (a) { return String.fromCharCode(97 + a % 26) }, c.extend = function (a) { var b, d, e; for (a = a || {}, b = 1; b < arguments.length; b++) { d = arguments[b]; for (var f in d) e = d[f], "object" != typeof e || null === e || e instanceof Array ? a[f] = e : a[f] = c.extend(a[f], e) } return a }, c.replaceAll = function (a, b, c) { return a.replace(new RegExp(b, "g"), c) }, c.ensureUnit = function (a, b) { return "number" == typeof a && (a += b), a }, c.quantity = function (a) { if ("string" == typeof a) { var b = /^(\d+)\s*(.*)$/g.exec(a); return { value: +b[1], unit: b[2] || void 0 } } return { value: a } }, c.querySelector = function (a) { return a instanceof Node ? a : b.querySelector(a) }, c.times = function (a) { return Array.apply(null, new Array(a)) }, c.sum = function (a, b) { return a + (b ? b : 0) }, c.mapMultiply = function (a) { return function (b) { return b * a } }, c.mapAdd = function (a) { return function (b) { return b + a } }, c.serialMap = function (a, b) { var d = [], e = Math.max.apply(null, a.map(function (a) { return a.length })); return c.times(e).forEach(function (c, e) { var f = a.map(function (a) { return a[e] }); d[e] = b.apply(null, f) }), d }, c.roundWithPrecision = function (a, b) { var d = Math.pow(10, b || c.precision); return Math.round(a * d) / d }, c.precision = 8, c.escapingMap = { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }, c.serialize = function (a) { return null === a || void 0 === a ? a : ("number" == typeof a ? a = "" + a : "object" == typeof a && (a = JSON.stringify({ data: a })), Object.keys(c.escapingMap).reduce(function (a, b) { return c.replaceAll(a, b, c.escapingMap[b]) }, a)) }, c.deserialize = function (a) { if ("string" != typeof a) return a; a = Object.keys(c.escapingMap).reduce(function (a, b) { return c.replaceAll(a, c.escapingMap[b], b) }, a); try { a = JSON.parse(a), a = void 0 !== a.data ? a.data : a } catch (b) { } return a }, c.createSvg = function (a, b, d, e) { var f; return b = b || "100%", d = d || "100%", Array.prototype.slice.call(a.querySelectorAll("svg")).filter(function (a) { return a.getAttributeNS(c.namespaces.xmlns, "ct") }).forEach(function (b) { a.removeChild(b) }), f = new c.Svg("svg").attr({ width: b, height: d }).addClass(e), f._node.style.width = b, f._node.style.height = d, a.appendChild(f._node), f }, c.normalizeData = function (a, b, d) { var e, f = { raw: a, normalized: {} }; return f.normalized.series = c.getDataArray({ series: a.series || [] }, b, d), e = f.normalized.series.every(function (a) { return a instanceof Array }) ? Math.max.apply(null, f.normalized.series.map(function (a) { return a.length })) : f.normalized.series.length, f.normalized.labels = (a.labels || []).slice(), Array.prototype.push.apply(f.normalized.labels, c.times(Math.max(0, e - f.normalized.labels.length)).map(function () { return "" })), b && c.reverseData(f.normalized), f }, c.safeHasProperty = function (a, b) { return null !== a && "object" == typeof a && a.hasOwnProperty(b) }, c.isDataHoleValue = function (a) { return null === a || void 0 === a || "number" == typeof a && isNaN(a) }, c.reverseData = function (a) { a.labels.reverse(), a.series.reverse(); for (var b = 0; b < a.series.length; b++)"object" == typeof a.series[b] && void 0 !== a.series[b].data ? a.series[b].data.reverse() : a.series[b] instanceof Array && a.series[b].reverse() }, c.getDataArray = function (a, b, d) { function e(a) { if (c.safeHasProperty(a, "value")) return e(a.value); if (c.safeHasProperty(a, "data")) return e(a.data); if (a instanceof Array) return a.map(e); if (!c.isDataHoleValue(a)) { if (d) { var b = {}; return "string" == typeof d ? b[d] = c.getNumberOrUndefined(a) : b.y = c.getNumberOrUndefined(a), b.x = a.hasOwnProperty("x") ? c.getNumberOrUndefined(a.x) : b.x, b.y = a.hasOwnProperty("y") ? c.getNumberOrUndefined(a.y) : b.y, b } return c.getNumberOrUndefined(a) } } return a.series.map(e) }, c.normalizePadding = function (a, b) { return b = b || 0, "number" == typeof a ? { top: a, right: a, bottom: a, left: a } : { top: "number" == typeof a.top ? a.top : b, right: "number" == typeof a.right ? a.right : b, bottom: "number" == typeof a.bottom ? a.bottom : b, left: "number" == typeof a.left ? a.left : b } }, c.getMetaData = function (a, b) { var c = a.data ? a.data[b] : a[b]; return c ? c.meta : void 0 }, c.orderOfMagnitude = function (a) { return Math.floor(Math.log(Math.abs(a)) / Math.LN10) }, c.projectLength = function (a, b, c) { return b / c.range * a }, c.getAvailableHeight = function (a, b) { return Math.max((c.quantity(b.height).value || a.height()) - (b.chartPadding.top + b.chartPadding.bottom) - b.axisX.offset, 0) }, c.getHighLow = function (a, b, d) { function e(a) { if (void 0 !== a) if (a instanceof Array) for (var b = 0; b < a.length; b++)e(a[b]); else { var c = d ? +a[d] : +a; g && c > f.high && (f.high = c), h && c < f.low && (f.low = c) } } b = c.extend({}, b, d ? b["axis" + d.toUpperCase()] : {}); var f = { high: void 0 === b.high ? -Number.MAX_VALUE : +b.high, low: void 0 === b.low ? Number.MAX_VALUE : +b.low }, g = void 0 === b.high, h = void 0 === b.low; return (g || h) && e(a), (b.referenceValue || 0 === b.referenceValue) && (f.high = Math.max(b.referenceValue, f.high), f.low = Math.min(b.referenceValue, f.low)), f.high <= f.low && (0 === f.low ? f.high = 1 : f.low < 0 ? f.high = 0 : f.high > 0 ? f.low = 0 : (f.high = 1, f.low = 0)), f }, c.isNumeric = function (a) { return null !== a && isFinite(a) }, c.isFalseyButZero = function (a) { return !a && 0 !== a }, c.getNumberOrUndefined = function (a) { return c.isNumeric(a) ? +a : void 0 }, c.isMultiValue = function (a) { return "object" == typeof a && ("x" in a || "y" in a) }, c.getMultiValue = function (a, b) { return c.isMultiValue(a) ? c.getNumberOrUndefined(a[b || "y"]) : c.getNumberOrUndefined(a) }, c.rho = function (a) { function b(a, c) { return a % c === 0 ? c : b(c, a % c) } function c(a) { return a * a + 1 } if (1 === a) return a; var d, e = 2, f = 2; if (a % 2 === 0) return 2; do e = c(e) % a, f = c(c(f)) % a, d = b(Math.abs(e - f), a); while (1 === d); return d }, c.getBounds = function (a, b, d, e) { function f(a, b) { return a === (a += b) && (a *= 1 + (b > 0 ? o : -o)), a } var g, h, i, j = 0, k = { high: b.high, low: b.low }; k.valueRange = k.high - k.low, k.oom = c.orderOfMagnitude(k.valueRange), k.step = Math.pow(10, k.oom), k.min = Math.floor(k.low / k.step) * k.step, k.max = Math.ceil(k.high / k.step) * k.step, k.range = k.max - k.min, k.numberOfSteps = Math.round(k.range / k.step); var l = c.projectLength(a, k.step, k), m = l < d, n = e ? c.rho(k.range) : 0; if (e && c.projectLength(a, 1, k) >= d) k.step = 1; else if (e && n < k.step && c.projectLength(a, n, k) >= d) k.step = n; else for (; ;) { if (m && c.projectLength(a, k.step, k) <= d) k.step *= 2; else { if (m || !(c.projectLength(a, k.step / 2, k) >= d)) break; if (k.step /= 2, e && k.step % 1 !== 0) { k.step *= 2; break } } if (j++ > 1e3) throw new Error("Exceeded maximum number of iterations while optimizing scale step!") } var o = 2.221e-16; for (k.step = Math.max(k.step, o), h = k.min, i = k.max; h + k.step <= k.low;)h = f(h, k.step); for (; i - k.step >= k.high;)i = f(i, -k.step); k.min = h, k.max = i, k.range = k.max - k.min; var p = []; for (g = k.min; g <= k.max; g = f(g, k.step)) { var q = c.roundWithPrecision(g); q !== p[p.length - 1] && p.push(q) } return k.values = p, k }, c.polarToCartesian = function (a, b, c, d) { var e = (d - 90) * Math.PI / 180; return { x: a + c * Math.cos(e), y: b + c * Math.sin(e) } }, c.createChartRect = function (a, b, d) { var e = !(!b.axisX && !b.axisY), f = e ? b.axisY.offset : 0, g = e ? b.axisX.offset : 0, h = a.width() || c.quantity(b.width).value || 0, i = a.height() || c.quantity(b.height).value || 0, j = c.normalizePadding(b.chartPadding, d); h = Math.max(h, f + j.left + j.right), i = Math.max(i, g + j.top + j.bottom); var k = { padding: j, width: function () { return this.x2 - this.x1 }, height: function () { return this.y1 - this.y2 } }; return e ? ("start" === b.axisX.position ? (k.y2 = j.top + g, k.y1 = Math.max(i - j.bottom, k.y2 + 1)) : (k.y2 = j.top, k.y1 = Math.max(i - j.bottom - g, k.y2 + 1)), "start" === b.axisY.position ? (k.x1 = j.left + f, k.x2 = Math.max(h - j.right, k.x1 + 1)) : (k.x1 = j.left, k.x2 = Math.max(h - j.right - f, k.x1 + 1))) : (k.x1 = j.left, k.x2 = Math.max(h - j.right, k.x1 + 1), k.y2 = j.top, k.y1 = Math.max(i - j.bottom, k.y2 + 1)), k }, c.createGrid = function (a, b, d, e, f, g, h, i) { var j = {}; j[d.units.pos + "1"] = a, j[d.units.pos + "2"] = a, j[d.counterUnits.pos + "1"] = e, j[d.counterUnits.pos + "2"] = e + f; var k = g.elem("line", j, h.join(" ")); i.emit("draw", c.extend({ type: "grid", axis: d, index: b, group: g, element: k }, j)) }, c.createGridBackground = function (a, b, c, d) { var e = a.elem("rect", { x: b.x1, y: b.y2, width: b.width(), height: b.height() }, c, !0); d.emit("draw", { type: "gridBackground", group: a, element: e }) }, c.createLabel = function (a, d, e, f, g, h, i, j, k, l, m) { var n, o = {}; if (o[g.units.pos] = a + i[g.units.pos], o[g.counterUnits.pos] = i[g.counterUnits.pos], o[g.units.len] = d, o[g.counterUnits.len] = Math.max(0, h - 10), l) { var p = b.createElement("span"); p.className = k.join(" "), p.setAttribute("xmlns", c.namespaces.xhtml), p.innerText = f[e], p.style[g.units.len] = Math.round(o[g.units.len]) + "px", p.style[g.counterUnits.len] = Math.round(o[g.counterUnits.len]) + "px", n = j.foreignObject(p, c.extend({ style: "overflow: visible;" }, o)) } else n = j.elem("text", o, k.join(" ")).text(f[e]); m.emit("draw", c.extend({ type: "label", axis: g, index: e, group: j, element: n, text: f[e] }, o)) }, c.getSeriesOption = function (a, b, c) { if (a.name && b.series && b.series[a.name]) { var d = b.series[a.name]; return d.hasOwnProperty(c) ? d[c] : b[c] } return b[c] }, c.optionsProvider = function (b, d, e) { function f(b) { var f = h; if (h = c.extend({}, j), d) for (i = 0; i < d.length; i++) { var g = a.matchMedia(d[i][0]); g.matches && (h = c.extend(h, d[i][1])) } e && b && e.emit("optionsChanged", { previousOptions: f, currentOptions: h }) } function g() { k.forEach(function (a) { a.removeListener(f) }) } var h, i, j = c.extend({}, b), k = []; if (!a.matchMedia) throw "window.matchMedia not found! Make sure you're using a polyfill."; if (d) for (i = 0; i < d.length; i++) { var l = a.matchMedia(d[i][0]); l.addListener(f), k.push(l) } return f(), { removeMediaQueryListeners: g, getCurrentOptions: function () { return c.extend({}, h) } } }, c.splitIntoSegments = function (a, b, d) { var e = { increasingX: !1, fillHoles: !1 }; d = c.extend({}, e, d); for (var f = [], g = !0, h = 0; h < a.length; h += 2)void 0 === c.getMultiValue(b[h / 2].value) ? d.fillHoles || (g = !0) : (d.increasingX && h >= 2 && a[h] <= a[h - 2] && (g = !0), g && (f.push({ pathCoordinates: [], valueData: [] }), g = !1), f[f.length - 1].pathCoordinates.push(a[h], a[h + 1]), f[f.length - 1].valueData.push(b[h / 2])); return f } }(window, document, a), function (a, b, c) { "use strict"; c.Interpolation = {}, c.Interpolation.none = function (a) { var b = { fillHoles: !1 }; return a = c.extend({}, b, a), function (b, d) { for (var e = new c.Svg.Path, f = !0, g = 0; g < b.length; g += 2) { var h = b[g], i = b[g + 1], j = d[g / 2]; void 0 !== c.getMultiValue(j.value) ? (f ? e.move(h, i, !1, j) : e.line(h, i, !1, j), f = !1) : a.fillHoles || (f = !0) } return e } }, c.Interpolation.simple = function (a) { var b = { divisor: 2, fillHoles: !1 }; a = c.extend({}, b, a); var d = 1 / Math.max(1, a.divisor); return function (b, e) { for (var f, g, h, i = new c.Svg.Path, j = 0; j < b.length; j += 2) { var k = b[j], l = b[j + 1], m = (k - f) * d, n = e[j / 2]; void 0 !== n.value ? (void 0 === h ? i.move(k, l, !1, n) : i.curve(f + m, g, k - m, l, k, l, !1, n), f = k, g = l, h = n) : a.fillHoles || (f = k = h = void 0) } return i } }, c.Interpolation.cardinal = function (a) { var b = { tension: 1, fillHoles: !1 }; a = c.extend({}, b, a); var d = Math.min(1, Math.max(0, a.tension)), e = 1 - d; return function f(b, g) { var h = c.splitIntoSegments(b, g, { fillHoles: a.fillHoles }); if (h.length) { if (h.length > 1) { var i = []; return h.forEach(function (a) { i.push(f(a.pathCoordinates, a.valueData)) }), c.Svg.Path.join(i) } if (b = h[0].pathCoordinates, g = h[0].valueData, b.length <= 4) return c.Interpolation.none()(b, g); for (var j, k = (new c.Svg.Path).move(b[0], b[1], !1, g[0]), l = 0, m = b.length; m - 2 * !j > l; l += 2) { var n = [{ x: +b[l - 2], y: +b[l - 1] }, { x: +b[l], y: +b[l + 1] }, { x: +b[l + 2], y: +b[l + 3] }, { x: +b[l + 4], y: +b[l + 5] }]; j ? l ? m - 4 === l ? n[3] = { x: +b[0], y: +b[1] } : m - 2 === l && (n[2] = { x: +b[0], y: +b[1] }, n[3] = { x: +b[2], y: +b[3] }) : n[0] = { x: +b[m - 2], y: +b[m - 1] } : m - 4 === l ? n[3] = n[2] : l || (n[0] = { x: +b[l], y: +b[l + 1] }), k.curve(d * (-n[0].x + 6 * n[1].x + n[2].x) / 6 + e * n[2].x, d * (-n[0].y + 6 * n[1].y + n[2].y) / 6 + e * n[2].y, d * (n[1].x + 6 * n[2].x - n[3].x) / 6 + e * n[2].x, d * (n[1].y + 6 * n[2].y - n[3].y) / 6 + e * n[2].y, n[2].x, n[2].y, !1, g[(l + 2) / 2]) } return k } return c.Interpolation.none()([]) } }, c.Interpolation.monotoneCubic = function (a) { var b = { fillHoles: !1 }; return a = c.extend({}, b, a), function d(b, e) { var f = c.splitIntoSegments(b, e, { fillHoles: a.fillHoles, increasingX: !0 }); if (f.length) { if (f.length > 1) { var g = []; return f.forEach(function (a) { g.push(d(a.pathCoordinates, a.valueData)) }), c.Svg.Path.join(g) } if (b = f[0].pathCoordinates, e = f[0].valueData, b.length <= 4) return c.Interpolation.none()(b, e); var h, i, j = [], k = [], l = b.length / 2, m = [], n = [], o = [], p = []; for (h = 0; h < l; h++)j[h] = b[2 * h], k[h] = b[2 * h + 1]; for (h = 0; h < l - 1; h++)o[h] = k[h + 1] - k[h], p[h] = j[h + 1] - j[h], n[h] = o[h] / p[h]; for (m[0] = n[0], m[l - 1] = n[l - 2], h = 1; h < l - 1; h++)0 === n[h] || 0 === n[h - 1] || n[h - 1] > 0 != n[h] > 0 ? m[h] = 0 : (m[h] = 3 * (p[h - 1] + p[h]) / ((2 * p[h] + p[h - 1]) / n[h - 1] + (p[h] + 2 * p[h - 1]) / n[h]), isFinite(m[h]) || (m[h] = 0)); for (i = (new c.Svg.Path).move(j[0], k[0], !1, e[0]), h = 0; h < l - 1; h++)i.curve(j[h] + p[h] / 3, k[h] + m[h] * p[h] / 3, j[h + 1] - p[h] / 3, k[h + 1] - m[h + 1] * p[h] / 3, j[h + 1], k[h + 1], !1, e[h + 1]); return i } return c.Interpolation.none()([]) } }, c.Interpolation.step = function (a) { var b = { postpone: !0, fillHoles: !1 }; return a = c.extend({}, b, a), function (b, d) { for (var e, f, g, h = new c.Svg.Path, i = 0; i < b.length; i += 2) { var j = b[i], k = b[i + 1], l = d[i / 2]; void 0 !== l.value ? (void 0 === g ? h.move(j, k, !1, l) : (a.postpone ? h.line(j, f, !1, g) : h.line(e, k, !1, l), h.line(j, k, !1, l)), e = j, f = k, g = l) : a.fillHoles || (e = f = g = void 0) } return h } } }(window, document, a), function (a, b, c) { "use strict"; c.EventEmitter = function () { function a(a, b) { d[a] = d[a] || [], d[a].push(b) } function b(a, b) { d[a] && (b ? (d[a].splice(d[a].indexOf(b), 1), 0 === d[a].length && delete d[a]) : delete d[a]) } function c(a, b) { d[a] && d[a].forEach(function (a) { a(b) }), d["*"] && d["*"].forEach(function (c) { c(a, b) }) } var d = []; return { addEventHandler: a, removeEventHandler: b, emit: c } } }(window, document, a), function (a, b, c) { "use strict"; function d(a) { var b = []; if (a.length) for (var c = 0; c < a.length; c++)b.push(a[c]); return b } function e(a, b) { var d = b || this.prototype || c.Class, e = Object.create(d); c.Class.cloneDefinitions(e, a); var f = function () { var a, b = e.constructor || function () { }; return a = this === c ? Object.create(e) : this, b.apply(a, Array.prototype.slice.call(arguments, 0)), a }; return f.prototype = e, f["super"] = d, f.extend = this.extend, f } function f() { var a = d(arguments), b = a[0]; return a.splice(1, a.length - 1).forEach(function (a) { Object.getOwnPropertyNames(a).forEach(function (c) { delete b[c], Object.defineProperty(b, c, Object.getOwnPropertyDescriptor(a, c)) }) }), b } c.Class = { extend: e, cloneDefinitions: f } }(window, document, a), function (a, b, c) { "use strict"; function d(a, b, d) { return a && (this.data = a || {}, this.data.labels = this.data.labels || [], this.data.series = this.data.series || [], this.eventEmitter.emit("data", { type: "update", data: this.data })), b && (this.options = c.extend({}, d ? this.options : this.defaultOptions, b), this.initializeTimeoutId || (this.optionsProvider.removeMediaQueryListeners(), this.optionsProvider = c.optionsProvider(this.options, this.responsiveOptions, this.eventEmitter))), this.initializeTimeoutId || this.createChart(this.optionsProvider.getCurrentOptions()), this } function e() { return this.initializeTimeoutId ? a.clearTimeout(this.initializeTimeoutId) : (a.removeEventListener("resize", this.resizeListener), this.optionsProvider.removeMediaQueryListeners()), this } function f(a, b) { return this.eventEmitter.addEventHandler(a, b), this } function g(a, b) { return this.eventEmitter.removeEventHandler(a, b), this } function h() { a.addEventListener("resize", this.resizeListener), this.optionsProvider = c.optionsProvider(this.options, this.responsiveOptions, this.eventEmitter), this.eventEmitter.addEventHandler("optionsChanged", function () { this.update() }.bind(this)), this.options.plugins && this.options.plugins.forEach(function (a) { a instanceof Array ? a[0](this, a[1]) : a(this) }.bind(this)), this.eventEmitter.emit("data", { type: "initial", data: this.data }), this.createChart(this.optionsProvider.getCurrentOptions()), this.initializeTimeoutId = void 0 } function i(a, b, d, e, f) { this.container = c.querySelector(a), this.data = b || {}, this.data.labels = this.data.labels || [], this.data.series = this.data.series || [], this.defaultOptions = d, this.options = e, this.responsiveOptions = f, this.eventEmitter = c.EventEmitter(), this.supportsForeignObject = c.Svg.isSupported("Extensibility"), this.supportsAnimations = c.Svg.isSupported("AnimationEventsAttribute"), this.resizeListener = function () { this.update() }.bind(this), this.container && (this.container.__chartist__ && this.container.__chartist__.detach(), this.container.__chartist__ = this), this.initializeTimeoutId = setTimeout(h.bind(this), 0) } c.Base = c.Class.extend({ constructor: i, optionsProvider: void 0, container: void 0, svg: void 0, eventEmitter: void 0, createChart: function () { throw new Error("Base chart type can't be instantiated!") }, update: d, detach: e, on: f, off: g, version: c.version, supportsForeignObject: !1 }) }(window, document, a), function (a, b, c) { "use strict"; function d(a, d, e, f, g) { a instanceof Element ? this._node = a : (this._node = b.createElementNS(c.namespaces.svg, a), "svg" === a && this.attr({ "xmlns:ct": c.namespaces.ct })), d && this.attr(d), e && this.addClass(e), f && (g && f._node.firstChild ? f._node.insertBefore(this._node, f._node.firstChild) : f._node.appendChild(this._node)) } function e(a, b) { return "string" == typeof a ? b ? this._node.getAttributeNS(b, a) : this._node.getAttribute(a) : (Object.keys(a).forEach(function (b) { if (void 0 !== a[b]) if (b.indexOf(":") !== -1) { var d = b.split(":"); this._node.setAttributeNS(c.namespaces[d[0]], b, a[b]) } else this._node.setAttribute(b, a[b]) }.bind(this)), this) } function f(a, b, d, e) { return new c.Svg(a, b, d, this, e) } function g() { return this._node.parentNode instanceof SVGElement ? new c.Svg(this._node.parentNode) : null } function h() { for (var a = this._node; "svg" !== a.nodeName;)a = a.parentNode; return new c.Svg(a) } function i(a) { var b = this._node.querySelector(a); return b ? new c.Svg(b) : null } function j(a) { var b = this._node.querySelectorAll(a); return b.length ? new c.Svg.List(b) : null } function k() { return this._node } function l(a, d, e, f) { if ("string" == typeof a) { var g = b.createElement("div"); g.innerHTML = a, a = g.firstChild } a.setAttribute("xmlns", c.namespaces.xmlns); var h = this.elem("foreignObject", d, e, f); return h._node.appendChild(a), h } function m(a) { return this._node.appendChild(b.createTextNode(a)), this } function n() { for (; this._node.firstChild;)this._node.removeChild(this._node.firstChild); return this } function o() { return this._node.parentNode.removeChild(this._node), this.parent() } function p(a) { return this._node.parentNode.replaceChild(a._node, this._node), a } function q(a, b) { return b && this._node.firstChild ? this._node.insertBefore(a._node, this._node.firstChild) : this._node.appendChild(a._node), this } function r() { return this._node.getAttribute("class") ? this._node.getAttribute("class").trim().split(/\s+/) : [] } function s(a) { return this._node.setAttribute("class", this.classes(this._node).concat(a.trim().split(/\s+/)).filter(function (a, b, c) { return c.indexOf(a) === b }).join(" ")), this } function t(a) { var b = a.trim().split(/\s+/); return this._node.setAttribute("class", this.classes(this._node).filter(function (a) { return b.indexOf(a) === -1 }).join(" ")), this } function u() { return this._node.setAttribute("class", ""), this } function v() { return this._node.getBoundingClientRect().height } function w() { return this._node.getBoundingClientRect().width } function x(a, b, d) { return void 0 === b && (b = !0), Object.keys(a).forEach(function (e) { function f(a, b) { var f, g, h, i = {}; a.easing && (h = a.easing instanceof Array ? a.easing : c.Svg.Easing[a.easing], delete a.easing), a.begin = c.ensureUnit(a.begin, "ms"), a.dur = c.ensureUnit(a.dur, "ms"), h && (a.calcMode = "spline", a.keySplines = h.join(" "), a.keyTimes = "0;1"), b && (a.fill = "freeze", i[e] = a.from, this.attr(i), g = c.quantity(a.begin || 0).value, a.begin = "indefinite"), f = this.elem("animate", c.extend({ attributeName: e }, a)), b && setTimeout(function () { try { f._node.beginElement() } catch (b) { i[e] = a.to, this.attr(i), f.remove() } }.bind(this), g), d && f._node.addEventListener("beginEvent", function () { d.emit("animationBegin", { element: this, animate: f._node, params: a }) }.bind(this)), f._node.addEventListener("endEvent", function () { d && d.emit("animationEnd", { element: this, animate: f._node, params: a }), b && (i[e] = a.to, this.attr(i), f.remove()) }.bind(this)) } a[e] instanceof Array ? a[e].forEach(function (a) { f.bind(this)(a, !1) }.bind(this)) : f.bind(this)(a[e], b) }.bind(this)), this } function y(a) { var b = this; this.svgElements = []; for (var d = 0; d < a.length; d++)this.svgElements.push(new c.Svg(a[d])); Object.keys(c.Svg.prototype).filter(function (a) { return ["constructor", "parent", "querySelector", "querySelectorAll", "replace", "append", "classes", "height", "width"].indexOf(a) === -1 }).forEach(function (a) { b[a] = function () { var d = Array.prototype.slice.call(arguments, 0); return b.svgElements.forEach(function (b) { c.Svg.prototype[a].apply(b, d) }), b } }) } c.Svg = c.Class.extend({ constructor: d, attr: e, elem: f, parent: g, root: h, querySelector: i, querySelectorAll: j, getNode: k, foreignObject: l, text: m, empty: n, remove: o, replace: p, append: q, classes: r, addClass: s, removeClass: t, removeAllClasses: u, height: v, width: w, animate: x }), c.Svg.isSupported = function (a) { return b.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#" + a, "1.1") }; var z = { easeInSine: [.47, 0, .745, .715], easeOutSine: [.39, .575, .565, 1], easeInOutSine: [.445, .05, .55, .95], easeInQuad: [.55, .085, .68, .53], easeOutQuad: [.25, .46, .45, .94], easeInOutQuad: [.455, .03, .515, .955], easeInCubic: [.55, .055, .675, .19], easeOutCubic: [.215, .61, .355, 1], easeInOutCubic: [.645, .045, .355, 1], easeInQuart: [.895, .03, .685, .22], easeOutQuart: [.165, .84, .44, 1], easeInOutQuart: [.77, 0, .175, 1], easeInQuint: [.755, .05, .855, .06], easeOutQuint: [.23, 1, .32, 1], easeInOutQuint: [.86, 0, .07, 1], easeInExpo: [.95, .05, .795, .035], easeOutExpo: [.19, 1, .22, 1], easeInOutExpo: [1, 0, 0, 1], easeInCirc: [.6, .04, .98, .335], easeOutCirc: [.075, .82, .165, 1], easeInOutCirc: [.785, .135, .15, .86], easeInBack: [.6, -.28, .735, .045], easeOutBack: [.175, .885, .32, 1.275], easeInOutBack: [.68, -.55, .265, 1.55] }; c.Svg.Easing = z, c.Svg.List = c.Class.extend({ constructor: y }) }(window, document, a), function (a, b, c) { "use strict"; function d(a, b, d, e, f, g) { var h = c.extend({ command: f ? a.toLowerCase() : a.toUpperCase() }, b, g ? { data: g } : {}); d.splice(e, 0, h) } function e(a, b) { a.forEach(function (c, d) { u[c.command.toLowerCase()].forEach(function (e, f) { b(c, e, d, f, a) }) }) } function f(a, b) { this.pathElements = [], this.pos = 0, this.close = a, this.options = c.extend({}, v, b) } function g(a) { return void 0 !== a ? (this.pos = Math.max(0, Math.min(this.pathElements.length, a)), this) : this.pos } function h(a) { return this.pathElements.splice(this.pos, a), this } function i(a, b, c, e) { return d("M", { x: +a, y: +b }, this.pathElements, this.pos++, c, e), this } function j(a, b, c, e) { return d("L", { x: +a, y: +b }, this.pathElements, this.pos++, c, e), this } function k(a, b, c, e, f, g, h, i) { return d("C", { x1: +a, y1: +b, x2: +c, y2: +e, x: +f, y: +g }, this.pathElements, this.pos++, h, i), this } function l(a, b, c, e, f, g, h, i, j) { return d("A", { rx: +a, ry: +b, xAr: +c, lAf: +e, sf: +f, x: +g, y: +h }, this.pathElements, this.pos++, i, j), this } function m(a) { var b = a.replace(/([A-Za-z])([0-9])/g, "$1 $2").replace(/([0-9])([A-Za-z])/g, "$1 $2").split(/[\s,]+/).reduce(function (a, b) { return b.match(/[A-Za-z]/) && a.push([]), a[a.length - 1].push(b), a }, []); "Z" === b[b.length - 1][0].toUpperCase() && b.pop(); var d = b.map(function (a) { var b = a.shift(), d = u[b.toLowerCase()]; return c.extend({ command: b }, d.reduce(function (b, c, d) { return b[c] = +a[d], b }, {})) }), e = [this.pos, 0]; return Array.prototype.push.apply(e, d), Array.prototype.splice.apply(this.pathElements, e), this.pos += d.length, this } function n() { var a = Math.pow(10, this.options.accuracy); return this.pathElements.reduce(function (b, c) { var d = u[c.command.toLowerCase()].map(function (b) { return this.options.accuracy ? Math.round(c[b] * a) / a : c[b] }.bind(this)); return b + c.command + d.join(",") }.bind(this), "") + (this.close ? "Z" : "") } function o(a, b) { return e(this.pathElements, function (c, d) { c[d] *= "x" === d[0] ? a : b }), this } function p(a, b) { return e(this.pathElements, function (c, d) { c[d] += "x" === d[0] ? a : b }), this } function q(a) { return e(this.pathElements, function (b, c, d, e, f) { var g = a(b, c, d, e, f); (g || 0 === g) && (b[c] = g) }), this } function r(a) { var b = new c.Svg.Path(a || this.close); return b.pos = this.pos, b.pathElements = this.pathElements.slice().map(function (a) { return c.extend({}, a) }), b.options = c.extend({}, this.options), b } function s(a) { var b = [new c.Svg.Path]; return this.pathElements.forEach(function (d) { d.command === a.toUpperCase() && 0 !== b[b.length - 1].pathElements.length && b.push(new c.Svg.Path), b[b.length - 1].pathElements.push(d) }), b } function t(a, b, d) { for (var e = new c.Svg.Path(b, d), f = 0; f < a.length; f++)for (var g = a[f], h = 0; h < g.pathElements.length; h++)e.pathElements.push(g.pathElements[h]); return e } var u = { m: ["x", "y"], l: ["x", "y"], c: ["x1", "y1", "x2", "y2", "x", "y"], a: ["rx", "ry", "xAr", "lAf", "sf", "x", "y"] }, v = { accuracy: 3 }; c.Svg.Path = c.Class.extend({ constructor: f, position: g, remove: h, move: i, line: j, curve: k, arc: l, scale: o, translate: p, transform: q, parse: m, stringify: n, clone: r, splitByCommand: s }), c.Svg.Path.elementDescriptions = u, c.Svg.Path.join = t }(window, document, a), function (a, b, c) { "use strict"; function d(a, b, c, d) { this.units = a, this.counterUnits = a === f.x ? f.y : f.x, this.chartRect = b, this.axisLength = b[a.rectEnd] - b[a.rectStart], this.gridOffset = b[a.rectOffset], this.ticks = c, this.options = d } function e(a, b, d, e, f) { var g = e["axis" + this.units.pos.toUpperCase()], h = this.ticks.map(this.projectValue.bind(this)), i = this.ticks.map(g.labelInterpolationFnc); h.forEach(function (j, k) { var l, m = { x: 0, y: 0 }; l = h[k + 1] ? h[k + 1] - j : Math.max(this.axisLength - j, 30), c.isFalseyButZero(i[k]) && "" !== i[k] || ("x" === this.units.pos ? (j = this.chartRect.x1 + j, m.x = e.axisX.labelOffset.x, "start" === e.axisX.position ? m.y = this.chartRect.padding.top + e.axisX.labelOffset.y + (d ? 5 : 20) : m.y = this.chartRect.y1 + e.axisX.labelOffset.y + (d ? 5 : 20)) : (j = this.chartRect.y1 - j, m.y = e.axisY.labelOffset.y - (d ? l : 0), "start" === e.axisY.position ? m.x = d ? this.chartRect.padding.left + e.axisY.labelOffset.x : this.chartRect.x1 - 10 : m.x = this.chartRect.x2 + e.axisY.labelOffset.x + 10), g.showGrid && c.createGrid(j, k, this, this.gridOffset, this.chartRect[this.counterUnits.len](), a, [e.classNames.grid, e.classNames[this.units.dir]], f), g.showLabel && c.createLabel(j, l, k, i, this, g.offset, m, b, [e.classNames.label, e.classNames[this.units.dir], "start" === g.position ? e.classNames[g.position] : e.classNames.end], d, f)) }.bind(this)) } var f = { x: { pos: "x", len: "width", dir: "horizontal", rectStart: "x1", rectEnd: "x2", rectOffset: "y2" }, y: { pos: "y", len: "height", dir: "vertical", rectStart: "y2", rectEnd: "y1", rectOffset: "x1" } }; c.Axis = c.Class.extend({ constructor: d, createGridAndLabels: e, projectValue: function (a, b, c) { throw new Error("Base axis can't be instantiated!") } }), c.Axis.units = f }(window, document, a), function (a, b, c) { "use strict"; function d(a, b, d, e) { var f = e.highLow || c.getHighLow(b, e, a.pos); this.bounds = c.getBounds(d[a.rectEnd] - d[a.rectStart], f, e.scaleMinSpace || 20, e.onlyInteger), this.range = { min: this.bounds.min, max: this.bounds.max }, c.AutoScaleAxis["super"].constructor.call(this, a, d, this.bounds.values, e) } function e(a) { return this.axisLength * (+c.getMultiValue(a, this.units.pos) - this.bounds.min) / this.bounds.range } c.AutoScaleAxis = c.Axis.extend({ constructor: d, projectValue: e }) }(window, document, a), function (a, b, c) { "use strict"; function d(a, b, d, e) { var f = e.highLow || c.getHighLow(b, e, a.pos); this.divisor = e.divisor || 1, this.ticks = e.ticks || c.times(this.divisor).map(function (a, b) { return f.low + (f.high - f.low) / this.divisor * b }.bind(this)), this.ticks.sort(function (a, b) { return a - b }), this.range = { min: f.low, max: f.high }, c.FixedScaleAxis["super"].constructor.call(this, a, d, this.ticks, e), this.stepLength = this.axisLength / this.divisor } function e(a) { return this.axisLength * (+c.getMultiValue(a, this.units.pos) - this.range.min) / (this.range.max - this.range.min) } c.FixedScaleAxis = c.Axis.extend({ constructor: d, projectValue: e }) }(window, document, a), function (a, b, c) { "use strict"; function d(a, b, d, e) { c.StepAxis["super"].constructor.call(this, a, d, e.ticks, e); var f = Math.max(1, e.ticks.length - (e.stretch ? 1 : 0)); this.stepLength = this.axisLength / f } function e(a, b) { return this.stepLength * b } c.StepAxis = c.Axis.extend({ constructor: d, projectValue: e }) }(window, document, a), function (a, b, c) { "use strict"; function d(a) { var b = c.normalizeData(this.data, a.reverseData, !0); this.svg = c.createSvg(this.container, a.width, a.height, a.classNames.chart); var d, e, g = this.svg.elem("g").addClass(a.classNames.gridGroup), h = this.svg.elem("g"), i = this.svg.elem("g").addClass(a.classNames.labelGroup), j = c.createChartRect(this.svg, a, f.padding); d = void 0 === a.axisX.type ? new c.StepAxis(c.Axis.units.x, b.normalized.series, j, c.extend({}, a.axisX, { ticks: b.normalized.labels, stretch: a.fullWidth })) : a.axisX.type.call(c, c.Axis.units.x, b.normalized.series, j, a.axisX), e = void 0 === a.axisY.type ? new c.AutoScaleAxis(c.Axis.units.y, b.normalized.series, j, c.extend({}, a.axisY, { high: c.isNumeric(a.high) ? a.high : a.axisY.high, low: c.isNumeric(a.low) ? a.low : a.axisY.low })) : a.axisY.type.call(c, c.Axis.units.y, b.normalized.series, j, a.axisY), d.createGridAndLabels(g, i, this.supportsForeignObject, a, this.eventEmitter), e.createGridAndLabels(g, i, this.supportsForeignObject, a, this.eventEmitter), a.showGridBackground && c.createGridBackground(g, j, a.classNames.gridBackground, this.eventEmitter), b.raw.series.forEach(function (f, g) { var i = h.elem("g"); i.attr({ "ct:series-name": f.name, "ct:meta": c.serialize(f.meta) }), i.addClass([a.classNames.series, f.className || a.classNames.series + "-" + c.alphaNumerate(g)].join(" ")); var k = [], l = []; b.normalized.series[g].forEach(function (a, h) { var i = { x: j.x1 + d.projectValue(a, h, b.normalized.series[g]), y: j.y1 - e.projectValue(a, h, b.normalized.series[g]) }; k.push(i.x, i.y), l.push({ value: a, valueIndex: h, meta: c.getMetaData(f, h) }) }.bind(this)); var m = { lineSmooth: c.getSeriesOption(f, a, "lineSmooth"), showPoint: c.getSeriesOption(f, a, "showPoint"), showLine: c.getSeriesOption(f, a, "showLine"), showArea: c.getSeriesOption(f, a, "showArea"), areaBase: c.getSeriesOption(f, a, "areaBase") }, n = "function" == typeof m.lineSmooth ? m.lineSmooth : m.lineSmooth ? c.Interpolation.monotoneCubic() : c.Interpolation.none(), o = n(k, l); if (m.showPoint && o.pathElements.forEach(function (b) { var h = i.elem("line", { x1: b.x, y1: b.y, x2: b.x + .01, y2: b.y }, a.classNames.point).attr({ "ct:value": [b.data.value.x, b.data.value.y].filter(c.isNumeric).join(","), "ct:meta": c.serialize(b.data.meta) }); this.eventEmitter.emit("draw", { type: "point", value: b.data.value, index: b.data.valueIndex, meta: b.data.meta, series: f, seriesIndex: g, axisX: d, axisY: e, group: i, element: h, x: b.x, y: b.y }) }.bind(this)), m.showLine) { var p = i.elem("path", { d: o.stringify() }, a.classNames.line, !0); this.eventEmitter.emit("draw", { type: "line", values: b.normalized.series[g], path: o.clone(), chartRect: j, index: g, series: f, seriesIndex: g, seriesMeta: f.meta, axisX: d, axisY: e, group: i, element: p }) } if (m.showArea && e.range) { var q = Math.max(Math.min(m.areaBase, e.range.max), e.range.min), r = j.y1 - e.projectValue(q); o.splitByCommand("M").filter(function (a) { return a.pathElements.length > 1 }).map(function (a) { var b = a.pathElements[0], c = a.pathElements[a.pathElements.length - 1]; return a.clone(!0).position(0).remove(1).move(b.x, r).line(b.x, b.y).position(a.pathElements.length + 1).line(c.x, r) }).forEach(function (c) { var h = i.elem("path", { d: c.stringify() }, a.classNames.area, !0); this.eventEmitter.emit("draw", { type: "area", values: b.normalized.series[g], path: c.clone(), series: f, seriesIndex: g, axisX: d, axisY: e, chartRect: j, index: g, group: i, element: h }) }.bind(this)) } }.bind(this)), this.eventEmitter.emit("created", { bounds: e.bounds, chartRect: j, axisX: d, axisY: e, svg: this.svg, options: a }) } function e(a, b, d, e) { c.Line["super"].constructor.call(this, a, b, f, c.extend({}, f, d), e) } var f = { axisX: { offset: 30, position: "end", labelOffset: { x: 0, y: 0 }, showLabel: !0, showGrid: !0, labelInterpolationFnc: c.noop, type: void 0 }, axisY: { offset: 40, position: "start", labelOffset: { x: 0, y: 0 }, showLabel: !0, showGrid: !0, labelInterpolationFnc: c.noop, type: void 0, scaleMinSpace: 20, onlyInteger: !1 }, width: void 0, height: void 0, showLine: !0, showPoint: !0, showArea: !1, areaBase: 0, lineSmooth: !0, showGridBackground: !1, low: void 0, high: void 0, chartPadding: { top: 15, right: 15, bottom: 5, left: 10 }, fullWidth: !1, reverseData: !1, classNames: { chart: "ct-chart-line", label: "ct-label", labelGroup: "ct-labels", series: "ct-series", line: "ct-line", point: "ct-point", area: "ct-area", grid: "ct-grid", gridGroup: "ct-grids", gridBackground: "ct-grid-background", vertical: "ct-vertical", horizontal: "ct-horizontal", start: "ct-start", end: "ct-end" } }; c.Line = c.Base.extend({ constructor: e, createChart: d }) }(window, document, a), function (a, b, c) { - "use strict"; function d(a) { - var b, d; a.distributeSeries ? (b = c.normalizeData(this.data, a.reverseData, a.horizontalBars ? "x" : "y"), b.normalized.series = b.normalized.series.map(function (a) { return [a] })) : b = c.normalizeData(this.data, a.reverseData, a.horizontalBars ? "x" : "y"), this.svg = c.createSvg(this.container, a.width, a.height, a.classNames.chart + (a.horizontalBars ? " " + a.classNames.horizontalBars : "")); var e = this.svg.elem("g").addClass(a.classNames.gridGroup), g = this.svg.elem("g"), h = this.svg.elem("g").addClass(a.classNames.labelGroup); if (a.stackBars && 0 !== b.normalized.series.length) { - var i = c.serialMap(b.normalized.series, function () { - return Array.prototype.slice.call(arguments).map(function (a) { return a }).reduce(function (a, b) { return { x: a.x + (b && b.x) || 0, y: a.y + (b && b.y) || 0 } }, { x: 0, y: 0 }) - }); d = c.getHighLow([i], a, a.horizontalBars ? "x" : "y") - } else d = c.getHighLow(b.normalized.series, a, a.horizontalBars ? "x" : "y"); d.high = +a.high || (0 === a.high ? 0 : d.high), d.low = +a.low || (0 === a.low ? 0 : d.low); var j, k, l, m, n, o = c.createChartRect(this.svg, a, f.padding); k = a.distributeSeries && a.stackBars ? b.normalized.labels.slice(0, 1) : b.normalized.labels, a.horizontalBars ? (j = m = void 0 === a.axisX.type ? new c.AutoScaleAxis(c.Axis.units.x, b.normalized.series, o, c.extend({}, a.axisX, { highLow: d, referenceValue: 0 })) : a.axisX.type.call(c, c.Axis.units.x, b.normalized.series, o, c.extend({}, a.axisX, { highLow: d, referenceValue: 0 })), l = n = void 0 === a.axisY.type ? new c.StepAxis(c.Axis.units.y, b.normalized.series, o, { ticks: k }) : a.axisY.type.call(c, c.Axis.units.y, b.normalized.series, o, a.axisY)) : (l = m = void 0 === a.axisX.type ? new c.StepAxis(c.Axis.units.x, b.normalized.series, o, { ticks: k }) : a.axisX.type.call(c, c.Axis.units.x, b.normalized.series, o, a.axisX), j = n = void 0 === a.axisY.type ? new c.AutoScaleAxis(c.Axis.units.y, b.normalized.series, o, c.extend({}, a.axisY, { highLow: d, referenceValue: 0 })) : a.axisY.type.call(c, c.Axis.units.y, b.normalized.series, o, c.extend({}, a.axisY, { highLow: d, referenceValue: 0 }))); var p = a.horizontalBars ? o.x1 + j.projectValue(0) : o.y1 - j.projectValue(0), q = []; l.createGridAndLabels(e, h, this.supportsForeignObject, a, this.eventEmitter), j.createGridAndLabels(e, h, this.supportsForeignObject, a, this.eventEmitter), a.showGridBackground && c.createGridBackground(e, o, a.classNames.gridBackground, this.eventEmitter), b.raw.series.forEach(function (d, e) { var f, h, i = e - (b.raw.series.length - 1) / 2; f = a.distributeSeries && !a.stackBars ? l.axisLength / b.normalized.series.length / 2 : a.distributeSeries && a.stackBars ? l.axisLength / 2 : l.axisLength / b.normalized.series[e].length / 2, h = g.elem("g"), h.attr({ "ct:series-name": d.name, "ct:meta": c.serialize(d.meta) }), h.addClass([a.classNames.series, d.className || a.classNames.series + "-" + c.alphaNumerate(e)].join(" ")), b.normalized.series[e].forEach(function (g, k) { var r, s, t, u; if (u = a.distributeSeries && !a.stackBars ? e : a.distributeSeries && a.stackBars ? 0 : k, r = a.horizontalBars ? { x: o.x1 + j.projectValue(g && g.x ? g.x : 0, k, b.normalized.series[e]), y: o.y1 - l.projectValue(g && g.y ? g.y : 0, u, b.normalized.series[e]) } : { x: o.x1 + l.projectValue(g && g.x ? g.x : 0, u, b.normalized.series[e]), y: o.y1 - j.projectValue(g && g.y ? g.y : 0, k, b.normalized.series[e]) }, l instanceof c.StepAxis && (l.options.stretch || (r[l.units.pos] += f * (a.horizontalBars ? -1 : 1)), r[l.units.pos] += a.stackBars || a.distributeSeries ? 0 : i * a.seriesBarDistance * (a.horizontalBars ? -1 : 1)), t = q[k] || p, q[k] = t - (p - r[l.counterUnits.pos]), void 0 !== g) { var v = {}; v[l.units.pos + "1"] = r[l.units.pos], v[l.units.pos + "2"] = r[l.units.pos], !a.stackBars || "accumulate" !== a.stackMode && a.stackMode ? (v[l.counterUnits.pos + "1"] = p, v[l.counterUnits.pos + "2"] = r[l.counterUnits.pos]) : (v[l.counterUnits.pos + "1"] = t, v[l.counterUnits.pos + "2"] = q[k]), v.x1 = Math.min(Math.max(v.x1, o.x1), o.x2), v.x2 = Math.min(Math.max(v.x2, o.x1), o.x2), v.y1 = Math.min(Math.max(v.y1, o.y2), o.y1), v.y2 = Math.min(Math.max(v.y2, o.y2), o.y1); var w = c.getMetaData(d, k); s = h.elem("line", v, a.classNames.bar).attr({ "ct:value": [g.x, g.y].filter(c.isNumeric).join(","), "ct:meta": c.serialize(w) }), this.eventEmitter.emit("draw", c.extend({ type: "bar", value: g, index: k, meta: w, series: d, seriesIndex: e, axisX: m, axisY: n, chartRect: o, group: h, element: s }, v)) } }.bind(this)) }.bind(this)), this.eventEmitter.emit("created", { bounds: j.bounds, chartRect: o, axisX: m, axisY: n, svg: this.svg, options: a }) - } function e(a, b, d, e) { c.Bar["super"].constructor.call(this, a, b, f, c.extend({}, f, d), e) } var f = { axisX: { offset: 30, position: "end", labelOffset: { x: 0, y: 0 }, showLabel: !0, showGrid: !0, labelInterpolationFnc: c.noop, scaleMinSpace: 30, onlyInteger: !1 }, axisY: { offset: 40, position: "start", labelOffset: { x: 0, y: 0 }, showLabel: !0, showGrid: !0, labelInterpolationFnc: c.noop, scaleMinSpace: 20, onlyInteger: !1 }, width: void 0, height: void 0, high: void 0, low: void 0, referenceValue: 0, chartPadding: { top: 15, right: 15, bottom: 5, left: 10 }, seriesBarDistance: 15, stackBars: !1, stackMode: "accumulate", horizontalBars: !1, distributeSeries: !1, reverseData: !1, showGridBackground: !1, classNames: { chart: "ct-chart-bar", horizontalBars: "ct-horizontal-bars", label: "ct-label", labelGroup: "ct-labels", series: "ct-series", bar: "ct-bar", grid: "ct-grid", gridGroup: "ct-grids", gridBackground: "ct-grid-background", vertical: "ct-vertical", horizontal: "ct-horizontal", start: "ct-start", end: "ct-end" } }; c.Bar = c.Base.extend({ constructor: e, createChart: d }) - }(window, document, a), function (a, b, c) { "use strict"; function d(a, b, c) { var d = b.x > a.x; return d && "explode" === c || !d && "implode" === c ? "start" : d && "implode" === c || !d && "explode" === c ? "end" : "middle" } function e(a) { var b, e, f, h, i, j = c.normalizeData(this.data), k = [], l = a.startAngle; this.svg = c.createSvg(this.container, a.width, a.height, a.donut ? a.classNames.chartDonut : a.classNames.chartPie), e = c.createChartRect(this.svg, a, g.padding), f = Math.min(e.width() / 2, e.height() / 2), i = a.total || j.normalized.series.reduce(function (a, b) { return a + b }, 0); var m = c.quantity(a.donutWidth); "%" === m.unit && (m.value *= f / 100), f -= a.donut && !a.donutSolid ? m.value / 2 : 0, h = "outside" === a.labelPosition || a.donut && !a.donutSolid ? f : "center" === a.labelPosition ? 0 : a.donutSolid ? f - m.value / 2 : f / 2, h += a.labelOffset; var n = { x: e.x1 + e.width() / 2, y: e.y2 + e.height() / 2 }, o = 1 === j.raw.series.filter(function (a) { return a.hasOwnProperty("value") ? 0 !== a.value : 0 !== a }).length; j.raw.series.forEach(function (a, b) { k[b] = this.svg.elem("g", null, null) }.bind(this)), a.showLabel && (b = this.svg.elem("g", null, null)), j.raw.series.forEach(function (e, g) { if (0 !== j.normalized.series[g] || !a.ignoreEmptyValues) { k[g].attr({ "ct:series-name": e.name }), k[g].addClass([a.classNames.series, e.className || a.classNames.series + "-" + c.alphaNumerate(g)].join(" ")); var p = i > 0 ? l + j.normalized.series[g] / i * 360 : 0, q = Math.max(0, l - (0 === g || o ? 0 : .2)); p - q >= 359.99 && (p = q + 359.99); var r, s, t, u = c.polarToCartesian(n.x, n.y, f, q), v = c.polarToCartesian(n.x, n.y, f, p), w = new c.Svg.Path(!a.donut || a.donutSolid).move(v.x, v.y).arc(f, f, 0, p - l > 180, 0, u.x, u.y); a.donut ? a.donutSolid && (t = f - m.value, r = c.polarToCartesian(n.x, n.y, t, l - (0 === g || o ? 0 : .2)), s = c.polarToCartesian(n.x, n.y, t, p), w.line(r.x, r.y), w.arc(t, t, 0, p - l > 180, 1, s.x, s.y)) : w.line(n.x, n.y); var x = a.classNames.slicePie; a.donut && (x = a.classNames.sliceDonut, a.donutSolid && (x = a.classNames.sliceDonutSolid)); var y = k[g].elem("path", { d: w.stringify() }, x); if (y.attr({ "ct:value": j.normalized.series[g], "ct:meta": c.serialize(e.meta) }), a.donut && !a.donutSolid && (y._node.style.strokeWidth = m.value + "px"), this.eventEmitter.emit("draw", { type: "slice", value: j.normalized.series[g], totalDataSum: i, index: g, meta: e.meta, series: e, group: k[g], element: y, path: w.clone(), center: n, radius: f, startAngle: l, endAngle: p }), a.showLabel) { var z; z = 1 === j.raw.series.length ? { x: n.x, y: n.y } : c.polarToCartesian(n.x, n.y, h, l + (p - l) / 2); var A; A = j.normalized.labels && !c.isFalseyButZero(j.normalized.labels[g]) ? j.normalized.labels[g] : j.normalized.series[g]; var B = a.labelInterpolationFnc(A, g); if (B || 0 === B) { var C = b.elem("text", { dx: z.x, dy: z.y, "text-anchor": d(n, z, a.labelDirection) }, a.classNames.label).text("" + B); this.eventEmitter.emit("draw", { type: "label", index: g, group: b, element: C, text: "" + B, x: z.x, y: z.y }) } } l = p } }.bind(this)), this.eventEmitter.emit("created", { chartRect: e, svg: this.svg, options: a }) } function f(a, b, d, e) { c.Pie["super"].constructor.call(this, a, b, g, c.extend({}, g, d), e) } var g = { width: void 0, height: void 0, chartPadding: 5, classNames: { chartPie: "ct-chart-pie", chartDonut: "ct-chart-donut", series: "ct-series", slicePie: "ct-slice-pie", sliceDonut: "ct-slice-donut", sliceDonutSolid: "ct-slice-donut-solid", label: "ct-label" }, startAngle: 0, total: void 0, donut: !1, donutSolid: !1, donutWidth: 60, showLabel: !0, labelOffset: 0, labelPosition: "inside", labelInterpolationFnc: c.noop, labelDirection: "neutral", reverseData: !1, ignoreEmptyValues: !1 }; c.Pie = c.Base.extend({ constructor: f, createChart: e, determineAnchorPosition: d }) }(window, document, a), a -}); - -var i, l, selectedLine = null; - -/* Navigate to hash without browser history entry */ -var navigateToHash = function () { - if (window.history !== undefined && window.history.replaceState !== undefined) { - window.history.replaceState(undefined, undefined, this.getAttribute("href")); - } -}; - -var hashLinks = document.getElementsByClassName('navigatetohash'); -for (i = 0, l = hashLinks.length; i < l; i++) { - hashLinks[i].addEventListener('click', navigateToHash); -} - -/* Switch test method */ -var switchTestMethod = function () { - var method = this.getAttribute("value"); - console.log("Selected test method: " + method); - - var lines, i, l, coverageData, lineAnalysis, cells; - - lines = document.querySelectorAll('.lineAnalysis tr'); - - for (i = 1, l = lines.length; i < l; i++) { - coverageData = JSON.parse(lines[i].getAttribute('data-coverage').replace(/'/g, '"')); - lineAnalysis = coverageData[method]; - cells = lines[i].querySelectorAll('td'); - if (lineAnalysis === undefined) { - lineAnalysis = coverageData.AllTestMethods; - if (lineAnalysis.LVS !== 'gray') { - cells[0].setAttribute('class', 'red'); - cells[1].innerText = cells[1].textContent = '0'; - cells[4].setAttribute('class', 'lightred'); - } - } else { - cells[0].setAttribute('class', lineAnalysis.LVS); - cells[1].innerText = cells[1].textContent = lineAnalysis.VC; - cells[4].setAttribute('class', 'light' + lineAnalysis.LVS); - } - } -}; - -var testMethods = document.getElementsByClassName('switchtestmethod'); -for (i = 0, l = testMethods.length; i < l; i++) { - testMethods[i].addEventListener('change', switchTestMethod); -} - -/* Highlight test method by line */ -var toggleLine = function () { - if (selectedLine === this) { - selectedLine = null; - } else { - selectedLine = null; - unhighlightTestMethods(); - highlightTestMethods.call(this); - selectedLine = this; - } - -}; -var highlightTestMethods = function () { - if (selectedLine !== null) { - return; - } - - var lineAnalysis; - var coverageData = JSON.parse(this.getAttribute('data-coverage').replace(/'/g, '"')); - var testMethods = document.getElementsByClassName('testmethod'); - - for (i = 0, l = testMethods.length; i < l; i++) { - lineAnalysis = coverageData[testMethods[i].id]; - if (lineAnalysis === undefined) { - testMethods[i].className = testMethods[i].className.replace(/\s*light.+/g, ""); - } else { - testMethods[i].className += ' light' + lineAnalysis.LVS; - } - } -}; -var unhighlightTestMethods = function () { - if (selectedLine !== null) { - return; - } - - var testMethods = document.getElementsByClassName('testmethod'); - for (i = 0, l = testMethods.length; i < l; i++) { - testMethods[i].className = testMethods[i].className.replace(/\s*light.+/g, ""); - } -}; -var coverableLines = document.getElementsByClassName('coverableline'); -for (i = 0, l = coverableLines.length; i < l; i++) { - coverableLines[i].addEventListener('click', toggleLine); - coverableLines[i].addEventListener('mouseenter', highlightTestMethods); - coverableLines[i].addEventListener('mouseleave', unhighlightTestMethods); -} - -/* History charts */ -var renderChart = function (chart) { - // Remove current children (e.g. PNG placeholder) - while (chart.firstChild) { - chart.firstChild.remove(); - } - - var chartData = window[chart.getAttribute('data-data')]; - var options = { - axisY: { - type: undefined, - onlyInteger: true - }, - lineSmooth: false, - low: 0, - high: 100, - scaleMinSpace: 20, - onlyInteger: true, - fullWidth: true - }; - var lineChart = new Chartist.Line(chart, { - labels: [], - series: chartData.series - }, options); - - /* Zoom */ - var zoomButtonDiv = document.createElement("div"); - zoomButtonDiv.className = "toggleZoom"; - var zoomButtonLink = document.createElement("a"); - zoomButtonLink.setAttribute("href", ""); - var zoomButtonText = document.createElement("i"); - zoomButtonText.className = "icon-search-plus"; - - zoomButtonLink.appendChild(zoomButtonText); - zoomButtonDiv.appendChild(zoomButtonLink); - - chart.appendChild(zoomButtonDiv); - - zoomButtonDiv.addEventListener('click', function (event) { - event.preventDefault(); - - if (options.axisY.type === undefined) { - options.axisY.type = Chartist.AutoScaleAxis; - zoomButtonText.className = "icon-search-minus"; - } else { - options.axisY.type = undefined; - zoomButtonText.className = "icon-search-plus"; - } - - lineChart.update(null, options); - }); - - var tooltip = document.createElement("div"); - tooltip.className = "tooltip"; - - chart.appendChild(tooltip); - - /* Tooltips */ - var showToolTip = function () { - var point = this; - var index = [].slice.call(chart.getElementsByClassName('ct-point')).indexOf(point); - - tooltip.innerHTML = chartData.tooltips[index % chartData.tooltips.length]; - tooltip.style.display = 'block'; - }; - - var moveToolTip = function (event) { - var box = chart.getBoundingClientRect(); - var left = event.pageX - box.left - window.pageXOffset; - var top = event.pageY - box.top - window.pageYOffset; - - left = left + 20; - top = top - tooltip.offsetHeight / 2; - - if (left + tooltip.offsetWidth > box.width) { - left -= tooltip.offsetWidth + 40; - } - - if (top < 0) { - top = 0; - } - - if (top + tooltip.offsetHeight > box.height) { - top = box.height - tooltip.offsetHeight; - } - - tooltip.style.left = left + 'px'; - tooltip.style.top = top + 'px'; - }; - - var hideToolTip = function () { - tooltip.style.display = 'none'; - }; - chart.addEventListener('mousemove', moveToolTip); - - lineChart.on('created', function () { - var chartPoints = chart.getElementsByClassName('ct-point'); - for (i = 0, l = chartPoints.length; i < l; i++) { - chartPoints[i].addEventListener('mousemove', showToolTip); - chartPoints[i].addEventListener('mouseout', hideToolTip); - } - }); -}; - -var charts = document.getElementsByClassName('historychart'); -for (i = 0, l = charts.length; i < l; i++) { - renderChart(charts[i]); -} \ No newline at end of file diff --git a/docs/coverage/icon_cube.svg b/docs/coverage/icon_cube.svg deleted file mode 100644 index 3302443c..00000000 --- a/docs/coverage/icon_cube.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/docs/coverage/icon_cube_dark.svg b/docs/coverage/icon_cube_dark.svg deleted file mode 100644 index 3e7f0fa8..00000000 --- a/docs/coverage/icon_cube_dark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/coverage/icon_down-dir_active.svg b/docs/coverage/icon_down-dir_active.svg deleted file mode 100644 index d11cf041..00000000 --- a/docs/coverage/icon_down-dir_active.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/docs/coverage/icon_down-dir_active_dark.svg b/docs/coverage/icon_down-dir_active_dark.svg deleted file mode 100644 index fa34aeb3..00000000 --- a/docs/coverage/icon_down-dir_active_dark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/coverage/icon_fork.svg b/docs/coverage/icon_fork.svg deleted file mode 100644 index f0148b3a..00000000 --- a/docs/coverage/icon_fork.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/docs/coverage/icon_fork_dark.svg b/docs/coverage/icon_fork_dark.svg deleted file mode 100644 index 11930c9b..00000000 --- a/docs/coverage/icon_fork_dark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/coverage/icon_info-circled.svg b/docs/coverage/icon_info-circled.svg deleted file mode 100644 index 252166bb..00000000 --- a/docs/coverage/icon_info-circled.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/docs/coverage/icon_info-circled_dark.svg b/docs/coverage/icon_info-circled_dark.svg deleted file mode 100644 index 252166bb..00000000 --- a/docs/coverage/icon_info-circled_dark.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/docs/coverage/icon_minus.svg b/docs/coverage/icon_minus.svg deleted file mode 100644 index 3c30c365..00000000 --- a/docs/coverage/icon_minus.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/docs/coverage/icon_minus_dark.svg b/docs/coverage/icon_minus_dark.svg deleted file mode 100644 index 2516b6fc..00000000 --- a/docs/coverage/icon_minus_dark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/coverage/icon_plus.svg b/docs/coverage/icon_plus.svg deleted file mode 100644 index 79327232..00000000 --- a/docs/coverage/icon_plus.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/docs/coverage/icon_plus_dark.svg b/docs/coverage/icon_plus_dark.svg deleted file mode 100644 index 6ed4edd0..00000000 --- a/docs/coverage/icon_plus_dark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/coverage/icon_search-minus.svg b/docs/coverage/icon_search-minus.svg deleted file mode 100644 index c174eb5e..00000000 --- a/docs/coverage/icon_search-minus.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/docs/coverage/icon_search-minus_dark.svg b/docs/coverage/icon_search-minus_dark.svg deleted file mode 100644 index 9caaffbc..00000000 --- a/docs/coverage/icon_search-minus_dark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/coverage/icon_search-plus.svg b/docs/coverage/icon_search-plus.svg deleted file mode 100644 index 04b24ecc..00000000 --- a/docs/coverage/icon_search-plus.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/docs/coverage/icon_search-plus_dark.svg b/docs/coverage/icon_search-plus_dark.svg deleted file mode 100644 index 53241945..00000000 --- a/docs/coverage/icon_search-plus_dark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/coverage/icon_sponsor.svg b/docs/coverage/icon_sponsor.svg deleted file mode 100644 index bf6d9591..00000000 --- a/docs/coverage/icon_sponsor.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/docs/coverage/icon_star.svg b/docs/coverage/icon_star.svg deleted file mode 100644 index b23c54ea..00000000 --- a/docs/coverage/icon_star.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/docs/coverage/icon_star_dark.svg b/docs/coverage/icon_star_dark.svg deleted file mode 100644 index 49c0d034..00000000 --- a/docs/coverage/icon_star_dark.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/docs/coverage/icon_up-dir.svg b/docs/coverage/icon_up-dir.svg deleted file mode 100644 index 567c11f3..00000000 --- a/docs/coverage/icon_up-dir.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/docs/coverage/icon_up-dir_active.svg b/docs/coverage/icon_up-dir_active.svg deleted file mode 100644 index bb225544..00000000 --- a/docs/coverage/icon_up-dir_active.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/docs/coverage/icon_wrench.svg b/docs/coverage/icon_wrench.svg deleted file mode 100644 index b6aa318c..00000000 --- a/docs/coverage/icon_wrench.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/docs/coverage/icon_wrench_dark.svg b/docs/coverage/icon_wrench_dark.svg deleted file mode 100644 index 5c77a9c8..00000000 --- a/docs/coverage/icon_wrench_dark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/coverage/index.htm b/docs/coverage/index.htm deleted file mode 100644 index 9dd6d6f5..00000000 --- a/docs/coverage/index.htm +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - -Summary - Coverage Report - -
    -

    SummaryStarSponsor

    - ---- - - - - - - - - - - - - - - - - - - -
    Generated on:16.03.2023 - 20:32:58
    Parser:OpenCoverParser
    Assemblies:1
    Classes:5
    Files:5
    Covered lines:70
    Uncovered lines:82
    Coverable lines:152
    Total lines:342
    Line coverage:46% (70 of 152)
    Covered branches:55
    Total branches:79
    Branch coverage:69.6% (55 of 79)
    Covered methods:16
    Total methods:36
    Method coverage:44.4% (16 of 36)
    -

    Risk Hotspots

    - - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    AssemblyClassMethodCyclomatic complexity NPath complexity Crap Score
    ImageProcessingImageProcessing.Mainmain(...)51630
    ImageProcessingArgumentsArgu.IArgParserTemplate.get_Usage()4420
    ImageProcessingImageArrayProcessingarrayOfImagesProcessing(...)4820
    ImageProcessingImageArrayProcessingInvoke(...)4020
    -
    -

    Coverage

    - - ------------- - - - - - - - - - -
    NameCoveredUncoveredCoverableTotalLine coverageCoveredTotalBranch coverage
    ImageProcessing708215234246%
      
    557969.6%
      
    Agents03939590%
     
    040%
     
    Arguments85133761.5%
      
    71163.6%
      
    CpuImageProcessing6276916789.8%
      
    485096%
      
    ImageArrayProcessing01414420%
     
    060%
     
    ImageProcessing.Main01717370%
     
    080%
     
    -
    -
    - - \ No newline at end of file diff --git a/docs/coverage/index.html b/docs/coverage/index.html deleted file mode 100644 index 9dd6d6f5..00000000 --- a/docs/coverage/index.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - -Summary - Coverage Report - -
    -

    SummaryStarSponsor

    - ---- - - - - - - - - - - - - - - - - - - -
    Generated on:16.03.2023 - 20:32:58
    Parser:OpenCoverParser
    Assemblies:1
    Classes:5
    Files:5
    Covered lines:70
    Uncovered lines:82
    Coverable lines:152
    Total lines:342
    Line coverage:46% (70 of 152)
    Covered branches:55
    Total branches:79
    Branch coverage:69.6% (55 of 79)
    Covered methods:16
    Total methods:36
    Method coverage:44.4% (16 of 36)
    -

    Risk Hotspots

    - - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    AssemblyClassMethodCyclomatic complexity NPath complexity Crap Score
    ImageProcessingImageProcessing.Mainmain(...)51630
    ImageProcessingArgumentsArgu.IArgParserTemplate.get_Usage()4420
    ImageProcessingImageArrayProcessingarrayOfImagesProcessing(...)4820
    ImageProcessingImageArrayProcessingInvoke(...)4020
    -
    -

    Coverage

    - - ------------- - - - - - - - - - -
    NameCoveredUncoveredCoverableTotalLine coverageCoveredTotalBranch coverage
    ImageProcessing708215234246%
      
    557969.6%
      
    Agents03939590%
     
    040%
     
    Arguments85133761.5%
      
    71163.6%
      
    CpuImageProcessing6276916789.8%
      
    485096%
      
    ImageArrayProcessing01414420%
     
    060%
     
    ImageProcessing.Main01717370%
     
    080%
     
    -
    -
    - - \ No newline at end of file diff --git a/docs/coverage/main.js b/docs/coverage/main.js deleted file mode 100644 index 751e2d01..00000000 --- a/docs/coverage/main.js +++ /dev/null @@ -1,313 +0,0 @@ -/* Chartist.js 0.11.0 - * Copyright © 2017 Gion Kunz - * Free to use under either the WTFPL license or the MIT license. - * https://raw.githubusercontent.com/gionkunz/chartist-js/master/LICENSE-WTFPL - * https://raw.githubusercontent.com/gionkunz/chartist-js/master/LICENSE-MIT - */ - -!function (a, b) { "function" == typeof define && define.amd ? define("Chartist", [], function () { return a.Chartist = b() }) : "object" == typeof module && module.exports ? module.exports = b() : a.Chartist = b() }(this, function () { - var a = { version: "0.11.0" }; return function (a, b, c) { "use strict"; c.namespaces = { svg: "http://www.w3.org/2000/svg", xmlns: "http://www.w3.org/2000/xmlns/", xhtml: "http://www.w3.org/1999/xhtml", xlink: "http://www.w3.org/1999/xlink", ct: "http://gionkunz.github.com/chartist-js/ct" }, c.noop = function (a) { return a }, c.alphaNumerate = function (a) { return String.fromCharCode(97 + a % 26) }, c.extend = function (a) { var b, d, e; for (a = a || {}, b = 1; b < arguments.length; b++) { d = arguments[b]; for (var f in d) e = d[f], "object" != typeof e || null === e || e instanceof Array ? a[f] = e : a[f] = c.extend(a[f], e) } return a }, c.replaceAll = function (a, b, c) { return a.replace(new RegExp(b, "g"), c) }, c.ensureUnit = function (a, b) { return "number" == typeof a && (a += b), a }, c.quantity = function (a) { if ("string" == typeof a) { var b = /^(\d+)\s*(.*)$/g.exec(a); return { value: +b[1], unit: b[2] || void 0 } } return { value: a } }, c.querySelector = function (a) { return a instanceof Node ? a : b.querySelector(a) }, c.times = function (a) { return Array.apply(null, new Array(a)) }, c.sum = function (a, b) { return a + (b ? b : 0) }, c.mapMultiply = function (a) { return function (b) { return b * a } }, c.mapAdd = function (a) { return function (b) { return b + a } }, c.serialMap = function (a, b) { var d = [], e = Math.max.apply(null, a.map(function (a) { return a.length })); return c.times(e).forEach(function (c, e) { var f = a.map(function (a) { return a[e] }); d[e] = b.apply(null, f) }), d }, c.roundWithPrecision = function (a, b) { var d = Math.pow(10, b || c.precision); return Math.round(a * d) / d }, c.precision = 8, c.escapingMap = { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }, c.serialize = function (a) { return null === a || void 0 === a ? a : ("number" == typeof a ? a = "" + a : "object" == typeof a && (a = JSON.stringify({ data: a })), Object.keys(c.escapingMap).reduce(function (a, b) { return c.replaceAll(a, b, c.escapingMap[b]) }, a)) }, c.deserialize = function (a) { if ("string" != typeof a) return a; a = Object.keys(c.escapingMap).reduce(function (a, b) { return c.replaceAll(a, c.escapingMap[b], b) }, a); try { a = JSON.parse(a), a = void 0 !== a.data ? a.data : a } catch (b) { } return a }, c.createSvg = function (a, b, d, e) { var f; return b = b || "100%", d = d || "100%", Array.prototype.slice.call(a.querySelectorAll("svg")).filter(function (a) { return a.getAttributeNS(c.namespaces.xmlns, "ct") }).forEach(function (b) { a.removeChild(b) }), f = new c.Svg("svg").attr({ width: b, height: d }).addClass(e), f._node.style.width = b, f._node.style.height = d, a.appendChild(f._node), f }, c.normalizeData = function (a, b, d) { var e, f = { raw: a, normalized: {} }; return f.normalized.series = c.getDataArray({ series: a.series || [] }, b, d), e = f.normalized.series.every(function (a) { return a instanceof Array }) ? Math.max.apply(null, f.normalized.series.map(function (a) { return a.length })) : f.normalized.series.length, f.normalized.labels = (a.labels || []).slice(), Array.prototype.push.apply(f.normalized.labels, c.times(Math.max(0, e - f.normalized.labels.length)).map(function () { return "" })), b && c.reverseData(f.normalized), f }, c.safeHasProperty = function (a, b) { return null !== a && "object" == typeof a && a.hasOwnProperty(b) }, c.isDataHoleValue = function (a) { return null === a || void 0 === a || "number" == typeof a && isNaN(a) }, c.reverseData = function (a) { a.labels.reverse(), a.series.reverse(); for (var b = 0; b < a.series.length; b++)"object" == typeof a.series[b] && void 0 !== a.series[b].data ? a.series[b].data.reverse() : a.series[b] instanceof Array && a.series[b].reverse() }, c.getDataArray = function (a, b, d) { function e(a) { if (c.safeHasProperty(a, "value")) return e(a.value); if (c.safeHasProperty(a, "data")) return e(a.data); if (a instanceof Array) return a.map(e); if (!c.isDataHoleValue(a)) { if (d) { var b = {}; return "string" == typeof d ? b[d] = c.getNumberOrUndefined(a) : b.y = c.getNumberOrUndefined(a), b.x = a.hasOwnProperty("x") ? c.getNumberOrUndefined(a.x) : b.x, b.y = a.hasOwnProperty("y") ? c.getNumberOrUndefined(a.y) : b.y, b } return c.getNumberOrUndefined(a) } } return a.series.map(e) }, c.normalizePadding = function (a, b) { return b = b || 0, "number" == typeof a ? { top: a, right: a, bottom: a, left: a } : { top: "number" == typeof a.top ? a.top : b, right: "number" == typeof a.right ? a.right : b, bottom: "number" == typeof a.bottom ? a.bottom : b, left: "number" == typeof a.left ? a.left : b } }, c.getMetaData = function (a, b) { var c = a.data ? a.data[b] : a[b]; return c ? c.meta : void 0 }, c.orderOfMagnitude = function (a) { return Math.floor(Math.log(Math.abs(a)) / Math.LN10) }, c.projectLength = function (a, b, c) { return b / c.range * a }, c.getAvailableHeight = function (a, b) { return Math.max((c.quantity(b.height).value || a.height()) - (b.chartPadding.top + b.chartPadding.bottom) - b.axisX.offset, 0) }, c.getHighLow = function (a, b, d) { function e(a) { if (void 0 !== a) if (a instanceof Array) for (var b = 0; b < a.length; b++)e(a[b]); else { var c = d ? +a[d] : +a; g && c > f.high && (f.high = c), h && c < f.low && (f.low = c) } } b = c.extend({}, b, d ? b["axis" + d.toUpperCase()] : {}); var f = { high: void 0 === b.high ? -Number.MAX_VALUE : +b.high, low: void 0 === b.low ? Number.MAX_VALUE : +b.low }, g = void 0 === b.high, h = void 0 === b.low; return (g || h) && e(a), (b.referenceValue || 0 === b.referenceValue) && (f.high = Math.max(b.referenceValue, f.high), f.low = Math.min(b.referenceValue, f.low)), f.high <= f.low && (0 === f.low ? f.high = 1 : f.low < 0 ? f.high = 0 : f.high > 0 ? f.low = 0 : (f.high = 1, f.low = 0)), f }, c.isNumeric = function (a) { return null !== a && isFinite(a) }, c.isFalseyButZero = function (a) { return !a && 0 !== a }, c.getNumberOrUndefined = function (a) { return c.isNumeric(a) ? +a : void 0 }, c.isMultiValue = function (a) { return "object" == typeof a && ("x" in a || "y" in a) }, c.getMultiValue = function (a, b) { return c.isMultiValue(a) ? c.getNumberOrUndefined(a[b || "y"]) : c.getNumberOrUndefined(a) }, c.rho = function (a) { function b(a, c) { return a % c === 0 ? c : b(c, a % c) } function c(a) { return a * a + 1 } if (1 === a) return a; var d, e = 2, f = 2; if (a % 2 === 0) return 2; do e = c(e) % a, f = c(c(f)) % a, d = b(Math.abs(e - f), a); while (1 === d); return d }, c.getBounds = function (a, b, d, e) { function f(a, b) { return a === (a += b) && (a *= 1 + (b > 0 ? o : -o)), a } var g, h, i, j = 0, k = { high: b.high, low: b.low }; k.valueRange = k.high - k.low, k.oom = c.orderOfMagnitude(k.valueRange), k.step = Math.pow(10, k.oom), k.min = Math.floor(k.low / k.step) * k.step, k.max = Math.ceil(k.high / k.step) * k.step, k.range = k.max - k.min, k.numberOfSteps = Math.round(k.range / k.step); var l = c.projectLength(a, k.step, k), m = l < d, n = e ? c.rho(k.range) : 0; if (e && c.projectLength(a, 1, k) >= d) k.step = 1; else if (e && n < k.step && c.projectLength(a, n, k) >= d) k.step = n; else for (; ;) { if (m && c.projectLength(a, k.step, k) <= d) k.step *= 2; else { if (m || !(c.projectLength(a, k.step / 2, k) >= d)) break; if (k.step /= 2, e && k.step % 1 !== 0) { k.step *= 2; break } } if (j++ > 1e3) throw new Error("Exceeded maximum number of iterations while optimizing scale step!") } var o = 2.221e-16; for (k.step = Math.max(k.step, o), h = k.min, i = k.max; h + k.step <= k.low;)h = f(h, k.step); for (; i - k.step >= k.high;)i = f(i, -k.step); k.min = h, k.max = i, k.range = k.max - k.min; var p = []; for (g = k.min; g <= k.max; g = f(g, k.step)) { var q = c.roundWithPrecision(g); q !== p[p.length - 1] && p.push(q) } return k.values = p, k }, c.polarToCartesian = function (a, b, c, d) { var e = (d - 90) * Math.PI / 180; return { x: a + c * Math.cos(e), y: b + c * Math.sin(e) } }, c.createChartRect = function (a, b, d) { var e = !(!b.axisX && !b.axisY), f = e ? b.axisY.offset : 0, g = e ? b.axisX.offset : 0, h = a.width() || c.quantity(b.width).value || 0, i = a.height() || c.quantity(b.height).value || 0, j = c.normalizePadding(b.chartPadding, d); h = Math.max(h, f + j.left + j.right), i = Math.max(i, g + j.top + j.bottom); var k = { padding: j, width: function () { return this.x2 - this.x1 }, height: function () { return this.y1 - this.y2 } }; return e ? ("start" === b.axisX.position ? (k.y2 = j.top + g, k.y1 = Math.max(i - j.bottom, k.y2 + 1)) : (k.y2 = j.top, k.y1 = Math.max(i - j.bottom - g, k.y2 + 1)), "start" === b.axisY.position ? (k.x1 = j.left + f, k.x2 = Math.max(h - j.right, k.x1 + 1)) : (k.x1 = j.left, k.x2 = Math.max(h - j.right - f, k.x1 + 1))) : (k.x1 = j.left, k.x2 = Math.max(h - j.right, k.x1 + 1), k.y2 = j.top, k.y1 = Math.max(i - j.bottom, k.y2 + 1)), k }, c.createGrid = function (a, b, d, e, f, g, h, i) { var j = {}; j[d.units.pos + "1"] = a, j[d.units.pos + "2"] = a, j[d.counterUnits.pos + "1"] = e, j[d.counterUnits.pos + "2"] = e + f; var k = g.elem("line", j, h.join(" ")); i.emit("draw", c.extend({ type: "grid", axis: d, index: b, group: g, element: k }, j)) }, c.createGridBackground = function (a, b, c, d) { var e = a.elem("rect", { x: b.x1, y: b.y2, width: b.width(), height: b.height() }, c, !0); d.emit("draw", { type: "gridBackground", group: a, element: e }) }, c.createLabel = function (a, d, e, f, g, h, i, j, k, l, m) { var n, o = {}; if (o[g.units.pos] = a + i[g.units.pos], o[g.counterUnits.pos] = i[g.counterUnits.pos], o[g.units.len] = d, o[g.counterUnits.len] = Math.max(0, h - 10), l) { var p = b.createElement("span"); p.className = k.join(" "), p.setAttribute("xmlns", c.namespaces.xhtml), p.innerText = f[e], p.style[g.units.len] = Math.round(o[g.units.len]) + "px", p.style[g.counterUnits.len] = Math.round(o[g.counterUnits.len]) + "px", n = j.foreignObject(p, c.extend({ style: "overflow: visible;" }, o)) } else n = j.elem("text", o, k.join(" ")).text(f[e]); m.emit("draw", c.extend({ type: "label", axis: g, index: e, group: j, element: n, text: f[e] }, o)) }, c.getSeriesOption = function (a, b, c) { if (a.name && b.series && b.series[a.name]) { var d = b.series[a.name]; return d.hasOwnProperty(c) ? d[c] : b[c] } return b[c] }, c.optionsProvider = function (b, d, e) { function f(b) { var f = h; if (h = c.extend({}, j), d) for (i = 0; i < d.length; i++) { var g = a.matchMedia(d[i][0]); g.matches && (h = c.extend(h, d[i][1])) } e && b && e.emit("optionsChanged", { previousOptions: f, currentOptions: h }) } function g() { k.forEach(function (a) { a.removeListener(f) }) } var h, i, j = c.extend({}, b), k = []; if (!a.matchMedia) throw "window.matchMedia not found! Make sure you're using a polyfill."; if (d) for (i = 0; i < d.length; i++) { var l = a.matchMedia(d[i][0]); l.addListener(f), k.push(l) } return f(), { removeMediaQueryListeners: g, getCurrentOptions: function () { return c.extend({}, h) } } }, c.splitIntoSegments = function (a, b, d) { var e = { increasingX: !1, fillHoles: !1 }; d = c.extend({}, e, d); for (var f = [], g = !0, h = 0; h < a.length; h += 2)void 0 === c.getMultiValue(b[h / 2].value) ? d.fillHoles || (g = !0) : (d.increasingX && h >= 2 && a[h] <= a[h - 2] && (g = !0), g && (f.push({ pathCoordinates: [], valueData: [] }), g = !1), f[f.length - 1].pathCoordinates.push(a[h], a[h + 1]), f[f.length - 1].valueData.push(b[h / 2])); return f } }(window, document, a), function (a, b, c) { "use strict"; c.Interpolation = {}, c.Interpolation.none = function (a) { var b = { fillHoles: !1 }; return a = c.extend({}, b, a), function (b, d) { for (var e = new c.Svg.Path, f = !0, g = 0; g < b.length; g += 2) { var h = b[g], i = b[g + 1], j = d[g / 2]; void 0 !== c.getMultiValue(j.value) ? (f ? e.move(h, i, !1, j) : e.line(h, i, !1, j), f = !1) : a.fillHoles || (f = !0) } return e } }, c.Interpolation.simple = function (a) { var b = { divisor: 2, fillHoles: !1 }; a = c.extend({}, b, a); var d = 1 / Math.max(1, a.divisor); return function (b, e) { for (var f, g, h, i = new c.Svg.Path, j = 0; j < b.length; j += 2) { var k = b[j], l = b[j + 1], m = (k - f) * d, n = e[j / 2]; void 0 !== n.value ? (void 0 === h ? i.move(k, l, !1, n) : i.curve(f + m, g, k - m, l, k, l, !1, n), f = k, g = l, h = n) : a.fillHoles || (f = k = h = void 0) } return i } }, c.Interpolation.cardinal = function (a) { var b = { tension: 1, fillHoles: !1 }; a = c.extend({}, b, a); var d = Math.min(1, Math.max(0, a.tension)), e = 1 - d; return function f(b, g) { var h = c.splitIntoSegments(b, g, { fillHoles: a.fillHoles }); if (h.length) { if (h.length > 1) { var i = []; return h.forEach(function (a) { i.push(f(a.pathCoordinates, a.valueData)) }), c.Svg.Path.join(i) } if (b = h[0].pathCoordinates, g = h[0].valueData, b.length <= 4) return c.Interpolation.none()(b, g); for (var j, k = (new c.Svg.Path).move(b[0], b[1], !1, g[0]), l = 0, m = b.length; m - 2 * !j > l; l += 2) { var n = [{ x: +b[l - 2], y: +b[l - 1] }, { x: +b[l], y: +b[l + 1] }, { x: +b[l + 2], y: +b[l + 3] }, { x: +b[l + 4], y: +b[l + 5] }]; j ? l ? m - 4 === l ? n[3] = { x: +b[0], y: +b[1] } : m - 2 === l && (n[2] = { x: +b[0], y: +b[1] }, n[3] = { x: +b[2], y: +b[3] }) : n[0] = { x: +b[m - 2], y: +b[m - 1] } : m - 4 === l ? n[3] = n[2] : l || (n[0] = { x: +b[l], y: +b[l + 1] }), k.curve(d * (-n[0].x + 6 * n[1].x + n[2].x) / 6 + e * n[2].x, d * (-n[0].y + 6 * n[1].y + n[2].y) / 6 + e * n[2].y, d * (n[1].x + 6 * n[2].x - n[3].x) / 6 + e * n[2].x, d * (n[1].y + 6 * n[2].y - n[3].y) / 6 + e * n[2].y, n[2].x, n[2].y, !1, g[(l + 2) / 2]) } return k } return c.Interpolation.none()([]) } }, c.Interpolation.monotoneCubic = function (a) { var b = { fillHoles: !1 }; return a = c.extend({}, b, a), function d(b, e) { var f = c.splitIntoSegments(b, e, { fillHoles: a.fillHoles, increasingX: !0 }); if (f.length) { if (f.length > 1) { var g = []; return f.forEach(function (a) { g.push(d(a.pathCoordinates, a.valueData)) }), c.Svg.Path.join(g) } if (b = f[0].pathCoordinates, e = f[0].valueData, b.length <= 4) return c.Interpolation.none()(b, e); var h, i, j = [], k = [], l = b.length / 2, m = [], n = [], o = [], p = []; for (h = 0; h < l; h++)j[h] = b[2 * h], k[h] = b[2 * h + 1]; for (h = 0; h < l - 1; h++)o[h] = k[h + 1] - k[h], p[h] = j[h + 1] - j[h], n[h] = o[h] / p[h]; for (m[0] = n[0], m[l - 1] = n[l - 2], h = 1; h < l - 1; h++)0 === n[h] || 0 === n[h - 1] || n[h - 1] > 0 != n[h] > 0 ? m[h] = 0 : (m[h] = 3 * (p[h - 1] + p[h]) / ((2 * p[h] + p[h - 1]) / n[h - 1] + (p[h] + 2 * p[h - 1]) / n[h]), isFinite(m[h]) || (m[h] = 0)); for (i = (new c.Svg.Path).move(j[0], k[0], !1, e[0]), h = 0; h < l - 1; h++)i.curve(j[h] + p[h] / 3, k[h] + m[h] * p[h] / 3, j[h + 1] - p[h] / 3, k[h + 1] - m[h + 1] * p[h] / 3, j[h + 1], k[h + 1], !1, e[h + 1]); return i } return c.Interpolation.none()([]) } }, c.Interpolation.step = function (a) { var b = { postpone: !0, fillHoles: !1 }; return a = c.extend({}, b, a), function (b, d) { for (var e, f, g, h = new c.Svg.Path, i = 0; i < b.length; i += 2) { var j = b[i], k = b[i + 1], l = d[i / 2]; void 0 !== l.value ? (void 0 === g ? h.move(j, k, !1, l) : (a.postpone ? h.line(j, f, !1, g) : h.line(e, k, !1, l), h.line(j, k, !1, l)), e = j, f = k, g = l) : a.fillHoles || (e = f = g = void 0) } return h } } }(window, document, a), function (a, b, c) { "use strict"; c.EventEmitter = function () { function a(a, b) { d[a] = d[a] || [], d[a].push(b) } function b(a, b) { d[a] && (b ? (d[a].splice(d[a].indexOf(b), 1), 0 === d[a].length && delete d[a]) : delete d[a]) } function c(a, b) { d[a] && d[a].forEach(function (a) { a(b) }), d["*"] && d["*"].forEach(function (c) { c(a, b) }) } var d = []; return { addEventHandler: a, removeEventHandler: b, emit: c } } }(window, document, a), function (a, b, c) { "use strict"; function d(a) { var b = []; if (a.length) for (var c = 0; c < a.length; c++)b.push(a[c]); return b } function e(a, b) { var d = b || this.prototype || c.Class, e = Object.create(d); c.Class.cloneDefinitions(e, a); var f = function () { var a, b = e.constructor || function () { }; return a = this === c ? Object.create(e) : this, b.apply(a, Array.prototype.slice.call(arguments, 0)), a }; return f.prototype = e, f["super"] = d, f.extend = this.extend, f } function f() { var a = d(arguments), b = a[0]; return a.splice(1, a.length - 1).forEach(function (a) { Object.getOwnPropertyNames(a).forEach(function (c) { delete b[c], Object.defineProperty(b, c, Object.getOwnPropertyDescriptor(a, c)) }) }), b } c.Class = { extend: e, cloneDefinitions: f } }(window, document, a), function (a, b, c) { "use strict"; function d(a, b, d) { return a && (this.data = a || {}, this.data.labels = this.data.labels || [], this.data.series = this.data.series || [], this.eventEmitter.emit("data", { type: "update", data: this.data })), b && (this.options = c.extend({}, d ? this.options : this.defaultOptions, b), this.initializeTimeoutId || (this.optionsProvider.removeMediaQueryListeners(), this.optionsProvider = c.optionsProvider(this.options, this.responsiveOptions, this.eventEmitter))), this.initializeTimeoutId || this.createChart(this.optionsProvider.getCurrentOptions()), this } function e() { return this.initializeTimeoutId ? a.clearTimeout(this.initializeTimeoutId) : (a.removeEventListener("resize", this.resizeListener), this.optionsProvider.removeMediaQueryListeners()), this } function f(a, b) { return this.eventEmitter.addEventHandler(a, b), this } function g(a, b) { return this.eventEmitter.removeEventHandler(a, b), this } function h() { a.addEventListener("resize", this.resizeListener), this.optionsProvider = c.optionsProvider(this.options, this.responsiveOptions, this.eventEmitter), this.eventEmitter.addEventHandler("optionsChanged", function () { this.update() }.bind(this)), this.options.plugins && this.options.plugins.forEach(function (a) { a instanceof Array ? a[0](this, a[1]) : a(this) }.bind(this)), this.eventEmitter.emit("data", { type: "initial", data: this.data }), this.createChart(this.optionsProvider.getCurrentOptions()), this.initializeTimeoutId = void 0 } function i(a, b, d, e, f) { this.container = c.querySelector(a), this.data = b || {}, this.data.labels = this.data.labels || [], this.data.series = this.data.series || [], this.defaultOptions = d, this.options = e, this.responsiveOptions = f, this.eventEmitter = c.EventEmitter(), this.supportsForeignObject = c.Svg.isSupported("Extensibility"), this.supportsAnimations = c.Svg.isSupported("AnimationEventsAttribute"), this.resizeListener = function () { this.update() }.bind(this), this.container && (this.container.__chartist__ && this.container.__chartist__.detach(), this.container.__chartist__ = this), this.initializeTimeoutId = setTimeout(h.bind(this), 0) } c.Base = c.Class.extend({ constructor: i, optionsProvider: void 0, container: void 0, svg: void 0, eventEmitter: void 0, createChart: function () { throw new Error("Base chart type can't be instantiated!") }, update: d, detach: e, on: f, off: g, version: c.version, supportsForeignObject: !1 }) }(window, document, a), function (a, b, c) { "use strict"; function d(a, d, e, f, g) { a instanceof Element ? this._node = a : (this._node = b.createElementNS(c.namespaces.svg, a), "svg" === a && this.attr({ "xmlns:ct": c.namespaces.ct })), d && this.attr(d), e && this.addClass(e), f && (g && f._node.firstChild ? f._node.insertBefore(this._node, f._node.firstChild) : f._node.appendChild(this._node)) } function e(a, b) { return "string" == typeof a ? b ? this._node.getAttributeNS(b, a) : this._node.getAttribute(a) : (Object.keys(a).forEach(function (b) { if (void 0 !== a[b]) if (b.indexOf(":") !== -1) { var d = b.split(":"); this._node.setAttributeNS(c.namespaces[d[0]], b, a[b]) } else this._node.setAttribute(b, a[b]) }.bind(this)), this) } function f(a, b, d, e) { return new c.Svg(a, b, d, this, e) } function g() { return this._node.parentNode instanceof SVGElement ? new c.Svg(this._node.parentNode) : null } function h() { for (var a = this._node; "svg" !== a.nodeName;)a = a.parentNode; return new c.Svg(a) } function i(a) { var b = this._node.querySelector(a); return b ? new c.Svg(b) : null } function j(a) { var b = this._node.querySelectorAll(a); return b.length ? new c.Svg.List(b) : null } function k() { return this._node } function l(a, d, e, f) { if ("string" == typeof a) { var g = b.createElement("div"); g.innerHTML = a, a = g.firstChild } a.setAttribute("xmlns", c.namespaces.xmlns); var h = this.elem("foreignObject", d, e, f); return h._node.appendChild(a), h } function m(a) { return this._node.appendChild(b.createTextNode(a)), this } function n() { for (; this._node.firstChild;)this._node.removeChild(this._node.firstChild); return this } function o() { return this._node.parentNode.removeChild(this._node), this.parent() } function p(a) { return this._node.parentNode.replaceChild(a._node, this._node), a } function q(a, b) { return b && this._node.firstChild ? this._node.insertBefore(a._node, this._node.firstChild) : this._node.appendChild(a._node), this } function r() { return this._node.getAttribute("class") ? this._node.getAttribute("class").trim().split(/\s+/) : [] } function s(a) { return this._node.setAttribute("class", this.classes(this._node).concat(a.trim().split(/\s+/)).filter(function (a, b, c) { return c.indexOf(a) === b }).join(" ")), this } function t(a) { var b = a.trim().split(/\s+/); return this._node.setAttribute("class", this.classes(this._node).filter(function (a) { return b.indexOf(a) === -1 }).join(" ")), this } function u() { return this._node.setAttribute("class", ""), this } function v() { return this._node.getBoundingClientRect().height } function w() { return this._node.getBoundingClientRect().width } function x(a, b, d) { return void 0 === b && (b = !0), Object.keys(a).forEach(function (e) { function f(a, b) { var f, g, h, i = {}; a.easing && (h = a.easing instanceof Array ? a.easing : c.Svg.Easing[a.easing], delete a.easing), a.begin = c.ensureUnit(a.begin, "ms"), a.dur = c.ensureUnit(a.dur, "ms"), h && (a.calcMode = "spline", a.keySplines = h.join(" "), a.keyTimes = "0;1"), b && (a.fill = "freeze", i[e] = a.from, this.attr(i), g = c.quantity(a.begin || 0).value, a.begin = "indefinite"), f = this.elem("animate", c.extend({ attributeName: e }, a)), b && setTimeout(function () { try { f._node.beginElement() } catch (b) { i[e] = a.to, this.attr(i), f.remove() } }.bind(this), g), d && f._node.addEventListener("beginEvent", function () { d.emit("animationBegin", { element: this, animate: f._node, params: a }) }.bind(this)), f._node.addEventListener("endEvent", function () { d && d.emit("animationEnd", { element: this, animate: f._node, params: a }), b && (i[e] = a.to, this.attr(i), f.remove()) }.bind(this)) } a[e] instanceof Array ? a[e].forEach(function (a) { f.bind(this)(a, !1) }.bind(this)) : f.bind(this)(a[e], b) }.bind(this)), this } function y(a) { var b = this; this.svgElements = []; for (var d = 0; d < a.length; d++)this.svgElements.push(new c.Svg(a[d])); Object.keys(c.Svg.prototype).filter(function (a) { return ["constructor", "parent", "querySelector", "querySelectorAll", "replace", "append", "classes", "height", "width"].indexOf(a) === -1 }).forEach(function (a) { b[a] = function () { var d = Array.prototype.slice.call(arguments, 0); return b.svgElements.forEach(function (b) { c.Svg.prototype[a].apply(b, d) }), b } }) } c.Svg = c.Class.extend({ constructor: d, attr: e, elem: f, parent: g, root: h, querySelector: i, querySelectorAll: j, getNode: k, foreignObject: l, text: m, empty: n, remove: o, replace: p, append: q, classes: r, addClass: s, removeClass: t, removeAllClasses: u, height: v, width: w, animate: x }), c.Svg.isSupported = function (a) { return b.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#" + a, "1.1") }; var z = { easeInSine: [.47, 0, .745, .715], easeOutSine: [.39, .575, .565, 1], easeInOutSine: [.445, .05, .55, .95], easeInQuad: [.55, .085, .68, .53], easeOutQuad: [.25, .46, .45, .94], easeInOutQuad: [.455, .03, .515, .955], easeInCubic: [.55, .055, .675, .19], easeOutCubic: [.215, .61, .355, 1], easeInOutCubic: [.645, .045, .355, 1], easeInQuart: [.895, .03, .685, .22], easeOutQuart: [.165, .84, .44, 1], easeInOutQuart: [.77, 0, .175, 1], easeInQuint: [.755, .05, .855, .06], easeOutQuint: [.23, 1, .32, 1], easeInOutQuint: [.86, 0, .07, 1], easeInExpo: [.95, .05, .795, .035], easeOutExpo: [.19, 1, .22, 1], easeInOutExpo: [1, 0, 0, 1], easeInCirc: [.6, .04, .98, .335], easeOutCirc: [.075, .82, .165, 1], easeInOutCirc: [.785, .135, .15, .86], easeInBack: [.6, -.28, .735, .045], easeOutBack: [.175, .885, .32, 1.275], easeInOutBack: [.68, -.55, .265, 1.55] }; c.Svg.Easing = z, c.Svg.List = c.Class.extend({ constructor: y }) }(window, document, a), function (a, b, c) { "use strict"; function d(a, b, d, e, f, g) { var h = c.extend({ command: f ? a.toLowerCase() : a.toUpperCase() }, b, g ? { data: g } : {}); d.splice(e, 0, h) } function e(a, b) { a.forEach(function (c, d) { u[c.command.toLowerCase()].forEach(function (e, f) { b(c, e, d, f, a) }) }) } function f(a, b) { this.pathElements = [], this.pos = 0, this.close = a, this.options = c.extend({}, v, b) } function g(a) { return void 0 !== a ? (this.pos = Math.max(0, Math.min(this.pathElements.length, a)), this) : this.pos } function h(a) { return this.pathElements.splice(this.pos, a), this } function i(a, b, c, e) { return d("M", { x: +a, y: +b }, this.pathElements, this.pos++, c, e), this } function j(a, b, c, e) { return d("L", { x: +a, y: +b }, this.pathElements, this.pos++, c, e), this } function k(a, b, c, e, f, g, h, i) { return d("C", { x1: +a, y1: +b, x2: +c, y2: +e, x: +f, y: +g }, this.pathElements, this.pos++, h, i), this } function l(a, b, c, e, f, g, h, i, j) { return d("A", { rx: +a, ry: +b, xAr: +c, lAf: +e, sf: +f, x: +g, y: +h }, this.pathElements, this.pos++, i, j), this } function m(a) { var b = a.replace(/([A-Za-z])([0-9])/g, "$1 $2").replace(/([0-9])([A-Za-z])/g, "$1 $2").split(/[\s,]+/).reduce(function (a, b) { return b.match(/[A-Za-z]/) && a.push([]), a[a.length - 1].push(b), a }, []); "Z" === b[b.length - 1][0].toUpperCase() && b.pop(); var d = b.map(function (a) { var b = a.shift(), d = u[b.toLowerCase()]; return c.extend({ command: b }, d.reduce(function (b, c, d) { return b[c] = +a[d], b }, {})) }), e = [this.pos, 0]; return Array.prototype.push.apply(e, d), Array.prototype.splice.apply(this.pathElements, e), this.pos += d.length, this } function n() { var a = Math.pow(10, this.options.accuracy); return this.pathElements.reduce(function (b, c) { var d = u[c.command.toLowerCase()].map(function (b) { return this.options.accuracy ? Math.round(c[b] * a) / a : c[b] }.bind(this)); return b + c.command + d.join(",") }.bind(this), "") + (this.close ? "Z" : "") } function o(a, b) { return e(this.pathElements, function (c, d) { c[d] *= "x" === d[0] ? a : b }), this } function p(a, b) { return e(this.pathElements, function (c, d) { c[d] += "x" === d[0] ? a : b }), this } function q(a) { return e(this.pathElements, function (b, c, d, e, f) { var g = a(b, c, d, e, f); (g || 0 === g) && (b[c] = g) }), this } function r(a) { var b = new c.Svg.Path(a || this.close); return b.pos = this.pos, b.pathElements = this.pathElements.slice().map(function (a) { return c.extend({}, a) }), b.options = c.extend({}, this.options), b } function s(a) { var b = [new c.Svg.Path]; return this.pathElements.forEach(function (d) { d.command === a.toUpperCase() && 0 !== b[b.length - 1].pathElements.length && b.push(new c.Svg.Path), b[b.length - 1].pathElements.push(d) }), b } function t(a, b, d) { for (var e = new c.Svg.Path(b, d), f = 0; f < a.length; f++)for (var g = a[f], h = 0; h < g.pathElements.length; h++)e.pathElements.push(g.pathElements[h]); return e } var u = { m: ["x", "y"], l: ["x", "y"], c: ["x1", "y1", "x2", "y2", "x", "y"], a: ["rx", "ry", "xAr", "lAf", "sf", "x", "y"] }, v = { accuracy: 3 }; c.Svg.Path = c.Class.extend({ constructor: f, position: g, remove: h, move: i, line: j, curve: k, arc: l, scale: o, translate: p, transform: q, parse: m, stringify: n, clone: r, splitByCommand: s }), c.Svg.Path.elementDescriptions = u, c.Svg.Path.join = t }(window, document, a), function (a, b, c) { "use strict"; function d(a, b, c, d) { this.units = a, this.counterUnits = a === f.x ? f.y : f.x, this.chartRect = b, this.axisLength = b[a.rectEnd] - b[a.rectStart], this.gridOffset = b[a.rectOffset], this.ticks = c, this.options = d } function e(a, b, d, e, f) { var g = e["axis" + this.units.pos.toUpperCase()], h = this.ticks.map(this.projectValue.bind(this)), i = this.ticks.map(g.labelInterpolationFnc); h.forEach(function (j, k) { var l, m = { x: 0, y: 0 }; l = h[k + 1] ? h[k + 1] - j : Math.max(this.axisLength - j, 30), c.isFalseyButZero(i[k]) && "" !== i[k] || ("x" === this.units.pos ? (j = this.chartRect.x1 + j, m.x = e.axisX.labelOffset.x, "start" === e.axisX.position ? m.y = this.chartRect.padding.top + e.axisX.labelOffset.y + (d ? 5 : 20) : m.y = this.chartRect.y1 + e.axisX.labelOffset.y + (d ? 5 : 20)) : (j = this.chartRect.y1 - j, m.y = e.axisY.labelOffset.y - (d ? l : 0), "start" === e.axisY.position ? m.x = d ? this.chartRect.padding.left + e.axisY.labelOffset.x : this.chartRect.x1 - 10 : m.x = this.chartRect.x2 + e.axisY.labelOffset.x + 10), g.showGrid && c.createGrid(j, k, this, this.gridOffset, this.chartRect[this.counterUnits.len](), a, [e.classNames.grid, e.classNames[this.units.dir]], f), g.showLabel && c.createLabel(j, l, k, i, this, g.offset, m, b, [e.classNames.label, e.classNames[this.units.dir], "start" === g.position ? e.classNames[g.position] : e.classNames.end], d, f)) }.bind(this)) } var f = { x: { pos: "x", len: "width", dir: "horizontal", rectStart: "x1", rectEnd: "x2", rectOffset: "y2" }, y: { pos: "y", len: "height", dir: "vertical", rectStart: "y2", rectEnd: "y1", rectOffset: "x1" } }; c.Axis = c.Class.extend({ constructor: d, createGridAndLabels: e, projectValue: function (a, b, c) { throw new Error("Base axis can't be instantiated!") } }), c.Axis.units = f }(window, document, a), function (a, b, c) { "use strict"; function d(a, b, d, e) { var f = e.highLow || c.getHighLow(b, e, a.pos); this.bounds = c.getBounds(d[a.rectEnd] - d[a.rectStart], f, e.scaleMinSpace || 20, e.onlyInteger), this.range = { min: this.bounds.min, max: this.bounds.max }, c.AutoScaleAxis["super"].constructor.call(this, a, d, this.bounds.values, e) } function e(a) { return this.axisLength * (+c.getMultiValue(a, this.units.pos) - this.bounds.min) / this.bounds.range } c.AutoScaleAxis = c.Axis.extend({ constructor: d, projectValue: e }) }(window, document, a), function (a, b, c) { "use strict"; function d(a, b, d, e) { var f = e.highLow || c.getHighLow(b, e, a.pos); this.divisor = e.divisor || 1, this.ticks = e.ticks || c.times(this.divisor).map(function (a, b) { return f.low + (f.high - f.low) / this.divisor * b }.bind(this)), this.ticks.sort(function (a, b) { return a - b }), this.range = { min: f.low, max: f.high }, c.FixedScaleAxis["super"].constructor.call(this, a, d, this.ticks, e), this.stepLength = this.axisLength / this.divisor } function e(a) { return this.axisLength * (+c.getMultiValue(a, this.units.pos) - this.range.min) / (this.range.max - this.range.min) } c.FixedScaleAxis = c.Axis.extend({ constructor: d, projectValue: e }) }(window, document, a), function (a, b, c) { "use strict"; function d(a, b, d, e) { c.StepAxis["super"].constructor.call(this, a, d, e.ticks, e); var f = Math.max(1, e.ticks.length - (e.stretch ? 1 : 0)); this.stepLength = this.axisLength / f } function e(a, b) { return this.stepLength * b } c.StepAxis = c.Axis.extend({ constructor: d, projectValue: e }) }(window, document, a), function (a, b, c) { "use strict"; function d(a) { var b = c.normalizeData(this.data, a.reverseData, !0); this.svg = c.createSvg(this.container, a.width, a.height, a.classNames.chart); var d, e, g = this.svg.elem("g").addClass(a.classNames.gridGroup), h = this.svg.elem("g"), i = this.svg.elem("g").addClass(a.classNames.labelGroup), j = c.createChartRect(this.svg, a, f.padding); d = void 0 === a.axisX.type ? new c.StepAxis(c.Axis.units.x, b.normalized.series, j, c.extend({}, a.axisX, { ticks: b.normalized.labels, stretch: a.fullWidth })) : a.axisX.type.call(c, c.Axis.units.x, b.normalized.series, j, a.axisX), e = void 0 === a.axisY.type ? new c.AutoScaleAxis(c.Axis.units.y, b.normalized.series, j, c.extend({}, a.axisY, { high: c.isNumeric(a.high) ? a.high : a.axisY.high, low: c.isNumeric(a.low) ? a.low : a.axisY.low })) : a.axisY.type.call(c, c.Axis.units.y, b.normalized.series, j, a.axisY), d.createGridAndLabels(g, i, this.supportsForeignObject, a, this.eventEmitter), e.createGridAndLabels(g, i, this.supportsForeignObject, a, this.eventEmitter), a.showGridBackground && c.createGridBackground(g, j, a.classNames.gridBackground, this.eventEmitter), b.raw.series.forEach(function (f, g) { var i = h.elem("g"); i.attr({ "ct:series-name": f.name, "ct:meta": c.serialize(f.meta) }), i.addClass([a.classNames.series, f.className || a.classNames.series + "-" + c.alphaNumerate(g)].join(" ")); var k = [], l = []; b.normalized.series[g].forEach(function (a, h) { var i = { x: j.x1 + d.projectValue(a, h, b.normalized.series[g]), y: j.y1 - e.projectValue(a, h, b.normalized.series[g]) }; k.push(i.x, i.y), l.push({ value: a, valueIndex: h, meta: c.getMetaData(f, h) }) }.bind(this)); var m = { lineSmooth: c.getSeriesOption(f, a, "lineSmooth"), showPoint: c.getSeriesOption(f, a, "showPoint"), showLine: c.getSeriesOption(f, a, "showLine"), showArea: c.getSeriesOption(f, a, "showArea"), areaBase: c.getSeriesOption(f, a, "areaBase") }, n = "function" == typeof m.lineSmooth ? m.lineSmooth : m.lineSmooth ? c.Interpolation.monotoneCubic() : c.Interpolation.none(), o = n(k, l); if (m.showPoint && o.pathElements.forEach(function (b) { var h = i.elem("line", { x1: b.x, y1: b.y, x2: b.x + .01, y2: b.y }, a.classNames.point).attr({ "ct:value": [b.data.value.x, b.data.value.y].filter(c.isNumeric).join(","), "ct:meta": c.serialize(b.data.meta) }); this.eventEmitter.emit("draw", { type: "point", value: b.data.value, index: b.data.valueIndex, meta: b.data.meta, series: f, seriesIndex: g, axisX: d, axisY: e, group: i, element: h, x: b.x, y: b.y }) }.bind(this)), m.showLine) { var p = i.elem("path", { d: o.stringify() }, a.classNames.line, !0); this.eventEmitter.emit("draw", { type: "line", values: b.normalized.series[g], path: o.clone(), chartRect: j, index: g, series: f, seriesIndex: g, seriesMeta: f.meta, axisX: d, axisY: e, group: i, element: p }) } if (m.showArea && e.range) { var q = Math.max(Math.min(m.areaBase, e.range.max), e.range.min), r = j.y1 - e.projectValue(q); o.splitByCommand("M").filter(function (a) { return a.pathElements.length > 1 }).map(function (a) { var b = a.pathElements[0], c = a.pathElements[a.pathElements.length - 1]; return a.clone(!0).position(0).remove(1).move(b.x, r).line(b.x, b.y).position(a.pathElements.length + 1).line(c.x, r) }).forEach(function (c) { var h = i.elem("path", { d: c.stringify() }, a.classNames.area, !0); this.eventEmitter.emit("draw", { type: "area", values: b.normalized.series[g], path: c.clone(), series: f, seriesIndex: g, axisX: d, axisY: e, chartRect: j, index: g, group: i, element: h }) }.bind(this)) } }.bind(this)), this.eventEmitter.emit("created", { bounds: e.bounds, chartRect: j, axisX: d, axisY: e, svg: this.svg, options: a }) } function e(a, b, d, e) { c.Line["super"].constructor.call(this, a, b, f, c.extend({}, f, d), e) } var f = { axisX: { offset: 30, position: "end", labelOffset: { x: 0, y: 0 }, showLabel: !0, showGrid: !0, labelInterpolationFnc: c.noop, type: void 0 }, axisY: { offset: 40, position: "start", labelOffset: { x: 0, y: 0 }, showLabel: !0, showGrid: !0, labelInterpolationFnc: c.noop, type: void 0, scaleMinSpace: 20, onlyInteger: !1 }, width: void 0, height: void 0, showLine: !0, showPoint: !0, showArea: !1, areaBase: 0, lineSmooth: !0, showGridBackground: !1, low: void 0, high: void 0, chartPadding: { top: 15, right: 15, bottom: 5, left: 10 }, fullWidth: !1, reverseData: !1, classNames: { chart: "ct-chart-line", label: "ct-label", labelGroup: "ct-labels", series: "ct-series", line: "ct-line", point: "ct-point", area: "ct-area", grid: "ct-grid", gridGroup: "ct-grids", gridBackground: "ct-grid-background", vertical: "ct-vertical", horizontal: "ct-horizontal", start: "ct-start", end: "ct-end" } }; c.Line = c.Base.extend({ constructor: e, createChart: d }) }(window, document, a), function (a, b, c) { - "use strict"; function d(a) { - var b, d; a.distributeSeries ? (b = c.normalizeData(this.data, a.reverseData, a.horizontalBars ? "x" : "y"), b.normalized.series = b.normalized.series.map(function (a) { return [a] })) : b = c.normalizeData(this.data, a.reverseData, a.horizontalBars ? "x" : "y"), this.svg = c.createSvg(this.container, a.width, a.height, a.classNames.chart + (a.horizontalBars ? " " + a.classNames.horizontalBars : "")); var e = this.svg.elem("g").addClass(a.classNames.gridGroup), g = this.svg.elem("g"), h = this.svg.elem("g").addClass(a.classNames.labelGroup); if (a.stackBars && 0 !== b.normalized.series.length) { - var i = c.serialMap(b.normalized.series, function () { - return Array.prototype.slice.call(arguments).map(function (a) { return a }).reduce(function (a, b) { return { x: a.x + (b && b.x) || 0, y: a.y + (b && b.y) || 0 } }, { x: 0, y: 0 }) - }); d = c.getHighLow([i], a, a.horizontalBars ? "x" : "y") - } else d = c.getHighLow(b.normalized.series, a, a.horizontalBars ? "x" : "y"); d.high = +a.high || (0 === a.high ? 0 : d.high), d.low = +a.low || (0 === a.low ? 0 : d.low); var j, k, l, m, n, o = c.createChartRect(this.svg, a, f.padding); k = a.distributeSeries && a.stackBars ? b.normalized.labels.slice(0, 1) : b.normalized.labels, a.horizontalBars ? (j = m = void 0 === a.axisX.type ? new c.AutoScaleAxis(c.Axis.units.x, b.normalized.series, o, c.extend({}, a.axisX, { highLow: d, referenceValue: 0 })) : a.axisX.type.call(c, c.Axis.units.x, b.normalized.series, o, c.extend({}, a.axisX, { highLow: d, referenceValue: 0 })), l = n = void 0 === a.axisY.type ? new c.StepAxis(c.Axis.units.y, b.normalized.series, o, { ticks: k }) : a.axisY.type.call(c, c.Axis.units.y, b.normalized.series, o, a.axisY)) : (l = m = void 0 === a.axisX.type ? new c.StepAxis(c.Axis.units.x, b.normalized.series, o, { ticks: k }) : a.axisX.type.call(c, c.Axis.units.x, b.normalized.series, o, a.axisX), j = n = void 0 === a.axisY.type ? new c.AutoScaleAxis(c.Axis.units.y, b.normalized.series, o, c.extend({}, a.axisY, { highLow: d, referenceValue: 0 })) : a.axisY.type.call(c, c.Axis.units.y, b.normalized.series, o, c.extend({}, a.axisY, { highLow: d, referenceValue: 0 }))); var p = a.horizontalBars ? o.x1 + j.projectValue(0) : o.y1 - j.projectValue(0), q = []; l.createGridAndLabels(e, h, this.supportsForeignObject, a, this.eventEmitter), j.createGridAndLabels(e, h, this.supportsForeignObject, a, this.eventEmitter), a.showGridBackground && c.createGridBackground(e, o, a.classNames.gridBackground, this.eventEmitter), b.raw.series.forEach(function (d, e) { var f, h, i = e - (b.raw.series.length - 1) / 2; f = a.distributeSeries && !a.stackBars ? l.axisLength / b.normalized.series.length / 2 : a.distributeSeries && a.stackBars ? l.axisLength / 2 : l.axisLength / b.normalized.series[e].length / 2, h = g.elem("g"), h.attr({ "ct:series-name": d.name, "ct:meta": c.serialize(d.meta) }), h.addClass([a.classNames.series, d.className || a.classNames.series + "-" + c.alphaNumerate(e)].join(" ")), b.normalized.series[e].forEach(function (g, k) { var r, s, t, u; if (u = a.distributeSeries && !a.stackBars ? e : a.distributeSeries && a.stackBars ? 0 : k, r = a.horizontalBars ? { x: o.x1 + j.projectValue(g && g.x ? g.x : 0, k, b.normalized.series[e]), y: o.y1 - l.projectValue(g && g.y ? g.y : 0, u, b.normalized.series[e]) } : { x: o.x1 + l.projectValue(g && g.x ? g.x : 0, u, b.normalized.series[e]), y: o.y1 - j.projectValue(g && g.y ? g.y : 0, k, b.normalized.series[e]) }, l instanceof c.StepAxis && (l.options.stretch || (r[l.units.pos] += f * (a.horizontalBars ? -1 : 1)), r[l.units.pos] += a.stackBars || a.distributeSeries ? 0 : i * a.seriesBarDistance * (a.horizontalBars ? -1 : 1)), t = q[k] || p, q[k] = t - (p - r[l.counterUnits.pos]), void 0 !== g) { var v = {}; v[l.units.pos + "1"] = r[l.units.pos], v[l.units.pos + "2"] = r[l.units.pos], !a.stackBars || "accumulate" !== a.stackMode && a.stackMode ? (v[l.counterUnits.pos + "1"] = p, v[l.counterUnits.pos + "2"] = r[l.counterUnits.pos]) : (v[l.counterUnits.pos + "1"] = t, v[l.counterUnits.pos + "2"] = q[k]), v.x1 = Math.min(Math.max(v.x1, o.x1), o.x2), v.x2 = Math.min(Math.max(v.x2, o.x1), o.x2), v.y1 = Math.min(Math.max(v.y1, o.y2), o.y1), v.y2 = Math.min(Math.max(v.y2, o.y2), o.y1); var w = c.getMetaData(d, k); s = h.elem("line", v, a.classNames.bar).attr({ "ct:value": [g.x, g.y].filter(c.isNumeric).join(","), "ct:meta": c.serialize(w) }), this.eventEmitter.emit("draw", c.extend({ type: "bar", value: g, index: k, meta: w, series: d, seriesIndex: e, axisX: m, axisY: n, chartRect: o, group: h, element: s }, v)) } }.bind(this)) }.bind(this)), this.eventEmitter.emit("created", { bounds: j.bounds, chartRect: o, axisX: m, axisY: n, svg: this.svg, options: a }) - } function e(a, b, d, e) { c.Bar["super"].constructor.call(this, a, b, f, c.extend({}, f, d), e) } var f = { axisX: { offset: 30, position: "end", labelOffset: { x: 0, y: 0 }, showLabel: !0, showGrid: !0, labelInterpolationFnc: c.noop, scaleMinSpace: 30, onlyInteger: !1 }, axisY: { offset: 40, position: "start", labelOffset: { x: 0, y: 0 }, showLabel: !0, showGrid: !0, labelInterpolationFnc: c.noop, scaleMinSpace: 20, onlyInteger: !1 }, width: void 0, height: void 0, high: void 0, low: void 0, referenceValue: 0, chartPadding: { top: 15, right: 15, bottom: 5, left: 10 }, seriesBarDistance: 15, stackBars: !1, stackMode: "accumulate", horizontalBars: !1, distributeSeries: !1, reverseData: !1, showGridBackground: !1, classNames: { chart: "ct-chart-bar", horizontalBars: "ct-horizontal-bars", label: "ct-label", labelGroup: "ct-labels", series: "ct-series", bar: "ct-bar", grid: "ct-grid", gridGroup: "ct-grids", gridBackground: "ct-grid-background", vertical: "ct-vertical", horizontal: "ct-horizontal", start: "ct-start", end: "ct-end" } }; c.Bar = c.Base.extend({ constructor: e, createChart: d }) - }(window, document, a), function (a, b, c) { "use strict"; function d(a, b, c) { var d = b.x > a.x; return d && "explode" === c || !d && "implode" === c ? "start" : d && "implode" === c || !d && "explode" === c ? "end" : "middle" } function e(a) { var b, e, f, h, i, j = c.normalizeData(this.data), k = [], l = a.startAngle; this.svg = c.createSvg(this.container, a.width, a.height, a.donut ? a.classNames.chartDonut : a.classNames.chartPie), e = c.createChartRect(this.svg, a, g.padding), f = Math.min(e.width() / 2, e.height() / 2), i = a.total || j.normalized.series.reduce(function (a, b) { return a + b }, 0); var m = c.quantity(a.donutWidth); "%" === m.unit && (m.value *= f / 100), f -= a.donut && !a.donutSolid ? m.value / 2 : 0, h = "outside" === a.labelPosition || a.donut && !a.donutSolid ? f : "center" === a.labelPosition ? 0 : a.donutSolid ? f - m.value / 2 : f / 2, h += a.labelOffset; var n = { x: e.x1 + e.width() / 2, y: e.y2 + e.height() / 2 }, o = 1 === j.raw.series.filter(function (a) { return a.hasOwnProperty("value") ? 0 !== a.value : 0 !== a }).length; j.raw.series.forEach(function (a, b) { k[b] = this.svg.elem("g", null, null) }.bind(this)), a.showLabel && (b = this.svg.elem("g", null, null)), j.raw.series.forEach(function (e, g) { if (0 !== j.normalized.series[g] || !a.ignoreEmptyValues) { k[g].attr({ "ct:series-name": e.name }), k[g].addClass([a.classNames.series, e.className || a.classNames.series + "-" + c.alphaNumerate(g)].join(" ")); var p = i > 0 ? l + j.normalized.series[g] / i * 360 : 0, q = Math.max(0, l - (0 === g || o ? 0 : .2)); p - q >= 359.99 && (p = q + 359.99); var r, s, t, u = c.polarToCartesian(n.x, n.y, f, q), v = c.polarToCartesian(n.x, n.y, f, p), w = new c.Svg.Path(!a.donut || a.donutSolid).move(v.x, v.y).arc(f, f, 0, p - l > 180, 0, u.x, u.y); a.donut ? a.donutSolid && (t = f - m.value, r = c.polarToCartesian(n.x, n.y, t, l - (0 === g || o ? 0 : .2)), s = c.polarToCartesian(n.x, n.y, t, p), w.line(r.x, r.y), w.arc(t, t, 0, p - l > 180, 1, s.x, s.y)) : w.line(n.x, n.y); var x = a.classNames.slicePie; a.donut && (x = a.classNames.sliceDonut, a.donutSolid && (x = a.classNames.sliceDonutSolid)); var y = k[g].elem("path", { d: w.stringify() }, x); if (y.attr({ "ct:value": j.normalized.series[g], "ct:meta": c.serialize(e.meta) }), a.donut && !a.donutSolid && (y._node.style.strokeWidth = m.value + "px"), this.eventEmitter.emit("draw", { type: "slice", value: j.normalized.series[g], totalDataSum: i, index: g, meta: e.meta, series: e, group: k[g], element: y, path: w.clone(), center: n, radius: f, startAngle: l, endAngle: p }), a.showLabel) { var z; z = 1 === j.raw.series.length ? { x: n.x, y: n.y } : c.polarToCartesian(n.x, n.y, h, l + (p - l) / 2); var A; A = j.normalized.labels && !c.isFalseyButZero(j.normalized.labels[g]) ? j.normalized.labels[g] : j.normalized.series[g]; var B = a.labelInterpolationFnc(A, g); if (B || 0 === B) { var C = b.elem("text", { dx: z.x, dy: z.y, "text-anchor": d(n, z, a.labelDirection) }, a.classNames.label).text("" + B); this.eventEmitter.emit("draw", { type: "label", index: g, group: b, element: C, text: "" + B, x: z.x, y: z.y }) } } l = p } }.bind(this)), this.eventEmitter.emit("created", { chartRect: e, svg: this.svg, options: a }) } function f(a, b, d, e) { c.Pie["super"].constructor.call(this, a, b, g, c.extend({}, g, d), e) } var g = { width: void 0, height: void 0, chartPadding: 5, classNames: { chartPie: "ct-chart-pie", chartDonut: "ct-chart-donut", series: "ct-series", slicePie: "ct-slice-pie", sliceDonut: "ct-slice-donut", sliceDonutSolid: "ct-slice-donut-solid", label: "ct-label" }, startAngle: 0, total: void 0, donut: !1, donutSolid: !1, donutWidth: 60, showLabel: !0, labelOffset: 0, labelPosition: "inside", labelInterpolationFnc: c.noop, labelDirection: "neutral", reverseData: !1, ignoreEmptyValues: !1 }; c.Pie = c.Base.extend({ constructor: f, createChart: e, determineAnchorPosition: d }) }(window, document, a), a -}); - -var i, l, selectedLine = null; - -/* Navigate to hash without browser history entry */ -var navigateToHash = function () { - if (window.history !== undefined && window.history.replaceState !== undefined) { - window.history.replaceState(undefined, undefined, this.getAttribute("href")); - } -}; - -var hashLinks = document.getElementsByClassName('navigatetohash'); -for (i = 0, l = hashLinks.length; i < l; i++) { - hashLinks[i].addEventListener('click', navigateToHash); -} - -/* Switch test method */ -var switchTestMethod = function () { - var method = this.getAttribute("value"); - console.log("Selected test method: " + method); - - var lines, i, l, coverageData, lineAnalysis, cells; - - lines = document.querySelectorAll('.lineAnalysis tr'); - - for (i = 1, l = lines.length; i < l; i++) { - coverageData = JSON.parse(lines[i].getAttribute('data-coverage').replace(/'/g, '"')); - lineAnalysis = coverageData[method]; - cells = lines[i].querySelectorAll('td'); - if (lineAnalysis === undefined) { - lineAnalysis = coverageData.AllTestMethods; - if (lineAnalysis.LVS !== 'gray') { - cells[0].setAttribute('class', 'red'); - cells[1].innerText = cells[1].textContent = '0'; - cells[4].setAttribute('class', 'lightred'); - } - } else { - cells[0].setAttribute('class', lineAnalysis.LVS); - cells[1].innerText = cells[1].textContent = lineAnalysis.VC; - cells[4].setAttribute('class', 'light' + lineAnalysis.LVS); - } - } -}; - -var testMethods = document.getElementsByClassName('switchtestmethod'); -for (i = 0, l = testMethods.length; i < l; i++) { - testMethods[i].addEventListener('change', switchTestMethod); -} - -/* Highlight test method by line */ -var toggleLine = function () { - if (selectedLine === this) { - selectedLine = null; - } else { - selectedLine = null; - unhighlightTestMethods(); - highlightTestMethods.call(this); - selectedLine = this; - } - -}; -var highlightTestMethods = function () { - if (selectedLine !== null) { - return; - } - - var lineAnalysis; - var coverageData = JSON.parse(this.getAttribute('data-coverage').replace(/'/g, '"')); - var testMethods = document.getElementsByClassName('testmethod'); - - for (i = 0, l = testMethods.length; i < l; i++) { - lineAnalysis = coverageData[testMethods[i].id]; - if (lineAnalysis === undefined) { - testMethods[i].className = testMethods[i].className.replace(/\s*light.+/g, ""); - } else { - testMethods[i].className += ' light' + lineAnalysis.LVS; - } - } -}; -var unhighlightTestMethods = function () { - if (selectedLine !== null) { - return; - } - - var testMethods = document.getElementsByClassName('testmethod'); - for (i = 0, l = testMethods.length; i < l; i++) { - testMethods[i].className = testMethods[i].className.replace(/\s*light.+/g, ""); - } -}; -var coverableLines = document.getElementsByClassName('coverableline'); -for (i = 0, l = coverableLines.length; i < l; i++) { - coverableLines[i].addEventListener('click', toggleLine); - coverableLines[i].addEventListener('mouseenter', highlightTestMethods); - coverableLines[i].addEventListener('mouseleave', unhighlightTestMethods); -} - -/* History charts */ -var renderChart = function (chart) { - // Remove current children (e.g. PNG placeholder) - while (chart.firstChild) { - chart.firstChild.remove(); - } - - var chartData = window[chart.getAttribute('data-data')]; - var options = { - axisY: { - type: undefined, - onlyInteger: true - }, - lineSmooth: false, - low: 0, - high: 100, - scaleMinSpace: 20, - onlyInteger: true, - fullWidth: true - }; - var lineChart = new Chartist.Line(chart, { - labels: [], - series: chartData.series - }, options); - - /* Zoom */ - var zoomButtonDiv = document.createElement("div"); - zoomButtonDiv.className = "toggleZoom"; - var zoomButtonLink = document.createElement("a"); - zoomButtonLink.setAttribute("href", ""); - var zoomButtonText = document.createElement("i"); - zoomButtonText.className = "icon-search-plus"; - - zoomButtonLink.appendChild(zoomButtonText); - zoomButtonDiv.appendChild(zoomButtonLink); - - chart.appendChild(zoomButtonDiv); - - zoomButtonDiv.addEventListener('click', function (event) { - event.preventDefault(); - - if (options.axisY.type === undefined) { - options.axisY.type = Chartist.AutoScaleAxis; - zoomButtonText.className = "icon-search-minus"; - } else { - options.axisY.type = undefined; - zoomButtonText.className = "icon-search-plus"; - } - - lineChart.update(null, options); - }); - - var tooltip = document.createElement("div"); - tooltip.className = "tooltip"; - - chart.appendChild(tooltip); - - /* Tooltips */ - var showToolTip = function () { - var point = this; - var index = [].slice.call(chart.getElementsByClassName('ct-point')).indexOf(point); - - tooltip.innerHTML = chartData.tooltips[index % chartData.tooltips.length]; - tooltip.style.display = 'block'; - }; - - var moveToolTip = function (event) { - var box = chart.getBoundingClientRect(); - var left = event.pageX - box.left - window.pageXOffset; - var top = event.pageY - box.top - window.pageYOffset; - - left = left + 20; - top = top - tooltip.offsetHeight / 2; - - if (left + tooltip.offsetWidth > box.width) { - left -= tooltip.offsetWidth + 40; - } - - if (top < 0) { - top = 0; - } - - if (top + tooltip.offsetHeight > box.height) { - top = box.height - tooltip.offsetHeight; - } - - tooltip.style.left = left + 'px'; - tooltip.style.top = top + 'px'; - }; - - var hideToolTip = function () { - tooltip.style.display = 'none'; - }; - chart.addEventListener('mousemove', moveToolTip); - - lineChart.on('created', function () { - var chartPoints = chart.getElementsByClassName('ct-point'); - for (i = 0, l = chartPoints.length; i < l; i++) { - chartPoints[i].addEventListener('mousemove', showToolTip); - chartPoints[i].addEventListener('mouseout', hideToolTip); - } - }); -}; - -var charts = document.getElementsByClassName('historychart'); -for (i = 0, l = charts.length; i < l; i++) { - renderChart(charts[i]); -} - -var assemblies = [ - { - "name": "ImageProcessing", - "classes": [ - { "name": "Agents", "rp": "ImageProcessing_Agents.html", "cl": 0, "ucl": 39, "cal": 39, "tl": 59, "ct": "LineCoverage", "mc": "-", "cb": 0, "tb": 4, "lch": [], "bch": [], "hc": [] }, - { "name": "Arguments", "rp": "ImageProcessing_Arguments.html", "cl": 8, "ucl": 5, "cal": 13, "tl": 37, "ct": "LineCoverage", "mc": "-", "cb": 7, "tb": 11, "lch": [], "bch": [], "hc": [] }, - { "name": "CpuImageProcessing", "rp": "ImageProcessing_CpuImageProcessing.html", "cl": 62, "ucl": 7, "cal": 69, "tl": 167, "ct": "LineCoverage", "mc": "-", "cb": 48, "tb": 50, "lch": [], "bch": [], "hc": [] }, - { "name": "ImageArrayProcessing", "rp": "ImageProcessing_ImageArrayProcessing.html", "cl": 0, "ucl": 14, "cal": 14, "tl": 42, "ct": "LineCoverage", "mc": "-", "cb": 0, "tb": 6, "lch": [], "bch": [], "hc": [] }, - { "name": "ImageProcessing.Main", "rp": "ImageProcessing_Main.html", "cl": 0, "ucl": 17, "cal": 17, "tl": 37, "ct": "LineCoverage", "mc": "-", "cb": 0, "tb": 8, "lch": [], "bch": [], "hc": [] }, - ]}, -]; - -var historicCoverageExecutionTimes = []; - -var riskHotspotMetrics = [ - { "name": "Cyclomatic complexity", "explanationUrl": "https://en.wikipedia.org/wiki/Cyclomatic_complexity" }, - { "name": "NPath complexity", "explanationUrl": "https://modess.io/npath-complexity-cyclomatic-complexity-explained" }, - { "name": "Crap Score", "explanationUrl": "https://googletesting.blogspot.de/2011/02/this-code-is-crap.html" }, -]; - -var riskHotspots = [ - { - "assembly": "ImageProcessing", "class": "ImageProcessing.Main", "reportPath": "ImageProcessing_Main.html", "methodName": "System.Int32 ImageProcessing.Main::main(System.String[])", "methodShortName": "main(...)", "fileIndex": 0, "line": 12, - "metrics": [ - { "value": 5, "exceeded": false }, - { "value": 16, "exceeded": false }, - { "value": 30, "exceeded": true }, - ]}, - { - "assembly": "ImageProcessing", "class": "Arguments", "reportPath": "ImageProcessing_Arguments.html", "methodName": "System.String Arguments/CliArguments::Argu.IArgParserTemplate.get_Usage()", "methodShortName": "Argu.IArgParserTemplate.get_Usage()", "fileIndex": 0, "line": 33, - "metrics": [ - { "value": 4, "exceeded": false }, - { "value": 4, "exceeded": false }, - { "value": 20, "exceeded": true }, - ]}, - { - "assembly": "ImageProcessing", "class": "ImageArrayProcessing", "reportPath": "ImageProcessing_ImageArrayProcessing.html", "methodName": "System.Void ImageArrayProcessing::arrayOfImagesProcessing(System.String,System.String,Microsoft.FSharp.Core.FSharpFunc`2,Agents/AgentStatus)", "methodShortName": "arrayOfImagesProcessing(...)", "fileIndex": 0, "line": 27, - "metrics": [ - { "value": 4, "exceeded": false }, - { "value": 8, "exceeded": false }, - { "value": 20, "exceeded": true }, - ]}, - { - "assembly": "ImageProcessing", "class": "ImageArrayProcessing", "reportPath": "ImageProcessing_ImageArrayProcessing.html", "methodName": "System.Boolean ImageArrayProcessing/filtered@22::Invoke(System.String)", "methodShortName": "Invoke(...)", "fileIndex": 0, "line": 22, - "metrics": [ - { "value": 4, "exceeded": false }, - { "value": 0, "exceeded": false }, - { "value": 20, "exceeded": true }, - ]}, -]; - -var branchCoverageAvailable = true; - - -var translations = { -'top': 'Top:', -'all': 'All', -'assembly': 'Assembly', -'class': 'Class', -'method': 'Method', -'lineCoverage': 'LineCoverage', -'noGrouping': 'No grouping', -'byAssembly': 'By assembly', -'byNamespace': 'By namespace, Level:', -'all': 'All', -'collapseAll': 'Collapse all', -'expandAll': 'Expand all', -'grouping': 'Grouping:', -'filter': 'Filter:', -'name': 'Name', -'covered': 'Covered', -'uncovered': 'Uncovered', -'coverable': 'Coverable', -'total': 'Total', -'coverage': 'Line coverage', -'branchCoverage': 'Branch coverage', -'history': 'Coverage History', -'compareHistory': 'Compare with:', -'date': 'Date', -'allChanges': 'All changes', -'lineCoverageIncreaseOnly': 'Line coverage: Increase only', -'lineCoverageDecreaseOnly': 'Line coverage: Decrease only', -'branchCoverageIncreaseOnly': 'Branch coverage: Increase only', -'branchCoverageDecreaseOnly': 'Branch coverage: Decrease only' -}; - - -(()=>{"use strict";var e,_={},p={};function n(e){var a=p[e];if(void 0!==a)return a.exports;var r=p[e]={exports:{}};return _[e](r,r.exports,n),r.exports}n.m=_,e=[],n.O=(a,r,u,l)=>{if(!r){var c=1/0;for(f=0;f=l)&&Object.keys(n.O).every(d=>n.O[d](r[t]))?r.splice(t--,1):(v=!1,l0&&e[f-1][2]>l;f--)e[f]=e[f-1];e[f]=[r,u,l]},n.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return n.d(a,{a}),a},n.d=(e,a)=>{for(var r in a)n.o(a,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:a[r]})},n.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),(()=>{var e={666:0};n.O.j=u=>0===e[u];var a=(u,l)=>{var t,o,[f,c,v]=l,s=0;for(t in c)n.o(c,t)&&(n.m[t]=c[t]);if(v)var b=v(n);for(u&&u(l);s{!function(e){const n=e.performance;function i(I){n&&n.mark&&n.mark(I)}function r(I,p){n&&n.measure&&n.measure(I,p)}i("Zone");const c=e.__Zone_symbol_prefix||"__zone_symbol__";function u(I){return c+I}const f=!0===e[u("forceDuplicateZoneCheck")];if(e.Zone){if(f||"function"!=typeof e.Zone.__symbol__)throw new Error("Zone already loaded.");return e.Zone}let _=(()=>{class I{constructor(t,o){this._parent=t,this._name=o?o.name||"unnamed":"",this._properties=o&&o.properties||{},this._zoneDelegate=new T(this,this._parent&&this._parent._zoneDelegate,o)}static assertZonePatched(){if(e.Promise!==J.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")}static get root(){let t=I.current;for(;t.parent;)t=t.parent;return t}static get current(){return G.zone}static get currentTask(){return te}static __load_patch(t,o,g=!1){if(J.hasOwnProperty(t)){if(!g&&f)throw Error("Already loaded patch: "+t)}else if(!e["__Zone_disable_"+t]){const P="Zone:"+t;i(P),J[t]=o(e,I,le),r(P,P)}}get parent(){return this._parent}get name(){return this._name}get(t){const o=this.getZoneWith(t);if(o)return o._properties[t]}getZoneWith(t){let o=this;for(;o;){if(o._properties.hasOwnProperty(t))return o;o=o._parent}return null}fork(t){if(!t)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,t)}wrap(t,o){if("function"!=typeof t)throw new Error("Expecting function got: "+t);const g=this._zoneDelegate.intercept(this,t,o),P=this;return function(){return P.runGuarded(g,this,arguments,o)}}run(t,o,g,P){G={parent:G,zone:this};try{return this._zoneDelegate.invoke(this,t,o,g,P)}finally{G=G.parent}}runGuarded(t,o=null,g,P){G={parent:G,zone:this};try{try{return this._zoneDelegate.invoke(this,t,o,g,P)}catch(K){if(this._zoneDelegate.handleError(this,K))throw K}}finally{G=G.parent}}runTask(t,o,g){if(t.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(t.zone||z).name+"; Execution: "+this.name+")");if(t.state===j&&(t.type===R||t.type===M))return;const P=t.state!=X;P&&t._transitionTo(X,O),t.runCount++;const K=te;te=t,G={parent:G,zone:this};try{t.type==M&&t.data&&!t.data.isPeriodic&&(t.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,t,o,g)}catch(l){if(this._zoneDelegate.handleError(this,l))throw l}}finally{t.state!==j&&t.state!==Y&&(t.type==R||t.data&&t.data.isPeriodic?P&&t._transitionTo(O,X):(t.runCount=0,this._updateTaskCount(t,-1),P&&t._transitionTo(j,X,j))),G=G.parent,te=K}}scheduleTask(t){if(t.zone&&t.zone!==this){let g=this;for(;g;){if(g===t.zone)throw Error(`can not reschedule task to ${this.name} which is descendants of the original zone ${t.zone.name}`);g=g.parent}}t._transitionTo(q,j);const o=[];t._zoneDelegates=o,t._zone=this;try{t=this._zoneDelegate.scheduleTask(this,t)}catch(g){throw t._transitionTo(Y,q,j),this._zoneDelegate.handleError(this,g),g}return t._zoneDelegates===o&&this._updateTaskCount(t,1),t.state==q&&t._transitionTo(O,q),t}scheduleMicroTask(t,o,g,P){return this.scheduleTask(new m(v,t,o,g,P,void 0))}scheduleMacroTask(t,o,g,P,K){return this.scheduleTask(new m(M,t,o,g,P,K))}scheduleEventTask(t,o,g,P,K){return this.scheduleTask(new m(R,t,o,g,P,K))}cancelTask(t){if(t.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(t.zone||z).name+"; Execution: "+this.name+")");t._transitionTo(A,O,X);try{this._zoneDelegate.cancelTask(this,t)}catch(o){throw t._transitionTo(Y,A),this._zoneDelegate.handleError(this,o),o}return this._updateTaskCount(t,-1),t._transitionTo(j,A),t.runCount=0,t}_updateTaskCount(t,o){const g=t._zoneDelegates;-1==o&&(t._zoneDelegates=null);for(let P=0;PI.hasTask(t,o),onScheduleTask:(I,p,t,o)=>I.scheduleTask(t,o),onInvokeTask:(I,p,t,o,g,P)=>I.invokeTask(t,o,g,P),onCancelTask:(I,p,t,o)=>I.cancelTask(t,o)};class T{constructor(p,t,o){this._taskCounts={microTask:0,macroTask:0,eventTask:0},this.zone=p,this._parentDelegate=t,this._forkZS=o&&(o&&o.onFork?o:t._forkZS),this._forkDlgt=o&&(o.onFork?t:t._forkDlgt),this._forkCurrZone=o&&(o.onFork?this.zone:t._forkCurrZone),this._interceptZS=o&&(o.onIntercept?o:t._interceptZS),this._interceptDlgt=o&&(o.onIntercept?t:t._interceptDlgt),this._interceptCurrZone=o&&(o.onIntercept?this.zone:t._interceptCurrZone),this._invokeZS=o&&(o.onInvoke?o:t._invokeZS),this._invokeDlgt=o&&(o.onInvoke?t:t._invokeDlgt),this._invokeCurrZone=o&&(o.onInvoke?this.zone:t._invokeCurrZone),this._handleErrorZS=o&&(o.onHandleError?o:t._handleErrorZS),this._handleErrorDlgt=o&&(o.onHandleError?t:t._handleErrorDlgt),this._handleErrorCurrZone=o&&(o.onHandleError?this.zone:t._handleErrorCurrZone),this._scheduleTaskZS=o&&(o.onScheduleTask?o:t._scheduleTaskZS),this._scheduleTaskDlgt=o&&(o.onScheduleTask?t:t._scheduleTaskDlgt),this._scheduleTaskCurrZone=o&&(o.onScheduleTask?this.zone:t._scheduleTaskCurrZone),this._invokeTaskZS=o&&(o.onInvokeTask?o:t._invokeTaskZS),this._invokeTaskDlgt=o&&(o.onInvokeTask?t:t._invokeTaskDlgt),this._invokeTaskCurrZone=o&&(o.onInvokeTask?this.zone:t._invokeTaskCurrZone),this._cancelTaskZS=o&&(o.onCancelTask?o:t._cancelTaskZS),this._cancelTaskDlgt=o&&(o.onCancelTask?t:t._cancelTaskDlgt),this._cancelTaskCurrZone=o&&(o.onCancelTask?this.zone:t._cancelTaskCurrZone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;const g=o&&o.onHasTask;(g||t&&t._hasTaskZS)&&(this._hasTaskZS=g?o:y,this._hasTaskDlgt=t,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=p,o.onScheduleTask||(this._scheduleTaskZS=y,this._scheduleTaskDlgt=t,this._scheduleTaskCurrZone=this.zone),o.onInvokeTask||(this._invokeTaskZS=y,this._invokeTaskDlgt=t,this._invokeTaskCurrZone=this.zone),o.onCancelTask||(this._cancelTaskZS=y,this._cancelTaskDlgt=t,this._cancelTaskCurrZone=this.zone))}fork(p,t){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,p,t):new _(p,t)}intercept(p,t,o){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,p,t,o):t}invoke(p,t,o,g,P){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,p,t,o,g,P):t.apply(o,g)}handleError(p,t){return!this._handleErrorZS||this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,p,t)}scheduleTask(p,t){let o=t;if(this._scheduleTaskZS)this._hasTaskZS&&o._zoneDelegates.push(this._hasTaskDlgtOwner),o=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,p,t),o||(o=t);else if(t.scheduleFn)t.scheduleFn(t);else{if(t.type!=v)throw new Error("Task is missing scheduleFn.");d(t)}return o}invokeTask(p,t,o,g){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,p,t,o,g):t.callback.apply(o,g)}cancelTask(p,t){let o;if(this._cancelTaskZS)o=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,p,t);else{if(!t.cancelFn)throw Error("Task is not cancelable");o=t.cancelFn(t)}return o}hasTask(p,t){try{this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,p,t)}catch(o){this.handleError(p,o)}}_updateTaskCount(p,t){const o=this._taskCounts,g=o[p],P=o[p]=g+t;if(P<0)throw new Error("More tasks executed then were scheduled.");0!=g&&0!=P||this.hasTask(this.zone,{microTask:o.microTask>0,macroTask:o.macroTask>0,eventTask:o.eventTask>0,change:p})}}class m{constructor(p,t,o,g,P,K){if(this._zone=null,this.runCount=0,this._zoneDelegates=null,this._state="notScheduled",this.type=p,this.source=t,this.data=g,this.scheduleFn=P,this.cancelFn=K,!o)throw new Error("callback is not defined");this.callback=o;const l=this;this.invoke=p===R&&g&&g.useG?m.invokeTask:function(){return m.invokeTask.call(e,l,this,arguments)}}static invokeTask(p,t,o){p||(p=this),re++;try{return p.runCount++,p.zone.runTask(p,t,o)}finally{1==re&&L(),re--}}get zone(){return this._zone}get state(){return this._state}cancelScheduleRequest(){this._transitionTo(j,q)}_transitionTo(p,t,o){if(this._state!==t&&this._state!==o)throw new Error(`${this.type} '${this.source}': can not transition to '${p}', expecting state '${t}'${o?" or '"+o+"'":""}, was '${this._state}'.`);this._state=p,p==j&&(this._zoneDelegates=null)}toString(){return this.data&&void 0!==this.data.handleId?this.data.handleId.toString():Object.prototype.toString.call(this)}toJSON(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}}}const S=u("setTimeout"),D=u("Promise"),Z=u("then");let E,B=[],V=!1;function d(I){if(0===re&&0===B.length)if(E||e[D]&&(E=e[D].resolve(0)),E){let p=E[Z];p||(p=E.then),p.call(E,L)}else e[S](L,0);I&&B.push(I)}function L(){if(!V){for(V=!0;B.length;){const I=B;B=[];for(let p=0;pG,onUnhandledError:F,microtaskDrainDone:F,scheduleMicroTask:d,showUncaughtError:()=>!_[u("ignoreConsoleErrorUncaughtError")],patchEventTarget:()=>[],patchOnProperties:F,patchMethod:()=>F,bindArguments:()=>[],patchThen:()=>F,patchMacroTask:()=>F,patchEventPrototype:()=>F,isIEOrEdge:()=>!1,getGlobalObjects:()=>{},ObjectDefineProperty:()=>F,ObjectGetOwnPropertyDescriptor:()=>{},ObjectCreate:()=>{},ArraySlice:()=>[],patchClass:()=>F,wrapWithCurrentZone:()=>F,filterProperties:()=>[],attachOriginToPatched:()=>F,_redefineProperty:()=>F,patchCallbacks:()=>F};let G={parent:null,zone:new _(null,null)},te=null,re=0;function F(){}r("Zone","Zone"),e.Zone=_}("undefined"!=typeof window&&window||"undefined"!=typeof self&&self||global);const ue=Object.getOwnPropertyDescriptor,he=Object.defineProperty,de=Object.getPrototypeOf,Be=Object.create,ut=Array.prototype.slice,Se="addEventListener",Oe="removeEventListener",Ze=Zone.__symbol__(Se),Ie=Zone.__symbol__(Oe),se="true",ie="false",ke=Zone.__symbol__("");function Le(e,n){return Zone.current.wrap(e,n)}function Me(e,n,i,r,c){return Zone.current.scheduleMacroTask(e,n,i,r,c)}const x=Zone.__symbol__,Pe="undefined"!=typeof window,pe=Pe?window:void 0,$=Pe&&pe||"object"==typeof self&&self||global,ht=[null];function Ae(e,n){for(let i=e.length-1;i>=0;i--)"function"==typeof e[i]&&(e[i]=Le(e[i],n+"_"+i));return e}function Fe(e){return!e||!1!==e.writable&&!("function"==typeof e.get&&void 0===e.set)}const Ue="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,Re=!("nw"in $)&&void 0!==$.process&&"[object process]"==={}.toString.call($.process),je=!Re&&!Ue&&!(!Pe||!pe.HTMLElement),We=void 0!==$.process&&"[object process]"==={}.toString.call($.process)&&!Ue&&!(!Pe||!pe.HTMLElement),Ce={},qe=function(e){if(!(e=e||$.event))return;let n=Ce[e.type];n||(n=Ce[e.type]=x("ON_PROPERTY"+e.type));const i=this||e.target||$,r=i[n];let c;if(je&&i===pe&&"error"===e.type){const u=e;c=r&&r.call(this,u.message,u.filename,u.lineno,u.colno,u.error),!0===c&&e.preventDefault()}else c=r&&r.apply(this,arguments),null!=c&&!c&&e.preventDefault();return c};function Xe(e,n,i){let r=ue(e,n);if(!r&&i&&ue(i,n)&&(r={enumerable:!0,configurable:!0}),!r||!r.configurable)return;const c=x("on"+n+"patched");if(e.hasOwnProperty(c)&&e[c])return;delete r.writable,delete r.value;const u=r.get,f=r.set,_=n.substr(2);let y=Ce[_];y||(y=Ce[_]=x("ON_PROPERTY"+_)),r.set=function(T){let m=this;!m&&e===$&&(m=$),m&&(m[y]&&m.removeEventListener(_,qe),f&&f.apply(m,ht),"function"==typeof T?(m[y]=T,m.addEventListener(_,qe,!1)):m[y]=null)},r.get=function(){let T=this;if(!T&&e===$&&(T=$),!T)return null;const m=T[y];if(m)return m;if(u){let S=u&&u.call(this);if(S)return r.set.call(this,S),"function"==typeof T.removeAttribute&&T.removeAttribute(n),S}return null},he(e,n,r),e[c]=!0}function Ye(e,n,i){if(n)for(let r=0;rfunction(f,_){const y=i(f,_);return y.cbIdx>=0&&"function"==typeof _[y.cbIdx]?Me(y.name,_[y.cbIdx],y,c):u.apply(f,_)})}function ae(e,n){e[x("OriginalDelegate")]=n}let $e=!1,He=!1;function mt(){if($e)return He;$e=!0;try{const e=pe.navigator.userAgent;(-1!==e.indexOf("MSIE ")||-1!==e.indexOf("Trident/")||-1!==e.indexOf("Edge/"))&&(He=!0)}catch(e){}return He}Zone.__load_patch("ZoneAwarePromise",(e,n,i)=>{const r=Object.getOwnPropertyDescriptor,c=Object.defineProperty,f=i.symbol,_=[],y=!0===e[f("DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION")],T=f("Promise"),m=f("then");i.onUnhandledError=l=>{if(i.showUncaughtError()){const s=l&&l.rejection;s?console.error("Unhandled Promise rejection:",s instanceof Error?s.message:s,"; Zone:",l.zone.name,"; Task:",l.task&&l.task.source,"; Value:",s,s instanceof Error?s.stack:void 0):console.error(l)}},i.microtaskDrainDone=()=>{for(;_.length;){const l=_.shift();try{l.zone.runGuarded(()=>{throw l.throwOriginal?l.rejection:l})}catch(s){Z(s)}}};const D=f("unhandledPromiseRejectionHandler");function Z(l){i.onUnhandledError(l);try{const s=n[D];"function"==typeof s&&s.call(this,l)}catch(s){}}function B(l){return l&&l.then}function V(l){return l}function E(l){return t.reject(l)}const d=f("state"),L=f("value"),z=f("finally"),j=f("parentPromiseValue"),q=f("parentPromiseState"),X=null,A=!0,Y=!1;function M(l,s){return a=>{try{G(l,s,a)}catch(h){G(l,!1,h)}}}const le=f("currentTaskTrace");function G(l,s,a){const h=function(){let l=!1;return function(a){return function(){l||(l=!0,a.apply(null,arguments))}}}();if(l===a)throw new TypeError("Promise resolved with itself");if(l[d]===X){let w=null;try{("object"==typeof a||"function"==typeof a)&&(w=a&&a.then)}catch(C){return h(()=>{G(l,!1,C)})(),l}if(s!==Y&&a instanceof t&&a.hasOwnProperty(d)&&a.hasOwnProperty(L)&&a[d]!==X)re(a),G(l,a[d],a[L]);else if(s!==Y&&"function"==typeof w)try{w.call(a,h(M(l,s)),h(M(l,!1)))}catch(C){h(()=>{G(l,!1,C)})()}else{l[d]=s;const C=l[L];if(l[L]=a,l[z]===z&&s===A&&(l[d]=l[q],l[L]=l[j]),s===Y&&a instanceof Error){const k=n.currentTask&&n.currentTask.data&&n.currentTask.data.__creationTrace__;k&&c(a,le,{configurable:!0,enumerable:!1,writable:!0,value:k})}for(let k=0;k{try{const b=l[L],N=!!a&&z===a[z];N&&(a[j]=b,a[q]=C);const H=s.run(k,void 0,N&&k!==E&&k!==V?[]:[b]);G(a,!0,H)}catch(b){G(a,!1,b)}},a)}const p=function(){};class t{static toString(){return"function ZoneAwarePromise() { [native code] }"}static resolve(s){return G(new this(null),A,s)}static reject(s){return G(new this(null),Y,s)}static race(s){let a,h,w=new this((b,N)=>{a=b,h=N});function C(b){a(b)}function k(b){h(b)}for(let b of s)B(b)||(b=this.resolve(b)),b.then(C,k);return w}static all(s){return t.allWithCallback(s)}static allSettled(s){return(this&&this.prototype instanceof t?this:t).allWithCallback(s,{thenCallback:h=>({status:"fulfilled",value:h}),errorCallback:h=>({status:"rejected",reason:h})})}static allWithCallback(s,a){let h,w,C=new this((H,U)=>{h=H,w=U}),k=2,b=0;const N=[];for(let H of s){B(H)||(H=this.resolve(H));const U=b;try{H.then(Q=>{N[U]=a?a.thenCallback(Q):Q,k--,0===k&&h(N)},Q=>{a?(N[U]=a.errorCallback(Q),k--,0===k&&h(N)):w(Q)})}catch(Q){w(Q)}k++,b++}return k-=2,0===k&&h(N),C}constructor(s){const a=this;if(!(a instanceof t))throw new Error("Must be an instanceof Promise.");a[d]=X,a[L]=[];try{s&&s(M(a,A),M(a,Y))}catch(h){G(a,!1,h)}}get[Symbol.toStringTag](){return"Promise"}get[Symbol.species](){return t}then(s,a){let h=this.constructor[Symbol.species];(!h||"function"!=typeof h)&&(h=this.constructor||t);const w=new h(p),C=n.current;return this[d]==X?this[L].push(C,w,s,a):F(this,C,w,s,a),w}catch(s){return this.then(null,s)}finally(s){let a=this.constructor[Symbol.species];(!a||"function"!=typeof a)&&(a=t);const h=new a(p);h[z]=z;const w=n.current;return this[d]==X?this[L].push(w,h,s,s):F(this,w,h,s,s),h}}t.resolve=t.resolve,t.reject=t.reject,t.race=t.race,t.all=t.all;const o=e[T]=e.Promise;e.Promise=t;const g=f("thenPatched");function P(l){const s=l.prototype,a=r(s,"then");if(a&&(!1===a.writable||!a.configurable))return;const h=s.then;s[m]=h,l.prototype.then=function(w,C){return new t((b,N)=>{h.call(this,b,N)}).then(w,C)},l[g]=!0}return i.patchThen=P,o&&(P(o),ce(e,"fetch",l=>function(l){return function(s,a){let h=l.apply(s,a);if(h instanceof t)return h;let w=h.constructor;return w[g]||P(w),h}}(l))),Promise[n.__symbol__("uncaughtPromiseErrors")]=_,t}),Zone.__load_patch("toString",e=>{const n=Function.prototype.toString,i=x("OriginalDelegate"),r=x("Promise"),c=x("Error"),u=function(){if("function"==typeof this){const T=this[i];if(T)return"function"==typeof T?n.call(T):Object.prototype.toString.call(T);if(this===Promise){const m=e[r];if(m)return n.call(m)}if(this===Error){const m=e[c];if(m)return n.call(m)}}return n.call(this)};u[i]=n,Function.prototype.toString=u;const f=Object.prototype.toString;Object.prototype.toString=function(){return"function"==typeof Promise&&this instanceof Promise?"[object Promise]":f.call(this)}});let me=!1;if("undefined"!=typeof window)try{const e=Object.defineProperty({},"passive",{get:function(){me=!0}});window.addEventListener("test",e,e),window.removeEventListener("test",e,e)}catch(e){me=!1}const Et={useG:!0},ee={},Ke={},Je=new RegExp("^"+ke+"(\\w+)(true|false)$"),xe=x("propagationStopped");function Qe(e,n){const i=(n?n(e):e)+ie,r=(n?n(e):e)+se,c=ke+i,u=ke+r;ee[e]={},ee[e][ie]=c,ee[e][se]=u}function Tt(e,n,i){const r=i&&i.add||Se,c=i&&i.rm||Oe,u=i&&i.listeners||"eventListeners",f=i&&i.rmAll||"removeAllListeners",_=x(r),y="."+r+":",S=function(E,d,L){if(E.isRemoved)return;const z=E.callback;"object"==typeof z&&z.handleEvent&&(E.callback=q=>z.handleEvent(q),E.originalDelegate=z),E.invoke(E,d,[L]);const j=E.options;j&&"object"==typeof j&&j.once&&d[c].call(d,L.type,E.originalDelegate?E.originalDelegate:E.callback,j)},D=function(E){if(!(E=E||e.event))return;const d=this||E.target||e,L=d[ee[E.type][ie]];if(L)if(1===L.length)S(L[0],d,E);else{const z=L.slice();for(let j=0;jfunction(c,u){c[xe]=!0,r&&r.apply(c,u)})}function yt(e,n,i,r,c){const u=Zone.__symbol__(r);if(n[u])return;const f=n[u]=n[r];n[r]=function(_,y,T){return y&&y.prototype&&c.forEach(function(m){const S=`${i}.${r}::`+m,D=y.prototype;if(D.hasOwnProperty(m)){const Z=e.ObjectGetOwnPropertyDescriptor(D,m);Z&&Z.value?(Z.value=e.wrapWithCurrentZone(Z.value,S),e._redefineProperty(y.prototype,m,Z)):D[m]&&(D[m]=e.wrapWithCurrentZone(D[m],S))}else D[m]&&(D[m]=e.wrapWithCurrentZone(D[m],S))}),f.call(n,_,y,T)},e.attachOriginToPatched(n[r],f)}const Ve=["absolutedeviceorientation","afterinput","afterprint","appinstalled","beforeinstallprompt","beforeprint","beforeunload","devicelight","devicemotion","deviceorientation","deviceorientationabsolute","deviceproximity","hashchange","languagechange","message","mozbeforepaint","offline","online","paint","pageshow","pagehide","popstate","rejectionhandled","storage","unhandledrejection","unload","userproximity","vrdisplayconnected","vrdisplaydisconnected","vrdisplaypresentchange"],wt=["encrypted","waitingforkey","msneedkey","mozinterruptbegin","mozinterruptend"],tt=["load"],nt=["blur","error","focus","load","resize","scroll","messageerror"],Dt=["bounce","finish","start"],rt=["loadstart","progress","abort","error","load","progress","timeout","loadend","readystatechange"],Ee=["upgradeneeded","complete","abort","success","error","blocked","versionchange","close"],St=["close","error","open","message"],Ot=["error","message"],Te=["abort","animationcancel","animationend","animationiteration","auxclick","beforeinput","blur","cancel","canplay","canplaythrough","change","compositionstart","compositionupdate","compositionend","cuechange","click","close","contextmenu","curechange","dblclick","drag","dragend","dragenter","dragexit","dragleave","dragover","drop","durationchange","emptied","ended","error","focus","focusin","focusout","gotpointercapture","input","invalid","keydown","keypress","keyup","load","loadstart","loadeddata","loadedmetadata","lostpointercapture","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","mousewheel","orientationchange","pause","play","playing","pointercancel","pointerdown","pointerenter","pointerleave","pointerlockchange","mozpointerlockchange","webkitpointerlockerchange","pointerlockerror","mozpointerlockerror","webkitpointerlockerror","pointermove","pointout","pointerover","pointerup","progress","ratechange","reset","resize","scroll","seeked","seeking","select","selectionchange","selectstart","show","sort","stalled","submit","suspend","timeupdate","volumechange","touchcancel","touchmove","touchstart","touchend","transitioncancel","transitionend","waiting","wheel"].concat(["webglcontextrestored","webglcontextlost","webglcontextcreationerror"],["autocomplete","autocompleteerror"],["toggle"],["afterscriptexecute","beforescriptexecute","DOMContentLoaded","freeze","fullscreenchange","mozfullscreenchange","webkitfullscreenchange","msfullscreenchange","fullscreenerror","mozfullscreenerror","webkitfullscreenerror","msfullscreenerror","readystatechange","visibilitychange","resume"],Ve,["beforecopy","beforecut","beforepaste","copy","cut","paste","dragstart","loadend","animationstart","search","transitionrun","transitionstart","webkitanimationend","webkitanimationiteration","webkitanimationstart","webkittransitionend"],["activate","afterupdate","ariarequest","beforeactivate","beforedeactivate","beforeeditfocus","beforeupdate","cellchange","controlselect","dataavailable","datasetchanged","datasetcomplete","errorupdate","filterchange","layoutcomplete","losecapture","move","moveend","movestart","propertychange","resizeend","resizestart","rowenter","rowexit","rowsdelete","rowsinserted","command","compassneedscalibration","deactivate","help","mscontentzoom","msmanipulationstatechanged","msgesturechange","msgesturedoubletap","msgestureend","msgesturehold","msgesturestart","msgesturetap","msgotpointercapture","msinertiastart","mslostpointercapture","mspointercancel","mspointerdown","mspointerenter","mspointerhover","mspointerleave","mspointermove","mspointerout","mspointerover","mspointerup","pointerout","mssitemodejumplistitemremoved","msthumbnailclick","stop","storagecommit"]);function ot(e,n,i){if(!i||0===i.length)return n;const r=i.filter(u=>u.target===e);if(!r||0===r.length)return n;const c=r[0].ignoreProperties;return n.filter(u=>-1===c.indexOf(u))}function W(e,n,i,r){e&&Ye(e,ot(e,n,i),r)}Zone.__load_patch("util",(e,n,i)=>{i.patchOnProperties=Ye,i.patchMethod=ce,i.bindArguments=Ae,i.patchMacroTask=_t;const r=n.__symbol__("BLACK_LISTED_EVENTS"),c=n.__symbol__("UNPATCHED_EVENTS");e[c]&&(e[r]=e[c]),e[r]&&(n[r]=n[c]=e[r]),i.patchEventPrototype=gt,i.patchEventTarget=Tt,i.isIEOrEdge=mt,i.ObjectDefineProperty=he,i.ObjectGetOwnPropertyDescriptor=ue,i.ObjectCreate=Be,i.ArraySlice=ut,i.patchClass=ve,i.wrapWithCurrentZone=Le,i.filterProperties=ot,i.attachOriginToPatched=ae,i._redefineProperty=Object.defineProperty,i.patchCallbacks=yt,i.getGlobalObjects=()=>({globalSources:Ke,zoneSymbolEventNames:ee,eventNames:Te,isBrowser:je,isMix:We,isNode:Re,TRUE_STR:se,FALSE_STR:ie,ZONE_SYMBOL_PREFIX:ke,ADD_EVENT_LISTENER_STR:Se,REMOVE_EVENT_LISTENER_STR:Oe})});const Ne=x("zoneTask");function ge(e,n,i,r){let c=null,u=null;i+=r;const f={};function _(T){const m=T.data;return m.args[0]=function(){return T.invoke.apply(this,arguments)},m.handleId=c.apply(e,m.args),T}function y(T){return u.call(e,T.data.handleId)}c=ce(e,n+=r,T=>function(m,S){if("function"==typeof S[0]){const D={isPeriodic:"Interval"===r,delay:"Timeout"===r||"Interval"===r?S[1]||0:void 0,args:S},Z=S[0];S[0]=function(){try{return Z.apply(this,arguments)}finally{D.isPeriodic||("number"==typeof D.handleId?delete f[D.handleId]:D.handleId&&(D.handleId[Ne]=null))}};const B=Me(n,S[0],D,_,y);if(!B)return B;const V=B.data.handleId;return"number"==typeof V?f[V]=B:V&&(V[Ne]=B),V&&V.ref&&V.unref&&"function"==typeof V.ref&&"function"==typeof V.unref&&(B.ref=V.ref.bind(V),B.unref=V.unref.bind(V)),"number"==typeof V||V?V:B}return T.apply(e,S)}),u=ce(e,i,T=>function(m,S){const D=S[0];let Z;"number"==typeof D?Z=f[D]:(Z=D&&D[Ne],Z||(Z=D)),Z&&"string"==typeof Z.type?"notScheduled"!==Z.state&&(Z.cancelFn&&Z.data.isPeriodic||0===Z.runCount)&&("number"==typeof D?delete f[D]:D&&(D[Ne]=null),Z.zone.cancelTask(Z)):T.apply(e,S)})}Zone.__load_patch("legacy",e=>{const n=e[Zone.__symbol__("legacyPatch")];n&&n()}),Zone.__load_patch("queueMicrotask",(e,n,i)=>{i.patchMethod(e,"queueMicrotask",r=>function(c,u){n.current.scheduleMicroTask("queueMicrotask",u[0])})}),Zone.__load_patch("timers",e=>{const n="set",i="clear";ge(e,n,i,"Timeout"),ge(e,n,i,"Interval"),ge(e,n,i,"Immediate")}),Zone.__load_patch("requestAnimationFrame",e=>{ge(e,"request","cancel","AnimationFrame"),ge(e,"mozRequest","mozCancel","AnimationFrame"),ge(e,"webkitRequest","webkitCancel","AnimationFrame")}),Zone.__load_patch("blocking",(e,n)=>{const i=["alert","prompt","confirm"];for(let r=0;rfunction(y,T){return n.current.run(u,e,T,_)})}),Zone.__load_patch("EventTarget",(e,n,i)=>{(function(e,n){n.patchEventPrototype(e,n)})(e,i),function(e,n){if(Zone[n.symbol("patchEventTarget")])return;const{eventNames:i,zoneSymbolEventNames:r,TRUE_STR:c,FALSE_STR:u,ZONE_SYMBOL_PREFIX:f}=n.getGlobalObjects();for(let y=0;y{ve("MutationObserver"),ve("WebKitMutationObserver")}),Zone.__load_patch("IntersectionObserver",(e,n,i)=>{ve("IntersectionObserver")}),Zone.__load_patch("FileReader",(e,n,i)=>{ve("FileReader")}),Zone.__load_patch("on_property",(e,n,i)=>{!function(e,n){if(Re&&!We||Zone[e.symbol("patchEvents")])return;const i="undefined"!=typeof WebSocket,r=n.__Zone_ignore_on_properties;if(je){const f=window,_=function(){try{const e=pe.navigator.userAgent;if(-1!==e.indexOf("MSIE ")||-1!==e.indexOf("Trident/"))return!0}catch(e){}return!1}()?[{target:f,ignoreProperties:["error"]}]:[];W(f,Te.concat(["messageerror"]),r&&r.concat(_),de(f)),W(Document.prototype,Te,r),void 0!==f.SVGElement&&W(f.SVGElement.prototype,Te,r),W(Element.prototype,Te,r),W(HTMLElement.prototype,Te,r),W(HTMLMediaElement.prototype,wt,r),W(HTMLFrameSetElement.prototype,Ve.concat(nt),r),W(HTMLBodyElement.prototype,Ve.concat(nt),r),W(HTMLFrameElement.prototype,tt,r),W(HTMLIFrameElement.prototype,tt,r);const y=f.HTMLMarqueeElement;y&&W(y.prototype,Dt,r);const T=f.Worker;T&&W(T.prototype,Ot,r)}const c=n.XMLHttpRequest;c&&W(c.prototype,rt,r);const u=n.XMLHttpRequestEventTarget;u&&W(u&&u.prototype,rt,r),"undefined"!=typeof IDBIndex&&(W(IDBIndex.prototype,Ee,r),W(IDBRequest.prototype,Ee,r),W(IDBOpenDBRequest.prototype,Ee,r),W(IDBDatabase.prototype,Ee,r),W(IDBTransaction.prototype,Ee,r),W(IDBCursor.prototype,Ee,r)),i&&W(WebSocket.prototype,St,r)}(i,e)}),Zone.__load_patch("customElements",(e,n,i)=>{!function(e,n){const{isBrowser:i,isMix:r}=n.getGlobalObjects();(i||r)&&e.customElements&&"customElements"in e&&n.patchCallbacks(n,e.customElements,"customElements","define",["connectedCallback","disconnectedCallback","adoptedCallback","attributeChangedCallback"])}(e,i)}),Zone.__load_patch("XHR",(e,n)=>{!function(T){const m=T.XMLHttpRequest;if(!m)return;const S=m.prototype;let Z=S[Ze],B=S[Ie];if(!Z){const v=T.XMLHttpRequestEventTarget;if(v){const M=v.prototype;Z=M[Ze],B=M[Ie]}}const V="readystatechange",E="scheduled";function d(v){const M=v.data,R=M.target;R[u]=!1,R[_]=!1;const J=R[c];Z||(Z=R[Ze],B=R[Ie]),J&&B.call(R,V,J);const le=R[c]=()=>{if(R.readyState===R.DONE)if(!M.aborted&&R[u]&&v.state===E){const te=R[n.__symbol__("loadfalse")];if(0!==R.status&&te&&te.length>0){const re=v.invoke;v.invoke=function(){const F=R[n.__symbol__("loadfalse")];for(let I=0;Ifunction(v,M){return v[r]=0==M[2],v[f]=M[1],j.apply(v,M)}),O=x("fetchTaskAborting"),X=x("fetchTaskScheduling"),A=ce(S,"send",()=>function(v,M){if(!0===n.current[X]||v[r])return A.apply(v,M);{const R={target:v,url:v[f],isPeriodic:!1,args:M,aborted:!1},J=Me("XMLHttpRequest.send",L,R,d,z);v&&!0===v[_]&&!R.aborted&&J.state===E&&J.invoke()}}),Y=ce(S,"abort",()=>function(v,M){const R=function(v){return v[i]}(v);if(R&&"string"==typeof R.type){if(null==R.cancelFn||R.data&&R.data.aborted)return;R.zone.cancelTask(R)}else if(!0===n.current[O])return Y.apply(v,M)})}(e);const i=x("xhrTask"),r=x("xhrSync"),c=x("xhrListener"),u=x("xhrScheduled"),f=x("xhrURL"),_=x("xhrErrorBeforeScheduled")}),Zone.__load_patch("geolocation",e=>{e.navigator&&e.navigator.geolocation&&function(e,n){const i=e.constructor.name;for(let r=0;r{const y=function(){return _.apply(this,Ae(arguments,i+"."+c))};return ae(y,_),y})(u)}}}(e.navigator.geolocation,["getCurrentPosition","watchPosition"])}),Zone.__load_patch("PromiseRejectionEvent",(e,n)=>{function i(r){return function(c){et(e,r).forEach(f=>{const _=e.PromiseRejectionEvent;if(_){const y=new _(r,{promise:c.promise,reason:c.rejection});f.invoke(y)}})}}e.PromiseRejectionEvent&&(n[x("unhandledPromiseRejectionHandler")]=i("unhandledrejection"),n[x("rejectionHandledHandler")]=i("rejectionhandled"))})},443:(we,ue,he)=>{he(273)}},we=>{we(we.s=443)}]); - -(self.webpackChunkcoverage_app=self.webpackChunkcoverage_app||[]).push([[179],{255:wo=>{function Mn(Io){return Promise.resolve().then(()=>{var Tn=new Error("Cannot find module '"+Io+"'");throw Tn.code="MODULE_NOT_FOUND",Tn})}Mn.keys=()=>[],Mn.resolve=Mn,Mn.id=255,wo.exports=Mn},15:(wo,Mn,Io)=>{"use strict";function Tn(e){return"function"==typeof e}let ja=!1;const Rt={Promise:void 0,set useDeprecatedSynchronousErrorHandling(e){if(e){const t=new Error;console.warn("DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \n"+t.stack)}else ja&&console.log("RxJS: Back to a better error behavior. Thank you. <3");ja=e},get useDeprecatedSynchronousErrorHandling(){return ja}};function _r(e){setTimeout(()=>{throw e},0)}const $i={closed:!0,next(e){},error(e){if(Rt.useDeprecatedSynchronousErrorHandling)throw e;_r(e)},complete(){}},$a=Array.isArray||(e=>e&&"number"==typeof e.length);function Ua(e){return null!==e&&"object"==typeof e}const Ui=(()=>{function e(t){return Error.call(this),this.message=t?`${t.length} errors occurred during unsubscription:\n${t.map((n,r)=>`${r+1}) ${n.toString()}`).join("\n ")}`:"",this.name="UnsubscriptionError",this.errors=t,this}return e.prototype=Object.create(Error.prototype),e})();class Ee{constructor(t){this.closed=!1,this._parentOrParents=null,this._subscriptions=null,t&&(this._ctorUnsubscribe=!0,this._unsubscribe=t)}unsubscribe(){let t;if(this.closed)return;let{_parentOrParents:n,_ctorUnsubscribe:r,_unsubscribe:o,_subscriptions:i}=this;if(this.closed=!0,this._parentOrParents=null,this._subscriptions=null,n instanceof Ee)n.remove(this);else if(null!==n)for(let s=0;st.concat(n instanceof Ui?n.errors:n),[])}Ee.EMPTY=((e=new Ee).closed=!0,e);const Gi="function"==typeof Symbol?Symbol("rxSubscriber"):"@@rxSubscriber_"+Math.random();class lt extends Ee{constructor(t,n,r){switch(super(),this.syncErrorValue=null,this.syncErrorThrown=!1,this.syncErrorThrowable=!1,this.isStopped=!1,arguments.length){case 0:this.destination=$i;break;case 1:if(!t){this.destination=$i;break}if("object"==typeof t){t instanceof lt?(this.syncErrorThrowable=t.syncErrorThrowable,this.destination=t,t.add(this)):(this.syncErrorThrowable=!0,this.destination=new Gd(this,t));break}default:this.syncErrorThrowable=!0,this.destination=new Gd(this,t,n,r)}}[Gi](){return this}static create(t,n,r){const o=new lt(t,n,r);return o.syncErrorThrowable=!1,o}next(t){this.isStopped||this._next(t)}error(t){this.isStopped||(this.isStopped=!0,this._error(t))}complete(){this.isStopped||(this.isStopped=!0,this._complete())}unsubscribe(){this.closed||(this.isStopped=!0,super.unsubscribe())}_next(t){this.destination.next(t)}_error(t){this.destination.error(t),this.unsubscribe()}_complete(){this.destination.complete(),this.unsubscribe()}_unsubscribeAndRecycle(){const{_parentOrParents:t}=this;return this._parentOrParents=null,this.unsubscribe(),this.closed=!1,this.isStopped=!1,this._parentOrParents=t,this}}class Gd extends lt{constructor(t,n,r,o){super(),this._parentSubscriber=t;let i,s=this;Tn(n)?i=n:n&&(i=n.next,r=n.error,o=n.complete,n!==$i&&(s=Object.create(n),Tn(s.unsubscribe)&&this.add(s.unsubscribe.bind(s)),s.unsubscribe=this.unsubscribe.bind(this))),this._context=s,this._next=i,this._error=r,this._complete=o}next(t){if(!this.isStopped&&this._next){const{_parentSubscriber:n}=this;Rt.useDeprecatedSynchronousErrorHandling&&n.syncErrorThrowable?this.__tryOrSetError(n,this._next,t)&&this.unsubscribe():this.__tryOrUnsub(this._next,t)}}error(t){if(!this.isStopped){const{_parentSubscriber:n}=this,{useDeprecatedSynchronousErrorHandling:r}=Rt;if(this._error)r&&n.syncErrorThrowable?(this.__tryOrSetError(n,this._error,t),this.unsubscribe()):(this.__tryOrUnsub(this._error,t),this.unsubscribe());else if(n.syncErrorThrowable)r?(n.syncErrorValue=t,n.syncErrorThrown=!0):_r(t),this.unsubscribe();else{if(this.unsubscribe(),r)throw t;_r(t)}}}complete(){if(!this.isStopped){const{_parentSubscriber:t}=this;if(this._complete){const n=()=>this._complete.call(this._context);Rt.useDeprecatedSynchronousErrorHandling&&t.syncErrorThrowable?(this.__tryOrSetError(t,n),this.unsubscribe()):(this.__tryOrUnsub(n),this.unsubscribe())}else this.unsubscribe()}}__tryOrUnsub(t,n){try{t.call(this._context,n)}catch(r){if(this.unsubscribe(),Rt.useDeprecatedSynchronousErrorHandling)throw r;_r(r)}}__tryOrSetError(t,n,r){if(!Rt.useDeprecatedSynchronousErrorHandling)throw new Error("bad call");try{n.call(this._context,r)}catch(o){return Rt.useDeprecatedSynchronousErrorHandling?(t.syncErrorValue=o,t.syncErrorThrown=!0,!0):(_r(o),!0)}return!1}_unsubscribe(){const{_parentSubscriber:t}=this;this._context=null,this._parentSubscriber=null,t.unsubscribe()}}const Mo="function"==typeof Symbol&&Symbol.observable||"@@observable";function zd(e){return e}let qe=(()=>{class e{constructor(n){this._isScalar=!1,n&&(this._subscribe=n)}lift(n){const r=new e;return r.source=this,r.operator=n,r}subscribe(n,r,o){const{operator:i}=this,s=function(e,t,n){if(e){if(e instanceof lt)return e;if(e[Gi])return e[Gi]()}return e||t||n?new lt(e,t,n):new lt($i)}(n,r,o);if(s.add(i?i.call(s,this.source):this.source||Rt.useDeprecatedSynchronousErrorHandling&&!s.syncErrorThrowable?this._subscribe(s):this._trySubscribe(s)),Rt.useDeprecatedSynchronousErrorHandling&&s.syncErrorThrowable&&(s.syncErrorThrowable=!1,s.syncErrorThrown))throw s.syncErrorValue;return s}_trySubscribe(n){try{return this._subscribe(n)}catch(r){Rt.useDeprecatedSynchronousErrorHandling&&(n.syncErrorThrown=!0,n.syncErrorValue=r),function(e){for(;e;){const{closed:t,destination:n,isStopped:r}=e;if(t||r)return!1;e=n&&n instanceof lt?n:null}return!0}(n)?n.error(r):console.warn(r)}}forEach(n,r){return new(r=qd(r))((o,i)=>{let s;s=this.subscribe(a=>{try{n(a)}catch(l){i(l),s&&s.unsubscribe()}},i,o)})}_subscribe(n){const{source:r}=this;return r&&r.subscribe(n)}[Mo](){return this}pipe(...n){return 0===n.length?this:function(e){return 0===e.length?zd:1===e.length?e[0]:function(n){return e.reduce((r,o)=>o(r),n)}}(n)(this)}toPromise(n){return new(n=qd(n))((r,o)=>{let i;this.subscribe(s=>i=s,s=>o(s),()=>r(i))})}}return e.create=t=>new e(t),e})();function qd(e){if(e||(e=Rt.Promise||Promise),!e)throw new Error("no Promise impl found");return e}const To=(()=>{function e(){return Error.call(this),this.message="object unsubscribed",this.name="ObjectUnsubscribedError",this}return e.prototype=Object.create(Error.prototype),e})();class pv extends Ee{constructor(t,n){super(),this.subject=t,this.subscriber=n,this.closed=!1}unsubscribe(){if(this.closed)return;this.closed=!0;const t=this.subject,n=t.observers;if(this.subject=null,!n||0===n.length||t.isStopped||t.closed)return;const r=n.indexOf(this.subscriber);-1!==r&&n.splice(r,1)}}class Qd extends lt{constructor(t){super(t),this.destination=t}}let Ga=(()=>{class e extends qe{constructor(){super(),this.observers=[],this.closed=!1,this.isStopped=!1,this.hasError=!1,this.thrownError=null}[Gi](){return new Qd(this)}lift(n){const r=new Kd(this,this);return r.operator=n,r}next(n){if(this.closed)throw new To;if(!this.isStopped){const{observers:r}=this,o=r.length,i=r.slice();for(let s=0;snew Kd(t,n),e})();class Kd extends Ga{constructor(t,n){super(),this.destination=t,this.source=n}next(t){const{destination:n}=this;n&&n.next&&n.next(t)}error(t){const{destination:n}=this;n&&n.error&&this.destination.error(t)}complete(){const{destination:t}=this;t&&t.complete&&this.destination.complete()}_subscribe(t){const{source:n}=this;return n?this.source.subscribe(t):Ee.EMPTY}}function za(e,t){return function(r){if("function"!=typeof e)throw new TypeError("argument is not a function. Are you looking for `mapTo()`?");return r.lift(new mv(e,t))}}class mv{constructor(t,n){this.project=t,this.thisArg=n}call(t,n){return n.subscribe(new _v(t,this.project,this.thisArg))}}class _v extends lt{constructor(t,n,r){super(t),this.project=n,this.count=0,this.thisArg=r||this}_next(t){let n;try{n=this.project.call(this.thisArg,t,this.count++)}catch(r){return void this.destination.error(r)}this.destination.next(n)}}const Yd=e=>t=>{for(let n=0,r=e.length;ne&&"number"==typeof e.length&&"function"!=typeof e;function Jd(e){return!!e&&"function"!=typeof e.subscribe&&"function"==typeof e.then}const Xd=e=>{if(e&&"function"==typeof e[Mo])return(e=>t=>{const n=e[Mo]();if("function"!=typeof n.subscribe)throw new TypeError("Provided object does not correctly implement Symbol.observable");return n.subscribe(t)})(e);if(Zd(e))return Yd(e);if(Jd(e))return(e=>t=>(e.then(n=>{t.closed||(t.next(n),t.complete())},n=>t.error(n)).then(null,_r),t))(e);if(e&&"function"==typeof e[zi])return(e=>t=>{const n=e[zi]();for(;;){let r;try{r=n.next()}catch(o){return t.error(o),t}if(r.done){t.complete();break}if(t.next(r.value),t.closed)break}return"function"==typeof n.return&&t.add(()=>{n.return&&n.return()}),t})(e);{const n=`You provided ${Ua(e)?"an invalid object":`'${e}'`} where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.`;throw new TypeError(n)}};function ef(e,t){return new qe(n=>{const r=new Ee;let o=0;return r.add(t.schedule(function(){o!==e.length?(n.next(e[o++]),n.closed||r.add(this.schedule())):n.complete()})),r})}function Wa(e,t){return t?function(e,t){if(null!=e){if(function(e){return e&&"function"==typeof e[Mo]}(e))return function(e,t){return new qe(n=>{const r=new Ee;return r.add(t.schedule(()=>{const o=e[Mo]();r.add(o.subscribe({next(i){r.add(t.schedule(()=>n.next(i)))},error(i){r.add(t.schedule(()=>n.error(i)))},complete(){r.add(t.schedule(()=>n.complete()))}}))})),r})}(e,t);if(Jd(e))return function(e,t){return new qe(n=>{const r=new Ee;return r.add(t.schedule(()=>e.then(o=>{r.add(t.schedule(()=>{n.next(o),r.add(t.schedule(()=>n.complete()))}))},o=>{r.add(t.schedule(()=>n.error(o)))}))),r})}(e,t);if(Zd(e))return ef(e,t);if(function(e){return e&&"function"==typeof e[zi]}(e)||"string"==typeof e)return function(e,t){if(!e)throw new Error("Iterable cannot be null");return new qe(n=>{const r=new Ee;let o;return r.add(()=>{o&&"function"==typeof o.return&&o.return()}),r.add(t.schedule(()=>{o=e[zi](),r.add(t.schedule(function(){if(n.closed)return;let i,s;try{const a=o.next();i=a.value,s=a.done}catch(a){return void n.error(a)}s?n.complete():(n.next(i),this.schedule())}))})),r})}(e,t)}throw new TypeError((null!==e&&typeof e||e)+" is not observable")}(e,t):e instanceof qe?e:new qe(Xd(e))}class Av extends lt{constructor(t){super(),this.parent=t}_next(t){this.parent.notifyNext(t)}_error(t){this.parent.notifyError(t),this.unsubscribe()}_complete(){this.parent.notifyComplete(),this.unsubscribe()}}class Sv extends lt{notifyNext(t){this.destination.next(t)}notifyError(t){this.destination.error(t)}notifyComplete(){this.destination.complete()}}function tf(e,t,n=Number.POSITIVE_INFINITY){return"function"==typeof t?r=>r.pipe(tf((o,i)=>Wa(e(o,i)).pipe(za((s,a)=>t(o,s,i,a))),n)):("number"==typeof t&&(n=t),r=>r.lift(new Nv(e,n)))}class Nv{constructor(t,n=Number.POSITIVE_INFINITY){this.project=t,this.concurrent=n}call(t,n){return n.subscribe(new Rv(t,this.project,this.concurrent))}}class Rv extends Sv{constructor(t,n,r=Number.POSITIVE_INFINITY){super(t),this.project=n,this.concurrent=r,this.hasCompleted=!1,this.buffer=[],this.active=0,this.index=0}_next(t){this.active0?this._next(t.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()}}function Fv(e=Number.POSITIVE_INFINITY){return tf(zd,e)}function nf(){return function(t){return t.lift(new Vv(t))}}class Vv{constructor(t){this.connectable=t}call(t,n){const{connectable:r}=this;r._refCount++;const o=new kv(t,r),i=n.subscribe(o);return o.closed||(o.connection=r.connect()),i}}class kv extends lt{constructor(t,n){super(t),this.connectable=n}_unsubscribe(){const{connectable:t}=this;if(!t)return void(this.connection=null);this.connectable=null;const n=t._refCount;if(n<=0)return void(this.connection=null);if(t._refCount=n-1,n>1)return void(this.connection=null);const{connection:r}=this,o=t._connection;this.connection=null,o&&(!r||o===r)&&o.unsubscribe()}}class Lv extends qe{constructor(t,n){super(),this.source=t,this.subjectFactory=n,this._refCount=0,this._isComplete=!1}_subscribe(t){return this.getSubject().subscribe(t)}getSubject(){const t=this._subject;return(!t||t.isStopped)&&(this._subject=this.subjectFactory()),this._subject}connect(){let t=this._connection;return t||(this._isComplete=!1,t=this._connection=new Ee,t.add(this.source.subscribe(new Hv(this.getSubject(),this))),t.closed&&(this._connection=null,t=Ee.EMPTY)),t}refCount(){return nf()(this)}}const Bv=(()=>{const e=Lv.prototype;return{operator:{value:null},_refCount:{value:0,writable:!0},_subject:{value:null,writable:!0},_connection:{value:null,writable:!0},_subscribe:{value:e._subscribe},_isComplete:{value:e._isComplete,writable:!0},getSubject:{value:e.getSubject},connect:{value:e.connect},refCount:{value:e.refCount}}})();class Hv extends Qd{constructor(t,n){super(t),this.connectable=n}_error(t){this._unsubscribe(),super._error(t)}_complete(){this.connectable._isComplete=!0,this._unsubscribe(),super._complete()}_unsubscribe(){const t=this.connectable;if(t){this.connectable=null;const n=t._connection;t._refCount=0,t._subject=null,t._connection=null,n&&n.unsubscribe()}}}function Gv(){return new Ga}function ee(e){for(let t in e)if(e[t]===ee)return t;throw Error("Could not find renamed property on target object.")}function qa(e,t){for(const n in t)t.hasOwnProperty(n)&&!e.hasOwnProperty(n)&&(e[n]=t[n])}function W(e){if("string"==typeof e)return e;if(Array.isArray(e))return"["+e.map(W).join(", ")+"]";if(null==e)return""+e;if(e.overriddenName)return`${e.overriddenName}`;if(e.name)return`${e.name}`;const t=e.toString();if(null==t)return""+t;const n=t.indexOf("\n");return-1===n?t:t.substring(0,n)}function Qa(e,t){return null==e||""===e?null===t?"":t:null==t||""===t?e:e+" "+t}const Wv=ee({__forward_ref__:ee});function ue(e){return e.__forward_ref__=ue,e.toString=function(){return W(this())},e}function N(e){return rf(e)?e():e}function rf(e){return"function"==typeof e&&e.hasOwnProperty(Wv)&&e.__forward_ref__===ue}class Qn extends Error{constructor(t,n){super(function(e,t){return`${e?`NG0${e}: `:""}${t}`}(t,n)),this.code=t}}function U(e){return"string"==typeof e?e:null==e?"":String(e)}function Qe(e){return"function"==typeof e?e.name||e.toString():"object"==typeof e&&null!=e&&"function"==typeof e.type?e.type.name||e.type.toString():U(e)}function Wi(e,t){const n=t?` in ${t}`:"";throw new Qn("201",`No provider for ${Qe(e)} found${n}`)}function ut(e,t){null==e&&function(e,t,n,r){throw new Error(`ASSERTION ERROR: ${e}`+(null==r?"":` [Expected=> ${n} ${r} ${t} <=Actual]`))}(t,e,null,"!=")}function te(e){return{token:e.token,providedIn:e.providedIn||null,factory:e.factory,value:void 0}}function Ft(e){return{providers:e.providers||[],imports:e.imports||[]}}function pn(e){return of(e,qi)||of(e,af)}function of(e,t){return e.hasOwnProperty(t)?e[t]:null}function sf(e){return e&&(e.hasOwnProperty(Ya)||e.hasOwnProperty(Xv))?e[Ya]:null}const qi=ee({\u0275prov:ee}),Ya=ee({\u0275inj:ee}),af=ee({ngInjectableDef:ee}),Xv=ee({ngInjectorDef:ee});var O=(()=>((O=O||{})[O.Default=0]="Default",O[O.Host=1]="Host",O[O.Self=2]="Self",O[O.SkipSelf=4]="SkipSelf",O[O.Optional=8]="Optional",O))();let Za;function An(e){const t=Za;return Za=e,t}function lf(e,t,n){const r=pn(e);return r&&"root"==r.providedIn?void 0===r.value?r.value=r.factory():r.value:n&O.Optional?null:void 0!==t?t:void Wi(W(e),"Injector")}function Sn(e){return{toString:e}.toString()}var yt=(()=>((yt=yt||{})[yt.OnPush=0]="OnPush",yt[yt.Default=1]="Default",yt))(),Se=(()=>((Se=Se||{})[Se.Emulated=0]="Emulated",Se[Se.None=2]="None",Se[Se.ShadowDom=3]="ShadowDom",Se))();const tD="undefined"!=typeof globalThis&&globalThis,nD="undefined"!=typeof window&&window,rD="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,oD="undefined"!=typeof global&&global,ne=tD||oD||nD||rD,yr={},ie=[],Qi=ee({\u0275cmp:ee}),Ja=ee({\u0275dir:ee}),Xa=ee({\u0275pipe:ee}),cf=ee({\u0275mod:ee}),iD=ee({\u0275loc:ee}),gn=ee({\u0275fac:ee}),Ao=ee({__NG_ELEMENT_ID__:ee});let sD=0;function xn(e){return Sn(()=>{const n={},r={type:e.type,providersResolver:null,decls:e.decls,vars:e.vars,factory:null,template:e.template||null,consts:e.consts||null,ngContentSelectors:e.ngContentSelectors,hostBindings:e.hostBindings||null,hostVars:e.hostVars||0,hostAttrs:e.hostAttrs||null,contentQueries:e.contentQueries||null,declaredInputs:n,inputs:null,outputs:null,exportAs:e.exportAs||null,onPush:e.changeDetection===yt.OnPush,directiveDefs:null,pipeDefs:null,selectors:e.selectors||ie,viewQuery:e.viewQuery||null,features:e.features||null,data:e.data||{},encapsulation:e.encapsulation||Se.Emulated,id:"c",styles:e.styles||ie,_:null,setInput:null,schemas:e.schemas||null,tView:null},o=e.directives,i=e.features,s=e.pipes;return r.id+=sD++,r.inputs=hf(e.inputs,n),r.outputs=hf(e.outputs),i&&i.forEach(a=>a(r)),r.directiveDefs=o?()=>("function"==typeof o?o():o).map(uf):null,r.pipeDefs=s?()=>("function"==typeof s?s():s).map(df):null,r})}function uf(e){return Ke(e)||function(e){return e[Ja]||null}(e)}function df(e){return function(e){return e[Xa]||null}(e)}const ff={};function mn(e){return Sn(()=>{const t={type:e.type,bootstrap:e.bootstrap||ie,declarations:e.declarations||ie,imports:e.imports||ie,exports:e.exports||ie,transitiveCompileScopes:null,schemas:e.schemas||null,id:e.id||null};return null!=e.id&&(ff[e.id]=e.type),t})}function hf(e,t){if(null==e)return yr;const n={};for(const r in e)if(e.hasOwnProperty(r)){let o=e[r],i=o;Array.isArray(o)&&(i=o[1],o=o[0]),n[o]=r,t&&(t[o]=i)}return n}const L=xn;function ot(e){return{type:e.type,name:e.name,factory:null,pure:!1!==e.pure,onDestroy:e.type.prototype.ngOnDestroy||null}}function Ke(e){return e[Qi]||null}function Ct(e,t){const n=e[cf]||null;if(!n&&!0===t)throw new Error(`Type ${W(e)} does not have '\u0275mod' property.`);return n}const G=11;function Yt(e){return Array.isArray(e)&&"object"==typeof e[1]}function Pt(e){return Array.isArray(e)&&!0===e[1]}function nl(e){return 0!=(8&e.flags)}function Ji(e){return 2==(2&e.flags)}function Xi(e){return 1==(1&e.flags)}function Vt(e){return null!==e.template}function hD(e){return 0!=(512&e[2])}function Xn(e,t){return e.hasOwnProperty(gn)?e[gn]:null}class gf{constructor(t,n,r){this.previousValue=t,this.currentValue=n,this.firstChange=r}isFirstChange(){return this.firstChange}}function ft(){return mf}function mf(e){return e.type.prototype.ngOnChanges&&(e.setInput=_D),mD}function mD(){const e=yf(this),t=null==e?void 0:e.current;if(t){const n=e.previous;if(n===yr)e.previous=t;else for(let r in t)n[r]=t[r];e.current=null,this.ngOnChanges(t)}}function _D(e,t,n,r){const o=yf(e)||function(e,t){return e[_f]=t}(e,{previous:yr,current:null}),i=o.current||(o.current={}),s=o.previous,a=this.declaredInputs[n],l=s[a];i[a]=new gf(l&&l.currentValue,t,s===yr),e[r]=t}ft.ngInherit=!0;const _f="__ngSimpleChanges__";function yf(e){return e[_f]||null}const Cf="http://www.w3.org/2000/svg";let il;function ve(e){return!!e.listen}const Df={createRenderer:(e,t)=>void 0!==il?il:"undefined"!=typeof document?document:void 0};function Me(e){for(;Array.isArray(e);)e=e[0];return e}function es(e,t){return Me(t[e])}function bt(e,t){return Me(t[e.index])}function al(e,t){return e.data[t]}function ht(e,t){const n=t[e];return Yt(n)?n:n[0]}function ll(e){return 128==(128&e[2])}function Rn(e,t){return null==t?null:e[t]}function Ef(e){e[18]=0}function cl(e,t){e[5]+=t;let n=e,r=e[3];for(;null!==r&&(1===t&&1===n[5]||-1===t&&0===n[5]);)r[5]+=t,n=r,r=r[3]}const B={lFrame:Nf(null),bindingsEnabled:!0,isInCheckNoChangesMode:!1};function wf(){return B.bindingsEnabled}function b(){return B.lFrame.lView}function J(){return B.lFrame.tView}function le(e){return B.lFrame.contextLView=e,e[8]}function xe(){let e=If();for(;null!==e&&64===e.type;)e=e.parent;return e}function If(){return B.lFrame.currentTNode}function Zt(e,t){const n=B.lFrame;n.currentTNode=e,n.isParent=t}function ul(){return B.lFrame.isParent}function dl(){B.lFrame.isParent=!1}function ts(){return B.isInCheckNoChangesMode}function ns(e){B.isInCheckNoChangesMode=e}function Ye(){const e=B.lFrame;let t=e.bindingRootIndex;return-1===t&&(t=e.bindingRootIndex=e.tView.bindingStartIndex),t}function wr(){return B.lFrame.bindingIndex++}function _n(e){const t=B.lFrame,n=t.bindingIndex;return t.bindingIndex=t.bindingIndex+e,n}function RD(e,t){const n=B.lFrame;n.bindingIndex=n.bindingRootIndex=e,fl(t)}function fl(e){B.lFrame.currentDirectiveIndex=e}function pl(e){B.lFrame.currentQueryIndex=e}function OD(e){const t=e[1];return 2===t.type?t.declTNode:1===t.type?e[6]:null}function Sf(e,t,n){if(n&O.SkipSelf){let o=t,i=e;for(;!(o=o.parent,null!==o||n&O.Host||(o=OD(i),null===o||(i=i[15],10&o.type))););if(null===o)return!1;t=o,e=i}const r=B.lFrame=xf();return r.currentTNode=t,r.lView=e,!0}function rs(e){const t=xf(),n=e[1];B.lFrame=t,t.currentTNode=n.firstChild,t.lView=e,t.tView=n,t.contextLView=e,t.bindingIndex=n.bindingStartIndex,t.inI18n=!1}function xf(){const e=B.lFrame,t=null===e?null:e.child;return null===t?Nf(e):t}function Nf(e){const t={currentTNode:null,isParent:!0,lView:null,tView:null,selectedIndex:-1,contextLView:null,elementDepthCount:0,currentNamespace:null,currentDirectiveIndex:-1,bindingRootIndex:-1,bindingIndex:-1,currentQueryIndex:0,parent:e,child:null,inI18n:!1};return null!==e&&(e.child=t),t}function Rf(){const e=B.lFrame;return B.lFrame=e.parent,e.currentTNode=null,e.lView=null,e}const Ff=Rf;function os(){const e=Rf();e.isParent=!0,e.tView=null,e.selectedIndex=-1,e.contextLView=null,e.elementDepthCount=0,e.currentDirectiveIndex=-1,e.currentNamespace=null,e.bindingRootIndex=-1,e.bindingIndex=-1,e.currentQueryIndex=0}function Ze(){return B.lFrame.selectedIndex}function Fn(e){B.lFrame.selectedIndex=e}function De(){const e=B.lFrame;return al(e.tView,e.selectedIndex)}function is(e,t){for(let n=t.directiveStart,r=t.directiveEnd;n=r)break}else t[l]<0&&(e[18]+=65536),(a>11>16&&(3&e[2])===t){e[2]+=2048;try{i.call(a)}finally{}}}else try{i.call(a)}finally{}}class Fo{constructor(t,n,r){this.factory=t,this.resolving=!1,this.canSeeViewProviders=n,this.injectImpl=r}}function ls(e,t,n){const r=ve(e);let o=0;for(;ot){s=i-1;break}}}for(;i>16}(e),r=t;for(;n>0;)r=r[15],n--;return r}let yl=!0;function us(e){const t=yl;return yl=e,t}let QD=0;function Po(e,t){const n=vl(e,t);if(-1!==n)return n;const r=t[1];r.firstCreatePass&&(e.injectorIndex=t.length,Cl(r.data,e),Cl(t,null),Cl(r.blueprint,null));const o=ds(e,t),i=e.injectorIndex;if(Lf(o)){const s=Ir(o),a=Mr(o,t),l=a[1].data;for(let c=0;c<8;c++)t[i+c]=a[s+c]|l[s+c]}return t[i+8]=o,i}function Cl(e,t){e.push(0,0,0,0,0,0,0,0,t)}function vl(e,t){return-1===e.injectorIndex||e.parent&&e.parent.injectorIndex===e.injectorIndex||null===t[e.injectorIndex+8]?-1:e.injectorIndex}function ds(e,t){if(e.parent&&-1!==e.parent.injectorIndex)return e.parent.injectorIndex;let n=0,r=null,o=t;for(;null!==o;){const i=o[1],s=i.type;if(r=2===s?i.declTNode:1===s?o[6]:null,null===r)return-1;if(n++,o=o[15],-1!==r.injectorIndex)return r.injectorIndex|n<<16}return-1}function fs(e,t,n){!function(e,t,n){let r;"string"==typeof n?r=n.charCodeAt(0)||0:n.hasOwnProperty(Ao)&&(r=n[Ao]),null==r&&(r=n[Ao]=QD++);const o=255&r;t.data[e+(o>>5)]|=1<=0?255&t:ZD:t}(n);if("function"==typeof i){if(!Sf(t,e,r))return r&O.Host?jf(o,n,r):$f(t,n,r,o);try{const s=i(r);if(null!=s||r&O.Optional)return s;Wi(n)}finally{Ff()}}else if("number"==typeof i){let s=null,a=vl(e,t),l=-1,c=r&O.Host?t[16][6]:null;for((-1===a||r&O.SkipSelf)&&(l=-1===a?ds(e,t):t[a+8],-1!==l&&Wf(r,!1)?(s=t[1],a=Ir(l),t=Mr(l,t)):a=-1);-1!==a;){const u=t[1];if(zf(i,a,u.data)){const d=JD(a,t,n,s,r,c);if(d!==Gf)return d}l=t[a+8],-1!==l&&Wf(r,t[1].data[a+8]===c)&&zf(i,a,t)?(s=u,a=Ir(l),t=Mr(l,t)):a=-1}}}return $f(t,n,r,o)}const Gf={};function ZD(){return new Tr(xe(),b())}function JD(e,t,n,r,o,i){const s=t[1],a=s.data[e+8],u=function(e,t,n,r,o){const i=e.providerIndexes,s=t.data,a=1048575&i,l=e.directiveStart,u=i>>20,f=o?a+u:e.directiveEnd;for(let h=r?a:a+u;h=l&&p.type===n)return h}if(o){const h=s[l];if(h&&Vt(h)&&h.type===n)return l}return null}(a,s,n,null==r?Ji(a)&&yl:r!=s&&0!=(3&a.type),o&O.Host&&i===a);return null!==u?Vo(t,s,u,a):Gf}function Vo(e,t,n,r){let o=e[n];const i=t.data;if(function(e){return e instanceof Fo}(o)){const s=o;s.resolving&&function(e,t){throw new Qn("200",`Circular dependency in DI detected for ${e}`)}(Qe(i[n]));const a=us(s.canSeeViewProviders);s.resolving=!0;const l=s.injectImpl?An(s.injectImpl):null;Sf(e,r,O.Default);try{o=e[n]=s.factory(void 0,i,e,r),t.firstCreatePass&&n>=r.directiveStart&&function(e,t,n){const{ngOnChanges:r,ngOnInit:o,ngDoCheck:i}=t.type.prototype;if(r){const s=mf(t);(n.preOrderHooks||(n.preOrderHooks=[])).push(e,s),(n.preOrderCheckHooks||(n.preOrderCheckHooks=[])).push(e,s)}o&&(n.preOrderHooks||(n.preOrderHooks=[])).push(0-e,o),i&&((n.preOrderHooks||(n.preOrderHooks=[])).push(e,i),(n.preOrderCheckHooks||(n.preOrderCheckHooks=[])).push(e,i))}(n,i[n],t)}finally{null!==l&&An(l),us(a),s.resolving=!1,Ff()}}return o}function zf(e,t,n){return!!(n[t+(e>>5)]&1<{const t=e.prototype.constructor,n=t[gn]||Dl(t),r=Object.prototype;let o=Object.getPrototypeOf(e.prototype).constructor;for(;o&&o!==r;){const i=o[gn]||Dl(o);if(i&&i!==n)return i;o=Object.getPrototypeOf(o)}return i=>new i})}function Dl(e){return rf(e)?()=>{const t=Dl(N(e));return t&&t()}:Xn(e)}const Sr="__parameters__";function er(e,t,n){return Sn(()=>{const r=function(e){return function(...n){if(e){const r=e(...n);for(const o in r)this[o]=r[o]}}}(t);function o(...i){if(this instanceof o)return r.apply(this,i),this;const s=new o(...i);return a.annotation=s,a;function a(l,c,u){const d=l.hasOwnProperty(Sr)?l[Sr]:Object.defineProperty(l,Sr,{value:[]})[Sr];for(;d.length<=u;)d.push(null);return(d[u]=d[u]||[]).push(s),l}}return n&&(o.prototype=Object.create(n.prototype)),o.prototype.ngMetadataName=e,o.annotationCls=o,o})}class X{constructor(t,n){this._desc=t,this.ngMetadataName="InjectionToken",this.\u0275prov=void 0,"number"==typeof n?this.__NG_ELEMENT_ID__=n:void 0!==n&&(this.\u0275prov=te({token:this,providedIn:n.providedIn||"root",factory:n.factory}))}toString(){return`InjectionToken ${this._desc}`}}function Xt(e,t){e.forEach(n=>Array.isArray(n)?Xt(n,t):t(n))}function gs(e,t,n){t>=e.length?e.push(n):e.splice(t,0,n)}function tr(e,t){return t>=e.length-1?e.pop():e.splice(t,1)[0]}function pt(e,t,n){let r=Nr(e,t);return r>=0?e[1|r]=n:(r=~r,function(e,t,n,r){let o=e.length;if(o==t)e.push(n,r);else if(1===o)e.push(r,e[0]),e[0]=n;else{for(o--,e.push(e[o-1],e[o]);o>t;)e[o]=e[o-2],o--;e[t]=n,e[t+1]=r}}(e,r,t,n)),r}function Il(e,t){const n=Nr(e,t);if(n>=0)return e[1|n]}function Nr(e,t){return function(e,t,n){let r=0,o=e.length>>n;for(;o!==r;){const i=r+(o-r>>1),s=e[i<t?o=i:r=i+1}return~(o< ");else if("object"==typeof t){let i=[];for(let s in t)if(t.hasOwnProperty(s)){let a=t[s];i.push(s+":"+("string"==typeof a?JSON.stringify(a):W(a)))}o=`{${i.join(", ")}}`}return`${n}${r?"("+r+")":""}[${o}]: ${e.replace(db,"\n ")}`}("\n"+e.message,o,n,r),e.ngTokenPath=o,e[Rr]=null,e}const Uo=$o(er("Inject",e=>({token:e})),-1),en=$o(er("Optional"),8),rr=$o(er("SkipSelf"),4);class or{constructor(t){this.changingThisBreaksApplicationSecurity=t}toString(){return`SafeValue must use [property]=binding: ${this.changingThisBreaksApplicationSecurity} (see https://g.co/ng/security#xss)`}}function gt(e){return e instanceof or?e.changingThisBreaksApplicationSecurity:e}function tn(e,t){const n=function(e){return e instanceof or&&e.getTypeName()||null}(e);if(null!=n&&n!==t){if("ResourceURL"===n&&"URL"===t)return!0;throw new Error(`Required a safe ${t}, got a ${n} (see https://g.co/ng/security#xss)`)}return n===t}const Lb=/^(?:(?:https?|mailto|ftp|tel|file|sms):|[^&:/?#]*(?:[/?#]|$))/gi,Bb=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+\/]+=*$/i;var ce=(()=>((ce=ce||{})[ce.NONE=0]="NONE",ce[ce.HTML=1]="HTML",ce[ce.STYLE=2]="STYLE",ce[ce.SCRIPT=3]="SCRIPT",ce[ce.URL=4]="URL",ce[ce.RESOURCE_URL=5]="RESOURCE_URL",ce))();function Vr(e){const t=function(){const e=b();return e&&e[12]}();return t?t.sanitize(ce.URL,e)||"":tn(e,"URL")?gt(e):function(e){return(e=String(e)).match(Lb)||e.match(Bb)?e:"unsafe:"+e}(U(e))}const _h="__ngContext__";function He(e,t){e[_h]=t}function Ll(e){const t=function(e){return e[_h]||null}(e);return t?Array.isArray(t)?t:t.lView:null}function bs(e){return e.ngOriginalError}function aE(e,...t){e.error(...t)}class ir{constructor(){this._console=console}handleError(t){const n=this._findOriginalError(t),r=this._findContext(t),o=function(e){return e&&e.ngErrorLogger||aE}(t);o(this._console,"ERROR",t),n&&o(this._console,"ORIGINAL ERROR",n),r&&o(this._console,"ERROR CONTEXT",r)}_findContext(t){return t?function(e){return e.ngDebugContext}(t)||this._findContext(bs(t)):null}_findOriginalError(t){let n=t&&bs(t);for(;n&&bs(n);)n=bs(n);return n||null}}const Mh=(()=>("undefined"!=typeof requestAnimationFrame&&requestAnimationFrame||setTimeout).bind(ne))();function Hl(e){return e.ownerDocument.defaultView}function rn(e){return e instanceof Function?e():e}var mt=(()=>((mt=mt||{})[mt.Important=1]="Important",mt[mt.DashCase=2]="DashCase",mt))();function $l(e,t){return undefined(e,t)}function Ko(e){const t=e[3];return Pt(t)?t[3]:t}function Ul(e){return Nh(e[13])}function Gl(e){return Nh(e[4])}function Nh(e){for(;null!==e&&!Pt(e);)e=e[4];return e}function Lr(e,t,n,r,o){if(null!=r){let i,s=!1;Pt(r)?i=r:Yt(r)&&(s=!0,r=r[0]);const a=Me(r);0===e&&null!==n?null==o?kh(t,n,a):sr(t,n,a,o||null,!0):1===e&&null!==n?sr(t,n,a,o||null,!0):2===e?function(e,t,n){const r=ws(e,t);r&&function(e,t,n,r){ve(e)?e.removeChild(t,n,r):t.removeChild(n)}(e,r,t,n)}(t,a,s):3===e&&t.destroyNode(a),null!=i&&function(e,t,n,r,o){const i=n[7];i!==Me(n)&&Lr(t,e,r,i,o);for(let a=10;a0&&(e[n-1][4]=r[4]);const i=tr(e,10+t);!function(e,t){Yo(e,t,t[G],2,null,null),t[0]=null,t[6]=null}(r[1],r);const s=i[19];null!==s&&s.detachView(i[1]),r[3]=null,r[4]=null,r[2]&=-129}return r}function Oh(e,t){if(!(256&t[2])){const n=t[G];ve(n)&&n.destroyNode&&Yo(e,t,n,3,null,null),function(e){let t=e[13];if(!t)return Ql(e[1],e);for(;t;){let n=null;if(Yt(t))n=t[13];else{const r=t[10];r&&(n=r)}if(!n){for(;t&&!t[4]&&t!==e;)Yt(t)&&Ql(t[1],t),t=t[3];null===t&&(t=e),Yt(t)&&Ql(t[1],t),n=t&&t[4]}t=n}}(t)}}function Ql(e,t){if(!(256&t[2])){t[2]&=-129,t[2]|=256,function(e,t){let n;if(null!=e&&null!=(n=e.destroyHooks))for(let r=0;r=0?r[o=c]():r[o=-c].unsubscribe(),i+=2}else{const s=r[o=n[i+1]];n[i].call(s)}if(null!==r){for(let i=o+1;ii?"":o[d+1].toLowerCase();const h=8&r?f:null;if(h&&-1!==qh(h,c,0)||2&r&&c!==f){if(kt(r))return!1;s=!0}}}}else{if(!s&&!kt(r)&&!kt(l))return!1;if(s&&kt(l))continue;s=!1,r=l|1&r}}return kt(r)||s}function kt(e){return 0==(1&e)}function PE(e,t,n,r){if(null===t)return-1;let o=0;if(r||!n){let i=!1;for(;o-1)for(n++;n0?'="'+a+'"':"")+"]"}else 8&r?o+="."+s:4&r&&(o+=" "+s);else""!==o&&!kt(s)&&(t+=Zh(i,o),o=""),r=s,i=i||!kt(r);n++}return""!==o&&(t+=Zh(i,o)),t}const j={};function g(e){Jh(J(),b(),Ze()+e,ts())}function Jh(e,t,n,r){if(!r)if(3==(3&t[2])){const i=e.preOrderCheckHooks;null!==i&&ss(t,i,n)}else{const i=e.preOrderHooks;null!==i&&as(t,i,0,n)}Fn(n)}function Ts(e,t){return e<<17|t<<2}function Lt(e){return e>>17&32767}function Xl(e){return 2|e}function yn(e){return(131068&e)>>2}function ec(e,t){return-131069&e|t<<2}function tc(e){return 1|e}function lp(e,t){const n=e.contentQueries;if(null!==n)for(let r=0;r20&&Jh(e,t,20,ts()),n(r,o)}finally{Fn(i)}}function up(e,t,n){if(nl(t)){const o=t.directiveEnd;for(let i=t.directiveStart;i0;){const n=e[--t];if("number"==typeof n&&n<0)return n}return 0})(a)!=l&&a.push(l),a.push(r,o,s)}}function yp(e,t){null!==e.hostBindings&&e.hostBindings(1,t)}function Cp(e,t){t.flags|=2,(e.components||(e.components=[])).push(t.index)}function fw(e,t,n){if(n){if(t.exportAs)for(let r=0;r0&&hc(n)}}function hc(e){for(let r=Ul(e);null!==r;r=Gl(r))for(let o=10;o0&&hc(i)}const n=e[1].components;if(null!==n)for(let r=0;r0&&hc(o)}}function Cw(e,t){const n=ht(t,e),r=n[1];(function(e,t){for(let n=t.length;nPromise.resolve(null))();function wp(e){return e[7]||(e[7]=[])}function Ip(e){return e.cleanup||(e.cleanup=[])}function Tp(e,t){const n=e[9],r=n?n.get(ir,null):null;r&&r.handleError(t)}function Ap(e,t,n,r,o){for(let i=0;ithis.processProvider(a,t,n)),Xt([t],a=>this.processInjectorType(a,[],i)),this.records.set($r,Ur(void 0,this));const s=this.records.get(Xo);this.scope=null!=s?s.value:null,this.source=o||("object"==typeof t?null:W(t))}get destroyed(){return this._destroyed}destroy(){this.assertNotDestroyed(),this._destroyed=!0;try{this.onDestroy.forEach(t=>t.ngOnDestroy())}finally{this.records.clear(),this.onDestroy.clear(),this.injectorDefTypes.clear()}}get(t,n=Ho,r=O.Default){this.assertNotDestroyed();const o=Fr(this),i=An(void 0);try{if(!(r&O.SkipSelf)){let a=this.records.get(t);if(void 0===a){const l=function(e){return"function"==typeof e||"object"==typeof e&&e instanceof X}(t)&&pn(t);a=l&&this.injectableDefInScope(l)?Ur(Cc(t),ei):null,this.records.set(t,a)}if(null!=a)return this.hydrate(t,a)}return(r&O.Self?xp():this.parent).get(t,n=r&O.Optional&&n===Ho?null:n)}catch(s){if("NullInjectorError"===s.name){if((s[Rr]=s[Rr]||[]).unshift(W(t)),o)throw s;return Jf(s,t,"R3InjectorError",this.source)}throw s}finally{An(i),Fr(o)}}_resolveInjectorDefTypes(){this.injectorDefTypes.forEach(t=>this.get(t))}toString(){const t=[];return this.records.forEach((r,o)=>t.push(W(o))),`R3Injector[${t.join(", ")}]`}assertNotDestroyed(){if(this._destroyed)throw new Error("Injector has already been destroyed.")}processInjectorType(t,n,r){if(!(t=N(t)))return!1;let o=sf(t);const i=null==o&&t.ngModule||void 0,s=void 0===i?t:i,a=-1!==r.indexOf(s);if(void 0!==i&&(o=sf(i)),null==o)return!1;if(null!=o.imports&&!a){let u;r.push(s);try{Xt(o.imports,d=>{this.processInjectorType(d,n,r)&&(void 0===u&&(u=[]),u.push(d))})}finally{}if(void 0!==u)for(let d=0;dthis.processProvider(p,f,h||ie))}}this.injectorDefTypes.add(s);const l=Xn(s)||(()=>new s);this.records.set(s,Ur(l,ei));const c=o.providers;if(null!=c&&!a){const u=t;Xt(c,d=>this.processProvider(d,u,c))}return void 0!==i&&void 0!==t.providers}processProvider(t,n,r){let o=Gr(t=N(t))?t:N(t&&t.provide);const i=function(e,t,n){return Fp(e)?Ur(void 0,e.useValue):Ur(Rp(e),ei)}(t);if(Gr(t)||!0!==t.multi)this.records.get(o);else{let s=this.records.get(o);s||(s=Ur(void 0,ei,!0),s.factory=()=>nr(s.multi),this.records.set(o,s)),o=t,s.multi.push(t)}this.records.set(o,i)}hydrate(t,n){return n.value===ei&&(n.value=Tw,n.value=n.factory()),"object"==typeof n.value&&n.value&&function(e){return null!==e&&"object"==typeof e&&"function"==typeof e.ngOnDestroy}(n.value)&&this.onDestroy.add(n.value),n.value}injectableDefInScope(t){if(!t.providedIn)return!1;const n=N(t.providedIn);return"string"==typeof n?"any"===n||n===this.scope:this.injectorDefTypes.has(n)}}function Cc(e){const t=pn(e),n=null!==t?t.factory:Xn(e);if(null!==n)return n;if(e instanceof X)throw new Error(`Token ${W(e)} is missing a \u0275prov definition.`);if(e instanceof Function)return function(e){const t=e.length;if(t>0){const r=function(e,t){const n=[];for(let r=0;rn.factory(e):()=>new e}(e);throw new Error("unreachable")}function Rp(e,t,n){let r;if(Gr(e)){const o=N(e);return Xn(o)||Cc(o)}if(Fp(e))r=()=>N(e.useValue);else if(function(e){return!(!e||!e.useFactory)}(e))r=()=>e.useFactory(...nr(e.deps||[]));else if(function(e){return!(!e||!e.useExisting)}(e))r=()=>Y(N(e.useExisting));else{const o=N(e&&(e.useClass||e.provide));if(!function(e){return!!e.deps}(e))return Xn(o)||Cc(o);r=()=>new o(...nr(e.deps))}return r}function Ur(e,t,n=!1){return{factory:e,value:t,multi:n?[]:void 0}}function Fp(e){return null!==e&&"object"==typeof e&&Sl in e}function Gr(e){return"function"==typeof e}const Op=function(e,t,n){return function(e,t=null,n=null,r){const o=Np(e,t,n,r);return o._resolveInjectorDefTypes(),o}({name:n},t,e,n)};let pe=(()=>{class e{static create(n,r){return Array.isArray(n)?Op(n,r,""):Op(n.providers,n.parent,n.name||"")}}return e.THROW_IF_NOT_FOUND=Ho,e.NULL=new Sp,e.\u0275prov=te({token:e,providedIn:"any",factory:()=>Y($r)}),e.__NG_ELEMENT_ID__=-1,e})();function Yw(e,t){is(Ll(e)[1],xe())}function ge(e){let t=function(e){return Object.getPrototypeOf(e.prototype).constructor}(e.type),n=!0;const r=[e];for(;t;){let o;if(Vt(e))o=t.\u0275cmp||t.\u0275dir;else{if(t.\u0275cmp)throw new Error("Directives cannot inherit Components");o=t.\u0275dir}if(o){if(n){r.push(o);const s=e;s.inputs=Ic(e.inputs),s.declaredInputs=Ic(e.declaredInputs),s.outputs=Ic(e.outputs);const a=o.hostBindings;a&&e0(e,a);const l=o.viewQuery,c=o.contentQueries;if(l&&Jw(e,l),c&&Xw(e,c),qa(e.inputs,o.inputs),qa(e.declaredInputs,o.declaredInputs),qa(e.outputs,o.outputs),Vt(o)&&o.data.animation){const u=e.data;u.animation=(u.animation||[]).concat(o.data.animation)}}const i=o.features;if(i)for(let s=0;s=0;r--){const o=e[r];o.hostVars=t+=o.hostVars,o.hostAttrs=cs(o.hostAttrs,n=cs(n,o.hostAttrs))}}(r)}function Ic(e){return e===yr?{}:e===ie?[]:e}function Jw(e,t){const n=e.viewQuery;e.viewQuery=n?(r,o)=>{t(r,o),n(r,o)}:t}function Xw(e,t){const n=e.contentQueries;e.contentQueries=n?(r,o,i)=>{t(r,o,i),n(r,o,i)}:t}function e0(e,t){const n=e.hostBindings;e.hostBindings=n?(r,o)=>{t(r,o),n(r,o)}:t}let Fs=null;function zr(){if(!Fs){const e=ne.Symbol;if(e&&e.iterator)Fs=e.iterator;else{const t=Object.getOwnPropertyNames(Map.prototype);for(let n=0;na(Me(R[r.index])):r.index;if(ve(n)){let R=null;if(!a&&l&&(R=function(e,t,n,r){const o=e.cleanup;if(null!=o)for(let i=0;il?a[l]:null}"string"==typeof s&&(i+=2)}return null}(e,t,o,r.index)),null!==R)(R.__ngLastListenerFn__||R).__ngNextListenerFn__=i,R.__ngLastListenerFn__=i,h=!1;else{i=Fc(r,t,d,i,!1);const q=n.listen(E,o,i);f.push(i,q),u&&u.push(o,x,v,v+1)}}else i=Fc(r,t,d,i,!0),E.addEventListener(o,i,s),f.push(i),u&&u.push(o,x,v,s)}else i=Fc(r,t,d,i,!1);const p=r.outputs;let _;if(h&&null!==p&&(_=p[o])){const m=_.length;if(m)for(let E=0;E0;)t=t[15],e--;return t}(e,B.lFrame.contextLView))[8]}(e)}function oi(e,t,n){return Oc(e,"",t,"",n),oi}function Oc(e,t,n,r,o){const i=b(),s=qr(i,t,n,r);return s!==j&&_t(J(),De(),i,e,s,i[G],o,!1),Oc}function xg(e,t,n,r,o){const i=e[n+1],s=null===t;let a=r?Lt(i):yn(i),l=!1;for(;0!==a&&(!1===l||s);){const u=e[a+1];j0(e[a],t)&&(l=!0,e[a+1]=r?tc(u):Xl(u)),a=r?Lt(u):yn(u)}l&&(e[n+1]=r?Xl(i):tc(i))}function j0(e,t){return null===e||null==t||(Array.isArray(e)?e[1]:e)===t||!(!Array.isArray(e)||"string"!=typeof t)&&Nr(e,t)>=0}const Re={textEnd:0,key:0,keyEnd:0,value:0,valueEnd:0};function Ng(e){return e.substring(Re.key,Re.keyEnd)}function Rg(e,t){const n=Re.textEnd;return n===t?-1:(t=Re.keyEnd=function(e,t,n){for(;t32;)t++;return t}(e,Re.key=t,n),no(e,t,n))}function no(e,t,n){for(;t=0;n=Rg(t,n))pt(e,Ng(t),!0)}function Lg(e,t){return t>=e.expandoStartIndex}function Bg(e,t,n,r){const o=e.data;if(null===o[n+1]){const i=o[Ze()],s=Lg(e,n);Ug(i,r)&&null===t&&!s&&(t=!1),t=function(e,t,n,r){const o=function(e){const t=B.lFrame.currentDirectiveIndex;return-1===t?null:e[t]}(e);let i=r?t.residualClasses:t.residualStyles;if(null===o)0===(r?t.classBindings:t.styleBindings)&&(n=ii(n=Pc(null,e,t,n,r),t.attrs,r),i=null);else{const s=t.directiveStylingLast;if(-1===s||e[s]!==o)if(n=Pc(o,e,t,n,r),null===i){let l=function(e,t,n){const r=n?t.classBindings:t.styleBindings;if(0!==yn(r))return e[Lt(r)]}(e,t,r);void 0!==l&&Array.isArray(l)&&(l=Pc(null,e,t,l[1],r),l=ii(l,t.attrs,r),function(e,t,n,r){e[Lt(n?t.classBindings:t.styleBindings)]=r}(e,t,r,l))}else i=function(e,t,n){let r;const o=t.directiveEnd;for(let i=1+t.directiveStylingLast;i0)&&(c=!0)}else u=n;if(o)if(0!==l){const f=Lt(e[a+1]);e[r+1]=Ts(f,a),0!==f&&(e[f+1]=ec(e[f+1],r)),e[a+1]=function(e,t){return 131071&e|t<<17}(e[a+1],r)}else e[r+1]=Ts(a,0),0!==a&&(e[a+1]=ec(e[a+1],r)),a=r;else e[r+1]=Ts(l,0),0===a?a=r:e[l+1]=ec(e[l+1],r),l=r;c&&(e[r+1]=Xl(e[r+1])),xg(e,u,r,!0),xg(e,u,r,!1),function(e,t,n,r,o){const i=o?e.residualClasses:e.residualStyles;null!=i&&"string"==typeof t&&Nr(i,t)>=0&&(n[r+1]=tc(n[r+1]))}(t,u,e,r,i),s=Ts(a,l),i?t.classBindings=s:t.styleBindings=s}(o,i,t,n,s,r)}}function Pc(e,t,n,r,o){let i=null;const s=n.directiveEnd;let a=n.directiveStylingLast;for(-1===a?a=n.directiveStart:a++;a0;){const l=e[o],c=Array.isArray(l),u=c?l[1]:l,d=null===u;let f=n[o+1];f===j&&(f=d?ie:void 0);let h=d?Il(f,r):u===r?f:void 0;if(c&&!Ls(h)&&(h=Il(l,r)),Ls(h)&&(a=h,s))return a;const p=e[o+1];o=s?Lt(p):yn(p)}if(null!==t){let l=i?t.residualClasses:t.residualStyles;null!=l&&(a=Il(l,r))}return a}function Ls(e){return void 0!==e}function Ug(e,t){return 0!=(e.flags&(t?16:32))}function M(e,t=""){const n=b(),r=J(),o=e+20,i=r.firstCreatePass?Br(r,o,1,t,null):r.data[o],s=n[o]=function(e,t){return ve(e)?e.createText(t):e.createTextNode(t)}(n[G],t);Is(r,n,s,i),Zt(i,!1)}function P(e){return oe("",e,""),P}function oe(e,t,n){const r=b(),o=qr(r,e,t,n);return o!==j&&vn(r,Ze(),o),oe}function Ln(e,t,n){!function(e,t,n,r){const o=J(),i=_n(2);o.firstUpdatePass&&Bg(o,null,i,r);const s=b();if(n!==j&&je(s,i,n)){const a=o.data[Ze()];if(Ug(a,r)&&!Lg(o,i)){let l=r?a.classesWithoutHost:a.stylesWithoutHost;null!==l&&(n=Qa(l,n||"")),Nc(o,a,s,n,r)}else!function(e,t,n,r,o,i,s,a){o===j&&(o=ie);let l=0,c=0,u=0((A=A||{})[A.LocaleId=0]="LocaleId",A[A.DayPeriodsFormat=1]="DayPeriodsFormat",A[A.DayPeriodsStandalone=2]="DayPeriodsStandalone",A[A.DaysFormat=3]="DaysFormat",A[A.DaysStandalone=4]="DaysStandalone",A[A.MonthsFormat=5]="MonthsFormat",A[A.MonthsStandalone=6]="MonthsStandalone",A[A.Eras=7]="Eras",A[A.FirstDayOfWeek=8]="FirstDayOfWeek",A[A.WeekendRange=9]="WeekendRange",A[A.DateFormat=10]="DateFormat",A[A.TimeFormat=11]="TimeFormat",A[A.DateTimeFormat=12]="DateTimeFormat",A[A.NumberSymbols=13]="NumberSymbols",A[A.NumberFormats=14]="NumberFormats",A[A.CurrencyCode=15]="CurrencyCode",A[A.CurrencySymbol=16]="CurrencySymbol",A[A.CurrencyName=17]="CurrencyName",A[A.Currencies=18]="Currencies",A[A.Directionality=19]="Directionality",A[A.PluralCase=20]="PluralCase",A[A.ExtraData=21]="ExtraData",A))();const Bs="en-US";let dm=Bs;function Vc(e){ut(e,"Expected localeId to be defined"),"string"==typeof e&&(dm=e.toLowerCase().replace(/_/g,"-"))}function Bc(e,t,n,r,o){if(e=N(e),Array.isArray(e))for(let i=0;i>20;if(Gr(e)||!e.multi){const h=new Fo(l,o,I),p=jc(a,t,o?u:u+f,d);-1===p?(fs(Po(c,s),i,a),Hc(i,e,t.length),t.push(a),c.directiveStart++,c.directiveEnd++,o&&(c.providerIndexes+=1048576),n.push(h),s.push(h)):(n[p]=h,s[p]=h)}else{const h=jc(a,t,u+f,d),p=jc(a,t,u,u+f),_=h>=0&&n[h],m=p>=0&&n[p];if(o&&!m||!o&&!_){fs(Po(c,s),i,a);const E=function(e,t,n,r,o){const i=new Fo(e,n,I);return i.multi=[],i.index=t,i.componentProviders=0,Pm(i,o,r&&!n),i}(o?y1:_1,n.length,o,r,l);!o&&m&&(n[p].providerFactory=E),Hc(i,e,t.length,0),t.push(a),c.directiveStart++,c.directiveEnd++,o&&(c.providerIndexes+=1048576),n.push(E),s.push(E)}else Hc(i,e,h>-1?h:p,Pm(n[o?p:h],l,!o&&r));!o&&r&&m&&n[p].componentProviders++}}}function Hc(e,t,n,r){const o=Gr(t);if(o||function(e){return!!e.useClass}(t)){const s=(t.useClass||t).prototype.ngOnDestroy;if(s){const a=e.destroyHooks||(e.destroyHooks=[]);if(!o&&t.multi){const l=a.indexOf(n);-1===l?a.push(n,[r,s]):a[l+1].push(r,s)}else a.push(n,s)}}}function Pm(e,t,n){return n&&e.componentProviders++,e.multi.push(t)-1}function jc(e,t,n,r){for(let o=n;o{n.providersResolver=(r,o)=>function(e,t,n){const r=J();if(r.firstCreatePass){const o=Vt(e);Bc(n,r.data,r.blueprint,o,!0),Bc(t,r.data,r.blueprint,o,!1)}}(r,o?o(e):e,t)}}class Vm{}const Lm="ngComponent";class D1{resolveComponentFactory(t){throw function(e){const t=Error(`No component factory found for ${W(e)}. Did you add it to @NgModule.entryComponents?`);return t[Lm]=e,t}(t)}}let io=(()=>{class e{}return e.NULL=new D1,e})();function Gs(...e){}function so(e,t){return new $e(bt(e,t))}const w1=function(){return so(xe(),b())};let $e=(()=>{class e{constructor(n){this.nativeElement=n}}return e.__NG_ELEMENT_ID__=w1,e})();class zs{}let cr=(()=>{class e{}return e.__NG_ELEMENT_ID__=()=>M1(),e})();const M1=function(){const e=b(),n=ht(xe().index,e);return function(e){return e[G]}(Yt(n)?n:e)};let Gc=(()=>{class e{}return e.\u0275prov=te({token:e,providedIn:"root",factory:()=>null}),e})();class Ws{constructor(t){this.full=t,this.major=t.split(".")[0],this.minor=t.split(".")[1],this.patch=t.split(".").slice(2).join(".")}}const Hm=new Ws("12.2.6");class jm{constructor(){}supports(t){return ni(t)}create(t){return new x1(t)}}const S1=(e,t)=>t;class x1{constructor(t){this.length=0,this._linkedRecords=null,this._unlinkedRecords=null,this._previousItHead=null,this._itHead=null,this._itTail=null,this._additionsHead=null,this._additionsTail=null,this._movesHead=null,this._movesTail=null,this._removalsHead=null,this._removalsTail=null,this._identityChangesHead=null,this._identityChangesTail=null,this._trackByFn=t||S1}forEachItem(t){let n;for(n=this._itHead;null!==n;n=n._next)t(n)}forEachOperation(t){let n=this._itHead,r=this._removalsHead,o=0,i=null;for(;n||r;){const s=!r||n&&n.currentIndex{s=this._trackByFn(o,a),null!==n&&Object.is(n.trackById,s)?(r&&(n=this._verifyReinsertion(n,a,s,o)),Object.is(n.item,a)||this._addIdentityChange(n,a)):(n=this._mismatch(n,a,s,o),r=!0),n=n._next,o++}),this.length=o;return this._truncate(n),this.collection=t,this.isDirty}get isDirty(){return null!==this._additionsHead||null!==this._movesHead||null!==this._removalsHead||null!==this._identityChangesHead}_reset(){if(this.isDirty){let t;for(t=this._previousItHead=this._itHead;null!==t;t=t._next)t._nextPrevious=t._next;for(t=this._additionsHead;null!==t;t=t._nextAdded)t.previousIndex=t.currentIndex;for(this._additionsHead=this._additionsTail=null,t=this._movesHead;null!==t;t=t._nextMoved)t.previousIndex=t.currentIndex;this._movesHead=this._movesTail=null,this._removalsHead=this._removalsTail=null,this._identityChangesHead=this._identityChangesTail=null}}_mismatch(t,n,r,o){let i;return null===t?i=this._itTail:(i=t._prev,this._remove(t)),null!==(t=null===this._unlinkedRecords?null:this._unlinkedRecords.get(r,null))?(Object.is(t.item,n)||this._addIdentityChange(t,n),this._reinsertAfter(t,i,o)):null!==(t=null===this._linkedRecords?null:this._linkedRecords.get(r,o))?(Object.is(t.item,n)||this._addIdentityChange(t,n),this._moveAfter(t,i,o)):t=this._addAfter(new N1(n,r),i,o),t}_verifyReinsertion(t,n,r,o){let i=null===this._unlinkedRecords?null:this._unlinkedRecords.get(r,null);return null!==i?t=this._reinsertAfter(i,t._prev,o):t.currentIndex!=o&&(t.currentIndex=o,this._addToMoves(t,o)),t}_truncate(t){for(;null!==t;){const n=t._next;this._addToRemovals(this._unlink(t)),t=n}null!==this._unlinkedRecords&&this._unlinkedRecords.clear(),null!==this._additionsTail&&(this._additionsTail._nextAdded=null),null!==this._movesTail&&(this._movesTail._nextMoved=null),null!==this._itTail&&(this._itTail._next=null),null!==this._removalsTail&&(this._removalsTail._nextRemoved=null),null!==this._identityChangesTail&&(this._identityChangesTail._nextIdentityChange=null)}_reinsertAfter(t,n,r){null!==this._unlinkedRecords&&this._unlinkedRecords.remove(t);const o=t._prevRemoved,i=t._nextRemoved;return null===o?this._removalsHead=i:o._nextRemoved=i,null===i?this._removalsTail=o:i._prevRemoved=o,this._insertAfter(t,n,r),this._addToMoves(t,r),t}_moveAfter(t,n,r){return this._unlink(t),this._insertAfter(t,n,r),this._addToMoves(t,r),t}_addAfter(t,n,r){return this._insertAfter(t,n,r),this._additionsTail=null===this._additionsTail?this._additionsHead=t:this._additionsTail._nextAdded=t,t}_insertAfter(t,n,r){const o=null===n?this._itHead:n._next;return t._next=o,t._prev=n,null===o?this._itTail=t:o._prev=t,null===n?this._itHead=t:n._next=t,null===this._linkedRecords&&(this._linkedRecords=new $m),this._linkedRecords.put(t),t.currentIndex=r,t}_remove(t){return this._addToRemovals(this._unlink(t))}_unlink(t){null!==this._linkedRecords&&this._linkedRecords.remove(t);const n=t._prev,r=t._next;return null===n?this._itHead=r:n._next=r,null===r?this._itTail=n:r._prev=n,t}_addToMoves(t,n){return t.previousIndex===n||(this._movesTail=null===this._movesTail?this._movesHead=t:this._movesTail._nextMoved=t),t}_addToRemovals(t){return null===this._unlinkedRecords&&(this._unlinkedRecords=new $m),this._unlinkedRecords.put(t),t.currentIndex=null,t._nextRemoved=null,null===this._removalsTail?(this._removalsTail=this._removalsHead=t,t._prevRemoved=null):(t._prevRemoved=this._removalsTail,this._removalsTail=this._removalsTail._nextRemoved=t),t}_addIdentityChange(t,n){return t.item=n,this._identityChangesTail=null===this._identityChangesTail?this._identityChangesHead=t:this._identityChangesTail._nextIdentityChange=t,t}}class N1{constructor(t,n){this.item=t,this.trackById=n,this.currentIndex=null,this.previousIndex=null,this._nextPrevious=null,this._prev=null,this._next=null,this._prevDup=null,this._nextDup=null,this._prevRemoved=null,this._nextRemoved=null,this._nextAdded=null,this._nextMoved=null,this._nextIdentityChange=null}}class R1{constructor(){this._head=null,this._tail=null}add(t){null===this._head?(this._head=this._tail=t,t._nextDup=null,t._prevDup=null):(this._tail._nextDup=t,t._prevDup=this._tail,t._nextDup=null,this._tail=t)}get(t,n){let r;for(r=this._head;null!==r;r=r._nextDup)if((null===n||n<=r.currentIndex)&&Object.is(r.trackById,t))return r;return null}remove(t){const n=t._prevDup,r=t._nextDup;return null===n?this._head=r:n._nextDup=r,null===r?this._tail=n:r._prevDup=n,null===this._head}}class $m{constructor(){this.map=new Map}put(t){const n=t.trackById;let r=this.map.get(n);r||(r=new R1,this.map.set(n,r)),r.add(t)}get(t,n){const o=this.map.get(t);return o?o.get(t,n):null}remove(t){const n=t.trackById;return this.map.get(n).remove(t)&&this.map.delete(n),t}get isEmpty(){return 0===this.map.size}clear(){this.map.clear()}}function Um(e,t,n){const r=e.previousIndex;if(null===r)return r;let o=0;return n&&r{if(n&&n.key===o)this._maybeAddToChanges(n,r),this._appendAfter=n,n=n._next;else{const i=this._getOrCreateRecordForKey(o,r);n=this._insertBeforeOrAppend(n,i)}}),n){n._prev&&(n._prev._next=null),this._removalsHead=n;for(let r=n;null!==r;r=r._nextRemoved)r===this._mapHead&&(this._mapHead=null),this._records.delete(r.key),r._nextRemoved=r._next,r.previousValue=r.currentValue,r.currentValue=null,r._prev=null,r._next=null}return this._changesTail&&(this._changesTail._nextChanged=null),this._additionsTail&&(this._additionsTail._nextAdded=null),this.isDirty}_insertBeforeOrAppend(t,n){if(t){const r=t._prev;return n._next=t,n._prev=r,t._prev=n,r&&(r._next=n),t===this._mapHead&&(this._mapHead=n),this._appendAfter=t,t}return this._appendAfter?(this._appendAfter._next=n,n._prev=this._appendAfter):this._mapHead=n,this._appendAfter=n,null}_getOrCreateRecordForKey(t,n){if(this._records.has(t)){const o=this._records.get(t);this._maybeAddToChanges(o,n);const i=o._prev,s=o._next;return i&&(i._next=s),s&&(s._prev=i),o._next=null,o._prev=null,o}const r=new O1(t);return this._records.set(t,r),r.currentValue=n,this._addToAdditions(r),r}_reset(){if(this.isDirty){let t;for(this._previousMapHead=this._mapHead,t=this._previousMapHead;null!==t;t=t._next)t._nextPrevious=t._next;for(t=this._changesHead;null!==t;t=t._nextChanged)t.previousValue=t.currentValue;for(t=this._additionsHead;null!=t;t=t._nextAdded)t.previousValue=t.currentValue;this._changesHead=this._changesTail=null,this._additionsHead=this._additionsTail=null,this._removalsHead=null}}_maybeAddToChanges(t,n){Object.is(n,t.currentValue)||(t.previousValue=t.currentValue,t.currentValue=n,this._addToChanges(t))}_addToAdditions(t){null===this._additionsHead?this._additionsHead=this._additionsTail=t:(this._additionsTail._nextAdded=t,this._additionsTail=t)}_addToChanges(t){null===this._changesHead?this._changesHead=this._changesTail=t:(this._changesTail._nextChanged=t,this._changesTail=t)}_forEach(t,n){t instanceof Map?t.forEach(n):Object.keys(t).forEach(r=>n(t[r],r))}}class O1{constructor(t){this.key=t,this.previousValue=null,this.currentValue=null,this._nextPrevious=null,this._next=null,this._prev=null,this._nextAdded=null,this._nextRemoved=null,this._nextChanged=null}}function zm(){return new ui([new jm])}let ui=(()=>{class e{constructor(n){this.factories=n}static create(n,r){if(null!=r){const o=r.factories.slice();n=n.concat(o)}return new e(n)}static extend(n){return{provide:e,useFactory:r=>e.create(n,r||zm()),deps:[[e,new rr,new en]]}}find(n){const r=this.factories.find(o=>o.supports(n));if(null!=r)return r;throw new Error(`Cannot find a differ supporting object '${n}' of type '${function(e){return e.name||typeof e}(n)}'`)}}return e.\u0275prov=te({token:e,providedIn:"root",factory:zm}),e})();function Wm(){return new ao([new Gm])}let ao=(()=>{class e{constructor(n){this.factories=n}static create(n,r){if(r){const o=r.factories.slice();n=n.concat(o)}return new e(n)}static extend(n){return{provide:e,useFactory:r=>e.create(n,r||Wm()),deps:[[e,new rr,new en]]}}find(n){const r=this.factories.find(o=>o.supports(n));if(r)return r;throw new Error(`Cannot find a differ supporting object '${n}'`)}}return e.\u0275prov=te({token:e,providedIn:"root",factory:Wm}),e})();function qs(e,t,n,r,o=!1){for(;null!==n;){const i=t[n.index];if(null!==i&&r.push(Me(i)),Pt(i))for(let a=10;a-1&&(ql(t,r),tr(n,r))}this._attachedToViewContainer=!1}Oh(this._lView[1],this._lView)}onDestroy(t){!function(e,t,n,r){const o=wp(t);null===n?o.push(r):(o.push(n),e.firstCreatePass&&Ip(e).push(r,o.length-1))}(this._lView[1],this._lView,null,t)}markForCheck(){pc(this._cdRefInjectingView||this._lView)}detach(){this._lView[2]&=-129}reattach(){this._lView[2]|=128}detectChanges(){mc(this._lView[1],this._lView,this.context)}checkNoChanges(){!function(e,t,n){ns(!0);try{mc(e,t,n)}finally{ns(!1)}}(this._lView[1],this._lView,this.context)}attachToViewContainerRef(){if(this._appRef)throw new Error("This view is already attached directly to the ApplicationRef!");this._attachedToViewContainer=!0}detachFromAppRef(){this._appRef=null,function(e,t){Yo(e,t,t[G],2,null,null)}(this._lView[1],this._lView)}attachToAppRef(t){if(this._attachedToViewContainer)throw new Error("This view is already attached to a ViewContainer!");this._appRef=t}}class V1 extends di{constructor(t){super(t),this._view=t}detectChanges(){Ep(this._view)}checkNoChanges(){!function(e){ns(!0);try{Ep(e)}finally{ns(!1)}}(this._view)}get context(){return null}}const $1=[new Gm],G1=new ui([new jm]),z1=new ao($1),q1=function(){return function(e,t){return 4&e.type?new K1(t,e,so(e,t)):null}(xe(),b())};let bn=(()=>{class e{}return e.__NG_ELEMENT_ID__=q1,e})();const Q1=bn,K1=class extends Q1{constructor(t,n,r){super(),this._declarationLView=t,this._declarationTContainer=n,this.elementRef=r}createEmbeddedView(t){const n=this._declarationTContainer.tViews,r=Zo(this._declarationLView,n,t,16,null,n.declTNode,null,null,null,null);r[17]=this._declarationLView[this._declarationTContainer.index];const i=this._declarationLView[19];return null!==i&&(r[19]=i.createEmbeddedView(n)),Jo(n,r,t),new di(r)}};class ur{}const X1=function(){return function(e,t){let n;const r=t[e.index];if(Pt(r))n=r;else{let o;if(8&e.type)o=Me(r);else{const i=t[G];o=i.createComment("");const s=bt(e,t);sr(i,ws(i,s),o,function(e,t){return ve(e)?e.nextSibling(t):t.nextSibling}(i,s),!1)}t[e.index]=n=bp(r,t,o,e),Ns(t,n)}return new qm(n,e,t)}(xe(),b())};let dn=(()=>{class e{}return e.__NG_ELEMENT_ID__=X1,e})();const tM=dn,qm=class extends tM{constructor(t,n,r){super(),this._lContainer=t,this._hostTNode=n,this._hostLView=r}get element(){return so(this._hostTNode,this._hostLView)}get injector(){return new Tr(this._hostTNode,this._hostLView)}get parentInjector(){const t=ds(this._hostTNode,this._hostLView);if(Lf(t)){const n=Mr(t,this._hostLView),r=Ir(t);return new Tr(n[1].data[r+8],n)}return new Tr(null,this._hostLView)}clear(){for(;this.length>0;)this.remove(this.length-1)}get(t){const n=Qm(this._lContainer);return null!==n&&n[t]||null}get length(){return this._lContainer.length-10}createEmbeddedView(t,n,r){const o=t.createEmbeddedView(n||{});return this.insert(o,r),o}createComponent(t,n,r,o,i){const s=r||this.parentInjector;if(!i&&null==t.ngModule&&s){const l=s.get(ur,null);l&&(i=l)}const a=t.create(s,o,void 0,i);return this.insert(a.hostView,n),a}insert(t,n){const r=t._lView,o=r[1];if(function(e){return Pt(e[3])}(r)){const u=this.indexOf(t);if(-1!==u)this.detach(u);else{const d=r[3],f=new qm(d,d[6],d[3]);f.detach(f.indexOf(t))}}const i=this._adjustIndex(n),s=this._lContainer;!function(e,t,n,r){const o=10+r,i=n.length;r>0&&(n[o-1][4]=t),rMh});class __ extends Vm{constructor(t,n){super(),this.componentDef=t,this.ngModule=n,this.componentType=t.type,this.selector=function(e){return e.map(HE).join(",")}(t.selectors),this.ngContentSelectors=t.ngContentSelectors?t.ngContentSelectors:[],this.isBoundToModule=!!n}get inputs(){return m_(this.componentDef.inputs)}get outputs(){return m_(this.componentDef.outputs)}create(t,n,r,o){const i=(o=o||this.ngModule)?function(e,t){return{get:(n,r,o)=>{const i=e.get(n,fo,o);return i!==fo||r===fo?i:t.get(n,r,o)}}}(t,o.injector):t,s=i.get(zs,Df),a=i.get(Gc,null),l=s.createRenderer(null,this.componentDef),c=this.componentDef.selectors[0][0]||"div",u=r?function(e,t,n){if(ve(e))return e.selectRootElement(t,n===Se.ShadowDom);let r="string"==typeof t?e.querySelector(t):t;return r.textContent="",r}(l,r,this.componentDef.encapsulation):Wl(s.createRenderer(null,this.componentDef),c,function(e){const t=e.toLowerCase();return"svg"===t?Cf:"math"===t?"http://www.w3.org/1998/MathML/":null}(c)),d=this.componentDef.onPush?576:528,f=function(e,t){return{components:[],scheduler:e||Mh,clean:ww,playerHandler:t||null,flags:0}}(),h=xs(0,null,null,1,0,null,null,null,null,null),p=Zo(null,h,f,d,null,null,s,l,a,i);let _,m;rs(p);try{const E=function(e,t,n,r,o,i){const s=n[1];n[20]=e;const l=Br(s,20,2,"#host",null),c=l.mergedAttrs=t.hostAttrs;null!==c&&(Rs(l,c,!0),null!==e&&(ls(o,e,c),null!==l.classes&&Jl(o,e,l.classes),null!==l.styles&&Wh(o,e,l.styles)));const u=r.createRenderer(e,t),d=Zo(n,dp(t),null,t.onPush?64:16,n[20],l,r,u,i||null,null);return s.firstCreatePass&&(fs(Po(l,n),s,t.type),Cp(s,l),vp(l,n.length,1)),Ns(n,d),n[20]=d}(u,this.componentDef,p,s,l);if(u)if(r)ls(l,u,["ng-version",Hm.full]);else{const{attrs:v,classes:x}=function(e){const t=[],n=[];let r=1,o=2;for(;r0&&Jl(l,u,x.join(" "))}if(m=al(h,20),void 0!==n){const v=m.projection=[];for(let x=0;xl(s,t)),t.contentQueries){const l=xe();t.contentQueries(1,s,l.directiveStart)}const a=xe();return!i.firstCreatePass||null===t.hostBindings&&null===t.hostAttrs||(Fn(a.index),_p(n[1],a,0,a.directiveStart,a.directiveEnd,t),yp(t,s)),s}(E,this.componentDef,p,f,[Yw]),Jo(h,p,null)}finally{os()}return new eT(this.componentType,_,so(m,p),p,m)}}class eT extends class{}{constructor(t,n,r,o,i){super(),this.location=r,this._rootLView=o,this._tNode=i,this.instance=n,this.hostView=this.changeDetectorRef=new V1(o),this.componentType=t}get injector(){return new Tr(this._tNode,this._rootLView)}destroy(){this.hostView.destroy()}onDestroy(t){this.hostView.onDestroy(t)}}const ho=new Map;class rT extends ur{constructor(t,n){super(),this._parent=n,this._bootstrapComponents=[],this.injector=this,this.destroyCbs=[],this.componentFactoryResolver=new g_(this);const r=Ct(t),o=function(e){return e[iD]||null}(t);o&&Vc(o),this._bootstrapComponents=rn(r.bootstrap),this._r3Injector=Np(t,n,[{provide:ur,useValue:this},{provide:io,useValue:this.componentFactoryResolver}],W(t)),this._r3Injector._resolveInjectorDefTypes(),this.instance=this.get(t)}get(t,n=pe.THROW_IF_NOT_FOUND,r=O.Default){return t===pe||t===ur||t===$r?this:this._r3Injector.get(t,n,r)}destroy(){const t=this._r3Injector;!t.destroyed&&t.destroy(),this.destroyCbs.forEach(n=>n()),this.destroyCbs=null}onDestroy(t){this.destroyCbs.push(t)}}class ou extends class{}{constructor(t){super(),this.moduleType=t,null!==Ct(t)&&function(e){const t=new Set;!function n(r){const o=Ct(r,!0),i=o.id;null!==i&&(function(e,t,n){if(t&&t!==n)throw new Error(`Duplicate module registered for ${e} - ${W(t)} vs ${W(t.name)}`)}(i,ho.get(i),r),ho.set(i,r));const s=rn(o.imports);for(const a of s)t.has(a)||(t.add(a),n(a))}(e)}(t)}create(t){return new rT(this.moduleType,t)}}function iu(e,t,n,r){return function(e,t,n,r,o,i){const s=t+n;return je(e,s,o)?sn(e,s+1,i?r.call(i,o):r(o)):Ci(e,s+1)}(b(),Ye(),e,t,n,r)}function su(e,t,n,r,o){return function(e,t,n,r,o,i,s){const a=t+n;return ar(e,a,o,i)?sn(e,a+2,s?r.call(s,o,i):r(o,i)):Ci(e,a+2)}(b(),Ye(),e,t,n,r,o)}function st(e,t,n,r,o,i){return b_(b(),Ye(),e,t,n,r,o,i)}function Ci(e,t){const n=e[t];return n===j?void 0:n}function b_(e,t,n,r,o,i,s,a){const l=t+n;return function(e,t,n,r,o){const i=ar(e,t,n,r);return je(e,t+2,o)||i}(e,l,o,i,s)?sn(e,l+3,a?r.call(a,o,i,s):r(o,i,s)):Ci(e,l+3)}function M_(e,t,n,r,o){const i=e+20,s=b(),a=function(e,t){return e[t]}(s,i);return function(e,t){Ht.isWrapped(t)&&(t=Ht.unwrap(t),e[B.lFrame.bindingIndex]=j);return t}(s,function(e,t){return e[1].data[t].pure}(s,i)?b_(s,Ye(),t,a.transform,n,r,o,a):a.transform(n,r,o))}function au(e){return t=>{setTimeout(e,void 0,t)}}const ze=class extends Ga{constructor(t=!1){super(),this.__isAsync=t}emit(t){super.next(t)}subscribe(t,n,r){var o,i,s;let a=t,l=n||(()=>null),c=r;if(t&&"object"==typeof t){const d=t;a=null===(o=d.next)||void 0===o?void 0:o.bind(d),l=null===(i=d.error)||void 0===i?void 0:i.bind(d),c=null===(s=d.complete)||void 0===s?void 0:s.bind(d)}this.__isAsync&&(l=au(l),a&&(a=au(a)),c&&(c=au(c)));const u=super.subscribe({next:a,error:l,complete:c});return t instanceof Ee&&t.add(u),u}};Symbol;const na=new X("Application Initializer");let go=(()=>{class e{constructor(n){this.appInits=n,this.resolve=Gs,this.reject=Gs,this.initialized=!1,this.done=!1,this.donePromise=new Promise((r,o)=>{this.resolve=r,this.reject=o})}runInitializers(){if(this.initialized)return;const n=[],r=()=>{this.done=!0,this.resolve()};if(this.appInits)for(let o=0;o{i.subscribe({complete:a,error:l})});n.push(s)}}Promise.all(n).then(()=>{r()}).catch(o=>{this.reject(o)}),0===n.length&&r(),this.initialized=!0}}return e.\u0275fac=function(n){return new(n||e)(Y(na,8))},e.\u0275prov=te({token:e,factory:e.\u0275fac}),e})();const Ei=new X("AppId"),rA={provide:Ei,useFactory:function(){return`${yu()}${yu()}${yu()}`},deps:[]};function yu(){return String.fromCharCode(97+Math.floor(25*Math.random()))}const K_=new X("Platform Initializer"),Cu=new X("Platform ID"),oA=new X("appBootstrapListener");let vu=(()=>{class e{log(n){console.log(n)}warn(n){console.warn(n)}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=te({token:e,factory:e.\u0275fac}),e})();const Hn=new X("LocaleId"),Y_=new X("DefaultCurrencyCode");class sA{constructor(t,n){this.ngModuleFactory=t,this.componentFactories=n}}const Du=function(e){return new ou(e)},aA=Du,lA=function(e){return Promise.resolve(Du(e))},Z_=function(e){const t=Du(e),r=rn(Ct(e).declarations).reduce((o,i)=>{const s=Ke(i);return s&&o.push(new __(s)),o},[]);return new sA(t,r)},cA=Z_,uA=function(e){return Promise.resolve(Z_(e))};let oa=(()=>{class e{constructor(){this.compileModuleSync=aA,this.compileModuleAsync=lA,this.compileModuleAndAllComponentsSync=cA,this.compileModuleAndAllComponentsAsync=uA}clearCache(){}clearCacheFor(n){}getModuleId(n){}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=te({token:e,factory:e.\u0275fac}),e})();const hA=(()=>Promise.resolve(0))();function bu(e){"undefined"==typeof Zone?hA.then(()=>{e&&e.apply(null,null)}):Zone.current.scheduleMicroTask("scheduleMicrotask",e)}class Le{constructor({enableLongStackTrace:t=!1,shouldCoalesceEventChangeDetection:n=!1,shouldCoalesceRunChangeDetection:r=!1}){if(this.hasPendingMacrotasks=!1,this.hasPendingMicrotasks=!1,this.isStable=!0,this.onUnstable=new ze(!1),this.onMicrotaskEmpty=new ze(!1),this.onStable=new ze(!1),this.onError=new ze(!1),"undefined"==typeof Zone)throw new Error("In this configuration Angular requires Zone.js");Zone.assertZonePatched();const o=this;o._nesting=0,o._outer=o._inner=Zone.current,Zone.TaskTrackingZoneSpec&&(o._inner=o._inner.fork(new Zone.TaskTrackingZoneSpec)),t&&Zone.longStackTraceZoneSpec&&(o._inner=o._inner.fork(Zone.longStackTraceZoneSpec)),o.shouldCoalesceEventChangeDetection=!r&&n,o.shouldCoalesceRunChangeDetection=r,o.lastRequestAnimationFrameId=-1,o.nativeRequestAnimationFrame=function(){let e=ne.requestAnimationFrame,t=ne.cancelAnimationFrame;if("undefined"!=typeof Zone&&e&&t){const n=e[Zone.__symbol__("OriginalDelegate")];n&&(e=n);const r=t[Zone.__symbol__("OriginalDelegate")];r&&(t=r)}return{nativeRequestAnimationFrame:e,nativeCancelAnimationFrame:t}}().nativeRequestAnimationFrame,function(e){const t=()=>{!function(e){e.isCheckStableRunning||-1!==e.lastRequestAnimationFrameId||(e.lastRequestAnimationFrameId=e.nativeRequestAnimationFrame.call(ne,()=>{e.fakeTopEventTask||(e.fakeTopEventTask=Zone.root.scheduleEventTask("fakeTopEventTask",()=>{e.lastRequestAnimationFrameId=-1,wu(e),e.isCheckStableRunning=!0,Eu(e),e.isCheckStableRunning=!1},void 0,()=>{},()=>{})),e.fakeTopEventTask.invoke()}),wu(e))}(e)};e._inner=e._inner.fork({name:"angular",properties:{isAngularZone:!0},onInvokeTask:(n,r,o,i,s,a)=>{try{return J_(e),n.invokeTask(o,i,s,a)}finally{(e.shouldCoalesceEventChangeDetection&&"eventTask"===i.type||e.shouldCoalesceRunChangeDetection)&&t(),X_(e)}},onInvoke:(n,r,o,i,s,a,l)=>{try{return J_(e),n.invoke(o,i,s,a,l)}finally{e.shouldCoalesceRunChangeDetection&&t(),X_(e)}},onHasTask:(n,r,o,i)=>{n.hasTask(o,i),r===o&&("microTask"==i.change?(e._hasPendingMicrotasks=i.microTask,wu(e),Eu(e)):"macroTask"==i.change&&(e.hasPendingMacrotasks=i.macroTask))},onHandleError:(n,r,o,i)=>(n.handleError(o,i),e.runOutsideAngular(()=>e.onError.emit(i)),!1)})}(o)}static isInAngularZone(){return!0===Zone.current.get("isAngularZone")}static assertInAngularZone(){if(!Le.isInAngularZone())throw new Error("Expected to be in Angular Zone, but it is not!")}static assertNotInAngularZone(){if(Le.isInAngularZone())throw new Error("Expected to not be in Angular Zone, but it is!")}run(t,n,r){return this._inner.run(t,n,r)}runTask(t,n,r,o){const i=this._inner,s=i.scheduleEventTask("NgZoneEvent: "+o,t,gA,Gs,Gs);try{return i.runTask(s,n,r)}finally{i.cancelTask(s)}}runGuarded(t,n,r){return this._inner.runGuarded(t,n,r)}runOutsideAngular(t){return this._outer.run(t)}}const gA={};function Eu(e){if(0==e._nesting&&!e.hasPendingMicrotasks&&!e.isStable)try{e._nesting++,e.onMicrotaskEmpty.emit(null)}finally{if(e._nesting--,!e.hasPendingMicrotasks)try{e.runOutsideAngular(()=>e.onStable.emit(null))}finally{e.isStable=!0}}}function wu(e){e.hasPendingMicrotasks=!!(e._hasPendingMicrotasks||(e.shouldCoalesceEventChangeDetection||e.shouldCoalesceRunChangeDetection)&&-1!==e.lastRequestAnimationFrameId)}function J_(e){e._nesting++,e.isStable&&(e.isStable=!1,e.onUnstable.emit(null))}function X_(e){e._nesting--,Eu(e)}class yA{constructor(){this.hasPendingMicrotasks=!1,this.hasPendingMacrotasks=!1,this.isStable=!0,this.onUnstable=new ze,this.onMicrotaskEmpty=new ze,this.onStable=new ze,this.onError=new ze}run(t,n,r){return t.apply(n,r)}runGuarded(t,n,r){return t.apply(n,r)}runOutsideAngular(t){return t()}runTask(t,n,r,o){return t.apply(n,r)}}let Iu=(()=>{class e{constructor(n){this._ngZone=n,this._pendingCount=0,this._isZoneStable=!0,this._didWork=!1,this._callbacks=[],this.taskTrackingZone=null,this._watchAngularEvents(),n.run(()=>{this.taskTrackingZone="undefined"==typeof Zone?null:Zone.current.get("TaskTrackingZone")})}_watchAngularEvents(){this._ngZone.onUnstable.subscribe({next:()=>{this._didWork=!0,this._isZoneStable=!1}}),this._ngZone.runOutsideAngular(()=>{this._ngZone.onStable.subscribe({next:()=>{Le.assertNotInAngularZone(),bu(()=>{this._isZoneStable=!0,this._runCallbacksIfReady()})}})})}increasePendingRequestCount(){return this._pendingCount+=1,this._didWork=!0,this._pendingCount}decreasePendingRequestCount(){if(this._pendingCount-=1,this._pendingCount<0)throw new Error("pending async requests below zero");return this._runCallbacksIfReady(),this._pendingCount}isStable(){return this._isZoneStable&&0===this._pendingCount&&!this._ngZone.hasPendingMacrotasks}_runCallbacksIfReady(){if(this.isStable())bu(()=>{for(;0!==this._callbacks.length;){let n=this._callbacks.pop();clearTimeout(n.timeoutId),n.doneCb(this._didWork)}this._didWork=!1});else{let n=this.getPendingTasks();this._callbacks=this._callbacks.filter(r=>!r.updateCb||!r.updateCb(n)||(clearTimeout(r.timeoutId),!1)),this._didWork=!0}}getPendingTasks(){return this.taskTrackingZone?this.taskTrackingZone.macroTasks.map(n=>({source:n.source,creationLocation:n.creationLocation,data:n.data})):[]}addCallback(n,r,o){let i=-1;r&&r>0&&(i=setTimeout(()=>{this._callbacks=this._callbacks.filter(s=>s.timeoutId!==i),n(this._didWork,this.getPendingTasks())},r)),this._callbacks.push({doneCb:n,timeoutId:i,updateCb:o})}whenStable(n,r,o){if(o&&!this.taskTrackingZone)throw new Error('Task tracking zone is required when passing an update callback to whenStable(). Is "zone.js/plugins/task-tracking" loaded?');this.addCallback(n,r,o),this._runCallbacksIfReady()}getPendingRequestCount(){return this._pendingCount}findProviders(n,r,o){return[]}}return e.\u0275fac=function(n){return new(n||e)(Y(Le))},e.\u0275prov=te({token:e,factory:e.\u0275fac}),e})(),ey=(()=>{class e{constructor(){this._applications=new Map,Mu.addToWindow(this)}registerApplication(n,r){this._applications.set(n,r)}unregisterApplication(n){this._applications.delete(n)}unregisterAllApplications(){this._applications.clear()}getTestability(n){return this._applications.get(n)||null}getAllTestabilities(){return Array.from(this._applications.values())}getAllRootElements(){return Array.from(this._applications.keys())}findTestabilityInTree(n,r=!0){return Mu.findTestabilityInTree(this,n,r)}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=te({token:e,factory:e.\u0275fac}),e})();class CA{addToWindow(t){}findTestabilityInTree(t,n,r){return null}}let Mu=new CA,ny=!1;let zt;const oy=new X("AllowMultipleToken");function iy(e,t,n=[]){const r=`Platform: ${t}`,o=new X(r);return(i=[])=>{let s=sy();if(!s||s.injector.get(oy,!1))if(e)e(n.concat(i).concat({provide:o,useValue:!0}));else{const a=n.concat(i).concat({provide:o,useValue:!0},{provide:Xo,useValue:"platform"});!function(e){if(zt&&!zt.destroyed&&!zt.injector.get(oy,!1))throw new Error("There can be only one platform. Destroy the previous one to create a new one.");zt=e.get(ay);const t=e.get(K_,null);t&&t.forEach(n=>n())}(pe.create({providers:a,name:r}))}return function(e){const t=sy();if(!t)throw new Error("No platform exists!");if(!t.injector.get(e,null))throw new Error("A platform with a different configuration has been created. Please destroy it first.");return t}(o)}}function sy(){return zt&&!zt.destroyed?zt:null}let ay=(()=>{class e{constructor(n){this._injector=n,this._modules=[],this._destroyListeners=[],this._destroyed=!1}bootstrapModuleFactory(n,r){const a=function(e,t){let n;return n="noop"===e?new yA:("zone.js"===e?void 0:e)||new Le({enableLongStackTrace:(ny=!0,!0),shouldCoalesceEventChangeDetection:!!(null==t?void 0:t.ngZoneEventCoalescing),shouldCoalesceRunChangeDetection:!!(null==t?void 0:t.ngZoneRunCoalescing)}),n}(r?r.ngZone:void 0,{ngZoneEventCoalescing:r&&r.ngZoneEventCoalescing||!1,ngZoneRunCoalescing:r&&r.ngZoneRunCoalescing||!1}),l=[{provide:Le,useValue:a}];return a.run(()=>{const c=pe.create({providers:l,parent:this.injector,name:n.moduleType.name}),u=n.create(c),d=u.injector.get(ir,null);if(!d)throw new Error("No ErrorHandler. Is platform module (BrowserModule) included?");return a.runOutsideAngular(()=>{const f=a.onError.subscribe({next:h=>{d.handleError(h)}});u.onDestroy(()=>{Tu(this._modules,u),f.unsubscribe()})}),function(e,t,n){try{const r=n();return Vs(r)?r.catch(o=>{throw t.runOutsideAngular(()=>e.handleError(o)),o}):r}catch(r){throw t.runOutsideAngular(()=>e.handleError(r)),r}}(d,a,()=>{const f=u.injector.get(go);return f.runInitializers(),f.donePromise.then(()=>(Vc(u.injector.get(Hn,Bs)||Bs),this._moduleDoBootstrap(u),u))})})}bootstrapModule(n,r=[]){const o=ly({},r);return function(e,t,n){const r=new ou(n);return Promise.resolve(r)}(0,0,n).then(i=>this.bootstrapModuleFactory(i,o))}_moduleDoBootstrap(n){const r=n.injector.get(wi);if(n._bootstrapComponents.length>0)n._bootstrapComponents.forEach(o=>r.bootstrap(o));else{if(!n.instance.ngDoBootstrap)throw new Error(`The module ${W(n.instance.constructor)} was bootstrapped, but it does not declare "@NgModule.bootstrap" components nor a "ngDoBootstrap" method. Please define one of these.`);n.instance.ngDoBootstrap(r)}this._modules.push(n)}onDestroy(n){this._destroyListeners.push(n)}get injector(){return this._injector}destroy(){if(this._destroyed)throw new Error("The platform has already been destroyed!");this._modules.slice().forEach(n=>n.destroy()),this._destroyListeners.forEach(n=>n()),this._destroyed=!0}get destroyed(){return this._destroyed}}return e.\u0275fac=function(n){return new(n||e)(Y(pe))},e.\u0275prov=te({token:e,factory:e.\u0275fac}),e})();function ly(e,t){return Array.isArray(t)?t.reduce(ly,e):Object.assign(Object.assign({},e),t)}let wi=(()=>{class e{constructor(n,r,o,i,s){this._zone=n,this._injector=r,this._exceptionHandler=o,this._componentFactoryResolver=i,this._initStatus=s,this._bootstrapListeners=[],this._views=[],this._runningTick=!1,this._stable=!0,this.componentTypes=[],this.components=[],this._onMicrotaskEmptySubscription=this._zone.onMicrotaskEmpty.subscribe({next:()=>{this._zone.run(()=>{this.tick()})}});const a=new qe(c=>{this._stable=this._zone.isStable&&!this._zone.hasPendingMacrotasks&&!this._zone.hasPendingMicrotasks,this._zone.runOutsideAngular(()=>{c.next(this._stable),c.complete()})}),l=new qe(c=>{let u;this._zone.runOutsideAngular(()=>{u=this._zone.onStable.subscribe(()=>{Le.assertNotInAngularZone(),bu(()=>{!this._stable&&!this._zone.hasPendingMacrotasks&&!this._zone.hasPendingMicrotasks&&(this._stable=!0,c.next(!0))})})});const d=this._zone.onUnstable.subscribe(()=>{Le.assertInAngularZone(),this._stable&&(this._stable=!1,this._zone.runOutsideAngular(()=>{c.next(!1)}))});return()=>{u.unsubscribe(),d.unsubscribe()}});this.isStable=function(...e){let t=Number.POSITIVE_INFINITY,n=null,r=e[e.length-1];return function(e){return e&&"function"==typeof e.schedule}(r)?(n=e.pop(),e.length>1&&"number"==typeof e[e.length-1]&&(t=e.pop())):"number"==typeof r&&(t=e.pop()),null===n&&1===e.length&&e[0]instanceof qe?e[0]:Fv(t)(function(e,t){return t?ef(e,t):new qe(Yd(e))}(e,n))}(a,l.pipe(e=>nf()(function(e,t){return function(r){let o;o="function"==typeof e?e:function(){return e};const i=Object.create(r,Bv);return i.source=r,i.subjectFactory=o,i}}(Gv)(e))))}bootstrap(n,r){if(!this._initStatus.done)throw new Error("Cannot bootstrap as there are still asynchronous initializers running. Bootstrap components in the `ngDoBootstrap` method of the root module.");let o;o=n instanceof Vm?n:this._componentFactoryResolver.resolveComponentFactory(n),this.componentTypes.push(o.componentType);const i=function(e){return e.isBoundToModule}(o)?void 0:this._injector.get(ur),a=o.create(pe.NULL,[],r||o.selector,i),l=a.location.nativeElement,c=a.injector.get(Iu,null),u=c&&a.injector.get(ey);return c&&u&&u.registerApplication(l,c),a.onDestroy(()=>{this.detachView(a.hostView),Tu(this.components,a),u&&u.unregisterApplication(l)}),this._loadComponent(a),a}tick(){if(this._runningTick)throw new Error("ApplicationRef.tick is called recursively");try{this._runningTick=!0;for(let n of this._views)n.detectChanges()}catch(n){this._zone.runOutsideAngular(()=>this._exceptionHandler.handleError(n))}finally{this._runningTick=!1}}attachView(n){const r=n;this._views.push(r),r.attachToAppRef(this)}detachView(n){const r=n;Tu(this._views,r),r.detachFromAppRef()}_loadComponent(n){this.attachView(n.hostView),this.tick(),this.components.push(n),this._injector.get(oA,[]).concat(this._bootstrapListeners).forEach(o=>o(n))}ngOnDestroy(){this._views.slice().forEach(n=>n.destroy()),this._onMicrotaskEmptySubscription.unsubscribe()}get viewCount(){return this._views.length}}return e.\u0275fac=function(n){return new(n||e)(Y(Le),Y(pe),Y(ir),Y(io),Y(go))},e.\u0275prov=te({token:e,factory:e.\u0275fac}),e})();function Tu(e,t){const n=e.indexOf(t);n>-1&&e.splice(n,1)}const WA=iy(null,"core",[{provide:Cu,useValue:"unknown"},{provide:ay,deps:[pe]},{provide:ey,deps:[]},{provide:vu,deps:[]}]),ZA=[{provide:wi,useClass:wi,deps:[Le,pe,ir,io,go]},{provide:ZM,deps:[Le],useFactory:function(e){let t=[];return e.onStable.subscribe(()=>{for(;t.length;)t.pop()()}),function(n){t.push(n)}}},{provide:go,useClass:go,deps:[[new en,na]]},{provide:oa,useClass:oa,deps:[]},rA,{provide:ui,useFactory:function(){return G1},deps:[]},{provide:ao,useFactory:function(){return z1},deps:[]},{provide:Hn,useFactory:function(e){return Vc(e=e||"undefined"!=typeof $localize&&$localize.locale||Bs),e},deps:[[new Uo(Hn),new en,new rr]]},{provide:Y_,useValue:"USD"}];let XA=(()=>{class e{constructor(n){}}return e.\u0275fac=function(n){return new(n||e)(Y(wi))},e.\u0275mod=mn({type:e}),e.\u0275inj=Ft({providers:ZA}),e})(),pa=null;function gr(){return pa}const nt=new X("DocumentToken");var Te=(()=>((Te=Te||{})[Te.Zero=0]="Zero",Te[Te.One=1]="One",Te[Te.Two=2]="Two",Te[Te.Few=3]="Few",Te[Te.Many=4]="Many",Te[Te.Other=5]="Other",Te))();const ax=function(e){return function(e){const t=function(e){return e.toLowerCase().replace(/_/g,"-")}(e);let n=um(t);if(n)return n;const r=t.split("-")[0];if(n=um(r),n)return n;if("en"===r)return DI;throw new Error(`Missing locale data for the locale "${e}".`)}(e)[A.PluralCase]};class wa{}let Vx=(()=>{class e extends wa{constructor(n){super(),this.locale=n}getPluralCategory(n,r){switch(ax(r||this.locale)(n)){case Te.Zero:return"zero";case Te.One:return"one";case Te.Two:return"two";case Te.Few:return"few";case Te.Many:return"many";default:return"other"}}}return e.\u0275fac=function(n){return new(n||e)(Y(Hn))},e.\u0275prov=te({token:e,factory:e.\u0275fac}),e})(),Ni=(()=>{class e{constructor(n,r,o,i){this._iterableDiffers=n,this._keyValueDiffers=r,this._ngEl=o,this._renderer=i,this._iterableDiffer=null,this._keyValueDiffer=null,this._initialClasses=[],this._rawClass=null}set klass(n){this._removeClasses(this._initialClasses),this._initialClasses="string"==typeof n?n.split(/\s+/):[],this._applyClasses(this._initialClasses),this._applyClasses(this._rawClass)}set ngClass(n){this._removeClasses(this._rawClass),this._applyClasses(this._initialClasses),this._iterableDiffer=null,this._keyValueDiffer=null,this._rawClass="string"==typeof n?n.split(/\s+/):n,this._rawClass&&(ni(this._rawClass)?this._iterableDiffer=this._iterableDiffers.find(this._rawClass).create():this._keyValueDiffer=this._keyValueDiffers.find(this._rawClass).create())}ngDoCheck(){if(this._iterableDiffer){const n=this._iterableDiffer.diff(this._rawClass);n&&this._applyIterableChanges(n)}else if(this._keyValueDiffer){const n=this._keyValueDiffer.diff(this._rawClass);n&&this._applyKeyValueChanges(n)}}_applyKeyValueChanges(n){n.forEachAddedItem(r=>this._toggleClass(r.key,r.currentValue)),n.forEachChangedItem(r=>this._toggleClass(r.key,r.currentValue)),n.forEachRemovedItem(r=>{r.previousValue&&this._toggleClass(r.key,!1)})}_applyIterableChanges(n){n.forEachAddedItem(r=>{if("string"!=typeof r.item)throw new Error(`NgClass can only toggle CSS classes expressed as strings, got ${W(r.item)}`);this._toggleClass(r.item,!0)}),n.forEachRemovedItem(r=>this._toggleClass(r.item,!1))}_applyClasses(n){n&&(Array.isArray(n)||n instanceof Set?n.forEach(r=>this._toggleClass(r,!0)):Object.keys(n).forEach(r=>this._toggleClass(r,!!n[r])))}_removeClasses(n){n&&(Array.isArray(n)||n instanceof Set?n.forEach(r=>this._toggleClass(r,!1)):Object.keys(n).forEach(r=>this._toggleClass(r,!1)))}_toggleClass(n,r){(n=n.trim())&&n.split(/\s+/g).forEach(o=>{r?this._renderer.addClass(this._ngEl.nativeElement,o):this._renderer.removeClass(this._ngEl.nativeElement,o)})}}return e.\u0275fac=function(n){return new(n||e)(I(ui),I(ao),I($e),I(cr))},e.\u0275dir=L({type:e,selectors:[["","ngClass",""]],inputs:{klass:["class","klass"],ngClass:"ngClass"}}),e})();class Bx{constructor(t,n,r,o){this.$implicit=t,this.ngForOf=n,this.index=r,this.count=o}get first(){return 0===this.index}get last(){return this.index===this.count-1}get even(){return this.index%2==0}get odd(){return!this.even}}let Yu=(()=>{class e{constructor(n,r,o){this._viewContainer=n,this._template=r,this._differs=o,this._ngForOf=null,this._ngForOfDirty=!0,this._differ=null}set ngForOf(n){this._ngForOf=n,this._ngForOfDirty=!0}set ngForTrackBy(n){this._trackByFn=n}get ngForTrackBy(){return this._trackByFn}set ngForTemplate(n){n&&(this._template=n)}ngDoCheck(){if(this._ngForOfDirty){this._ngForOfDirty=!1;const n=this._ngForOf;if(!this._differ&&n)try{this._differ=this._differs.find(n).create(this.ngForTrackBy)}catch(r){throw new Error(`Cannot find a differ supporting object '${n}' of type '${function(e){return e.name||typeof e}(n)}'. NgFor only supports binding to Iterables such as Arrays.`)}}if(this._differ){const n=this._differ.diff(this._ngForOf);n&&this._applyChanges(n)}}_applyChanges(n){const r=[];n.forEachOperation((o,i,s)=>{if(null==o.previousIndex){const a=this._viewContainer.createEmbeddedView(this._template,new Bx(null,this._ngForOf,-1,-1),null===s?void 0:s),l=new Wy(o,a);r.push(l)}else if(null==s)this._viewContainer.remove(null===i?void 0:i);else if(null!==i){const a=this._viewContainer.get(i);this._viewContainer.move(a,s);const l=new Wy(o,a);r.push(l)}});for(let o=0;o{this._viewContainer.get(o.currentIndex).context.$implicit=o.item})}_perViewChange(n,r){n.context.$implicit=r.item}static ngTemplateContextGuard(n,r){return!0}}return e.\u0275fac=function(n){return new(n||e)(I(dn),I(bn),I(ui))},e.\u0275dir=L({type:e,selectors:[["","ngFor","","ngForOf",""]],inputs:{ngForOf:"ngForOf",ngForTrackBy:"ngForTrackBy",ngForTemplate:"ngForTemplate"}}),e})();class Wy{constructor(t,n){this.record=t,this.view=n}}let yo=(()=>{class e{constructor(n,r){this._viewContainer=n,this._context=new jx,this._thenTemplateRef=null,this._elseTemplateRef=null,this._thenViewRef=null,this._elseViewRef=null,this._thenTemplateRef=r}set ngIf(n){this._context.$implicit=this._context.ngIf=n,this._updateView()}set ngIfThen(n){qy("ngIfThen",n),this._thenTemplateRef=n,this._thenViewRef=null,this._updateView()}set ngIfElse(n){qy("ngIfElse",n),this._elseTemplateRef=n,this._elseViewRef=null,this._updateView()}_updateView(){this._context.$implicit?this._thenViewRef||(this._viewContainer.clear(),this._elseViewRef=null,this._thenTemplateRef&&(this._thenViewRef=this._viewContainer.createEmbeddedView(this._thenTemplateRef,this._context))):this._elseViewRef||(this._viewContainer.clear(),this._thenViewRef=null,this._elseTemplateRef&&(this._elseViewRef=this._viewContainer.createEmbeddedView(this._elseTemplateRef,this._context)))}static ngTemplateContextGuard(n,r){return!0}}return e.\u0275fac=function(n){return new(n||e)(I(dn),I(bn))},e.\u0275dir=L({type:e,selectors:[["","ngIf",""]],inputs:{ngIf:"ngIf",ngIfThen:"ngIfThen",ngIfElse:"ngIfElse"}}),e})();class jx{constructor(){this.$implicit=null,this.ngIf=null}}function qy(e,t){if(t&&!t.createEmbeddedView)throw new Error(`${e} must be a TemplateRef, but received '${W(t)}'.`)}let Yy=(()=>{class e{transform(n,r,o){if(null==n)return null;if(!this.supports(n))throw function(e,t){return Error(`InvalidPipeArgument: '${t}' for pipe '${W(e)}'`)}(e,n);return n.slice(r,o)}supports(n){return"string"==typeof n||Array.isArray(n)}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275pipe=ot({name:"slice",type:e,pure:!1}),e})(),fN=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=mn({type:e}),e.\u0275inj=Ft({providers:[{provide:wa,useClass:Vx}]}),e})();class td extends class extends class{}{constructor(){super(...arguments),this.supportsDOMEvents=!0}}{static makeCurrent(){!function(e){pa||(pa=e)}(new td)}onAndCancel(t,n,r){return t.addEventListener(n,r,!1),()=>{t.removeEventListener(n,r,!1)}}dispatchEvent(t,n){t.dispatchEvent(n)}remove(t){t.parentNode&&t.parentNode.removeChild(t)}createElement(t,n){return(n=n||this.getDefaultDocument()).createElement(t)}createHtmlDocument(){return document.implementation.createHTMLDocument("fakeTitle")}getDefaultDocument(){return document}isElementNode(t){return t.nodeType===Node.ELEMENT_NODE}isShadowRoot(t){return t instanceof DocumentFragment}getGlobalEventTarget(t,n){return"window"===n?window:"document"===n?t:"body"===n?t.body:null}getBaseHref(t){const n=(Ri=Ri||document.querySelector("base"),Ri?Ri.getAttribute("href"):null);return null==n?null:function(e){Ia=Ia||document.createElement("a"),Ia.setAttribute("href",e);const t=Ia.pathname;return"/"===t.charAt(0)?t:`/${t}`}(n)}resetBaseElement(){Ri=null}getUserAgent(){return window.navigator.userAgent}getCookie(t){return function(e,t){t=encodeURIComponent(t);for(const n of e.split(";")){const r=n.indexOf("="),[o,i]=-1==r?[n,""]:[n.slice(0,r),n.slice(r+1)];if(o.trim()===t)return decodeURIComponent(i)}return null}(document.cookie,t)}}let Ia,Ri=null;const Xy=new X("TRANSITION_ID"),bN=[{provide:na,useFactory:function(e,t,n){return()=>{n.get(go).donePromise.then(()=>{const r=gr(),o=t.querySelectorAll(`style[ng-transition="${e}"]`);for(let i=0;i{const i=t.findTestabilityInTree(r,o);if(null==i)throw new Error("Could not find testability for element.");return i},ne.getAllAngularTestabilities=()=>t.getAllTestabilities(),ne.getAllAngularRootElements=()=>t.getAllRootElements(),ne.frameworkStabilizers||(ne.frameworkStabilizers=[]),ne.frameworkStabilizers.push(r=>{const o=ne.getAllAngularTestabilities();let i=o.length,s=!1;const a=function(l){s=s||l,i--,0==i&&r(s)};o.forEach(function(l){l.whenStable(a)})})}findTestabilityInTree(t,n,r){if(null==n)return null;const o=t.getTestability(n);return null!=o?o:r?gr().isShadowRoot(n)?this.findTestabilityInTree(t,n.host,!0):this.findTestabilityInTree(t,n.parentElement,!0):null}}let EN=(()=>{class e{build(){return new XMLHttpRequest}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=te({token:e,factory:e.\u0275fac}),e})();const Fi=new X("EventManagerPlugins");let Ta=(()=>{class e{constructor(n,r){this._zone=r,this._eventNameToPlugin=new Map,n.forEach(o=>o.manager=this),this._plugins=n.slice().reverse()}addEventListener(n,r,o){return this._findPluginFor(r).addEventListener(n,r,o)}addGlobalEventListener(n,r,o){return this._findPluginFor(r).addGlobalEventListener(n,r,o)}getZone(){return this._zone}_findPluginFor(n){const r=this._eventNameToPlugin.get(n);if(r)return r;const o=this._plugins;for(let i=0;i{class e{constructor(){this._stylesSet=new Set}addStyles(n){const r=new Set;n.forEach(o=>{this._stylesSet.has(o)||(this._stylesSet.add(o),r.add(o))}),this.onStylesAdded(r)}onStylesAdded(n){}getAllStyles(){return Array.from(this._stylesSet)}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=te({token:e,factory:e.\u0275fac}),e})(),Oi=(()=>{class e extends tC{constructor(n){super(),this._doc=n,this._hostNodes=new Map,this._hostNodes.set(n.head,[])}_addStylesToHost(n,r,o){n.forEach(i=>{const s=this._doc.createElement("style");s.textContent=i,o.push(r.appendChild(s))})}addHost(n){const r=[];this._addStylesToHost(this._stylesSet,n,r),this._hostNodes.set(n,r)}removeHost(n){const r=this._hostNodes.get(n);r&&r.forEach(nC),this._hostNodes.delete(n)}onStylesAdded(n){this._hostNodes.forEach((r,o)=>{this._addStylesToHost(n,o,r)})}ngOnDestroy(){this._hostNodes.forEach(n=>n.forEach(nC))}}return e.\u0275fac=function(n){return new(n||e)(Y(nt))},e.\u0275prov=te({token:e,factory:e.\u0275fac}),e})();function nC(e){gr().remove(e)}const od={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"},id=/%COMP%/g;function Aa(e,t,n){for(let r=0;r{if("__ngUnwrap__"===t)return e;!1===e(t)&&(t.preventDefault(),t.returnValue=!1)}}let sd=(()=>{class e{constructor(n,r,o){this.eventManager=n,this.sharedStylesHost=r,this.appId=o,this.rendererByCompId=new Map,this.defaultRenderer=new ad(n)}createRenderer(n,r){if(!n||!r)return this.defaultRenderer;switch(r.encapsulation){case Se.Emulated:{let o=this.rendererByCompId.get(r.id);return o||(o=new LN(this.eventManager,this.sharedStylesHost,r,this.appId),this.rendererByCompId.set(r.id,o)),o.applyToHost(n),o}case 1:case Se.ShadowDom:return new BN(this.eventManager,this.sharedStylesHost,n,r);default:if(!this.rendererByCompId.has(r.id)){const o=Aa(r.id,r.styles,[]);this.sharedStylesHost.addStyles(o),this.rendererByCompId.set(r.id,this.defaultRenderer)}return this.defaultRenderer}}begin(){}end(){}}return e.\u0275fac=function(n){return new(n||e)(Y(Ta),Y(Oi),Y(Ei))},e.\u0275prov=te({token:e,factory:e.\u0275fac}),e})();class ad{constructor(t){this.eventManager=t,this.data=Object.create(null)}destroy(){}createElement(t,n){return n?document.createElementNS(od[n]||n,t):document.createElement(t)}createComment(t){return document.createComment(t)}createText(t){return document.createTextNode(t)}appendChild(t,n){t.appendChild(n)}insertBefore(t,n,r){t&&t.insertBefore(n,r)}removeChild(t,n){t&&t.removeChild(n)}selectRootElement(t,n){let r="string"==typeof t?document.querySelector(t):t;if(!r)throw new Error(`The selector "${t}" did not match any elements`);return n||(r.textContent=""),r}parentNode(t){return t.parentNode}nextSibling(t){return t.nextSibling}setAttribute(t,n,r,o){if(o){n=o+":"+n;const i=od[o];i?t.setAttributeNS(i,n,r):t.setAttribute(n,r)}else t.setAttribute(n,r)}removeAttribute(t,n,r){if(r){const o=od[r];o?t.removeAttributeNS(o,n):t.removeAttribute(`${r}:${n}`)}else t.removeAttribute(n)}addClass(t,n){t.classList.add(n)}removeClass(t,n){t.classList.remove(n)}setStyle(t,n,r,o){o&(mt.DashCase|mt.Important)?t.style.setProperty(n,r,o&mt.Important?"important":""):t.style[n]=r}removeStyle(t,n,r){r&mt.DashCase?t.style.removeProperty(n):t.style[n]=""}setProperty(t,n,r){t[n]=r}setValue(t,n){t.nodeValue=n}listen(t,n,r){return"string"==typeof t?this.eventManager.addGlobalEventListener(t,n,iC(r)):this.eventManager.addEventListener(t,n,iC(r))}}class LN extends ad{constructor(t,n,r,o){super(t),this.component=r;const i=Aa(o+"-"+r.id,r.styles,[]);n.addStyles(i),this.contentAttr=function(e){return"_ngcontent-%COMP%".replace(id,e)}(o+"-"+r.id),this.hostAttr=function(e){return"_nghost-%COMP%".replace(id,e)}(o+"-"+r.id)}applyToHost(t){super.setAttribute(t,this.hostAttr,"")}createElement(t,n){const r=super.createElement(t,n);return super.setAttribute(r,this.contentAttr,""),r}}class BN extends ad{constructor(t,n,r,o){super(t),this.sharedStylesHost=n,this.hostEl=r,this.shadowRoot=r.attachShadow({mode:"open"}),this.sharedStylesHost.addHost(this.shadowRoot);const i=Aa(o.id,o.styles,[]);for(let s=0;s{class e extends rd{constructor(n){super(n)}supports(n){return!0}addEventListener(n,r,o){return n.addEventListener(r,o,!1),()=>this.removeEventListener(n,r,o)}removeEventListener(n,r,o){return n.removeEventListener(r,o)}}return e.\u0275fac=function(n){return new(n||e)(Y(nt))},e.\u0275prov=te({token:e,factory:e.\u0275fac}),e})();const lC=["alt","control","meta","shift"],qN={"\b":"Backspace","\t":"Tab","\x7f":"Delete","\x1b":"Escape",Del:"Delete",Esc:"Escape",Left:"ArrowLeft",Right:"ArrowRight",Up:"ArrowUp",Down:"ArrowDown",Menu:"ContextMenu",Scroll:"ScrollLock",Win:"OS"},cC={A:"1",B:"2",C:"3",D:"4",E:"5",F:"6",G:"7",H:"8",I:"9",J:"*",K:"+",M:"-",N:".",O:"/","`":"0","\x90":"NumLock"},QN={alt:e=>e.altKey,control:e=>e.ctrlKey,meta:e=>e.metaKey,shift:e=>e.shiftKey};let KN=(()=>{class e extends rd{constructor(n){super(n)}supports(n){return null!=e.parseEventName(n)}addEventListener(n,r,o){const i=e.parseEventName(r),s=e.eventCallback(i.fullKey,o,this.manager.getZone());return this.manager.getZone().runOutsideAngular(()=>gr().onAndCancel(n,i.domEventName,s))}static parseEventName(n){const r=n.toLowerCase().split("."),o=r.shift();if(0===r.length||"keydown"!==o&&"keyup"!==o)return null;const i=e._normalizeKey(r.pop());let s="";if(lC.forEach(l=>{const c=r.indexOf(l);c>-1&&(r.splice(c,1),s+=l+".")}),s+=i,0!=r.length||0===i.length)return null;const a={};return a.domEventName=o,a.fullKey=s,a}static getEventFullKey(n){let r="",o=function(e){let t=e.key;if(null==t){if(t=e.keyIdentifier,null==t)return"Unidentified";t.startsWith("U+")&&(t=String.fromCharCode(parseInt(t.substring(2),16)),3===e.location&&cC.hasOwnProperty(t)&&(t=cC[t]))}return qN[t]||t}(n);return o=o.toLowerCase()," "===o?o="space":"."===o&&(o="dot"),lC.forEach(i=>{i!=o&&QN[i](n)&&(r+=i+".")}),r+=o,r}static eventCallback(n,r,o){return i=>{e.getEventFullKey(i)===n&&o.runGuarded(()=>r(i))}}static _normalizeKey(n){switch(n){case"esc":return"escape";default:return n}}}return e.\u0275fac=function(n){return new(n||e)(Y(nt))},e.\u0275prov=te({token:e,factory:e.\u0275fac}),e})();const rR=iy(WA,"browser",[{provide:Cu,useValue:"browser"},{provide:K_,useValue:function(){td.makeCurrent(),nd.init()},multi:!0},{provide:nt,useFactory:function(){return function(e){il=e}(document),document},deps:[]}]),oR=[[],{provide:Xo,useValue:"root"},{provide:ir,useFactory:function(){return new ir},deps:[]},{provide:Fi,useClass:HN,multi:!0,deps:[nt,Le,Cu]},{provide:Fi,useClass:KN,multi:!0,deps:[nt]},[],{provide:sd,useClass:sd,deps:[Ta,Oi,Ei]},{provide:zs,useExisting:sd},{provide:tC,useExisting:Oi},{provide:Oi,useClass:Oi,deps:[nt]},{provide:Iu,useClass:Iu,deps:[Le]},{provide:Ta,useClass:Ta,deps:[Fi,Le]},{provide:class{},useClass:EN,deps:[]},[]];let iR=(()=>{class e{constructor(n){if(n)throw new Error("BrowserModule has already been loaded. If you need access to common directives such as NgIf and NgFor from a lazy loaded module, import CommonModule instead.")}static withServerTransition(n){return{ngModule:e,providers:[{provide:Ei,useValue:n.appId},{provide:Xy,useExisting:Ei},bN]}}}return e.\u0275fac=function(n){return new(n||e)(Y(e,12))},e.\u0275mod=mn({type:e}),e.\u0275inj=Ft({providers:oR,imports:[fN,XA]}),e})();function Sa(e,t){return new qe(n=>{const r=e.length;if(0===r)return void n.complete();const o=new Array(r);let i=0,s=0;for(let a=0;a{c||(c=!0,s++),o[a]=u},error:u=>n.error(u),complete:()=>{i++,(i===r||!c)&&(s===r&&n.next(t?t.reduce((u,d,f)=>(u[d]=o[f],u),{}):o),n.complete())}}))}})}"undefined"!=typeof window&&window;let dC=(()=>{class e{constructor(n,r){this._renderer=n,this._elementRef=r,this.onChange=o=>{},this.onTouched=()=>{}}setProperty(n,r){this._renderer.setProperty(this._elementRef.nativeElement,n,r)}registerOnTouched(n){this.onTouched=n}registerOnChange(n){this.onChange=n}setDisabledState(n){this.setProperty("disabled",n)}}return e.\u0275fac=function(n){return new(n||e)(I(cr),I($e))},e.\u0275dir=L({type:e}),e})(),mr=(()=>{class e extends dC{}return e.\u0275fac=function(){let t;return function(r){return(t||(t=Et(e)))(r||e)}}(),e.\u0275dir=L({type:e,features:[ge]}),e})();const fn=new X("NgValueAccessor"),gR={provide:fn,useExisting:ue(()=>Pi),multi:!0},_R=new X("CompositionEventMode");let Pi=(()=>{class e extends dC{constructor(n,r,o){super(n,r),this._compositionMode=o,this._composing=!1,null==this._compositionMode&&(this._compositionMode=!function(){const e=gr()?gr().getUserAgent():"";return/android (\d+)/.test(e.toLowerCase())}())}writeValue(n){this.setProperty("value",null==n?"":n)}_handleInput(n){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(n)}_compositionStart(){this._composing=!0}_compositionEnd(n){this._composing=!1,this._compositionMode&&this.onChange(n)}}return e.\u0275fac=function(n){return new(n||e)(I(cr),I($e),I(_R,8))},e.\u0275dir=L({type:e,selectors:[["input","formControlName","",3,"type","checkbox"],["textarea","formControlName",""],["input","formControl","",3,"type","checkbox"],["textarea","formControl",""],["input","ngModel","",3,"type","checkbox"],["textarea","ngModel",""],["","ngDefaultControl",""]],hostBindings:function(n,r){1&n&&Z("input",function(i){return r._handleInput(i.target.value)})("blur",function(){return r.onTouched()})("compositionstart",function(){return r._compositionStart()})("compositionend",function(i){return r._compositionEnd(i.target.value)})},features:[_e([gR]),ge]}),e})();const We=new X("NgValidators"),Gn=new X("NgAsyncValidators");function bC(e){return null!=e}function EC(e){const t=Vs(e)?Wa(e):e;return Rc(t),t}function wC(e){let t={};return e.forEach(n=>{t=null!=n?Object.assign(Object.assign({},t),n):t}),0===Object.keys(t).length?null:t}function IC(e,t){return t.map(n=>n(e))}function MC(e){return e.map(t=>function(e){return!e.validate}(t)?t:n=>t.validate(n))}function fd(e){return null!=e?function(e){if(!e)return null;const t=e.filter(bC);return 0==t.length?null:function(n){return wC(IC(n,t))}}(MC(e)):null}function hd(e){return null!=e?function(e){if(!e)return null;const t=e.filter(bC);return 0==t.length?null:function(n){return function(...e){if(1===e.length){const t=e[0];if($a(t))return Sa(t,null);if(Ua(t)&&Object.getPrototypeOf(t)===Object.prototype){const n=Object.keys(t);return Sa(n.map(r=>t[r]),n)}}if("function"==typeof e[e.length-1]){const t=e.pop();return Sa(e=1===e.length&&$a(e[0])?e[0]:e,null).pipe(za(n=>t(...n)))}return Sa(e,null)}(IC(n,t).map(EC)).pipe(za(wC))}}(MC(e)):null}function SC(e,t){return null===e?[t]:Array.isArray(e)?[...e,t]:[e,t]}function pd(e){return e?Array.isArray(e)?e:[e]:[]}function xa(e,t){return Array.isArray(e)?e.includes(t):e===t}function RC(e,t){const n=pd(t);return pd(e).forEach(o=>{xa(n,o)||n.push(o)}),n}function FC(e,t){return pd(t).filter(n=>!xa(e,n))}let OC=(()=>{class e{constructor(){this._rawValidators=[],this._rawAsyncValidators=[],this._onDestroyCallbacks=[]}get value(){return this.control?this.control.value:null}get valid(){return this.control?this.control.valid:null}get invalid(){return this.control?this.control.invalid:null}get pending(){return this.control?this.control.pending:null}get disabled(){return this.control?this.control.disabled:null}get enabled(){return this.control?this.control.enabled:null}get errors(){return this.control?this.control.errors:null}get pristine(){return this.control?this.control.pristine:null}get dirty(){return this.control?this.control.dirty:null}get touched(){return this.control?this.control.touched:null}get status(){return this.control?this.control.status:null}get untouched(){return this.control?this.control.untouched:null}get statusChanges(){return this.control?this.control.statusChanges:null}get valueChanges(){return this.control?this.control.valueChanges:null}get path(){return null}_setValidators(n){this._rawValidators=n||[],this._composedValidatorFn=fd(this._rawValidators)}_setAsyncValidators(n){this._rawAsyncValidators=n||[],this._composedAsyncValidatorFn=hd(this._rawAsyncValidators)}get validator(){return this._composedValidatorFn||null}get asyncValidator(){return this._composedAsyncValidatorFn||null}_registerOnDestroy(n){this._onDestroyCallbacks.push(n)}_invokeOnDestroyCallbacks(){this._onDestroyCallbacks.forEach(n=>n()),this._onDestroyCallbacks=[]}reset(n){this.control&&this.control.reset(n)}hasError(n,r){return!!this.control&&this.control.hasError(n,r)}getError(n,r){return this.control?this.control.getError(n,r):null}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275dir=L({type:e}),e})(),rt=(()=>{class e extends OC{get formDirective(){return null}get path(){return null}}return e.\u0275fac=function(){let t;return function(r){return(t||(t=Et(e)))(r||e)}}(),e.\u0275dir=L({type:e,features:[ge]}),e})();class Wn extends OC{constructor(){super(...arguments),this._parent=null,this.name=null,this.valueAccessor=null}}let gd=(()=>{class e extends class{constructor(t){this._cd=t}is(t){var n,r,o;return"submitted"===t?!!(null===(n=this._cd)||void 0===n?void 0:n.submitted):!!(null===(o=null===(r=this._cd)||void 0===r?void 0:r.control)||void 0===o?void 0:o[t])}}{constructor(n){super(n)}}return e.\u0275fac=function(n){return new(n||e)(I(Wn,2))},e.\u0275dir=L({type:e,selectors:[["","formControlName",""],["","ngModel",""],["","formControl",""]],hostVars:14,hostBindings:function(n,r){2&n&&ks("ng-untouched",r.is("untouched"))("ng-touched",r.is("touched"))("ng-pristine",r.is("pristine"))("ng-dirty",r.is("dirty"))("ng-valid",r.is("valid"))("ng-invalid",r.is("invalid"))("ng-pending",r.is("pending"))},features:[ge]}),e})();function Vi(e,t){(function(e,t){const n=function(e){return e._rawValidators}(e);null!==t.validator?e.setValidators(SC(n,t.validator)):"function"==typeof n&&e.setValidators([n]);const r=function(e){return e._rawAsyncValidators}(e);null!==t.asyncValidator?e.setAsyncValidators(SC(r,t.asyncValidator)):"function"==typeof r&&e.setAsyncValidators([r]);const o=()=>e.updateValueAndValidity();Oa(t._rawValidators,o),Oa(t._rawAsyncValidators,o)})(e,t),t.valueAccessor.writeValue(e.value),function(e,t){t.valueAccessor.registerOnChange(n=>{e._pendingValue=n,e._pendingChange=!0,e._pendingDirty=!0,"change"===e.updateOn&&VC(e,t)})}(e,t),function(e,t){const n=(r,o)=>{t.valueAccessor.writeValue(r),o&&t.viewToModelUpdate(r)};e.registerOnChange(n),t._registerOnDestroy(()=>{e._unregisterOnChange(n)})}(e,t),function(e,t){t.valueAccessor.registerOnTouched(()=>{e._pendingTouched=!0,"blur"===e.updateOn&&e._pendingChange&&VC(e,t),"submit"!==e.updateOn&&e.markAsTouched()})}(e,t),function(e,t){if(t.valueAccessor.setDisabledState){const n=r=>{t.valueAccessor.setDisabledState(r)};e.registerOnDisabledChange(n),t._registerOnDestroy(()=>{e._unregisterOnDisabledChange(n)})}}(e,t)}function Oa(e,t){e.forEach(n=>{n.registerOnValidatorChange&&n.registerOnValidatorChange(t)})}function VC(e,t){e._pendingDirty&&e.markAsDirty(),e.setValue(e._pendingValue,{emitModelToViewChange:!1}),t.viewToModelUpdate(e._pendingValue),e._pendingChange=!1}function Va(e,t){const n=e.indexOf(t);n>-1&&e.splice(n,1)}const ki="VALID",ka="INVALID",Co="PENDING",Li="DISABLED";function Dd(e){return(Ed(e)?e.validators:e)||null}function BC(e){return Array.isArray(e)?fd(e):e||null}function bd(e,t){return(Ed(t)?t.asyncValidators:e)||null}function HC(e){return Array.isArray(e)?hd(e):e||null}function Ed(e){return null!=e&&!Array.isArray(e)&&"object"==typeof e}class wd{constructor(t,n){this._hasOwnPendingAsyncValidator=!1,this._onCollectionChange=()=>{},this._parent=null,this.pristine=!0,this.touched=!1,this._onDisabledChange=[],this._rawValidators=t,this._rawAsyncValidators=n,this._composedValidatorFn=BC(this._rawValidators),this._composedAsyncValidatorFn=HC(this._rawAsyncValidators)}get validator(){return this._composedValidatorFn}set validator(t){this._rawValidators=this._composedValidatorFn=t}get asyncValidator(){return this._composedAsyncValidatorFn}set asyncValidator(t){this._rawAsyncValidators=this._composedAsyncValidatorFn=t}get parent(){return this._parent}get valid(){return this.status===ki}get invalid(){return this.status===ka}get pending(){return this.status==Co}get disabled(){return this.status===Li}get enabled(){return this.status!==Li}get dirty(){return!this.pristine}get untouched(){return!this.touched}get updateOn(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"}setValidators(t){this._rawValidators=t,this._composedValidatorFn=BC(t)}setAsyncValidators(t){this._rawAsyncValidators=t,this._composedAsyncValidatorFn=HC(t)}addValidators(t){this.setValidators(RC(t,this._rawValidators))}addAsyncValidators(t){this.setAsyncValidators(RC(t,this._rawAsyncValidators))}removeValidators(t){this.setValidators(FC(t,this._rawValidators))}removeAsyncValidators(t){this.setAsyncValidators(FC(t,this._rawAsyncValidators))}hasValidator(t){return xa(this._rawValidators,t)}hasAsyncValidator(t){return xa(this._rawAsyncValidators,t)}clearValidators(){this.validator=null}clearAsyncValidators(){this.asyncValidator=null}markAsTouched(t={}){this.touched=!0,this._parent&&!t.onlySelf&&this._parent.markAsTouched(t)}markAllAsTouched(){this.markAsTouched({onlySelf:!0}),this._forEachChild(t=>t.markAllAsTouched())}markAsUntouched(t={}){this.touched=!1,this._pendingTouched=!1,this._forEachChild(n=>{n.markAsUntouched({onlySelf:!0})}),this._parent&&!t.onlySelf&&this._parent._updateTouched(t)}markAsDirty(t={}){this.pristine=!1,this._parent&&!t.onlySelf&&this._parent.markAsDirty(t)}markAsPristine(t={}){this.pristine=!0,this._pendingDirty=!1,this._forEachChild(n=>{n.markAsPristine({onlySelf:!0})}),this._parent&&!t.onlySelf&&this._parent._updatePristine(t)}markAsPending(t={}){this.status=Co,!1!==t.emitEvent&&this.statusChanges.emit(this.status),this._parent&&!t.onlySelf&&this._parent.markAsPending(t)}disable(t={}){const n=this._parentMarkedDirty(t.onlySelf);this.status=Li,this.errors=null,this._forEachChild(r=>{r.disable(Object.assign(Object.assign({},t),{onlySelf:!0}))}),this._updateValue(),!1!==t.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors(Object.assign(Object.assign({},t),{skipPristineCheck:n})),this._onDisabledChange.forEach(r=>r(!0))}enable(t={}){const n=this._parentMarkedDirty(t.onlySelf);this.status=ki,this._forEachChild(r=>{r.enable(Object.assign(Object.assign({},t),{onlySelf:!0}))}),this.updateValueAndValidity({onlySelf:!0,emitEvent:t.emitEvent}),this._updateAncestors(Object.assign(Object.assign({},t),{skipPristineCheck:n})),this._onDisabledChange.forEach(r=>r(!1))}_updateAncestors(t){this._parent&&!t.onlySelf&&(this._parent.updateValueAndValidity(t),t.skipPristineCheck||this._parent._updatePristine(),this._parent._updateTouched())}setParent(t){this._parent=t}updateValueAndValidity(t={}){this._setInitialStatus(),this._updateValue(),this.enabled&&(this._cancelExistingSubscription(),this.errors=this._runValidator(),this.status=this._calculateStatus(),(this.status===ki||this.status===Co)&&this._runAsyncValidator(t.emitEvent)),!1!==t.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._parent&&!t.onlySelf&&this._parent.updateValueAndValidity(t)}_updateTreeValidity(t={emitEvent:!0}){this._forEachChild(n=>n._updateTreeValidity(t)),this.updateValueAndValidity({onlySelf:!0,emitEvent:t.emitEvent})}_setInitialStatus(){this.status=this._allControlsDisabled()?Li:ki}_runValidator(){return this.validator?this.validator(this):null}_runAsyncValidator(t){if(this.asyncValidator){this.status=Co,this._hasOwnPendingAsyncValidator=!0;const n=EC(this.asyncValidator(this));this._asyncValidationSubscription=n.subscribe(r=>{this._hasOwnPendingAsyncValidator=!1,this.setErrors(r,{emitEvent:t})})}}_cancelExistingSubscription(){this._asyncValidationSubscription&&(this._asyncValidationSubscription.unsubscribe(),this._hasOwnPendingAsyncValidator=!1)}setErrors(t,n={}){this.errors=t,this._updateControlsErrors(!1!==n.emitEvent)}get(t){return function(e,t,n){if(null==t||(Array.isArray(t)||(t=t.split(".")),Array.isArray(t)&&0===t.length))return null;let r=e;return t.forEach(o=>{r=r instanceof Id?r.controls.hasOwnProperty(o)?r.controls[o]:null:r instanceof RR&&r.at(o)||null}),r}(this,t)}getError(t,n){const r=n?this.get(n):this;return r&&r.errors?r.errors[t]:null}hasError(t,n){return!!this.getError(t,n)}get root(){let t=this;for(;t._parent;)t=t._parent;return t}_updateControlsErrors(t){this.status=this._calculateStatus(),t&&this.statusChanges.emit(this.status),this._parent&&this._parent._updateControlsErrors(t)}_initObservables(){this.valueChanges=new ze,this.statusChanges=new ze}_calculateStatus(){return this._allControlsDisabled()?Li:this.errors?ka:this._hasOwnPendingAsyncValidator||this._anyControlsHaveStatus(Co)?Co:this._anyControlsHaveStatus(ka)?ka:ki}_anyControlsHaveStatus(t){return this._anyControls(n=>n.status===t)}_anyControlsDirty(){return this._anyControls(t=>t.dirty)}_anyControlsTouched(){return this._anyControls(t=>t.touched)}_updatePristine(t={}){this.pristine=!this._anyControlsDirty(),this._parent&&!t.onlySelf&&this._parent._updatePristine(t)}_updateTouched(t={}){this.touched=this._anyControlsTouched(),this._parent&&!t.onlySelf&&this._parent._updateTouched(t)}_isBoxedValue(t){return"object"==typeof t&&null!==t&&2===Object.keys(t).length&&"value"in t&&"disabled"in t}_registerOnCollectionChange(t){this._onCollectionChange=t}_setUpdateStrategy(t){Ed(t)&&null!=t.updateOn&&(this._updateOn=t.updateOn)}_parentMarkedDirty(t){return!t&&!(!this._parent||!this._parent.dirty)&&!this._parent._anyControlsDirty()}}class La extends wd{constructor(t=null,n,r){super(Dd(n),bd(r,n)),this._onChange=[],this._applyFormState(t),this._setUpdateStrategy(n),this._initObservables(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}setValue(t,n={}){this.value=this._pendingValue=t,this._onChange.length&&!1!==n.emitModelToViewChange&&this._onChange.forEach(r=>r(this.value,!1!==n.emitViewToModelChange)),this.updateValueAndValidity(n)}patchValue(t,n={}){this.setValue(t,n)}reset(t=null,n={}){this._applyFormState(t),this.markAsPristine(n),this.markAsUntouched(n),this.setValue(this.value,n),this._pendingChange=!1}_updateValue(){}_anyControls(t){return!1}_allControlsDisabled(){return this.disabled}registerOnChange(t){this._onChange.push(t)}_unregisterOnChange(t){Va(this._onChange,t)}registerOnDisabledChange(t){this._onDisabledChange.push(t)}_unregisterOnDisabledChange(t){Va(this._onDisabledChange,t)}_forEachChild(t){}_syncPendingControls(){return!("submit"!==this.updateOn||(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),!this._pendingChange)||(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),0))}_applyFormState(t){this._isBoxedValue(t)?(this.value=this._pendingValue=t.value,t.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=t}}class Id extends wd{constructor(t,n,r){super(Dd(n),bd(r,n)),this.controls=t,this._initObservables(),this._setUpdateStrategy(n),this._setUpControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}registerControl(t,n){return this.controls[t]?this.controls[t]:(this.controls[t]=n,n.setParent(this),n._registerOnCollectionChange(this._onCollectionChange),n)}addControl(t,n,r={}){this.registerControl(t,n),this.updateValueAndValidity({emitEvent:r.emitEvent}),this._onCollectionChange()}removeControl(t,n={}){this.controls[t]&&this.controls[t]._registerOnCollectionChange(()=>{}),delete this.controls[t],this.updateValueAndValidity({emitEvent:n.emitEvent}),this._onCollectionChange()}setControl(t,n,r={}){this.controls[t]&&this.controls[t]._registerOnCollectionChange(()=>{}),delete this.controls[t],n&&this.registerControl(t,n),this.updateValueAndValidity({emitEvent:r.emitEvent}),this._onCollectionChange()}contains(t){return this.controls.hasOwnProperty(t)&&this.controls[t].enabled}setValue(t,n={}){this._checkAllValuesPresent(t),Object.keys(t).forEach(r=>{this._throwIfControlMissing(r),this.controls[r].setValue(t[r],{onlySelf:!0,emitEvent:n.emitEvent})}),this.updateValueAndValidity(n)}patchValue(t,n={}){null!=t&&(Object.keys(t).forEach(r=>{this.controls[r]&&this.controls[r].patchValue(t[r],{onlySelf:!0,emitEvent:n.emitEvent})}),this.updateValueAndValidity(n))}reset(t={},n={}){this._forEachChild((r,o)=>{r.reset(t[o],{onlySelf:!0,emitEvent:n.emitEvent})}),this._updatePristine(n),this._updateTouched(n),this.updateValueAndValidity(n)}getRawValue(){return this._reduceChildren({},(t,n,r)=>(t[r]=n instanceof La?n.value:n.getRawValue(),t))}_syncPendingControls(){let t=this._reduceChildren(!1,(n,r)=>!!r._syncPendingControls()||n);return t&&this.updateValueAndValidity({onlySelf:!0}),t}_throwIfControlMissing(t){if(!Object.keys(this.controls).length)throw new Error("\n There are no form controls registered with this group yet. If you're using ngModel,\n you may want to check next tick (e.g. use setTimeout).\n ");if(!this.controls[t])throw new Error(`Cannot find form control with name: ${t}.`)}_forEachChild(t){Object.keys(this.controls).forEach(n=>{const r=this.controls[n];r&&t(r,n)})}_setUpControls(){this._forEachChild(t=>{t.setParent(this),t._registerOnCollectionChange(this._onCollectionChange)})}_updateValue(){this.value=this._reduceValue()}_anyControls(t){for(const n of Object.keys(this.controls)){const r=this.controls[n];if(this.contains(n)&&t(r))return!0}return!1}_reduceValue(){return this._reduceChildren({},(t,n,r)=>((n.enabled||this.disabled)&&(t[r]=n.value),t))}_reduceChildren(t,n){let r=t;return this._forEachChild((o,i)=>{r=n(r,o,i)}),r}_allControlsDisabled(){for(const t of Object.keys(this.controls))if(this.controls[t].enabled)return!1;return Object.keys(this.controls).length>0||this.disabled}_checkAllValuesPresent(t){this._forEachChild((n,r)=>{if(void 0===t[r])throw new Error(`Must supply a value for form control with name: '${r}'.`)})}}class RR extends wd{constructor(t,n,r){super(Dd(n),bd(r,n)),this.controls=t,this._initObservables(),this._setUpdateStrategy(n),this._setUpControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}at(t){return this.controls[t]}push(t,n={}){this.controls.push(t),this._registerControl(t),this.updateValueAndValidity({emitEvent:n.emitEvent}),this._onCollectionChange()}insert(t,n,r={}){this.controls.splice(t,0,n),this._registerControl(n),this.updateValueAndValidity({emitEvent:r.emitEvent})}removeAt(t,n={}){this.controls[t]&&this.controls[t]._registerOnCollectionChange(()=>{}),this.controls.splice(t,1),this.updateValueAndValidity({emitEvent:n.emitEvent})}setControl(t,n,r={}){this.controls[t]&&this.controls[t]._registerOnCollectionChange(()=>{}),this.controls.splice(t,1),n&&(this.controls.splice(t,0,n),this._registerControl(n)),this.updateValueAndValidity({emitEvent:r.emitEvent}),this._onCollectionChange()}get length(){return this.controls.length}setValue(t,n={}){this._checkAllValuesPresent(t),t.forEach((r,o)=>{this._throwIfControlMissing(o),this.at(o).setValue(r,{onlySelf:!0,emitEvent:n.emitEvent})}),this.updateValueAndValidity(n)}patchValue(t,n={}){null!=t&&(t.forEach((r,o)=>{this.at(o)&&this.at(o).patchValue(r,{onlySelf:!0,emitEvent:n.emitEvent})}),this.updateValueAndValidity(n))}reset(t=[],n={}){this._forEachChild((r,o)=>{r.reset(t[o],{onlySelf:!0,emitEvent:n.emitEvent})}),this._updatePristine(n),this._updateTouched(n),this.updateValueAndValidity(n)}getRawValue(){return this.controls.map(t=>t instanceof La?t.value:t.getRawValue())}clear(t={}){this.controls.length<1||(this._forEachChild(n=>n._registerOnCollectionChange(()=>{})),this.controls.splice(0),this.updateValueAndValidity({emitEvent:t.emitEvent}))}_syncPendingControls(){let t=this.controls.reduce((n,r)=>!!r._syncPendingControls()||n,!1);return t&&this.updateValueAndValidity({onlySelf:!0}),t}_throwIfControlMissing(t){if(!this.controls.length)throw new Error("\n There are no form controls registered with this array yet. If you're using ngModel,\n you may want to check next tick (e.g. use setTimeout).\n ");if(!this.at(t))throw new Error(`Cannot find form control at index ${t}`)}_forEachChild(t){this.controls.forEach((n,r)=>{t(n,r)})}_updateValue(){this.value=this.controls.filter(t=>t.enabled||this.disabled).map(t=>t.value)}_anyControls(t){return this.controls.some(n=>n.enabled&&t(n))}_setUpControls(){this._forEachChild(t=>this._registerControl(t))}_checkAllValuesPresent(t){this._forEachChild((n,r)=>{if(void 0===t[r])throw new Error(`Must supply a value for form control at index: ${r}.`)})}_allControlsDisabled(){for(const t of this.controls)if(t.enabled)return!1;return this.controls.length>0||this.disabled}_registerControl(t){t.setParent(this),t._registerOnCollectionChange(this._onCollectionChange)}}const PR={provide:Wn,useExisting:ue(()=>Ba)},UC=(()=>Promise.resolve(null))();let Ba=(()=>{class e extends Wn{constructor(n,r,o,i){super(),this.control=new La,this._registered=!1,this.update=new ze,this._parent=n,this._setValidators(r),this._setAsyncValidators(o),this.valueAccessor=function(e,t){if(!t)return null;let n,r,o;return Array.isArray(t),t.forEach(i=>{i.constructor===Pi?n=i:function(e){return Object.getPrototypeOf(e.constructor)===mr}(i)?r=i:o=i}),o||r||n||null}(0,i)}ngOnChanges(n){this._checkForErrors(),this._registered||this._setUpControl(),"isDisabled"in n&&this._updateDisabled(n),function(e,t){if(!e.hasOwnProperty("model"))return!1;const n=e.model;return!!n.isFirstChange()||!Object.is(t,n.currentValue)}(n,this.viewModel)&&(this._updateValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.formDirective&&this.formDirective.removeControl(this)}get path(){return this._parent?function(e,t){return[...t.path,e]}(this.name,this._parent):[this.name]}get formDirective(){return this._parent?this._parent.formDirective:null}viewToModelUpdate(n){this.viewModel=n,this.update.emit(n)}_setUpControl(){this._setUpdateStrategy(),this._isStandalone()?this._setUpStandalone():this.formDirective.addControl(this),this._registered=!0}_setUpdateStrategy(){this.options&&null!=this.options.updateOn&&(this.control._updateOn=this.options.updateOn)}_isStandalone(){return!this._parent||!(!this.options||!this.options.standalone)}_setUpStandalone(){Vi(this.control,this),this.control.updateValueAndValidity({emitEvent:!1})}_checkForErrors(){this._isStandalone()||this._checkParentType(),this._checkName()}_checkParentType(){}_checkName(){this.options&&this.options.name&&(this.name=this.options.name),this._isStandalone()}_updateValue(n){UC.then(()=>{this.control.setValue(n,{emitViewToModelChange:!1})})}_updateDisabled(n){const r=n.isDisabled.currentValue,o=""===r||r&&"false"!==r;UC.then(()=>{o&&!this.control.disabled?this.control.disable():!o&&this.control.disabled&&this.control.enable()})}}return e.\u0275fac=function(n){return new(n||e)(I(rt,9),I(We,10),I(Gn,10),I(fn,10))},e.\u0275dir=L({type:e,selectors:[["","ngModel","",3,"formControlName","",3,"formControl",""]],inputs:{name:"name",isDisabled:["disabled","isDisabled"],model:["ngModel","model"],options:["ngModelOptions","options"]},outputs:{update:"ngModelChange"},exportAs:["ngModel"],features:[_e([PR]),ge,ft]}),e})(),zC=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=mn({type:e}),e.\u0275inj=Ft({}),e})();const HR={provide:fn,useExisting:ue(()=>Td),multi:!0};let Td=(()=>{class e extends mr{writeValue(n){this.setProperty("value",parseFloat(n))}registerOnChange(n){this.onChange=r=>{n(""==r?null:parseFloat(r))}}}return e.\u0275fac=function(){let t;return function(r){return(t||(t=Et(e)))(r||e)}}(),e.\u0275dir=L({type:e,selectors:[["input","type","range","formControlName",""],["input","type","range","formControl",""],["input","type","range","ngModel",""]],hostBindings:function(n,r){1&n&&Z("change",function(i){return r.onChange(i.target.value)})("input",function(i){return r.onChange(i.target.value)})("blur",function(){return r.onTouched()})},features:[_e([HR]),ge]}),e})();const WR={provide:fn,useExisting:ue(()=>Hi),multi:!0};function YC(e,t){return null==e?`${t}`:(t&&"object"==typeof t&&(t="Object"),`${e}: ${t}`.slice(0,50))}let Hi=(()=>{class e extends mr{constructor(){super(...arguments),this._optionMap=new Map,this._idCounter=0,this._compareWith=Object.is}set compareWith(n){this._compareWith=n}writeValue(n){this.value=n;const r=this._getOptionId(n);null==r&&this.setProperty("selectedIndex",-1);const o=YC(r,n);this.setProperty("value",o)}registerOnChange(n){this.onChange=r=>{this.value=this._getOptionValue(r),n(this.value)}}_registerOption(){return(this._idCounter++).toString()}_getOptionId(n){for(const r of Array.from(this._optionMap.keys()))if(this._compareWith(this._optionMap.get(r),n))return r;return null}_getOptionValue(n){const r=function(e){return e.split(":")[0]}(n);return this._optionMap.has(r)?this._optionMap.get(r):n}}return e.\u0275fac=function(){let t;return function(r){return(t||(t=Et(e)))(r||e)}}(),e.\u0275dir=L({type:e,selectors:[["select","formControlName","",3,"multiple",""],["select","formControl","",3,"multiple",""],["select","ngModel","",3,"multiple",""]],hostBindings:function(n,r){1&n&&Z("change",function(i){return r.onChange(i.target.value)})("blur",function(){return r.onTouched()})},inputs:{compareWith:"compareWith"},features:[_e([WR]),ge]}),e})(),Rd=(()=>{class e{constructor(n,r,o){this._element=n,this._renderer=r,this._select=o,this._select&&(this.id=this._select._registerOption())}set ngValue(n){null!=this._select&&(this._select._optionMap.set(this.id,n),this._setElementValue(YC(this.id,n)),this._select.writeValue(this._select.value))}set value(n){this._setElementValue(n),this._select&&this._select.writeValue(this._select.value)}_setElementValue(n){this._renderer.setProperty(this._element.nativeElement,"value",n)}ngOnDestroy(){this._select&&(this._select._optionMap.delete(this.id),this._select.writeValue(this._select.value))}}return e.\u0275fac=function(n){return new(n||e)(I($e),I(cr),I(Hi,9))},e.\u0275dir=L({type:e,selectors:[["option"]],inputs:{ngValue:"ngValue",value:"value"}}),e})();const QR={provide:fn,useExisting:ue(()=>Fd),multi:!0};function ZC(e,t){return null==e?`${t}`:("string"==typeof t&&(t=`'${t}'`),t&&"object"==typeof t&&(t="Object"),`${e}: ${t}`.slice(0,50))}let Fd=(()=>{class e extends mr{constructor(){super(...arguments),this._optionMap=new Map,this._idCounter=0,this._compareWith=Object.is}set compareWith(n){this._compareWith=n}writeValue(n){let r;if(this.value=n,Array.isArray(n)){const o=n.map(i=>this._getOptionId(i));r=(i,s)=>{i._setSelected(o.indexOf(s.toString())>-1)}}else r=(o,i)=>{o._setSelected(!1)};this._optionMap.forEach(r)}registerOnChange(n){this.onChange=r=>{const o=[];if(void 0!==r.selectedOptions){const i=r.selectedOptions;for(let s=0;s{class e{constructor(n,r,o){this._element=n,this._renderer=r,this._select=o,this._select&&(this.id=this._select._registerOption(this))}set ngValue(n){null!=this._select&&(this._value=n,this._setElementValue(ZC(this.id,n)),this._select.writeValue(this._select.value))}set value(n){this._select?(this._value=n,this._setElementValue(ZC(this.id,n)),this._select.writeValue(this._select.value)):this._setElementValue(n)}_setElementValue(n){this._renderer.setProperty(this._element.nativeElement,"value",n)}_setSelected(n){this._renderer.setProperty(this._element.nativeElement,"selected",n)}ngOnDestroy(){this._select&&(this._select._optionMap.delete(this.id),this._select.writeValue(this._select.value))}}return e.\u0275fac=function(n){return new(n||e)(I($e),I(cr),I(Fd,9))},e.\u0275dir=L({type:e,selectors:[["option"]],inputs:{ngValue:"ngValue",value:"value"}}),e})(),av=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=mn({type:e}),e.\u0275inj=Ft({imports:[[zC]]}),e})(),oF=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=mn({type:e}),e.\u0275inj=Ft({imports:[av]}),e})();class lv{constructor(){this.riskHotspotsSettings=null,this.coverageInfoSettings=null}}class iF{constructor(){this.groupingMaximum=0,this.grouping=0,this.historyComparisionDate="",this.historyComparisionType="",this.filter="",this.sortBy="name",this.sortOrder="asc",this.collapseStates=[]}}class sF{constructor(t){this.et="",this.et=t.et,this.cl=t.cl,this.ucl=t.ucl,this.cal=t.cal,this.tl=t.tl,this.lcq=t.lcq,this.cb=t.cb,this.tb=t.tb,this.bcq=t.bcq}get coverageRatioText(){return 0===this.tl?"-":this.cl+"/"+this.cal}get branchCoverageRatioText(){return 0===this.tb?"-":this.cb+"/"+this.tb}}class vo{static roundNumber(t,n){return Math.floor(t*Math.pow(10,n))/Math.pow(10,n)}static getNthOrLastIndexOf(t,n,r){let o=0,i=-1,s=-1;for(;o{this.historicCoverages.push(new sF(r))})}get coverage(){return 0===this.coverableLines?"-"!==this.methodCoverage?parseFloat(this.methodCoverage):NaN:vo.roundNumber(100*this.coveredLines/this.coverableLines,1)}get coverageType(){return 0===this.coverableLines?"-"!==this.methodCoverage?this._coverageType:"":this._coverageType}visible(t,n){if(""!==t&&-1===this.name.toLowerCase().indexOf(t.toLowerCase()))return!1;if(""===n||null===this.currentHistoricCoverage)return!0;if("allChanges"===n){if(this.coveredLines===this.currentHistoricCoverage.cl&&this.uncoveredLines===this.currentHistoricCoverage.ucl&&this.coverableLines===this.currentHistoricCoverage.cal&&this.totalLines===this.currentHistoricCoverage.tl&&this.coveredBranches===this.currentHistoricCoverage.cb&&this.totalBranches===this.currentHistoricCoverage.tb)return!1}else if("lineCoverageIncreaseOnly"===n){let r=this.coverage;if(isNaN(r)||r<=this.currentHistoricCoverage.lcq)return!1}else if("lineCoverageDecreaseOnly"===n){let r=this.coverage;if(isNaN(r)||r>=this.currentHistoricCoverage.lcq)return!1}else if("branchCoverageIncreaseOnly"===n){let r=this.branchCoverage;if(isNaN(r)||r<=this.currentHistoricCoverage.bcq)return!1}else if("branchCoverageDecreaseOnly"===n){let r=this.branchCoverage;if(isNaN(r)||r>=this.currentHistoricCoverage.bcq)return!1}return!0}updateCurrentHistoricCoverage(t){if(this.currentHistoricCoverage=null,""!==t)for(let n=0;n-1&&null===n}visible(t,n){if(""!==t&&this.name.toLowerCase().indexOf(t.toLowerCase())>-1)return!0;for(let r=0;r{class e{get nativeWindow(){return window}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=te({token:e,factory:e.\u0275fac}),e})();function lF(e,t){1&e&&k(0,"td",3)}function cF(e,t){1&e&&k(0,"td"),2&e&&Ln("green ",w().greenClass,"")}function uF(e,t){1&e&&k(0,"td"),2&e&&Ln("red ",w().redClass,"")}let uv=(()=>{class e{constructor(){this.grayVisible=!0,this.greenVisible=!1,this.redVisible=!1,this.greenClass="",this.redClass="",this._percentage=NaN}get percentage(){return this._percentage}set percentage(n){this._percentage=n,this.grayVisible=isNaN(n),this.greenVisible=!isNaN(n)&&Math.round(n)>0,this.redVisible=!isNaN(n)&&100-Math.round(n)>0,this.greenClass="covered"+Math.round(n),this.redClass="covered"+(100-Math.round(n))}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275cmp=xn({type:e,selectors:[["coverage-bar"]],inputs:{percentage:"percentage"},decls:4,vars:3,consts:[[1,"coverage"],["class","gray covered100",4,"ngIf"],[3,"class",4,"ngIf"],[1,"gray","covered100"]],template:function(n,r){1&n&&(y(0,"table",0),S(1,lF,1,0,"td",1),S(2,cF,1,3,"td",2),S(3,uF,1,3,"td",2),C()),2&n&&(g(1),D("ngIf",r.grayVisible),g(1),D("ngIf",r.greenVisible),g(1),D("ngIf",r.redVisible))},directives:[yo],encapsulation:2,changeDetection:0}),e})();const dF=["codeelement-row",""];function fF(e,t){if(1&e&&(y(0,"th",2),M(1),C()),2&e){const n=w();g(1),P(n.element.coveredBranches)}}function hF(e,t){if(1&e&&(y(0,"th",2),M(1),C()),2&e){const n=w();g(1),P(n.element.totalBranches)}}function pF(e,t){if(1&e&&(y(0,"th",3),M(1),C()),2&e){const n=w();D("title",n.element.branchCoverageRatioText),g(1),P(n.element.branchCoveragePercentage)}}function gF(e,t){if(1&e&&(y(0,"th",2),k(1,"coverage-bar",4),C()),2&e){const n=w();g(1),D("percentage",n.element.branchCoverage)}}const mF=function(e,t){return{"icon-plus":e,"icon-minus":t}};let _F=(()=>{class e{constructor(){this.collapsed=!1,this.branchCoverageAvailable=!1}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275cmp=xn({type:e,selectors:[["","codeelement-row",""]],inputs:{element:"element",collapsed:"collapsed",branchCoverageAvailable:"branchCoverageAvailable"},attrs:dF,decls:20,vars:16,consts:[["href","#",3,"click"],[3,"ngClass"],[1,"right"],[1,"right",3,"title"],[3,"percentage"],["class","right",4,"ngIf"],["class","right",3,"title",4,"ngIf"]],template:function(n,r){1&n&&(y(0,"th"),y(1,"a",0),Z("click",function(i){return r.element.toggleCollapse(i)}),k(2,"i",1),M(3),C(),C(),y(4,"th",2),M(5),C(),y(6,"th",2),M(7),C(),y(8,"th",2),M(9),C(),y(10,"th",2),M(11),C(),y(12,"th",3),M(13),C(),y(14,"th",2),k(15,"coverage-bar",4),C(),S(16,fF,2,1,"th",5),S(17,hF,2,1,"th",5),S(18,pF,2,2,"th",6),S(19,gF,2,1,"th",5)),2&n&&(g(2),D("ngClass",su(13,mF,r.element.collapsed,!r.element.collapsed)),g(1),oe(" ",r.element.name,""),g(2),P(r.element.coveredLines),g(2),P(r.element.uncoveredLines),g(2),P(r.element.coverableLines),g(2),P(r.element.totalLines),g(1),D("title",r.element.coverageRatioText),g(1),P(r.element.coveragePercentage),g(2),D("percentage",r.element.coverage),g(1),D("ngIf",r.branchCoverageAvailable),g(1),D("ngIf",r.branchCoverageAvailable),g(1),D("ngIf",r.branchCoverageAvailable),g(1),D("ngIf",r.branchCoverageAvailable))},directives:[Ni,uv,yo],encapsulation:2,changeDetection:0}),e})();const yF=["coverage-history-chart",""];let CF=(()=>{class e{constructor(){this.path=null,this._historicCoverages=[]}get historicCoverages(){return this._historicCoverages}set historicCoverages(n){if(this._historicCoverages=n,n.length>1){let r="";for(let o=0;o1),g(1),D("ngIf",null!==n.clazz.currentHistoricCoverage),g(1),D("ngIf",null===n.clazz.currentHistoricCoverage)}}function GF(e,t){if(1&e&&(y(0,"td",2),k(1,"coverage-bar",5),C()),2&e){const n=w();g(1),D("percentage",n.clazz.branchCoverage)}}let zF=(()=>{class e{constructor(){this.translations={},this.branchCoverageAvailable=!1,this.historyComparisionDate=""}getClassName(n,r){return n>r?"lightgreen":n1),g(1),D("ngIf",null!==r.clazz.currentHistoricCoverage),g(1),D("ngIf",null===r.clazz.currentHistoricCoverage),g(2),D("percentage",r.clazz.coverage),g(1),D("ngIf",r.branchCoverageAvailable),g(1),D("ngIf",r.branchCoverageAvailable),g(1),D("ngIf",r.branchCoverageAvailable),g(1),D("ngIf",r.branchCoverageAvailable))},directives:[yo,uv,CF,Ni],encapsulation:2,changeDetection:0}),e})();function WF(e,t){if(1&e&&(se(0),M(1),ae()),2&e){const n=w(2);g(1),P(n.translations.noGrouping)}}function qF(e,t){if(1&e&&(se(0),M(1),ae()),2&e){const n=w(2);g(1),P(n.translations.byAssembly)}}function QF(e,t){if(1&e&&(se(0),M(1),ae()),2&e){const n=w(2);g(1),P(n.translations.byNamespace+" "+n.settings.grouping)}}function KF(e,t){if(1&e&&(y(0,"option",26),M(1),C()),2&e){const n=t.$implicit;D("value",n),g(1),P(n)}}function YF(e,t){1&e&&k(0,"br")}function ZF(e,t){if(1&e&&(y(0,"option",32),M(1),C()),2&e){const n=w(4);g(1),oe(" ",n.translations.branchCoverageIncreaseOnly," ")}}function JF(e,t){if(1&e&&(y(0,"option",33),M(1),C()),2&e){const n=w(4);g(1),oe(" ",n.translations.branchCoverageDecreaseOnly," ")}}function XF(e,t){if(1&e){const n=ln();y(0,"div"),y(1,"select",23),Z("ngModelChange",function(o){return le(n),w(3).settings.historyComparisionType=o}),y(2,"option",24),M(3),C(),y(4,"option",27),M(5),C(),y(6,"option",28),M(7),C(),y(8,"option",29),M(9),C(),S(10,ZF,2,1,"option",30),S(11,JF,2,1,"option",31),C(),C()}if(2&e){const n=w(3);g(1),D("ngModel",n.settings.historyComparisionType),g(2),P(n.translations.filter),g(2),P(n.translations.allChanges),g(2),P(n.translations.lineCoverageIncreaseOnly),g(2),P(n.translations.lineCoverageDecreaseOnly),g(1),D("ngIf",n.branchCoverageAvailable),g(1),D("ngIf",n.branchCoverageAvailable)}}function eO(e,t){if(1&e){const n=ln();se(0),y(1,"div"),M(2),y(3,"select",23),Z("ngModelChange",function(o){return le(n),w(2).settings.historyComparisionDate=o})("ngModelChange",function(){return le(n),w(2).updateCurrentHistoricCoverage()}),y(4,"option",24),M(5),C(),S(6,KF,2,2,"option",25),C(),C(),S(7,YF,1,0,"br",0),S(8,XF,12,7,"div",0),ae()}if(2&e){const n=w(2);g(2),oe(" ",n.translations.compareHistory," "),g(1),D("ngModel",n.settings.historyComparisionDate),g(2),P(n.translations.date),g(1),D("ngForOf",n.historicCoverageExecutionTimes),g(1),D("ngIf",""!==n.settings.historyComparisionDate),g(1),D("ngIf",""!==n.settings.historyComparisionDate)}}function tO(e,t){1&e&&k(0,"col",8)}function nO(e,t){1&e&&k(0,"col",11)}function rO(e,t){1&e&&k(0,"col",12)}function oO(e,t){1&e&&k(0,"col",13)}const In=function(e,t,n){return{"icon-up-dir_active":e,"icon-down-dir_active":t,"icon-down-dir":n}};function iO(e,t){if(1&e){const n=ln();y(0,"th",5),y(1,"a",2),Z("click",function(o){return le(n),w(2).updateSorting("covered_branches",o)}),k(2,"i",18),M(3),C(),C()}if(2&e){const n=w(2);g(2),D("ngClass",st(2,In,"covered_branches"===n.settings.sortBy&&"desc"===n.settings.sortOrder,"covered_branches"===n.settings.sortBy&&"asc"===n.settings.sortOrder,"covered_branches"!==n.settings.sortBy)),g(1),P(n.translations.covered)}}function sO(e,t){if(1&e){const n=ln();y(0,"th",5),y(1,"a",2),Z("click",function(o){return le(n),w(2).updateSorting("total_branches",o)}),k(2,"i",18),M(3),C(),C()}if(2&e){const n=w(2);g(2),D("ngClass",st(2,In,"total_branches"===n.settings.sortBy&&"desc"===n.settings.sortOrder,"total_branches"===n.settings.sortBy&&"asc"===n.settings.sortOrder,"total_branches"!==n.settings.sortBy)),g(1),P(n.translations.total)}}function aO(e,t){if(1&e){const n=ln();y(0,"th",19),y(1,"a",2),Z("click",function(o){return le(n),w(2).updateSorting("branchcoverage",o)}),k(2,"i",18),M(3),C(),C()}if(2&e){const n=w(2);g(2),D("ngClass",st(2,In,"branchcoverage"===n.settings.sortBy&&"desc"===n.settings.sortOrder,"branchcoverage"===n.settings.sortBy&&"asc"===n.settings.sortOrder,"branchcoverage"!==n.settings.sortBy)),g(1),P(n.translations.branchCoverage)}}function lO(e,t){if(1&e&&k(0,"tr",35),2&e){const n=w().$implicit,r=w(2);D("element",n)("collapsed",n.collapsed)("branchCoverageAvailable",r.branchCoverageAvailable)}}function cO(e,t){if(1&e&&k(0,"tr",37),2&e){const n=w().$implicit,r=w(3);D("clazz",n)("translations",r.translations)("branchCoverageAvailable",r.branchCoverageAvailable)("historyComparisionDate",r.settings.historyComparisionDate)}}function uO(e,t){if(1&e&&(se(0),S(1,cO,1,4,"tr",36),ae()),2&e){const n=t.$implicit,r=w().$implicit,o=w(2);g(1),D("ngIf",!r.collapsed&&n.visible(o.settings.filter,o.settings.historyComparisionType))}}function dO(e,t){if(1&e&&k(0,"tr",40),2&e){const n=w().$implicit,r=w(5);D("clazz",n)("translations",r.translations)("branchCoverageAvailable",r.branchCoverageAvailable)("historyComparisionDate",r.settings.historyComparisionDate)}}function fO(e,t){if(1&e&&(se(0),S(1,dO,1,4,"tr",39),ae()),2&e){const n=t.$implicit,r=w(2).$implicit,o=w(3);g(1),D("ngIf",!r.collapsed&&n.visible(o.settings.filter,o.settings.historyComparisionType))}}function hO(e,t){if(1&e&&(se(0),k(1,"tr",38),S(2,fO,2,1,"ng-container",22),ae()),2&e){const n=w().$implicit,r=w(3);g(1),D("element",n)("collapsed",n.collapsed)("branchCoverageAvailable",r.branchCoverageAvailable),g(1),D("ngForOf",n.classes)}}function pO(e,t){if(1&e&&(se(0),S(1,hO,3,4,"ng-container",0),ae()),2&e){const n=t.$implicit,r=w().$implicit,o=w(2);g(1),D("ngIf",!r.collapsed&&n.visible(o.settings.filter,o.settings.historyComparisionType))}}function gO(e,t){if(1&e&&(se(0),S(1,lO,1,3,"tr",34),S(2,uO,2,1,"ng-container",22),S(3,pO,2,1,"ng-container",22),ae()),2&e){const n=t.$implicit,r=w(2);g(1),D("ngIf",n.visible(r.settings.filter,r.settings.historyComparisionType)),g(1),D("ngForOf",n.classes),g(1),D("ngForOf",n.subElements)}}function mO(e,t){if(1&e){const n=ln();y(0,"div"),y(1,"div",1),y(2,"div"),y(3,"a",2),Z("click",function(o){return le(n),w().collapseAll(o)}),M(4),C(),M(5," | "),y(6,"a",2),Z("click",function(o){return le(n),w().expandAll(o)}),M(7),C(),C(),y(8,"div",3),S(9,WF,2,1,"ng-container",0),S(10,qF,2,1,"ng-container",0),S(11,QF,2,1,"ng-container",0),k(12,"br"),M(13),y(14,"input",4),Z("ngModelChange",function(o){return le(n),w().settings.grouping=o})("ngModelChange",function(){return le(n),w().updateCoverageInfo()}),C(),C(),y(15,"div",3),S(16,eO,9,6,"ng-container",0),C(),y(17,"div",5),y(18,"span"),M(19),C(),y(20,"input",6),Z("ngModelChange",function(o){return le(n),w().settings.filter=o}),C(),C(),C(),y(21,"table",7),y(22,"colgroup"),k(23,"col"),k(24,"col",8),k(25,"col",9),k(26,"col",10),k(27,"col",11),k(28,"col",12),k(29,"col",13),S(30,tO,1,0,"col",14),S(31,nO,1,0,"col",15),S(32,rO,1,0,"col",16),S(33,oO,1,0,"col",17),C(),y(34,"thead"),y(35,"tr"),y(36,"th"),y(37,"a",2),Z("click",function(o){return le(n),w().updateSorting("name",o)}),k(38,"i",18),M(39),C(),C(),y(40,"th",5),y(41,"a",2),Z("click",function(o){return le(n),w().updateSorting("covered",o)}),k(42,"i",18),M(43),C(),C(),y(44,"th",5),y(45,"a",2),Z("click",function(o){return le(n),w().updateSorting("uncovered",o)}),k(46,"i",18),M(47),C(),C(),y(48,"th",5),y(49,"a",2),Z("click",function(o){return le(n),w().updateSorting("coverable",o)}),k(50,"i",18),M(51),C(),C(),y(52,"th",5),y(53,"a",2),Z("click",function(o){return le(n),w().updateSorting("total",o)}),k(54,"i",18),M(55),C(),C(),y(56,"th",19),y(57,"a",2),Z("click",function(o){return le(n),w().updateSorting("coverage",o)}),k(58,"i",18),M(59),C(),C(),S(60,iO,4,6,"th",20),S(61,sO,4,6,"th",20),S(62,aO,4,6,"th",21),C(),C(),y(63,"tbody"),S(64,gO,4,3,"ng-container",22),C(),C(),C()}if(2&e){const n=w();g(4),P(n.translations.collapseAll),g(3),P(n.translations.expandAll),g(2),D("ngIf",-1===n.settings.grouping),g(1),D("ngIf",0===n.settings.grouping),g(1),D("ngIf",n.settings.grouping>0),g(2),oe(" ",n.translations.grouping," "),g(1),D("max",n.settings.groupingMaximum)("ngModel",n.settings.grouping),g(2),D("ngIf",n.historicCoverageExecutionTimes.length>0),g(3),oe("",n.translations.filter," "),g(1),D("ngModel",n.settings.filter),g(10),D("ngIf",n.branchCoverageAvailable),g(1),D("ngIf",n.branchCoverageAvailable),g(1),D("ngIf",n.branchCoverageAvailable),g(1),D("ngIf",n.branchCoverageAvailable),g(5),D("ngClass",st(31,In,"name"===n.settings.sortBy&&"desc"===n.settings.sortOrder,"name"===n.settings.sortBy&&"asc"===n.settings.sortOrder,"name"!==n.settings.sortBy)),g(1),P(n.translations.name),g(3),D("ngClass",st(35,In,"covered"===n.settings.sortBy&&"desc"===n.settings.sortOrder,"covered"===n.settings.sortBy&&"asc"===n.settings.sortOrder,"covered"!==n.settings.sortBy)),g(1),P(n.translations.covered),g(3),D("ngClass",st(39,In,"uncovered"===n.settings.sortBy&&"desc"===n.settings.sortOrder,"uncovered"===n.settings.sortBy&&"asc"===n.settings.sortOrder,"uncovered"!==n.settings.sortBy)),g(1),P(n.translations.uncovered),g(3),D("ngClass",st(43,In,"coverable"===n.settings.sortBy&&"desc"===n.settings.sortOrder,"coverable"===n.settings.sortBy&&"asc"===n.settings.sortOrder,"coverable"!==n.settings.sortBy)),g(1),P(n.translations.coverable),g(3),D("ngClass",st(47,In,"total"===n.settings.sortBy&&"desc"===n.settings.sortOrder,"total"===n.settings.sortBy&&"asc"===n.settings.sortOrder,"total"!==n.settings.sortBy)),g(1),P(n.translations.total),g(3),D("ngClass",st(51,In,"coverage"===n.settings.sortBy&&"desc"===n.settings.sortOrder,"coverage"===n.settings.sortBy&&"asc"===n.settings.sortOrder,"coverage"!==n.settings.sortBy)),g(1),P(n.translations.coverage),g(1),D("ngIf",n.branchCoverageAvailable),g(1),D("ngIf",n.branchCoverageAvailable),g(1),D("ngIf",n.branchCoverageAvailable),g(2),D("ngForOf",n.codeElements)}}let _O=(()=>{class e{constructor(n){this.queryString="",this.historicCoverageExecutionTimes=[],this.branchCoverageAvailable=!1,this.codeElements=[],this.translations={},this.settings=new iF,this.window=n.nativeWindow}ngOnInit(){this.historicCoverageExecutionTimes=this.window.historicCoverageExecutionTimes,this.branchCoverageAvailable=this.window.branchCoverageAvailable,this.translations=this.window.translations;let n=!1;if(void 0!==this.window.history&&void 0!==this.window.history.replaceState&&null!==this.window.history.state&&null!=this.window.history.state.coverageInfoSettings)console.log("Coverage info: Restoring from history",this.window.history.state.coverageInfoSettings),n=!0,this.settings=JSON.parse(JSON.stringify(this.window.history.state.coverageInfoSettings));else{let o=0,i=this.window.assemblies;for(let s=0;s-1&&(this.queryString=window.location.href.substr(r)),this.updateCoverageInfo(),n&&this.restoreCollapseState()}onDonBeforeUnlodad(){if(this.saveCollapseState(),void 0!==this.window.history&&void 0!==this.window.history.replaceState){console.log("Coverage info: Updating history",this.settings);let n=new lv;null!==window.history.state&&(n=JSON.parse(JSON.stringify(this.window.history.state))),n.coverageInfoSettings=JSON.parse(JSON.stringify(this.settings)),window.history.replaceState(n,"")}}updateCoverageInfo(){let n=(new Date).getTime(),r=this.window.assemblies,o=[],i=0;if(0===this.settings.grouping)for(let l=0;l{for(let o=0;o{for(let i=0;in&&(o[i].collapsed=this.settings.collapseStates[n]),n++,r(o[i].subElements)};r(this.codeElements)}}return e.\u0275fac=function(n){return new(n||e)(I(kd))},e.\u0275cmp=xn({type:e,selectors:[["coverage-info"]],hostBindings:function(n,r){1&n&&Z("beforeunload",function(){return r.onDonBeforeUnlodad()},!1,Hl)},decls:1,vars:1,consts:[[4,"ngIf"],[1,"customizebox"],["href","#",3,"click"],[1,"center"],["type","range","step","1","min","-1",3,"max","ngModel","ngModelChange"],[1,"right"],["type","text",3,"ngModel","ngModelChange"],[1,"overview","table-fixed","stripped"],[1,"column90"],[1,"column105"],[1,"column100"],[1,"column70"],[1,"column98"],[1,"column112"],["class","column90",4,"ngIf"],["class","column70",4,"ngIf"],["class","column98",4,"ngIf"],["class","column112",4,"ngIf"],[1,"icon-down-dir",3,"ngClass"],["colspan","2",1,"center"],["class","right",4,"ngIf"],["class","center","colspan","2",4,"ngIf"],[4,"ngFor","ngForOf"],[3,"ngModel","ngModelChange"],["value",""],[3,"value",4,"ngFor","ngForOf"],[3,"value"],["value","allChanges"],["value","lineCoverageIncreaseOnly"],["value","lineCoverageDecreaseOnly"],["value","branchCoverageIncreaseOnly",4,"ngIf"],["value","branchCoverageDecreaseOnly",4,"ngIf"],["value","branchCoverageIncreaseOnly"],["value","branchCoverageDecreaseOnly"],["codeelement-row","",3,"element","collapsed","branchCoverageAvailable",4,"ngIf"],["codeelement-row","",3,"element","collapsed","branchCoverageAvailable"],["class-row","",3,"clazz","translations","branchCoverageAvailable","historyComparisionDate",4,"ngIf"],["class-row","",3,"clazz","translations","branchCoverageAvailable","historyComparisionDate"],["codeelement-row","",1,"namespace",3,"element","collapsed","branchCoverageAvailable"],["class","namespace","class-row","",3,"clazz","translations","branchCoverageAvailable","historyComparisionDate",4,"ngIf"],["class-row","",1,"namespace",3,"clazz","translations","branchCoverageAvailable","historyComparisionDate"]],template:function(n,r){1&n&&S(0,mO,65,55,"div",0),2&n&&D("ngIf",r.codeElements.length>0)},directives:[yo,Td,Pi,gd,Ba,Ni,Yu,Hi,Rd,Od,_F,zF],encapsulation:2}),e})();class yO{constructor(){this.assembly="",this.numberOfRiskHotspots=10,this.filter="",this.sortBy="",this.sortOrder="asc"}}function CO(e,t){if(1&e&&(y(0,"option",14),M(1),C()),2&e){const n=t.$implicit;D("value",n),g(1),P(n)}}function vO(e,t){if(1&e&&(y(0,"span"),M(1),C()),2&e){const n=w(2);g(1),P(n.translations.top)}}function DO(e,t){1&e&&(y(0,"option",21),M(1,"20"),C())}function bO(e,t){1&e&&(y(0,"option",22),M(1,"50"),C())}function EO(e,t){1&e&&(y(0,"option",23),M(1,"100"),C())}function wO(e,t){if(1&e&&(y(0,"option",14),M(1),C()),2&e){const n=w(3);D("value",n.totalNumberOfRiskHotspots),g(1),P(n.translations.all)}}function IO(e,t){if(1&e){const n=ln();y(0,"select",15),Z("ngModelChange",function(o){return le(n),w(2).settings.numberOfRiskHotspots=o}),y(1,"option",16),M(2,"10"),C(),S(3,DO,2,0,"option",17),S(4,bO,2,0,"option",18),S(5,EO,2,0,"option",19),S(6,wO,2,2,"option",20),C()}if(2&e){const n=w(2);D("ngModel",n.settings.numberOfRiskHotspots),g(3),D("ngIf",n.totalNumberOfRiskHotspots>10),g(1),D("ngIf",n.totalNumberOfRiskHotspots>20),g(1),D("ngIf",n.totalNumberOfRiskHotspots>50),g(1),D("ngIf",n.totalNumberOfRiskHotspots>100)}}function MO(e,t){1&e&&k(0,"col",24)}const Ha=function(e,t,n){return{"icon-up-dir_active":e,"icon-down-dir_active":t,"icon-down-dir":n}};function TO(e,t){if(1&e){const n=ln();y(0,"th"),y(1,"a",11),Z("click",function(o){const s=le(n).index;return w(2).updateSorting(""+s,o)}),k(2,"i",12),M(3),C(),y(4,"a",25),k(5,"i",26),C(),C()}if(2&e){const n=t.$implicit,r=t.index,o=w(2);g(2),D("ngClass",st(3,Ha,o.settings.sortBy===""+r&&"desc"===o.settings.sortOrder,o.settings.sortBy===""+r&&"asc"===o.settings.sortOrder,o.settings.sortBy!==""+r)),g(1),P(n.name),g(1),oi("href",n.explanationUrl,Vr)}}const AO=function(e,t){return{lightred:e,lightgreen:t}};function SO(e,t){if(1&e&&(y(0,"td",29),M(1),C()),2&e){const n=t.$implicit;D("ngClass",su(2,AO,n.exceeded,!n.exceeded)),g(1),P(n.value)}}function xO(e,t){if(1&e&&(y(0,"tr"),y(1,"td"),M(2),C(),y(3,"td"),y(4,"a",25),M(5),C(),C(),y(6,"td",27),y(7,"a",25),M(8),C(),C(),S(9,SO,2,5,"td",28),C()),2&e){const n=t.$implicit,r=w(2);g(2),P(n.assembly),g(2),D("href",n.reportPath+r.queryString,Vr),g(1),P(n.class),g(1),D("title",n.methodName),g(1),D("href",n.reportPath+r.queryString+"#file"+n.fileIndex+"_line"+n.line,Vr),g(1),oe(" ",n.methodShortName," "),g(1),D("ngForOf",n.metrics)}}function NO(e,t){if(1&e){const n=ln();y(0,"div"),y(1,"div",1),y(2,"div"),y(3,"select",2),Z("ngModelChange",function(o){return le(n),w().settings.assembly=o})("ngModelChange",function(){return le(n),w().updateRiskHotpots()}),y(4,"option",3),M(5),C(),S(6,CO,2,2,"option",4),C(),C(),y(7,"div",5),S(8,vO,2,1,"span",0),S(9,IO,7,5,"select",6),C(),k(10,"div",5),y(11,"div",7),y(12,"span"),M(13),C(),y(14,"input",8),Z("ngModelChange",function(o){return le(n),w().settings.filter=o})("ngModelChange",function(){return le(n),w().updateRiskHotpots()}),C(),C(),C(),y(15,"table",9),y(16,"colgroup"),k(17,"col"),k(18,"col"),k(19,"col"),S(20,MO,1,0,"col",10),C(),y(21,"thead"),y(22,"tr"),y(23,"th"),y(24,"a",11),Z("click",function(o){return le(n),w().updateSorting("assembly",o)}),k(25,"i",12),M(26),C(),C(),y(27,"th"),y(28,"a",11),Z("click",function(o){return le(n),w().updateSorting("class",o)}),k(29,"i",12),M(30),C(),C(),y(31,"th"),y(32,"a",11),Z("click",function(o){return le(n),w().updateSorting("method",o)}),k(33,"i",12),M(34),C(),C(),S(35,TO,6,7,"th",13),C(),C(),y(36,"tbody"),S(37,xO,10,7,"tr",13),function(e,t){const n=J();let r;const o=e+20;n.firstCreatePass?(r=function(e,t){if(t)for(let n=t.length-1;n>=0;n--){const r=t[n];if(e===r.name)return r}throw new Qn("302",`The pipe '${e}' could not be found!`)}(t,n.pipeRegistry),n.data[o]=r,r.onDestroy&&(n.destroyHooks||(n.destroyHooks=[])).push(o,r.onDestroy)):r=n.data[o];const i=r.factory||(r.factory=Xn(r.type)),s=An(I);try{const a=us(!1),l=i();us(a),function(e,t,n,r){n>=e.data.length&&(e.data[n]=null,e.blueprint[n]=null),t[n]=r}(n,b(),o,l)}finally{An(s)}}(38,"slice"),C(),C(),C()}if(2&e){const n=w();g(3),D("ngModel",n.settings.assembly),g(2),P(n.translations.assembly),g(1),D("ngForOf",n.assemblies),g(2),D("ngIf",n.totalNumberOfRiskHotspots>10),g(1),D("ngIf",n.totalNumberOfRiskHotspots>10),g(4),oe("",n.translations.filter," "),g(1),D("ngModel",n.settings.filter),g(6),D("ngForOf",n.riskHotspotMetrics),g(5),D("ngClass",st(20,Ha,"assembly"===n.settings.sortBy&&"desc"===n.settings.sortOrder,"assembly"===n.settings.sortBy&&"asc"===n.settings.sortOrder,"assembly"!==n.settings.sortBy)),g(1),P(n.translations.assembly),g(3),D("ngClass",st(24,Ha,"class"===n.settings.sortBy&&"desc"===n.settings.sortOrder,"class"===n.settings.sortBy&&"asc"===n.settings.sortOrder,"class"!==n.settings.sortBy)),g(1),P(n.translations.class),g(3),D("ngClass",st(28,Ha,"method"===n.settings.sortBy&&"desc"===n.settings.sortOrder,"method"===n.settings.sortBy&&"asc"===n.settings.sortOrder,"method"!==n.settings.sortBy)),g(1),P(n.translations.method),g(1),D("ngForOf",n.riskHotspotMetrics),g(2),D("ngForOf",M_(38,16,n.riskHotspots,0,n.settings.numberOfRiskHotspots))}}let RO=(()=>{class e{constructor(n){this.queryString="",this.riskHotspotMetrics=[],this.riskHotspots=[],this.totalNumberOfRiskHotspots=0,this.assemblies=[],this.translations={},this.settings=new yO,this.window=n.nativeWindow}ngOnInit(){this.riskHotspotMetrics=this.window.riskHotspotMetrics,this.translations=this.window.translations,void 0!==this.window.history&&void 0!==this.window.history.replaceState&&null!==this.window.history.state&&null!=this.window.history.state.riskHotspotsSettings&&(console.log("Risk hotspots: Restoring from history",this.window.history.state.riskHotspotsSettings),this.settings=JSON.parse(JSON.stringify(this.window.history.state.riskHotspotsSettings)));const n=window.location.href.indexOf("?");n>-1&&(this.queryString=window.location.href.substr(n)),this.updateRiskHotpots()}onDonBeforeUnlodad(){if(void 0!==this.window.history&&void 0!==this.window.history.replaceState){console.log("Risk hotspots: Updating history",this.settings);let n=new lv;null!==window.history.state&&(n=JSON.parse(JSON.stringify(this.window.history.state))),n.riskHotspotsSettings=JSON.parse(JSON.stringify(this.settings)),window.history.replaceState(n,"")}}updateRiskHotpots(){const n=this.window.riskHotspots;if(this.totalNumberOfRiskHotspots=n.length,0===this.assemblies.length){let s=[];for(let a=0;a0)},directives:[yo,Hi,gd,Ba,Rd,Od,Yu,Pi,Ni],pipes:[Yy],encapsulation:2}),e})(),FO=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=mn({type:e,bootstrap:[RO,_O]}),e.\u0275inj=Ft({providers:[kd],imports:[[iR,oF]]}),e})();rR().bootstrapModule(FO).catch(e=>console.error(e))}},wo=>{wo(wo.s=15)}]); \ No newline at end of file diff --git a/docs/coverage/report.css b/docs/coverage/report.css deleted file mode 100644 index 27ef3f3c..00000000 --- a/docs/coverage/report.css +++ /dev/null @@ -1,564 +0,0 @@ -html { font-family: sans-serif; margin: 0; padding: 0; font-size: 0.9em; background-color: #d6d6d6; height: 100%; } -body { margin: 0; padding: 0; height: 100%; color: #000; } -h1 { font-family: 'Century Gothic', sans-serif; font-size: 1.2em; font-weight: normal; color: #fff; background-color: #6f6f6f; padding: 10px; margin: 20px -20px 20px -20px; } -h1:first-of-type { margin-top: 0; } -h2 { font-size: 1.0em; font-weight: bold; margin: 10px 0 15px 0; padding: 0; } -h3 { font-size: 1.0em; font-weight: bold; margin: 0 0 10px 0; padding: 0; display: inline-block; } -a { color: #c00; text-decoration: none; } -a:hover { color: #000; text-decoration: none; } -h1 a.back { color: #fff; background-color: #949494; display: inline-block; margin: -12px 5px -10px -10px; padding: 10px; border-right: 1px solid #fff; } -h1 a.back:hover { background-color: #ccc; } -h1 a.button { color: #000; background-color: #bebebe; margin: -5px 0 0 10px; padding: 5px 8px 5px 8px; border: 1px solid #fff; font-size: 0.9em; border-radius: 3px; float:right; } -h1 a.button:hover { background-color: #ccc; } -h1 a.button i { position: relative; top: 1px; } - -.container { margin: auto; max-width: 1650px; width: 90%; background-color: #fff; display: flex; box-shadow: 0 0 60px #7d7d7d; min-height: 100%; } -.containerleft { padding: 0 20px 20px 20px; flex: 1; } -.containerright { width: 340px; min-width: 340px; background-color: #e5e5e5; height: 100%; } -.containerrightfixed { position: fixed; padding: 0 20px 20px 20px; border-left: solid 1px #6f6f6f; width: 300px; overflow-y: auto; height: 100%; top: 0; bottom: 0; } -.containerrightfixed h1 { background-color: #c00; } -.containerrightfixed label, .containerright a { white-space: nowrap; overflow: hidden; display: inline-block; width: 100%; max-width: 300px; text-overflow: ellipsis; } -.containerright a { margin-bottom: 3px; } - -@media screen and (max-width:1200px){ - .container { box-shadow: none; width: 100%; } - .containerright { display: none; } -} - -.footer { font-size: 0.7em; text-align: center; margin-top: 35px; } - -th { text-align: left; } -.table-fixed { table-layout: fixed; } -.overview { border: solid 1px #c1c1c1; border-collapse: collapse; width: 100%; word-wrap: break-word; } -.overview th { border: solid 1px #c1c1c1; border-collapse: collapse; padding: 2px 4px 2px 4px; background-color: #ddd; } -.overview tr.namespace th { background-color: #dcdcdc; } -.overview thead th { background-color: #d1d1d1; } -.overview th a { color: #000; } -.overview tr.namespace a { margin-left: 15px; display: block; } -.overview td { border: solid 1px #c1c1c1; border-collapse: collapse; padding: 2px 5px 2px 5px; } -div.currenthistory { margin: -2px -5px 0 -5px; padding: 2px 5px 2px 5px; height: 16px; } -.coverage { border-collapse: collapse; font-size: 5px; height: 10px; } -.coverage td { padding: 0; border: none; } -.stripped tr:nth-child(2n+1) { background-color: #F3F3F3; } - -.customizebox { font-size: 0.75em; margin-bottom: 7px; } -.customizebox>div { width: 25%; display: inline-block; } -.customizebox div.right input { width: 150px; } -#namespaceslider { width: 200px; display: inline-block; margin-left: 8px; } - -.percentagebar { - padding-left: 3px; -} -a.percentagebar { - padding-left: 6px; -} -.percentagebarundefined { - border-left: 2px solid #fff; -} -.percentagebar0 { - border-left: 2px solid #c10909; -} -.percentagebar10 { - border-left: 2px solid; - border-image: linear-gradient(to bottom, #c10909 90%, #0aad0a 90%, #0aad0a 100%) 1; -} -.percentagebar20 { - border-left: 2px solid; - border-image: linear-gradient(to bottom, #c10909 80%, #0aad0a 80%, #0aad0a 100%) 1; -} -.percentagebar30 { - border-left: 2px solid; - border-image: linear-gradient(to bottom, #c10909 70%, #0aad0a 70%, #0aad0a 100%) 1; -} -.percentagebar40 { - border-left: 2px solid; - border-image: linear-gradient(to bottom, #c10909 60%, #0aad0a 60%, #0aad0a 100%) 1; -} -.percentagebar50 { - border-left: 2px solid; - border-image: linear-gradient(to bottom, #c10909 50%, #0aad0a 50%, #0aad0a 100%) 1; -} -.percentagebar60 { - border-left: 2px solid; - border-image: linear-gradient(to bottom, #c10909 40%, #0aad0a 40%, #0aad0a 100%) 1; -} -.percentagebar70 { - border-left: 2px solid; - border-image: linear-gradient(to bottom, #c10909 30%, #0aad0a 30%, #0aad0a 100%) 1; -} -.percentagebar80 { - border-left: 2px solid; - border-image: linear-gradient(to bottom, #c10909 20%, #0aad0a 20%, #0aad0a 100%) 1; -} -.percentagebar90 { - border-left: 2px solid; - border-image: linear-gradient(to bottom, #c10909 10%, #0aad0a 10%, #0aad0a 100%) 1; -} -.percentagebar100 { - border-left: 2px solid #0aad0a; -} - -.hidden, .ng-hide { display: none; } -.right { text-align: right; } -.center { text-align: center; } -.rightmargin { padding-right: 8px; } -.leftmargin { padding-left: 5px; } -.green { background-color: #0aad0a; } -.lightgreen { background-color: #dcf4dc; } -.red { background-color: #c10909; } -.lightred { background-color: #f7dede; } -.orange { background-color: #FFA500; } -.lightorange { background-color: #FFEFD5; } -.gray { background-color: #dcdcdc; } -.lightgray { color: #888888; } -.lightgraybg { background-color: #dadada; } - -code { font-family: Consolas, monospace; font-size: 0.9em; } - -.toggleZoom { text-align:right; } - -.ct-chart { position: relative; } -.ct-chart .ct-line { stroke-width: 2px !important; } -.ct-chart .ct-point { stroke-width: 6px !important; transition: stroke-width .2s; } -.ct-chart .ct-point:hover { stroke-width: 10px !important; } -.ct-chart .ct-series.ct-series-a .ct-line, .ct-chart .ct-series.ct-series-a .ct-point { stroke: #c00 !important;} -.ct-chart .ct-series.ct-series-b .ct-line, .ct-chart .ct-series.ct-series-b .ct-point { stroke: #1c2298 !important;} - -.tinylinecoveragechart, .tinybranchcoveragechart { background-color: #fff; margin-left: -3px; float: left; border: solid 1px #c1c1c1; width: 30px; height: 18px; } -.historiccoverageoffset { margin-top: 7px; } - -.tinylinecoveragechart .ct-line, .tinybranchcoveragechart .ct-line { stroke-width: 1px !important; } -.tinybranchcoveragechart .ct-series.ct-series-a .ct-line { stroke: #1c2298 !important; } - -.linecoverage { background-color: #c00; width: 10px; height: 8px; border: 1px solid #000; display: inline-block; } -.branchcoverage { background-color: #1c2298; width: 10px; height: 8px; border: 1px solid #000; display: inline-block; } - -.tooltip { position: absolute; display: none; padding: 5px; background: #F4C63D; color: #453D3F; pointer-events: none; z-index: 1; min-width: 250px; } - -.column1324 { max-width: 1324px; } -.column674 { max-width: 674px; } -.column60 { width: 60px; } -.column70 { width: 70px; } -.column90 { width: 90px; } -.column98 { width: 98px; } -.column100 { width: 100px; } -.column105 { width: 105px; } -.column112 { width: 112px; } -.column135 { width: 135px; } -.column150 { width: 150px; } - -.covered0 { width: 0px; } -.covered1 { width: 1px; } -.covered2 { width: 2px; } -.covered3 { width: 3px; } -.covered4 { width: 4px; } -.covered5 { width: 5px; } -.covered6 { width: 6px; } -.covered7 { width: 7px; } -.covered8 { width: 8px; } -.covered9 { width: 9px; } -.covered10 { width: 10px; } -.covered11 { width: 11px; } -.covered12 { width: 12px; } -.covered13 { width: 13px; } -.covered14 { width: 14px; } -.covered15 { width: 15px; } -.covered16 { width: 16px; } -.covered17 { width: 17px; } -.covered18 { width: 18px; } -.covered19 { width: 19px; } -.covered20 { width: 20px; } -.covered21 { width: 21px; } -.covered22 { width: 22px; } -.covered23 { width: 23px; } -.covered24 { width: 24px; } -.covered25 { width: 25px; } -.covered26 { width: 26px; } -.covered27 { width: 27px; } -.covered28 { width: 28px; } -.covered29 { width: 29px; } -.covered30 { width: 30px; } -.covered31 { width: 31px; } -.covered32 { width: 32px; } -.covered33 { width: 33px; } -.covered34 { width: 34px; } -.covered35 { width: 35px; } -.covered36 { width: 36px; } -.covered37 { width: 37px; } -.covered38 { width: 38px; } -.covered39 { width: 39px; } -.covered40 { width: 40px; } -.covered41 { width: 41px; } -.covered42 { width: 42px; } -.covered43 { width: 43px; } -.covered44 { width: 44px; } -.covered45 { width: 45px; } -.covered46 { width: 46px; } -.covered47 { width: 47px; } -.covered48 { width: 48px; } -.covered49 { width: 49px; } -.covered50 { width: 50px; } -.covered51 { width: 51px; } -.covered52 { width: 52px; } -.covered53 { width: 53px; } -.covered54 { width: 54px; } -.covered55 { width: 55px; } -.covered56 { width: 56px; } -.covered57 { width: 57px; } -.covered58 { width: 58px; } -.covered59 { width: 59px; } -.covered60 { width: 60px; } -.covered61 { width: 61px; } -.covered62 { width: 62px; } -.covered63 { width: 63px; } -.covered64 { width: 64px; } -.covered65 { width: 65px; } -.covered66 { width: 66px; } -.covered67 { width: 67px; } -.covered68 { width: 68px; } -.covered69 { width: 69px; } -.covered70 { width: 70px; } -.covered71 { width: 71px; } -.covered72 { width: 72px; } -.covered73 { width: 73px; } -.covered74 { width: 74px; } -.covered75 { width: 75px; } -.covered76 { width: 76px; } -.covered77 { width: 77px; } -.covered78 { width: 78px; } -.covered79 { width: 79px; } -.covered80 { width: 80px; } -.covered81 { width: 81px; } -.covered82 { width: 82px; } -.covered83 { width: 83px; } -.covered84 { width: 84px; } -.covered85 { width: 85px; } -.covered86 { width: 86px; } -.covered87 { width: 87px; } -.covered88 { width: 88px; } -.covered89 { width: 89px; } -.covered90 { width: 90px; } -.covered91 { width: 91px; } -.covered92 { width: 92px; } -.covered93 { width: 93px; } -.covered94 { width: 94px; } -.covered95 { width: 95px; } -.covered96 { width: 96px; } -.covered97 { width: 97px; } -.covered98 { width: 98px; } -.covered99 { width: 99px; } -.covered100 { width: 100px; } - - @media print { - html, body { background-color: #fff; } - .container { max-width: 100%; width: 100%; padding: 0; } - .overview colgroup col:first-child { width: 300px; } -} - -.icon-up-dir_active { - background-image: url(icon_up-dir.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGZpbGw9IiNjMDAiIGQ9Ik0xNDA4IDEyMTZxMCAyNi0xOSA0NXQtNDUgMTloLTg5NnEtMjYgMC00NS0xOXQtMTktNDUgMTktNDVsNDQ4LTQ0OHExOS0xOSA0NS0xOXQ0NSAxOWw0NDggNDQ4cTE5IDE5IDE5IDQ1eiIvPjwvc3ZnPg==); - background-repeat: no-repeat; - background-size: contain; - padding-left: 15px; - height: 0.9em; - display: inline-block; - position: relative; - top: 3px; -} -.icon-down-dir_active { - background-image: url(icon_up-dir_active.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGZpbGw9IiNjMDAiIGQ9Ik0xNDA4IDcwNHEwIDI2LTE5IDQ1bC00NDggNDQ4cS0xOSAxOS00NSAxOXQtNDUtMTlsLTQ0OC00NDhxLTE5LTE5LTE5LTQ1dDE5LTQ1IDQ1LTE5aDg5NnEyNiAwIDQ1IDE5dDE5IDQ1eiIvPjwvc3ZnPg==); - background-repeat: no-repeat; - background-size: contain; - padding-left: 15px; - height: 0.9em; - display: inline-block; - position: relative; - top: 3px; -} -.icon-down-dir { - background-image: url(icon_down-dir_active.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xNDA4IDcwNHEwIDI2LTE5IDQ1bC00NDggNDQ4cS0xOSAxOS00NSAxOXQtNDUtMTlsLTQ0OC00NDhxLTE5LTE5LTE5LTQ1dDE5LTQ1IDQ1LTE5aDg5NnEyNiAwIDQ1IDE5dDE5IDQ1eiIvPjwvc3ZnPg==); - background-repeat: no-repeat; - background-size: contain; - padding-left: 15px; - height: 0.9em; - display: inline-block; - position: relative; - top: 3px; -} -.icon-info-circled { - background-image: url(icon_info-circled.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxjaXJjbGUgY3g9Ijg5NiIgY3k9Ijg5NiIgcj0iNzUwIiBmaWxsPSIjZmZmIiAvPjxwYXRoIGZpbGw9IiMyOEE1RkYiIGQ9Ik0xMTUyIDEzNzZ2LTE2MHEwLTE0LTktMjN0LTIzLTloLTk2di01MTJxMC0xNC05LTIzdC0yMy05aC0zMjBxLTE0IDAtMjMgOXQtOSAyM3YxNjBxMCAxNCA5IDIzdDIzIDloOTZ2MzIwaC05NnEtMTQgMC0yMyA5dC05IDIzdjE2MHEwIDE0IDkgMjN0MjMgOWg0NDhxMTQgMCAyMy05dDktMjN6bS0xMjgtODk2di0xNjBxMC0xNC05LTIzdC0yMy05aC0xOTJxLTE0IDAtMjMgOXQtOSAyM3YxNjBxMCAxNCA5IDIzdDIzIDloMTkycTE0IDAgMjMtOXQ5LTIzem02NDAgNDE2cTAgMjA5LTEwMyAzODUuNXQtMjc5LjUgMjc5LjUtMzg1LjUgMTAzLTM4NS41LTEwMy0yNzkuNS0yNzkuNS0xMDMtMzg1LjUgMTAzLTM4NS41IDI3OS41LTI3OS41IDM4NS41LTEwMyAzODUuNSAxMDMgMjc5LjUgMjc5LjUgMTAzIDM4NS41eiIvPjwvc3ZnPg==); - background-repeat: no-repeat; - background-size: contain; - padding-left: 15px; - height: 0.9em; - display: inline-block; -} -.icon-plus { - background-image: url(icon_plus.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xNjAwIDczNnYxOTJxMCA0MC0yOCA2OHQtNjggMjhoLTQxNnY0MTZxMCA0MC0yOCA2OHQtNjggMjhoLTE5MnEtNDAgMC02OC0yOHQtMjgtNjh2LTQxNmgtNDE2cS00MCAwLTY4LTI4dC0yOC02OHYtMTkycTAtNDAgMjgtNjh0NjgtMjhoNDE2di00MTZxMC00MCAyOC02OHQ2OC0yOGgxOTJxNDAgMCA2OCAyOHQyOCA2OHY0MTZoNDE2cTQwIDAgNjggMjh0MjggNjh6Ii8+PC9zdmc+); - background-repeat: no-repeat; - background-size: contain; - padding-left: 15px; - height: 0.9em; - display: inline-block; - position: relative; - top: 3px; -} -.icon-minus { - background-image: url(icon_minus.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGZpbGw9IiNjMDAiIGQ9Ik0xNjAwIDczNnYxOTJxMCA0MC0yOCA2OHQtNjggMjhoLTEyMTZxLTQwIDAtNjgtMjh0LTI4LTY4di0xOTJxMC00MCAyOC02OHQ2OC0yOGgxMjE2cTQwIDAgNjggMjh0MjggNjh6Ii8+PC9zdmc+); - background-repeat: no-repeat; - background-size: contain; - padding-left: 15px; - height: 0.9em; - display: inline-block; - position: relative; - top: 3px; -} -.icon-wrench { - background-image: url(icon_wrench.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik00NDggMTQ3MnEwLTI2LTE5LTQ1dC00NS0xOS00NSAxOS0xOSA0NSAxOSA0NSA0NSAxOSA0NS0xOSAxOS00NXptNjQ0LTQyMGwtNjgyIDY4MnEtMzcgMzctOTAgMzctNTIgMC05MS0zN2wtMTA2LTEwOHEtMzgtMzYtMzgtOTAgMC01MyAzOC05MWw2ODEtNjgxcTM5IDk4IDExNC41IDE3My41dDE3My41IDExNC41em02MzQtNDM1cTAgMzktMjMgMTA2LTQ3IDEzNC0xNjQuNSAyMTcuNXQtMjU4LjUgODMuNXEtMTg1IDAtMzE2LjUtMTMxLjV0LTEzMS41LTMxNi41IDEzMS41LTMxNi41IDMxNi41LTEzMS41cTU4IDAgMTIxLjUgMTYuNXQxMDcuNSA0Ni41cTE2IDExIDE2IDI4dC0xNiAyOGwtMjkzIDE2OXYyMjRsMTkzIDEwN3E1LTMgNzktNDguNXQxMzUuNS04MSA3MC41LTM1LjVxMTUgMCAyMy41IDEwdDguNSAyNXoiLz48L3N2Zz4=); - background-repeat: no-repeat; - background-size: contain; - padding-left: 20px; - height: 0.9em; - display: inline-block; -} -.icon-fork { - background-image: url(icon_fork.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxyZWN0IHdpZHRoPSIxNzkyIiBoZWlnaHQ9IjE3OTIiIHN0eWxlPSJmaWxsOiNmZmYiIC8+PHBhdGggZD0iTTY3MiAxNDcycTAtNDAtMjgtNjh0LTY4LTI4LTY4IDI4LTI4IDY4IDI4IDY4IDY4IDI4IDY4LTI4IDI4LTY4em0wLTExNTJxMC00MC0yOC02OHQtNjgtMjgtNjggMjgtMjggNjggMjggNjggNjggMjggNjgtMjggMjgtNjh6bTY0MCAxMjhxMC00MC0yOC02OHQtNjgtMjgtNjggMjgtMjggNjggMjggNjggNjggMjggNjgtMjggMjgtNjh6bTk2IDBxMCA1Mi0yNiA5Ni41dC03MCA2OS41cS0yIDI4Ny0yMjYgNDE0LTY3IDM4LTIwMyA4MS0xMjggNDAtMTY5LjUgNzF0LTQxLjUgMTAwdjI2cTQ0IDI1IDcwIDY5LjV0MjYgOTYuNXEwIDgwLTU2IDEzNnQtMTM2IDU2LTEzNi01Ni01Ni0xMzZxMC01MiAyNi05Ni41dDcwLTY5LjV2LTgyMHEtNDQtMjUtNzAtNjkuNXQtMjYtOTYuNXEwLTgwIDU2LTEzNnQxMzYtNTYgMTM2IDU2IDU2IDEzNnEwIDUyLTI2IDk2LjV0LTcwIDY5LjV2NDk3cTU0LTI2IDE1NC01NyA1NS0xNyA4Ny41LTI5LjV0NzAuNS0zMSA1OS0zOS41IDQwLjUtNTEgMjgtNjkuNSA4LjUtOTEuNXEtNDQtMjUtNzAtNjkuNXQtMjYtOTYuNXEwLTgwIDU2LTEzNnQxMzYtNTYgMTM2IDU2IDU2IDEzNnoiLz48L3N2Zz4=); - background-repeat: no-repeat; - background-size: contain; - padding-left: 20px; - height: 0.9em; - display: inline-block; -} -.icon-cube { - background-image: url(icon_cube.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik04OTYgMTYyOWw2NDAtMzQ5di02MzZsLTY0MCAyMzN2NzUyem0tNjQtODY1bDY5OC0yNTQtNjk4LTI1NC02OTggMjU0em04MzItMjUydjc2OHEwIDM1LTE4IDY1dC00OSA0N2wtNzA0IDM4NHEtMjggMTYtNjEgMTZ0LTYxLTE2bC03MDQtMzg0cS0zMS0xNy00OS00N3QtMTgtNjV2LTc2OHEwLTQwIDIzLTczdDYxLTQ3bDcwNC0yNTZxMjItOCA0NC04dDQ0IDhsNzA0IDI1NnEzOCAxNCA2MSA0N3QyMyA3M3oiLz48L3N2Zz4=); - background-repeat: no-repeat; - background-size: contain; - padding-left: 20px; - height: 0.9em; - display: inline-block; -} -.icon-search-plus { - background-image: url(icon_search-plus.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGZpbGw9IiM2ZjZmNmYiIGQ9Ik0xMDg4IDgwMHY2NHEwIDEzLTkuNSAyMi41dC0yMi41IDkuNWgtMjI0djIyNHEwIDEzLTkuNSAyMi41dC0yMi41IDkuNWgtNjRxLTEzIDAtMjIuNS05LjV0LTkuNS0yMi41di0yMjRoLTIyNHEtMTMgMC0yMi41LTkuNXQtOS41LTIyLjV2LTY0cTAtMTMgOS41LTIyLjV0MjIuNS05LjVoMjI0di0yMjRxMC0xMyA5LjUtMjIuNXQyMi41LTkuNWg2NHExMyAwIDIyLjUgOS41dDkuNSAyMi41djIyNGgyMjRxMTMgMCAyMi41IDkuNXQ5LjUgMjIuNXptMTI4IDMycTAtMTg1LTEzMS41LTMxNi41dC0zMTYuNS0xMzEuNS0zMTYuNSAxMzEuNS0xMzEuNSAzMTYuNSAxMzEuNSAzMTYuNSAzMTYuNSAxMzEuNSAzMTYuNS0xMzEuNSAxMzEuNS0zMTYuNXptNTEyIDgzMnEwIDUzLTM3LjUgOTAuNXQtOTAuNSAzNy41cS01NCAwLTkwLTM4bC0zNDMtMzQycS0xNzkgMTI0LTM5OSAxMjQtMTQzIDAtMjczLjUtNTUuNXQtMjI1LTE1MC0xNTAtMjI1LTU1LjUtMjczLjUgNTUuNS0yNzMuNSAxNTAtMjI1IDIyNS0xNTAgMjczLjUtNTUuNSAyNzMuNSA1NS41IDIyNSAxNTAgMTUwIDIyNSA1NS41IDI3My41cTAgMjIwLTEyNCAzOTlsMzQzIDM0M3EzNyAzNyAzNyA5MHoiLz48L3N2Zz4=); - background-repeat: no-repeat; - background-size: contain; - padding-left: 20px; - height: 0.9em; - display: inline-block; -} -.icon-search-minus { - background-image: url(icon_search-minus.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGZpbGw9IiM2ZjZmNmYiIGQ9Ik0xMDg4IDgwMHY2NHEwIDEzLTkuNSAyMi41dC0yMi41IDkuNWgtNTc2cS0xMyAwLTIyLjUtOS41dC05LjUtMjIuNXYtNjRxMC0xMyA5LjUtMjIuNXQyMi41LTkuNWg1NzZxMTMgMCAyMi41IDkuNXQ5LjUgMjIuNXptMTI4IDMycTAtMTg1LTEzMS41LTMxNi41dC0zMTYuNS0xMzEuNS0zMTYuNSAxMzEuNS0xMzEuNSAzMTYuNSAxMzEuNSAzMTYuNSAzMTYuNSAxMzEuNSAzMTYuNS0xMzEuNSAxMzEuNS0zMTYuNXptNTEyIDgzMnEwIDUzLTM3LjUgOTAuNXQtOTAuNSAzNy41cS01NCAwLTkwLTM4bC0zNDMtMzQycS0xNzkgMTI0LTM5OSAxMjQtMTQzIDAtMjczLjUtNTUuNXQtMjI1LTE1MC0xNTAtMjI1LTU1LjUtMjczLjUgNTUuNS0yNzMuNSAxNTAtMjI1IDIyNS0xNTAgMjczLjUtNTUuNSAyNzMuNSA1NS41IDIyNSAxNTAgMTUwIDIyNSA1NS41IDI3My41cTAgMjIwLTEyNCAzOTlsMzQzIDM0M3EzNyAzNyAzNyA5MHoiLz48L3N2Zz4=); - background-repeat: no-repeat; - background-size: contain; - padding-left: 20px; - height: 0.9em; - display: inline-block; -} -.icon-star { - background-image: url(icon_star.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xNzI4IDY0N3EwIDIyLTI2IDQ4bC0zNjMgMzU0IDg2IDUwMHExIDcgMSAyMCAwIDIxLTEwLjUgMzUuNXQtMzAuNSAxNC41cS0xOSAwLTQwLTEybC00NDktMjM2LTQ0OSAyMzZxLTIyIDEyLTQwIDEyLTIxIDAtMzEuNS0xNC41dC0xMC41LTM1LjVxMC02IDItMjBsODYtNTAwLTM2NC0zNTRxLTI1LTI3LTI1LTQ4IDAtMzcgNTYtNDZsNTAyLTczIDIyNS00NTVxMTktNDEgNDktNDF0NDkgNDFsMjI1IDQ1NSA1MDIgNzNxNTYgOSA1NiA0NnoiIGZpbGw9IiMwMDAiLz48L3N2Zz4=); - background-repeat: no-repeat; - background-size: contain; - padding-left: 20px; - height: 0.9em; - display: inline-block; -} -.icon-sponsor { - background-image: url(icon_sponsor.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik04OTYgMTY2NHEtMjYgMC00NC0xOGwtNjI0LTYwMnEtMTAtOC0yNy41LTI2dC01NS41LTY1LjUtNjgtOTcuNS01My41LTEyMS0yMy41LTEzOHEwLTIyMCAxMjctMzQ0dDM1MS0xMjRxNjIgMCAxMjYuNSAyMS41dDEyMCA1OCA5NS41IDY4LjUgNzYgNjhxMzYtMzYgNzYtNjh0OTUuNS02OC41IDEyMC01OCAxMjYuNS0yMS41cTIyNCAwIDM1MSAxMjR0MTI3IDM0NHEwIDIyMS0yMjkgNDUwbC02MjMgNjAwcS0xOCAxOC00NCAxOHoiIGZpbGw9IiNlYTRhYWEiLz48L3N2Zz4=); - background-repeat: no-repeat; - background-size: contain; - padding-left: 20px; - height: 0.9em; - display: inline-block; -} - -@media (prefers-color-scheme: dark) { - @media screen { - html { - background-color: #333; - color: #fff; - } - - body { - color: #fff; - } - - h1 { - background-color: #555453; - color: #fff; - } - - .container { - background-color: #333; - box-shadow: 0 0 60px #0c0c0c; - } - - .containerrightfixed { - background-color: #3D3C3C; - border-left: solid 1px #515050; - } - - .containerrightfixed h1 { - background-color: #484747; - } - - .overview tr:hover { - background-color: #2E2D2C; - } - - .overview th { - background-color: #444; - border: solid 1px #3B3A39; - } - - .overview thead th { - background-color: #444; - } - - .overview th a { - color: #fff; - color: rgba(255, 255, 255, 0.95); - } - - .overview th a:hover { - color: #0078d4; - } - - .overview td { - border: solid 1px #3B3A39; - } - - .overview .coverage td { - border: none; - } - - .stripped tr:nth-child(2n+1) { - background-color: #3c3c3c; - } - - input, select { - background-color: #333; - color: #fff; - border: 1px solid #A19F9D; - } - - a { - color: #fff; - color: rgba(255, 255, 255, 0.95); - } - - a:hover { - color: #0078d4; - } - - h1 a.back { - background-color: #4a4846; - } - - h1 a.button { - color: #fff; - background-color: #565656; - border-color: #c1c1c1; - } - - h1 a.button:hover { - background-color: #8d8d8d; - } - - .gray { - background-color: #484747; - } - - .lightgray { - color: #ebebeb; - } - - .lightgraybg { - background-color: #474747; - } - - .lightgreen { - background-color: #406540; - } - - .lightorange { - background-color: #ab7f36; - } - - .lightred { - background-color: #954848; - } - - .ct-label { - color: #fff !important; - } - - .ct-grid { - stroke: #fff !important; - } - - .ct-chart .ct-series.ct-series-a .ct-line, .ct-chart .ct-series.ct-series-a .ct-point { - stroke: #0078D4 !important; - } - - .ct-chart .ct-series.ct-series-b .ct-line, .ct-chart .ct-series.ct-series-b .ct-point { - stroke: #6dc428 !important; - } - - .linecoverage { - background-color: #0078D4; - } - - .branchcoverage { - background-color: #6dc428; - } - - .tinylinecoveragechart, .tinybranchcoveragechart { - background-color: #333; - } - - .tinybranchcoveragechart .ct-series.ct-series-a .ct-line { - stroke: #6dc428 !important; - } - - .icon-down-dir { - background-image: url(icon_down-dir_active_dark.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHdpZHRoPSIxNzkyIiBoZWlnaHQ9IjE3OTIiIHZpZXdCb3g9IjAgMCAxNzkyIDE3OTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iI0JGQkZDMCIgZD0iTTE0MDggNzA0cTAgMjYtMTkgNDVsLTQ0OCA0NDhxLTE5IDE5LTQ1IDE5dC00NS0xOWwtNDQ4LTQ0OHEtMTktMTktMTktNDV0MTktNDUgNDUtMTloODk2cTI2IDAgNDUgMTl0MTkgNDV6Ii8+PC9zdmc+); - } - - .icon-info-circled { - background-image: url(icon_info-circled_dark.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxjaXJjbGUgY3g9Ijg5NiIgY3k9Ijg5NiIgcj0iNzUwIiBmaWxsPSIjZmZmIiAvPjxwYXRoIGZpbGw9IiMyOEE1RkYiIGQ9Ik0xMTUyIDEzNzZ2LTE2MHEwLTE0LTktMjN0LTIzLTloLTk2di01MTJxMC0xNC05LTIzdC0yMy05aC0zMjBxLTE0IDAtMjMgOXQtOSAyM3YxNjBxMCAxNCA5IDIzdDIzIDloOTZ2MzIwaC05NnEtMTQgMC0yMyA5dC05IDIzdjE2MHEwIDE0IDkgMjN0MjMgOWg0NDhxMTQgMCAyMy05dDktMjN6bS0xMjgtODk2di0xNjBxMC0xNC05LTIzdC0yMy05aC0xOTJxLTE0IDAtMjMgOXQtOSAyM3YxNjBxMCAxNCA5IDIzdDIzIDloMTkycTE0IDAgMjMtOXQ5LTIzem02NDAgNDE2cTAgMjA5LTEwMyAzODUuNXQtMjc5LjUgMjc5LjUtMzg1LjUgMTAzLTM4NS41LTEwMy0yNzkuNS0yNzkuNS0xMDMtMzg1LjUgMTAzLTM4NS41IDI3OS41LTI3OS41IDM4NS41LTEwMyAzODUuNSAxMDMgMjc5LjUgMjc5LjUgMTAzIDM4NS41eiIvPjwvc3ZnPg==); - } - - .icon-plus { - background-image: url(icon_plus_dark.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHdpZHRoPSIxNzkyIiBoZWlnaHQ9IjE3OTIiIHZpZXdCb3g9IjAgMCAxNzkyIDE3OTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iI0JGQkZDMCIgZD0iTTE2MDAgNzM2djE5MnEwIDQwLTI4IDY4dC02OCAyOGgtNDE2djQxNnEwIDQwLTI4IDY4dC02OCAyOGgtMTkycS00MCAwLTY4LTI4dC0yOC02OHYtNDE2aC00MTZxLTQwIDAtNjgtMjh0LTI4LTY4di0xOTJxMC00MCAyOC02OHQ2OC0yOGg0MTZ2LTQxNnEwLTQwIDI4LTY4dDY4LTI4aDE5MnE0MCAwIDY4IDI4dDI4IDY4djQxNmg0MTZxNDAgMCA2OCAyOHQyOCA2OHoiLz48L3N2Zz4=); - } - - .icon-minus { - background-image: url(icon_minus_dark.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHdpZHRoPSIxNzkyIiBoZWlnaHQ9IjE3OTIiIHZpZXdCb3g9IjAgMCAxNzkyIDE3OTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iI0JGQkZDMCIgZD0iTTE2MDAgNzM2djE5MnEwIDQwLTI4IDY4dC02OCAyOGgtMTIxNnEtNDAgMC02OC0yOHQtMjgtNjh2LTE5MnEwLTQwIDI4LTY4dDY4LTI4aDEyMTZxNDAgMCA2OCAyOHQyOCA2OHoiLz48L3N2Zz4=); - } - - .icon-wrench { - background-image: url(icon_wrench_dark.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHdpZHRoPSIxNzkyIiBoZWlnaHQ9IjE3OTIiIHZpZXdCb3g9IjAgMCAxNzkyIDE3OTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iI0JEQkRCRiIgZD0iTTQ0OCAxNDcycTAtMjYtMTktNDV0LTQ1LTE5LTQ1IDE5LTE5IDQ1IDE5IDQ1IDQ1IDE5IDQ1LTE5IDE5LTQ1em02NDQtNDIwbC02ODIgNjgycS0zNyAzNy05MCAzNy01MiAwLTkxLTM3bC0xMDYtMTA4cS0zOC0zNi0zOC05MCAwLTUzIDM4LTkxbDY4MS02ODFxMzkgOTggMTE0LjUgMTczLjV0MTczLjUgMTE0LjV6bTYzNC00MzVxMCAzOS0yMyAxMDYtNDcgMTM0LTE2NC41IDIxNy41dC0yNTguNSA4My41cS0xODUgMC0zMTYuNS0xMzEuNXQtMTMxLjUtMzE2LjUgMTMxLjUtMzE2LjUgMzE2LjUtMTMxLjVxNTggMCAxMjEuNSAxNi41dDEwNy41IDQ2LjVxMTYgMTEgMTYgMjh0LTE2IDI4bC0yOTMgMTY5djIyNGwxOTMgMTA3cTUtMyA3OS00OC41dDEzNS41LTgxIDcwLjUtMzUuNXExNSAwIDIzLjUgMTB0OC41IDI1eiIvPjwvc3ZnPg==); - } - - .icon-fork { - background-image: url(icon_fork_dark.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHdpZHRoPSIxNzkyIiBoZWlnaHQ9IjE3OTIiIHZpZXdCb3g9IjAgMCAxNzkyIDE3OTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iI0JGQkZDMCIgZD0iTTY3MiAxNDcycTAtNDAtMjgtNjh0LTY4LTI4LTY4IDI4LTI4IDY4IDI4IDY4IDY4IDI4IDY4LTI4IDI4LTY4em0wLTExNTJxMC00MC0yOC02OHQtNjgtMjgtNjggMjgtMjggNjggMjggNjggNjggMjggNjgtMjggMjgtNjh6bTY0MCAxMjhxMC00MC0yOC02OHQtNjgtMjgtNjggMjgtMjggNjggMjggNjggNjggMjggNjgtMjggMjgtNjh6bTk2IDBxMCA1Mi0yNiA5Ni41dC03MCA2OS41cS0yIDI4Ny0yMjYgNDE0LTY3IDM4LTIwMyA4MS0xMjggNDAtMTY5LjUgNzF0LTQxLjUgMTAwdjI2cTQ0IDI1IDcwIDY5LjV0MjYgOTYuNXEwIDgwLTU2IDEzNnQtMTM2IDU2LTEzNi01Ni01Ni0xMzZxMC01MiAyNi05Ni41dDcwLTY5LjV2LTgyMHEtNDQtMjUtNzAtNjkuNXQtMjYtOTYuNXEwLTgwIDU2LTEzNnQxMzYtNTYgMTM2IDU2IDU2IDEzNnEwIDUyLTI2IDk2LjV0LTcwIDY5LjV2NDk3cTU0LTI2IDE1NC01NyA1NS0xNyA4Ny41LTI5LjV0NzAuNS0zMSA1OS0zOS41IDQwLjUtNTEgMjgtNjkuNSA4LjUtOTEuNXEtNDQtMjUtNzAtNjkuNXQtMjYtOTYuNXEwLTgwIDU2LTEzNnQxMzYtNTYgMTM2IDU2IDU2IDEzNnoiLz48L3N2Zz4=); - } - - .icon-cube { - background-image: url(icon_cube_dark.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHdpZHRoPSIxNzkyIiBoZWlnaHQ9IjE3OTIiIHZpZXdCb3g9IjAgMCAxNzkyIDE3OTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iI0JGQkZDMCIgZD0iTTg5NiAxNjI5bDY0MC0zNDl2LTYzNmwtNjQwIDIzM3Y3NTJ6bS02NC04NjVsNjk4LTI1NC02OTgtMjU0LTY5OCAyNTR6bTgzMi0yNTJ2NzY4cTAgMzUtMTggNjV0LTQ5IDQ3bC03MDQgMzg0cS0yOCAxNi02MSAxNnQtNjEtMTZsLTcwNC0zODRxLTMxLTE3LTQ5LTQ3dC0xOC02NXYtNzY4cTAtNDAgMjMtNzN0NjEtNDdsNzA0LTI1NnEyMi04IDQ0LTh0NDQgOGw3MDQgMjU2cTM4IDE0IDYxIDQ3dDIzIDczeiIvPjwvc3ZnPg==); - } - - .icon-search-plus { - background-image: url(icon_search-plus_dark.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHdpZHRoPSIxNzkyIiBoZWlnaHQ9IjE3OTIiIHZpZXdCb3g9IjAgMCAxNzkyIDE3OTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iI0JGQkZDMCIgZD0iTTEwODggODAwdjY0cTAgMTMtOS41IDIyLjV0LTIyLjUgOS41aC0yMjR2MjI0cTAgMTMtOS41IDIyLjV0LTIyLjUgOS41aC02NHEtMTMgMC0yMi41LTkuNXQtOS41LTIyLjV2LTIyNGgtMjI0cS0xMyAwLTIyLjUtOS41dC05LjUtMjIuNXYtNjRxMC0xMyA5LjUtMjIuNXQyMi41LTkuNWgyMjR2LTIyNHEwLTEzIDkuNS0yMi41dDIyLjUtOS41aDY0cTEzIDAgMjIuNSA5LjV0OS41IDIyLjV2MjI0aDIyNHExMyAwIDIyLjUgOS41dDkuNSAyMi41em0xMjggMzJxMC0xODUtMTMxLjUtMzE2LjV0LTMxNi41LTEzMS41LTMxNi41IDEzMS41LTEzMS41IDMxNi41IDEzMS41IDMxNi41IDMxNi41IDEzMS41IDMxNi41LTEzMS41IDEzMS41LTMxNi41em01MTIgODMycTAgNTMtMzcuNSA5MC41dC05MC41IDM3LjVxLTU0IDAtOTAtMzhsLTM0My0zNDJxLTE3OSAxMjQtMzk5IDEyNC0xNDMgMC0yNzMuNS01NS41dC0yMjUtMTUwLTE1MC0yMjUtNTUuNS0yNzMuNSA1NS41LTI3My41IDE1MC0yMjUgMjI1LTE1MCAyNzMuNS01NS41IDI3My41IDU1LjUgMjI1IDE1MCAxNTAgMjI1IDU1LjUgMjczLjVxMCAyMjAtMTI0IDM5OWwzNDMgMzQzcTM3IDM3IDM3IDkweiIvPjwvc3ZnPg==); - } - - .icon-search-minus { - background-image: url(icon_search-minus_dark.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHdpZHRoPSIxNzkyIiBoZWlnaHQ9IjE3OTIiIHZpZXdCb3g9IjAgMCAxNzkyIDE3OTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iI0JGQkZDMCIgZD0iTTEwODggODAwdjY0cTAgMTMtOS41IDIyLjV0LTIyLjUgOS41aC01NzZxLTEzIDAtMjIuNS05LjV0LTkuNS0yMi41di02NHEwLTEzIDkuNS0yMi41dDIyLjUtOS41aDU3NnExMyAwIDIyLjUgOS41dDkuNSAyMi41em0xMjggMzJxMC0xODUtMTMxLjUtMzE2LjV0LTMxNi41LTEzMS41LTMxNi41IDEzMS41LTEzMS41IDMxNi41IDEzMS41IDMxNi41IDMxNi41IDEzMS41IDMxNi41LTEzMS41IDEzMS41LTMxNi41em01MTIgODMycTAgNTMtMzcuNSA5MC41dC05MC41IDM3LjVxLTU0IDAtOTAtMzhsLTM0My0zNDJxLTE3OSAxMjQtMzk5IDEyNC0xNDMgMC0yNzMuNS01NS41dC0yMjUtMTUwLTE1MC0yMjUtNTUuNS0yNzMuNSA1NS41LTI3My41IDE1MC0yMjUgMjI1LTE1MCAyNzMuNS01NS41IDI3My41IDU1LjUgMjI1IDE1MCAxNTAgMjI1IDU1LjUgMjczLjVxMCAyMjAtMTI0IDM5OWwzNDMgMzQzcTM3IDM3IDM3IDkweiIvPjwvc3ZnPg==); - } - - .icon-star { - background-image: url(icon_star_dark.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xNzI4IDY0N3EwIDIyLTI2IDQ4bC0zNjMgMzU0IDg2IDUwMHExIDcgMSAyMCAwIDIxLTEwLjUgMzUuNXQtMzAuNSAxNC41cS0xOSAwLTQwLTEybC00NDktMjM2LTQ0OSAyMzZxLTIyIDEyLTQwIDEyLTIxIDAtMzEuNS0xNC41dC0xMC41LTM1LjVxMC02IDItMjBsODYtNTAwLTM2NC0zNTRxLTI1LTI3LTI1LTQ4IDAtMzcgNTYtNDZsNTAyLTczIDIyNS00NTVxMTktNDEgNDktNDF0NDkgNDFsMjI1IDQ1NSA1MDIgNzNxNTYgOSA1NiA0NnoiIGZpbGw9IiNmZmYiLz48L3N2Zz4=); - } - } -} - -.ct-double-octave:after,.ct-major-eleventh:after,.ct-major-second:after,.ct-major-seventh:after,.ct-major-sixth:after,.ct-major-tenth:after,.ct-major-third:after,.ct-major-twelfth:after,.ct-minor-second:after,.ct-minor-seventh:after,.ct-minor-sixth:after,.ct-minor-third:after,.ct-octave:after,.ct-perfect-fifth:after,.ct-perfect-fourth:after,.ct-square:after{content:"";clear:both}.ct-label{fill:rgba(0,0,0,.4);color:rgba(0,0,0,.4);font-size:.75rem;line-height:1}.ct-grid-background,.ct-line{fill:none}.ct-chart-bar .ct-label,.ct-chart-line .ct-label{display:block;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex}.ct-chart-donut .ct-label,.ct-chart-pie .ct-label{dominant-baseline:central}.ct-label.ct-horizontal.ct-start{-webkit-box-align:flex-end;-webkit-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-label.ct-horizontal.ct-end{-webkit-box-align:flex-start;-webkit-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-label.ct-vertical.ct-start{-webkit-box-align:flex-end;-webkit-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:flex-end;-webkit-justify-content:flex-end;-ms-flex-pack:flex-end;justify-content:flex-end;text-align:right;text-anchor:end}.ct-label.ct-vertical.ct-end{-webkit-box-align:flex-end;-webkit-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar .ct-label.ct-horizontal.ct-start{-webkit-box-align:flex-end;-webkit-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center;text-anchor:start}.ct-chart-bar .ct-label.ct-horizontal.ct-end{-webkit-box-align:flex-start;-webkit-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-start{-webkit-box-align:flex-end;-webkit-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-end{-webkit-box-align:flex-start;-webkit-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-start{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:flex-end;-webkit-justify-content:flex-end;-ms-flex-pack:flex-end;justify-content:flex-end;text-align:right;text-anchor:end}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-end{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:end}.ct-grid{stroke:rgba(0,0,0,.2);stroke-width:1px;stroke-dasharray:2px}.ct-point{stroke-width:10px;stroke-linecap:round}.ct-line{stroke-width:4px}.ct-area{stroke:none;fill-opacity:.1}.ct-bar{fill:none;stroke-width:10px}.ct-slice-donut{fill:none;stroke-width:60px}.ct-series-a .ct-bar,.ct-series-a .ct-line,.ct-series-a .ct-point,.ct-series-a .ct-slice-donut{stroke:#d70206}.ct-series-a .ct-area,.ct-series-a .ct-slice-donut-solid,.ct-series-a .ct-slice-pie{fill:#d70206}.ct-series-b .ct-bar,.ct-series-b .ct-line,.ct-series-b .ct-point,.ct-series-b .ct-slice-donut{stroke:#f05b4f}.ct-series-b .ct-area,.ct-series-b .ct-slice-donut-solid,.ct-series-b .ct-slice-pie{fill:#f05b4f}.ct-series-c .ct-bar,.ct-series-c .ct-line,.ct-series-c .ct-point,.ct-series-c .ct-slice-donut{stroke:#f4c63d}.ct-series-c .ct-area,.ct-series-c .ct-slice-donut-solid,.ct-series-c .ct-slice-pie{fill:#f4c63d}.ct-series-d .ct-bar,.ct-series-d .ct-line,.ct-series-d .ct-point,.ct-series-d .ct-slice-donut{stroke:#d17905}.ct-series-d .ct-area,.ct-series-d .ct-slice-donut-solid,.ct-series-d .ct-slice-pie{fill:#d17905}.ct-series-e .ct-bar,.ct-series-e .ct-line,.ct-series-e .ct-point,.ct-series-e .ct-slice-donut{stroke:#453d3f}.ct-series-e .ct-area,.ct-series-e .ct-slice-donut-solid,.ct-series-e .ct-slice-pie{fill:#453d3f}.ct-series-f .ct-bar,.ct-series-f .ct-line,.ct-series-f .ct-point,.ct-series-f .ct-slice-donut{stroke:#59922b}.ct-series-f .ct-area,.ct-series-f .ct-slice-donut-solid,.ct-series-f .ct-slice-pie{fill:#59922b}.ct-series-g .ct-bar,.ct-series-g .ct-line,.ct-series-g .ct-point,.ct-series-g .ct-slice-donut{stroke:#0544d3}.ct-series-g .ct-area,.ct-series-g .ct-slice-donut-solid,.ct-series-g .ct-slice-pie{fill:#0544d3}.ct-series-h .ct-bar,.ct-series-h .ct-line,.ct-series-h .ct-point,.ct-series-h .ct-slice-donut{stroke:#6b0392}.ct-series-h .ct-area,.ct-series-h .ct-slice-donut-solid,.ct-series-h .ct-slice-pie{fill:#6b0392}.ct-series-i .ct-bar,.ct-series-i .ct-line,.ct-series-i .ct-point,.ct-series-i .ct-slice-donut{stroke:#f05b4f}.ct-series-i .ct-area,.ct-series-i .ct-slice-donut-solid,.ct-series-i .ct-slice-pie{fill:#f05b4f}.ct-series-j .ct-bar,.ct-series-j .ct-line,.ct-series-j .ct-point,.ct-series-j .ct-slice-donut{stroke:#dda458}.ct-series-j .ct-area,.ct-series-j .ct-slice-donut-solid,.ct-series-j .ct-slice-pie{fill:#dda458}.ct-series-k .ct-bar,.ct-series-k .ct-line,.ct-series-k .ct-point,.ct-series-k .ct-slice-donut{stroke:#eacf7d}.ct-series-k .ct-area,.ct-series-k .ct-slice-donut-solid,.ct-series-k .ct-slice-pie{fill:#eacf7d}.ct-series-l .ct-bar,.ct-series-l .ct-line,.ct-series-l .ct-point,.ct-series-l .ct-slice-donut{stroke:#86797d}.ct-series-l .ct-area,.ct-series-l .ct-slice-donut-solid,.ct-series-l .ct-slice-pie{fill:#86797d}.ct-series-m .ct-bar,.ct-series-m .ct-line,.ct-series-m .ct-point,.ct-series-m .ct-slice-donut{stroke:#b2c326}.ct-series-m .ct-area,.ct-series-m .ct-slice-donut-solid,.ct-series-m .ct-slice-pie{fill:#b2c326}.ct-series-n .ct-bar,.ct-series-n .ct-line,.ct-series-n .ct-point,.ct-series-n .ct-slice-donut{stroke:#6188e2}.ct-series-n .ct-area,.ct-series-n .ct-slice-donut-solid,.ct-series-n .ct-slice-pie{fill:#6188e2}.ct-series-o .ct-bar,.ct-series-o .ct-line,.ct-series-o .ct-point,.ct-series-o .ct-slice-donut{stroke:#a748ca}.ct-series-o .ct-area,.ct-series-o .ct-slice-donut-solid,.ct-series-o .ct-slice-pie{fill:#a748ca}.ct-square{display:block;position:relative;width:100%}.ct-square:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:100%}.ct-square:after{display:table}.ct-square>svg{display:block;position:absolute;top:0;left:0}.ct-minor-second{display:block;position:relative;width:100%}.ct-minor-second:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:93.75%}.ct-minor-second:after{display:table}.ct-minor-second>svg{display:block;position:absolute;top:0;left:0}.ct-major-second{display:block;position:relative;width:100%}.ct-major-second:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:88.8888888889%}.ct-major-second:after{display:table}.ct-major-second>svg{display:block;position:absolute;top:0;left:0}.ct-minor-third{display:block;position:relative;width:100%}.ct-minor-third:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:83.3333333333%}.ct-minor-third:after{display:table}.ct-minor-third>svg{display:block;position:absolute;top:0;left:0}.ct-major-third{display:block;position:relative;width:100%}.ct-major-third:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:80%}.ct-major-third:after{display:table}.ct-major-third>svg{display:block;position:absolute;top:0;left:0}.ct-perfect-fourth{display:block;position:relative;width:100%}.ct-perfect-fourth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:75%}.ct-perfect-fourth:after{display:table}.ct-perfect-fourth>svg{display:block;position:absolute;top:0;left:0}.ct-perfect-fifth{display:block;position:relative;width:100%}.ct-perfect-fifth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:66.6666666667%}.ct-perfect-fifth:after{display:table}.ct-perfect-fifth>svg{display:block;position:absolute;top:0;left:0}.ct-minor-sixth{display:block;position:relative;width:100%}.ct-minor-sixth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:62.5%}.ct-minor-sixth:after{display:table}.ct-minor-sixth>svg{display:block;position:absolute;top:0;left:0}.ct-golden-section{display:block;position:relative;width:100%}.ct-golden-section:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:61.804697157%}.ct-golden-section:after{content:"";display:table;clear:both}.ct-golden-section>svg{display:block;position:absolute;top:0;left:0}.ct-major-sixth{display:block;position:relative;width:100%}.ct-major-sixth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:60%}.ct-major-sixth:after{display:table}.ct-major-sixth>svg{display:block;position:absolute;top:0;left:0}.ct-minor-seventh{display:block;position:relative;width:100%}.ct-minor-seventh:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:56.25%}.ct-minor-seventh:after{display:table}.ct-minor-seventh>svg{display:block;position:absolute;top:0;left:0}.ct-major-seventh{display:block;position:relative;width:100%}.ct-major-seventh:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:53.3333333333%}.ct-major-seventh:after{display:table}.ct-major-seventh>svg{display:block;position:absolute;top:0;left:0}.ct-octave{display:block;position:relative;width:100%}.ct-octave:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:50%}.ct-octave:after{display:table}.ct-octave>svg{display:block;position:absolute;top:0;left:0}.ct-major-tenth{display:block;position:relative;width:100%}.ct-major-tenth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:40%}.ct-major-tenth:after{display:table}.ct-major-tenth>svg{display:block;position:absolute;top:0;left:0}.ct-major-eleventh{display:block;position:relative;width:100%}.ct-major-eleventh:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:37.5%}.ct-major-eleventh:after{display:table}.ct-major-eleventh>svg{display:block;position:absolute;top:0;left:0}.ct-major-twelfth{display:block;position:relative;width:100%}.ct-major-twelfth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:33.3333333333%}.ct-major-twelfth:after{display:table}.ct-major-twelfth>svg{display:block;position:absolute;top:0;left:0}.ct-double-octave{display:block;position:relative;width:100%}.ct-double-octave:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:25%}.ct-double-octave:after{display:table}.ct-double-octave>svg{display:block;position:absolute;top:0;left:0} \ No newline at end of file diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 00000000..318e691a --- /dev/null +++ b/docs/index.html @@ -0,0 +1,218 @@ + + + + + + index + + + + + + + + + + + + + + + + + + + + + + +
    +

    What is ImageProcessing?

    +

    A library for image processing using GPGPU and agents for parallel computing.

    +
    +
    +
    +
    +
    +
    Tutorials
    +

    How to get started with ImageProcessing

    +
    + +
    +
    +
    +
    +
    +
    How-To Guides
    +

    Learn how to work with the ImageProcessing library directly in your code

    +
    + +
    +
    +
    +
    +
    +
    Explanations
    +

    Learn about the structure of the library

    +
    + +
    +
    +
    + + +
    + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/index.json b/docs/index.json new file mode 100644 index 00000000..ba1f1b55 --- /dev/null +++ b/docs/index.json @@ -0,0 +1 @@ +[{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing.html","title":"ImageProcessing","content":"Agents \nArguments \nCpuProcessing \nGpuKernels \nGpuProcessing \nImageArrayProcessing \nKernels \nMain \nMyImage \nTypes"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-agents.html","title":"Agents","content":"Agents \n\n Module with implementation of agents for image processing\n \nAgents.listAllFiles \nlistAllFiles \nAgents.outFile \noutFile \nAgents.imgSaver \nimgSaver \nAgents.imgProcessor \nimgProcessor \nAgents.msgLogger \nmsgLogger \nAgents.superAgent \nsuperAgent \nAgents.superImageProcessing \nsuperImageProcessing"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-agents.html#listAllFiles","title":"Agents.listAllFiles","content":"Agents.listAllFiles \nlistAllFiles \n\n List of all files in directory\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-agents.html#outFile","title":"Agents.outFile","content":"Agents.outFile \noutFile \n\n Creation of path to save the image\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-agents.html#imgSaver","title":"Agents.imgSaver","content":"Agents.imgSaver \nimgSaver \n\n Agent for saving images\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-agents.html#imgProcessor","title":"Agents.imgProcessor","content":"Agents.imgProcessor \nimgProcessor \n\n Agent for image processing\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-agents.html#msgLogger","title":"Agents.msgLogger","content":"Agents.msgLogger \nmsgLogger \n\n Agent for logging\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-agents.html#superAgent","title":"Agents.superAgent","content":"Agents.superAgent \nsuperAgent \n\n Agent with the ability to process and save the image\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-agents.html#superImageProcessing","title":"Agents.superImageProcessing","content":"Agents.superImageProcessing \nsuperImageProcessing \n\n Image processing using superAgents\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-arguments.html","title":"Arguments","content":"Arguments \n\n Module with implementation of work via console commands\n \nArguments.CliArguments \nCliArguments \nArguments.first \nfirst \nArguments.second \nsecond \nArguments.third \nthird \nArguments.fourth \nfourth \nArguments.modificationParser \nmodificationParser \nArguments.modificationGpuParser \nmodificationGpuParser \nArguments.deviceParser \ndeviceParser"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-arguments.html#first","title":"Arguments.first","content":"Arguments.first \nfirst \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-arguments.html#second","title":"Arguments.second","content":"Arguments.second \nsecond \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-arguments.html#third","title":"Arguments.third","content":"Arguments.third \nthird \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-arguments.html#fourth","title":"Arguments.fourth","content":"Arguments.fourth \nfourth \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-arguments.html#modificationParser","title":"Arguments.modificationParser","content":"Arguments.modificationParser \nmodificationParser \n\n Parsing of CPU modification\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-arguments.html#modificationGpuParser","title":"Arguments.modificationGpuParser","content":"Arguments.modificationGpuParser \nmodificationGpuParser \n\n Parsing of GPU modification\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-arguments.html#deviceParser","title":"Arguments.deviceParser","content":"Arguments.deviceParser \ndeviceParser \n\n Parsing of device\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-arguments-cliarguments.html","title":"CliArguments","content":"CliArguments \n \nCliArguments.InputPath \nInputPath \nCliArguments.OutputPath \nOutputPath \nCliArguments.Agents \nAgents \nCliArguments.SuperAgents \nSuperAgents \nCliArguments.Modifications \nModifications \nCliArguments.GpGpu \nGpGpu"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-arguments-cliarguments.html#InputPath","title":"CliArguments.InputPath","content":"CliArguments.InputPath \nInputPath \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-arguments-cliarguments.html#OutputPath","title":"CliArguments.OutputPath","content":"CliArguments.OutputPath \nOutputPath \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-arguments-cliarguments.html#Agents","title":"CliArguments.Agents","content":"CliArguments.Agents \nAgents \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-arguments-cliarguments.html#SuperAgents","title":"CliArguments.SuperAgents","content":"CliArguments.SuperAgents \nSuperAgents \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-arguments-cliarguments.html#Modifications","title":"CliArguments.Modifications","content":"CliArguments.Modifications \nModifications \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-arguments-cliarguments.html#GpGpu","title":"CliArguments.GpGpu","content":"CliArguments.GpGpu \nGpGpu \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-cpuprocessing.html","title":"CpuProcessing","content":"CpuProcessing \n\n Module with functions for image processing on the CPU\n \nCpuProcessing.applyFilter \napplyFilter \nCpuProcessing.rotate \nrotate \nCpuProcessing.mirror \nmirror \nCpuProcessing.fishEye \nfishEye"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-cpuprocessing.html#applyFilter","title":"CpuProcessing.applyFilter","content":"CpuProcessing.applyFilter \napplyFilter \n\n Filter application\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-cpuprocessing.html#rotate","title":"CpuProcessing.rotate","content":"CpuProcessing.rotate \nrotate \n\n Rotate of image\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-cpuprocessing.html#mirror","title":"CpuProcessing.mirror","content":"CpuProcessing.mirror \nmirror \n\n Image Reflection\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-cpuprocessing.html#fishEye","title":"CpuProcessing.fishEye","content":"CpuProcessing.fishEye \nfishEye \n\n Applying \u0022FishEye\u0022 to an image\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-gpukernels.html","title":"GpuKernels","content":"GpuKernels \n\n Module with kernels for image processing on the GPU\n \nGpuKernels.applyFilterKernel \napplyFilterKernel \nGpuKernels.applyFilterProcessor \napplyFilterProcessor \nGpuKernels.rotateKernel \nrotateKernel \nGpuKernels.rotateKernelProcessor \nrotateKernelProcessor \nGpuKernels.mirrorKernel \nmirrorKernel \nGpuKernels.mirrorKernelProcessor \nmirrorKernelProcessor \nGpuKernels.fishEyeKernel \nfishEyeKernel \nGpuKernels.fishEyeKernelProcessor \nfishEyeKernelProcessor"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-gpukernels.html#applyFilterKernel","title":"GpuKernels.applyFilterKernel","content":"GpuKernels.applyFilterKernel \napplyFilterKernel \n\n Compilation of kernel to apply filter to the image\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-gpukernels.html#applyFilterProcessor","title":"GpuKernels.applyFilterProcessor","content":"GpuKernels.applyFilterProcessor \napplyFilterProcessor \n\n Asynchronous application of the filter kernel to the image\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-gpukernels.html#rotateKernel","title":"GpuKernels.rotateKernel","content":"GpuKernels.rotateKernel \nrotateKernel \n\n Compilation of kernel to rotate the image\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-gpukernels.html#rotateKernelProcessor","title":"GpuKernels.rotateKernelProcessor","content":"GpuKernels.rotateKernelProcessor \nrotateKernelProcessor \n\n Asynchronous application of the rotation kernel to the image\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-gpukernels.html#mirrorKernel","title":"GpuKernels.mirrorKernel","content":"GpuKernels.mirrorKernel \nmirrorKernel \n\n Compilation of kernel to reflect the image\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-gpukernels.html#mirrorKernelProcessor","title":"GpuKernels.mirrorKernelProcessor","content":"GpuKernels.mirrorKernelProcessor \nmirrorKernelProcessor \n\n Asynchronous application of the reflection kernel to the image\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-gpukernels.html#fishEyeKernel","title":"GpuKernels.fishEyeKernel","content":"GpuKernels.fishEyeKernel \nfishEyeKernel \n\n Compilation of kernel to apply FishEye to the image\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-gpukernels.html#fishEyeKernelProcessor","title":"GpuKernels.fishEyeKernelProcessor","content":"GpuKernels.fishEyeKernelProcessor \nfishEyeKernelProcessor \n\n Asynchronous application of the fisheye kernel to the image\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-gpuprocessing.html","title":"GpuProcessing","content":"GpuProcessing \n\n Module with functions for image processing on the GPU\n \nGpuProcessing.applyFilter \napplyFilter \nGpuProcessing.rotate \nrotate \nGpuProcessing.mirror \nmirror \nGpuProcessing.fishEye \nfishEye"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-gpuprocessing.html#applyFilter","title":"GpuProcessing.applyFilter","content":"GpuProcessing.applyFilter \napplyFilter \n\n Filter application\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-gpuprocessing.html#rotate","title":"GpuProcessing.rotate","content":"GpuProcessing.rotate \nrotate \n\n Rotate of image\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-gpuprocessing.html#mirror","title":"GpuProcessing.mirror","content":"GpuProcessing.mirror \nmirror \n\n Reflection of image\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-gpuprocessing.html#fishEye","title":"GpuProcessing.fishEye","content":"GpuProcessing.fishEye \nfishEye \n\n Applying fisheye filter to the image\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-imagearrayprocessing.html","title":"ImageArrayProcessing","content":"ImageArrayProcessing \n\n Module with implementation of processing array of images\n \nImageArrayProcessing.extensions \nextensions \nImageArrayProcessing.listAllFiles \nlistAllFiles \nImageArrayProcessing.arrayOfImagesProcessing \narrayOfImagesProcessing"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-imagearrayprocessing.html#extensions","title":"ImageArrayProcessing.extensions","content":"ImageArrayProcessing.extensions \nextensions \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-imagearrayprocessing.html#listAllFiles","title":"ImageArrayProcessing.listAllFiles","content":"ImageArrayProcessing.listAllFiles \nlistAllFiles \n\n List of all files in directory with correct extensions\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-imagearrayprocessing.html#arrayOfImagesProcessing","title":"ImageArrayProcessing.arrayOfImagesProcessing","content":"ImageArrayProcessing.arrayOfImagesProcessing \narrayOfImagesProcessing \n\n Processing array of images\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-kernels.html","title":"Kernels","content":"Kernels \n\n Module with kernels for image processing\n \nKernels.gaussianBlurKernel \ngaussianBlurKernel \nKernels.edgesKernel \nedgesKernel \nKernels.gaussianBlur7x7Kernel \ngaussianBlur7x7Kernel \nKernels.sharpenKernel \nsharpenKernel \nKernels.embossKernel \nembossKernel"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-kernels.html#gaussianBlurKernel","title":"Kernels.gaussianBlurKernel","content":"Kernels.gaussianBlurKernel \ngaussianBlurKernel \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-kernels.html#edgesKernel","title":"Kernels.edgesKernel","content":"Kernels.edgesKernel \nedgesKernel \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-kernels.html#gaussianBlur7x7Kernel","title":"Kernels.gaussianBlur7x7Kernel","content":"Kernels.gaussianBlur7x7Kernel \ngaussianBlur7x7Kernel \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-kernels.html#sharpenKernel","title":"Kernels.sharpenKernel","content":"Kernels.sharpenKernel \nsharpenKernel \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-kernels.html#embossKernel","title":"Kernels.embossKernel","content":"Kernels.embossKernel \nembossKernel \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-main.html","title":"Main","content":"Main \n\n Module for processing console commands\n \nMain.main \nmain"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-main.html#main","title":"Main.main","content":"Main.main \nmain \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-myimage.html","title":"MyImage","content":"MyImage \n\n Module for working with images\n \nMyImage.MyImage \nMyImage \nMyImage.loadAsImage \nloadAsImage \nMyImage.saveImage \nsaveImage"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-myimage.html#loadAsImage","title":"MyImage.loadAsImage","content":"MyImage.loadAsImage \nloadAsImage \n\n Load image as MyImage type\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-myimage.html#saveImage","title":"MyImage.saveImage","content":"MyImage.saveImage \nsaveImage \n\n Save MyImage in a specific directory\n "},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-myimage-myimage.html","title":"MyImage","content":"MyImage \n\n Type to represent images\n \nMyImage.\u0060\u0060.ctor\u0060\u0060 \n\u0060\u0060.ctor\u0060\u0060 \nMyImage.Data \nData \nMyImage.Width \nWidth \nMyImage.Height \nHeight \nMyImage.Name \nName"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-myimage-myimage.html#\u0060\u0060.ctor\u0060\u0060","title":"MyImage.\u0060\u0060.ctor\u0060\u0060","content":"MyImage.\u0060\u0060.ctor\u0060\u0060 \n\u0060\u0060.ctor\u0060\u0060 \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-myimage-myimage.html#Data","title":"MyImage.Data","content":"MyImage.Data \nData \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-myimage-myimage.html#Width","title":"MyImage.Width","content":"MyImage.Width \nWidth \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-myimage-myimage.html#Height","title":"MyImage.Height","content":"MyImage.Height \nHeight \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-myimage-myimage.html#Name","title":"MyImage.Name","content":"MyImage.Name \nName \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types.html","title":"Types","content":"Types \n\n Module with necessary algebraic types\n \nTypes.AgentStatus \nAgentStatus \nTypes.Devices \nDevices \nTypes.MirrorDirection \nMirrorDirection \nTypes.Modifications \nModifications \nTypes.Msg \nMsg \nTypes.Side \nSide"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-agentstatus.html","title":"AgentStatus","content":"AgentStatus \n\n Type for determining the status of an agent\n \nAgentStatus.On \nOn \nAgentStatus.Off \nOff"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-agentstatus.html#On","title":"AgentStatus.On","content":"AgentStatus.On \nOn \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-agentstatus.html#Off","title":"AgentStatus.Off","content":"AgentStatus.Off \nOff \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-devices.html","title":"Devices","content":"Devices \n\n Type for defining the executor of transformations\n \nDevices.AnyGpu \nAnyGpu \nDevices.Nvidia \nNvidia \nDevices.Amd \nAmd \nDevices.Intel \nIntel"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-devices.html#AnyGpu","title":"Devices.AnyGpu","content":"Devices.AnyGpu \nAnyGpu \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-devices.html#Nvidia","title":"Devices.Nvidia","content":"Devices.Nvidia \nNvidia \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-devices.html#Amd","title":"Devices.Amd","content":"Devices.Amd \nAmd \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-devices.html#Intel","title":"Devices.Intel","content":"Devices.Intel \nIntel \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-mirrordirection.html","title":"MirrorDirection","content":"MirrorDirection \n\n Type for determining the direction of image reflection\n \nMirrorDirection.Vertical \nVertical \nMirrorDirection.Horizontal \nHorizontal"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-mirrordirection.html#Vertical","title":"MirrorDirection.Vertical","content":"MirrorDirection.Vertical \nVertical \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-mirrordirection.html#Horizontal","title":"MirrorDirection.Horizontal","content":"MirrorDirection.Horizontal \nHorizontal \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-modifications.html","title":"Modifications","content":"Modifications \n\n Type for determining the applied image transformation\n \nModifications.Gauss5x5 \nGauss5x5 \nModifications.Gauss7x7 \nGauss7x7 \nModifications.Edges \nEdges \nModifications.Sharpen \nSharpen \nModifications.Emboss \nEmboss \nModifications.ClockwiseRotation \nClockwiseRotation \nModifications.CounterClockwiseRotation \nCounterClockwiseRotation \nModifications.MirrorVertical \nMirrorVertical \nModifications.MirrorHorizontal \nMirrorHorizontal \nModifications.FishEye \nFishEye"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-modifications.html#Gauss5x5","title":"Modifications.Gauss5x5","content":"Modifications.Gauss5x5 \nGauss5x5 \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-modifications.html#Gauss7x7","title":"Modifications.Gauss7x7","content":"Modifications.Gauss7x7 \nGauss7x7 \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-modifications.html#Edges","title":"Modifications.Edges","content":"Modifications.Edges \nEdges \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-modifications.html#Sharpen","title":"Modifications.Sharpen","content":"Modifications.Sharpen \nSharpen \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-modifications.html#Emboss","title":"Modifications.Emboss","content":"Modifications.Emboss \nEmboss \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-modifications.html#ClockwiseRotation","title":"Modifications.ClockwiseRotation","content":"Modifications.ClockwiseRotation \nClockwiseRotation \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-modifications.html#CounterClockwiseRotation","title":"Modifications.CounterClockwiseRotation","content":"Modifications.CounterClockwiseRotation \nCounterClockwiseRotation \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-modifications.html#MirrorVertical","title":"Modifications.MirrorVertical","content":"Modifications.MirrorVertical \nMirrorVertical \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-modifications.html#MirrorHorizontal","title":"Modifications.MirrorHorizontal","content":"Modifications.MirrorHorizontal \nMirrorHorizontal \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-modifications.html#FishEye","title":"Modifications.FishEye","content":"Modifications.FishEye \nFishEye \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-msg.html","title":"Msg","content":"Msg \n\n Type to define a message to be forwarded between agents\n \nMsg.Img \nImg \nMsg.Path \nPath \nMsg.EOS \nEOS \nMsg.Message \nMessage"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-msg.html#Img","title":"Msg.Img","content":"Msg.Img \nImg \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-msg.html#Path","title":"Msg.Path","content":"Msg.Path \nPath \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-msg.html#EOS","title":"Msg.EOS","content":"Msg.EOS \nEOS \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-msg.html#Message","title":"Msg.Message","content":"Msg.Message \nMessage \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-side.html","title":"Side","content":"Side \n\n Type for determining the rotation side of the image\n \nSide.Right \nRight \nSide.Left \nLeft"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-side.html#Right","title":"Side.Right","content":"Side.Right \nRight \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/reference/imageprocessing-types-side.html#Left","title":"Side.Left","content":"Side.Left \nLeft \n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/index.html","title":"index","content":"## What is ImageProcessing?\r\n\r\nA library for image processing using GPGPU and agents for parallel computing. \r\n\r\n---\r\n\r\n\u003Cdiv class=\u0022row row-cols-1 row-cols-md-2\u0022\u003E\r\n \u003Cdiv class=\u0022col mb-4\u0022\u003E\r\n \u003Cdiv class=\u0022card h-100\u0022\u003E\r\n \u003Cdiv class=\u0022card-body\u0022\u003E\r\n \u003Ch5 class=\u0022card-title\u0022\u003ETutorials\u003C/h5\u003E\r\n \u003Cp class=\u0022card-text\u0022\u003EHow to get started with ImageProcessing \u003C/p\u003E\r\n \u003C/div\u003E\r\n \u003Cdiv class=\u0022card-footer text-right border-top-0\u0022\u003E\r\n \u003Ca href=\u0022{{root}}Tutorials/Tutorial.html\u0022 class=\u0022btn btn-primary\u0022\u003EGet started\u003C/a\u003E\r\n \u003C/div\u003E\r\n \u003C/div\u003E\r\n \u003C/div\u003E\r\n \u003Cdiv class=\u0022col mb-4\u0022\u003E\r\n \u003Cdiv class=\u0022card h-100\u0022\u003E\r\n \u003Cdiv class=\u0022card-body\u0022\u003E\r\n \u003Ch5 class=\u0022card-title\u0022\u003EHow-To Guides\u003C/h5\u003E\r\n \u003Cp class=\u0022card-text\u0022\u003ELearn how to work with the ImageProcessing library directly in your code \u003C/p\u003E\r\n \u003C/div\u003E\r\n \u003Cdiv class=\u0022card-footer text-right border-top-0\u0022\u003E\r\n \u003Ca href=\u0022{{root}}/How_Tos/Code.html\u0022 class=\u0022btn btn-primary\u0022\u003EHow to code\u003C/a\u003E\r\n \u003C/div\u003E\r\n \u003C/div\u003E\r\n \u003C/div\u003E\r\n \u003Cdiv class=\u0022col mb-4 mb-md-0\u0022\u003E\r\n \u003Cdiv class=\u0022card h-100\u0022\u003E\r\n \u003Cdiv class=\u0022card-body\u0022\u003E\r\n \u003Ch5 class=\u0022card-title\u0022\u003EExplanations\u003C/h5\u003E\r\n \u003Cp class=\u0022card-text\u0022\u003ELearn about the structure of the library\u003C/p\u003E\r\n \u003C/div\u003E\r\n \u003Cdiv class=\u0022card-footer text-right border-top-0\u0022\u003E\r\n \u003Ca href=\u0022{{root}}Explanations/Structure.html\u0022 class=\u0022btn btn-primary\u0022\u003EStructure\u003C/a\u003E\r\n \u003C/div\u003E\r\n \u003C/div\u003E\r\n \u003C/div\u003E\r\n\u003C/div\u003E"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/Explanations/Structure.html","title":"Structure","content":"---\r\ntitle: Structure\r\ncategory: Explanations\r\ncategoryindex: 3\r\nindex: 1\r\n---\r\n\r\n# Structure of ImageProcessing library\r\n\r\n![image](https://raw.githubusercontent.com/LeonidLodygin/ImageProcessing/gh-pages/images/Structure.png)"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/How_Tos/Code.html","title":"How to code","content":"---\r\ntitle: How to code\r\ncategory: Guides\r\ncategoryindex: 1\r\nindex: 100\r\n---\r\n\r\n# How to code\r\n\r\nIn this tutorial, we will look at how to work with the ImageProcessing library using code rather than console commands.\r\n\r\n## Installing ImageProcessing\r\n\r\n\u0060\u0060\u0060sh\r\n\u003E dotnet add package LeonidLodygin.ImageProcessing --version 1.0.0\r\n\u0060\u0060\u0060\r\n\u003Cdiv class=\u0022alert alert-primary\u0022 role=\u0022alert\u0022\u003E\r\n \u003Cp\u003E\r\n NOTE: The library uses .NET 7.0. Make sure your application complies with this requirement.\r\n \u003C/p\u003E\r\n\u003C/div\u003E\r\n\r\nLoad your image using the \u0060loadAsImage\u0060 function from the \u0060MyImage\u0060 module.\r\n\r\n\u0060\u0060\u0060sh\r\nlet image = loadAsImage \u0022path to the image\u0022\r\n\u0060\u0060\u0060\r\n\r\nFor CPU and GPU the list of transforms is identical, decide what you want to process your image on and select the appropriate function to process from the \u0060CpuProcessing\u0060 module or the \u0060GpuProcessing\u0060 module respectively.\r\n\r\n### In the case of CPU processing:\r\n\r\nApply the fisheye filter to the uploaded image.\r\n\r\n\u0060\u0060\u0060sh\r\nlet newImage = fishEye image\r\n\u0060\u0060\u0060\r\n\r\nDon\u0027t forget to save the processed image using the saveImage function from the \u0060MyImage\u0060 module!\r\n\r\n\u0060\u0060\u0060sh\r\nlet newImage = saveImage \u0022path\u0022\r\n\u0060\u0060\u0060\r\n\r\n### In the case of GPU processing:\r\n\r\nIn the case of GPU processing, you have to go through a few extra steps to achieve your goal:\r\n\r\nPrepare OpenCl context and queue(from \u0060Brahma.FSharp\u0060 module):\r\n\r\n\u0060\u0060\u0060sh\r\nlet clContext = ClContext(ClDevice.GetFirstAppropriateDevice(device))\r\nlet queue = clContext.QueueProvider.CreateQueue()\r\n\u0060\u0060\u0060\r\n\r\nCompile the kernel to apply the filter using the \u0060fishEyeKernel\u0060 function from the \u0060GpuKernels\u0060 module: \r\n\r\n\u0060\u0060\u0060sh\r\nlet fishKernel = fishEyeKernel clContext\r\n\u0060\u0060\u0060\r\n\r\nProcess the image using the \u0060fishEye\u0060 function from the \u0060GpuProcessing\u0060 module:\r\n\r\n\u0060\u0060\u0060sh\r\nlet newImage = fishEye fishKernel clContext 64 queue image\r\n\u0060\u0060\u0060\r\n\r\nDon\u0027t forget to save the new image:\r\n\r\n\u0060\u0060\u0060sh\r\nlet newImage = saveImage \u0022path\u0022\r\n\u0060\u0060\u0060\r\n\r\n\u003Cdiv class=\u0022alert alert-primary\u0022 role=\u0022alert\u0022\u003E\r\n \u003Cp\u003E\r\n For more info about GPU processing please check \u003Ca href=\u0022https://yaccconstructor.github.io/Brahma.FSharp/\u0022\u003EBrahma\r\n \u003C/p\u003E\r\n\u003C/div\u003E\r\n"},{"uri":"https://LeonidLodygin.github.io/ImageProcessing/Tutorials/Tutorial.html","title":"Get Started","content":"---\r\ntitle: Get Started\r\ncategory: Tutorials\r\ncategoryindex: 0\r\nindex: 100\r\n---\r\n\r\n# Get Started\r\n\r\nIn this tutorial we will look at how to get started with the ImageProcessing library and process your first images.\r\n\r\n## Installing ImageProcessing\r\n\r\n\u0060\u0060\u0060sh\r\n\u003E dotnet add package LeonidLodygin.ImageProcessing --version 1.0.0\r\n\u0060\u0060\u0060\r\n\r\n## Processing of images\r\n\r\n### Prepare your images\r\n\r\nDecide on the image you want to process. You can also process several images at once, in which case specify the path to the directory with your images.\r\n\r\nIn the command line parameter \u0022-i\u0022 use the path to the image, for \u0022-o\u0022 use the path where you want to save the image.\r\n\u003Cdiv class=\u0022alert alert-primary\u0022 role=\u0022alert\u0022\u003E\r\n \u003Cp\u003E\r\n NOTE: Do not use the same directory as your images for saving, if you do, you will lose the original images!\r\n \u003C/p\u003E\r\n\u003C/div\u003E\r\n\r\n### Choose the desired modifications\r\n\r\nDecide on the modifications you want to apply to the image. Here is a complete list of available modifications:\r\n\r\n- Gauss5x5 \r\n- Gauss7x7\r\n- Edges\r\n- Sharpen\r\n- Emboss\r\n- ClockwiseRotation\r\n- CounterClockwiseRotation\r\n- MirrorVertical\r\n- MirrorHorizontal\r\n- FishEye\r\n\r\nUse the selected modification or modification list for the \u0022-mod\u0022 parameter.\r\n\r\n### CPU or GPU processing?\r\n\r\nBy default, all processing will be done at the expense of the CPU. If you want to process images using GPGPU, use the \u0022-gpu\u0022 parameter (if the device has a video card):\r\n\r\n- AnyGpu\r\n- Nvidia\r\n- Amd\r\n- Intel\r\n\r\n### How many logical cores does your system have?\r\n\r\nIn the case of processing a large number of images, it would be logical to utilize the parallel processing power of your device. To do this, use the \u0022-ag\u0022 or \u0022-sag\u0022 parameter. The \u0022-ag\u0022 parameter will split image processing and saving tasks into two separate computational threads. The \u0022-sag\u0022 parameter will allocate the number of threads you need to process and save images independently. For this parameter you should specify the number of threads you need.\r\n\r\n### Let\u0027s start processing!\r\n\r\nThe end result may look like the following:\r\n\u0060\u0060\u0060sh\r\n\u003E dotnet run -i *input path* -o *output path* -mod FishEye -gpu AnyGpu\r\n\u0060\u0060\u0060"}] \ No newline at end of file diff --git a/docs/reference/imageprocessing-agents.html b/docs/reference/imageprocessing-agents.html new file mode 100644 index 00000000..87fe2a04 --- /dev/null +++ b/docs/reference/imageprocessing-agents.html @@ -0,0 +1,1021 @@ + + + + + + Agents (ImageProcessing) + + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    + Agents Module +

    + +
    +
    +

    + + Module with implementation of agents for image processing + +

    +
    +
    +
    +

    + Functions and values +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Function or value + + Description +
    +
    + +

    + + + imgProcessor filter imgSaver logger + + +

    +
    +
    +
    + Full Usage: + imgProcessor filter imgSaver logger +
    +
    + Parameters: + +
    + + Returns: + MailboxProcessor<Msg> + +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Agent for image processing + +

    +
    +
    +
    +
    + + filter + + : + MyImage -> MyImage +
    +
    +

    + Filter for application +

    +
    +
    + + imgSaver + + : + MailboxProcessor<Msg> +
    +
    +

    + Saving Agent +

    +
    +
    + + logger + + : + MailboxProcessor<Msg> +
    +
    +

    + Logging Agent +

    +
    +
    +
    +
    + + Returns: + + MailboxProcessor<Msg> +
    +
    +
    +
    +
    +
    + +

    + + + imgSaver outDir logger + + +

    +
    +
    +
    + Full Usage: + imgSaver outDir logger +
    +
    + Parameters: +
      + + + outDir + + : + string + - + Path to save + +
      + + + logger + + : + MailboxProcessor<Msg> + - + Logging Agent + +
      +
    +
    + + Returns: + MailboxProcessor<Msg> + +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Agent for saving images + +

    +
    +
    +
    +
    + + outDir + + : + string +
    +
    +

    + Path to save +

    +
    +
    + + logger + + : + MailboxProcessor<Msg> +
    +
    +

    + Logging Agent +

    +
    +
    +
    +
    + + Returns: + + MailboxProcessor<Msg> +
    +
    +
    +
    +
    +
    + +

    + + + listAllFiles dir + + +

    +
    +
    +
    + Full Usage: + listAllFiles dir +
    +
    + Parameters: +
      + + + dir + + : + string + +
      +
    +
    + + Returns: + string list + +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + List of all files in directory + +

    +
    +
    +
    +
    + + dir + + : + string +
    +
    +
    +
    +
    + + Returns: + + string list +
    +
    +
    +
    +
    +
    + +

    + + + msgLogger () + + +

    +
    +
    +
    + Full Usage: + msgLogger () +
    +
    + Parameters: +
      + + + () + + : + unit + +
      +
    +
    + + Returns: + MailboxProcessor<Msg> + +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Agent for logging + +

    +
    +
    +
    +
    + + () + + : + unit +
    +
    +
    +
    +
    + + Returns: + + MailboxProcessor<Msg> +
    +
    +
    +
    +
    +
    + +

    + + + outFile imgName outDir + + +

    +
    +
    +
    + Full Usage: + outFile imgName outDir +
    +
    + Parameters: +
      + + + imgName + + : + string + +
      + + + outDir + + : + string + +
      +
    +
    + + Returns: + string + +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Creation of path to save the image + +

    +
    +
    +
    +
    + + imgName + + : + string +
    +
    +
    + + outDir + + : + string +
    +
    +
    +
    +
    + + Returns: + + string +
    +
    +
    +
    +
    +
    + +

    + + + superAgent outputDir conversion logger + + +

    +
    +
    +
    + Full Usage: + superAgent outputDir conversion logger +
    +
    + Parameters: +
      + + + outputDir + + : + string + - + Path to save + +
      + + + conversion + + : + MyImage -> MyImage + - + Image transformation + +
      + + + logger + + : + MailboxProcessor<Msg> + - + Logging Agent + +
      +
    +
    + + Returns: + MailboxProcessor<Msg> + +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Agent with the ability to process and save the image + +

    +
    +
    +
    +
    + + outputDir + + : + string +
    +
    +

    + Path to save +

    +
    +
    + + conversion + + : + MyImage -> MyImage +
    +
    +

    + Image transformation +

    +
    +
    + + logger + + : + MailboxProcessor<Msg> +
    +
    +

    + Logging Agent +

    +
    +
    +
    +
    + + Returns: + + MailboxProcessor<Msg> +
    +
    +
    +
    +
    +
    + +

    + + + superImageProcessing inputDir outputDir conversion countOfAgents + + +

    +
    +
    +
    + Full Usage: + superImageProcessing inputDir outputDir conversion countOfAgents +
    +
    + Parameters: +
      + + + inputDir + + : + string + - + Path to image or images + +
      + + + outputDir + + : + string + - + Path to save + +
      + + + conversion + + : + MyImage -> MyImage + - + Image transformation + +
      + + + countOfAgents + + : + int + - + Count of superAgents to processing + +
      +
    +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Image processing using superAgents + +

    +
    +
    +
    +
    + + inputDir + + : + string +
    +
    +

    + Path to image or images +

    +
    +
    + + outputDir + + : + string +
    +
    +

    + Path to save +

    +
    +
    + + conversion + + : + MyImage -> MyImage +
    +
    +

    + Image transformation +

    +
    +
    + + countOfAgents + + : + int +
    +
    +

    + Count of superAgents to processing +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/imageprocessing-arguments-cliarguments.html b/docs/reference/imageprocessing-arguments-cliarguments.html new file mode 100644 index 00000000..ef9ff69f --- /dev/null +++ b/docs/reference/imageprocessing-arguments-cliarguments.html @@ -0,0 +1,522 @@ + + + + + + CliArguments (ImageProcessing) + + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    + CliArguments Type +

    + +
    +
    +

    + +

    +
    +
    +
    +
    +
    +
    +

    + Union cases +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Union case + + Description +
    +
    + +

    + + + Agents + + +

    +
    +
    +
    + Full Usage: + Agents +
    +
    +
    +
    +
    +
    +
    + + + + +

    + +

    +
    +
    +
    + +

    + + + GpGpu device + + +

    +
    +
    +
    + Full Usage: + GpGpu device +
    +
    + Parameters: +
      + + + device + + : + Devices + +
      +
    +
    +
    +
    +
    +
    +
    +
    + + device + + : + Devices +
    +
    +
    +
    +
    + +

    + + + InputPath inputPath + + +

    +
    +
    +
    + Full Usage: + InputPath inputPath +
    +
    + Parameters: +
      + + + inputPath + + : + string + +
      +
    +
    +
    +
    +
    +
    +
    +
    + + inputPath + + : + string +
    +
    +
    +
    +
    + +

    + + + Modifications modifications + + +

    +
    +
    +
    + Full Usage: + Modifications modifications +
    +
    + Parameters: + +
    +
    +
    +
    +
    +
    +
    + + modifications + + : + List<Modifications> +
    +
    +
    +
    +
    + +

    + + + OutputPath outputPath + + +

    +
    +
    +
    + Full Usage: + OutputPath outputPath +
    +
    + Parameters: +
      + + + outputPath + + : + string + +
      +
    +
    +
    +
    +
    +
    +
    +
    + + outputPath + + : + string +
    +
    +
    +
    +
    + +

    + + + SuperAgents count + + +

    +
    +
    +
    + Full Usage: + SuperAgents count +
    +
    + Parameters: +
      + + + count + + : + int + +
      +
    +
    +
    +
    +
    +
    +
    +
    + + count + + : + int +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/imageprocessing-arguments.html b/docs/reference/imageprocessing-arguments.html new file mode 100644 index 00000000..8906279b --- /dev/null +++ b/docs/reference/imageprocessing-arguments.html @@ -0,0 +1,1032 @@ + + + + + + Arguments (ImageProcessing) + + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    + Arguments Module +

    + +
    +
    +

    + + Module with implementation of work via console commands + +

    +
    +
    +
    +

    + Types +

    + + + + + + + + + + + + + +
    + Type + + Description +
    +

    + + + CliArguments + + +

    +
    +
    + + + + + + +

    + +

    +
    +
    +
    +
    +

    + Functions and values +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Function or value + + Description +
    +
    + +

    + + + deviceParser device + + +

    +
    +
    +
    + Full Usage: + deviceParser device +
    +
    + Parameters: +
      + + + device + + : + Devices + +
      +
    +
    + + Returns: + Platform + +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Parsing of device + +

    +
    +
    +
    +
    + + device + + : + Devices +
    +
    +
    +
    +
    + + Returns: + + Platform +
    +
    +
    +
    +
    +
    + +

    + + + first (x, arg2, arg3, arg4) + + +

    +
    +
    +
    + Full Usage: + first (x, arg2, arg3, arg4) +
    +
    + Parameters: +
      + + + x + + : + 'a + +
      + + + arg1 + + : + 'b + +
      + + + arg2 + + : + 'c + +
      + + + arg3 + + : + 'd + +
      +
    +
    + + Returns: + 'a + +
    +
    +
    +
    +
    +
    +
    + + x + + : + 'a +
    +
    +
    + + arg1 + + : + 'b +
    +
    +
    + + arg2 + + : + 'c +
    +
    +
    + + arg3 + + : + 'd +
    +
    +
    +
    +
    + + Returns: + + 'a +
    +
    +
    +
    +
    + +

    + + + fourth (arg1, arg2, arg3, x) + + +

    +
    +
    +
    + Full Usage: + fourth (arg1, arg2, arg3, x) +
    +
    + Parameters: +
      + + + arg0 + + : + 'a + +
      + + + arg1 + + : + 'b + +
      + + + arg2 + + : + 'c + +
      + + + x + + : + 'd + +
      +
    +
    + + Returns: + 'd + +
    +
    +
    +
    +
    +
    +
    + + arg0 + + : + 'a +
    +
    +
    + + arg1 + + : + 'b +
    +
    +
    + + arg2 + + : + 'c +
    +
    +
    + + x + + : + 'd +
    +
    +
    +
    +
    + + Returns: + + 'd +
    +
    +
    +
    +
    + +

    + + + modificationGpuParser modification (arg2, arg3, arg4, arg5) + + +

    +
    +
    +
    + Full Usage: + modificationGpuParser modification (arg2, arg3, arg4, arg5) +
    +
    + Parameters: + +
    + + Returns: + ClContext -> int -> MailboxProcessor<Msg> -> MyImage -> MyImage + +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Parsing of GPU modification + +

    +
    +
    +
    +
    + + modification + + : + Modifications +
    +
    +
    + + arg1 + + : + ClProgram<Range1D, (ClArray<byte> -> int -> int -> ClArray<float32> -> int -> ClArray<byte> -> unit)> +
    +
    +
    + + arg2 + + : + ClProgram<Range1D, (ClArray<byte> -> int -> int -> int -> ClArray<byte> -> unit)> +
    +
    +
    + + arg3 + + : + ClProgram<Range1D, (ClArray<byte> -> int -> int -> int -> ClArray<byte> -> unit)> +
    +
    +
    + + arg4 + + : + ClProgram<Range1D, (ClArray<byte> -> int -> int -> ClArray<byte> -> unit)> +
    +
    +
    +
    +
    + + Returns: + + ClContext -> int -> MailboxProcessor<Msg> -> MyImage -> MyImage +
    +
    +
    +
    +
    +
    + +

    + + + modificationParser modification + + +

    +
    +
    +
    + Full Usage: + modificationParser modification +
    +
    + Parameters: + +
    + + Returns: + MyImage -> MyImage + +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Parsing of CPU modification + +

    +
    +
    +
    +
    + + modification + + : + Modifications +
    +
    +
    +
    +
    + + Returns: + + MyImage -> MyImage +
    +
    +
    +
    +
    +
    + +

    + + + second (arg1, x, arg3, arg4) + + +

    +
    +
    +
    + Full Usage: + second (arg1, x, arg3, arg4) +
    +
    + Parameters: +
      + + + arg0 + + : + 'a + +
      + + + x + + : + 'b + +
      + + + arg2 + + : + 'c + +
      + + + arg3 + + : + 'd + +
      +
    +
    + + Returns: + 'b + +
    +
    +
    +
    +
    +
    +
    + + arg0 + + : + 'a +
    +
    +
    + + x + + : + 'b +
    +
    +
    + + arg2 + + : + 'c +
    +
    +
    + + arg3 + + : + 'd +
    +
    +
    +
    +
    + + Returns: + + 'b +
    +
    +
    +
    +
    + +

    + + + third (arg1, arg2, x, arg4) + + +

    +
    +
    +
    + Full Usage: + third (arg1, arg2, x, arg4) +
    +
    + Parameters: +
      + + + arg0 + + : + 'a + +
      + + + arg1 + + : + 'b + +
      + + + x + + : + 'c + +
      + + + arg3 + + : + 'd + +
      +
    +
    + + Returns: + 'c + +
    +
    +
    +
    +
    +
    +
    + + arg0 + + : + 'a +
    +
    +
    + + arg1 + + : + 'b +
    +
    +
    + + x + + : + 'c +
    +
    +
    + + arg3 + + : + 'd +
    +
    +
    +
    +
    + + Returns: + + 'c +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/imageprocessing-cpuprocessing.html b/docs/reference/imageprocessing-cpuprocessing.html new file mode 100644 index 00000000..2a1cfe54 --- /dev/null +++ b/docs/reference/imageprocessing-cpuprocessing.html @@ -0,0 +1,671 @@ + + + + + + CpuProcessing (ImageProcessing) + + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    + CpuProcessing Module +

    + +
    +
    +

    + + Module with functions for image processing on the CPU + +

    +
    +
    +
    +

    + Functions and values +

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Function or value + + Description +
    +
    + +

    + + + applyFilter filter img + + +

    +
    +
    +
    + Full Usage: + applyFilter filter img +
    +
    + Parameters: +
      + + + filter + + : + float32[][] + - + A two-dimensional array applied to an image as a filter + +
      + + + img + + : + MyImage + +
      +
    +
    + + Returns: + MyImage + + Image with type MyImage +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Filter application + +

    +
    +
    +
    +
    + + filter + + : + float32[][] +
    +
    +

    + A two-dimensional array applied to an image as a filter +

    +
    +
    + + img + + : + MyImage +
    +
    +
    +
    +
    + + Returns: + + MyImage +
    +
    +

    + Image with type MyImage +

    +
    +
    +
    +
    +
    + +

    + + + fishEye image + + +

    +
    +
    +
    + Full Usage: + fishEye image +
    +
    + Parameters: +
      + + + image + + : + MyImage + - + Image with type MyImage + +
      +
    +
    + + Returns: + MyImage + + Image with type MyImage +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Applying "FishEye" to an image + +

    +
    +
    +
    +
    + + image + + : + MyImage +
    +
    +

    + Image with type MyImage +

    +
    +
    +
    +
    + + Returns: + + MyImage +
    +
    +

    + Image with type MyImage +

    +
    +
    +
    +
    +
    + +

    + + + mirror side image + + +

    +
    +
    +
    + Full Usage: + mirror side image +
    +
    + Parameters: +
      + + + side + + : + MirrorDirection + - + The side to which the image will be reflected + +
      + + + image + + : + MyImage + - + Image with type MyImage + +
      +
    +
    + + Returns: + MyImage + + Image with type MyImage +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Image Reflection + +

    +
    +
    +
    +
    + + side + + : + MirrorDirection +
    +
    +

    + The side to which the image will be reflected +

    +
    +
    + + image + + : + MyImage +
    +
    +

    + Image with type MyImage +

    +
    +
    +
    +
    + + Returns: + + MyImage +
    +
    +

    + Image with type MyImage +

    +
    +
    +
    +
    +
    + +

    + + + rotate side image + + +

    +
    +
    +
    + Full Usage: + rotate side image +
    +
    + Parameters: +
      + + + side + + : + Side + - + The side to which the image will be rotated + +
      + + + image + + : + MyImage + - + Image with type MyImage + +
      +
    +
    + + Returns: + MyImage + + Image with type MyImage +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Rotate of image + +

    +
    +
    +
    +
    + + side + + : + Side +
    +
    +

    + The side to which the image will be rotated +

    +
    +
    + + image + + : + MyImage +
    +
    +

    + Image with type MyImage +

    +
    +
    +
    +
    + + Returns: + + MyImage +
    +
    +

    + Image with type MyImage +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/imageprocessing-gpukernels.html b/docs/reference/imageprocessing-gpukernels.html new file mode 100644 index 00000000..a457aa0a --- /dev/null +++ b/docs/reference/imageprocessing-gpukernels.html @@ -0,0 +1,1351 @@ + + + + + + GpuKernels (ImageProcessing) + + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    + GpuKernels Module +

    + +
    +
    +

    + + Module with kernels for image processing on the GPU + +

    +
    +
    +
    +

    + Functions and values +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Function or value + + Description +
    +
    + +

    + + + applyFilterKernel clContext + + +

    +
    +
    +
    + Full Usage: + applyFilterKernel clContext +
    +
    + Parameters: + +
    + + Returns: + ClProgram<Range1D, (ClArray<byte> -> int -> int -> ClArray<float32> -> int -> ClArray<byte> -> unit)> + +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Compilation of kernel to apply filter to the image + +

    +
    +
    +
    +
    + + clContext + + : + ClContext +
    +
    +
    +
    +
    + + Returns: + + ClProgram<Range1D, (ClArray<byte> -> int -> int -> ClArray<float32> -> int -> ClArray<byte> -> unit)> +
    +
    +
    +
    +
    +
    + +

    + + + applyFilterProcessor kernel localWorkSize commandQueue filter filterD img imgH imgW result + + +

    +
    +
    +
    + Full Usage: + applyFilterProcessor kernel localWorkSize commandQueue filter filterD img imgH imgW result +
    +
    + Parameters: +
      + + + kernel + + : + ClProgram<Range1D, (ClArray<byte> -> int -> int -> ClArray<float32> -> int -> ClArray<byte> -> unit)> + +
      + + + localWorkSize + + : + int + +
      + + + commandQueue + + : + MailboxProcessor<Msg> + +
      + + + filter + + : + ClArray<float32> + +
      + + + filterD + + : + int + +
      + + + img + + : + ClArray<byte> + +
      + + + imgH + + : + int + +
      + + + imgW + + : + int + +
      + + + result + + : + ClArray<byte> + +
      +
    +
    + + Returns: + ClArray<byte> + +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Asynchronous application of the filter kernel to the image + +

    +
    +
    +
    +
    + + kernel + + : + ClProgram<Range1D, (ClArray<byte> -> int -> int -> ClArray<float32> -> int -> ClArray<byte> -> unit)> +
    +
    +
    + + localWorkSize + + : + int +
    +
    +
    + + commandQueue + + : + MailboxProcessor<Msg> +
    +
    +
    + + filter + + : + ClArray<float32> +
    +
    +
    + + filterD + + : + int +
    +
    +
    + + img + + : + ClArray<byte> +
    +
    +
    + + imgH + + : + int +
    +
    +
    + + imgW + + : + int +
    +
    +
    + + result + + : + ClArray<byte> +
    +
    +
    +
    +
    + + Returns: + + ClArray<byte> +
    +
    +
    +
    +
    +
    + +

    + + + fishEyeKernel clContext + + +

    +
    +
    +
    + Full Usage: + fishEyeKernel clContext +
    +
    + Parameters: + +
    + + Returns: + ClProgram<Range1D, (ClArray<'a> -> int -> int -> ClArray<'a> -> unit)> + +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Compilation of kernel to apply FishEye to the image + +

    +
    +
    +
    +
    + + clContext + + : + ClContext +
    +
    +
    +
    +
    + + Returns: + + ClProgram<Range1D, (ClArray<'a> -> int -> int -> ClArray<'a> -> unit)> +
    +
    +
    +
    +
    +
    + +

    + + + fishEyeKernelProcessor kernel localWorkSize commandQueue img imgH imgW result + + +

    +
    +
    +
    + Full Usage: + fishEyeKernelProcessor kernel localWorkSize commandQueue img imgH imgW result +
    +
    + Parameters: +
      + + + kernel + + : + ClProgram<Range1D, (ClArray<byte> -> int -> int -> ClArray<byte> -> unit)> + +
      + + + localWorkSize + + : + int + +
      + + + commandQueue + + : + MailboxProcessor<Msg> + +
      + + + img + + : + ClArray<byte> + +
      + + + imgH + + : + int + +
      + + + imgW + + : + int + +
      + + + result + + : + ClArray<byte> + +
      +
    +
    + + Returns: + ClArray<byte> + +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Asynchronous application of the fisheye kernel to the image + +

    +
    +
    +
    +
    + + kernel + + : + ClProgram<Range1D, (ClArray<byte> -> int -> int -> ClArray<byte> -> unit)> +
    +
    +
    + + localWorkSize + + : + int +
    +
    +
    + + commandQueue + + : + MailboxProcessor<Msg> +
    +
    +
    + + img + + : + ClArray<byte> +
    +
    +
    + + imgH + + : + int +
    +
    +
    + + imgW + + : + int +
    +
    +
    + + result + + : + ClArray<byte> +
    +
    +
    +
    +
    + + Returns: + + ClArray<byte> +
    +
    +
    +
    +
    +
    + +

    + + + mirrorKernel clContext + + +

    +
    +
    +
    + Full Usage: + mirrorKernel clContext +
    +
    + Parameters: + +
    + + Returns: + ClProgram<Range1D, (ClArray<'a> -> int -> int -> int -> ClArray<'a> -> unit)> + +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Compilation of kernel to reflect the image + +

    +
    +
    +
    +
    + + clContext + + : + ClContext +
    +
    +
    +
    +
    + + Returns: + + ClProgram<Range1D, (ClArray<'a> -> int -> int -> int -> ClArray<'a> -> unit)> +
    +
    +
    +
    +
    +
    + +

    + + + mirrorKernelProcessor kernel localWorkSize side commandQueue img imgH imgW result + + +

    +
    +
    +
    + Full Usage: + mirrorKernelProcessor kernel localWorkSize side commandQueue img imgH imgW result +
    +
    + Parameters: + +
    + + Returns: + ClArray<byte> + +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Asynchronous application of the reflection kernel to the image + +

    +
    +
    +
    +
    + + kernel + + : + ClProgram<Range1D, (ClArray<byte> -> int -> int -> int -> ClArray<byte> -> unit)> +
    +
    +
    + + localWorkSize + + : + int +
    +
    +
    + + side + + : + MirrorDirection +
    +
    +
    + + commandQueue + + : + MailboxProcessor<Msg> +
    +
    +
    + + img + + : + ClArray<byte> +
    +
    +
    + + imgH + + : + int +
    +
    +
    + + imgW + + : + int +
    +
    +
    + + result + + : + ClArray<byte> +
    +
    +
    +
    +
    + + Returns: + + ClArray<byte> +
    +
    +
    +
    +
    +
    + +

    + + + rotateKernel clContext + + +

    +
    +
    +
    + Full Usage: + rotateKernel clContext +
    +
    + Parameters: + +
    + + Returns: + ClProgram<Range1D, (ClArray<'a> -> int -> int -> int -> ClArray<'a> -> unit)> + +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Compilation of kernel to rotate the image + +

    +
    +
    +
    +
    + + clContext + + : + ClContext +
    +
    +
    +
    +
    + + Returns: + + ClProgram<Range1D, (ClArray<'a> -> int -> int -> int -> ClArray<'a> -> unit)> +
    +
    +
    +
    +
    +
    + +

    + + + rotateKernelProcessor kernel localWorkSize side commandQueue img imgH imgW result + + +

    +
    +
    +
    + Full Usage: + rotateKernelProcessor kernel localWorkSize side commandQueue img imgH imgW result +
    +
    + Parameters: +
      + + + kernel + + : + ClProgram<Range1D, (ClArray<byte> -> int -> int -> int -> ClArray<byte> -> unit)> + +
      + + + localWorkSize + + : + int + +
      + + + side + + : + Side + +
      + + + commandQueue + + : + MailboxProcessor<Msg> + +
      + + + img + + : + ClArray<byte> + +
      + + + imgH + + : + int + +
      + + + imgW + + : + int + +
      + + + result + + : + ClArray<byte> + +
      +
    +
    + + Returns: + ClArray<byte> + +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Asynchronous application of the rotation kernel to the image + +

    +
    +
    +
    +
    + + kernel + + : + ClProgram<Range1D, (ClArray<byte> -> int -> int -> int -> ClArray<byte> -> unit)> +
    +
    +
    + + localWorkSize + + : + int +
    +
    +
    + + side + + : + Side +
    +
    +
    + + commandQueue + + : + MailboxProcessor<Msg> +
    +
    +
    + + img + + : + ClArray<byte> +
    +
    +
    + + imgH + + : + int +
    +
    +
    + + imgW + + : + int +
    +
    +
    + + result + + : + ClArray<byte> +
    +
    +
    +
    +
    + + Returns: + + ClArray<byte> +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/imageprocessing-gpuprocessing.html b/docs/reference/imageprocessing-gpuprocessing.html new file mode 100644 index 00000000..c5be2726 --- /dev/null +++ b/docs/reference/imageprocessing-gpuprocessing.html @@ -0,0 +1,941 @@ + + + + + + GpuProcessing (ImageProcessing) + + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    + GpuProcessing Module +

    + +
    +
    +

    + + Module with functions for image processing on the GPU + +

    +
    +
    +
    +

    + Functions and values +

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Function or value + + Description +
    +
    + +

    + + + applyFilter filter kernel clContext localWorkSize queue + + +

    +
    +
    +
    + Full Usage: + applyFilter filter kernel clContext localWorkSize queue +
    +
    + Parameters: +
      + + + filter + + : + float32[][] + - + A two-dimensional array applied to an image as a filter + +
      + + + kernel + + : + ClProgram<Range1D, (ClArray<byte> -> int -> int -> ClArray<float32> -> int -> ClArray<byte> -> unit)> + - + Compiled kernel for filter application + +
      + + + clContext + + : + ClContext + - + Abstraction over OpenCL context + +
      + + + localWorkSize + + : + int + - + Local workgroup size + +
      + + + queue + + : + MailboxProcessor<Msg> + - + Command queue capable of handling messages of type Msg + +
      +
    +
    + + Returns: + MyImage -> MyImage + + Image with type MyImage +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Filter application + +

    +
    +
    +
    +
    + + filter + + : + float32[][] +
    +
    +

    + A two-dimensional array applied to an image as a filter +

    +
    +
    + + kernel + + : + ClProgram<Range1D, (ClArray<byte> -> int -> int -> ClArray<float32> -> int -> ClArray<byte> -> unit)> +
    +
    +

    + Compiled kernel for filter application +

    +
    +
    + + clContext + + : + ClContext +
    +
    +

    + Abstraction over OpenCL context +

    +
    +
    + + localWorkSize + + : + int +
    +
    +

    + Local workgroup size +

    +
    +
    + + queue + + : + MailboxProcessor<Msg> +
    +
    +

    + Command queue capable of handling messages of type Msg +

    +
    +
    +
    +
    + + Returns: + + MyImage -> MyImage +
    +
    +

    + Image with type MyImage +

    +
    +
    +
    +
    +
    + +

    + + + fishEye kernel clContext localWorkSize queue + + +

    +
    +
    +
    + Full Usage: + fishEye kernel clContext localWorkSize queue +
    +
    + Parameters: +
      + + + kernel + + : + ClProgram<Range1D, (ClArray<byte> -> int -> int -> ClArray<byte> -> unit)> + - + Compiled kernel for fisheye filter application + +
      + + + clContext + + : + ClContext + - + Abstraction over OpenCL context + +
      + + + localWorkSize + + : + int + - + Local workgroup size + +
      + + + queue + + : + MailboxProcessor<Msg> + - + Command queue capable of handling messages of type Msg + +
      +
    +
    + + Returns: + MyImage -> MyImage + + Image with type MyImage +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Applying fisheye filter to the image + +

    +
    +
    +
    +
    + + kernel + + : + ClProgram<Range1D, (ClArray<byte> -> int -> int -> ClArray<byte> -> unit)> +
    +
    +

    + Compiled kernel for fisheye filter application +

    +
    +
    + + clContext + + : + ClContext +
    +
    +

    + Abstraction over OpenCL context +

    +
    +
    + + localWorkSize + + : + int +
    +
    +

    + Local workgroup size +

    +
    +
    + + queue + + : + MailboxProcessor<Msg> +
    +
    +

    + Command queue capable of handling messages of type Msg +

    +
    +
    +
    +
    + + Returns: + + MyImage -> MyImage +
    +
    +

    + Image with type MyImage +

    +
    +
    +
    +
    +
    + +

    + + + mirror side kernel clContext localWorkSize queue + + +

    +
    +
    +
    + Full Usage: + mirror side kernel clContext localWorkSize queue +
    +
    + Parameters: +
      + + + side + + : + MirrorDirection + - + The side to which the image will be reflected + +
      + + + kernel + + : + ClProgram<Range1D, (ClArray<byte> -> int -> int -> int -> ClArray<byte> -> unit)> + - + Compiled kernel for reflection application + +
      + + + clContext + + : + ClContext + - + Abstraction over OpenCL context + +
      + + + localWorkSize + + : + int + - + Local workgroup size + +
      + + + queue + + : + MailboxProcessor<Msg> + - + Command queue capable of handling messages of type Msg + +
      +
    +
    + + Returns: + MyImage -> MyImage + + Image with type MyImage +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Reflection of image + +

    +
    +
    +
    +
    + + side + + : + MirrorDirection +
    +
    +

    + The side to which the image will be reflected +

    +
    +
    + + kernel + + : + ClProgram<Range1D, (ClArray<byte> -> int -> int -> int -> ClArray<byte> -> unit)> +
    +
    +

    + Compiled kernel for reflection application +

    +
    +
    + + clContext + + : + ClContext +
    +
    +

    + Abstraction over OpenCL context +

    +
    +
    + + localWorkSize + + : + int +
    +
    +

    + Local workgroup size +

    +
    +
    + + queue + + : + MailboxProcessor<Msg> +
    +
    +

    + Command queue capable of handling messages of type Msg +

    +
    +
    +
    +
    + + Returns: + + MyImage -> MyImage +
    +
    +

    + Image with type MyImage +

    +
    +
    +
    +
    +
    + +

    + + + rotate side kernel clContext localWorkSize queue + + +

    +
    +
    +
    + Full Usage: + rotate side kernel clContext localWorkSize queue +
    +
    + Parameters: +
      + + + side + + : + Side + - + The side to which the image will be rotated + +
      + + + kernel + + : + ClProgram<Range1D, (ClArray<byte> -> int -> int -> int -> ClArray<byte> -> unit)> + - + Compiled kernel for rotation application + +
      + + + clContext + + : + ClContext + - + Abstraction over OpenCL context + +
      + + + localWorkSize + + : + int + - + Local workgroup size + +
      + + + queue + + : + MailboxProcessor<Msg> + - + Command queue capable of handling messages of type Msg + +
      +
    +
    + + Returns: + MyImage -> MyImage + + Image with type MyImage +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Rotate of image + +

    +
    +
    +
    +
    + + side + + : + Side +
    +
    +

    + The side to which the image will be rotated +

    +
    +
    + + kernel + + : + ClProgram<Range1D, (ClArray<byte> -> int -> int -> int -> ClArray<byte> -> unit)> +
    +
    +

    + Compiled kernel for rotation application +

    +
    +
    + + clContext + + : + ClContext +
    +
    +

    + Abstraction over OpenCL context +

    +
    +
    + + localWorkSize + + : + int +
    +
    +

    + Local workgroup size +

    +
    +
    + + queue + + : + MailboxProcessor<Msg> +
    +
    +

    + Command queue capable of handling messages of type Msg +

    +
    +
    +
    +
    + + Returns: + + MyImage -> MyImage +
    +
    +

    + Image with type MyImage +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/imageprocessing-imagearrayprocessing.html b/docs/reference/imageprocessing-imagearrayprocessing.html new file mode 100644 index 00000000..5e0390bb --- /dev/null +++ b/docs/reference/imageprocessing-imagearrayprocessing.html @@ -0,0 +1,496 @@ + + + + + + ImageArrayProcessing (ImageProcessing) + + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    + ImageArrayProcessing Module +

    + +
    +
    +

    + + Module with implementation of processing array of images + +

    +
    +
    +
    +

    + Functions and values +

    + + + + + + + + + + + + + + + + + + + + + +
    + Function or value + + Description +
    +
    + +

    + + + arrayOfImagesProcessing inputDir outputDir conversion agentMod + + +

    +
    +
    +
    + Full Usage: + arrayOfImagesProcessing inputDir outputDir conversion agentMod +
    +
    + Parameters: +
      + + + inputDir + + : + string + - + Path to the folder with images + +
      + + + outputDir + + : + string + - + Path to save + +
      + + + conversion + + : + MyImage -> MyImage + - + Image transformation + +
      + + + agentMod + + : + AgentStatus + - + Processing with or without agent assistance + +
      +
    +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Processing array of images + +

    +
    +
    +
    +
    + + inputDir + + : + string +
    +
    +

    + Path to the folder with images +

    +
    +
    + + outputDir + + : + string +
    +
    +

    + Path to save +

    +
    +
    + + conversion + + : + MyImage -> MyImage +
    +
    +

    + Image transformation +

    +
    +
    + + agentMod + + : + AgentStatus +
    +
    +

    + Processing with or without agent assistance +

    +
    +
    +
    +
    +
    + +

    + + + extensions + + +

    +
    +
    +
    + Full Usage: + extensions +
    +
    + + Returns: + string[] + +
    +
    +
    +
    +
    +
    +
    + + Returns: + + string[] +
    +
    +
    +
    +
    + +

    + + + listAllFiles dir + + +

    +
    +
    +
    + Full Usage: + listAllFiles dir +
    +
    + Parameters: +
      + + + dir + + : + string + +
      +
    +
    + + Returns: + string list + +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + List of all files in directory with correct extensions + +

    +
    +
    +
    +
    + + dir + + : + string +
    +
    +
    +
    +
    + + Returns: + + string list +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/imageprocessing-kernels.html b/docs/reference/imageprocessing-kernels.html new file mode 100644 index 00000000..277ac806 --- /dev/null +++ b/docs/reference/imageprocessing-kernels.html @@ -0,0 +1,426 @@ + + + + + + Kernels (ImageProcessing) + + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    + Kernels Module +

    + +
    +
    +

    + + Module with kernels for image processing + +

    +
    +
    +
    +

    + Functions and values +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Function or value + + Description +
    +
    + +

    + + + edgesKernel + + +

    +
    +
    +
    + Full Usage: + edgesKernel +
    +
    + + Returns: + float32[][] + +
    +
    +
    +
    +
    +
    +
    + + Returns: + + float32[][] +
    +
    +
    +
    +
    + +

    + + + embossKernel + + +

    +
    +
    +
    + Full Usage: + embossKernel +
    +
    + + Returns: + float32[][] + +
    +
    +
    +
    +
    +
    +
    + + Returns: + + float32[][] +
    +
    +
    +
    +
    + +

    + + + gaussianBlur7x7Kernel + + +

    +
    +
    +
    + Full Usage: + gaussianBlur7x7Kernel +
    +
    + + Returns: + float32[][] + +
    +
    +
    +
    +
    +
    +
    + + Returns: + + float32[][] +
    +
    +
    +
    +
    + +

    + + + gaussianBlurKernel + + +

    +
    +
    +
    + Full Usage: + gaussianBlurKernel +
    +
    + + Returns: + float32[][] + +
    +
    +
    +
    +
    +
    +
    + + Returns: + + float32[][] +
    +
    +
    +
    +
    + +

    + + + sharpenKernel + + +

    +
    +
    +
    + Full Usage: + sharpenKernel +
    +
    + + Returns: + float32[][] + +
    +
    +
    +
    +
    +
    +
    + + Returns: + + float32[][] +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/imageprocessing-main.html b/docs/reference/imageprocessing-main.html new file mode 100644 index 00000000..89dd5a9e --- /dev/null +++ b/docs/reference/imageprocessing-main.html @@ -0,0 +1,292 @@ + + + + + + Main (ImageProcessing) + + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    + Main Module +

    + +
    +
    +

    + + Module for processing console commands + +

    +
    +
    +
    +

    + Functions and values +

    + + + + + + + + + + + + + +
    + Function or value + + Description +
    +
    + +

    + + + main argv + + +

    +
    +
    +
    + Full Usage: + main argv +
    +
    + Parameters: +
      + + + argv + + : + string[] + +
      +
    +
    + + Returns: + int + +
    +
    +
    +
    +
    +
    +
    + + argv + + : + string[] +
    +
    +
    +
    +
    + + Returns: + + int +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/imageprocessing-myimage-myimage.html b/docs/reference/imageprocessing-myimage-myimage.html new file mode 100644 index 00000000..8b36f741 --- /dev/null +++ b/docs/reference/imageprocessing-myimage-myimage.html @@ -0,0 +1,539 @@ + + + + + + MyImage (ImageProcessing) + + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    + MyImage Type +

    + +
    +
    +

    + + Type to represent images + +

    +
    +
    +
    +
    +
    +
    +
    +

    + Record fields +

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Record Field + + Description +
    +
    + +

    + + + Data + + +

    +
    +
    +
    + Full Usage: + Data +
    +
    + + Field type: + byte array + +
    +
    +
    +
    +
    +
    +
    + + Field type: + + byte array +
    +
    +
    +
    +
    + +

    + + + Height + + +

    +
    +
    +
    + Full Usage: + Height +
    +
    + + Field type: + int + +
    +
    +
    +
    +
    +
    +
    + + Field type: + + int +
    +
    +
    +
    +
    + +

    + + + Name + + +

    +
    +
    +
    + Full Usage: + Name +
    +
    + + Field type: + string + +
    +
    +
    +
    +
    +
    +
    + + Field type: + + string +
    +
    +
    +
    +
    + +

    + + + Width + + +

    +
    +
    +
    + Full Usage: + Width +
    +
    + + Field type: + int + +
    +
    +
    +
    +
    +
    +
    + + Field type: + + int +
    +
    +
    +
    +
    +
    +
    +

    + Constructors +

    + + + + + + + + + + + + + +
    + Constructor + + Description +
    +
    + +

    + + + MyImage(data, width, height, name) + + +

    +
    +
    +
    + Full Usage: + MyImage(data, width, height, name) +
    +
    + Parameters: +
      + + + data + + : + byte array + +
      + + + width + + : + int + +
      + + + height + + : + int + +
      + + + name + + : + string + +
      +
    +
    + + Returns: + MyImage + +
    +
    +
    +
    +
    +
    +
    + + data + + : + byte array +
    +
    +
    + + width + + : + int +
    +
    +
    + + height + + : + int +
    +
    +
    + + name + + : + string +
    +
    +
    +
    +
    + + Returns: + + MyImage +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/imageprocessing-myimage.html b/docs/reference/imageprocessing-myimage.html new file mode 100644 index 00000000..705683ff --- /dev/null +++ b/docs/reference/imageprocessing-myimage.html @@ -0,0 +1,452 @@ + + + + + + MyImage (ImageProcessing) + + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    + MyImage Module +

    + +
    +
    +

    + + Module for working with images + +

    +
    +
    +
    +

    + Types +

    + + + + + + + + + + + + + +
    + Type + + Description +
    +

    + + + MyImage + + +

    +
    +
    + + + + + + +

    + + Type to represent images + +

    +
    +
    +
    +
    +

    + Functions and values +

    + + + + + + + + + + + + + + + + + +
    + Function or value + + Description +
    +
    + +

    + + + loadAsImage file + + +

    +
    +
    +
    + Full Usage: + loadAsImage file +
    +
    + Parameters: +
      + + + file + + : + string + +
      +
    +
    + + Returns: + MyImage + +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Load image as MyImage type + +

    +
    +
    +
    +
    + + file + + : + string +
    +
    +
    +
    +
    + + Returns: + + MyImage +
    +
    +
    +
    +
    +
    + +

    + + + saveImage image file + + +

    +
    +
    +
    + Full Usage: + saveImage image file +
    +
    + Parameters: +
      + + + image + + : + MyImage + +
      + + + file + + : + string + +
      +
    +
    +
    +
    +
    +
    +
    + +
    + + + + + + +

    + + Save MyImage in a specific directory + +

    +
    +
    +
    +
    + + image + + : + MyImage +
    +
    +
    + + file + + : + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/imageprocessing-types-agentstatus.html b/docs/reference/imageprocessing-types-agentstatus.html new file mode 100644 index 00000000..99655c86 --- /dev/null +++ b/docs/reference/imageprocessing-types-agentstatus.html @@ -0,0 +1,321 @@ + + + + + + AgentStatus (ImageProcessing) + + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    + AgentStatus Type +

    + +
    +
    +

    + + Type for determining the status of an agent + +

    +
    +
    +
    +
    +
    +
    +

    + Union cases +

    + + + + + + + + + + + + + + + + + +
    + Union case + + Description +
    +
    + +

    + + + Off + + +

    +
    +
    +
    + Full Usage: + Off +
    +
    +
    +
    +
    +
    +
    + + + + +

    + +

    +
    +
    +
    + +

    + + + On + + +

    +
    +
    +
    + Full Usage: + On +
    +
    +
    +
    +
    +
    +
    + + + + +

    + +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/imageprocessing-types-devices.html b/docs/reference/imageprocessing-types-devices.html new file mode 100644 index 00000000..5b6be7dc --- /dev/null +++ b/docs/reference/imageprocessing-types-devices.html @@ -0,0 +1,389 @@ + + + + + + Devices (ImageProcessing) + + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    + Devices Type +

    + +
    +
    +

    + + Type for defining the executor of transformations + +

    +
    +
    +
    +
    +
    +
    +

    + Union cases +

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Union case + + Description +
    +
    + +

    + + + Amd + + +

    +
    +
    +
    + Full Usage: + Amd +
    +
    +
    +
    +
    +
    +
    + + + + +

    + +

    +
    +
    +
    + +

    + + + AnyGpu + + +

    +
    +
    +
    + Full Usage: + AnyGpu +
    +
    +
    +
    +
    +
    +
    + + + + +

    + +

    +
    +
    +
    + +

    + + + Intel + + +

    +
    +
    +
    + Full Usage: + Intel +
    +
    +
    +
    +
    +
    +
    + + + + +

    + +

    +
    +
    +
    + +

    + + + Nvidia + + +

    +
    +
    +
    + Full Usage: + Nvidia +
    +
    +
    +
    +
    +
    +
    + + + + +

    + +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/imageprocessing-types-mirrordirection.html b/docs/reference/imageprocessing-types-mirrordirection.html new file mode 100644 index 00000000..751fdeab --- /dev/null +++ b/docs/reference/imageprocessing-types-mirrordirection.html @@ -0,0 +1,321 @@ + + + + + + MirrorDirection (ImageProcessing) + + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    + MirrorDirection Type +

    + +
    +
    +

    + + Type for determining the direction of image reflection + +

    +
    +
    +
    +
    +
    +
    +

    + Union cases +

    + + + + + + + + + + + + + + + + + +
    + Union case + + Description +
    +
    + +

    + + + Horizontal + + +

    +
    +
    +
    + Full Usage: + Horizontal +
    +
    +
    +
    +
    +
    +
    + + + + +

    + +

    +
    +
    +
    + +

    + + + Vertical + + +

    +
    +
    +
    + Full Usage: + Vertical +
    +
    +
    +
    +
    +
    +
    + + + + +

    + +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/imageprocessing-types-modifications.html b/docs/reference/imageprocessing-types-modifications.html new file mode 100644 index 00000000..61e7faa1 --- /dev/null +++ b/docs/reference/imageprocessing-types-modifications.html @@ -0,0 +1,593 @@ + + + + + + Modifications (ImageProcessing) + + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    + Modifications Type +

    + +
    +
    +

    + + Type for determining the applied image transformation + +

    +
    +
    +
    +
    +
    +
    +

    + Union cases +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Union case + + Description +
    +
    + +

    + + + ClockwiseRotation + + +

    +
    +
    +
    + Full Usage: + ClockwiseRotation +
    +
    +
    +
    +
    +
    +
    + + + + +

    + +

    +
    +
    +
    + +

    + + + CounterClockwiseRotation + + +

    +
    +
    +
    + Full Usage: + CounterClockwiseRotation +
    +
    +
    +
    +
    +
    +
    + + + + +

    + +

    +
    +
    +
    + +

    + + + Edges + + +

    +
    +
    +
    + Full Usage: + Edges +
    +
    +
    +
    +
    +
    +
    + + + + +

    + +

    +
    +
    +
    + +

    + + + Emboss + + +

    +
    +
    +
    + Full Usage: + Emboss +
    +
    +
    +
    +
    +
    +
    + + + + +

    + +

    +
    +
    +
    + +

    + + + FishEye + + +

    +
    +
    +
    + Full Usage: + FishEye +
    +
    +
    +
    +
    +
    +
    + + + + +

    + +

    +
    +
    +
    + +

    + + + Gauss5x5 + + +

    +
    +
    +
    + Full Usage: + Gauss5x5 +
    +
    +
    +
    +
    +
    +
    + + + + +

    + +

    +
    +
    +
    + +

    + + + Gauss7x7 + + +

    +
    +
    +
    + Full Usage: + Gauss7x7 +
    +
    +
    +
    +
    +
    +
    + + + + +

    + +

    +
    +
    +
    + +

    + + + MirrorHorizontal + + +

    +
    +
    +
    + Full Usage: + MirrorHorizontal +
    +
    +
    +
    +
    +
    +
    + + + + +

    + +

    +
    +
    +
    + +

    + + + MirrorVertical + + +

    +
    +
    +
    + Full Usage: + MirrorVertical +
    +
    +
    +
    +
    +
    +
    + + + + +

    + +

    +
    +
    +
    + +

    + + + Sharpen + + +

    +
    +
    +
    + Full Usage: + Sharpen +
    +
    +
    +
    +
    +
    +
    + + + + +

    + +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/imageprocessing-types-msg.html b/docs/reference/imageprocessing-types-msg.html new file mode 100644 index 00000000..2e906132 --- /dev/null +++ b/docs/reference/imageprocessing-types-msg.html @@ -0,0 +1,435 @@ + + + + + + Msg (ImageProcessing) + + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    + Msg Type +

    + +
    +
    +

    + + Type to define a message to be forwarded between agents + +

    +
    +
    +
    +
    +
    +
    +

    + Union cases +

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Union case + + Description +
    +
    + +

    + + + EOS AsyncReplyChannel<unit> + + +

    +
    +
    +
    + Full Usage: + EOS AsyncReplyChannel<unit> +
    +
    + Parameters: + +
    +
    +
    +
    +
    +
    +
    + + Item + + : + AsyncReplyChannel<unit> +
    +
    +
    +
    +
    + +

    + + + Img MyImage + + +

    +
    +
    +
    + Full Usage: + Img MyImage +
    +
    + Parameters: + +
    +
    +
    +
    +
    +
    +
    + + Item + + : + MyImage +
    +
    +
    +
    +
    + +

    + + + Message string + + +

    +
    +
    +
    + Full Usage: + Message string +
    +
    + Parameters: +
      + + + Item + + : + string + +
      +
    +
    +
    +
    +
    +
    +
    +
    + + Item + + : + string +
    +
    +
    +
    +
    + +

    + + + Path string + + +

    +
    +
    +
    + Full Usage: + Path string +
    +
    + Parameters: +
      + + + Item + + : + string + +
      +
    +
    +
    +
    +
    +
    +
    +
    + + Item + + : + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/imageprocessing-types-side.html b/docs/reference/imageprocessing-types-side.html new file mode 100644 index 00000000..0e2287a5 --- /dev/null +++ b/docs/reference/imageprocessing-types-side.html @@ -0,0 +1,321 @@ + + + + + + Side (ImageProcessing) + + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    + Side Type +

    + +
    +
    +

    + + Type for determining the rotation side of the image + +

    +
    +
    +
    +
    +
    +
    +

    + Union cases +

    + + + + + + + + + + + + + + + + + +
    + Union case + + Description +
    +
    + +

    + + + Left + + +

    +
    +
    +
    + Full Usage: + Left +
    +
    +
    +
    +
    +
    +
    + + + + +

    + +

    +
    +
    +
    + +

    + + + Right + + +

    +
    +
    +
    + Full Usage: + Right +
    +
    +
    +
    +
    +
    +
    + + + + +

    + +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/imageprocessing-types.html b/docs/reference/imageprocessing-types.html new file mode 100644 index 00000000..427381c5 --- /dev/null +++ b/docs/reference/imageprocessing-types.html @@ -0,0 +1,415 @@ + + + + + + Types (ImageProcessing) + + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    + Types Module +

    + +
    +
    +

    + + Module with necessary algebraic types + +

    +
    +
    +
    +

    + Types +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Type + + Description +
    +

    + + + AgentStatus + + +

    +
    +
    + + + + + + +

    + + Type for determining the status of an agent + +

    +
    +
    +

    + + + Devices + + +

    +
    +
    + + + + + + +

    + + Type for defining the executor of transformations + +

    +
    +
    +

    + + + MirrorDirection + + +

    +
    +
    + + + + + + +

    + + Type for determining the direction of image reflection + +

    +
    +
    +

    + + + Modifications + + +

    +
    +
    + + + + + + +

    + + Type for determining the applied image transformation + +

    +
    +
    +

    + + + Msg + + +

    +
    +
    + + + + + + +

    + + Type to define a message to be forwarded between agents + +

    +
    +
    +

    + + + Side + + +

    +
    +
    + + + + + + +

    + + Type for determining the rotation side of the image + +

    +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/imageprocessing.html b/docs/reference/imageprocessing.html new file mode 100644 index 00000000..5087796d --- /dev/null +++ b/docs/reference/imageprocessing.html @@ -0,0 +1,519 @@ + + + + + + ImageProcessing + + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    + ImageProcessing Namespace +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Modules + + Description +
    +

    + + + Agents + + +

    +
    +
    + + + + + + +

    + + Module with implementation of agents for image processing + +

    +
    +
    +

    + + + Arguments + + +

    +
    +
    + + + + + + +

    + + Module with implementation of work via console commands + +

    +
    +
    +

    + + + CpuProcessing + + +

    +
    +
    + + + + + + +

    + + Module with functions for image processing on the CPU + +

    +
    +
    +

    + + + GpuKernels + + +

    +
    +
    + + + + + + +

    + + Module with kernels for image processing on the GPU + +

    +
    +
    +

    + + + GpuProcessing + + +

    +
    +
    + + + + + + +

    + + Module with functions for image processing on the GPU + +

    +
    +
    +

    + + + ImageArrayProcessing + + +

    +
    +
    + + + + + + +

    + + Module with implementation of processing array of images + +

    +
    +
    +

    + + + Kernels + + +

    +
    +
    + + + + + + +

    + + Module with kernels for image processing + +

    +
    +
    +

    + + + Main + + +

    +
    +
    + + + + + + +

    + + Module for processing console commands + +

    +
    +
    +

    + + + MyImage + + +

    +
    +
    + + + + + + +

    + + Module for working with images + +

    +
    +
    +

    + + + Types + + +

    +
    +
    + + + + + + +

    + + Module with necessary algebraic types + +

    +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/index.html b/docs/reference/index.html new file mode 100644 index 00000000..6e9ee8f5 --- /dev/null +++ b/docs/reference/index.html @@ -0,0 +1,209 @@ + + + + + + ImageProcessing (API Reference) + + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    + API Reference +

    +

    + Available Namespaces: +

    + + + + + + + + + + + + + +
    + Namespace + + Description +
    + + ImageProcessing + +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docsSrc/Explanations/Structure.md b/docsSrc/Explanations/Structure.md new file mode 100644 index 00000000..f427bc88 --- /dev/null +++ b/docsSrc/Explanations/Structure.md @@ -0,0 +1,10 @@ +--- +title: Structure +category: Explanations +categoryindex: 3 +index: 1 +--- + +# Structure of ImageProcessing library + +![image](https://raw.githubusercontent.com/LeonidLodygin/ImageProcessing/gh-pages/images/Structure.png) \ No newline at end of file diff --git a/docsSrc/How_Tos/Code.md b/docsSrc/How_Tos/Code.md new file mode 100644 index 00000000..eb44f748 --- /dev/null +++ b/docsSrc/How_Tos/Code.md @@ -0,0 +1,78 @@ +--- +title: How to code +category: Guides +categoryindex: 1 +index: 100 +--- + +# How to code + +In this tutorial, we will look at how to work with the ImageProcessing library using code rather than console commands. + +## Installing ImageProcessing + +```sh +> dotnet add package LeonidLodygin.ImageProcessing --version 1.0.0 +``` + + +Load your image using the `loadAsImage` function from the `MyImage` module. + +```sh +let image = loadAsImage "path to the image" +``` + +For CPU and GPU the list of transforms is identical, decide what you want to process your image on and select the appropriate function to process from the `CpuProcessing` module or the `GpuProcessing` module respectively. + +### In the case of CPU processing: + +Apply the fisheye filter to the uploaded image. + +```sh +let newImage = fishEye image +``` + +Don't forget to save the processed image using the saveImage function from the `MyImage` module! + +```sh +let newImage = saveImage "path" +``` + +### In the case of GPU processing: + +In the case of GPU processing, you have to go through a few extra steps to achieve your goal: + +Prepare OpenCl context and queue(from `Brahma.FSharp` module): + +```sh +let clContext = ClContext(ClDevice.GetFirstAppropriateDevice(device)) +let queue = clContext.QueueProvider.CreateQueue() +``` + +Compile the kernel to apply the filter using the `fishEyeKernel` function from the `GpuKernels` module: + +```sh +let fishKernel = fishEyeKernel clContext +``` + +Process the image using the `fishEye` function from the `GpuProcessing` module: + +```sh +let newImage = fishEye fishKernel clContext 64 queue image +``` + +Don't forget to save the new image: + +```sh +let newImage = saveImage "path" +``` + + diff --git a/docsSrc/Tutorials/Tutorial.md b/docsSrc/Tutorials/Tutorial.md new file mode 100644 index 00000000..ec210940 --- /dev/null +++ b/docsSrc/Tutorials/Tutorial.md @@ -0,0 +1,66 @@ +--- +title: Get Started +category: Tutorials +categoryindex: 0 +index: 100 +--- + +# Get Started + +In this tutorial we will look at how to get started with the ImageProcessing library and process your first images. + +## Installing ImageProcessing + +```sh +> dotnet add package LeonidLodygin.ImageProcessing --version 1.0.0 +``` + +## Processing of images + +### Prepare your images + +Decide on the image you want to process. You can also process several images at once, in which case specify the path to the directory with your images. + +In the command line parameter "-i" use the path to the image, for "-o" use the path where you want to save the image. + + +### Choose the desired modifications + +Decide on the modifications you want to apply to the image. Here is a complete list of available modifications: + +- Gauss5x5 +- Gauss7x7 +- Edges +- Sharpen +- Emboss +- ClockwiseRotation +- CounterClockwiseRotation +- MirrorVertical +- MirrorHorizontal +- FishEye + +Use the selected modification or modification list for the "-mod" parameter. + +### CPU or GPU processing? + +By default, all processing will be done at the expense of the CPU. If you want to process images using GPGPU, use the "-gpu" parameter (if the device has a video card): + +- AnyGpu +- Nvidia +- Amd +- Intel + +### How many logical cores does your system have? + +In the case of processing a large number of images, it would be logical to utilize the parallel processing power of your device. To do this, use the "-ag" or "-sag" parameter. The "-ag" parameter will split image processing and saving tasks into two separate computational threads. The "-sag" parameter will allocate the number of threads you need to process and save images independently. For this parameter you should specify the number of threads you need. + +### Let's start processing! + +The end result may look like the following: +```sh +> dotnet run -i *input path* -o *output path* -mod FishEye -gpu AnyGpu +``` \ No newline at end of file diff --git a/docsSrc/_menu-item_template.html b/docsSrc/_menu-item_template.html new file mode 100644 index 00000000..dc1b656a --- /dev/null +++ b/docsSrc/_menu-item_template.html @@ -0,0 +1 @@ +
  • {{fsdocs-menu-item-content}}
  • \ No newline at end of file diff --git a/docsSrc/_menu_template.html b/docsSrc/_menu_template.html new file mode 100644 index 00000000..066716c9 --- /dev/null +++ b/docsSrc/_menu_template.html @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/docsSrc/_template.html b/docsSrc/_template.html new file mode 100644 index 00000000..5d4b10f5 --- /dev/null +++ b/docsSrc/_template.html @@ -0,0 +1,146 @@ + + + + + + {{fsdocs-page-title}} + + + + + + + + + + + + + + + + {{fsdocs-watch-script}} + + + + + + +
    + {{fsdocs-content}} + {{fsdocs-tooltips}} +
    + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docsSrc/content/fsdocs-custom.css b/docsSrc/content/fsdocs-custom.css new file mode 100644 index 00000000..c2da89ad --- /dev/null +++ b/docsSrc/content/fsdocs-custom.css @@ -0,0 +1,15 @@ +.fsharp-icon-logo { + width: 25px; + margin-top: -2px; + -webkit-filter: grayscale(100%) brightness(1) invert(1); /* Safari 6.0 - 9.0 */ + filter: grayscale(100%) brightness(1) invert(1); +} + + +body .navbar .dropdown-menu .active .bi { + display: block !important; +} + +nav.navbar .dropdown-item img.fsharp-icon-logo { + margin-right: 0px; +} \ No newline at end of file diff --git a/docsSrc/content/fsdocs-dark.css b/docsSrc/content/fsdocs-dark.css new file mode 100644 index 00000000..001b6530 --- /dev/null +++ b/docsSrc/content/fsdocs-dark.css @@ -0,0 +1,50 @@ +@import url('https://raw.githubusercontent.com/tonsky/FiraCode/fixed/distr/fira_code.css'); +@import url('https://fonts.googleapis.com/css2?family=Hind+Vadodara&family=Roboto+Mono&display=swap'); +/*-------------------------------------------------------------------------- + Formatting for page & standard document content +/*--------------------------------------------------------------------------*/ + +:root { + --fsdocs-text-color:#d1d1d1; + --fsdocs-pre-border-color: #000000; + --fsdocs-pre-border-color-top: #070707; + --fsdocs-pre-background-color: #1E1E1E; + --fsdocs-pre-color: #e2e2e2; + --fsdocs-table-pre-background-color: #1d1d1d; + --fsdocs-table-pre-color: #c9c9c9; + + --fsdocs-code-strings-color: #ea9a75; + --fsdocs-code-printf-color: #E0C57F; + --fsdocs-code-escaped-color: #EA8675; + --fsdocs-code-identifiers-color: var(--fsdocs-text-color); + --fsdocs-code-module-color: #43AEC6; + --fsdocs-code-reference-color: #6a8dd8; + --fsdocs-code-value-color: #43AEC6; + --fsdocs-code-interface-color: #43AEC6; + --fsdocs-code-typearg-color: #43AEC6; + --fsdocs-code-disposable-color: #2f798a; + --fsdocs-code-property-color: #43AEC6; + --fsdocs-code-punctuation-color: #43AEC6; + --fsdocs-code-punctuation2-color: #e1e1e1; + --fsdocs-code-function-color: #e1e1e1; + --fsdocs-code-function2-color: #43AEC6; + --fsdocs-code-activepattern-color: #4ec9b0; + --fsdocs-code-unioncase-color: #4ec9b0; + --fsdocs-code-enumeration-color: #4ec9b0; + --fsdocs-code-keywords-color: #2248c4; + --fsdocs-code-comment-color: #329215; + --fsdocs-code-operators-color: #af75c1; + --fsdocs-code-numbers-color: #96C71D; + --fsdocs-code-linenumbers-color: #80b0b0; + --fsdocs-code-mutable-color: #997f0c; + --fsdocs-code-inactive-color: #808080; + --fsdocs-code-preprocessor-color: #af75c1; + --fsdocs-code-fsioutput-color: #808080; + --fsdocs-code-tooltip-color: #d1d1d1; +} + + +.fsdocs-source-link img { + -webkit-filter: grayscale(100%) brightness(1) invert(1); /* Safari 6.0 - 9.0 */ + filter: grayscale(100%) brightness(1) invert(1); +} \ No newline at end of file diff --git a/docsSrc/content/fsdocs-light.css b/docsSrc/content/fsdocs-light.css new file mode 100644 index 00000000..474512dc --- /dev/null +++ b/docsSrc/content/fsdocs-light.css @@ -0,0 +1,43 @@ +@import url('https://fonts.googleapis.com/css2?family=Hind+Vadodara&family=Roboto+Mono&display=swap'); +/*-------------------------------------------------------------------------- + Formatting for page & standard document content +/*--------------------------------------------------------------------------*/ + +:root { + --fsdocs-text-color:#262626; + --fsdocs-pre-border-color: #d8d8d8; + --fsdocs-pre-border-color-top: #e3e3e3; + --fsdocs-pre-background-color: #f3f4f7; + --fsdocs-pre-color: #8e0e2b; + --fsdocs-table-pre-background-color: #fff7ed; + --fsdocs-table-pre-color: #837b79; + + --fsdocs-code-strings-color: #dd1144; + --fsdocs-code-printf-color: #E0C57F; + --fsdocs-code-escaped-color: #EA8675; + --fsdocs-code-identifiers-color: var(--fsdocs-text-color); + --fsdocs-code-module-color: #009999; + --fsdocs-code-reference-color: #4974D1; + --fsdocs-code-value-color: #43AEC6; + --fsdocs-code-interface-color: #43AEC6; + --fsdocs-code-typearg-color: #43AEC6; + --fsdocs-code-disposable-color: #43AEC6; + --fsdocs-code-property-color: #43AEC6; + --fsdocs-code-punctuation-color: #43AEC6; + --fsdocs-code-punctuation2-color: #var(--fsdocs-text-color); + --fsdocs-code-function-color: #e1e1e1; + --fsdocs-code-function2-color: #990000; + --fsdocs-code-activepattern-color: #4ec9b0; + --fsdocs-code-unioncase-color: #4ec9b0; + --fsdocs-code-enumeration-color: #4ec9b0; + --fsdocs-code-keywords-color: #b68015; + --fsdocs-code-comment-color: #808080; + --fsdocs-code-operators-color: #af75c1; + --fsdocs-code-numbers-color: #009999; + --fsdocs-code-linenumbers-color: #80b0b0; + --fsdocs-code-mutable-color: #d1d1d1; + --fsdocs-code-inactive-color: #808080; + --fsdocs-code-preprocessor-color: #af75c1; + --fsdocs-code-fsioutput-color: #808080; + --fsdocs-code-tooltip-color: #d1d1d1; +} \ No newline at end of file diff --git a/docsSrc/content/fsdocs-main.css b/docsSrc/content/fsdocs-main.css new file mode 100644 index 00000000..a1748d2f --- /dev/null +++ b/docsSrc/content/fsdocs-main.css @@ -0,0 +1,604 @@ +@import url('https://fonts.googleapis.com/css2?family=Hind+Vadodara&family=Roboto+Mono&display=swap'); +/*-------------------------------------------------------------------------- + Formatting for page & standard document content +/*--------------------------------------------------------------------------*/ + +body { + font-family: 'Hind Vadodara', sans-serif; + /* padding-top: 0px; + padding-bottom: 40px; +*/ +} + +blockquote { + margin: 0 1em 0 0.25em; + margin-top: 0px; + margin-right: 1em; + margin-bottom: 0px; + margin-left: 0.25em; + padding: 0 .75em 0 1em; + border-left: 1px solid #777; + border-right: 0px solid #777; +} + +/* Format the heading - nicer spacing etc. */ +.masthead { + overflow: hidden; +} + + .masthead .muted a { + text-decoration: none; + color: #999999; + } + + .masthead ul, .masthead li { + margin-bottom: 0px; + } + + .masthead .nav li { + margin-top: 15px; + font-size: 110%; + } + + .masthead h3 { + margin-top: 15px; + margin-bottom: 5px; + font-size: 170%; + } + +/*-------------------------------------------------------------------------- + Formatting fsdocs-content +/*--------------------------------------------------------------------------*/ + +/* Change font sizes for headings etc. */ +#fsdocs-content h1 { + margin: 30px 0px 15px 0px; + /* font-weight: 400; */ + font-size: 2rem; + letter-spacing: 1.78px; + line-height: 2.5rem; + font-weight: 400; +} + +#fsdocs-content h2 { + font-size: 1.6rem; + margin: 20px 0px 10px 0px; + font-weight: 400; +} + +#fsdocs-content h3 { + font-size: 1.2rem; + margin: 15px 0px 10px 0px; + font-weight: 400; +} + +#fsdocs-content hr { + margin: 0px 0px 20px 0px; +} + +#fsdocs-content li { + font-size: 1.0rem; + line-height: 1.375rem; + letter-spacing: 0.01px; + font-weight: 500; + margin: 0px 0px 15px 0px; +} + +#fsdocs-content p { + font-size: 1.0rem; + line-height: 1.375rem; + letter-spacing: 0.01px; + font-weight: 500; + color: var(--fsdocs-text-color);; +} + +#fsdocs-content a:not(.btn) { + color: #4974D1; +} +/* remove the default bootstrap bold on dt elements */ +#fsdocs-content dt { + font-weight: normal; +} + + + +/*-------------------------------------------------------------------------- + Formatting tables in fsdocs-content, using learn.microsoft.com tables +/*--------------------------------------------------------------------------*/ + +#fsdocs-content .table { + table-layout: auto; + width: 100%; + font-size: 0.875rem; +} + + #fsdocs-content .table caption { + font-size: 0.8rem; + font-weight: 600; + letter-spacing: 2px; + text-transform: uppercase; + padding: 1.125rem; + border-width: 0 0 1px; + border-style: solid; + border-color: #e3e3e3; + text-align: right; + } + + #fsdocs-content .table td, + #fsdocs-content .table th { + display: table-cell; + word-wrap: break-word; + padding: 0.75rem 1rem 0.75rem 0rem; + line-height: 1.5; + vertical-align: top; + border-top: 1px solid #e3e3e3; + border-right: 0; + border-left: 0; + border-bottom: 0; + border-style: solid; + } + + /* suppress the top line on inner lists such as tables of exceptions */ + #fsdocs-content .table .fsdocs-exception-list td, + #fsdocs-content .table .fsdocs-exception-list th { + border-top: 0 + } + + #fsdocs-content .table td p:first-child, + #fsdocs-content .table th p:first-child { + margin-top: 0; + } + + #fsdocs-content .table td.nowrap, + #fsdocs-content .table th.nowrap { + white-space: nowrap; + } + + #fsdocs-content .table td.is-narrow, + #fsdocs-content .table th.is-narrow { + width: 15%; + } + + #fsdocs-content .table th:not([scope='row']) { + border-top: 0; + border-bottom: 1px; + } + + #fsdocs-content .table > caption + thead > tr:first-child > td, + #fsdocs-content .table > colgroup + thead > tr:first-child > td, + #fsdocs-content .table > thead:first-child > tr:first-child > td { + border-top: 0; + } + + #fsdocs-content .table table-striped > tbody > tr:nth-of-type(odd) { + background-color: var(--box-shadow-light); + } + + #fsdocs-content .table.min { + width: unset; + } + + #fsdocs-content .table.is-left-aligned td:first-child, + #fsdocs-content .table.is-left-aligned th:first-child { + padding-left: 0; + } + + #fsdocs-content .table.is-left-aligned td:first-child a, + #fsdocs-content .table.is-left-aligned th:first-child a { + outline-offset: -0.125rem; + } + +@media screen and (max-width: 767px), screen and (min-resolution: 120dpi) and (max-width: 767.9px) { + #fsdocs-content .table.is-stacked-mobile td:nth-child(1) { + display: block; + width: 100%; + padding: 1rem 0; + } + + #fsdocs-content .table.is-stacked-mobile td:not(:nth-child(1)) { + display: block; + border-width: 0; + padding: 0 0 1rem; + } +} + +#fsdocs-content .table.has-inner-borders th, +#fsdocs-content .table.has-inner-borders td { + border-right: 1px solid #e3e3e3; +} + + #fsdocs-content .table.has-inner-borders th:last-child, + #fsdocs-content .table.has-inner-borders td:last-child { + border-right: none; + } + +.fsdocs-entity-list .fsdocs-entity-name { + width: 25%; + font-weight: bold; +} + +.fsdocs-member-list .fsdocs-member-usage { + width: 35%; +} + +/*-------------------------------------------------------------------------- + Formatting xmldoc sections in fsdocs-content +/*--------------------------------------------------------------------------*/ + +.fsdocs-xmldoc, .fsdocs-entity-xmldoc, .fsdocs-member-xmldoc { + font-size: 1.0rem; + line-height: 1.375rem; + letter-spacing: 0.01px; + font-weight: 500; + color: var(--fsdocs-text-color);; +} + +.fsdocs-xmldoc h1 { + font-size: 1.2rem; + margin: 10px 0px 0px 0px; +} + +.fsdocs-xmldoc h2 { + font-size: 1.2rem; + margin: 10px 0px 0px 0px; +} + +.fsdocs-xmldoc h3 { + font-size: 1.1rem; + margin: 10px 0px 0px 0px; +} + +/* #fsdocs-nav .searchbox { + margin-top: 30px; + margin-bottom: 30px; +} */ + +#fsdocs-nav img.logo{ + width:90%; + /* height:140px; */ + /* margin:10px 0px 0px 20px; */ + margin-top:40px; + border-style:none; +} + +#fsdocs-nav input{ + /* margin-left: 20px; */ + margin-right: 20px; + margin-top: 20px; + margin-bottom: 20px; + width: 93%; + -webkit-border-radius: 0; + border-radius: 0; +} + +#fsdocs-nav { + /* margin-left: -5px; */ + /* width: 90%; */ + font-size:0.95rem; +} + +#fsdocs-nav li.nav-header{ + /* margin-left: -5px; */ + /* width: 90%; */ + padding-left: 0; + color: var(--fsdocs-text-color);; + text-transform: none; + font-size:16px; + margin-top: 9px; + font-weight: bold; +} + +#fsdocs-nav a{ + padding-left: 0; + color: #6c6c6d; + /* margin-left: 5px; */ + /* width: 90%; */ +} + +/*-------------------------------------------------------------------------- + Formatting pre and code sections in fsdocs-content (code highlighting is + further below) +/*--------------------------------------------------------------------------*/ + +#fsdocs-content code { + /* font-size: 0.83rem; */ + font: 0.85rem 'Roboto Mono', monospace; + background-color: #f7f7f900; + border: 0px; + padding: 0px; + /* word-wrap: break-word; */ + /* white-space: pre; */ +} + +/* omitted */ +#fsdocs-content span.omitted { + background: #3c4e52; + border-radius: 5px; + color: #808080; + padding: 0px 0px 1px 0px; +} + +#fsdocs-content pre .fssnip code { + font: 0.86rem 'Roboto Mono', monospace; +} + +#fsdocs-content table.pre, +#fsdocs-content pre.fssnip, +#fsdocs-content pre { + line-height: 13pt; + border: 0px solid var(--fsdocs-pre-border-color); + border-top: 0px solid var(--fsdocs-pre-border-color-top); + border-collapse: separate; + white-space: pre; + font: 0.86rem 'Roboto Mono', monospace; + width: 100%; + margin: 10px 0px 20px 0px; + background-color: var(--fsdocs-pre-background-color); + padding: 10px; + border-radius: 5px; + color: var(--fsdocs-pre-color); + max-width: none; + box-sizing: border-box; +} + +#fsdocs-content pre.fssnip code { + font: 0.86rem 'Roboto Mono', monospace; + font-weight: 600; +} + +#fsdocs-content table.pre { + background-color: var(--fsdocs-table-pre-background-color);; +} + +#fsdocs-content table.pre pre { + padding: 0px; + margin: 0px; + border-radius: 0px; + width: 100%; + background-color: var(--fsdocs-table-pre-background-color); + color: var(--fsdocs-table-pre-color); +} + +#fsdocs-content table.pre td { + padding: 0px; + white-space: normal; + margin: 0px; + width: 100%; +} + +#fsdocs-content table.pre td.lines { + width: 30px; +} + + +#fsdocs-content pre { + word-wrap: inherit; +} + +.fsdocs-example-header { + font-size: 1.0rem; + line-height: 1.375rem; + letter-spacing: 0.01px; + font-weight: 700; + color: var(--fsdocs-text-color);; +} + +/*-------------------------------------------------------------------------- + Formatting github source links +/*--------------------------------------------------------------------------*/ + +.fsdocs-source-link { + float: right; + text-decoration: none; +} + + .fsdocs-source-link img { + border-style: none; + margin-left: 10px; + width: auto; + height: 1.4em; + } + + .fsdocs-source-link .hover { + display: none; + } + + .fsdocs-source-link:hover .hover { + display: block; + } + + .fsdocs-source-link .normal { + display: block; + } + + .fsdocs-source-link:hover .normal { + display: none; + } + +/*-------------------------------------------------------------------------- + Formatting logo +/*--------------------------------------------------------------------------*/ + +#fsdocs-logo { + width:40px; + height:40px; + margin:10px 0px 0px 0px; + border-style:none; +} + +/*-------------------------------------------------------------------------- + +/*--------------------------------------------------------------------------*/ + +#fsdocs-content table.pre pre { + padding: 0px; + margin: 0px; + border: none; +} + +/*-------------------------------------------------------------------------- + Remove formatting from links +/*--------------------------------------------------------------------------*/ + +#fsdocs-content h1 a, +#fsdocs-content h1 a:hover, +#fsdocs-content h1 a:focus, +#fsdocs-content h2 a, +#fsdocs-content h2 a:hover, +#fsdocs-content h2 a:focus, +#fsdocs-content h3 a, +#fsdocs-content h3 a:hover, +#fsdocs-content h3 a:focus, +#fsdocs-content h4 a, +#fsdocs-content h4 a:hover, #fsdocs-content +#fsdocs-content h4 a:focus, +#fsdocs-content h5 a, +#fsdocs-content h5 a:hover, +#fsdocs-content h5 a:focus, +#fsdocs-content h6 a, +#fsdocs-content h6 a:hover, +#fsdocs-content h6 a:focus { + color: var(--fsdocs-text-color);; + text-decoration: none; + text-decoration-style: none; + /* outline: none */ +} + +/*-------------------------------------------------------------------------- + Formatting for F# code snippets +/*--------------------------------------------------------------------------*/ + +.fsdocs-param-name, +.fsdocs-return-name, +.fsdocs-param { + font-weight: 900; + font-size: 0.85rem; + font-family: 'Roboto Mono', monospace; +} +/* strings --- and stlyes for other string related formats */ +#fsdocs-content span.s { + color: var(--fsdocs-code-strings-color); +} +/* printf formatters */ +#fsdocs-content span.pf { + color: var(--fsdocs-code-printf-color); +} +/* escaped chars */ +#fsdocs-content span.e { + color: var(--fsdocs-code-escaped-color); +} + +/* identifiers --- and styles for more specific identifier types */ +#fsdocs-content span.id { + color: var(--fsdocs-identifiers-color);; +} +/* module */ +#fsdocs-content span.m { + color:var(--fsdocs-code-module-color); +} +/* reference type */ +#fsdocs-content span.rt { + color: var(--fsdocs-code-reference-color); +} +/* value type */ +#fsdocs-content span.vt { + color: var(--fsdocs-code-value-color); +} +/* interface */ +#fsdocs-content span.if { + color: var(--fsdocs-code-interface-color); +} +/* type argument */ +#fsdocs-content span.ta { + color: var(--fsdocs-code-typearg-color); +} +/* disposable */ +#fsdocs-content span.d { + color: var(--fsdocs-code-disposable-color); +} +/* property */ +#fsdocs-content span.prop { + color: var(--fsdocs-code-property-color); +} +/* punctuation */ +#fsdocs-content span.p { + color: var(--fsdocs-code-punctuation-color); +} +#fsdocs-content span.pn { + color: var(--fsdocs-code-punctuation2-color); +} +/* function */ +#fsdocs-content span.f { + color: var(--fsdocs-code-function-color); +} +#fsdocs-content span.fn { + color: var(--fsdocs-code-function2-color); +} +/* active pattern */ +#fsdocs-content span.pat { + color: var(--fsdocs-code-activepattern-color); +} +/* union case */ +#fsdocs-content span.u { + color: var(--fsdocs-code-unioncase-color); +} +/* enumeration */ +#fsdocs-content span.e { + color: var(--fsdocs-code-enumeration-color); +} +/* keywords */ +#fsdocs-content span.k { + color: var(--fsdocs-code-keywords-color); + /* font-weight: bold; */ +} +/* comment */ +#fsdocs-content span.c { + color: var(--fsdocs-code-comment-color); + font-weight: 400; + font-style: italic; +} +/* operators */ +#fsdocs-content span.o { + color: var(--fsdocs-code-operators-color); +} +/* numbers */ +#fsdocs-content span.n { + color: var(--fsdocs-code-numbers-color); +} +/* line number */ +#fsdocs-content span.l { + color: var(--fsdocs-code-linenumbers-color); +} +/* mutable var or ref cell */ +#fsdocs-content span.v { + color: var(--fsdocs-code-mutable-color); + font-weight: bold; +} +/* inactive code */ +#fsdocs-content span.inactive { + color: var(--fsdocs-code-inactive-color); +} +/* preprocessor */ +#fsdocs-content span.prep { + color: var(--fsdocs-code-preprocessor-color); +} +/* fsi output */ +#fsdocs-content span.fsi { + color: var(--fsdocs-code-fsioutput-color); +} + +/* tool tip */ +div.fsdocs-tip { + background: #475b5f; + border-radius: 4px; + font: 0.85rem 'Roboto Mono', monospace; + padding: 6px 8px 6px 8px; + display: none; + color: var(--fsdocs-code-tooltip-color); + pointer-events: none; +} + + div.fsdocs-tip code { + color: var(--fsdocs-code-tooltip-color); + font: 0.85rem 'Roboto Mono', monospace; + } \ No newline at end of file diff --git a/docsSrc/content/navbar-fixed-left.css b/docsSrc/content/navbar-fixed-left.css new file mode 100644 index 00000000..28e4c574 --- /dev/null +++ b/docsSrc/content/navbar-fixed-left.css @@ -0,0 +1,91 @@ +/* CSS for Bootstrap 5 Fixed Left Sidebar Navigation */ + + + +@media (min-width: 992px){ + + body { + padding-left: 300px; + padding-right: 60px; + } + + #fsdocs-logo { + width:140px; + height:140px; + margin:10px 0px 0px 0px; + border-style:none; + } + + + nav.navbar { + position: fixed; + left: 0; + width: 300px; + bottom: 0; + top: 0; + overflow-y: auto; + overflow-x: hidden; + display: block; + border-right: 1px solid #cecece; + } + + nav.navbar>.container { + flex-direction: column; + padding: 0; + } + + nav.navbar .navbar-nav { + flex-direction: column; + } + nav.navbar .navbar-collapse { + width: 100%; + } + + nav.navbar .navbar-nav { + width: 100%; + } + + nav.navbar .navbar-nav .dropdown-menu { + position: static; + display: block; + } + + nav.navbar .dropdown { + margin-bottom: 5px; + font-size: 14px; + } + + nav.navbar .dropdown-item { + white-space: normal; + font-size: 14px; + vertical-align: middle; + } + + nav.navbar .dropdown-item img { + margin-right: 5px; + } + + nav.navbar .dropdown-toggle { + cursor: default; + } + + nav.navbar .dropdown-menu { + border-radius: 0; + border-left: 0; + border-right: 0; + } + + nav.navbar .dropdown-toggle:not(#bd-theme)::after { + display: none; + } + + .dropdown-menu[data-bs-popper] { + top: auto; + left: auto; + margin-top: auto; + } + + .nav-link:focus, .nav-link:hover { + color: auto; + } +} \ No newline at end of file diff --git a/docsSrc/content/theme-toggle.js b/docsSrc/content/theme-toggle.js new file mode 100644 index 00000000..c208c082 --- /dev/null +++ b/docsSrc/content/theme-toggle.js @@ -0,0 +1,68 @@ +/*! + * Color mode toggler for Bootstrap's docs (https://getbootstrap.com/) + * Copyright 2011-2022 The Bootstrap Authors + * Licensed under the Creative Commons Attribution 3.0 Unported License. + */ + +(() => { + 'use strict' + + const storedTheme = localStorage.getItem('theme') + + const getPreferredTheme = () => { + if (storedTheme) { + return storedTheme + } + + return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' + } + + const setTheme = function (theme) { + const fsdocsTheme = document.getElementById("fsdocs-theme") + const re = /fsdocs-.*.css/ + if (theme === 'auto' && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.documentElement.setAttribute('data-bs-theme', 'dark') + fsdocsTheme.setAttribute("href", fsdocsTheme.getAttribute("href").replace(re,"fsdocs-dark.css")) + + } else { + document.documentElement.setAttribute('data-bs-theme', theme) + + fsdocsTheme.setAttribute("href", fsdocsTheme.getAttribute("href").replace(re,`fsdocs-${theme}.css`)) + } + } + + setTheme(getPreferredTheme()) + + const showActiveTheme = theme => { + const activeThemeIcon = document.getElementById('theme-icon-active') + const btnToActive = document.querySelector(`[data-bs-theme-value="${theme}"]`) + const svgOfActiveBtn = btnToActive.querySelector('i').getAttribute('class') + + document.querySelectorAll('[data-bs-theme-value]').forEach(element => { + element.classList.remove('active') + }) + + btnToActive.classList.add('active') + activeThemeIcon.setAttribute('class', svgOfActiveBtn) + } + + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => { + if (storedTheme !== 'light' || storedTheme !== 'dark') { + setTheme(getPreferredTheme()) + } + }) + + window.addEventListener('DOMContentLoaded', () => { + showActiveTheme(getPreferredTheme()) + + document.querySelectorAll('[data-bs-theme-value]') + .forEach(toggle => { + toggle.addEventListener('click', () => { + const theme = toggle.getAttribute('data-bs-theme-value') + localStorage.setItem('theme', theme) + setTheme(theme) + showActiveTheme(theme) + }) + }) + }) +})() \ No newline at end of file diff --git a/docsSrc/index.md b/docsSrc/index.md new file mode 100644 index 00000000..3e2b7291 --- /dev/null +++ b/docsSrc/index.md @@ -0,0 +1,41 @@ +## What is ImageProcessing? + +A library for image processing using GPGPU and agents for parallel computing. + +--- + +
    +
    +
    +
    +
    Tutorials
    +

    How to get started with ImageProcessing

    +
    + +
    +
    +
    +
    +
    +
    How-To Guides
    +

    Learn how to work with the ImageProcessing library directly in your code

    +
    + +
    +
    +
    +
    +
    +
    Explanations
    +

    Learn about the structure of the library

    +
    + +
    +
    +
    \ No newline at end of file diff --git a/images/Structure.png b/images/Structure.png new file mode 100644 index 00000000..b1db1e30 Binary files /dev/null and b/images/Structure.png differ diff --git a/images/example.jpg b/images/example.jpg new file mode 100644 index 00000000..c0fd8935 Binary files /dev/null and b/images/example.jpg differ diff --git a/images/processed.jpg b/images/processed.jpg new file mode 100644 index 00000000..252ca4fe Binary files /dev/null and b/images/processed.jpg differ diff --git a/src/Directory.Build.props b/src/Directory.Build.props index a841d7e5..1ea6fcf3 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -2,6 +2,7 @@ false + true true diff --git a/src/ImageProcessing/Agents.fs b/src/ImageProcessing/Agents.fs index 6979eb5a..8c56cd2f 100644 --- a/src/ImageProcessing/Agents.fs +++ b/src/ImageProcessing/Agents.fs @@ -1,14 +1,28 @@ -module Agents +/// +/// Module with implementation of agents for image processing +/// +module ImageProcessing.Agents open Types open MyImage +/// +/// List of all files in directory +/// let listAllFiles dir = let files = System.IO.Directory.GetFiles dir List.ofArray files +/// +/// Creation of path to save the image +/// let outFile (imgName: string) (outDir: string) = System.IO.Path.Combine(outDir, imgName) +/// +/// Agent for saving images +/// +/// Path to save +/// Logging Agent let imgSaver outDir (logger: MailboxProcessor<_>) = MailboxProcessor.Start(fun inbox -> @@ -26,6 +40,12 @@ let imgSaver outDir (logger: MailboxProcessor<_>) = | _ -> failwith "imgSaver received the wrong message" }) +/// +/// Agent for image processing +/// +/// Filter for application +/// Saving Agent +/// Logging Agent let imgProcessor filter (imgSaver: MailboxProcessor<_>) (logger: MailboxProcessor<_>) = MailboxProcessor.Start(fun inbox -> @@ -46,6 +66,9 @@ let imgProcessor filter (imgSaver: MailboxProcessor<_>) (logger: MailboxProcesso | _ -> failwith "imgProcessor received the wrong message" }) +/// +/// Agent for logging +/// let msgLogger () = MailboxProcessor.Start(fun inbox -> async { @@ -60,6 +83,12 @@ let msgLogger () = | _ -> failwith "msgLogger received the wrong message" }) +/// +/// Agent with the ability to process and save the image +/// +/// Path to save +/// Image transformation +/// Logging Agent let superAgent outputDir conversion (logger: MailboxProcessor<_>) = MailboxProcessor.Start(fun inbox -> @@ -80,6 +109,13 @@ let superAgent outputDir conversion (logger: MailboxProcessor<_>) = | _ -> failwith "superAgent received the wrong message" }) +/// +/// Image processing using superAgents +/// +/// Path to image or images +/// Path to save +/// Image transformation +/// Count of superAgents to processing let superImageProcessing inputDir outputDir conversion countOfAgents = let filesToProcess = listAllFiles inputDir let logger = msgLogger () diff --git a/src/ImageProcessing/Arguments.fs b/src/ImageProcessing/Arguments.fs index 711e5f3b..9906b68d 100644 --- a/src/ImageProcessing/Arguments.fs +++ b/src/ImageProcessing/Arguments.fs @@ -1,4 +1,7 @@ -module Arguments +/// +/// Module with implementation of work via console commands +/// +module ImageProcessing.Arguments open Argu open Kernels @@ -10,6 +13,9 @@ let second (_, x, _, _) = x let third (_, _, x, _) = x let fourth (_, _, _, x) = x +/// +/// Parsing of CPU modification +/// let modificationParser modification = match modification with | Gauss5x5 -> CpuProcessing.applyFilter gaussianBlurKernel @@ -23,6 +29,9 @@ let modificationParser modification = | MirrorHorizontal -> CpuProcessing.mirror Horizontal | FishEye -> CpuProcessing.fishEye +/// +/// Parsing of GPU modification +/// let modificationGpuParser modification cortege = match modification with | Gauss5x5 -> GpuProcessing.applyFilter gaussianBlurKernel (first cortege) @@ -36,6 +45,9 @@ let modificationGpuParser modification cortege = | MirrorHorizontal -> GpuProcessing.mirror Horizontal (third cortege) | FishEye -> GpuProcessing.fishEye (fourth cortege) +/// +/// Parsing of device +/// let deviceParser device = match device with | AnyGpu -> Platform.Any diff --git a/src/ImageProcessing/AssemblyInfo.fs b/src/ImageProcessing/AssemblyInfo.fs index da664d0a..eca0d1ea 100644 --- a/src/ImageProcessing/AssemblyInfo.fs +++ b/src/ImageProcessing/AssemblyInfo.fs @@ -1,39 +1,23 @@ // Auto-Generated by FAKE; do not edit namespace System - open System.Reflection [] [] -[] -[] -[] -[] -[] -[] +[] +[] +[] +[] +[] +[] do () module internal AssemblyVersionInformation = - [] - let AssemblyTitle = "ImageProcessing" - - [] - let AssemblyProduct = "ImageProcessing" - - [] - let AssemblyVersion = "0.1.0" - - [] - let AssemblyMetadata_ReleaseDate = "2017-03-17T00:00:00.0000000" - - [] - let AssemblyFileVersion = "0.1.0" - - [] - let AssemblyInformationalVersion = "0.1.0" - - [] - let AssemblyMetadata_ReleaseChannel = "release" - - [] - let AssemblyMetadata_GitHash = "b385af579477bb585016a6b5204121de4a485dac" + let [] AssemblyTitle = "ImageProcessing" + let [] AssemblyProduct = "ImageProcessing" + let [] AssemblyVersion = "1.0.0" + let [] AssemblyMetadata_ReleaseDate = "2023-12-19T00:00:00.0000000+03:00" + let [] AssemblyFileVersion = "1.0.0" + let [] AssemblyInformationalVersion = "1.0.0" + let [] AssemblyMetadata_ReleaseChannel = "release" + let [] AssemblyMetadata_GitHash = "69b0a7031c7867757fe29fa2d1117f346920fc9e" diff --git a/src/ImageProcessing/CpuProcessing.fs b/src/ImageProcessing/CpuProcessing.fs index 645847ae..c604443b 100644 --- a/src/ImageProcessing/CpuProcessing.fs +++ b/src/ImageProcessing/CpuProcessing.fs @@ -1,8 +1,17 @@ -module CpuProcessing +/// +/// Module with functions for image processing on the CPU +/// +module ImageProcessing.CpuProcessing open MyImage open Types +/// +/// Filter application +/// +/// A two-dimensional array applied to an image as a filter +/// Image with type MyImage +/// Image with type MyImage let applyFilter (filter: float32[][]) (img: MyImage) = let filterD = (Array.length filter) / 2 let filter = Array.concat filter @@ -23,6 +32,12 @@ let applyFilter (filter: float32[][]) (img: MyImage) = MyImage(Array.mapi (fun p _ -> byte (processPixel p)) img.Data, img.Width, img.Height, img.Name) +/// +/// Rotate of image +/// +/// The side to which the image will be rotated +/// Image with type MyImage +/// Image with type MyImage let rotate (side: Side) (image: MyImage) = let res = Array.zeroCreate image.Data.Length @@ -34,6 +49,12 @@ let rotate (side: Side) (image: MyImage) = MyImage(res, image.Height, image.Width, image.Name) +/// +/// Image Reflection +/// +/// The side to which the image will be reflected +/// Image with type MyImage +/// Image with type MyImage let mirror (side: MirrorDirection) (image: MyImage) = let res = Array.zeroCreate image.Data.Length @@ -45,6 +66,11 @@ let mirror (side: MirrorDirection) (image: MyImage) = MyImage(res, image.Width, image.Height, image.Name) +/// +/// Applying "FishEye" to an image +/// +/// Image with type MyImage +/// Image with type MyImage let fishEye (image: MyImage) = let distortion = 0.5 diff --git a/src/ImageProcessing/GpuKernels.fs b/src/ImageProcessing/GpuKernels.fs index a1e7d913..bf5c6e58 100644 --- a/src/ImageProcessing/GpuKernels.fs +++ b/src/ImageProcessing/GpuKernels.fs @@ -1,8 +1,14 @@ -module GpuKernels +/// +/// Module with kernels for image processing on the GPU +/// +module ImageProcessing.GpuKernels open Types open Brahma.FSharp +/// +/// Compilation of kernel to apply filter to the image +/// let applyFilterKernel (clContext: ClContext) = let kernel = @@ -30,6 +36,9 @@ let applyFilterKernel (clContext: ClContext) = clContext.Compile kernel +/// +/// Asynchronous application of the filter kernel to the image +/// let applyFilterProcessor (kernel: ClProgram -> int -> int -> ClArray -> int -> ClArray -> unit>) localWorkSize @@ -42,6 +51,9 @@ let applyFilterProcessor commandQueue.Post(Msg.CreateRunMsg<_, _> kernel) result +/// +/// Compilation of kernel to rotate the image +/// let rotateKernel (clContext: ClContext) = let kernel = @@ -59,6 +71,9 @@ let rotateKernel (clContext: ClContext) = clContext.Compile kernel +/// +/// Asynchronous application of the rotation kernel to the image +/// let rotateKernelProcessor (kernel: ClProgram -> int -> int -> int -> ClArray -> unit>) localWorkSize @@ -73,6 +88,9 @@ let rotateKernelProcessor commandQueue.Post(Msg.CreateRunMsg<_, _> kernel) result +/// +/// Compilation of kernel to reflect the image +/// let mirrorKernel (clContext: ClContext) = let kernel = @@ -90,6 +108,9 @@ let mirrorKernel (clContext: ClContext) = clContext.Compile kernel +/// +/// Asynchronous application of the reflection kernel to the image +/// let mirrorKernelProcessor (kernel: ClProgram -> int -> int -> int -> ClArray -> unit>) localWorkSize @@ -104,6 +125,9 @@ let mirrorKernelProcessor commandQueue.Post(Msg.CreateRunMsg<_, _> kernel) result +/// +/// Compilation of kernel to apply FishEye to the image +/// let fishEyeKernel (clContext: ClContext) = let kernel = @@ -135,6 +159,9 @@ let fishEyeKernel (clContext: ClContext) = clContext.Compile kernel +/// +/// Asynchronous application of the fisheye kernel to the image +/// let fishEyeKernelProcessor (kernel: ClProgram -> int -> int -> ClArray -> unit>) localWorkSize diff --git a/src/ImageProcessing/GpuProcessing.fs b/src/ImageProcessing/GpuProcessing.fs index 56212ff7..9ef00c8b 100644 --- a/src/ImageProcessing/GpuProcessing.fs +++ b/src/ImageProcessing/GpuProcessing.fs @@ -1,9 +1,22 @@ -module GpuProcessing +/// +/// Module with functions for image processing on the GPU +/// +module ImageProcessing.GpuProcessing open Brahma.FSharp open MyImage open GpuKernels +/// +/// Filter application +/// +/// A two-dimensional array applied to an image as a filter +/// Compiled kernel for filter application +/// Abstraction over OpenCL context +/// Local workgroup size +/// Command queue capable of handling messages of type Msg +/// Image with type MyImage +/// Image with type MyImage let applyFilter (filter: float32[][]) kernel (clContext: ClContext) localWorkSize (queue: MailboxProcessor) = let kernel = applyFilterProcessor kernel localWorkSize @@ -36,6 +49,16 @@ let applyFilter (filter: float32[][]) kernel (clContext: ClContext) localWorkSiz queue.Post(Msg.CreateFreeMsg output) MyImage(result, img.Width, img.Height, img.Name) +/// +/// Rotate of image +/// +/// The side to which the image will be rotated +/// Compiled kernel for rotation application +/// Abstraction over OpenCL context +/// Local workgroup size +/// Command queue capable of handling messages of type Msg +/// Image with type MyImage +/// Image with type MyImage let rotate side kernel (clContext: ClContext) localWorkSize (queue: MailboxProcessor) = let kernel = rotateKernelProcessor kernel localWorkSize @@ -61,6 +84,16 @@ let rotate side kernel (clContext: ClContext) localWorkSize (queue: MailboxProce queue.Post(Msg.CreateFreeMsg output) MyImage(result, img.Height, img.Width, img.Name) +/// +/// Reflection of image +/// +/// The side to which the image will be reflected +/// Compiled kernel for reflection application +/// Abstraction over OpenCL context +/// Local workgroup size +/// Command queue capable of handling messages of type Msg +/// Image with type MyImage +/// Image with type MyImage let mirror side kernel (clContext: ClContext) localWorkSize (queue: MailboxProcessor) = let kernel = mirrorKernelProcessor kernel localWorkSize @@ -86,6 +119,15 @@ let mirror side kernel (clContext: ClContext) localWorkSize (queue: MailboxProce queue.Post(Msg.CreateFreeMsg output) MyImage(result, img.Width, img.Height, img.Name) +/// +/// Applying fisheye filter to the image +/// +/// Compiled kernel for fisheye filter application +/// Abstraction over OpenCL context +/// Local workgroup size +/// Command queue capable of handling messages of type Msg +/// Image with type MyImage +/// Image with type MyImage let fishEye kernel (clContext: ClContext) localWorkSize (queue: MailboxProcessor) = let kernel = fishEyeKernelProcessor kernel localWorkSize diff --git a/src/ImageProcessing/ImageArrayProcessing.fs b/src/ImageProcessing/ImageArrayProcessing.fs index 8e975b66..7c267f39 100644 --- a/src/ImageProcessing/ImageArrayProcessing.fs +++ b/src/ImageProcessing/ImageArrayProcessing.fs @@ -1,4 +1,7 @@ -module ImageArrayProcessing +/// +/// Module with implementation of processing array of images +/// +module ImageProcessing.ImageArrayProcessing open MyImage open Agents @@ -16,6 +19,9 @@ let extensions = ".tga" ".tiff" |] +/// +/// List of all files in directory with correct extensions +/// let listAllFiles dir = let files = System.IO.Directory.GetFiles dir @@ -24,6 +30,13 @@ let listAllFiles dir = List.ofArray filtered +/// +/// Processing array of images +/// +/// Path to the folder with images +/// Path to save +/// Image transformation +/// Processing with or without agent assistance let arrayOfImagesProcessing inputDir outputDir conversion agentMod = let list = listAllFiles inputDir diff --git a/src/ImageProcessing/ImageProcessing.fsproj b/src/ImageProcessing/ImageProcessing.fsproj index 77922c02..d59ffc4e 100644 --- a/src/ImageProcessing/ImageProcessing.fsproj +++ b/src/ImageProcessing/ImageProcessing.fsproj @@ -2,13 +2,14 @@ net7.0 - Exe false true + LeonidLodygin.ImageProcessing + LeonidLodygin.ImageProcessing - ImageProcessing - ImageProcessing does the thing! + LeonidLodygin.ImageProcessing + Image processing using GPGPU true @@ -33,4 +34,4 @@
    - \ No newline at end of file + diff --git a/src/ImageProcessing/Kernels.fs b/src/ImageProcessing/Kernels.fs index dce9e6ac..96010df0 100644 --- a/src/ImageProcessing/Kernels.fs +++ b/src/ImageProcessing/Kernels.fs @@ -1,4 +1,7 @@ -module Kernels +/// +/// Module with kernels for image processing +/// +module ImageProcessing.Kernels let gaussianBlurKernel = [| [| 1; 4; 6; 4; 1 |] diff --git a/src/ImageProcessing/Main.fs b/src/ImageProcessing/Main.fs index 619f9138..91cc1554 100644 --- a/src/ImageProcessing/Main.fs +++ b/src/ImageProcessing/Main.fs @@ -8,6 +8,9 @@ open ImageArrayProcessing open Agents open Brahma.FSharp +/// +/// Module for processing console commands +/// module Main = [] diff --git a/src/ImageProcessing/MyImage.fs b/src/ImageProcessing/MyImage.fs index bd438dda..c6e4029f 100644 --- a/src/ImageProcessing/MyImage.fs +++ b/src/ImageProcessing/MyImage.fs @@ -1,9 +1,15 @@ -module MyImage +/// +/// Module for working with images +/// +module ImageProcessing.MyImage open System open SixLabors.ImageSharp open SixLabors.ImageSharp.PixelFormats +/// +/// Type to represent images +/// [] type MyImage = val Data: array @@ -17,6 +23,9 @@ type MyImage = Height = height Name = name } +/// +/// Load image as MyImage type +/// let loadAsImage (file: string) = let img = Image.Load file @@ -25,6 +34,9 @@ let loadAsImage (file: string) = img.CopyPixelDataTo(Span buf) MyImage(buf, img.Width, img.Height, System.IO.Path.GetFileName file) +/// +/// Save MyImage in a specific directory +/// let saveImage (image: MyImage) file = let img = Image.LoadPixelData(image.Data, image.Width, image.Height) img.Save file diff --git a/src/ImageProcessing/Types.fs b/src/ImageProcessing/Types.fs index 74162ee9..c8038a80 100644 --- a/src/ImageProcessing/Types.fs +++ b/src/ImageProcessing/Types.fs @@ -1,25 +1,43 @@ -module Types +/// +/// Module with necessary algebraic types +/// +module ImageProcessing.Types open MyImage +/// +/// Type for determining the rotation side of the image +/// type Side = | Right | Left +/// +/// Type for determining the direction of image reflection +/// type MirrorDirection = | Vertical | Horizontal +/// +/// Type to define a message to be forwarded between agents +/// type Msg = | Img of MyImage | Path of string | EOS of AsyncReplyChannel | Message of string +/// +/// Type for determining the status of an agent +/// type AgentStatus = | On | Off +/// +/// Type for determining the applied image transformation +/// type Modifications = | Gauss5x5 | Gauss7x7 @@ -32,6 +50,9 @@ type Modifications = | MirrorHorizontal | FishEye +/// +/// Type for defining the executor of transformations +/// type Devices = | AnyGpu | Nvidia diff --git a/tests/ImageProcessing.Tests/AssemblyInfo.fs b/tests/ImageProcessing.Tests/AssemblyInfo.fs index 3b1c52ac..4a916b4c 100644 --- a/tests/ImageProcessing.Tests/AssemblyInfo.fs +++ b/tests/ImageProcessing.Tests/AssemblyInfo.fs @@ -4,20 +4,20 @@ open System.Reflection [] [] -[] -[] -[] -[] +[] +[] +[] +[] [] -[] +[] do () module internal AssemblyVersionInformation = let [] AssemblyTitle = "ImageProcessing.Tests" let [] AssemblyProduct = "ImageProcessing" - let [] AssemblyVersion = "0.1.0" - let [] AssemblyMetadata_ReleaseDate = "2017-03-17T00:00:00.0000000" - let [] AssemblyFileVersion = "0.1.0" - let [] AssemblyInformationalVersion = "0.1.0" + let [] AssemblyVersion = "1.0.0" + let [] AssemblyMetadata_ReleaseDate = "2023-12-16T00:00:00.0000000+03:00" + let [] AssemblyFileVersion = "1.0.0" + let [] AssemblyInformationalVersion = "1.0.0" let [] AssemblyMetadata_ReleaseChannel = "release" - let [] AssemblyMetadata_GitHash = "b385af579477bb585016a6b5204121de4a485dac" + let [] AssemblyMetadata_GitHash = "cd6a8b053b59e4e68d00de7cee25a009fd79dabd" diff --git a/tests/ImageProcessing.Tests/CpuTests.fs b/tests/ImageProcessing.Tests/CpuTests.fs index 3535d314..3372fd88 100644 --- a/tests/ImageProcessing.Tests/CpuTests.fs +++ b/tests/ImageProcessing.Tests/CpuTests.fs @@ -1,10 +1,10 @@ namespace CpuTests open Expecto -open Arguments -open Kernels -open MyImage -open Types +open ImageProcessing.Arguments +open ImageProcessing.Kernels +open ImageProcessing.MyImage +open ImageProcessing.Types open System module SimpleTests = @@ -17,7 +17,7 @@ module SimpleTests = [ testCase "MyImage after gauss filter with CPU" <| fun _ -> let image = loadAsImage (src + "/input/test.png") - let filtered = CpuProcessing.applyFilter gaussianBlur7x7Kernel image + let filtered = ImageProcessing.CpuProcessing.applyFilter gaussianBlur7x7Kernel image Expect.notEqual image.Data @@ -27,7 +27,7 @@ module SimpleTests = <| fun _ -> let image = MyImage([| 1uy; 2uy; 3uy; 1uy; 2uy; 3uy; 1uy; 2uy; 3uy |], 3, 3, "test") - let turnedImage = image |> CpuProcessing.rotate Right + let turnedImage = image |> ImageProcessing.CpuProcessing.rotate Right let expected = [| 1uy; 1uy; 1uy; 2uy; 2uy; 2uy; 3uy; 3uy; 3uy |] @@ -38,10 +38,10 @@ module SimpleTests = let turnedImage = image - |> CpuProcessing.rotate Right - |> CpuProcessing.rotate Right - |> CpuProcessing.rotate Right - |> CpuProcessing.rotate Right + |> ImageProcessing.CpuProcessing.rotate Right + |> ImageProcessing.CpuProcessing.rotate Right + |> ImageProcessing.CpuProcessing.rotate Right + |> ImageProcessing.CpuProcessing.rotate Right Expect.equal image.Data @@ -59,8 +59,15 @@ module PropertyTests = let image = MyImage(GpuTests.SimpleTests.flat2dArray arr, Array2D.length2 arr, Array2D.length1 arr, "test") - let turnedLeft = image |> CpuProcessing.rotate Left |> CpuProcessing.rotate Left - let turnedRight = image |> CpuProcessing.rotate Right |> CpuProcessing.rotate Right + let turnedLeft = + image + |> ImageProcessing.CpuProcessing.rotate Left + |> ImageProcessing.CpuProcessing.rotate Left + + let turnedRight = + image + |> ImageProcessing.CpuProcessing.rotate Right + |> ImageProcessing.CpuProcessing.rotate Right Expect.equal turnedLeft.Data diff --git a/tests/ImageProcessing.Tests/GpuCpuComparison.fs b/tests/ImageProcessing.Tests/GpuCpuComparison.fs index 66a5b8f5..6f08626b 100644 --- a/tests/ImageProcessing.Tests/GpuCpuComparison.fs +++ b/tests/ImageProcessing.Tests/GpuCpuComparison.fs @@ -1,8 +1,8 @@ namespace GpuCpuComparison open Expecto -open Arguments -open Types +open ImageProcessing.Arguments +open ImageProcessing.Types module PropertyTests = [] diff --git a/tests/ImageProcessing.Tests/GpuTests.fs b/tests/ImageProcessing.Tests/GpuTests.fs index 400eb969..44537271 100644 --- a/tests/ImageProcessing.Tests/GpuTests.fs +++ b/tests/ImageProcessing.Tests/GpuTests.fs @@ -1,10 +1,10 @@ namespace GpuTests open Expecto -open Arguments -open Kernels -open MyImage -open Types +open ImageProcessing.Arguments +open ImageProcessing.Kernels +open ImageProcessing.MyImage +open ImageProcessing.Types open System open Brahma.FSharp @@ -12,10 +12,10 @@ module SimpleTests = let src = __SOURCE_DIRECTORY__ let context = ClContext(ClDevice.GetFirstAppropriateDevice()) let queue = context.QueueProvider.CreateQueue() - let filterKernel = GpuKernels.applyFilterKernel context - let rotateKernel = GpuKernels.rotateKernel context - let mirrorKernel = GpuKernels.mirrorKernel context - let fishKernel = GpuKernels.fishEyeKernel context + let filterKernel = ImageProcessing.GpuKernels.applyFilterKernel context + let rotateKernel = ImageProcessing.GpuKernels.rotateKernel context + let mirrorKernel = ImageProcessing.GpuKernels.mirrorKernel context + let fishKernel = ImageProcessing.GpuKernels.fishEyeKernel context let kernelsCortege = (filterKernel, rotateKernel, mirrorKernel, fishKernel) let flat2dArray arr = @@ -41,7 +41,13 @@ module SimpleTests = let image = loadAsImage (src + "/input/test.png") let filtered = - GpuProcessing.applyFilter gaussianBlur7x7Kernel filterKernel context 64 queue image + ImageProcessing.GpuProcessing.applyFilter + gaussianBlur7x7Kernel + filterKernel + context + 64 + queue + image Expect.notEqual image.Data @@ -51,7 +57,9 @@ module SimpleTests = <| fun _ -> let image = MyImage([| 1uy; 2uy; 3uy; 1uy; 2uy; 3uy; 1uy; 2uy; 3uy |], 3, 3, "test") - let turnedImage = image |> GpuProcessing.rotate Right rotateKernel context 64 queue + let turnedImage = + image + |> ImageProcessing.GpuProcessing.rotate Right rotateKernel context 64 queue let expected = [| 1uy; 1uy; 1uy; 2uy; 2uy; 2uy; 3uy; 3uy; 3uy |] @@ -62,10 +70,10 @@ module SimpleTests = let turnedImage = image - |> GpuProcessing.rotate Right rotateKernel context 64 queue - |> GpuProcessing.rotate Right rotateKernel context 64 queue - |> GpuProcessing.rotate Right rotateKernel context 64 queue - |> GpuProcessing.rotate Right rotateKernel context 64 queue + |> ImageProcessing.GpuProcessing.rotate Right rotateKernel context 64 queue + |> ImageProcessing.GpuProcessing.rotate Right rotateKernel context 64 queue + |> ImageProcessing.GpuProcessing.rotate Right rotateKernel context 64 queue + |> ImageProcessing.GpuProcessing.rotate Right rotateKernel context 64 queue Expect.equal image.Data @@ -84,13 +92,33 @@ module PropertyTests = let turnedLeft = image - |> GpuProcessing.rotate Left SimpleTests.rotateKernel SimpleTests.context 64 SimpleTests.queue - |> GpuProcessing.rotate Left SimpleTests.rotateKernel SimpleTests.context 64 SimpleTests.queue + |> ImageProcessing.GpuProcessing.rotate + Left + SimpleTests.rotateKernel + SimpleTests.context + 64 + SimpleTests.queue + |> ImageProcessing.GpuProcessing.rotate + Left + SimpleTests.rotateKernel + SimpleTests.context + 64 + SimpleTests.queue let turnedRight = image - |> GpuProcessing.rotate Right SimpleTests.rotateKernel SimpleTests.context 64 SimpleTests.queue - |> GpuProcessing.rotate Right SimpleTests.rotateKernel SimpleTests.context 64 SimpleTests.queue + |> ImageProcessing.GpuProcessing.rotate + Right + SimpleTests.rotateKernel + SimpleTests.context + 64 + SimpleTests.queue + |> ImageProcessing.GpuProcessing.rotate + Right + SimpleTests.rotateKernel + SimpleTests.context + 64 + SimpleTests.queue Expect.equal turnedLeft.Data diff --git a/tests/ImageProcessing.Tests/coverage.xml b/tests/ImageProcessing.Tests/coverage.xml index 258c6a7c..f62359e2 100644 --- a/tests/ImageProcessing.Tests/coverage.xml +++ b/tests/ImageProcessing.Tests/coverage.xml @@ -1,1256 +1,2430 @@  - + - - - C:\Users\Леонид\ImageProcessing\tests\ImageProcessing.Tests\bin\Debug\net7.0\ImageProcessing.dll - 2023-03-16T17:32:44.6323838Z + + + C:\Users\Леонид\ImageProcessing\tests\ImageProcessing.Tests\bin\Release\net7.0\ImageProcessing.dll + 2023-12-16T20:04:08.5017959Z ImageProcessing - + + + + + - + ImageProcessing.Main - - + + 100663297 + System.Void ImageProcessing.Main::main$cont@20(Argu.ParseResults`1<ImageProcessing.Arguments/CliArguments>,System.String,System.String,Microsoft.FSharp.Core.Unit) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100663298 System.Int32 ImageProcessing.Main::main(System.String[]) - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - + + - + - ImageProcessing.Main/listOfFunc@17 + ImageProcessing.Main/filters@28 - 100663299 - Microsoft.FSharp.Core.FSharpFunc`2<CpuImageProcessing/MyImage,CpuImageProcessing/MyImage> ImageProcessing.Main/listOfFunc@17::Invoke(Arguments/Modifications) + 100663300 + Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage> ImageProcessing.Main/filters@28::Invoke(ImageProcessing.Types/Modifications) - + - 100663300 - System.Void ImageProcessing.Main/listOfFunc@17::.cctor() + 100663301 + System.Void ImageProcessing.Main/filters@28::.cctor() - + + + + + + + ImageProcessing.Main/filters@37-1 + + + + 100663303 + Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage> ImageProcessing.Main/filters@37-1::Invoke(ImageProcessing.Types/Modifications) + + + + + + - ImageProcessing.Main/composition@22 + ImageProcessing.Main/filters@39-2 - 100663302 - CpuImageProcessing/MyImage ImageProcessing.Main/composition@22::Invoke(Microsoft.FSharp.Core.FSharpFunc`2<CpuImageProcessing/MyImage,CpuImageProcessing/MyImage>,Microsoft.FSharp.Core.FSharpFunc`2<CpuImageProcessing/MyImage,CpuImageProcessing/MyImage>,CpuImageProcessing/MyImage) + 100663305 + Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage> ImageProcessing.Main/filters@39-2::Invoke(ImageProcessing.Types/Modifications) - + - 100663303 - System.Void ImageProcessing.Main/composition@22::.cctor() + 100663306 + System.Void ImageProcessing.Main/filters@39-2::.cctor() + + + + + + + + + ImageProcessing.Main/composition@41 + + + + 100663308 + ImageProcessing.MyImage/MyImage ImageProcessing.Main/composition@41::Invoke(Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage>,Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage>,ImageProcessing.MyImage/MyImage) + + + + + + + 100663309 + System.Void ImageProcessing.Main/composition@41::.cctor() - + - - Arguments + + ImageProcessing.Arguments - - - 100663304 - Microsoft.FSharp.Core.FSharpFunc`2<CpuImageProcessing/MyImage,CpuImageProcessing/MyImage> Arguments::modificationParser(Arguments/Modifications) + + + 100663310 + a ImageProcessing.Arguments::first(a,b,c,d) + + + + + + + + + + 100663311 + b ImageProcessing.Arguments::second(a,b,c,d) + + + + + + + + + + 100663312 + c ImageProcessing.Arguments::third(a,b,c,d) + + + + + + + + + + 100663313 + d ImageProcessing.Arguments::fourth(a,b,c,d) + + + + + + + + + + 100663314 + Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage> ImageProcessing.Arguments::modificationParser(ImageProcessing.Types/Modifications) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100663315 + Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClContext,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Brahma.FSharp.Msg>,Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage>>>> ImageProcessing.Arguments::modificationGpuParser(ImageProcessing.Types/Modifications,Brahma.FSharp.ClProgram`2<Brahma.FSharp.Range1D,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Single>,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.Unit>>>>>>>,Brahma.FSharp.ClProgram`2<Brahma.FSharp.Range1D,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.Unit>>>>>>,Brahma.FSharp.ClProgram`2<Brahma.FSharp.Range1D,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.Unit>>>>>>,Brahma.FSharp.ClProgram`2<Brahma.FSharp.Range1D,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.Unit>>>>>) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100663316 + Brahma.FSharp.Platform ImageProcessing.Arguments::deviceParser(ImageProcessing.Types/Devices) - - - - - - - - + + + + + - - - - - - - + + + + - + + + + + 100663319 + System.Int32 ImageProcessing.Arguments::GetHashCode$cont@58(System.Collections.IEqualityComparer,ImageProcessing.Arguments/CliArguments,Microsoft.FSharp.Core.Unit) + + + + + + + 100663320 + System.Boolean ImageProcessing.Arguments::Equals$cont@58(ImageProcessing.Arguments/CliArguments,System.Object,System.Collections.IEqualityComparer,Microsoft.FSharp.Core.Unit) + + + - Arguments/modificationParser@17 + ImageProcessing.Arguments/modificationParser@21 - 100663333 - CpuImageProcessing/MyImage Arguments/modificationParser@17::Invoke(CpuImageProcessing/MyImage) + 100663322 + ImageProcessing.MyImage/MyImage ImageProcessing.Arguments/modificationParser@21::Invoke(ImageProcessing.MyImage/MyImage) + + + + + + + 100663323 + System.Void ImageProcessing.Arguments/modificationParser@21::.cctor() - + - Arguments/modificationParser@18-1 + ImageProcessing.Arguments/modificationParser@22-1 - 100663335 - CpuImageProcessing/MyImage Arguments/modificationParser@18-1::Invoke(CpuImageProcessing/MyImage) + 100663325 + ImageProcessing.MyImage/MyImage ImageProcessing.Arguments/modificationParser@22-1::Invoke(ImageProcessing.MyImage/MyImage) + + + + + + + 100663326 + System.Void ImageProcessing.Arguments/modificationParser@22-1::.cctor() - + - Arguments/modificationParser@19-2 + ImageProcessing.Arguments/modificationParser@23-2 - 100663337 - CpuImageProcessing/MyImage Arguments/modificationParser@19-2::Invoke(CpuImageProcessing/MyImage) + 100663328 + ImageProcessing.MyImage/MyImage ImageProcessing.Arguments/modificationParser@23-2::Invoke(ImageProcessing.MyImage/MyImage) + + + + + + + 100663329 + System.Void ImageProcessing.Arguments/modificationParser@23-2::.cctor() - + - Arguments/modificationParser@20-3 + ImageProcessing.Arguments/modificationParser@24-3 - 100663339 - CpuImageProcessing/MyImage Arguments/modificationParser@20-3::Invoke(CpuImageProcessing/MyImage) + 100663331 + ImageProcessing.MyImage/MyImage ImageProcessing.Arguments/modificationParser@24-3::Invoke(ImageProcessing.MyImage/MyImage) + + + + + + + 100663332 + System.Void ImageProcessing.Arguments/modificationParser@24-3::.cctor() - + - Arguments/modificationParser@21-4 + ImageProcessing.Arguments/modificationParser@25-4 - 100663341 - CpuImageProcessing/MyImage Arguments/modificationParser@21-4::Invoke(CpuImageProcessing/MyImage) + 100663334 + ImageProcessing.MyImage/MyImage ImageProcessing.Arguments/modificationParser@25-4::Invoke(ImageProcessing.MyImage/MyImage) + + + + + + + 100663335 + System.Void ImageProcessing.Arguments/modificationParser@25-4::.cctor() - + - Arguments/modificationParser@22-5 + ImageProcessing.Arguments/modificationParser@26-5 - 100663343 - CpuImageProcessing/MyImage Arguments/modificationParser@22-5::Invoke(CpuImageProcessing/MyImage) + 100663337 + ImageProcessing.MyImage/MyImage ImageProcessing.Arguments/modificationParser@26-5::Invoke(ImageProcessing.MyImage/MyImage) - + - Arguments/modificationParser@23-6 + ImageProcessing.Arguments/modificationParser@27-6 - 100663345 - CpuImageProcessing/MyImage Arguments/modificationParser@23-6::Invoke(CpuImageProcessing/MyImage) + 100663339 + ImageProcessing.MyImage/MyImage ImageProcessing.Arguments/modificationParser@27-6::Invoke(ImageProcessing.MyImage/MyImage) - + - - Arguments/CliArguments + + ImageProcessing.Arguments/modificationParser@28-7 - - - 100663365 - System.String Arguments/CliArguments::Argu.IArgParserTemplate.get_Usage() - - - - - - - - - - - - - - - + + + 100663341 + ImageProcessing.MyImage/MyImage ImageProcessing.Arguments/modificationParser@28-7::Invoke(ImageProcessing.MyImage/MyImage) + + + - - ImageArrayProcessing + + ImageProcessing.Arguments/modificationParser@29-8 - - - 100663380 - System.String[] ImageArrayProcessing::get_extensions() + + + 100663343 + ImageProcessing.MyImage/MyImage ImageProcessing.Arguments/modificationParser@29-8::Invoke(ImageProcessing.MyImage/MyImage) - - - - - 100663381 - Microsoft.FSharp.Collections.FSharpList`1<System.String> ImageArrayProcessing::listAllFiles(System.String) - - - - - - - - - - - - 100663382 - System.Void ImageArrayProcessing::arrayOfImagesProcessing(System.String,System.String,Microsoft.FSharp.Core.FSharpFunc`2<CpuImageProcessing/MyImage,CpuImageProcessing/MyImage>,Agents/AgentStatus) - - - - - - - - - - - - - - - - - - - - - + - - ImageArrayProcessing/filtered@22 + + ImageProcessing.Arguments/modificationParser@30-9 - - - 100663384 - System.Boolean ImageArrayProcessing/filtered@22::Invoke(System.String) - - - - + + + 100663345 + ImageProcessing.MyImage/MyImage ImageProcessing.Arguments/modificationParser@30-9::Invoke(ImageProcessing.MyImage/MyImage) + - + - - - 100663385 - System.Void ImageArrayProcessing/filtered@22::.cctor() + + + 100663346 + System.Void ImageProcessing.Arguments/modificationParser@30-9::.cctor() - + - ImageArrayProcessing/arrayOfImagesProcessing@36 + ImageProcessing.Arguments/modificationGpuParser@37 - - - 100663387 - Agents/Msg ImageArrayProcessing/arrayOfImagesProcessing@36::Invoke(Microsoft.FSharp.Control.FSharpAsyncReplyChannel`1<Microsoft.FSharp.Core.Unit>) - - - - - - - 100663388 - System.Void ImageArrayProcessing/arrayOfImagesProcessing@36::.cctor() + + + 100663348 + Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage> ImageProcessing.Arguments/modificationGpuParser@37::Invoke(Brahma.FSharp.ClContext,System.Int32,Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Brahma.FSharp.Msg>) - + - - ImageArrayProcessing/helper@39 + + ImageProcessing.Arguments/modificationGpuParser@38-1 - - - 100663390 - Microsoft.FSharp.Core.Unit ImageArrayProcessing/helper@39::Invoke(System.String) - - - - - + + + 100663350 + Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage> ImageProcessing.Arguments/modificationGpuParser@38-1::Invoke(Brahma.FSharp.ClContext,System.Int32,Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Brahma.FSharp.Msg>) + - + - - <StartupCode$ImageProcessing>.$ImageArrayProcessing + + ImageProcessing.Arguments/modificationGpuParser@39-2 - - - 100663391 - System.Void <StartupCode$ImageProcessing>.$ImageArrayProcessing::.cctor() - - - - + + + 100663352 + Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage> ImageProcessing.Arguments/modificationGpuParser@39-2::Invoke(Brahma.FSharp.ClContext,System.Int32,Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Brahma.FSharp.Msg>) + - + - - Agents + + ImageProcessing.Arguments/modificationGpuParser@40-3 - - - 100663392 - Microsoft.FSharp.Collections.FSharpList`1<System.String> Agents::listAllFiles(System.String) - - - - - - - - - - - 100663393 - Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Agents/Msg> Agents::imgSaver(System.String) - - - - - - - - - - 100663394 - Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Agents/Msg> Agents::imgProcessor(Microsoft.FSharp.Core.FSharpFunc`2<CpuImageProcessing/MyImage,CpuImageProcessing/MyImage>,Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Agents/Msg>) - - - - - + + + 100663354 + Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage> ImageProcessing.Arguments/modificationGpuParser@40-3::Invoke(Brahma.FSharp.ClContext,System.Int32,Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Brahma.FSharp.Msg>) + - + - - Agents/outFile@18 + + ImageProcessing.Arguments/modificationGpuParser@41-4 - - - 100663434 - System.String Agents/outFile@18::Invoke(System.String) - - - - + + + 100663356 + Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage> ImageProcessing.Arguments/modificationGpuParser@41-4::Invoke(Brahma.FSharp.ClContext,System.Int32,Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Brahma.FSharp.Msg>) + - + - - Agents/loop@25-2 + + ImageProcessing.Arguments/modificationGpuParser@42-5 - - - 100663436 - Microsoft.FSharp.Control.FSharpAsync`1<Microsoft.FSharp.Core.Unit> Agents/loop@25-2::Invoke(Agents/Msg) - - - - - - - - - - - - - - + + + 100663358 + Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage> ImageProcessing.Arguments/modificationGpuParser@42-5::Invoke(Brahma.FSharp.ClContext,System.Int32,Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Brahma.FSharp.Msg>) + + + - Agents/loop@23-3 + ImageProcessing.Arguments/modificationGpuParser@43-6 - - - 100663438 - Microsoft.FSharp.Control.AsyncReturn Agents/loop@23-3::Invoke(Microsoft.FSharp.Control.AsyncActivation`1<Microsoft.FSharp.Core.Unit>) + + + 100663360 + Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage> ImageProcessing.Arguments/modificationGpuParser@43-6::Invoke(Brahma.FSharp.ClContext,System.Int32,Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Brahma.FSharp.Msg>) - + - - Agents/loop@23-1 + + ImageProcessing.Arguments/modificationGpuParser@44-7 - - - 100663440 - Microsoft.FSharp.Control.FSharpAsync`1<Microsoft.FSharp.Core.Unit> Agents/loop@23-1::Invoke(Microsoft.FSharp.Core.Unit) - - - - + + + 100663362 + Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage> ImageProcessing.Arguments/modificationGpuParser@44-7::Invoke(Brahma.FSharp.ClContext,System.Int32,Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Brahma.FSharp.Msg>) + - + + + + + + + ImageProcessing.Arguments/modificationGpuParser@45-8 + + + + 100663364 + Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage> ImageProcessing.Arguments/modificationGpuParser@45-8::Invoke(Brahma.FSharp.ClContext,System.Int32,Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Brahma.FSharp.Msg>) + + + + + + + + + ImageProcessing.Arguments/modificationGpuParser@46-9 + + + + 100663366 + Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage> ImageProcessing.Arguments/modificationGpuParser@46-9::Invoke(Brahma.FSharp.ClContext,System.Int32,Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Brahma.FSharp.Msg>) + + + + + + + + + ImageProcessing.Arguments/CliArguments + + + + 100663390 + System.String ImageProcessing.Arguments/CliArguments::Argu.IArgParserTemplate.get_Usage() + + + + + + + + + + + + + + + + + + + + + + + + + ImageProcessing.ImageArrayProcessing + + + + 100663413 + System.String[] ImageProcessing.ImageArrayProcessing::get_extensions() + + + + + + + 100663414 + Microsoft.FSharp.Collections.FSharpList`1<System.String> ImageProcessing.ImageArrayProcessing::listAllFiles(System.String) + + + + + + + + + + + 100663415 + System.Void ImageProcessing.ImageArrayProcessing::helper@53(System.String,Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage>,System.String) + + + + + + + + + + 100663416 + System.Void ImageProcessing.ImageArrayProcessing::arrayOfImagesProcessing(System.String,System.String,Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage>,ImageProcessing.Types/AgentStatus) + + + + + + + + + + + + + + + + + + + + + + + + + + + + ImageProcessing.ImageArrayProcessing/listAllFiles@29 + + + + 100663418 + System.Boolean ImageProcessing.ImageArrayProcessing/listAllFiles@29::Invoke(System.String) + + + + + + + + + + 100663419 + System.Void ImageProcessing.ImageArrayProcessing/listAllFiles@29::.cctor() + + + + + + + + + ImageProcessing.ImageArrayProcessing/arrayOfImagesProcessing@51 + + + + 100663421 + ImageProcessing.Types/Msg ImageProcessing.ImageArrayProcessing/arrayOfImagesProcessing@51::Invoke(Microsoft.FSharp.Control.FSharpAsyncReplyChannel`1<Microsoft.FSharp.Core.Unit>) + + + + + + + 100663422 + System.Void ImageProcessing.ImageArrayProcessing/arrayOfImagesProcessing@51::.cctor() + + + + + + + + + <StartupCode$ImageProcessing>.$ImageProcessing.ImageArrayProcessing + + + + 100663423 + System.Void <StartupCode$ImageProcessing>.$ImageProcessing.ImageArrayProcessing::.cctor() + + + + + + + + + + + + ImageProcessing.Agents + + + + 100663424 + Microsoft.FSharp.Collections.FSharpList`1<System.String> ImageProcessing.Agents::listAllFiles(System.String) + + + + + + + + + + 100663425 + System.String ImageProcessing.Agents::outFile(System.String,System.String) + + + + + + + + + + 100663426 + Microsoft.FSharp.Control.FSharpMailboxProcessor`1<ImageProcessing.Types/Msg> ImageProcessing.Agents::imgSaver(System.String,Microsoft.FSharp.Control.FSharpMailboxProcessor`1<ImageProcessing.Types/Msg>) + + + + + + + + + + 100663427 + Microsoft.FSharp.Control.FSharpMailboxProcessor`1<ImageProcessing.Types/Msg> ImageProcessing.Agents::imgProcessor(Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage>,Microsoft.FSharp.Control.FSharpMailboxProcessor`1<ImageProcessing.Types/Msg>,Microsoft.FSharp.Control.FSharpMailboxProcessor`1<ImageProcessing.Types/Msg>) + + + + + + + + + + 100663428 + Microsoft.FSharp.Control.FSharpMailboxProcessor`1<ImageProcessing.Types/Msg> ImageProcessing.Agents::msgLogger() + + + + + + + + + + 100663429 + Microsoft.FSharp.Control.FSharpMailboxProcessor`1<ImageProcessing.Types/Msg> ImageProcessing.Agents::superAgent(System.String,Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage>,Microsoft.FSharp.Control.FSharpMailboxProcessor`1<ImageProcessing.Types/Msg>) + + + + + + + + + + 100663430 + System.Void ImageProcessing.Agents::superImageProcessing(System.String,System.String,Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage>,System.Int32) + + + + + + + + + + + + + + + + + + + + - Agents/loop@22 + ImageProcessing.Agents/imgSaver@30-2 - 100663442 - Microsoft.FSharp.Control.FSharpAsync`1<Microsoft.FSharp.Core.Unit> Agents/loop@22::Invoke(Microsoft.FSharp.Core.Unit) + 100663432 + System.Boolean ImageProcessing.Agents/imgSaver@30-2::Invoke(Microsoft.FSharp.Core.Unit) + + + + + + + + + + 100663433 + System.Void ImageProcessing.Agents/imgSaver@30-2::.cctor() + + + + + + + + + ImageProcessing.Agents/imgSaver@33-4 + + + + 100663435 + Microsoft.FSharp.Control.FSharpAsync`1<Microsoft.FSharp.Core.Unit> ImageProcessing.Agents/imgSaver@33-4::Invoke(ImageProcessing.Types/Msg) - + + + + + + + + + + + + + + + + + + ImageProcessing.Agents/imgSaver@31-5 + + + + 100663437 + Microsoft.FSharp.Control.AsyncReturn ImageProcessing.Agents/imgSaver@31-5::Invoke(Microsoft.FSharp.Control.AsyncActivation`1<Microsoft.FSharp.Core.Unit>) + - + - Agents/imgSaver@20 + ImageProcessing.Agents/imgSaver@31-3 - 100663444 - Microsoft.FSharp.Control.FSharpAsync`1<Microsoft.FSharp.Core.Unit> Agents/imgSaver@20::Invoke(Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Agents/Msg>) + 100663439 + Microsoft.FSharp.Control.FSharpAsync`1<Microsoft.FSharp.Core.Unit> ImageProcessing.Agents/imgSaver@31-3::Invoke(Microsoft.FSharp.Core.Unit) - + - + - Agents/loop@49-7 + ImageProcessing.Agents/imgSaver@30-1 + + + + 100663441 + Microsoft.FSharp.Control.FSharpAsync`1<Microsoft.FSharp.Core.Unit> ImageProcessing.Agents/imgSaver@30-1::Invoke(Microsoft.FSharp.Core.Unit) + + + + + + + + + ImageProcessing.Agents/imgSaver@28 + + 100663443 + Microsoft.FSharp.Control.FSharpAsync`1<Microsoft.FSharp.Core.Unit> ImageProcessing.Agents/imgSaver@28::Invoke(Microsoft.FSharp.Control.FSharpMailboxProcessor`1<ImageProcessing.Types/Msg>) + + + + + + + + + + + + ImageProcessing.Agents/imgProcessor@53-2 + + + + 100663445 + System.Boolean ImageProcessing.Agents/imgProcessor@53-2::Invoke(Microsoft.FSharp.Core.Unit) + + + + + + + + 100663446 - Agents/Msg Agents/loop@49-7::Invoke(Microsoft.FSharp.Control.FSharpAsyncReplyChannel`1<Microsoft.FSharp.Core.Unit>) + System.Void ImageProcessing.Agents/imgProcessor@53-2::.cctor() + + + + + ImageProcessing.Agents/imgProcessor@59-5 + + + + 100663448 + ImageProcessing.Types/Msg ImageProcessing.Agents/imgProcessor@59-5::Invoke(Microsoft.FSharp.Control.FSharpAsyncReplyChannel`1<Microsoft.FSharp.Core.Unit>) + + + + - 100663447 - System.Void Agents/loop@49-7::.cctor() + 100663449 + System.Void ImageProcessing.Agents/imgProcessor@59-5::.cctor() - + - - Agents/loop@46-6 + + ImageProcessing.Agents/imgProcessor@56-4 - - - 100663449 - Microsoft.FSharp.Control.FSharpAsync`1<Microsoft.FSharp.Core.Unit> Agents/loop@46-6::Invoke(Agents/Msg) + + + 100663451 + Microsoft.FSharp.Control.FSharpAsync`1<Microsoft.FSharp.Core.Unit> ImageProcessing.Agents/imgProcessor@56-4::Invoke(ImageProcessing.Types/Msg) - - - - - - - - - + + + + + + + + + - - + + + - + - Agents/loop@44-8 + ImageProcessing.Agents/imgProcessor@54-6 - 100663451 - Microsoft.FSharp.Control.AsyncReturn Agents/loop@44-8::Invoke(Microsoft.FSharp.Control.AsyncActivation`1<Microsoft.FSharp.Core.Unit>) + 100663453 + Microsoft.FSharp.Control.AsyncReturn ImageProcessing.Agents/imgProcessor@54-6::Invoke(Microsoft.FSharp.Control.AsyncActivation`1<Microsoft.FSharp.Core.Unit>) - + - Agents/loop@44-5 + ImageProcessing.Agents/imgProcessor@54-3 - 100663453 - Microsoft.FSharp.Control.FSharpAsync`1<Microsoft.FSharp.Core.Unit> Agents/loop@44-5::Invoke(Microsoft.FSharp.Core.Unit) + 100663455 + Microsoft.FSharp.Control.FSharpAsync`1<Microsoft.FSharp.Core.Unit> ImageProcessing.Agents/imgProcessor@54-3::Invoke(Microsoft.FSharp.Core.Unit) + + + + + + + + + + + + ImageProcessing.Agents/imgProcessor@53-1 + + + + 100663457 + Microsoft.FSharp.Control.FSharpAsync`1<Microsoft.FSharp.Core.Unit> ImageProcessing.Agents/imgProcessor@53-1::Invoke(Microsoft.FSharp.Core.Unit) + + + + + + + + + ImageProcessing.Agents/imgProcessor@51 + + + + 100663459 + Microsoft.FSharp.Control.FSharpAsync`1<Microsoft.FSharp.Core.Unit> ImageProcessing.Agents/imgProcessor@51::Invoke(Microsoft.FSharp.Control.FSharpMailboxProcessor`1<ImageProcessing.Types/Msg>) - + - + - Agents/loop@43-4 + ImageProcessing.Agents/msgLogger@75-2 + + + + 100663461 + System.Boolean ImageProcessing.Agents/msgLogger@75-2::Invoke(Microsoft.FSharp.Core.Unit) + + + + + + + + + + 100663462 + System.Void ImageProcessing.Agents/msgLogger@75-2::.cctor() + + + + + + + + + ImageProcessing.Agents/msgLogger@78-4 + + + + 100663464 + Microsoft.FSharp.Control.FSharpAsync`1<Microsoft.FSharp.Core.Unit> ImageProcessing.Agents/msgLogger@78-4::Invoke(ImageProcessing.Types/Msg) + + + + + + + + + + + + + + + + + + 100663465 + System.Void ImageProcessing.Agents/msgLogger@78-4::.cctor() + + + + + + + + + ImageProcessing.Agents/msgLogger@76-5 + + + + 100663467 + Microsoft.FSharp.Control.AsyncReturn ImageProcessing.Agents/msgLogger@76-5::Invoke(Microsoft.FSharp.Control.AsyncActivation`1<Microsoft.FSharp.Core.Unit>) + + + + + + + + + ImageProcessing.Agents/msgLogger@76-3 + + + + 100663469 + Microsoft.FSharp.Control.FSharpAsync`1<Microsoft.FSharp.Core.Unit> ImageProcessing.Agents/msgLogger@76-3::Invoke(Microsoft.FSharp.Core.Unit) + + + + + + + + + + + + ImageProcessing.Agents/msgLogger@75-1 + + + + 100663471 + Microsoft.FSharp.Control.FSharpAsync`1<Microsoft.FSharp.Core.Unit> ImageProcessing.Agents/msgLogger@75-1::Invoke(Microsoft.FSharp.Core.Unit) + + + + + + + + + ImageProcessing.Agents/msgLogger@73 + + + + 100663473 + Microsoft.FSharp.Control.FSharpAsync`1<Microsoft.FSharp.Core.Unit> ImageProcessing.Agents/msgLogger@73::Invoke(Microsoft.FSharp.Control.FSharpMailboxProcessor`1<ImageProcessing.Types/Msg>) + + + + + + + + + + 100663474 + System.Void ImageProcessing.Agents/msgLogger@73::.cctor() + + + + + + + + + ImageProcessing.Agents/superAgent@96-2 + + + + 100663476 + System.Boolean ImageProcessing.Agents/superAgent@96-2::Invoke(Microsoft.FSharp.Core.Unit) + + + + + + + + + + 100663477 + System.Void ImageProcessing.Agents/superAgent@96-2::.cctor() + + + + + + + + + ImageProcessing.Agents/superAgent@99-4 + + + + 100663479 + Microsoft.FSharp.Control.FSharpAsync`1<Microsoft.FSharp.Core.Unit> ImageProcessing.Agents/superAgent@99-4::Invoke(ImageProcessing.Types/Msg) + + + + + + + + + + + + + + + + + + + + + + + + ImageProcessing.Agents/superAgent@97-5 + + + + 100663481 + Microsoft.FSharp.Control.AsyncReturn ImageProcessing.Agents/superAgent@97-5::Invoke(Microsoft.FSharp.Control.AsyncActivation`1<Microsoft.FSharp.Core.Unit>) + + + + + + + + + ImageProcessing.Agents/superAgent@97-3 + + + + 100663483 + Microsoft.FSharp.Control.FSharpAsync`1<Microsoft.FSharp.Core.Unit> ImageProcessing.Agents/superAgent@97-3::Invoke(Microsoft.FSharp.Core.Unit) + + + + + + + + + + + + ImageProcessing.Agents/superAgent@96-1 + + + + 100663485 + Microsoft.FSharp.Control.FSharpAsync`1<Microsoft.FSharp.Core.Unit> ImageProcessing.Agents/superAgent@96-1::Invoke(Microsoft.FSharp.Core.Unit) + + + + + + + + + ImageProcessing.Agents/superAgent@94 + + + + 100663487 + Microsoft.FSharp.Control.FSharpAsync`1<Microsoft.FSharp.Core.Unit> ImageProcessing.Agents/superAgent@94::Invoke(Microsoft.FSharp.Control.FSharpMailboxProcessor`1<ImageProcessing.Types/Msg>) + + + + + + + + + + + + ImageProcessing.Agents/superImageProcessing@130 + + + + 100663489 + ImageProcessing.Types/Msg ImageProcessing.Agents/superImageProcessing@130::Invoke(Microsoft.FSharp.Control.FSharpAsyncReplyChannel`1<Microsoft.FSharp.Core.Unit>) + + + + + + + 100663490 + System.Void ImageProcessing.Agents/superImageProcessing@130::.cctor() + + + + + + + + + ImageProcessing.Agents/superImageProcessing@132-1 + + + + 100663492 + ImageProcessing.Types/Msg ImageProcessing.Agents/superImageProcessing@132-1::Invoke(Microsoft.FSharp.Control.FSharpAsyncReplyChannel`1<Microsoft.FSharp.Core.Unit>) + + + + + + + 100663493 + System.Void ImageProcessing.Agents/superImageProcessing@132-1::.cctor() + + + + + + + + + ImageProcessing.GpuProcessing + + + + 100663494 + Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage> ImageProcessing.GpuProcessing::applyFilter(System.Single[][],Brahma.FSharp.ClProgram`2<Brahma.FSharp.Range1D,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Single>,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.Unit>>>>>>>,Brahma.FSharp.ClContext,System.Int32,Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Brahma.FSharp.Msg>) + + + + + + + 100663495 + Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage> ImageProcessing.GpuProcessing::rotate(ImageProcessing.Types/Side,Brahma.FSharp.ClProgram`2<Brahma.FSharp.Range1D,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.Unit>>>>>>,Brahma.FSharp.ClContext,System.Int32,Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Brahma.FSharp.Msg>) + + + + + + + 100663496 + Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage> ImageProcessing.GpuProcessing::mirror(ImageProcessing.Types/MirrorDirection,Brahma.FSharp.ClProgram`2<Brahma.FSharp.Range1D,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.Unit>>>>>>,Brahma.FSharp.ClContext,System.Int32,Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Brahma.FSharp.Msg>) + + + + + + + 100663497 + Microsoft.FSharp.Core.FSharpFunc`2<ImageProcessing.MyImage/MyImage,ImageProcessing.MyImage/MyImage> ImageProcessing.GpuProcessing::fishEye(Brahma.FSharp.ClProgram`2<Brahma.FSharp.Range1D,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.Unit>>>>>,Brahma.FSharp.ClContext,System.Int32,Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Brahma.FSharp.Msg>) + + + + + + + + + ImageProcessing.GpuProcessing/kernel@21 + + + + 100663499 + Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Brahma.FSharp.ClArray`1<System.Byte>>> ImageProcessing.GpuProcessing/kernel@21::Invoke(Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Brahma.FSharp.Msg>,Brahma.FSharp.ClArray`1<System.Single>,System.Int32,Brahma.FSharp.ClArray`1<System.Byte>,System.Int32) + + + + + + + + + ImageProcessing.GpuProcessing/kernel@21D + + + + 100663501 + Brahma.FSharp.ClArray`1<System.Byte> ImageProcessing.GpuProcessing/kernel@21D::Invoke(System.Int32,Brahma.FSharp.ClArray`1<System.Byte>) + + + + + + + + + ImageProcessing.GpuProcessing/result@44 + + + + 100663503 + Brahma.FSharp.Msg ImageProcessing.GpuProcessing/result@44::Invoke(Microsoft.FSharp.Control.FSharpAsyncReplyChannel`1<System.Byte[]>) + + + + + + + + + + + + ImageProcessing.GpuProcessing/applyFilter@23-1 + + + + 100663505 + ImageProcessing.MyImage/MyImage ImageProcessing.GpuProcessing/applyFilter@23-1::Invoke(ImageProcessing.MyImage/MyImage) + + + + + + + + + + + + + + + + + + + + + + ImageProcessing.GpuProcessing/kernel@63-1 + + + + 100663507 + Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Brahma.FSharp.ClArray`1<System.Byte>> ImageProcessing.GpuProcessing/kernel@63-1::Invoke(ImageProcessing.Types/Side,Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Brahma.FSharp.Msg>,Brahma.FSharp.ClArray`1<System.Byte>,System.Int32,System.Int32) + + + + + + + + + ImageProcessing.GpuProcessing/kernel@63-1D + + + + 100663509 + Brahma.FSharp.ClArray`1<System.Byte> ImageProcessing.GpuProcessing/kernel@63-1D::Invoke(Brahma.FSharp.ClArray`1<System.Byte>) + + + + + + + + + ImageProcessing.GpuProcessing/result@80-1 + + + + 100663511 + Brahma.FSharp.Msg ImageProcessing.GpuProcessing/result@80-1::Invoke(Microsoft.FSharp.Control.FSharpAsyncReplyChannel`1<System.Byte[]>) + + + + + + + + + + + + ImageProcessing.GpuProcessing/rotate@65 + + + + 100663513 + ImageProcessing.MyImage/MyImage ImageProcessing.GpuProcessing/rotate@65::Invoke(ImageProcessing.MyImage/MyImage) + + + + + + + + + + + + + + + + + + ImageProcessing.GpuProcessing/kernel@98-2 + + + + 100663515 + Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Brahma.FSharp.ClArray`1<System.Byte>> ImageProcessing.GpuProcessing/kernel@98-2::Invoke(ImageProcessing.Types/MirrorDirection,Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Brahma.FSharp.Msg>,Brahma.FSharp.ClArray`1<System.Byte>,System.Int32,System.Int32) + + + + + + + + + ImageProcessing.GpuProcessing/kernel@98-2D + + + + 100663517 + Brahma.FSharp.ClArray`1<System.Byte> ImageProcessing.GpuProcessing/kernel@98-2D::Invoke(Brahma.FSharp.ClArray`1<System.Byte>) + + + + + + + + + ImageProcessing.GpuProcessing/result@115-2 + + + + 100663519 + Brahma.FSharp.Msg ImageProcessing.GpuProcessing/result@115-2::Invoke(Microsoft.FSharp.Control.FSharpAsyncReplyChannel`1<System.Byte[]>) + + + + + + + + + + + + ImageProcessing.GpuProcessing/mirror@100 + + + + 100663521 + ImageProcessing.MyImage/MyImage ImageProcessing.GpuProcessing/mirror@100::Invoke(ImageProcessing.MyImage/MyImage) + + + + + + + + + + + + + + + + + + ImageProcessing.GpuProcessing/kernel@132-3 + + + + 100663523 + Brahma.FSharp.ClArray`1<System.Byte> ImageProcessing.GpuProcessing/kernel@132-3::Invoke(Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Brahma.FSharp.Msg>,Brahma.FSharp.ClArray`1<System.Byte>,System.Int32,System.Int32,Brahma.FSharp.ClArray`1<System.Byte>) + + + + + + + + + ImageProcessing.GpuProcessing/result@149-3 + + + + 100663525 + Brahma.FSharp.Msg ImageProcessing.GpuProcessing/result@149-3::Invoke(Microsoft.FSharp.Control.FSharpAsyncReplyChannel`1<System.Byte[]>) + + + + + + + + + + + + ImageProcessing.GpuProcessing/fishEye@134 + + + + 100663527 + ImageProcessing.MyImage/MyImage ImageProcessing.GpuProcessing/fishEye@134::Invoke(ImageProcessing.MyImage/MyImage) + + + + + + + + + + + + + + + + + + ImageProcessing.GpuKernels + + + + 100663528 + Brahma.FSharp.ClProgram`2<Brahma.FSharp.Range1D,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Single>,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.Unit>>>>>>> ImageProcessing.GpuKernels::applyFilterKernel(Brahma.FSharp.ClContext) + + + + + + + + + + + 100663529 + Brahma.FSharp.ClArray`1<System.Byte> ImageProcessing.GpuKernels::applyFilterProcessor(Brahma.FSharp.ClProgram`2<Brahma.FSharp.Range1D,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Single>,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.Unit>>>>>>>,System.Int32,Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Brahma.FSharp.Msg>,Brahma.FSharp.ClArray`1<System.Single>,System.Int32,Brahma.FSharp.ClArray`1<System.Byte>,System.Int32,System.Int32,Brahma.FSharp.ClArray`1<System.Byte>) + + + + + + + + + + + + + + 100663530 + Brahma.FSharp.ClProgram`2<Brahma.FSharp.Range1D,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<a>,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<a>,Microsoft.FSharp.Core.Unit>>>>>> ImageProcessing.GpuKernels::rotateKernel(Brahma.FSharp.ClContext) + + + + + + + + + + + 100663531 + Brahma.FSharp.ClArray`1<System.Byte> ImageProcessing.GpuKernels::rotateKernelProcessor(Brahma.FSharp.ClProgram`2<Brahma.FSharp.Range1D,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.Unit>>>>>>,System.Int32,ImageProcessing.Types/Side,Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Brahma.FSharp.Msg>,Brahma.FSharp.ClArray`1<System.Byte>,System.Int32,System.Int32,Brahma.FSharp.ClArray`1<System.Byte>) + + + + + + + + + + + + + + + + + + + + 100663532 + Brahma.FSharp.ClProgram`2<Brahma.FSharp.Range1D,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<a>,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<a>,Microsoft.FSharp.Core.Unit>>>>>> ImageProcessing.GpuKernels::mirrorKernel(Brahma.FSharp.ClContext) + + + + + + + + + + + 100663533 + Brahma.FSharp.ClArray`1<System.Byte> ImageProcessing.GpuKernels::mirrorKernelProcessor(Brahma.FSharp.ClProgram`2<Brahma.FSharp.Range1D,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.Unit>>>>>>,System.Int32,ImageProcessing.Types/MirrorDirection,Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Brahma.FSharp.Msg>,Brahma.FSharp.ClArray`1<System.Byte>,System.Int32,System.Int32,Brahma.FSharp.ClArray`1<System.Byte>) + + + + + + + + + + + + + + + + + + + + 100663534 + Brahma.FSharp.ClProgram`2<Brahma.FSharp.Range1D,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<a>,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<a>,Microsoft.FSharp.Core.Unit>>>>> ImageProcessing.GpuKernels::fishEyeKernel(Brahma.FSharp.ClContext) + + + + + + + + + + + 100663535 + Brahma.FSharp.ClArray`1<System.Byte> ImageProcessing.GpuKernels::fishEyeKernelProcessor(Brahma.FSharp.ClProgram`2<Brahma.FSharp.Range1D,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.Int32,Microsoft.FSharp.Core.FSharpFunc`2<Brahma.FSharp.ClArray`1<System.Byte>,Microsoft.FSharp.Core.Unit>>>>>,System.Int32,Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Brahma.FSharp.Msg>,Brahma.FSharp.ClArray`1<System.Byte>,System.Int32,System.Int32,Brahma.FSharp.ClArray`1<System.Byte>) + + + + + + + + + + + + + + + + ImageProcessing.GpuKernels/applyFilterProcessor@50 + + + + 100663537 + Microsoft.FSharp.Core.Unit ImageProcessing.GpuKernels/applyFilterProcessor@50::Invoke(Microsoft.FSharp.Core.Unit) + + + + + + + + + + + + ImageProcessing.GpuKernels/rotateKernelProcessor@87 + + + + 100663539 + Microsoft.FSharp.Core.Unit ImageProcessing.GpuKernels/rotateKernelProcessor@87::Invoke(Microsoft.FSharp.Core.Unit) + + + + + + + + + + + + ImageProcessing.GpuKernels/mirrorKernelProcessor@124 - - - 100663455 - Microsoft.FSharp.Control.FSharpAsync`1<Microsoft.FSharp.Core.Unit> Agents/loop@43-4::Invoke(Microsoft.FSharp.Core.Unit) - + + + 100663541 + Microsoft.FSharp.Core.Unit ImageProcessing.GpuKernels/mirrorKernelProcessor@124::Invoke(Microsoft.FSharp.Core.Unit) + - + - + - - Agents/imgProcessor@41 + + ImageProcessing.GpuKernels/fishEyeKernelProcessor@173 - - - 100663457 - Microsoft.FSharp.Control.FSharpAsync`1<Microsoft.FSharp.Core.Unit> Agents/imgProcessor@41::Invoke(Microsoft.FSharp.Control.FSharpMailboxProcessor`1<Agents/Msg>) - + + + 100663543 + Microsoft.FSharp.Core.Unit ImageProcessing.GpuKernels/fishEyeKernelProcessor@173::Invoke(Microsoft.FSharp.Core.Unit) + - + - + - - CpuImageProcessing + + ImageProcessing.CpuProcessing - - - 100663458 - System.Byte[0...,0...] CpuImageProcessing::loadAs2DArray(System.String) - + + + 100663544 + System.Single ImageProcessing.CpuProcessing::processPixel@19(ImageProcessing.MyImage/MyImage,System.Int32,System.Single[],System.Int32) + - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + + + + + - + - - 100663459 - CpuImageProcessing/MyImage CpuImageProcessing::loadAsImage(System.String) - + + 100663545 + ImageProcessing.MyImage/MyImage ImageProcessing.CpuProcessing::applyFilter(System.Single[][],ImageProcessing.MyImage/MyImage) + - - - - + + + - + - - - 100663460 - a[] CpuImageProcessing::flat2dArray(a[0...,0...]) - + + + 100663546 + ImageProcessing.MyImage/MyImage ImageProcessing.CpuProcessing::rotate(ImageProcessing.Types/Side,ImageProcessing.MyImage/MyImage) + - - + + + + + + + - - + + + + + + + - - - 100663461 - System.Void CpuImageProcessing::save2DByteArrayAsImage(System.Byte[0...,0...],System.String) - + + + 100663547 + ImageProcessing.MyImage/MyImage ImageProcessing.CpuProcessing::mirror(ImageProcessing.Types/MirrorDirection,ImageProcessing.MyImage/MyImage) + - - - - - + + + + + + + - - + + + + + + + - - - 100663462 - System.Void CpuImageProcessing::saveImage(CpuImageProcessing/MyImage,System.String) - + + + 100663548 + System.Tuple`2<System.Double,System.Double> ImageProcessing.CpuProcessing::getFishCoordinates@77(System.Double,System.Double,System.Double) + - - + + + - - - - - - 100663463 - System.Single[][] CpuImageProcessing::get_gaussianBlurKernel() - - - - - - - 100663464 - System.Single[][] CpuImageProcessing::get_edgesKernel() - - - + + + + + - - - 100663465 - System.Single[][] CpuImageProcessing::get_gaussianBlur7x7Kernel() - - - + + + 100663549 + ImageProcessing.MyImage/MyImage ImageProcessing.CpuProcessing::fishEye(ImageProcessing.MyImage/MyImage) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - 100663466 - System.Single[][] CpuImageProcessing::get_sharpenKernel() - + + + + + ImageProcessing.CpuProcessing/processPixel@31-1 + + + + 100663551 + System.Single ImageProcessing.CpuProcessing/processPixel@31-1::Invoke(System.Single,System.Single,System.Single) + + + + - + - + - 100663467 - System.Single[][] CpuImageProcessing::get_embossKernel() + 100663552 + System.Void ImageProcessing.CpuProcessing/processPixel@31-1::.cctor() - + - - - 100663468 - System.Byte[0...,0...] CpuImageProcessing::applyFilter(System.Single[][],System.Byte[0...,0...]) - + + + + + ImageProcessing.CpuProcessing/applyFilter@33 + + + + 100663554 + System.Byte ImageProcessing.CpuProcessing/applyFilter@33::Invoke(System.Int32,System.Byte) + - - - - - + - + + + + + + ImageProcessing.MyImage + - - 100663469 - CpuImageProcessing/MyImage CpuImageProcessing::applyFilterToImage(System.Single[][],CpuImageProcessing/MyImage) - + + 100663693 + ImageProcessing.MyImage/MyImage ImageProcessing.MyImage::loadAsImage(System.String) + - - - + + + + - - - - - 100663470 - System.Byte[0...,0...] CpuImageProcessing::rotate90Degrees(CpuImageProcessing/Side,System.Byte[0...,0...]) - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - 100663471 - CpuImageProcessing/MyImage CpuImageProcessing::rotate90DegreesImage(CpuImageProcessing/Side,CpuImageProcessing/MyImage) - + + + 100663694 + System.Void ImageProcessing.MyImage::saveImage(ImageProcessing.MyImage/MyImage,System.String) + - - - - - - - + - - - - - - - - - - - 100663472 - System.Void CpuImageProcessing::.cctor() - - + - CpuImageProcessing/MyImage + ImageProcessing.MyImage/MyImage - 100663494 - System.Int32 CpuImageProcessing/MyImage::CompareTo(CpuImageProcessing/MyImage) + 100663699 + System.Int32 ImageProcessing.MyImage/MyImage::CompareTo(ImageProcessing.MyImage/MyImage) - + - 100663495 - System.Int32 CpuImageProcessing/MyImage::CompareTo(System.Object) + 100663700 + System.Int32 ImageProcessing.MyImage/MyImage::CompareTo(System.Object) - + - 100663496 - System.Int32 CpuImageProcessing/MyImage::CompareTo(System.Object,System.Collections.IComparer) + 100663701 + System.Int32 ImageProcessing.MyImage/MyImage::CompareTo(System.Object,System.Collections.IComparer) - + - 100663497 - System.Int32 CpuImageProcessing/MyImage::GetHashCode(System.Collections.IEqualityComparer) + 100663702 + System.Int32 ImageProcessing.MyImage/MyImage::GetHashCode(System.Collections.IEqualityComparer) - + - 100663498 - System.Int32 CpuImageProcessing/MyImage::GetHashCode() + 100663703 + System.Int32 ImageProcessing.MyImage/MyImage::GetHashCode() - + - - - 100663499 - System.Boolean CpuImageProcessing/MyImage::Equals(System.Object,System.Collections.IEqualityComparer) + + + 100663704 + System.Boolean ImageProcessing.MyImage/MyImage::Equals(System.Object,System.Collections.IEqualityComparer) - + - 100663500 - System.Void CpuImageProcessing/MyImage::.ctor(System.Byte[],System.Int32,System.Int32,System.String) - + 100663705 + System.Void ImageProcessing.MyImage/MyImage::.ctor(System.Byte[],System.Int32,System.Int32,System.String) + - + - + - 100663501 - System.Boolean CpuImageProcessing/MyImage::Equals(CpuImageProcessing/MyImage) + 100663706 + System.Boolean ImageProcessing.MyImage/MyImage::Equals(ImageProcessing.MyImage/MyImage) - + - 100663502 - System.Boolean CpuImageProcessing/MyImage::Equals(System.Object) + 100663707 + System.Boolean ImageProcessing.MyImage/MyImage::Equals(System.Object) - + - - CpuImageProcessing/Pipe #1 input at line 44@45 + + ImageProcessing.Kernels - + - 100663503 - System.Void CpuImageProcessing/Pipe #1 input at line 44@45::.ctor(a[0...,0...],System.Int32,System.Collections.Generic.IEnumerator`1<System.Int32>,System.Collections.Generic.IEnumerator`1<System.Int32>,System.Int32,a) + 100663708 + System.Single[][] ImageProcessing.Kernels::get_gaussianBlurKernel() - + - - - 100663504 - System.Int32 CpuImageProcessing/Pipe #1 input at line 44@45::GenerateNext(System.Collections.Generic.IEnumerable`1<a>&) - - - - - - - - - - - - - - - - + + + 100663709 + System.Int32[][] ImageProcessing.Kernels::get_arg@1() + + + - - - 100663505 - System.Void CpuImageProcessing/Pipe #1 input at line 44@45::Close() + + + 100663710 + System.Int32[][] ImageProcessing.Kernels::get_array@1() - + - - - 100663506 - System.Boolean CpuImageProcessing/Pipe #1 input at line 44@45::get_CheckClose() + + + 100663711 + System.Single[][] ImageProcessing.Kernels::get_res@1() - + - + - 100663507 - a CpuImageProcessing/Pipe #1 input at line 44@45::get_LastGenerated() + 100663712 + System.Single[][] ImageProcessing.Kernels::get_edgesKernel() - + - + - 100663508 - System.Collections.Generic.IEnumerator`1<a> CpuImageProcessing/Pipe #1 input at line 44@45::GetFreshEnumerator() + 100663713 + System.Int32[][] ImageProcessing.Kernels::get_arg@1-1() - + - - - - - CpuImageProcessing/processPixel@120-1 - - - - 100663510 - System.Single CpuImageProcessing/processPixel@120-1::Invoke(System.Single,System.Single,System.Single) - - - - + + + 100663714 + System.Int32[][] ImageProcessing.Kernels::get_array@1-1() + - + - + - 100663511 - System.Void CpuImageProcessing/processPixel@120-1::.cctor() + 100663715 + System.Single[][] ImageProcessing.Kernels::get_res@1-1() - + - - - - - CpuImageProcessing/processPixel@112 - - - - 100663513 - System.Single CpuImageProcessing/processPixel@112::Invoke(System.Int32,System.Int32) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + 100663716 + System.Single[][] ImageProcessing.Kernels::get_gaussianBlur7x7Kernel() + + + - - - - - CpuImageProcessing/applyFilter@122 - - - - 100663515 - System.Byte CpuImageProcessing/applyFilter@122::Invoke(System.Int32,System.Int32,System.Byte) - - - - + + + 100663717 + System.Int32[][] ImageProcessing.Kernels::get_arg@1-2() + - + - - - - - CpuImageProcessing/processPixel@140-3 - - - - 100663517 - System.Single CpuImageProcessing/processPixel@140-3::Invoke(System.Single,System.Single,System.Single) - - - - + + + 100663718 + System.Int32[][] ImageProcessing.Kernels::get_array@1-2() + - + - + - 100663518 - System.Void CpuImageProcessing/processPixel@140-3::.cctor() + 100663719 + System.Single[][] ImageProcessing.Kernels::get_res@1-2() - + - - - - - CpuImageProcessing/processPixel@129-2 - - - - 100663520 - System.Single CpuImageProcessing/processPixel@129-2::Invoke(System.Int32) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + 100663720 + System.Single[][] ImageProcessing.Kernels::get_sharpenKernel() + + + - - - - - CpuImageProcessing/applyFilterToImage@142 - - - - 100663522 - System.Byte CpuImageProcessing/applyFilterToImage@142::Invoke(System.Int32,System.Byte) - - - - + + + 100663721 + System.Int32[][] ImageProcessing.Kernels::get_arg@1-3() + + + + + + + 100663722 + System.Int32[][] ImageProcessing.Kernels::get_array@1-3() + + + + + + + 100663723 + System.Single[][] ImageProcessing.Kernels::get_res@1-3() + + + + + + + 100663724 + System.Single[][] ImageProcessing.Kernels::get_embossKernel() + + + + + + + 100663725 + System.Void ImageProcessing.Kernels::.cctor() + - + - - <StartupCode$ImageProcessing>.$CpuImageProcessing + + <StartupCode$ImageProcessing>.$ImageProcessing.Kernels - - - 100663523 - System.Void <StartupCode$ImageProcessing>.$CpuImageProcessing::.cctor() - + + + 100663726 + System.Void <StartupCode$ImageProcessing>.$ImageProcessing.Kernels::.cctor() + - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - C:\Users\Леонид\ImageProcessing\tests\ImageProcessing.Tests\bin\Debug\net7.0\ImageProcessing.Tests.dll - 2023-03-16T17:32:46.563874Z + + C:\Users\Леонид\ImageProcessing\tests\ImageProcessing.Tests\bin\Release\net7.0\ImageProcessing.Tests.dll + 2023-12-16T20:04:10.5468079Z ImageProcessing.Tests