From 54e1b74e8f2a7f87ed3b366e2e2fba30e336e295 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Tue, 5 Jul 2016 16:09:22 +0200 Subject: [PATCH 01/52] added links to dependency lists in docs/content/ref/apps.md --- build/update-app-list.ps1 | 7 +- docs/src-content/ref/apps.md | 262 +++++++++++++++++------------------ 2 files changed, 136 insertions(+), 133 deletions(-) diff --git a/build/update-app-list.ps1 b/build/update-app-list.ps1 index e003e88d..2e440d7b 100644 --- a/build/update-app-list.ps1 +++ b/build/update-app-list.ps1 @@ -37,7 +37,7 @@ function GetFrontMatter($file) function WriteAppBlock($sb, $app) { - $_ = $sb.AppendLine("### $($app.Label)") + $_ = $sb.AppendLine("### $($app.Label) {#$($app.ID)}") $_ = $sb.AppendLine() $_ = $sb.AppendLine("* ID: ``$($app.ID)``") $_ = $sb.AppendLine("* Typ: ``$($app.Typ)``") @@ -47,7 +47,10 @@ function WriteAppBlock($sb, $app) $_ = $sb.AppendLine("* Version: $version") if ($app.Dependencies.Length -gt 0) { - [array]$deps = $app.Dependencies | % { "``$_``" } + [array]$deps = $app.Dependencies | % { + $depApp = $apps[$_] + return "[$($depApp.Label)](#$_)" + } $depsList = [string]::Join(", ", $deps) $_ = $sb.AppendLine("* Dependencies: $depsList") } diff --git a/docs/src-content/ref/apps.md b/docs/src-content/ref/apps.md index 45d97cb1..2d8690a4 100644 --- a/docs/src-content/ref/apps.md +++ b/docs/src-content/ref/apps.md @@ -38,107 +38,107 @@ weight = 1 ## Groups -### 3D Modeling +### 3D Modeling {#Dev3D} * ID: `Dev3D` * Typ: `meta` * Version: latest -* Dependencies: `Blender`, `MeshLab`, `Gimp` +* Dependencies: [Blender](#Blender), [MeshLab](#MeshLab), [GIMP](#Gimp) -### C++ Development +### C++ Development {#DevCpp} * ID: `DevCpp` * Typ: `meta` * Version: latest -* Dependencies: `MinGW`, `EclipseCpp` +* Dependencies: [MinGW](#MinGW), [Eclipse for C++](#EclipseCpp) -### Clojure Development +### Clojure Development {#DevClojure} * ID: `DevClojure` * Typ: `meta` * Version: latest -* Dependencies: `Maven`, `Leiningen`, `LightTable` +* Dependencies: [Maven](#Maven), [Leiningen](#Leiningen), [LightTable](#LightTable) -### Java Development +### Java Development {#DevJava} * ID: `DevJava` * Typ: `meta` * Version: latest -* Dependencies: `JDK8`, `Maven`, `EclipseJava` +* Dependencies: [Java Development Kit 8](#JDK8), [Maven](#Maven), [Eclipse for Java](#EclipseJava) -### LaTeX Writing +### LaTeX Writing {#LaTeX} * ID: `LaTeX` * Typ: `meta` * Version: latest -* Dependencies: `MiKTeX`, `JabRef`, `TeXnicCenter` +* Dependencies: [MiKTeX](#MiKTeX), [JabRef](#JabRef), [TeXnicCenter](#TeXnicCenter) -### Markdown +### Markdown {#Markdown} * ID: `Markdown` * Typ: `meta` * Version: latest -* Dependencies: `MdProc`, `VSCode` +* Dependencies: [Yeoman Generator for Markdown Projects](#MdProc), [Visual Studio Code](#VSCode) -### Multimedia +### Multimedia {#Multimedia} * ID: `Multimedia` * Typ: `meta` * Version: latest -* Dependencies: `Inkscape`, `Dia`, `Gimp`, `Pandoc`, `MiKTeX`, `GraphicsMagick`, `Graphviz`, `FFmpeg`, `VLC`, `Blender` +* Dependencies: [Inkscape](#Inkscape), [Dia](#Dia), [GIMP](#Gimp), [Pandoc](#Pandoc), [MiKTeX](#MiKTeX), [Graphics Magick](#GraphicsMagick), [Graphviz](#Graphviz), [FFmpeg](#FFmpeg), [VLC Player](#VLC), [Blender](#Blender) -### Python 2 Development +### Python 2 Development {#DevPython2} * ID: `DevPython2` * Typ: `meta` * Version: latest -* Dependencies: `Python2`, `SublimeText3`, `IPython2` +* Dependencies: [Python 2](#Python2), [Sublime Text 3](#SublimeText3), [IPython 2](#IPython2) -### Python 3 Development +### Python 3 Development {#DevPython3} * ID: `DevPython3` * Typ: `meta` * Version: latest -* Dependencies: `Python3`, `SublimeText3`, `IPython3` +* Dependencies: [Python 3](#Python3), [Sublime Text 3](#SublimeText3), [IPython 3](#IPython3) -### Web Development with PHP 5 +### Web Development with PHP 5 {#WebDevPHP5} * ID: `WebDevPHP5` * Typ: `meta` * Version: latest -* Dependencies: `PHP5`, `MySQL`, `MySQLWB`, `Apache`, `EclipsePHP` +* Dependencies: [PHP 5](#PHP5), [MySQL](#MySQL), [MySQL Workbench](#MySQLWB), [Apache](#Apache), [Eclipse for PHP](#EclipsePHP) -### Web Development with PHP 7 +### Web Development with PHP 7 {#WebDevPHP7} * ID: `WebDevPHP7` * Typ: `meta` * Version: latest -* Dependencies: `PHP7`, `MySQL`, `MySQLWB`, `Apache`, `EclipsePHP` +* Dependencies: [PHP 7](#PHP7), [MySQL](#MySQL), [MySQL Workbench](#MySQLWB), [Apache](#Apache), [Eclipse for PHP](#EclipsePHP) ## Required Apps -### 7-Zip +### 7-Zip {#SvZ} * ID: `SvZ` * Typ: `default` * Website: * Version: 16.02 -### ConEmu +### ConEmu {#ConEmu} * ID: `ConEmu` * Typ: `default` * Website: * Version: 16.06.19 -### Inno Setup Unpacker +### Inno Setup Unpacker {#InnoUnp} * ID: `InnoUnp` * Typ: `default` * Website: * Version: 0.45 -### Less MSIerables +### Less MSIerables {#LessMsi} * ID: `LessMsi` * Typ: `default` @@ -147,561 +147,561 @@ weight = 1 ## Optional Apps -### Ant Renamer +### Ant Renamer {#AntRenamer} * ID: `AntRenamer` * Typ: `default` * Website: * Version: latest -### Apache +### Apache {#Apache} * ID: `Apache` * Typ: `default` * Website: * Version: 2.4.20 -### Atom +### Atom {#Atom} * ID: `Atom` * Typ: `default` * Website: * Version: 1.8.0 -### Blender +### Blender {#Blender} * ID: `Blender` * Typ: `default` * Website: * Version: 2.77 -### Bower +### Bower {#Bower} * ID: `Bower` * Typ: `node-package` * Website: * Version: >=1.7.0 <2.0.0 -* Dependencies: `Git`, `Npm` +* Dependencies: [Git](#Git), [NPM](#Npm) -### CMake +### CMake {#CMake} * ID: `CMake` * Typ: `default` * Website: * Version: 3.5.2 -### cURL +### cURL {#cURL} * ID: `cURL` * Typ: `default` * Website: * Version: 7.48.0 -### Dia +### Dia {#Dia} * ID: `Dia` * Typ: `default` * Website: * Version: 0.97.2 -### Eclipse for C++ +### Eclipse for C++ {#EclipseCpp} * ID: `EclipseCpp` * Typ: `default` * Website: * Version: 4.5 -* Dependencies: `JRE8` +* Dependencies: [Java Runtime Environment 8](#JRE8) -### Eclipse for Java +### Eclipse for Java {#EclipseJava} * ID: `EclipseJava` * Typ: `default` * Website: * Version: 4.5 -* Dependencies: `JRE8` +* Dependencies: [Java Runtime Environment 8](#JRE8) -### Eclipse for PHP +### Eclipse for PHP {#EclipsePHP} * ID: `EclipsePHP` * Typ: `default` * Website: * Version: 4.5 -* Dependencies: `JRE8` +* Dependencies: [Java Runtime Environment 8](#JRE8) -### Emacs +### Emacs {#Emacs} * ID: `Emacs` * Typ: `default` * Website: * Version: 24.5 -* Dependencies: `GnuTLS` +* Dependencies: [GNU TLS](#GnuTLS) -### FFmpeg +### FFmpeg {#FFmpeg} * ID: `FFmpeg` * Typ: `default` * Website: * Version: 20160512-git-cd244fa -### FileZilla +### FileZilla {#FileZilla} * ID: `FileZilla` * Typ: `default` * Website: * Version: 3.18.0 -### GIMP +### GIMP {#Gimp} * ID: `Gimp` * Typ: `default` * Website: * Version: 2.8.16 -### Git +### Git {#Git} * ID: `Git` * Typ: `default` * Website: * Version: 2.9.0 -### GitKraken +### GitKraken {#GitKraken} * ID: `GitKraken` * Typ: `default` * Website: * Version: latest -### GNU TLS +### GNU TLS {#GnuTLS} * ID: `GnuTLS` * Typ: `default` * Website: * Version: 3.3.11 -### GnuPG +### GnuPG {#GnuPG} * ID: `GnuPG` * Typ: `default` * Website: * Version: 2.0.30 -### Go +### Go {#Go} * ID: `Go` * Typ: `default` * Website: * Version: 1.6 -### Graphics Magick +### Graphics Magick {#GraphicsMagick} * ID: `GraphicsMagick` * Typ: `default` * Website: * Version: 1.3.23 -### Graphviz +### Graphviz {#Graphviz} * ID: `Graphviz` * Typ: `default` * Website: * Version: 2.38 -### Grunt +### Grunt {#Grunt} * ID: `Grunt` * Typ: `node-package` * Website: * Version: >=0.4.5 <0.5.0 -* Dependencies: `Npm` +* Dependencies: [NPM](#Npm) -### Gulp +### Gulp {#Gulp} * ID: `Gulp` * Typ: `node-package` * Website: * Version: >=3.9.0 <4.0.0 -* Dependencies: `Npm` +* Dependencies: [NPM](#Npm) -### Hugo +### Hugo {#Hugo} * ID: `Hugo` * Typ: `default` * Website: * Version: 0.16 -### Inkscape +### Inkscape {#Inkscape} * ID: `Inkscape` * Typ: `default` * Website: * Version: 0.91-1 -### IPython 2 +### IPython 2 {#IPython2} * ID: `IPython2` * Typ: `python2-package` * Website: * Version: latest -* Dependencies: `PyReadline2`, `Python2` +* Dependencies: [PyReadline (Python 2)](#PyReadline2), [Python 2](#Python2) -### IPython 3 +### IPython 3 {#IPython3} * ID: `IPython3` * Typ: `python3-package` * Website: * Version: latest -* Dependencies: `PyReadline3`, `Python3` +* Dependencies: [PyReadline (Python 3)](#PyReadline3), [Python 3](#Python3) -### JabRef +### JabRef {#JabRef} * ID: `JabRef` * Typ: `default` * Website: * Version: 3.3 -* Dependencies: `JRE8` +* Dependencies: [Java Runtime Environment 8](#JRE8) -### Java Development Kit 7 +### Java Development Kit 7 {#JDK7} * ID: `JDK7` * Typ: `default` * Website: * Version: 7u80 -### Java Development Kit 8 +### Java Development Kit 8 {#JDK8} * ID: `JDK8` * Typ: `default` * Website: * Version: 8u92 -### Java Runtime Environment 7 +### Java Runtime Environment 7 {#JRE7} * ID: `JRE7` * Typ: `default` * Website: * Version: 7u80 -### Java Runtime Environment 8 +### Java Runtime Environment 8 {#JRE8} * ID: `JRE8` * Typ: `default` * Website: * Version: 8u92 -### JSHint +### JSHint {#JSHint} * ID: `JSHint` * Typ: `node-package` * Website: * Version: >=2.8.0 <3.0.0 -* Dependencies: `Npm` +* Dependencies: [NPM](#Npm) -### Leiningen +### Leiningen {#Leiningen} * ID: `Leiningen` * Typ: `default` * Website: * Version: latest -* Dependencies: `JDK8`, `GnuPG`, `Wget` +* Dependencies: [Java Development Kit 8](#JDK8), [GnuPG](#GnuPG), [Wget](#Wget) -### LightTable +### LightTable {#LightTable} * ID: `LightTable` * Typ: `default` * Website: * Version: 0.8.1 -### LLVM Clang +### LLVM Clang {#Clang} * ID: `Clang` * Typ: `default` * Website: * Version: 3.8.0 -### Maven +### Maven {#Maven} * ID: `Maven` * Typ: `default` * Website: * Version: 3.3.9 -* Dependencies: `JRE8`, `GnuPG` +* Dependencies: [Java Runtime Environment 8](#JRE8), [GnuPG](#GnuPG) -### MeshLab +### MeshLab {#MeshLab} * ID: `MeshLab` * Typ: `default` * Website: * Version: 1.3.3 -### MiKTeX +### MiKTeX {#MiKTeX} * ID: `MiKTeX` * Typ: `default` * Website: * Version: 2.9.5987 -### MinGW +### MinGW {#MinGW} * ID: `MinGW` * Typ: `meta` * Website: * Version: latest -* Dependencies: `MinGwGet`, `MinGwGetGui` +* Dependencies: [MinGwGet](#MinGwGet), [MinGwGetGui](#MinGwGetGui) -### MinGwGet +### MinGwGet {#MinGwGet} * ID: `MinGwGet` * Typ: `default` * Version: 0.6.2 -* Dependencies: `Wget` +* Dependencies: [Wget](#Wget) -### MinGwGetGui +### MinGwGetGui {#MinGwGetGui} * ID: `MinGwGetGui` * Typ: `default` * Version: latest -* Dependencies: `MinGwGet` +* Dependencies: [MinGwGet](#MinGwGet) -### MySQL +### MySQL {#MySQL} * ID: `MySQL` * Typ: `default` * Website: * Version: 5.7.12 -### MySQL Workbench +### MySQL Workbench {#MySQLWB} * ID: `MySQLWB` * Typ: `default` * Website: * Version: 6.3.6 -### Node.js +### Node.js {#Node} * ID: `Node` * Typ: `default` * Website: -* Version: 4.4.6 +* Version: 6.2.2 -### NPM +### NPM {#Npm} * ID: `Npm` * Typ: `default` * Website: * Version: >=3.7.0 <4.0.0 -* Dependencies: `Node` +* Dependencies: [Node.js](#Node) -### NuGet +### NuGet {#NuGet} * ID: `NuGet` * Typ: `default` * Website: * Version: latest -### OpenSSL +### OpenSSL {#OpenSSL} * ID: `OpenSSL` * Typ: `default` * Website: * Version: 1.0.2h -### Pandoc +### Pandoc {#Pandoc} * ID: `Pandoc` * Typ: `default` * Website: * Version: 1.17.1 -### PHP 5 +### PHP 5 {#PHP5} * ID: `PHP5` * Typ: `default` * Website: * Version: 5.6.21 -### PHP 7 +### PHP 7 {#PHP7} * ID: `PHP7` * Typ: `default` * Website: * Version: 7.0.6 -### PostgreSQL +### PostgreSQL {#PostgreSQL} * ID: `PostgreSQL` * Typ: `default` * Website: * Version: 9.5.3-1 -### Putty +### Putty {#Putty} * ID: `Putty` * Typ: `default` * Website: * Version: latest -### PyReadline (Python 2) +### PyReadline (Python 2) {#PyReadline2} * ID: `PyReadline2` * Typ: `python2-package` * Website: * Version: latest -* Dependencies: `Python2` +* Dependencies: [Python 2](#Python2) -### PyReadline (Python 3) +### PyReadline (Python 3) {#PyReadline3} * ID: `PyReadline3` * Typ: `python3-package` * Website: * Version: latest -* Dependencies: `Python3` +* Dependencies: [Python 3](#Python3) -### Python 2 +### Python 2 {#Python2} * ID: `Python2` * Typ: `default` * Website: * Version: 2.7.11 -### Python 3 +### Python 3 {#Python3} * ID: `Python3` * Typ: `default` * Website: * Version: 3.4.4 -### Ruby +### Ruby {#Ruby} * ID: `Ruby` * Typ: `default` * Website: * Version: 2.2.4 -### SASS +### SASS {#Sass} * ID: `Sass` * Typ: `ruby-package` * Website: * Version: latest -* Dependencies: `Ruby` +* Dependencies: [Ruby](#Ruby) -### Sift +### Sift {#Sift} * ID: `Sift` * Typ: `default` * Website: * Version: 0.8.0 -### Spacemacs +### Spacemacs {#Spacemacs} * ID: `Spacemacs` * Typ: `meta` * Website: * Version: latest -* Dependencies: `Git`, `Emacs` +* Dependencies: [Git](#Git), [Emacs](#Emacs) -### Sublime Text 3 +### Sublime Text 3 {#SublimeText3} * ID: `SublimeText3` * Typ: `default` * Website: * Version: Build 3114 -### SWare Iron +### SWare Iron {#Iron} * ID: `Iron` * Typ: `default` * Website: * Version: latest -### SysInternals +### SysInternals {#SysInternals} * ID: `SysInternals` * Typ: `default` * Website: * Version: latest -### TeXnicCenter +### TeXnicCenter {#TeXnicCenter} * ID: `TeXnicCenter` * Typ: `default` * Website: * Version: 2.02 -* Dependencies: `MiKTeX` +* Dependencies: [MiKTeX](#MiKTeX) -### Vim +### Vim {#Vim} * ID: `Vim` * Typ: `default` * Website: * Version: 7.4 -* Dependencies: `VimRT`, `VimConsole` +* Dependencies: [VimRT](#VimRT), [VimConsole](#VimConsole) -### VimConsole +### VimConsole {#VimConsole} * ID: `VimConsole` * Typ: `default` * Version: 7.4 -* Dependencies: `VimRT` +* Dependencies: [VimRT](#VimRT) -### VimRT +### VimRT {#VimRT} * ID: `VimRT` * Typ: `default` * Version: 7.4 -### Visual Studio Code +### Visual Studio Code {#VSCode} * ID: `VSCode` * Typ: `default` * Website: * Version: latest -### VLC Player +### VLC Player {#VLC} * ID: `VLC` * Typ: `default` * Website: * Version: 2.2.4 -### Wget +### Wget {#Wget} * ID: `Wget` * Typ: `default` * Website: * Version: 1.11.4-1 -* Dependencies: `WgetDeps` +* Dependencies: [WgetDeps](#WgetDeps) -### WgetDeps +### WgetDeps {#WgetDeps} * ID: `WgetDeps` * Typ: `default` * Version: 1.11.4-1 -### WinMerge +### WinMerge {#WinMerge} * ID: `WinMerge` * Typ: `default` * Website: * Version: 2.14.0 -### Yeoman +### Yeoman {#Yeoman} * ID: `Yeoman` * Typ: `node-package` * Website: * Version: >=1.5.0 <2.0.0 -* Dependencies: `Npm` +* Dependencies: [NPM](#Npm) -### Yeoman Generator for Markdown Projects +### Yeoman Generator for Markdown Projects {#MdProc} * ID: `MdProc` * Typ: `node-package` * Website: * Version: >=0.1.6 <0.2.0 -* Dependencies: `Yeoman`, `Gulp`, `Pandoc`, `Graphviz`, `Inkscape`, `MiKTeX`, `Npm` +* Dependencies: [Yeoman](#Yeoman), [Gulp](#Gulp), [Pandoc](#Pandoc), [Graphviz](#Graphviz), [Inkscape](#Inkscape), [MiKTeX](#MiKTeX), [NPM](#Npm) -### Zeal Docs +### Zeal Docs {#Zeal} * ID: `Zeal` * Typ: `default` From 5ba51324f2d69f0ef2ab5ffa88576b096c444d0a Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Tue, 5 Jul 2016 16:09:34 +0200 Subject: [PATCH 02/52] started describing configuration properties --- docs/content/ref/config.md | 63 +++++++++++++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/docs/content/ref/config.md b/docs/content/ref/config.md index dc442443..1cbcd1a9 100644 --- a/docs/content/ref/config.md +++ b/docs/content/ref/config.md @@ -6,4 +6,65 @@ title = "Configuration Properties" weight = 6 +++ -TODO \ No newline at end of file +TODO + +## Fix Distribution Properties + +Properties in this group can not be customized. + +* VersionFile: `res\version.txt` +* CustomConfigDir: `config` +* CustomConfigFile: `$CustomConfigDir$\config.md` +* CustomConfigTemplateFile: `res\config.template.md` +* SiteConfigFileName: `bench-site.md` +* SiteConfigTemplateFile: `res\bench-site.template.md` +* AppIndexFile: `res\apps.md` +* AppActivationFile: `$CustomConfigDir$\apps-activated.txt` +* AppActivationTemplateFile: `res\apps-activated.template.txt` +* AppDeactivationFile: `$CustomConfigDir$\apps-deactivated.txt` +* AppDeactivationTemplateFile: `res\apps-deactivated.template.txt` +* CustomAppIndexFile: `$CustomConfigDir$\apps.md` +* CustomAppIndexTemplateFile: `res\apps.template.md` +* ConEmuConfigFile: `$CustomConfigDir$\ConEmu.xml` +* ConEmuConfigTemplateFile: `res\ConEmu.template.xml` +* AppResourceBaseDir: `res\apps` +* ActionDir: `actions` +* LibDir: `lib` + +## Customizable Properties + +Properties in this group are customizable and can be set in +`config/config.md` or in a `bench-site.md` file. + +* UseProxy: `false` +* ProxyBypass: `localhost` +* HttpProxy: `http://127.0.0.1:80` +* HttpsProxy: `http://127.0.0.1:443` +* DownloadAttempts: 3 +* ParallelDownloads: 4 +* LogLevel: `Info` +* UserName: user +* UserEmail: user@localhost +* DownloadDir: `cache` +* AppAdornmentBaseDir: `$LibDir$\_proxies` +* AppRegistryBaseDir: `$HomeDir$\registry_isolation` +* TempDir: `tmp` +* LogDir: `log` +* HomeDir: `home` +* AppDataDir: `$HomeDir$\AppData\Roaming` +* LocalAppDataDir: `$HomeDir$\AppData\Local` +* OverrideHome: `true` +* OverrideTemp: `true` +* IgnoreSystemPath: `true` +* ProjectRootDir: `projects` +* ProjectArchiveDir: `archive` +* ProjectArchiveFormat: `zip` +* LauncherDir: `launcher` +* LauncherScriptDir: `$LibDir$\_launcher` +* WizzardEditCustomConfigBeforeSetup: `false` +* WizzardStartAutoSetup: `true` +* QuickAccessCmd: `true` +* QuickAccessPowerShell: `false` +* QuickAccessBash: `false` +* EditorApp: `VSCode` +* Website: From d900ca144c56bc55370aed2db23ea8d40da12858 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 6 Jul 2016 18:58:20 +0200 Subject: [PATCH 03/52] progress with the description of configuration properties --- docs/content/ref/config.md | 472 +++++++++++++++++++++++++++++---- docs/src-content/ref/config.md | 390 +++++++++++++++++++++++++++ 2 files changed, 806 insertions(+), 56 deletions(-) create mode 100644 docs/src-content/ref/config.md diff --git a/docs/content/ref/config.md b/docs/content/ref/config.md index 1cbcd1a9..06bf8c0a 100644 --- a/docs/content/ref/config.md +++ b/docs/content/ref/config.md @@ -6,65 +6,425 @@ title = "Configuration Properties" weight = 6 +++ -TODO - -## Fix Distribution Properties - -Properties in this group can not be customized. - -* VersionFile: `res\version.txt` -* CustomConfigDir: `config` -* CustomConfigFile: `$CustomConfigDir$\config.md` -* CustomConfigTemplateFile: `res\config.template.md` -* SiteConfigFileName: `bench-site.md` -* SiteConfigTemplateFile: `res\bench-site.template.md` -* AppIndexFile: `res\apps.md` -* AppActivationFile: `$CustomConfigDir$\apps-activated.txt` -* AppActivationTemplateFile: `res\apps-activated.template.txt` -* AppDeactivationFile: `$CustomConfigDir$\apps-deactivated.txt` -* AppDeactivationTemplateFile: `res\apps-deactivated.template.txt` -* CustomAppIndexFile: `$CustomConfigDir$\apps.md` -* CustomAppIndexTemplateFile: `res\apps.template.md` -* ConEmuConfigFile: `$CustomConfigDir$\ConEmu.xml` -* ConEmuConfigTemplateFile: `res\ConEmu.template.xml` -* AppResourceBaseDir: `res\apps` -* ActionDir: `actions` -* LibDir: `lib` +Configuration properties for Bench use the [list syntax in Markdown][syntax] +and can be defined in the following files. + +* Default Configuration file `res\config.md` +* Custom Configuration file `config\config.md` +* Site Configuration files `bench-site.md` + in the Bench root directory and all of its parents. + +The configuration files are applied in the order they are listed above. +The site configuration files are applied with the files near the file system root first +and the one in the Bench root directory last. +Configuration files applied later override values from files applied earlier. + +Therefore, the site configuration file in the Bench root directory has the highest priority +and the default configuration has the lowest. + +Properties of the data type `path` can be absolute, or relative to the Bench root directory. + +## Overview + +There two groups of configuration properties: +The first group contains properties, which are predefined by the default +configuration, and can _not_ be set in the custom or site configuration. +These properties can not be overridden, because they are used during the +Bench setup process when no custom or site configuration yet exists. +The second group contains properties, which are also predefined by the default +configuration, but _can_ be overridden in the custom or site configuration. + +**System Properties** + +| Name | Data Type | Default | +|------|-----------|---------| +| [VersionFile](#VersionFile) | path | `res\version.txt` | +| [CustomConfigDir](#CustomConfigDir) | path | `config` | +| [CustomConfigFile](#CustomConfigFile) | path | `$CustomConfigDir$\config.md` | +| [CustomConfigTemplateFile](#CustomConfigTemplateFile) | path | `res\config.template.md` | +| [SiteConfigFileName](#SiteConfigFileName) | string | `bench-site.md` | +| [SiteConfigTemplateFile](#SiteConfigTemplateFile) | path | `res\bench-site.template.md` | +| [AppIndexFile](#AppIndexFile) | path | `res\apps.md` | +| [AppActivationFile](#AppActivationFile) | path | `$CustomConfigDir$\apps-activated.txt` | +| [AppActivationTemplateFile](#AppActivationTemplateFile) | path | `res\apps-activated.template.txt` | +| [AppDeactivationFile](#AppDeactivationFile) | path | `$CustomConfigDir$\apps-deactivated.txt` | +| [AppDeactivationTemplateFile](#AppDeactivationTemplateFile) | path | `res\apps-deactivated.template.txt` | +| [CustomAppIndexFile](#CustomAppIndexFile) | path | `$CustomConfigDir$\apps.md` | +| [CustomAppIndexTemplateFile](#CustomAppIndexTemplateFile) | path | `res\apps.template.md` | +| [ConEmuConfigFile](#ConEmuConfigFile) | path | `$CustomConfigDir$\ConEmu.xml` | +| [ConEmuConfigTemplateFile](#ConEmuConfigTemplateFile) | path | `res\ConEmu.template.xml` | +| [AppResourceBaseDir](#AppResourceBaseDir) | path | `res\apps` | +| [ActionDir](#ActionDir) | path | `actions` | +| [LibDir](#LibDir) | path | `lib` | + +**Customizable Properties** + +| Name | Typ | Data Type | Default | +|------|-----|-----------|---------| +| [UseProxy](#UseProxy) | Site | boolean | `false` | +| [ProxyBypass](#ProxyBypass) | Site | list of strings | `localhost` | +| [HttpProxy](#HttpProxy) | Site | URL | `http://127.0.0.1:80` | +| [HttpsProxy](#HttpsProxy) | Site | URL | `http://127.0.0.1:443` | +| [DownloadAttempts](#DownloadAttempts) | Site | integer | 3 | +| [ParallelDownloads](#ParallelDownloads) | Site | integer | 4 | +| [UserName](#UserName) | Custom, Site | string | user | +| [UserEmail](#UserEmail) | Custom, Site | string | user@localhost | +| [DownloadDir](#DownloadDir) | Custom, Site | path | `cache` | +| [AppAdornmentBaseDir](#AppAdornmentBaseDir) | | | `$LibDir$\_proxies` | +| [AppRegistryBaseDir](#AppRegistryBaseDir) | | | `$HomeDir$\registry_isolation` | +| [TempDir](#TempDir) | | | `tmp` | +| [LogDir](#LogDir) | | | `log` | +| [HomeDir](#HomeDir) | | | `home` | +| [AppDataDir](#AppDataDir) | | | `$HomeDir$\AppData\Roaming` | +| [LocalAppDataDir](#LocalAppDataDir) | | | `$HomeDir$\AppData\Local` | +| [OverrideHome](#OverrideHome) | | | `true` | +| [OverrideTemp](#OverrideTemp) | | | `true` | +| [IgnoreSystemPath](#IgnoreSystemPath) | | | `true` | +| [ProjectRootDir](#ProjectRootDir) | | | `projects` | +| [ProjectArchiveDir](#ProjectArchiveDir) | | | `archive` | +| [ProjectArchiveFormat](#ProjectArchiveFormat) | | | `zip` | +| [LauncherDir](#LauncherDir) | | | `launcher` | +| [LauncherScriptDir](#LauncherScriptDir) | | | `$LibDir$\_launcher` | +| [WizzardEditCustomConfigBeforeSetup](#WizzardEditCustomConfigBeforeSetup) | | | `false` | +| [WizzardStartAutoSetup](#WizzardStartAutoSetup) | | | `true` | +| [QuickAccessCmd](#QuickAccessCmd) | | | `true` | +| [QuickAccessPowerShell](#QuickAccessPowerShell) | | | `false` | +| [QuickAccessBash](#QuickAccessBash) | | | `false` | +| [EditorApp](#EditorApp) | | | `VSCode` | +| [Website](#Website) | | | | + +## System Properties + +Properties in this group can not be customized, by overriding them in +the custom or site configuration. + +If it is necessary to change them anyways, the default configuration +in `res\config.md` must be edited before the initial Bench setup is executed, +and the Bench upgrade mechanism can not be used, because it would override +these changes. + +### VersionFile {#VersionFile} + +* Description: The path to a text file, which contains nothing but the version number of the Bench distribution. +* Data Type: path +* Default: `res\version.txt` +* Typ: System + +### CustomConfigDir {#CustomConfigDir} + +* Description: The path to the directory with the custom configuration (`config.md`, `apps-activated.txt`, ...) +* Data Type: path +* Default: `config` +* Typ: System + +The custom configuration directory is designed in a way, that is can be easily put under version control. + +### CustomConfigFile {#CustomConfigFile} + +* Description: The path to the custom configuration file. +* Data Type: path +* Default: `$CustomConfigDir$\config.md` +* Typ: System + +The specified file must be a Markdown file and follow the [Markdown list syntax][syntax]. + +### CustomConfigTemplateFile {#CustomConfigTemplateFile} + +* Description: The path to the custom configuration template file, + which is copied during the Bench setup in case no custom configuration exists. +* Data Type: path +* Default: `res\config.template.md` +* Typ: System + +### SiteConfigFileName {#SiteConfigFileName} + +* Description: The name of the site configuration file. +* Data Type: string +* Default: `bench-site.md` +* Typ: System + +Site configuration files are searched in the Bench root directory and in all of its parents. +The specified file must be a Markdown file and follow the [Markdown list syntax][syntax]. + +### SiteConfigTemplateFile {#SiteConfigTemplateFile} + +* Description: The path to the site configuration template file, + which is copied during the Bench setup in case no site configuration exists. +* Data Type: path +* Default: `res\bench-site.template.md` +* Typ: System + +### AppIndexFile {#AppIndexFile} + +* Description: The path to a library file for all program definitions, included in Bench. +* Data Type: path +* Default: `res\apps.md` +* Typ: System + +The specified file must be a Markdown file and follow the [Markdown list syntax][syntax]. + +### AppActivationFile {#AppActivationFile} + +* Description: The path to a file with a list of activated apps. +* Data Type: path +* Default: `$CustomConfigDir$\apps-activated.txt` +* Typ: System + +The specified file must be an UTF8 encoded text file. +Every non empty line, which is not commented with a `#` is interpreted as an app ID. +Only non-space characters, up to the first space or the end of a line, are considered. + +### AppActivationTemplateFile {#AppActivationTemplateFile} + +* Description: The path to the app activation template file, + which is copied during the Bench setup in case no custom configuration exists. +* Data Type: path +* Default: `res\apps-activated.template.txt` +* Typ: System + +### AppDeactivationFile {#AppDeactivationFile} + +* Description: The path to a file with a list of deactivated apps. +* Data Type: path +* Default: `$CustomConfigDir$\apps-deactivated.txt` +* Typ: System + +The specified file must be an UTF8 encoded text file. +Every non empty line, which is not commented with a `#` is interpreted as an app ID. +Only non-space characters, up to the first space or the end of a line, are considered. + +### AppDeactivationTemplateFile {#AppDeactivationTemplateFile} + +* Description: The path to the app deactivation template file, + which is copied during the Bench setup in case no custom configuration exists. +* Data Type: path +* Default: `res\apps-deactivated.template.txt` +* Typ: System + +### CustomAppIndexFile {#CustomAppIndexFile} + +* Description: The path to a library file with custom program definitions. +* Data Type: path +* Default: `$CustomConfigDir$\apps.md` +* Typ: System + +The specified file must be a Markdown file and follow the [Markdown list syntax][syntax]. + +### CustomAppIndexTemplateFile {#CustomAppIndexTemplateFile} + +* Description: The path to the custom app library template file, + which is copied during the Bench setup in case no custom configuration exists. +* Data Type: path +* Default: `res\apps.template.md` +* Typ: System + +### ConEmuConfigFile {#ConEmuConfigFile} + +* Description: The path to the ConEmu configuration, used in the Bench Dashboard. +* Data Type: path +* Default: `$CustomConfigDir$\ConEmu.xml` +* Typ: System + +### ConEmuConfigTemplateFile {#ConEmuConfigTemplateFile} + +* Description: The path to the ConEmu configuration template file, + which is copied during the Bench setup in case no custom configuration exists. +* Data Type: path +* Default: `res\ConEmu.template.xml` +* Typ: System + +### AppResourceBaseDir {#AppResourceBaseDir} + +* Description: The path to a directory, containing additional resource files, + which are used during the execution of custom setup scripts. +* Data Type: path +* Default: `res\apps` +* Typ: System + +It is used from custom scripts to retrieve absolute paths to the additional resources. + +### ActionDir {#ActionDir} + +* Description: The path to a directory with Bench action scripts. +* Data Type: path +* Default: `actions` +* Typ: System + +Bench action scripts are typically `*.cmd` files. + +### LibDir {#LibDir} + +* Description: The path to the base directory where Bench apps are installed. +* Data Type: path +* Default: `lib` +* Typ: System ## Customizable Properties Properties in this group are customizable and can be set in `config/config.md` or in a `bench-site.md` file. -* UseProxy: `false` -* ProxyBypass: `localhost` -* HttpProxy: `http://127.0.0.1:80` -* HttpsProxy: `http://127.0.0.1:443` -* DownloadAttempts: 3 -* ParallelDownloads: 4 -* LogLevel: `Info` -* UserName: user -* UserEmail: user@localhost -* DownloadDir: `cache` -* AppAdornmentBaseDir: `$LibDir$\_proxies` -* AppRegistryBaseDir: `$HomeDir$\registry_isolation` -* TempDir: `tmp` -* LogDir: `log` -* HomeDir: `home` -* AppDataDir: `$HomeDir$\AppData\Roaming` -* LocalAppDataDir: `$HomeDir$\AppData\Local` -* OverrideHome: `true` -* OverrideTemp: `true` -* IgnoreSystemPath: `true` -* ProjectRootDir: `projects` -* ProjectArchiveDir: `archive` -* ProjectArchiveFormat: `zip` -* LauncherDir: `launcher` -* LauncherScriptDir: `$LibDir$\_launcher` -* WizzardEditCustomConfigBeforeSetup: `false` -* WizzardStartAutoSetup: `true` -* QuickAccessCmd: `true` -* QuickAccessPowerShell: `false` -* QuickAccessBash: `false` -* EditorApp: `VSCode` -* Website: +### UseProxy {#UseProxy} + +* Description: A switch to activate the use of a HTTP(S) proxy in Bench. +* Data Type: boolean +* Possible Values: `true`, `false` +* Default: `false` +* Typ: Site + +### ProxyBypass {#ProxyBypass} + +* Description: A list with domains which are not to be contacted via proxy. +* Data Type: list of strings +* Default: `localhost` +* Typ: Site + +This property is used during the download of app resources and interpreted +by the [`System.Net.WebProxy` class](https://msdn.microsoft.com/en-us/library/system.net.webproxy.bypasslist.aspx). + +The usage in the custom scripts for apps is not completely implemented yet. + +### HttpProxy {#HttpProxy} + +* Description: The URL for the HTTP proxy. +* Data Type: URL +* Default: `http://127.0.0.1:80` +* Typ: Site + +### HttpsProxy {#HttpsProxy} + +* Description: The URL for the HTTPS proxy. +* Data Type: URL +* Default: `http://127.0.0.1:443` +* Typ: Site + +### DownloadAttempts {#DownloadAttempts} + +* Description: The number of download attempts for an app resource. +* Data Type: integer +* Default: 3 +* Typ: Site + +### ParallelDownloads {#ParallelDownloads} + +* Description: The maximal number of parallel downloads for app resources. +* Data Type: integer +* Default: 4 +* Typ: Site + +### UserName {#UserName} + +* Description: The name of the Bench user. +* Data Type: string +* Default: user +* Typ: Custom, Site + +This property is used to set the environment variable `USER_NAME` +and in custom scripts e.g. from [Git](/ref/apps/#Git). + +### UserEmail {#UserEmail} + +* Description: The email address of the Bench user. +* Data Type: string +* Default: user@localhost +* Typ: Custom, Site + +This property is used to set the environment variable `USER_EMAIL` +and in custom scripts e.g. from [Git](/ref/apps/#Git). + +### DownloadDir {#DownloadDir} + +* Description: The path to the directory where downloaded app resources are cached. +* Data Type: path +* Default: `cache` +* Typ: Custom, Site + +### AppAdornmentBaseDir {#AppAdornmentBaseDir} + +* Default: `$LibDir$\_proxies` + +### AppRegistryBaseDir {#AppRegistryBaseDir} + +* Default: `$HomeDir$\registry_isolation` + +### TempDir {#TempDir} + +* Default: `tmp` + +### LogDir {#LogDir} + +* Default: `log` + +### HomeDir {#HomeDir} + +* Default: `home` + +### AppDataDir {#AppDataDir} + +* Default: `$HomeDir$\AppData\Roaming` + +### LocalAppDataDir {#LocalAppDataDir} + +* Default: `$HomeDir$\AppData\Local` + +### OverrideHome {#OverrideHome} + +* Default: `true` + +### OverrideTemp {#OverrideTemp} + +* Default: `true` + +### IgnoreSystemPath {#IgnoreSystemPath} + +* Default: `true` + +### ProjectRootDir {#ProjectRootDir} + +* Default: `projects` + +### ProjectArchiveDir {#ProjectArchiveDir} + +* Default: `archive` + +### ProjectArchiveFormat {#ProjectArchiveFormat} + +* Default: `zip` + +### LauncherDir {#LauncherDir} + +* Default: `launcher` + +### LauncherScriptDir {#LauncherScriptDir} + +* Default: `$LibDir$\_launcher` + +### WizzardEditCustomConfigBeforeSetup {#WizzardEditCustomConfigBeforeSetup} + +* Default: `false` + +### WizzardStartAutoSetup {#WizzardStartAutoSetup} + +* Default: `true` + +### QuickAccessCmd {#QuickAccessCmd} + +* Default: `true` + +### QuickAccessPowerShell {#QuickAccessPowerShell} + +* Default: `false` + +### QuickAccessBash {#QuickAccessBash} + +* Default: `false` + +### EditorApp {#EditorApp} + +* Default: `VSCode` + +### Website {#Website} + +* Default: + +[syntax]: /ref/markup-syntax diff --git a/docs/src-content/ref/config.md b/docs/src-content/ref/config.md new file mode 100644 index 00000000..9be0a021 --- /dev/null +++ b/docs/src-content/ref/config.md @@ -0,0 +1,390 @@ ++++ +date = "2016-06-22T13:42:49+02:00" +description = "The properties of the Bench configuration" +draft = true +title = "Configuration Properties" +weight = 6 ++++ + +Configuration properties for Bench use the [list syntax in Markdown][syntax] +and can be defined in the following files. + +* Default configuration file `res\config.md` +* Custom configuration file `config\config.md` +* Site configuration files `bench-site.md` + in the Bench root directory and all of its parents. + +The configuration files are applied in the order they are listed above. +The site configuration files are applied with the files near the file system root first +and the one in the Bench root directory last. +Configuration files applied later override values from files applied earlier. + +Therefore, the site configuration file in the Bench root directory has the highest priority +and the default configuration has the lowest. + +Properties of the data type `path` can be absolute, or relative to the Bench root directory. + +## Overview + +There two groups of configuration properties: +The first group contains properties, which are predefined by the default +configuration, and can _not_ be set in the custom or site configuration. +These properties can not be overridden, because they are used during the +Bench setup process when no custom or site configuration yet exists. +The second group contains properties, which are also predefined by the default +configuration, but _can_ be overridden in the custom or site configuration. + +**System Properties** + + + +**Customizable Properties** + + + +## System Properties + +Properties in this group can not be customized, by overriding them in +the custom or site configuration. + +If it is necessary to change them anyways, the default configuration +in `res\config.md` must be edited before the initial Bench setup is executed, +and the Bench upgrade mechanism can not be used, because it would override +these changes. + +### VersionFile {#VersionFile} + +* Description: The path to a text file, which contains nothing but the version number of the Bench distribution. +* Data Type: path +* Default: `res\version.txt` +* Typ: System + +### CustomConfigDir {#CustomConfigDir} + +* Description: The path to the directory with the custom configuration (`config.md`, `apps-activated.txt`, ...) +* Data Type: path +* Default: `config` +* Typ: System + +The custom configuration directory is designed in a way, that is can be easily put under version control. + +### CustomConfigFile {#CustomConfigFile} + +* Description: The path to the custom configuration file. +* Data Type: path +* Default: `$CustomConfigDir$\config.md` +* Typ: System + +The specified file must be a Markdown file and follow the [Markdown list syntax][syntax]. + +### CustomConfigTemplateFile {#CustomConfigTemplateFile} + +* Description: The path to the custom configuration template file, + which is copied during the Bench setup in case no custom configuration exists. +* Data Type: path +* Default: `res\config.template.md` +* Typ: System + +### SiteConfigFileName {#SiteConfigFileName} + +* Description: The name of the site configuration file. +* Data Type: string +* Default: `bench-site.md` +* Typ: System + +Site configuration files are searched in the Bench root directory and in all of its parents. +The specified file must be a Markdown file and follow the [Markdown list syntax][syntax]. + +### SiteConfigTemplateFile {#SiteConfigTemplateFile} + +* Description: The path to the site configuration template file, + which is copied during the Bench setup in case no site configuration exists. +* Data Type: path +* Default: `res\bench-site.template.md` +* Typ: System + +### AppIndexFile {#AppIndexFile} + +* Description: The path to a library file for all program definitions, included in Bench. +* Data Type: path +* Default: `res\apps.md` +* Typ: System + +The specified file must be a Markdown file and follow the [Markdown list syntax][syntax]. + +### AppActivationFile {#AppActivationFile} + +* Description: The path to a file with a list of activated apps. +* Data Type: path +* Default: `$CustomConfigDir$\apps-activated.txt` +* Typ: System + +The specified file must be an UTF8 encoded text file. +Every non empty line, which is not commented with a `#` is interpreted as an app ID. +Only non-space characters, up to the first space or the end of a line, are considered. + +### AppActivationTemplateFile {#AppActivationTemplateFile} + +* Description: The path to the app activation template file, + which is copied during the Bench setup in case no custom configuration exists. +* Data Type: path +* Default: `res\apps-activated.template.txt` +* Typ: System + +### AppDeactivationFile {#AppDeactivationFile} + +* Description: The path to a file with a list of deactivated apps. +* Data Type: path +* Default: `$CustomConfigDir$\apps-deactivated.txt` +* Typ: System + +The specified file must be an UTF8 encoded text file. +Every non empty line, which is not commented with a `#` is interpreted as an app ID. +Only non-space characters, up to the first space or the end of a line, are considered. + +### AppDeactivationTemplateFile {#AppDeactivationTemplateFile} + +* Description: The path to the app deactivation template file, + which is copied during the Bench setup in case no custom configuration exists. +* Data Type: path +* Default: `res\apps-deactivated.template.txt` +* Typ: System + +### CustomAppIndexFile {#CustomAppIndexFile} + +* Description: The path to a library file with custom program definitions. +* Data Type: path +* Default: `$CustomConfigDir$\apps.md` +* Typ: System + +The specified file must be a Markdown file and follow the [Markdown list syntax][syntax]. + +### CustomAppIndexTemplateFile {#CustomAppIndexTemplateFile} + +* Description: The path to the custom app library template file, + which is copied during the Bench setup in case no custom configuration exists. +* Data Type: path +* Default: `res\apps.template.md` +* Typ: System + +### ConEmuConfigFile {#ConEmuConfigFile} + +* Description: The path to the ConEmu configuration, used in the Bench Dashboard. +* Data Type: path +* Default: `$CustomConfigDir$\ConEmu.xml` +* Typ: System + +### ConEmuConfigTemplateFile {#ConEmuConfigTemplateFile} + +* Description: The path to the ConEmu configuration template file, + which is copied during the Bench setup in case no custom configuration exists. +* Data Type: path +* Default: `res\ConEmu.template.xml` +* Typ: System + +### AppResourceBaseDir {#AppResourceBaseDir} + +* Description: The path to a directory, containing additional resource files, + which are used during the execution of custom setup scripts. +* Data Type: path +* Default: `res\apps` +* Typ: System + +It is used from custom scripts to retrieve absolute paths to the additional resources. + +### ActionDir {#ActionDir} + +* Description: The path to a directory with Bench action scripts. +* Data Type: path +* Default: `actions` +* Typ: System + +Bench action scripts are typically `*.cmd` files. + +### LibDir {#LibDir} + +* Description: The path to the base directory where Bench apps are installed. +* Data Type: path +* Default: `lib` +* Typ: System + +## Customizable Properties + +Properties in this group are customizable and can be set in +`config/config.md` or in a `bench-site.md` file. + +### UseProxy {#UseProxy} + +* Description: A switch to activate the use of a HTTP(S) proxy in Bench. +* Data Type: boolean +* Possible Values: `true`, `false` +* Default: `false` +* Typ: Site + +### ProxyBypass {#ProxyBypass} + +* Description: A list with domains which are not to be contacted via proxy. +* Data Type: list of strings +* Default: `localhost` +* Typ: Site + +This property is used during the download of app resources and interpreted +by the [`System.Net.WebProxy` class](https://msdn.microsoft.com/en-us/library/system.net.webproxy.bypasslist.aspx). + +The usage in the custom scripts for apps is not completely implemented yet. + +### HttpProxy {#HttpProxy} + +* Description: The URL for the HTTP proxy. +* Data Type: URL +* Default: `http://127.0.0.1:80` +* Typ: Site + +### HttpsProxy {#HttpsProxy} + +* Description: The URL for the HTTPS proxy. +* Data Type: URL +* Default: `http://127.0.0.1:443` +* Typ: Site + +### DownloadAttempts {#DownloadAttempts} + +* Description: The number of download attempts for an app resource. +* Data Type: integer +* Default: 3 +* Typ: Site + +### ParallelDownloads {#ParallelDownloads} + +* Description: The maximal number of parallel downloads for app resources. +* Data Type: integer +* Default: 4 +* Typ: Site + +### UserName {#UserName} + +* Description: The name of the Bench user. +* Data Type: string +* Default: user +* Typ: Custom, Site + +This property is used to set the environment variable `USER_NAME` +and in custom scripts e.g. from [Git](/ref/apps/#Git). + +### UserEmail {#UserEmail} + +* Description: The email address of the Bench user. +* Data Type: string +* Default: user@localhost +* Typ: Custom, Site + +This property is used to set the environment variable `USER_EMAIL` +and in custom scripts e.g. from [Git](/ref/apps/#Git). + +### DownloadDir {#DownloadDir} + +* Description: The path to the directory where downloaded app resources are cached. +* Data Type: path +* Default: `cache` +* Typ: Custom, Site + +### AppAdornmentBaseDir {#AppAdornmentBaseDir} + +* Default: `$LibDir$\_proxies` + +### AppRegistryBaseDir {#AppRegistryBaseDir} + +* Default: `$HomeDir$\registry_isolation` + +### TempDir {#TempDir} + +* Default: `tmp` + +### LogDir {#LogDir} + +* Default: `log` + +### HomeDir {#HomeDir} + +* Default: `home` + +### AppDataDir {#AppDataDir} + +* Default: `$HomeDir$\AppData\Roaming` + +### LocalAppDataDir {#LocalAppDataDir} + +* Default: `$HomeDir$\AppData\Local` + +### OverrideHome {#OverrideHome} + +* Default: `true` + +### OverrideTemp {#OverrideTemp} + +* Default: `true` + +### IgnoreSystemPath {#IgnoreSystemPath} + +* Default: `true` + +### ProjectRootDir {#ProjectRootDir} + +* Default: `projects` + +### ProjectArchiveDir {#ProjectArchiveDir} + +* Default: `archive` + +### ProjectArchiveFormat {#ProjectArchiveFormat} + +* Default: `zip` + +### LauncherDir {#LauncherDir} + +* Default: `launcher` + +### LauncherScriptDir {#LauncherScriptDir} + +* Default: `$LibDir$\_launcher` + +### WizzardEditCustomConfigBeforeSetup {#WizzardEditCustomConfigBeforeSetup} + +* Default: `false` + +### WizzardStartAutoSetup {#WizzardStartAutoSetup} + +* Default: `true` + +### QuickAccessCmd {#QuickAccessCmd} + +* Default: `true` + +### QuickAccessPowerShell {#QuickAccessPowerShell} + +* Default: `false` + +### QuickAccessBash {#QuickAccessBash} + +* Default: `false` + +### EditorApp {#EditorApp} + +* Default: `VSCode` + +### Website {#Website} + +* Default: + +[syntax]: /ref/markup-syntax From 178530ced57c5e8851daf88305540e02fcefa9f7 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 6 Jul 2016 19:01:10 +0200 Subject: [PATCH 04/52] updated docs/ref/apps.md --- docs/content/ref/apps.md | 446 +++++++++++++++++++-------------------- 1 file changed, 223 insertions(+), 223 deletions(-) diff --git a/docs/content/ref/apps.md b/docs/content/ref/apps.md index 443dffa1..9dd03d1c 100644 --- a/docs/content/ref/apps.md +++ b/docs/content/ref/apps.md @@ -12,212 +12,212 @@ weight = 1 | ID | Name | |----|------| -| `Dev3D` | [3D Modeling](#d-modeling) | -| `DevCpp` | [C++ Development](#c-development) | -| `DevClojure` | [Clojure Development](#clojure-development) | -| `DevJava` | [Java Development](#java-development) | -| `LaTeX` | [LaTeX Writing](#latex-writing) | -| `Markdown` | [Markdown](#markdown) | -| `Multimedia` | [Multimedia](#multimedia) | -| `DevPython2` | [Python 2 Development](#python-2-development) | -| `DevPython3` | [Python 3 Development](#python-3-development) | -| `WebDevPHP5` | [Web Development with PHP 5](#web-development-with-php-5) | -| `WebDevPHP7` | [Web Development with PHP 7](#web-development-with-php-7) | +| `Dev3D` | [3D Modeling](#Dev3D) | +| `DevCpp` | [C++ Development](#DevCpp) | +| `DevClojure` | [Clojure Development](#DevClojure) | +| `DevJava` | [Java Development](#DevJava) | +| `LaTeX` | [LaTeX Writing](#LaTeX) | +| `Markdown` | [Markdown](#Markdown) | +| `Multimedia` | [Multimedia](#Multimedia) | +| `DevPython2` | [Python 2 Development](#DevPython2) | +| `DevPython3` | [Python 3 Development](#DevPython3) | +| `WebDevPHP5` | [Web Development with PHP 5](#WebDevPHP5) | +| `WebDevPHP7` | [Web Development with PHP 7](#WebDevPHP7) | **Required Apps** | ID | Name | Version | Website | |----|------|---------|---------| -| `SvZ` | [7-Zip](#zip) | 16.02 | | -| `ConEmu` | [ConEmu](#conemu) | 16.06.19 | | -| `InnoUnp` | [Inno Setup Unpacker](#inno-setup-unpacker) | 0.45 | | -| `LessMsi` | [Less MSIerables](#less-msierables) | 1.3 | | +| `SvZ` | [7-Zip](#SvZ) | 16.02 | | +| `ConEmu` | [ConEmu](#ConEmu) | 16.06.19 | | +| `InnoUnp` | [Inno Setup Unpacker](#InnoUnp) | 0.45 | | +| `LessMsi` | [Less MSIerables](#LessMsi) | 1.3 | | **Optional Apps** | ID | Name | Version | Website | |----|------|---------|---------| -| `AntRenamer` | [Ant Renamer](#ant-renamer) | latest | | -| `Apache` | [Apache](#apache) | 2.4.20 | | -| `Atom` | [Atom](#atom) | 1.8.0 | | -| `Blender` | [Blender](#blender) | 2.77 | | -| `Bower` | [Bower](#bower) | >=1.7.0 <2.0.0 | | -| `CMake` | [CMake](#cmake) | 3.5.2 | | -| `cURL` | [cURL](#curl) | 7.48.0 | | -| `Dia` | [Dia](#dia) | 0.97.2 | | -| `EclipseCpp` | [Eclipse for C++](#eclipse-for-c) | 4.5 | | -| `EclipseJava` | [Eclipse for Java](#eclipse-for-java) | 4.5 | | -| `EclipsePHP` | [Eclipse for PHP](#eclipse-for-php) | 4.5 | | -| `Emacs` | [Emacs](#emacs) | 24.5 | | -| `FFmpeg` | [FFmpeg](#ffmpeg) | 20160512-git-cd244fa | | -| `FileZilla` | [FileZilla](#filezilla) | 3.18.0 | | -| `Gimp` | [GIMP](#gimp) | 2.8.16 | | -| `Git` | [Git](#git) | 2.9.0 | | -| `GitKraken` | [GitKraken](#gitkraken) | latest | | -| `GnuTLS` | [GNU TLS](#gnu-tls) | 3.3.11 | | -| `GnuPG` | [GnuPG](#gnupg) | 2.0.30 | | -| `Go` | [Go](#go) | 1.6 | | -| `GraphicsMagick` | [Graphics Magick](#graphics-magick) | 1.3.23 | | -| `Graphviz` | [Graphviz](#graphviz) | 2.38 | | -| `Grunt` | [Grunt](#grunt) | >=0.4.5 <0.5.0 | | -| `Gulp` | [Gulp](#gulp) | >=3.9.0 <4.0.0 | | -| `Hugo` | [Hugo](#hugo) | 0.16 | | -| `Inkscape` | [Inkscape](#inkscape) | 0.91-1 | | -| `IPython2` | [IPython 2](#ipython-2) | latest | | -| `IPython3` | [IPython 3](#ipython-3) | latest | | -| `JabRef` | [JabRef](#jabref) | 3.3 | | -| `JDK7` | [Java Development Kit 7](#java-development-kit-7) | 7u80 | | -| `JDK8` | [Java Development Kit 8](#java-development-kit-8) | 8u92 | | -| `JRE7` | [Java Runtime Environment 7](#java-runtime-environment-7) | 7u80 | | -| `JRE8` | [Java Runtime Environment 8](#java-runtime-environment-8) | 8u92 | | -| `JSHint` | [JSHint](#jshint) | >=2.8.0 <3.0.0 | | -| `Leiningen` | [Leiningen](#leiningen) | latest | | -| `LightTable` | [LightTable](#lighttable) | 0.8.1 | | -| `Clang` | [LLVM Clang](#llvm-clang) | 3.8.0 | | -| `Maven` | [Maven](#maven) | 3.3.9 | | -| `MeshLab` | [MeshLab](#meshlab) | 1.3.3 | | -| `MiKTeX` | [MiKTeX](#miktex) | 2.9.5987 | | -| `MinGW` | [MinGW](#mingw) | latest | | -| `MinGwGet` | [MinGwGet](#mingwget) | 0.6.2 | | -| `MinGwGetGui` | [MinGwGetGui](#mingwgetgui) | latest | | -| `MySQL` | [MySQL](#mysql) | 5.7.12 | | -| `MySQLWB` | [MySQL Workbench](#mysql-workbench) | 6.3.6 | | -| `Node` | [Node.js](#node.js) | 4.4.6 | | -| `Npm` | [NPM](#npm) | >=3.7.0 <4.0.0 | | -| `NuGet` | [NuGet](#nuget) | latest | | -| `OpenSSL` | [OpenSSL](#openssl) | 1.0.2h | | -| `Pandoc` | [Pandoc](#pandoc) | 1.17.1 | | -| `PHP5` | [PHP 5](#php-5) | 5.6.21 | | -| `PHP7` | [PHP 7](#php-7) | 7.0.6 | | -| `PostgreSQL` | [PostgreSQL](#postgresql) | 9.5.3-1 | | -| `Putty` | [Putty](#putty) | latest | | -| `PyReadline2` | [PyReadline (Python 2)](#pyreadline-python-2) | latest | | -| `PyReadline3` | [PyReadline (Python 3)](#pyreadline-python-3) | latest | | -| `Python2` | [Python 2](#python-2) | 2.7.11 | | -| `Python3` | [Python 3](#python-3) | 3.4.4 | | -| `Ruby` | [Ruby](#ruby) | 2.2.4 | | -| `Sass` | [SASS](#sass) | latest | | -| `Sift` | [Sift](#sift) | 0.8.0 | | -| `Spacemacs` | [Spacemacs](#spacemacs) | latest | | -| `SublimeText3` | [Sublime Text 3](#sublime-text-3) | Build 3114 | | -| `Iron` | [SWare Iron](#sware-iron) | latest | | -| `SysInternals` | [SysInternals](#sysinternals) | latest | | -| `TeXnicCenter` | [TeXnicCenter](#texniccenter) | 2.02 | | -| `Vim` | [Vim](#vim) | 7.4 | | -| `VimConsole` | [VimConsole](#vimconsole) | 7.4 | | -| `VimRT` | [VimRT](#vimrt) | 7.4 | | -| `VSCode` | [Visual Studio Code](#visual-studio-code) | latest | | -| `VLC` | [VLC Player](#vlc-player) | 2.2.4 | | -| `Wget` | [Wget](#wget) | 1.11.4-1 | | -| `WgetDeps` | [WgetDeps](#wgetdeps) | 1.11.4-1 | | -| `WinMerge` | [WinMerge](#winmerge) | 2.14.0 | | -| `Yeoman` | [Yeoman](#yeoman) | >=1.5.0 <2.0.0 | | -| `MdProc` | [Yeoman Generator for Markdown Projects](#yeoman-generator-for-markdown-projects) | >=0.1.6 <0.2.0 | | -| `Zeal` | [Zeal Docs](#zeal-docs) | 0.2.1 | | +| `AntRenamer` | [Ant Renamer](#AntRenamer) | latest | | +| `Apache` | [Apache](#Apache) | 2.4.20 | | +| `Atom` | [Atom](#Atom) | 1.8.0 | | +| `Blender` | [Blender](#Blender) | 2.77 | | +| `Bower` | [Bower](#Bower) | >=1.7.0 <2.0.0 | | +| `CMake` | [CMake](#CMake) | 3.5.2 | | +| `cURL` | [cURL](#cURL) | 7.48.0 | | +| `Dia` | [Dia](#Dia) | 0.97.2 | | +| `EclipseCpp` | [Eclipse for C++](#EclipseCpp) | 4.5 | | +| `EclipseJava` | [Eclipse for Java](#EclipseJava) | 4.5 | | +| `EclipsePHP` | [Eclipse for PHP](#EclipsePHP) | 4.5 | | +| `Emacs` | [Emacs](#Emacs) | 24.5 | | +| `FFmpeg` | [FFmpeg](#FFmpeg) | 20160512-git-cd244fa | | +| `FileZilla` | [FileZilla](#FileZilla) | 3.18.0 | | +| `Gimp` | [GIMP](#Gimp) | 2.8.16 | | +| `Git` | [Git](#Git) | 2.9.0 | | +| `GitKraken` | [GitKraken](#GitKraken) | latest | | +| `GnuTLS` | [GNU TLS](#GnuTLS) | 3.3.11 | | +| `GnuPG` | [GnuPG](#GnuPG) | 2.0.30 | | +| `Go` | [Go](#Go) | 1.6 | | +| `GraphicsMagick` | [Graphics Magick](#GraphicsMagick) | 1.3.23 | | +| `Graphviz` | [Graphviz](#Graphviz) | 2.38 | | +| `Grunt` | [Grunt](#Grunt) | >=0.4.5 <0.5.0 | | +| `Gulp` | [Gulp](#Gulp) | >=3.9.0 <4.0.0 | | +| `Hugo` | [Hugo](#Hugo) | 0.16 | | +| `Inkscape` | [Inkscape](#Inkscape) | 0.91-1 | | +| `IPython2` | [IPython 2](#IPython2) | latest | | +| `IPython3` | [IPython 3](#IPython3) | latest | | +| `JabRef` | [JabRef](#JabRef) | 3.3 | | +| `JDK7` | [Java Development Kit 7](#JDK7) | 7u80 | | +| `JDK8` | [Java Development Kit 8](#JDK8) | 8u92 | | +| `JRE7` | [Java Runtime Environment 7](#JRE7) | 7u80 | | +| `JRE8` | [Java Runtime Environment 8](#JRE8) | 8u92 | | +| `JSHint` | [JSHint](#JSHint) | >=2.8.0 <3.0.0 | | +| `Leiningen` | [Leiningen](#Leiningen) | latest | | +| `LightTable` | [LightTable](#LightTable) | 0.8.1 | | +| `Clang` | [LLVM Clang](#Clang) | 3.8.0 | | +| `Maven` | [Maven](#Maven) | 3.3.9 | | +| `MeshLab` | [MeshLab](#MeshLab) | 1.3.3 | | +| `MiKTeX` | [MiKTeX](#MiKTeX) | 2.9.5987 | | +| `MinGW` | [MinGW](#MinGW) | latest | | +| `MinGwGet` | [MinGwGet](#MinGwGet) | 0.6.2 | | +| `MinGwGetGui` | [MinGwGetGui](#MinGwGetGui) | latest | | +| `MySQL` | [MySQL](#MySQL) | 5.7.12 | | +| `MySQLWB` | [MySQL Workbench](#MySQLWB) | 6.3.6 | | +| `Node` | [Node.js](#Node) | 6.2.2 | | +| `Npm` | [NPM](#Npm) | >=3.7.0 <4.0.0 | | +| `NuGet` | [NuGet](#NuGet) | latest | | +| `OpenSSL` | [OpenSSL](#OpenSSL) | 1.0.2h | | +| `Pandoc` | [Pandoc](#Pandoc) | 1.17.1 | | +| `PHP5` | [PHP 5](#PHP5) | 5.6.21 | | +| `PHP7` | [PHP 7](#PHP7) | 7.0.6 | | +| `PostgreSQL` | [PostgreSQL](#PostgreSQL) | 9.5.3-1 | | +| `Putty` | [Putty](#Putty) | latest | | +| `PyReadline2` | [PyReadline (Python 2)](#PyReadline2) | latest | | +| `PyReadline3` | [PyReadline (Python 3)](#PyReadline3) | latest | | +| `Python2` | [Python 2](#Python2) | 2.7.11 | | +| `Python3` | [Python 3](#Python3) | 3.4.4 | | +| `Ruby` | [Ruby](#Ruby) | 2.2.4 | | +| `Sass` | [SASS](#Sass) | latest | | +| `Sift` | [Sift](#Sift) | 0.8.0 | | +| `Spacemacs` | [Spacemacs](#Spacemacs) | latest | | +| `SublimeText3` | [Sublime Text 3](#SublimeText3) | Build 3114 | | +| `Iron` | [SWare Iron](#Iron) | latest | | +| `SysInternals` | [SysInternals](#SysInternals) | latest | | +| `TeXnicCenter` | [TeXnicCenter](#TeXnicCenter) | 2.02 | | +| `Vim` | [Vim](#Vim) | 7.4 | | +| `VimConsole` | [VimConsole](#VimConsole) | 7.4 | | +| `VimRT` | [VimRT](#VimRT) | 7.4 | | +| `VSCode` | [Visual Studio Code](#VSCode) | latest | | +| `VLC` | [VLC Player](#VLC) | 2.2.4 | | +| `Wget` | [Wget](#Wget) | 1.11.4-1 | | +| `WgetDeps` | [WgetDeps](#WgetDeps) | 1.11.4-1 | | +| `WinMerge` | [WinMerge](#WinMerge) | 2.14.0 | | +| `Yeoman` | [Yeoman](#Yeoman) | >=1.5.0 <2.0.0 | | +| `MdProc` | [Yeoman Generator for Markdown Projects](#MdProc) | >=0.1.6 <0.2.0 | | +| `Zeal` | [Zeal Docs](#Zeal) | 0.2.1 | | ## Groups -### 3D Modeling +### 3D Modeling {#Dev3D} * ID: `Dev3D` * Typ: `meta` * Version: latest -* Dependencies: `Blender`, `MeshLab`, `Gimp` +* Dependencies: [Blender](#Blender), [MeshLab](#MeshLab), [GIMP](#Gimp) -### C++ Development +### C++ Development {#DevCpp} * ID: `DevCpp` * Typ: `meta` * Version: latest -* Dependencies: `MinGW`, `EclipseCpp` +* Dependencies: [MinGW](#MinGW), [Eclipse for C++](#EclipseCpp) -### Clojure Development +### Clojure Development {#DevClojure} * ID: `DevClojure` * Typ: `meta` * Version: latest -* Dependencies: `Maven`, `Leiningen`, `LightTable` +* Dependencies: [Maven](#Maven), [Leiningen](#Leiningen), [LightTable](#LightTable) -### Java Development +### Java Development {#DevJava} * ID: `DevJava` * Typ: `meta` * Version: latest -* Dependencies: `JDK8`, `Maven`, `EclipseJava` +* Dependencies: [Java Development Kit 8](#JDK8), [Maven](#Maven), [Eclipse for Java](#EclipseJava) -### LaTeX Writing +### LaTeX Writing {#LaTeX} * ID: `LaTeX` * Typ: `meta` * Version: latest -* Dependencies: `MiKTeX`, `JabRef`, `TeXnicCenter` +* Dependencies: [MiKTeX](#MiKTeX), [JabRef](#JabRef), [TeXnicCenter](#TeXnicCenter) -### Markdown +### Markdown {#Markdown} * ID: `Markdown` * Typ: `meta` * Version: latest -* Dependencies: `MdProc`, `VSCode` +* Dependencies: [Yeoman Generator for Markdown Projects](#MdProc), [Visual Studio Code](#VSCode) -### Multimedia +### Multimedia {#Multimedia} * ID: `Multimedia` * Typ: `meta` * Version: latest -* Dependencies: `Inkscape`, `Dia`, `Gimp`, `Pandoc`, `MiKTeX`, `GraphicsMagick`, `Graphviz`, `FFmpeg`, `VLC`, `Blender` +* Dependencies: [Inkscape](#Inkscape), [Dia](#Dia), [GIMP](#Gimp), [Pandoc](#Pandoc), [MiKTeX](#MiKTeX), [Graphics Magick](#GraphicsMagick), [Graphviz](#Graphviz), [FFmpeg](#FFmpeg), [VLC Player](#VLC), [Blender](#Blender) -### Python 2 Development +### Python 2 Development {#DevPython2} * ID: `DevPython2` * Typ: `meta` * Version: latest -* Dependencies: `Python2`, `SublimeText3`, `IPython2` +* Dependencies: [Python 2](#Python2), [Sublime Text 3](#SublimeText3), [IPython 2](#IPython2) -### Python 3 Development +### Python 3 Development {#DevPython3} * ID: `DevPython3` * Typ: `meta` * Version: latest -* Dependencies: `Python3`, `SublimeText3`, `IPython3` +* Dependencies: [Python 3](#Python3), [Sublime Text 3](#SublimeText3), [IPython 3](#IPython3) -### Web Development with PHP 5 +### Web Development with PHP 5 {#WebDevPHP5} * ID: `WebDevPHP5` * Typ: `meta` * Version: latest -* Dependencies: `PHP5`, `MySQL`, `MySQLWB`, `Apache`, `EclipsePHP` +* Dependencies: [PHP 5](#PHP5), [MySQL](#MySQL), [MySQL Workbench](#MySQLWB), [Apache](#Apache), [Eclipse for PHP](#EclipsePHP) -### Web Development with PHP 7 +### Web Development with PHP 7 {#WebDevPHP7} * ID: `WebDevPHP7` * Typ: `meta` * Version: latest -* Dependencies: `PHP7`, `MySQL`, `MySQLWB`, `Apache`, `EclipsePHP` +* Dependencies: [PHP 7](#PHP7), [MySQL](#MySQL), [MySQL Workbench](#MySQLWB), [Apache](#Apache), [Eclipse for PHP](#EclipsePHP) ## Required Apps -### 7-Zip +### 7-Zip {#SvZ} * ID: `SvZ` * Typ: `default` * Website: * Version: 16.02 -### ConEmu +### ConEmu {#ConEmu} * ID: `ConEmu` * Typ: `default` * Website: * Version: 16.06.19 -### Inno Setup Unpacker +### Inno Setup Unpacker {#InnoUnp} * ID: `InnoUnp` * Typ: `default` * Website: * Version: 0.45 -### Less MSIerables +### Less MSIerables {#LessMsi} * ID: `LessMsi` * Typ: `default` @@ -226,561 +226,561 @@ weight = 1 ## Optional Apps -### Ant Renamer +### Ant Renamer {#AntRenamer} * ID: `AntRenamer` * Typ: `default` * Website: * Version: latest -### Apache +### Apache {#Apache} * ID: `Apache` * Typ: `default` * Website: * Version: 2.4.20 -### Atom +### Atom {#Atom} * ID: `Atom` * Typ: `default` * Website: * Version: 1.8.0 -### Blender +### Blender {#Blender} * ID: `Blender` * Typ: `default` * Website: * Version: 2.77 -### Bower +### Bower {#Bower} * ID: `Bower` * Typ: `node-package` * Website: * Version: >=1.7.0 <2.0.0 -* Dependencies: `Git`, `Npm` +* Dependencies: [Git](#Git), [NPM](#Npm) -### CMake +### CMake {#CMake} * ID: `CMake` * Typ: `default` * Website: * Version: 3.5.2 -### cURL +### cURL {#cURL} * ID: `cURL` * Typ: `default` * Website: * Version: 7.48.0 -### Dia +### Dia {#Dia} * ID: `Dia` * Typ: `default` * Website: * Version: 0.97.2 -### Eclipse for C++ +### Eclipse for C++ {#EclipseCpp} * ID: `EclipseCpp` * Typ: `default` * Website: * Version: 4.5 -* Dependencies: `JRE8` +* Dependencies: [Java Runtime Environment 8](#JRE8) -### Eclipse for Java +### Eclipse for Java {#EclipseJava} * ID: `EclipseJava` * Typ: `default` * Website: * Version: 4.5 -* Dependencies: `JRE8` +* Dependencies: [Java Runtime Environment 8](#JRE8) -### Eclipse for PHP +### Eclipse for PHP {#EclipsePHP} * ID: `EclipsePHP` * Typ: `default` * Website: * Version: 4.5 -* Dependencies: `JRE8` +* Dependencies: [Java Runtime Environment 8](#JRE8) -### Emacs +### Emacs {#Emacs} * ID: `Emacs` * Typ: `default` * Website: * Version: 24.5 -* Dependencies: `GnuTLS` +* Dependencies: [GNU TLS](#GnuTLS) -### FFmpeg +### FFmpeg {#FFmpeg} * ID: `FFmpeg` * Typ: `default` * Website: * Version: 20160512-git-cd244fa -### FileZilla +### FileZilla {#FileZilla} * ID: `FileZilla` * Typ: `default` * Website: * Version: 3.18.0 -### GIMP +### GIMP {#Gimp} * ID: `Gimp` * Typ: `default` * Website: * Version: 2.8.16 -### Git +### Git {#Git} * ID: `Git` * Typ: `default` * Website: * Version: 2.9.0 -### GitKraken +### GitKraken {#GitKraken} * ID: `GitKraken` * Typ: `default` * Website: * Version: latest -### GNU TLS +### GNU TLS {#GnuTLS} * ID: `GnuTLS` * Typ: `default` * Website: * Version: 3.3.11 -### GnuPG +### GnuPG {#GnuPG} * ID: `GnuPG` * Typ: `default` * Website: * Version: 2.0.30 -### Go +### Go {#Go} * ID: `Go` * Typ: `default` * Website: * Version: 1.6 -### Graphics Magick +### Graphics Magick {#GraphicsMagick} * ID: `GraphicsMagick` * Typ: `default` * Website: * Version: 1.3.23 -### Graphviz +### Graphviz {#Graphviz} * ID: `Graphviz` * Typ: `default` * Website: * Version: 2.38 -### Grunt +### Grunt {#Grunt} * ID: `Grunt` * Typ: `node-package` * Website: * Version: >=0.4.5 <0.5.0 -* Dependencies: `Npm` +* Dependencies: [NPM](#Npm) -### Gulp +### Gulp {#Gulp} * ID: `Gulp` * Typ: `node-package` * Website: * Version: >=3.9.0 <4.0.0 -* Dependencies: `Npm` +* Dependencies: [NPM](#Npm) -### Hugo +### Hugo {#Hugo} * ID: `Hugo` * Typ: `default` * Website: * Version: 0.16 -### Inkscape +### Inkscape {#Inkscape} * ID: `Inkscape` * Typ: `default` * Website: * Version: 0.91-1 -### IPython 2 +### IPython 2 {#IPython2} * ID: `IPython2` * Typ: `python2-package` * Website: * Version: latest -* Dependencies: `PyReadline2`, `Python2` +* Dependencies: [PyReadline (Python 2)](#PyReadline2), [Python 2](#Python2) -### IPython 3 +### IPython 3 {#IPython3} * ID: `IPython3` * Typ: `python3-package` * Website: * Version: latest -* Dependencies: `PyReadline3`, `Python3` +* Dependencies: [PyReadline (Python 3)](#PyReadline3), [Python 3](#Python3) -### JabRef +### JabRef {#JabRef} * ID: `JabRef` * Typ: `default` * Website: * Version: 3.3 -* Dependencies: `JRE8` +* Dependencies: [Java Runtime Environment 8](#JRE8) -### Java Development Kit 7 +### Java Development Kit 7 {#JDK7} * ID: `JDK7` * Typ: `default` * Website: * Version: 7u80 -### Java Development Kit 8 +### Java Development Kit 8 {#JDK8} * ID: `JDK8` * Typ: `default` * Website: * Version: 8u92 -### Java Runtime Environment 7 +### Java Runtime Environment 7 {#JRE7} * ID: `JRE7` * Typ: `default` * Website: * Version: 7u80 -### Java Runtime Environment 8 +### Java Runtime Environment 8 {#JRE8} * ID: `JRE8` * Typ: `default` * Website: * Version: 8u92 -### JSHint +### JSHint {#JSHint} * ID: `JSHint` * Typ: `node-package` * Website: * Version: >=2.8.0 <3.0.0 -* Dependencies: `Npm` +* Dependencies: [NPM](#Npm) -### Leiningen +### Leiningen {#Leiningen} * ID: `Leiningen` * Typ: `default` * Website: * Version: latest -* Dependencies: `JDK8`, `GnuPG`, `Wget` +* Dependencies: [Java Development Kit 8](#JDK8), [GnuPG](#GnuPG), [Wget](#Wget) -### LightTable +### LightTable {#LightTable} * ID: `LightTable` * Typ: `default` * Website: * Version: 0.8.1 -### LLVM Clang +### LLVM Clang {#Clang} * ID: `Clang` * Typ: `default` * Website: * Version: 3.8.0 -### Maven +### Maven {#Maven} * ID: `Maven` * Typ: `default` * Website: * Version: 3.3.9 -* Dependencies: `JRE8`, `GnuPG` +* Dependencies: [Java Runtime Environment 8](#JRE8), [GnuPG](#GnuPG) -### MeshLab +### MeshLab {#MeshLab} * ID: `MeshLab` * Typ: `default` * Website: * Version: 1.3.3 -### MiKTeX +### MiKTeX {#MiKTeX} * ID: `MiKTeX` * Typ: `default` * Website: * Version: 2.9.5987 -### MinGW +### MinGW {#MinGW} * ID: `MinGW` * Typ: `meta` * Website: * Version: latest -* Dependencies: `MinGwGet`, `MinGwGetGui` +* Dependencies: [MinGwGet](#MinGwGet), [MinGwGetGui](#MinGwGetGui) -### MinGwGet +### MinGwGet {#MinGwGet} * ID: `MinGwGet` * Typ: `default` * Version: 0.6.2 -* Dependencies: `Wget` +* Dependencies: [Wget](#Wget) -### MinGwGetGui +### MinGwGetGui {#MinGwGetGui} * ID: `MinGwGetGui` * Typ: `default` * Version: latest -* Dependencies: `MinGwGet` +* Dependencies: [MinGwGet](#MinGwGet) -### MySQL +### MySQL {#MySQL} * ID: `MySQL` * Typ: `default` * Website: * Version: 5.7.12 -### MySQL Workbench +### MySQL Workbench {#MySQLWB} * ID: `MySQLWB` * Typ: `default` * Website: * Version: 6.3.6 -### Node.js +### Node.js {#Node} * ID: `Node` * Typ: `default` * Website: -* Version: 4.4.6 +* Version: 6.2.2 -### NPM +### NPM {#Npm} * ID: `Npm` * Typ: `default` * Website: * Version: >=3.7.0 <4.0.0 -* Dependencies: `Node` +* Dependencies: [Node.js](#Node) -### NuGet +### NuGet {#NuGet} * ID: `NuGet` * Typ: `default` * Website: * Version: latest -### OpenSSL +### OpenSSL {#OpenSSL} * ID: `OpenSSL` * Typ: `default` * Website: * Version: 1.0.2h -### Pandoc +### Pandoc {#Pandoc} * ID: `Pandoc` * Typ: `default` * Website: * Version: 1.17.1 -### PHP 5 +### PHP 5 {#PHP5} * ID: `PHP5` * Typ: `default` * Website: * Version: 5.6.21 -### PHP 7 +### PHP 7 {#PHP7} * ID: `PHP7` * Typ: `default` * Website: * Version: 7.0.6 -### PostgreSQL +### PostgreSQL {#PostgreSQL} * ID: `PostgreSQL` * Typ: `default` * Website: * Version: 9.5.3-1 -### Putty +### Putty {#Putty} * ID: `Putty` * Typ: `default` * Website: * Version: latest -### PyReadline (Python 2) +### PyReadline (Python 2) {#PyReadline2} * ID: `PyReadline2` * Typ: `python2-package` * Website: * Version: latest -* Dependencies: `Python2` +* Dependencies: [Python 2](#Python2) -### PyReadline (Python 3) +### PyReadline (Python 3) {#PyReadline3} * ID: `PyReadline3` * Typ: `python3-package` * Website: * Version: latest -* Dependencies: `Python3` +* Dependencies: [Python 3](#Python3) -### Python 2 +### Python 2 {#Python2} * ID: `Python2` * Typ: `default` * Website: * Version: 2.7.11 -### Python 3 +### Python 3 {#Python3} * ID: `Python3` * Typ: `default` * Website: * Version: 3.4.4 -### Ruby +### Ruby {#Ruby} * ID: `Ruby` * Typ: `default` * Website: * Version: 2.2.4 -### SASS +### SASS {#Sass} * ID: `Sass` * Typ: `ruby-package` * Website: * Version: latest -* Dependencies: `Ruby` +* Dependencies: [Ruby](#Ruby) -### Sift +### Sift {#Sift} * ID: `Sift` * Typ: `default` * Website: * Version: 0.8.0 -### Spacemacs +### Spacemacs {#Spacemacs} * ID: `Spacemacs` * Typ: `meta` * Website: * Version: latest -* Dependencies: `Git`, `Emacs` +* Dependencies: [Git](#Git), [Emacs](#Emacs) -### Sublime Text 3 +### Sublime Text 3 {#SublimeText3} * ID: `SublimeText3` * Typ: `default` * Website: * Version: Build 3114 -### SWare Iron +### SWare Iron {#Iron} * ID: `Iron` * Typ: `default` * Website: * Version: latest -### SysInternals +### SysInternals {#SysInternals} * ID: `SysInternals` * Typ: `default` * Website: * Version: latest -### TeXnicCenter +### TeXnicCenter {#TeXnicCenter} * ID: `TeXnicCenter` * Typ: `default` * Website: * Version: 2.02 -* Dependencies: `MiKTeX` +* Dependencies: [MiKTeX](#MiKTeX) -### Vim +### Vim {#Vim} * ID: `Vim` * Typ: `default` * Website: * Version: 7.4 -* Dependencies: `VimRT`, `VimConsole` +* Dependencies: [VimRT](#VimRT), [VimConsole](#VimConsole) -### VimConsole +### VimConsole {#VimConsole} * ID: `VimConsole` * Typ: `default` * Version: 7.4 -* Dependencies: `VimRT` +* Dependencies: [VimRT](#VimRT) -### VimRT +### VimRT {#VimRT} * ID: `VimRT` * Typ: `default` * Version: 7.4 -### Visual Studio Code +### Visual Studio Code {#VSCode} * ID: `VSCode` * Typ: `default` * Website: * Version: latest -### VLC Player +### VLC Player {#VLC} * ID: `VLC` * Typ: `default` * Website: * Version: 2.2.4 -### Wget +### Wget {#Wget} * ID: `Wget` * Typ: `default` * Website: * Version: 1.11.4-1 -* Dependencies: `WgetDeps` +* Dependencies: [WgetDeps](#WgetDeps) -### WgetDeps +### WgetDeps {#WgetDeps} * ID: `WgetDeps` * Typ: `default` * Version: 1.11.4-1 -### WinMerge +### WinMerge {#WinMerge} * ID: `WinMerge` * Typ: `default` * Website: * Version: 2.14.0 -### Yeoman +### Yeoman {#Yeoman} * ID: `Yeoman` * Typ: `node-package` * Website: * Version: >=1.5.0 <2.0.0 -* Dependencies: `Npm` +* Dependencies: [NPM](#Npm) -### Yeoman Generator for Markdown Projects +### Yeoman Generator for Markdown Projects {#MdProc} * ID: `MdProc` * Typ: `node-package` * Website: * Version: >=0.1.6 <0.2.0 -* Dependencies: `Yeoman`, `Gulp`, `Pandoc`, `Graphviz`, `Inkscape`, `MiKTeX`, `Npm` +* Dependencies: [Yeoman](#Yeoman), [Gulp](#Gulp), [Pandoc](#Pandoc), [Graphviz](#Graphviz), [Inkscape](#Inkscape), [MiKTeX](#MiKTeX), [NPM](#Npm) -### Zeal Docs +### Zeal Docs {#Zeal} * ID: `Zeal` * Typ: `default` From e28590da411514c153865bfc79035f29b235bde8 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Thu, 7 Jul 2016 14:23:46 +0200 Subject: [PATCH 05/52] fixed typo in env.cmd generation (fixes #71) --- BenchManager/BenchLib/BenchEnvironment.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BenchManager/BenchLib/BenchEnvironment.cs b/BenchManager/BenchLib/BenchEnvironment.cs index c4668750..b68e323c 100644 --- a/BenchManager/BenchLib/BenchEnvironment.cs +++ b/BenchManager/BenchLib/BenchEnvironment.cs @@ -101,9 +101,9 @@ public void WriteEnvironmentFile() w.WriteLine(); if (Config.GetBooleanValue(PropertyKeys.UseProxy)) { - w.WriteLine("SET HTTP_PROPXY={0}", + w.WriteLine("SET HTTP_PROXY={0}", Config.GetStringValue(PropertyKeys.HttpProxy).TrimEnd('/')); - w.WriteLine("SET HTTPS_PROPXY={0}", + w.WriteLine("SET HTTPS_PROXY={0}", Config.GetStringValue(PropertyKeys.HttpsProxy).TrimEnd('/')); } if (Config.GetBooleanValue(PropertyKeys.OverrideHome)) From 3414caf0e56a54676ce1539ccc38da9d932248b5 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Thu, 7 Jul 2016 14:33:44 +0200 Subject: [PATCH 06/52] fixed scrollbar issue in the main menu bar with low screen height --- docs/src-static/css/custom.css | 6 ++++++ docs/static/css/style.min.css | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/src-static/css/custom.css b/docs/src-static/css/custom.css index cab58076..4d2aec41 100644 --- a/docs/src-static/css/custom.css +++ b/docs/src-static/css/custom.css @@ -59,6 +59,12 @@ article.teaser h2 { text-align: right; } +@media (max-height: 48em) { + #menu { + width: 165px; + } +} + @media (max-width: 48em) { .list-item-description:before { content: ""; diff --git a/docs/static/css/style.min.css b/docs/static/css/style.min.css index fcb5e882..8559db8c 100644 --- a/docs/static/css/style.min.css +++ b/docs/static/css/style.min.css @@ -19,4 +19,4 @@ https://github.com/yahoo/pure/blob/master/LICENSE.md */.pure-menu{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.pure-menu-fixed{position:fixed;left:0;top:0;z-index:3}.fa-ul>li,.pure-menu-item,.pure-menu-list{position:relative}.pure-menu-list{list-style:none;margin:0;padding:0}.pure-menu-item{padding:0;margin:0;height:100%}.fa.fa-pull-left,.fa.pull-left{margin-right:.3em}.pure-menu-heading,.pure-menu-link{display:block;text-decoration:none;white-space:nowrap}.fa,.fa-stack{display:inline-block}/*! * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:FontAwesome;src:url(../fonts/fontawesome-webfont.eot?v=4.6.3);src:url(../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3) format('embedded-opentype'),url(../fonts/fontawesome-webfont.woff2?v=4.6.3) format('woff2'),url(../fonts/fontawesome-webfont.woff?v=4.6.3) format('woff'),url(../fonts/fontawesome-webfont.ttf?v=4.6.3) format('truetype'),url(../fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa.fa-pull-right,.fa.pull-right{margin-left:.3em}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right,.pull-right{float:right}.pull-left{float:left}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.hljs{display:block;overflow-x:auto;padding:.5em;color:#333;background:#f8f8f8}.hljs-comment,.hljs-quote{color:#998;font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:#333;font-weight:700}.hljs-literal,.hljs-number,.hljs-tag .hljs-attr,.hljs-template-variable,.hljs-variable{color:teal}.hljs-doctag,.hljs-string{color:#d14}.hljs-section,.hljs-selector-id,.hljs-title{color:#900;font-weight:700}.hljs-subst{font-weight:400}.hljs-class .hljs-title,.hljs-type{color:#458;font-weight:700}.hljs-attribute,.hljs-name,.hljs-tag{color:navy;font-weight:400}.hljs-meta,.hljs-strong{font-weight:700}.hljs-link,.hljs-regexp{color:#009926}.hljs-bullet,.hljs-symbol{color:#990073}.hljs-built_in,.hljs-builtin-name{color:#0086b3}.hljs-meta{color:#999}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.hljs-emphasis{font-style:italic}body{color:#777}.pure-img-responsive{max-width:100%;height:auto}#layout,#menu,.menu-link{-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}#layout{position:relative;padding-left:0}#layout.active #menu{left:150px;width:150px}#layout.active .menu-link{left:150px}#menu,.menu-link{position:fixed;top:0;left:0}.content{margin:0 auto 50px;padding:0 2em;max-width:800px;line-height:1.6em}.header{margin:0;color:#333;padding:2.5em 2em 0;border-bottom:1px solid #eee;font-family:Raleway,Helvetica,Arial,sans-serif}.header h1{margin:.2em 0;font-size:3em;font-weight:300}.header h2{font-weight:300;color:#ccc;padding:0;margin-top:0}.content-subhead{margin:50px 0 20px;font-weight:300;color:#888}#menu{margin-left:-150px;width:150px;bottom:0;z-index:1000;background:#191818;overflow-y:auto;-webkit-overflow-scrolling:touch}#menu a{color:#999;border:none;padding:.6em 0 .6em .6em}#menu .pure-menu,#menu .pure-menu ul{border:none;background:0 0}#menu .pure-menu .menu-item-divided,#menu .pure-menu ul{border-top:1px solid #333}#menu .pure-menu li a:focus,#menu .pure-menu li a:hover{background:#333}#menu .pure-menu-heading,#menu .pure-menu-selected{background:#1f8dd6}#menu .pure-menu-selected a{color:#fff}#menu .pure-menu-heading{font-size:110%;color:#fff;margin:0}.menu-link{display:block;background:#000;background:rgba(0,0,0,.7);font-size:10px;z-index:10;width:2em;height:auto;padding:2.1em 1.6em}.menu-link:focus,.menu-link:hover{background:#000}.menu-link span{position:relative;display:block}.menu-link span,.menu-link span:after,.menu-link span:before{background-color:#fff;width:100%;height:.2em}.menu-link span:after,.menu-link span:before{position:absolute;margin-top:-.6em;content:" "}.menu-link span:after{margin-top:.6em}@media (min-width:48em){.content,.header{padding-left:2em;padding-right:2em}#layout{padding-left:150px;left:0}#layout.active .menu-link,#menu,.menu-link{left:150px}.menu-link{position:fixed;display:none}}a{color:#3b8bba;text-decoration:none}.pagination a,a:visited{color:#265778}a:focus,a:hover{text-decoration:underline}.small-print{font-size:.8em;margin:.6em}.post-meta{font-size:90%}article>footer{text-align:right}.prev-next-post{margin-top:2em;padding-top:2em;padding-bottom:2em;border-top:1px solid #eee;border-bottom:1px solid #eee}.prev-next-post .prev{float:left;text-align:left;overflow:hidden}.prev-next-post .next{float:right;text-align:right;overflow:hidden}#menu .pure-menu{font-size:.9em}i{display:inline-block;margin-right:.2em}.pagination{text-align:center;margin-top:3em}#menu .brand{font-family:Raleway;letter-spacing:.1em;background:0 0;text-decoration:none;font-weight:400;font-size:1.3em;margin:0}.content table{margin-top:1em;border:1px solid #cbcbcb}.content table thead{background-color:#e0e0e0;color:#000}.content table thead td,.content table thead th{border-bottom:1ps solid #cbcbcb}.content table td,.content table th{padding:.33em .66em;border-left:1px solid #cbcbcb;border-right:1px solid #cbcbcb}.content table tr:nth-child(even){background-color:#f2f2f2}.list-item-description:before{content:"\00A0\2013\00A0"}article.teaser h2{text-align:left;margin-left:160px;font-weight:400;font-size:1.75em;transition:margin-left .2s ease-out;-webkit-transition:margin-left .2s ease-out}.teaser-icon{clear:left;float:left}.teaser-icon .fa{font-size:128px;transition:font-size .2s ease-out;-webkit-transition:font-size .2s ease-out}.teaser-text{margin-left:160px;transition:margin-left .2s ease-out;-webkit-transition:margin-left .2s ease-out}.teaser-text p:last-of-type{margin-bottom:0}.teaser-follow-up{text-align:right}@media (max-width:48em){#layout.active{position:relative;left:150px}.teaser-text,article.teaser h2{margin-left:120px}.list-item-description:before{content:""}.list-item-description{display:block}.teaser-icon .fa{font-size:96px}}@media (max-width:30em){.list-item-description{display:none}article.teaser h2{margin-left:0;margin-top:0;text-align:center}.teaser-icon{float:none;text-align:center;margin:1em 0}.teaser-icon .fa{font-size:64px}.teaser-text{margin-left:inherit}} \ No newline at end of file + */@font-face{font-family:FontAwesome;src:url(../fonts/fontawesome-webfont.eot?v=4.6.3);src:url(../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3) format('embedded-opentype'),url(../fonts/fontawesome-webfont.woff2?v=4.6.3) format('woff2'),url(../fonts/fontawesome-webfont.woff?v=4.6.3) format('woff'),url(../fonts/fontawesome-webfont.ttf?v=4.6.3) format('truetype'),url(../fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa.fa-pull-right,.fa.pull-right{margin-left:.3em}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right,.pull-right{float:right}.pull-left{float:left}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.hljs{display:block;overflow-x:auto;padding:.5em;color:#333;background:#f8f8f8}.hljs-comment,.hljs-quote{color:#998;font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:#333;font-weight:700}.hljs-literal,.hljs-number,.hljs-tag .hljs-attr,.hljs-template-variable,.hljs-variable{color:teal}.hljs-doctag,.hljs-string{color:#d14}.hljs-section,.hljs-selector-id,.hljs-title{color:#900;font-weight:700}.hljs-subst{font-weight:400}.hljs-class .hljs-title,.hljs-type{color:#458;font-weight:700}.hljs-attribute,.hljs-name,.hljs-tag{color:navy;font-weight:400}.hljs-meta,.hljs-strong{font-weight:700}.hljs-link,.hljs-regexp{color:#009926}.hljs-bullet,.hljs-symbol{color:#990073}.hljs-built_in,.hljs-builtin-name{color:#0086b3}.hljs-meta{color:#999}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.hljs-emphasis{font-style:italic}body{color:#777}.pure-img-responsive{max-width:100%;height:auto}#layout,#menu,.menu-link{-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}#layout{position:relative;padding-left:0}#layout.active #menu{left:150px;width:150px}#layout.active .menu-link{left:150px}#menu,.menu-link{position:fixed;top:0;left:0}.content{margin:0 auto 50px;padding:0 2em;max-width:800px;line-height:1.6em}.header{margin:0;color:#333;padding:2.5em 2em 0;border-bottom:1px solid #eee;font-family:Raleway,Helvetica,Arial,sans-serif}.header h1{margin:.2em 0;font-size:3em;font-weight:300}.header h2{font-weight:300;color:#ccc;padding:0;margin-top:0}.content-subhead{margin:50px 0 20px;font-weight:300;color:#888}#menu{margin-left:-150px;width:150px;bottom:0;z-index:1000;background:#191818;overflow-y:auto;-webkit-overflow-scrolling:touch}#menu a{color:#999;border:none;padding:.6em 0 .6em .6em}#menu .pure-menu,#menu .pure-menu ul{border:none;background:0 0}#menu .pure-menu .menu-item-divided,#menu .pure-menu ul{border-top:1px solid #333}#menu .pure-menu li a:focus,#menu .pure-menu li a:hover{background:#333}#menu .pure-menu-heading,#menu .pure-menu-selected{background:#1f8dd6}#menu .pure-menu-selected a{color:#fff}#menu .pure-menu-heading{font-size:110%;color:#fff;margin:0}.menu-link{display:block;background:#000;background:rgba(0,0,0,.7);font-size:10px;z-index:10;width:2em;height:auto;padding:2.1em 1.6em}.menu-link:focus,.menu-link:hover{background:#000}.menu-link span{position:relative;display:block}.menu-link span,.menu-link span:after,.menu-link span:before{background-color:#fff;width:100%;height:.2em}.menu-link span:after,.menu-link span:before{position:absolute;margin-top:-.6em;content:" "}.menu-link span:after{margin-top:.6em}@media (min-width:48em){.content,.header{padding-left:2em;padding-right:2em}#layout{padding-left:150px;left:0}#layout.active .menu-link,#menu,.menu-link{left:150px}.menu-link{position:fixed;display:none}}a{color:#3b8bba;text-decoration:none}.pagination a,a:visited{color:#265778}a:focus,a:hover{text-decoration:underline}.small-print{font-size:.8em;margin:.6em}.post-meta{font-size:90%}article>footer{text-align:right}.prev-next-post{margin-top:2em;padding-top:2em;padding-bottom:2em;border-top:1px solid #eee;border-bottom:1px solid #eee}.prev-next-post .prev{float:left;text-align:left;overflow:hidden}.prev-next-post .next{float:right;text-align:right;overflow:hidden}#menu .pure-menu{font-size:.9em}i{display:inline-block;margin-right:.2em}.pagination{text-align:center;margin-top:3em}#menu .brand{font-family:Raleway;letter-spacing:.1em;background:0 0;text-decoration:none;font-weight:400;font-size:1.3em;margin:0}.content table{margin-top:1em;border:1px solid #cbcbcb}.content table thead{background-color:#e0e0e0;color:#000}.content table thead td,.content table thead th{border-bottom:1ps solid #cbcbcb}.content table td,.content table th{padding:.33em .66em;border-left:1px solid #cbcbcb;border-right:1px solid #cbcbcb}.content table tr:nth-child(even){background-color:#f2f2f2}.list-item-description:before{content:"\00A0\2013\00A0"}article.teaser h2{text-align:left;margin-left:160px;font-weight:400;font-size:1.75em;transition:margin-left .2s ease-out;-webkit-transition:margin-left .2s ease-out}.teaser-icon{clear:left;float:left}.teaser-icon .fa{font-size:128px;transition:font-size .2s ease-out;-webkit-transition:font-size .2s ease-out}.teaser-text{margin-left:160px;transition:margin-left .2s ease-out;-webkit-transition:margin-left .2s ease-out}.teaser-text p:last-of-type{margin-bottom:0}.teaser-follow-up{text-align:right}@media (max-height:48em){#menu{width:165px}}@media (max-width:48em){#layout.active{position:relative;left:150px}.teaser-text,article.teaser h2{margin-left:120px}.list-item-description:before{content:""}.list-item-description{display:block}.teaser-icon .fa{font-size:96px}}@media (max-width:30em){.list-item-description{display:none}article.teaser h2{margin-left:0;margin-top:0;text-align:center}.teaser-icon{float:none;text-align:center;margin:1em 0}.teaser-icon .fa{font-size:64px}.teaser-text{margin-left:inherit}} \ No newline at end of file From c29ff1133945629fed9c8066734afa9e0b9b516c Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Thu, 7 Jul 2016 15:20:04 +0200 Subject: [PATCH 07/52] added explicit anchors to app properties --- docs/content/ref/app-properties.md | 102 ++++++++++++------------- docs/src-content/ref/app-properties.md | 50 ++++++------ 2 files changed, 76 insertions(+), 76 deletions(-) diff --git a/docs/content/ref/app-properties.md b/docs/content/ref/app-properties.md index 30cc9807..fa976cb1 100644 --- a/docs/content/ref/app-properties.md +++ b/docs/content/ref/app-properties.md @@ -7,33 +7,33 @@ weight = 8 | Property | App Types | Required | |----------|-----------|----------| -| [ID](#id) | all | `true` | -| [Label](#label) | all | `false` | -| [Typ](#typ) | all | `false` | -| [Dependencies](#dependencies) | all | `false` | -| [Force](#force) | all | `false` | -| [Dir](#dir) | all | `false` | -| [Path](#path) | `meta`, `default` | `false` | -| [Register](#register) | `meta`, `default` | `false` | -| [Environment](#environment) | all | `false` | -| [Exe](#exe) | all | `false` | -| [AdornedExecutables](#adornedexecutables) | all | `false` | -| [RegistryKeys](#registrykeys) | all | `false` | -| [Launcher](#launcher) | all | `false` | -| [LauncherExecutable](#launcherexecutable) | all | `false` | -| [LauncherArguments](#launcherarguments) | all | `false` | -| [LauncherIcon](#launchericon) | all | `false` | -| [Url](#url) | `default` | `true` | -| [DownloadCookies](#downloadcookies) | `default` | `false` | -| [ResourceName](#resourcename) | `default` | `true`* | -| [ArchiveName](#archivename) | `default` | `true`* | -| [ArchiveTyp](#archivetyp) | `default` | `false` | -| [ArchivePath](#archivepath) | `default` | `false` | -| [SetupTestFile](#setuptestfile) | `meta`, `default` | `false` | -| [PackageName](#packagename) | `*-package` | `false` | -| [Version](#version) | `*-package` | `false` | - -## ID +| [ID](#ID) | all | `true` | +| [Label](#Label) | all | `false` | +| [Typ](#Typ) | all | `false` | +| [Dependencies](#Dependencies) | all | `false` | +| [Force](#Force) | all | `false` | +| [Dir](#Dir) | all | `false` | +| [Path](#Path) | `meta`, `default` | `false` | +| [Register](#Register) | `meta`, `default` | `false` | +| [Environment](#Environment) | all | `false` | +| [Exe](#Exe) | all | `false` | +| [AdornedExecutables](#AdornedExecutables) | all | `false` | +| [RegistryKeys](#RegistryKeys) | all | `false` | +| [Launcher](#Launcher) | all | `false` | +| [LauncherExecutable](#LauncherExecutable) | all | `false` | +| [LauncherArguments](#LauncherArguments) | all | `false` | +| [LauncherIcon](#LauncherIcon) | all | `false` | +| [Url](#Url) | `default` | `true` | +| [DownloadCookies](#DownloadCookies) | `default` | `false` | +| [ResourceName](#ResourceName) | `default` | `true`* | +| [ArchiveName](#ArchiveName) | `default` | `true`* | +| [ArchiveTyp](#ArchiveTyp) | `default` | `false` | +| [ArchivePath](#ArchivePath) | `default` | `false` | +| [SetupTestFile](#SetupTestFile) | `meta`, `default` | `false` | +| [PackageName](#PackageName) | `*-package` | `false` | +| [Version](#Version) | `*-package` | `false` | + +## ID {#ID} * Description: The ID of the app * Data Type: string @@ -41,7 +41,7 @@ weight = 8 * Required: `true` * App Types: all -## Label +## Label {#Label} * Description: A user friendly name for the app * Data Type: string @@ -49,7 +49,7 @@ weight = 8 * Default: the value of the `ID` property * App Types: all -## Typ +## Typ {#Typ} * Description: The application typ * Data Type: string @@ -58,7 +58,7 @@ weight = 8 * Default: `default` * App Types: all -## Dependencies +## Dependencies {#Dependencies} * Description: A list with the IDs of all apps in this app group * Data Type: list of strings @@ -67,7 +67,7 @@ weight = 8 * Default: empty * App Types: all -## Force +## Force {#Force} * Description: A boolean, indicating if the package should allways be installed, even if it is already installed * Data Type: boolean @@ -76,7 +76,7 @@ weight = 8 * Default: `false` * App Types: all -## Dir +## Dir {#Dir} * Description: The name of the target directory for the app * Data Type: string @@ -87,7 +87,7 @@ weight = 8 For package apps like `node-package` or `python3-package`, the default value is the directory of the respective interpreter/compiler app. -## Path +## Path {#Path} * Description: A list of relative paths inside the app directory to register in the environment `PATH` * Data Type: list of strings @@ -100,7 +100,7 @@ For package apps like `node-package` or `python3-package`, this property is ignored and implicitly set to the directory of its interpreter/compiler app where the CLI wrapper scripts are stored. -## Register +## Register {#Register} * Description: A boolean to indicate if the path(s) of the application should be added to the environment `PATH` * Data Type: boolean @@ -109,7 +109,7 @@ of its interpreter/compiler app where the CLI wrapper scripts are stored. * Default: `true` * App Types: `meta`, `default` -## Environment +## Environment {#Environment} * Description: A list of key-value-pairs, describing additional environment variables * Data Type: dictionary @@ -118,7 +118,7 @@ of its interpreter/compiler app where the CLI wrapper scripts are stored. * Example: `MY_APP_HOME: $:Dir$`, `MY_APP_LOG: D:\logs\myapp.log` * App Types: all -## Exe +## Exe {#Exe} * Description: The path of the main executable for this app * Data Type: string @@ -131,7 +131,7 @@ For package apps like `node-package` or `python3-package`, the path can be just the name of CLI wrapper script, given the package provides a CLI. -## AdornedExecutables +## AdornedExecutables {#AdornedExecutables} * Description: A list of executables, which must be adorned with pre- and post-execution scripts * Data Type: list of strings @@ -141,7 +141,7 @@ given the package provides a CLI. Every listed path must be relative to the target directory of the app. -## RegistryKeys +## RegistryKeys {#RegistryKeys} * Description: A list of registry keys to back up and restore for isolation during the execution of this app @@ -152,7 +152,7 @@ Every listed path must be relative to the target directory of the app. * Example: `Software\Company Foo\Program Bar` * App Types: all -## Launcher +## Launcher {#Launcher} * Description: A label for the app launcher * Data Type: string @@ -162,7 +162,7 @@ Every listed path must be relative to the target directory of the app. A launcher for the app is created only if this property is set to a non empty string. -## LauncherExecutable +## LauncherExecutable {#LauncherExecutable} * Description: The path to the executable targeted by the app launcher * Data Type: string @@ -172,7 +172,7 @@ A launcher for the app is created only if this property is set to a non empty st The path can be absolute, or relative to the target directory of the app. -## LauncherArguments +## LauncherArguments {#LauncherArguments} * Description: A list with arguments to the app executable * Data Type: list of strings @@ -185,7 +185,7 @@ the last element in the list must be `%*`. Passing arguments from the launcher to the executable allows drag-and-drop for files from the Explorer onto the launcher. -## LauncherIcon +## LauncherIcon {#LauncherIcon} * Description: The path to the icon of the launcher * Data Type: string @@ -196,7 +196,7 @@ for files from the Explorer onto the launcher. The path can be absolute or relative to the target directory of the app. -## Url +## Url {#Url} * Description: The URL to the file, containing the app resource * Data Type: string @@ -204,7 +204,7 @@ The path can be absolute or relative to the target directory of the app. * Required: `true` * App Types: `default` -## DownloadCookies +## DownloadCookies {#DownloadCookies} * Description: A dictionary with cookies, to send along with the download request * Data Type: dictionary @@ -213,7 +213,7 @@ The path can be absolute or relative to the target directory of the app. * Example: `cookie-name: cookie-value` * App Types: `default` -## ResourceName +## ResourceName {#ResourceName} * Description: The name of the downloaded executable file * Data Type: string @@ -224,7 +224,7 @@ The path can be absolute or relative to the target directory of the app. *) Only one of `ResourceName` or `ArchiveName` must be set. -## ArchiveName +## ArchiveName {#ArchiveName} * Description: The name of the downloaded archive * Data Type: string @@ -235,7 +235,7 @@ The path can be absolute or relative to the target directory of the app. *) Only one of `ResourceName` or `ArchiveName` must be set. -## ArchiveTyp +## ArchiveTyp {#ArchiveTyp} * Description: The archive typ, which controls the extractor selection * Required: `false` @@ -252,7 +252,7 @@ The path can be absolute or relative to the target directory of the app. This property is only recognized, if the `ArchiveName` property is set. -## ArchivePath +## ArchivePath {#ArchivePath} * Description: A sub folder in the archive to extract * Data Type: string @@ -263,7 +263,7 @@ This property is only recognized, if the `ArchiveName` property is set. This property is only recognized, if the property `ArchiveName` is set. -## SetupTestFile +## SetupTestFile {#SetupTestFile} * Description: The path to a file as part of the app installation * Data Type: string @@ -274,7 +274,7 @@ This property is only recognized, if the property `ArchiveName` is set. The path is relative to the target directory of the app. The existence of thdescribed file is used, to determine if the app is already installed. -## PackageName +## PackageName {#PackageName} * Description: The name of the NPM package to install via NPM * Data Type: string @@ -282,7 +282,7 @@ The existence of thdescribed file is used, to determine if the app is already in * Default: the value of the `ID` property in lowercase * App Types: `*-package` -## Version +## Version {#Version} * Description: The package version or version range to install by the respective package mananer, if empty install latest * Required: `false` diff --git a/docs/src-content/ref/app-properties.md b/docs/src-content/ref/app-properties.md index a54d48d2..8ffa8896 100644 --- a/docs/src-content/ref/app-properties.md +++ b/docs/src-content/ref/app-properties.md @@ -12,7 +12,7 @@ weight = 8 #column Required: value(../Required) --> -## ID +## ID {#ID} * Description: The ID of the app * Data Type: string @@ -20,7 +20,7 @@ weight = 8 * Required: `true` * App Types: all -## Label +## Label {#Label} * Description: A user friendly name for the app * Data Type: string @@ -28,7 +28,7 @@ weight = 8 * Default: the value of the `ID` property * App Types: all -## Typ +## Typ {#Typ} * Description: The application typ * Data Type: string @@ -37,7 +37,7 @@ weight = 8 * Default: `default` * App Types: all -## Dependencies +## Dependencies {#Dependencies} * Description: A list with the IDs of all apps in this app group * Data Type: list of strings @@ -46,7 +46,7 @@ weight = 8 * Default: empty * App Types: all -## Force +## Force {#Force} * Description: A boolean, indicating if the package should allways be installed, even if it is already installed * Data Type: boolean @@ -55,7 +55,7 @@ weight = 8 * Default: `false` * App Types: all -## Dir +## Dir {#Dir} * Description: The name of the target directory for the app * Data Type: string @@ -66,7 +66,7 @@ weight = 8 For package apps like `node-package` or `python3-package`, the default value is the directory of the respective interpreter/compiler app. -## Path +## Path {#Path} * Description: A list of relative paths inside the app directory to register in the environment `PATH` * Data Type: list of strings @@ -79,7 +79,7 @@ For package apps like `node-package` or `python3-package`, this property is ignored and implicitly set to the directory of its interpreter/compiler app where the CLI wrapper scripts are stored. -## Register +## Register {#Register} * Description: A boolean to indicate if the path(s) of the application should be added to the environment `PATH` * Data Type: boolean @@ -88,7 +88,7 @@ of its interpreter/compiler app where the CLI wrapper scripts are stored. * Default: `true` * App Types: `meta`, `default` -## Environment +## Environment {#Environment} * Description: A list of key-value-pairs, describing additional environment variables * Data Type: dictionary @@ -97,7 +97,7 @@ of its interpreter/compiler app where the CLI wrapper scripts are stored. * Example: `MY_APP_HOME: $:Dir$`, `MY_APP_LOG: D:\logs\myapp.log` * App Types: all -## Exe +## Exe {#Exe} * Description: The path of the main executable for this app * Data Type: string @@ -110,7 +110,7 @@ For package apps like `node-package` or `python3-package`, the path can be just the name of CLI wrapper script, given the package provides a CLI. -## AdornedExecutables +## AdornedExecutables {#AdornedExecutables} * Description: A list of executables, which must be adorned with pre- and post-execution scripts * Data Type: list of strings @@ -120,7 +120,7 @@ given the package provides a CLI. Every listed path must be relative to the target directory of the app. -## RegistryKeys +## RegistryKeys {#RegistryKeys} * Description: A list of registry keys to back up and restore for isolation during the execution of this app @@ -131,7 +131,7 @@ Every listed path must be relative to the target directory of the app. * Example: `Software\Company Foo\Program Bar` * App Types: all -## Launcher +## Launcher {#Launcher} * Description: A label for the app launcher * Data Type: string @@ -141,7 +141,7 @@ Every listed path must be relative to the target directory of the app. A launcher for the app is created only if this property is set to a non empty string. -## LauncherExecutable +## LauncherExecutable {#LauncherExecutable} * Description: The path to the executable targeted by the app launcher * Data Type: string @@ -151,7 +151,7 @@ A launcher for the app is created only if this property is set to a non empty st The path can be absolute, or relative to the target directory of the app. -## LauncherArguments +## LauncherArguments {#LauncherArguments} * Description: A list with arguments to the app executable * Data Type: list of strings @@ -164,7 +164,7 @@ the last element in the list must be `%*`. Passing arguments from the launcher to the executable allows drag-and-drop for files from the Explorer onto the launcher. -## LauncherIcon +## LauncherIcon {#LauncherIcon} * Description: The path to the icon of the launcher * Data Type: string @@ -175,7 +175,7 @@ for files from the Explorer onto the launcher. The path can be absolute or relative to the target directory of the app. -## Url +## Url {#Url} * Description: The URL to the file, containing the app resource * Data Type: string @@ -183,7 +183,7 @@ The path can be absolute or relative to the target directory of the app. * Required: `true` * App Types: `default` -## DownloadCookies +## DownloadCookies {#DownloadCookies} * Description: A dictionary with cookies, to send along with the download request * Data Type: dictionary @@ -192,7 +192,7 @@ The path can be absolute or relative to the target directory of the app. * Example: `cookie-name: cookie-value` * App Types: `default` -## ResourceName +## ResourceName {#ResourceName} * Description: The name of the downloaded executable file * Data Type: string @@ -203,7 +203,7 @@ The path can be absolute or relative to the target directory of the app. *) Only one of `ResourceName` or `ArchiveName` must be set. -## ArchiveName +## ArchiveName {#ArchiveName} * Description: The name of the downloaded archive * Data Type: string @@ -214,7 +214,7 @@ The path can be absolute or relative to the target directory of the app. *) Only one of `ResourceName` or `ArchiveName` must be set. -## ArchiveTyp +## ArchiveTyp {#ArchiveTyp} * Description: The archive typ, which controls the extractor selection * Required: `false` @@ -231,7 +231,7 @@ The path can be absolute or relative to the target directory of the app. This property is only recognized, if the `ArchiveName` property is set. -## ArchivePath +## ArchivePath {#ArchivePath} * Description: A sub folder in the archive to extract * Data Type: string @@ -242,7 +242,7 @@ This property is only recognized, if the `ArchiveName` property is set. This property is only recognized, if the property `ArchiveName` is set. -## SetupTestFile +## SetupTestFile {#SetupTestFile} * Description: The path to a file as part of the app installation * Data Type: string @@ -253,7 +253,7 @@ This property is only recognized, if the property `ArchiveName` is set. The path is relative to the target directory of the app. The existence of thdescribed file is used, to determine if the app is already installed. -## PackageName +## PackageName {#PackageName} * Description: The name of the NPM package to install via NPM * Data Type: string @@ -261,7 +261,7 @@ The existence of thdescribed file is used, to determine if the app is already in * Default: the value of the `ID` property in lowercase * App Types: `*-package` -## Version +## Version {#Version} * Description: The package version or version range to install by the respective package mananer, if empty install latest * Required: `false` From 6bb1f4d85236c038194fcfbdf2865ed2824c7c81 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Thu, 7 Jul 2016 15:20:33 +0200 Subject: [PATCH 08/52] completed docs/ref/config.md --- docs/content/ref/config.md | 164 ++++++++++++++++++++++++--------- docs/src-content/ref/config.md | 108 ++++++++++++++++++---- 2 files changed, 208 insertions(+), 64 deletions(-) diff --git a/docs/content/ref/config.md b/docs/content/ref/config.md index 06bf8c0a..03c3e77e 100644 --- a/docs/content/ref/config.md +++ b/docs/content/ref/config.md @@ -1,7 +1,6 @@ +++ date = "2016-06-22T13:42:49+02:00" description = "The properties of the Bench configuration" -draft = true title = "Configuration Properties" weight = 6 +++ @@ -9,9 +8,9 @@ weight = 6 Configuration properties for Bench use the [list syntax in Markdown][syntax] and can be defined in the following files. -* Default Configuration file `res\config.md` -* Custom Configuration file `config\config.md` -* Site Configuration files `bench-site.md` +* Default configuration file `res\config.md` +* Custom configuration file `config\config.md` +* Site configuration files `bench-site.md` in the Bench root directory and all of its parents. The configuration files are applied in the order they are listed above. @@ -26,7 +25,7 @@ Properties of the data type `path` can be absolute, or relative to the Bench roo ## Overview -There two groups of configuration properties: +There are two groups of configuration properties: The first group contains properties, which are predefined by the default configuration, and can _not_ be set in the custom or site configuration. These properties can not be overridden, because they are used during the @@ -56,6 +55,9 @@ configuration, but _can_ be overridden in the custom or site configuration. | [AppResourceBaseDir](#AppResourceBaseDir) | path | `res\apps` | | [ActionDir](#ActionDir) | path | `actions` | | [LibDir](#LibDir) | path | `lib` | +| [Website](#Website) | URL | | +| [WizzardEditCustomConfigBeforeSetup](#WizzardEditCustomConfigBeforeSetup) | boolean | `false` | +| [WizzardStartAutoSetup](#WizzardStartAutoSetup) | boolean | `true` | **Customizable Properties** @@ -67,31 +69,28 @@ configuration, but _can_ be overridden in the custom or site configuration. | [HttpsProxy](#HttpsProxy) | Site | URL | `http://127.0.0.1:443` | | [DownloadAttempts](#DownloadAttempts) | Site | integer | 3 | | [ParallelDownloads](#ParallelDownloads) | Site | integer | 4 | -| [UserName](#UserName) | Custom, Site | string | user | -| [UserEmail](#UserEmail) | Custom, Site | string | user@localhost | -| [DownloadDir](#DownloadDir) | Custom, Site | path | `cache` | -| [AppAdornmentBaseDir](#AppAdornmentBaseDir) | | | `$LibDir$\_proxies` | -| [AppRegistryBaseDir](#AppRegistryBaseDir) | | | `$HomeDir$\registry_isolation` | -| [TempDir](#TempDir) | | | `tmp` | -| [LogDir](#LogDir) | | | `log` | -| [HomeDir](#HomeDir) | | | `home` | -| [AppDataDir](#AppDataDir) | | | `$HomeDir$\AppData\Roaming` | -| [LocalAppDataDir](#LocalAppDataDir) | | | `$HomeDir$\AppData\Local` | -| [OverrideHome](#OverrideHome) | | | `true` | -| [OverrideTemp](#OverrideTemp) | | | `true` | -| [IgnoreSystemPath](#IgnoreSystemPath) | | | `true` | -| [ProjectRootDir](#ProjectRootDir) | | | `projects` | -| [ProjectArchiveDir](#ProjectArchiveDir) | | | `archive` | -| [ProjectArchiveFormat](#ProjectArchiveFormat) | | | `zip` | -| [LauncherDir](#LauncherDir) | | | `launcher` | -| [LauncherScriptDir](#LauncherScriptDir) | | | `$LibDir$\_launcher` | -| [WizzardEditCustomConfigBeforeSetup](#WizzardEditCustomConfigBeforeSetup) | | | `false` | -| [WizzardStartAutoSetup](#WizzardStartAutoSetup) | | | `true` | -| [QuickAccessCmd](#QuickAccessCmd) | | | `true` | -| [QuickAccessPowerShell](#QuickAccessPowerShell) | | | `false` | -| [QuickAccessBash](#QuickAccessBash) | | | `false` | -| [EditorApp](#EditorApp) | | | `VSCode` | -| [Website](#Website) | | | | +| [UserName](#UserName) | Custom/Site | string | user | +| [UserEmail](#UserEmail) | Custom/Site | string | user@localhost | +| [DownloadDir](#DownloadDir) | Custom/Site | path | `cache` | +| [AppAdornmentBaseDir](#AppAdornmentBaseDir) | Custom | path | `$LibDir$\_proxies` | +| [AppRegistryBaseDir](#AppRegistryBaseDir) | Custom | path | `$HomeDir$\registry_isolation` | +| [TempDir](#TempDir) | Custom/Site | path | `tmp` | +| [LogDir](#LogDir) | Custom | path | `log` | +| [HomeDir](#HomeDir) | Custom/Site | path | `home` | +| [AppDataDir](#AppDataDir) | Custom/Site | path | `$HomeDir$\AppData\Roaming` | +| [LocalAppDataDir](#LocalAppDataDir) | Custom/Site | path | `$HomeDir$\AppData\Local` | +| [OverrideHome](#OverrideHome) | Custom/Site | boolen | `true` | +| [OverrideTemp](#OverrideTemp) | Custom/Site | boolean | `true` | +| [IgnoreSystemPath](#IgnoreSystemPath) | Custom/Site | boolean | `true` | +| [ProjectRootDir](#ProjectRootDir) | Custom/Site | path | `projects` | +| [ProjectArchiveDir](#ProjectArchiveDir) | Custom/Site | path | `archive` | +| [ProjectArchiveFormat](#ProjectArchiveFormat) | Custom/Site | string | `zip` | +| [LauncherDir](#LauncherDir) | Custom | path | `launcher` | +| [LauncherScriptDir](#LauncherScriptDir) | Custom | path | `$LibDir$\_launcher` | +| [QuickAccessCmd](#QuickAccessCmd) | Custom/Site | boolean | `true` | +| [QuickAccessPowerShell](#QuickAccessPowerShell) | Custom/Site | boolean | `false` | +| [QuickAccessBash](#QuickAccessBash) | Custom/Site | boolean | `false` | +| [EditorApp](#EditorApp) | Custom/Site | string | `VSCode` | ## System Properties @@ -112,7 +111,7 @@ these changes. ### CustomConfigDir {#CustomConfigDir} -* Description: The path to the directory with the custom configuration (`config.md`, `apps-activated.txt`, ...) +* Description: The path to the directory with the custom configuration (`config.md`, `apps-activated.txt`, ...) is stored. * Data Type: path * Default: `config` * Typ: System @@ -259,6 +258,27 @@ Bench action scripts are typically `*.cmd` files. * Default: `lib` * Typ: System +### Website {#Website} + +* Description: The URL for the Bench documentation. +* Data Type: URL +* Default: +* Typ: System + +### WizzardEditCustomConfigBeforeSetup {#WizzardEditCustomConfigBeforeSetup} + +* Description: A temporary switch which is used during the Bench setup process. +* Data Type: boolean +* Default: `false` +* Typ: Temporary + +### WizzardStartAutoSetup {#WizzardStartAutoSetup} + +* Description: A temporary switch which is used during the Bench setup process. +* Data Type: boolean +* Default: `true` +* Typ: Temporary + ## Customizable Properties Properties in this group are customizable and can be set in @@ -317,7 +337,7 @@ The usage in the custom scripts for apps is not completely implemented yet. * Description: The name of the Bench user. * Data Type: string * Default: user -* Typ: Custom, Site +* Typ: Custom/Site This property is used to set the environment variable `USER_NAME` and in custom scripts e.g. from [Git](/ref/apps/#Git). @@ -327,7 +347,7 @@ and in custom scripts e.g. from [Git](/ref/apps/#Git). * Description: The email address of the Bench user. * Data Type: string * Default: user@localhost -* Typ: Custom, Site +* Typ: Custom/Site This property is used to set the environment variable `USER_EMAIL` and in custom scripts e.g. from [Git](/ref/apps/#Git). @@ -337,94 +357,146 @@ and in custom scripts e.g. from [Git](/ref/apps/#Git). * Description: The path to the directory where downloaded app resources are cached. * Data Type: path * Default: `cache` -* Typ: Custom, Site +* Typ: Custom/Site ### AppAdornmentBaseDir {#AppAdornmentBaseDir} +* Description: The path to the directory where wrapper scripts are stored, + which allow the adornment of an app execution. +* Data Type: path * Default: `$LibDir$\_proxies` +* Typ: Custom ### AppRegistryBaseDir {#AppRegistryBaseDir} +* Description: The path to the directory where registry backups + for the app isolation mechanism are stored. +* Data Type: path * Default: `$HomeDir$\registry_isolation` +* Typ: Custom ### TempDir {#TempDir} +* Description: The path to the temporary directory of the Bench environment. +* Data Type: path * Default: `tmp` +* Typ: Custom/Site ### LogDir {#LogDir} +* Description: The path to the directory where Bench setup logs are stored. +* Data Type: path * Default: `log` +* Typ: Custom ### HomeDir {#HomeDir} +* Description: The path to the user profile of the Bench environment. +* Data Type: path * Default: `home` +* Typ: Custom/Site ### AppDataDir {#AppDataDir} +* Description: The path to the `AppData\Roaming` directory in the user profile + of the Bench environment. +* Data Type: path * Default: `$HomeDir$\AppData\Roaming` +* Typ: Custom/Site ### LocalAppDataDir {#LocalAppDataDir} +* Description: The path to the `AppData\Local` directory in the user profile + of the Bench environment. +* Data Type: path * Default: `$HomeDir$\AppData\Local` +* Typ: Custom/Site ### OverrideHome {#OverrideHome} +* Description: A switch to control if the environment variables `HOME`, `HOMEPATH`, `HOMEDRIVE`, `USERPROFILE`, `APPDATA`, and `LOCALAPPDATA` are overridden in the Bench environment. +* Data Type: boolen * Default: `true` +* Typ: Custom/Site ### OverrideTemp {#OverrideTemp} +* Description: A switch to control if the environment variables `TEMP` and `TMP` are overridden in the Bench environment. +* Data Type: boolean * Default: `true` +* Typ: Custom/Site ### IgnoreSystemPath {#IgnoreSystemPath} +* Description: A switch to control if only Bench tools are on the `PATH` in the Bench environment or if the `PATH` of the current Windows user is preserved. +* Data Type: boolean * Default: `true` +* Typ: Custom/Site ### ProjectRootDir {#ProjectRootDir} +* Description: The path to the directory where projects are stored. +* Data Type: path * Default: `projects` +* Typ: Custom/Site ### ProjectArchiveDir {#ProjectArchiveDir} +* Description: The path to the directory where project backups are stored. +* Data Type: path * Default: `archive` +* Typ: Custom/Site ### ProjectArchiveFormat {#ProjectArchiveFormat} +* Description: The file format of the project backups. +* Data Type: string +* Possible Values: `zip`, `7z`, `tar`, `wim` * Default: `zip` +* Typ: Custom/Site ### LauncherDir {#LauncherDir} +* Description: The path to the directory where launcher shortcuts are stored. +* Data Type: path * Default: `launcher` +* Typ: Custom ### LauncherScriptDir {#LauncherScriptDir} +* Description: The path to the directory where launcher wrapper scripts are stored. +* Data Type: path * Default: `$LibDir$\_launcher` - -### WizzardEditCustomConfigBeforeSetup {#WizzardEditCustomConfigBeforeSetup} - -* Default: `false` - -### WizzardStartAutoSetup {#WizzardStartAutoSetup} - -* Default: `true` +* Typ: Custom ### QuickAccessCmd {#QuickAccessCmd} +* Description: A switch which controls if a launcher for the Windows command interpreter (CMD) is created. +* Data Type: boolean * Default: `true` +* Typ: Custom/Site ### QuickAccessPowerShell {#QuickAccessPowerShell} +* Description: A switch which controls if a launcher for the PowerShell is created. +* Data Type: boolean * Default: `false` +* Typ: Custom/Site ### QuickAccessBash {#QuickAccessBash} +* Description: A switch which controls if a launcher for the Git Bash is created. +* Data Type: boolean * Default: `false` +* Typ: Custom/Site + +This switch only takes affect, if the [Git app](/ref/apps/#Git) is activated. ### EditorApp {#EditorApp} +* Description: The ID of an app which is used as the default text editor. +* Data Type: string * Default: `VSCode` - -### Website {#Website} - -* Default: +* Typ: Custom/Site [syntax]: /ref/markup-syntax diff --git a/docs/src-content/ref/config.md b/docs/src-content/ref/config.md index 9be0a021..83388ed6 100644 --- a/docs/src-content/ref/config.md +++ b/docs/src-content/ref/config.md @@ -1,7 +1,6 @@ +++ date = "2016-06-22T13:42:49+02:00" description = "The properties of the Bench configuration" -draft = true title = "Configuration Properties" weight = 6 +++ @@ -26,7 +25,7 @@ Properties of the data type `path` can be absolute, or relative to the Bench roo ## Overview -There two groups of configuration properties: +There are two groups of configuration properties: The first group contains properties, which are predefined by the default configuration, and can _not_ be set in the custom or site configuration. These properties can not be overridden, because they are used during the @@ -72,7 +71,7 @@ these changes. ### CustomConfigDir {#CustomConfigDir} -* Description: The path to the directory with the custom configuration (`config.md`, `apps-activated.txt`, ...) +* Description: The path to the directory with the custom configuration (`config.md`, `apps-activated.txt`, ...) is stored. * Data Type: path * Default: `config` * Typ: System @@ -219,6 +218,27 @@ Bench action scripts are typically `*.cmd` files. * Default: `lib` * Typ: System +### Website {#Website} + +* Description: The URL for the Bench documentation. +* Data Type: URL +* Default: +* Typ: System + +### WizzardEditCustomConfigBeforeSetup {#WizzardEditCustomConfigBeforeSetup} + +* Description: A temporary switch which is used during the Bench setup process. +* Data Type: boolean +* Default: `false` +* Typ: Temporary + +### WizzardStartAutoSetup {#WizzardStartAutoSetup} + +* Description: A temporary switch which is used during the Bench setup process. +* Data Type: boolean +* Default: `true` +* Typ: Temporary + ## Customizable Properties Properties in this group are customizable and can be set in @@ -277,7 +297,7 @@ The usage in the custom scripts for apps is not completely implemented yet. * Description: The name of the Bench user. * Data Type: string * Default: user -* Typ: Custom, Site +* Typ: Custom/Site This property is used to set the environment variable `USER_NAME` and in custom scripts e.g. from [Git](/ref/apps/#Git). @@ -287,7 +307,7 @@ and in custom scripts e.g. from [Git](/ref/apps/#Git). * Description: The email address of the Bench user. * Data Type: string * Default: user@localhost -* Typ: Custom, Site +* Typ: Custom/Site This property is used to set the environment variable `USER_EMAIL` and in custom scripts e.g. from [Git](/ref/apps/#Git). @@ -297,94 +317,146 @@ and in custom scripts e.g. from [Git](/ref/apps/#Git). * Description: The path to the directory where downloaded app resources are cached. * Data Type: path * Default: `cache` -* Typ: Custom, Site +* Typ: Custom/Site ### AppAdornmentBaseDir {#AppAdornmentBaseDir} +* Description: The path to the directory where wrapper scripts are stored, + which allow the adornment of an app execution. +* Data Type: path * Default: `$LibDir$\_proxies` +* Typ: Custom ### AppRegistryBaseDir {#AppRegistryBaseDir} +* Description: The path to the directory where registry backups + for the app isolation mechanism are stored. +* Data Type: path * Default: `$HomeDir$\registry_isolation` +* Typ: Custom ### TempDir {#TempDir} +* Description: The path to the temporary directory of the Bench environment. +* Data Type: path * Default: `tmp` +* Typ: Custom/Site ### LogDir {#LogDir} +* Description: The path to the directory where Bench setup logs are stored. +* Data Type: path * Default: `log` +* Typ: Custom ### HomeDir {#HomeDir} +* Description: The path to the user profile of the Bench environment. +* Data Type: path * Default: `home` +* Typ: Custom/Site ### AppDataDir {#AppDataDir} +* Description: The path to the `AppData\Roaming` directory in the user profile + of the Bench environment. +* Data Type: path * Default: `$HomeDir$\AppData\Roaming` +* Typ: Custom/Site ### LocalAppDataDir {#LocalAppDataDir} +* Description: The path to the `AppData\Local` directory in the user profile + of the Bench environment. +* Data Type: path * Default: `$HomeDir$\AppData\Local` +* Typ: Custom/Site ### OverrideHome {#OverrideHome} +* Description: A switch to control if the environment variables `HOME`, `HOMEPATH`, `HOMEDRIVE`, `USERPROFILE`, `APPDATA`, and `LOCALAPPDATA` are overridden in the Bench environment. +* Data Type: boolen * Default: `true` +* Typ: Custom/Site ### OverrideTemp {#OverrideTemp} +* Description: A switch to control if the environment variables `TEMP` and `TMP` are overridden in the Bench environment. +* Data Type: boolean * Default: `true` +* Typ: Custom/Site ### IgnoreSystemPath {#IgnoreSystemPath} +* Description: A switch to control if only Bench tools are on the `PATH` in the Bench environment or if the `PATH` of the current Windows user is preserved. +* Data Type: boolean * Default: `true` +* Typ: Custom/Site ### ProjectRootDir {#ProjectRootDir} +* Description: The path to the directory where projects are stored. +* Data Type: path * Default: `projects` +* Typ: Custom/Site ### ProjectArchiveDir {#ProjectArchiveDir} +* Description: The path to the directory where project backups are stored. +* Data Type: path * Default: `archive` +* Typ: Custom/Site ### ProjectArchiveFormat {#ProjectArchiveFormat} +* Description: The file format of the project backups. +* Data Type: string +* Possible Values: `zip`, `7z`, `tar`, `wim` * Default: `zip` +* Typ: Custom/Site ### LauncherDir {#LauncherDir} +* Description: The path to the directory where launcher shortcuts are stored. +* Data Type: path * Default: `launcher` +* Typ: Custom ### LauncherScriptDir {#LauncherScriptDir} +* Description: The path to the directory where launcher wrapper scripts are stored. +* Data Type: path * Default: `$LibDir$\_launcher` - -### WizzardEditCustomConfigBeforeSetup {#WizzardEditCustomConfigBeforeSetup} - -* Default: `false` - -### WizzardStartAutoSetup {#WizzardStartAutoSetup} - -* Default: `true` +* Typ: Custom ### QuickAccessCmd {#QuickAccessCmd} +* Description: A switch which controls if a launcher for the Windows command interpreter (CMD) is created. +* Data Type: boolean * Default: `true` +* Typ: Custom/Site ### QuickAccessPowerShell {#QuickAccessPowerShell} +* Description: A switch which controls if a launcher for the PowerShell is created. +* Data Type: boolean * Default: `false` +* Typ: Custom/Site ### QuickAccessBash {#QuickAccessBash} +* Description: A switch which controls if a launcher for the Git Bash is created. +* Data Type: boolean * Default: `false` +* Typ: Custom/Site + +This switch only takes affect, if the [Git app](/ref/apps/#Git) is activated. ### EditorApp {#EditorApp} +* Description: The ID of an app which is used as the default text editor. +* Data Type: string * Default: `VSCode` - -### Website {#Website} - -* Default: +* Typ: Custom/Site [syntax]: /ref/markup-syntax From 7c30299b3c83de9914fecb4d7dcd6290ad57495d Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Thu, 7 Jul 2016 19:43:11 +0200 Subject: [PATCH 09/52] added content to docs/ref/file-structure.md --- docs/content/ref/file-structure.md | 91 +++++++++++++++++++++++- docs/src-content/ref/file-structure.md | 98 ++++++++++++++++++++++++++ 2 files changed, 188 insertions(+), 1 deletion(-) create mode 100644 docs/src-content/ref/file-structure.md diff --git a/docs/content/ref/file-structure.md b/docs/content/ref/file-structure.md index 6fc87c14..5d1af5ab 100644 --- a/docs/content/ref/file-structure.md +++ b/docs/content/ref/file-structure.md @@ -6,4 +6,93 @@ title = "File Structure" weight = 4 +++ -TODO +The file structure of Bench is devided in two groups, the core and the extended file structure. +If the location of files and directories is not changed via custom or site configuration, +all files and folders of Bench live in one directory: the _root directory of Bench_. +In the following sections, the file structure is described according to the default configuration. +If a directory or file can be configured to be elsewhere, the responsible +configuration property is mentioned. + +## Core Structure {#core} + +The core structure consists of directories and files, which are installed +during the Bench setup, and _can not_ be moved via custom or site configuration. + +* `actions` ([ActionDir](/ref/config/#ActionDir)) + This directory contains `*.cmd` scripts to run a couple of useful tasks + in the Bench environment. + They do load the `env.cmd` by themselfs if necessary. Therefore, + they can be started directly from an arbitrary command prompt, via a Windows shortcut, + or from the explorer. + + `bench-bash.cmd` + + `bench-cmd.cmd` + + `bench-ctl.cmd` + + `bench-ps.cmd` + + `clone-git-project.cmd` + + `new-project.cmd` + + `open-editor.cmd` + + `project-backup.cmd` + + `project-editor.cmd` + + `project-ps.cmd` + + `project-watch.cmd` +* `auto` + + `apps` + - `.extract.ps1` + - `.setup.ps1` + - `.env.ps1` + - `.remove.ps1` + + `bin` + - `BenchDashboard.exe` + - `BenchLib.dll` + + `lib` + - `bench.lib.ps1` + - ... + + `archive.cmd` + + `editor.cmd` + + `init.cmd` + + `runps.cmd` +* `config` ([CustomConfigDir](/ref/config/#CustomConfigDir)) + + `apps.md` ([CustomAppIndexFile](/ref/config/#CustomAppIndexFile)) + + `apps-activated.txt` ([AppActivationFile](/ref/config/#AppActivationFile)) + + `apps-deactivated.txt` ([AppDeactivationFile](/ref/config/#AppDeactivationFile)) + + `config.md` ([CustomConfigFile](/ref/config/#CustomConfigFile)) + + `ConEmu.xml` ([ConEmuConfigFile](/ref/config/#ConEmuConfigFile)) + + `env.ps1` + + `setup.ps1` +* `res` + + `apps` ([AppResourceBaseDir](/ref/config/#AppResourceBaseDir)) + + `apps.template.md` ([CustomAppIndexTemplateFile](/ref/config/#CustomAppIndexTemplateFile)) + + `apps-activated.template.txt` ([AppActivationTemplateFile](/ref/config/#AppActivationTemplateFile)) + + `apps-deactivated.template.txt` ([AppDeactivationTemplateFile](/ref/config/#AppDeactivationTemplateFile)) + + `bench-install.bat` + + `bench-site.template.md` ([SiteConfigTemplateFile](/ref/config/#SiteConfigTemplateFile)) + + `ConEmu.template.xml` ([ConEmuConfigTemplateFile](/ref/config/#ConEmuConfigTemplateFile)) + + `config.md` + + `config.template.md` ([CustomConfigTemplateFile](/ref/config/#CustomConfigTemplateFile)) + + `version.txt` ([VersionFile](/ref/config/#VersionFile)) +* `lib` ([LibDir](/ref/config/#LibDir)) +* `CHANGELOG.md` +* `env.cmd` +* `LICENSE.md` +* `README.md` + +## Extended Structure {#extended} + +The extended structure consists of directories and files, which are created +during the usage of Bench – including the installation of apps, +and _can_ be moved via custom or site configuration. + +* `archive` +* `cache` +* `home` + + `AppData` + - `Local` + - `Roaming` + + `Desktop` + + `Documents` + + ... +* `launcher` +* `log` +* `projects` +* `tmp` +* `bench-site.md` ([SiteConfigFileName](/ref/config/#SiteConfigFileName)) diff --git a/docs/src-content/ref/file-structure.md b/docs/src-content/ref/file-structure.md new file mode 100644 index 00000000..5d1af5ab --- /dev/null +++ b/docs/src-content/ref/file-structure.md @@ -0,0 +1,98 @@ ++++ +date = "2016-06-22T13:43:12+02:00" +description = "The layout of the folders and files in the Bench environment" +draft = true +title = "File Structure" +weight = 4 ++++ + +The file structure of Bench is devided in two groups, the core and the extended file structure. +If the location of files and directories is not changed via custom or site configuration, +all files and folders of Bench live in one directory: the _root directory of Bench_. +In the following sections, the file structure is described according to the default configuration. +If a directory or file can be configured to be elsewhere, the responsible +configuration property is mentioned. + +## Core Structure {#core} + +The core structure consists of directories and files, which are installed +during the Bench setup, and _can not_ be moved via custom or site configuration. + +* `actions` ([ActionDir](/ref/config/#ActionDir)) + This directory contains `*.cmd` scripts to run a couple of useful tasks + in the Bench environment. + They do load the `env.cmd` by themselfs if necessary. Therefore, + they can be started directly from an arbitrary command prompt, via a Windows shortcut, + or from the explorer. + + `bench-bash.cmd` + + `bench-cmd.cmd` + + `bench-ctl.cmd` + + `bench-ps.cmd` + + `clone-git-project.cmd` + + `new-project.cmd` + + `open-editor.cmd` + + `project-backup.cmd` + + `project-editor.cmd` + + `project-ps.cmd` + + `project-watch.cmd` +* `auto` + + `apps` + - `.extract.ps1` + - `.setup.ps1` + - `.env.ps1` + - `.remove.ps1` + + `bin` + - `BenchDashboard.exe` + - `BenchLib.dll` + + `lib` + - `bench.lib.ps1` + - ... + + `archive.cmd` + + `editor.cmd` + + `init.cmd` + + `runps.cmd` +* `config` ([CustomConfigDir](/ref/config/#CustomConfigDir)) + + `apps.md` ([CustomAppIndexFile](/ref/config/#CustomAppIndexFile)) + + `apps-activated.txt` ([AppActivationFile](/ref/config/#AppActivationFile)) + + `apps-deactivated.txt` ([AppDeactivationFile](/ref/config/#AppDeactivationFile)) + + `config.md` ([CustomConfigFile](/ref/config/#CustomConfigFile)) + + `ConEmu.xml` ([ConEmuConfigFile](/ref/config/#ConEmuConfigFile)) + + `env.ps1` + + `setup.ps1` +* `res` + + `apps` ([AppResourceBaseDir](/ref/config/#AppResourceBaseDir)) + + `apps.template.md` ([CustomAppIndexTemplateFile](/ref/config/#CustomAppIndexTemplateFile)) + + `apps-activated.template.txt` ([AppActivationTemplateFile](/ref/config/#AppActivationTemplateFile)) + + `apps-deactivated.template.txt` ([AppDeactivationTemplateFile](/ref/config/#AppDeactivationTemplateFile)) + + `bench-install.bat` + + `bench-site.template.md` ([SiteConfigTemplateFile](/ref/config/#SiteConfigTemplateFile)) + + `ConEmu.template.xml` ([ConEmuConfigTemplateFile](/ref/config/#ConEmuConfigTemplateFile)) + + `config.md` + + `config.template.md` ([CustomConfigTemplateFile](/ref/config/#CustomConfigTemplateFile)) + + `version.txt` ([VersionFile](/ref/config/#VersionFile)) +* `lib` ([LibDir](/ref/config/#LibDir)) +* `CHANGELOG.md` +* `env.cmd` +* `LICENSE.md` +* `README.md` + +## Extended Structure {#extended} + +The extended structure consists of directories and files, which are created +during the usage of Bench – including the installation of apps, +and _can_ be moved via custom or site configuration. + +* `archive` +* `cache` +* `home` + + `AppData` + - `Local` + - `Roaming` + + `Desktop` + + `Documents` + + ... +* `launcher` +* `log` +* `projects` +* `tmp` +* `bench-site.md` ([SiteConfigFileName](/ref/config/#SiteConfigFileName)) From 8927c3343da11e78cc0022234b6c35b0f499c8cd Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 8 Jul 2016 12:26:56 +0200 Subject: [PATCH 10/52] improved structure and added content to file-structure.md --- docs/content/ref/file-structure.md | 124 +++++++++++++++++++------ docs/src-content/ref/file-structure.md | 124 +++++++++++++++++++------ 2 files changed, 196 insertions(+), 52 deletions(-) diff --git a/docs/content/ref/file-structure.md b/docs/content/ref/file-structure.md index 5d1af5ab..c8ab1bf9 100644 --- a/docs/content/ref/file-structure.md +++ b/docs/content/ref/file-structure.md @@ -18,16 +18,12 @@ configuration property is mentioned. The core structure consists of directories and files, which are installed during the Bench setup, and _can not_ be moved via custom or site configuration. -* `actions` ([ActionDir](/ref/config/#ActionDir)) - This directory contains `*.cmd` scripts to run a couple of useful tasks - in the Bench environment. - They do load the `env.cmd` by themselfs if necessary. Therefore, - they can be started directly from an arbitrary command prompt, via a Windows shortcut, - or from the explorer. - + `bench-bash.cmd` - + `bench-cmd.cmd` - + `bench-ctl.cmd` - + `bench-ps.cmd` +* [`actions`](#action-dir) + ([ActionDir](/ref/config/#ActionDir)) + + [`bench-bash.cmd`](#action-bench-bash) + + [`bench-cmd.cmd`](#action-bench-cmd) + + [`bench-ctl.cmd`](#action-bench-ctl) + + [`bench-ps.cmd`](#action-bench-ps) + `clone-git-project.cmd` + `new-project.cmd` + `open-editor.cmd` @@ -51,26 +47,46 @@ during the Bench setup, and _can not_ be moved via custom or site configuration. + `editor.cmd` + `init.cmd` + `runps.cmd` -* `config` ([CustomConfigDir](/ref/config/#CustomConfigDir)) - + `apps.md` ([CustomAppIndexFile](/ref/config/#CustomAppIndexFile)) - + `apps-activated.txt` ([AppActivationFile](/ref/config/#AppActivationFile)) - + `apps-deactivated.txt` ([AppDeactivationFile](/ref/config/#AppDeactivationFile)) - + `config.md` ([CustomConfigFile](/ref/config/#CustomConfigFile)) - + `ConEmu.xml` ([ConEmuConfigFile](/ref/config/#ConEmuConfigFile)) +* `config` + ([CustomConfigDir](/ref/config/#CustomConfigDir)) + + `apps.md` + ([CustomAppIndexFile](/ref/config/#CustomAppIndexFile)) + + `apps-activated.txt` + ([AppActivationFile](/ref/config/#AppActivationFile)) + + `apps-deactivated.txt` + ([AppDeactivationFile](/ref/config/#AppDeactivationFile)) + + `config.md` + ([CustomConfigFile](/ref/config/#CustomConfigFile)) + + `ConEmu.xml` + ([ConEmuConfigFile](/ref/config/#ConEmuConfigFile)) + `env.ps1` + `setup.ps1` * `res` - + `apps` ([AppResourceBaseDir](/ref/config/#AppResourceBaseDir)) - + `apps.template.md` ([CustomAppIndexTemplateFile](/ref/config/#CustomAppIndexTemplateFile)) - + `apps-activated.template.txt` ([AppActivationTemplateFile](/ref/config/#AppActivationTemplateFile)) - + `apps-deactivated.template.txt` ([AppDeactivationTemplateFile](/ref/config/#AppDeactivationTemplateFile)) + + `apps` + ([AppResourceBaseDir](/ref/config/#AppResourceBaseDir)) + + `apps.template.md` + ([CustomAppIndexTemplateFile](/ref/config/#CustomAppIndexTemplateFile)) + + `apps-activated.template.txt` + ([AppActivationTemplateFile](/ref/config/#AppActivationTemplateFile)) + + `apps-deactivated.template.txt` + ([AppDeactivationTemplateFile](/ref/config/#AppDeactivationTemplateFile)) + `bench-install.bat` - + `bench-site.template.md` ([SiteConfigTemplateFile](/ref/config/#SiteConfigTemplateFile)) - + `ConEmu.template.xml` ([ConEmuConfigTemplateFile](/ref/config/#ConEmuConfigTemplateFile)) + + `bench-site.template.md` + ([SiteConfigTemplateFile](/ref/config/#SiteConfigTemplateFile)) + + `ConEmu.template.xml` + ([ConEmuConfigTemplateFile](/ref/config/#ConEmuConfigTemplateFile)) + `config.md` - + `config.template.md` ([CustomConfigTemplateFile](/ref/config/#CustomConfigTemplateFile)) - + `version.txt` ([VersionFile](/ref/config/#VersionFile)) -* `lib` ([LibDir](/ref/config/#LibDir)) + + `config.template.md` + ([CustomConfigTemplateFile](/ref/config/#CustomConfigTemplateFile)) + + `version.txt` + ([VersionFile](/ref/config/#VersionFile)) +* `lib` + ([LibDir](/ref/config/#LibDir)) + + `_proxies` + ([AppAdornmentBaseDir](/ref/config/#AppAdornmentBaseDir)) + + `_launcher` + ([LauncherScriptDir](/ref/config/#LauncherScriptDir)) + + ... * `CHANGELOG.md` * `env.cmd` * `LICENSE.md` @@ -83,16 +99,72 @@ during the usage of Bench – including the installation of apps, and _can_ be moved via custom or site configuration. * `archive` + ([ProjectArchiveDir](/ref/config/#ProjectArchiveDir)) * `cache` + ([DownloadDir](/ref/config/#DownloadDir)) * `home` + ([HomeDir](/ref/config/#HomeDir)) + `AppData` - `Local` + ([LocalAppDataDir](/ref/config/#LocalAppDataDir)) - `Roaming` + ([AppDataDir](/ref/config/#AppDataDir)) + `Desktop` + `Documents` + + `registry_isolation` + ([AppRegistryBaseDir](/ref/config/#AppRegistryBaseDir)) + ... * `launcher` + ([LauncherDir](/ref/config/#LauncherDir)) * `log` + ([LogDir](/ref/config/#LogDir)) * `projects` + ([ProjectRootDir](/ref/config/#ProjectRootDir)) * `tmp` -* `bench-site.md` ([SiteConfigFileName](/ref/config/#SiteConfigFileName)) + ([TempDir](/ref/config/#TempDir)) +* `bench-site.md` + ([SiteConfigFileName](/ref/config/#SiteConfigFileName)) + +## Details {#details} + +### Action Directory {#action-dir} + +* Description: Script for task execution in the Bench environment. +* Path: `actions` +* Typ: directory +* Config Property: ([ActionDir](/ref/config/#ActionDir)) + +This directory contains `*.cmd` scripts to run a couple of useful tasks +in the Bench environment. +They do load the `env.cmd` by themselfs if necessary. +Therefore, they can be started directly from an arbitrary command prompt, +via a Windows shortcut, or from the explorer. + +### Action `bench-bash` {#action-bench-bash} + +* Description: Starts a [Git][] shell in the Bench environment. +* Path: `actions\bench-bash.cmd` +* Typ: file + +This action will fail if [Git][] is not installed + +### Action `bench-cmd` {#action-bench-cmd} + +* Description: Starts a Windows CMD console in the Bench environment. +* Path: `actions\bench-cmd.cmd` +* Typ: file + +### Action `bench-ctl` {#action-bench-ctl} + +* Description: Starts the [command line interface][Bench CLI] of the Bench manager. +* Path: `actions\bench-ctl.cmd` +* Typ: file + +### Action `bench-ps` {#action-bench-ps} + +* Description: Starts a PowerShell console in the Bench environment. +* Path: `actions\bench-ps.cmd` +* Typ: file + +[Bench CLI]: /ref/bench-ctl +[Git]: /ref/apps#Git diff --git a/docs/src-content/ref/file-structure.md b/docs/src-content/ref/file-structure.md index 5d1af5ab..c8ab1bf9 100644 --- a/docs/src-content/ref/file-structure.md +++ b/docs/src-content/ref/file-structure.md @@ -18,16 +18,12 @@ configuration property is mentioned. The core structure consists of directories and files, which are installed during the Bench setup, and _can not_ be moved via custom or site configuration. -* `actions` ([ActionDir](/ref/config/#ActionDir)) - This directory contains `*.cmd` scripts to run a couple of useful tasks - in the Bench environment. - They do load the `env.cmd` by themselfs if necessary. Therefore, - they can be started directly from an arbitrary command prompt, via a Windows shortcut, - or from the explorer. - + `bench-bash.cmd` - + `bench-cmd.cmd` - + `bench-ctl.cmd` - + `bench-ps.cmd` +* [`actions`](#action-dir) + ([ActionDir](/ref/config/#ActionDir)) + + [`bench-bash.cmd`](#action-bench-bash) + + [`bench-cmd.cmd`](#action-bench-cmd) + + [`bench-ctl.cmd`](#action-bench-ctl) + + [`bench-ps.cmd`](#action-bench-ps) + `clone-git-project.cmd` + `new-project.cmd` + `open-editor.cmd` @@ -51,26 +47,46 @@ during the Bench setup, and _can not_ be moved via custom or site configuration. + `editor.cmd` + `init.cmd` + `runps.cmd` -* `config` ([CustomConfigDir](/ref/config/#CustomConfigDir)) - + `apps.md` ([CustomAppIndexFile](/ref/config/#CustomAppIndexFile)) - + `apps-activated.txt` ([AppActivationFile](/ref/config/#AppActivationFile)) - + `apps-deactivated.txt` ([AppDeactivationFile](/ref/config/#AppDeactivationFile)) - + `config.md` ([CustomConfigFile](/ref/config/#CustomConfigFile)) - + `ConEmu.xml` ([ConEmuConfigFile](/ref/config/#ConEmuConfigFile)) +* `config` + ([CustomConfigDir](/ref/config/#CustomConfigDir)) + + `apps.md` + ([CustomAppIndexFile](/ref/config/#CustomAppIndexFile)) + + `apps-activated.txt` + ([AppActivationFile](/ref/config/#AppActivationFile)) + + `apps-deactivated.txt` + ([AppDeactivationFile](/ref/config/#AppDeactivationFile)) + + `config.md` + ([CustomConfigFile](/ref/config/#CustomConfigFile)) + + `ConEmu.xml` + ([ConEmuConfigFile](/ref/config/#ConEmuConfigFile)) + `env.ps1` + `setup.ps1` * `res` - + `apps` ([AppResourceBaseDir](/ref/config/#AppResourceBaseDir)) - + `apps.template.md` ([CustomAppIndexTemplateFile](/ref/config/#CustomAppIndexTemplateFile)) - + `apps-activated.template.txt` ([AppActivationTemplateFile](/ref/config/#AppActivationTemplateFile)) - + `apps-deactivated.template.txt` ([AppDeactivationTemplateFile](/ref/config/#AppDeactivationTemplateFile)) + + `apps` + ([AppResourceBaseDir](/ref/config/#AppResourceBaseDir)) + + `apps.template.md` + ([CustomAppIndexTemplateFile](/ref/config/#CustomAppIndexTemplateFile)) + + `apps-activated.template.txt` + ([AppActivationTemplateFile](/ref/config/#AppActivationTemplateFile)) + + `apps-deactivated.template.txt` + ([AppDeactivationTemplateFile](/ref/config/#AppDeactivationTemplateFile)) + `bench-install.bat` - + `bench-site.template.md` ([SiteConfigTemplateFile](/ref/config/#SiteConfigTemplateFile)) - + `ConEmu.template.xml` ([ConEmuConfigTemplateFile](/ref/config/#ConEmuConfigTemplateFile)) + + `bench-site.template.md` + ([SiteConfigTemplateFile](/ref/config/#SiteConfigTemplateFile)) + + `ConEmu.template.xml` + ([ConEmuConfigTemplateFile](/ref/config/#ConEmuConfigTemplateFile)) + `config.md` - + `config.template.md` ([CustomConfigTemplateFile](/ref/config/#CustomConfigTemplateFile)) - + `version.txt` ([VersionFile](/ref/config/#VersionFile)) -* `lib` ([LibDir](/ref/config/#LibDir)) + + `config.template.md` + ([CustomConfigTemplateFile](/ref/config/#CustomConfigTemplateFile)) + + `version.txt` + ([VersionFile](/ref/config/#VersionFile)) +* `lib` + ([LibDir](/ref/config/#LibDir)) + + `_proxies` + ([AppAdornmentBaseDir](/ref/config/#AppAdornmentBaseDir)) + + `_launcher` + ([LauncherScriptDir](/ref/config/#LauncherScriptDir)) + + ... * `CHANGELOG.md` * `env.cmd` * `LICENSE.md` @@ -83,16 +99,72 @@ during the usage of Bench – including the installation of apps, and _can_ be moved via custom or site configuration. * `archive` + ([ProjectArchiveDir](/ref/config/#ProjectArchiveDir)) * `cache` + ([DownloadDir](/ref/config/#DownloadDir)) * `home` + ([HomeDir](/ref/config/#HomeDir)) + `AppData` - `Local` + ([LocalAppDataDir](/ref/config/#LocalAppDataDir)) - `Roaming` + ([AppDataDir](/ref/config/#AppDataDir)) + `Desktop` + `Documents` + + `registry_isolation` + ([AppRegistryBaseDir](/ref/config/#AppRegistryBaseDir)) + ... * `launcher` + ([LauncherDir](/ref/config/#LauncherDir)) * `log` + ([LogDir](/ref/config/#LogDir)) * `projects` + ([ProjectRootDir](/ref/config/#ProjectRootDir)) * `tmp` -* `bench-site.md` ([SiteConfigFileName](/ref/config/#SiteConfigFileName)) + ([TempDir](/ref/config/#TempDir)) +* `bench-site.md` + ([SiteConfigFileName](/ref/config/#SiteConfigFileName)) + +## Details {#details} + +### Action Directory {#action-dir} + +* Description: Script for task execution in the Bench environment. +* Path: `actions` +* Typ: directory +* Config Property: ([ActionDir](/ref/config/#ActionDir)) + +This directory contains `*.cmd` scripts to run a couple of useful tasks +in the Bench environment. +They do load the `env.cmd` by themselfs if necessary. +Therefore, they can be started directly from an arbitrary command prompt, +via a Windows shortcut, or from the explorer. + +### Action `bench-bash` {#action-bench-bash} + +* Description: Starts a [Git][] shell in the Bench environment. +* Path: `actions\bench-bash.cmd` +* Typ: file + +This action will fail if [Git][] is not installed + +### Action `bench-cmd` {#action-bench-cmd} + +* Description: Starts a Windows CMD console in the Bench environment. +* Path: `actions\bench-cmd.cmd` +* Typ: file + +### Action `bench-ctl` {#action-bench-ctl} + +* Description: Starts the [command line interface][Bench CLI] of the Bench manager. +* Path: `actions\bench-ctl.cmd` +* Typ: file + +### Action `bench-ps` {#action-bench-ps} + +* Description: Starts a PowerShell console in the Bench environment. +* Path: `actions\bench-ps.cmd` +* Typ: file + +[Bench CLI]: /ref/bench-ctl +[Git]: /ref/apps#Git From 426f0b728ad04274b3eb555d73281dfc40de2fe0 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 9 Jul 2016 11:28:59 +0200 Subject: [PATCH 11/52] remove unnecessary file --- docs/src-content/ref/file-structure.md | 170 ------------------------- 1 file changed, 170 deletions(-) delete mode 100644 docs/src-content/ref/file-structure.md diff --git a/docs/src-content/ref/file-structure.md b/docs/src-content/ref/file-structure.md deleted file mode 100644 index c8ab1bf9..00000000 --- a/docs/src-content/ref/file-structure.md +++ /dev/null @@ -1,170 +0,0 @@ -+++ -date = "2016-06-22T13:43:12+02:00" -description = "The layout of the folders and files in the Bench environment" -draft = true -title = "File Structure" -weight = 4 -+++ - -The file structure of Bench is devided in two groups, the core and the extended file structure. -If the location of files and directories is not changed via custom or site configuration, -all files and folders of Bench live in one directory: the _root directory of Bench_. -In the following sections, the file structure is described according to the default configuration. -If a directory or file can be configured to be elsewhere, the responsible -configuration property is mentioned. - -## Core Structure {#core} - -The core structure consists of directories and files, which are installed -during the Bench setup, and _can not_ be moved via custom or site configuration. - -* [`actions`](#action-dir) - ([ActionDir](/ref/config/#ActionDir)) - + [`bench-bash.cmd`](#action-bench-bash) - + [`bench-cmd.cmd`](#action-bench-cmd) - + [`bench-ctl.cmd`](#action-bench-ctl) - + [`bench-ps.cmd`](#action-bench-ps) - + `clone-git-project.cmd` - + `new-project.cmd` - + `open-editor.cmd` - + `project-backup.cmd` - + `project-editor.cmd` - + `project-ps.cmd` - + `project-watch.cmd` -* `auto` - + `apps` - - `.extract.ps1` - - `.setup.ps1` - - `.env.ps1` - - `.remove.ps1` - + `bin` - - `BenchDashboard.exe` - - `BenchLib.dll` - + `lib` - - `bench.lib.ps1` - - ... - + `archive.cmd` - + `editor.cmd` - + `init.cmd` - + `runps.cmd` -* `config` - ([CustomConfigDir](/ref/config/#CustomConfigDir)) - + `apps.md` - ([CustomAppIndexFile](/ref/config/#CustomAppIndexFile)) - + `apps-activated.txt` - ([AppActivationFile](/ref/config/#AppActivationFile)) - + `apps-deactivated.txt` - ([AppDeactivationFile](/ref/config/#AppDeactivationFile)) - + `config.md` - ([CustomConfigFile](/ref/config/#CustomConfigFile)) - + `ConEmu.xml` - ([ConEmuConfigFile](/ref/config/#ConEmuConfigFile)) - + `env.ps1` - + `setup.ps1` -* `res` - + `apps` - ([AppResourceBaseDir](/ref/config/#AppResourceBaseDir)) - + `apps.template.md` - ([CustomAppIndexTemplateFile](/ref/config/#CustomAppIndexTemplateFile)) - + `apps-activated.template.txt` - ([AppActivationTemplateFile](/ref/config/#AppActivationTemplateFile)) - + `apps-deactivated.template.txt` - ([AppDeactivationTemplateFile](/ref/config/#AppDeactivationTemplateFile)) - + `bench-install.bat` - + `bench-site.template.md` - ([SiteConfigTemplateFile](/ref/config/#SiteConfigTemplateFile)) - + `ConEmu.template.xml` - ([ConEmuConfigTemplateFile](/ref/config/#ConEmuConfigTemplateFile)) - + `config.md` - + `config.template.md` - ([CustomConfigTemplateFile](/ref/config/#CustomConfigTemplateFile)) - + `version.txt` - ([VersionFile](/ref/config/#VersionFile)) -* `lib` - ([LibDir](/ref/config/#LibDir)) - + `_proxies` - ([AppAdornmentBaseDir](/ref/config/#AppAdornmentBaseDir)) - + `_launcher` - ([LauncherScriptDir](/ref/config/#LauncherScriptDir)) - + ... -* `CHANGELOG.md` -* `env.cmd` -* `LICENSE.md` -* `README.md` - -## Extended Structure {#extended} - -The extended structure consists of directories and files, which are created -during the usage of Bench – including the installation of apps, -and _can_ be moved via custom or site configuration. - -* `archive` - ([ProjectArchiveDir](/ref/config/#ProjectArchiveDir)) -* `cache` - ([DownloadDir](/ref/config/#DownloadDir)) -* `home` - ([HomeDir](/ref/config/#HomeDir)) - + `AppData` - - `Local` - ([LocalAppDataDir](/ref/config/#LocalAppDataDir)) - - `Roaming` - ([AppDataDir](/ref/config/#AppDataDir)) - + `Desktop` - + `Documents` - + `registry_isolation` - ([AppRegistryBaseDir](/ref/config/#AppRegistryBaseDir)) - + ... -* `launcher` - ([LauncherDir](/ref/config/#LauncherDir)) -* `log` - ([LogDir](/ref/config/#LogDir)) -* `projects` - ([ProjectRootDir](/ref/config/#ProjectRootDir)) -* `tmp` - ([TempDir](/ref/config/#TempDir)) -* `bench-site.md` - ([SiteConfigFileName](/ref/config/#SiteConfigFileName)) - -## Details {#details} - -### Action Directory {#action-dir} - -* Description: Script for task execution in the Bench environment. -* Path: `actions` -* Typ: directory -* Config Property: ([ActionDir](/ref/config/#ActionDir)) - -This directory contains `*.cmd` scripts to run a couple of useful tasks -in the Bench environment. -They do load the `env.cmd` by themselfs if necessary. -Therefore, they can be started directly from an arbitrary command prompt, -via a Windows shortcut, or from the explorer. - -### Action `bench-bash` {#action-bench-bash} - -* Description: Starts a [Git][] shell in the Bench environment. -* Path: `actions\bench-bash.cmd` -* Typ: file - -This action will fail if [Git][] is not installed - -### Action `bench-cmd` {#action-bench-cmd} - -* Description: Starts a Windows CMD console in the Bench environment. -* Path: `actions\bench-cmd.cmd` -* Typ: file - -### Action `bench-ctl` {#action-bench-ctl} - -* Description: Starts the [command line interface][Bench CLI] of the Bench manager. -* Path: `actions\bench-ctl.cmd` -* Typ: file - -### Action `bench-ps` {#action-bench-ps} - -* Description: Starts a PowerShell console in the Bench environment. -* Path: `actions\bench-ps.cmd` -* Typ: file - -[Bench CLI]: /ref/bench-ctl -[Git]: /ref/apps#Git From af29e6c1d275939500b70fb4935565903f44858a Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 9 Jul 2016 11:44:03 +0200 Subject: [PATCH 12/52] added content --- docs/content/ref/file-structure.md | 48 ++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/docs/content/ref/file-structure.md b/docs/content/ref/file-structure.md index c8ab1bf9..7e1e11f3 100644 --- a/docs/content/ref/file-structure.md +++ b/docs/content/ref/file-structure.md @@ -31,25 +31,25 @@ during the Bench setup, and _can not_ be moved via custom or site configuration. + `project-editor.cmd` + `project-ps.cmd` + `project-watch.cmd` -* `auto` - + `apps` +* [`auto`](#auto-dir) Bench Automation + + [`apps`](#auto-apps-dir) App Custom Scripts - `.extract.ps1` - `.setup.ps1` - `.env.ps1` - `.remove.ps1` - + `bin` + + [`bin`](#auto-bin-dir) Bench Binaries - `BenchDashboard.exe` - `BenchLib.dll` - + `lib` + + [`lib`](#auto-lib-dir) Bench Scripts - `bench.lib.ps1` - ... + `archive.cmd` + `editor.cmd` + `init.cmd` + `runps.cmd` -* `config` +* `config` Custom Configuration ([CustomConfigDir](/ref/config/#CustomConfigDir)) - + `apps.md` + + `apps.md` App Library ([CustomAppIndexFile](/ref/config/#CustomAppIndexFile)) + `apps-activated.txt` ([AppActivationFile](/ref/config/#AppActivationFile)) @@ -61,8 +61,8 @@ during the Bench setup, and _can not_ be moved via custom or site configuration. ([ConEmuConfigFile](/ref/config/#ConEmuConfigFile)) + `env.ps1` + `setup.ps1` -* `res` - + `apps` +* `res` Bench Resources + + `apps` App Resources ([AppResourceBaseDir](/ref/config/#AppResourceBaseDir)) + `apps.template.md` ([CustomAppIndexTemplateFile](/ref/config/#CustomAppIndexTemplateFile)) @@ -70,17 +70,17 @@ during the Bench setup, and _can not_ be moved via custom or site configuration. ([AppActivationTemplateFile](/ref/config/#AppActivationTemplateFile)) + `apps-deactivated.template.txt` ([AppDeactivationTemplateFile](/ref/config/#AppDeactivationTemplateFile)) - + `bench-install.bat` + + `bench-install.bat` Bootstrap Batch File + `bench-site.template.md` ([SiteConfigTemplateFile](/ref/config/#SiteConfigTemplateFile)) + `ConEmu.template.xml` ([ConEmuConfigTemplateFile](/ref/config/#ConEmuConfigTemplateFile)) - + `config.md` + + `config.md` Default Configuration + `config.template.md` ([CustomConfigTemplateFile](/ref/config/#CustomConfigTemplateFile)) - + `version.txt` + + `version.txt` Version String ([VersionFile](/ref/config/#VersionFile)) -* `lib` +* `lib` App Installations ([LibDir](/ref/config/#LibDir)) + `_proxies` ([AppAdornmentBaseDir](/ref/config/#AppAdornmentBaseDir)) @@ -166,5 +166,29 @@ This action will fail if [Git][] is not installed * Path: `actions\bench-ps.cmd` * Typ: file +### Bench Automation Directory {#auto-dir} + +* Description: The base directory for the Bench scripts and binaries. +* Path: `auto` +* Typ: directory + +### App Custom Script Directory {#auto-apps-dir} + +* Description: The directory with the custom scripts of the apps included in Bench. +* Path: `auto\apps` +* Typ: directory + +### Bench Binary Directory {#auto-bin-dir} + +* Description: The directory with all binary executables and libraries of Bench. +* Path: `auto\bin` +* Typ: directory + +### Bench Script Directory {#auto-lib-dir} + +* Description: The directory with the PowerShell scripts of Bench. +* Path: `auto\lib` +* Typ: directory + [Bench CLI]: /ref/bench-ctl [Git]: /ref/apps#Git From aceb0c7c99ba00ebf0f5373789853056a515c34e Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Mon, 11 Jul 2016 11:38:17 +0200 Subject: [PATCH 13/52] renamed ref/lib-api into ref/clr-api --- docs/content/ref/{lib-api.md => clr-api.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename docs/content/ref/{lib-api.md => clr-api.md} (83%) diff --git a/docs/content/ref/lib-api.md b/docs/content/ref/clr-api.md similarity index 83% rename from docs/content/ref/lib-api.md rename to docs/content/ref/clr-api.md index 75357241..d2bf3eba 100644 --- a/docs/content/ref/lib-api.md +++ b/docs/content/ref/clr-api.md @@ -2,7 +2,7 @@ date = "2016-06-22T13:43:46+02:00" description = "The programming interface of the core library of Bench" draft = true -title = "BenchLib API" +title = "BenchLib .NET API" weight = 10 +++ From 23f276f5f2651773d2f037639020174780b034e2 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Mon, 11 Jul 2016 11:38:29 +0200 Subject: [PATCH 14/52] added description for custom scripts --- docs/content/ref/file-structure.md | 100 +++++++++++++++++++++++++++-- 1 file changed, 95 insertions(+), 5 deletions(-) diff --git a/docs/content/ref/file-structure.md b/docs/content/ref/file-structure.md index 7e1e11f3..aceaf965 100644 --- a/docs/content/ref/file-structure.md +++ b/docs/content/ref/file-structure.md @@ -33,10 +33,10 @@ during the Bench setup, and _can not_ be moved via custom or site configuration. + `project-watch.cmd` * [`auto`](#auto-dir) Bench Automation + [`apps`](#auto-apps-dir) App Custom Scripts - - `.extract.ps1` - - `.setup.ps1` - - `.env.ps1` - - `.remove.ps1` + - [`.extract.ps1`](#auto-apps-extract) + - [`.setup.ps1`](#auto-apps-setup) + - [`.env.ps1`](#auto-apps-env) + - [`.remove.ps1`](#auto-apps-remove) + [`bin`](#auto-bin-dir) Bench Binaries - `BenchDashboard.exe` - `BenchLib.dll` @@ -86,7 +86,7 @@ during the Bench setup, and _can not_ be moved via custom or site configuration. ([AppAdornmentBaseDir](/ref/config/#AppAdornmentBaseDir)) + `_launcher` ([LauncherScriptDir](/ref/config/#LauncherScriptDir)) - + ... + + `` App Target Dir * `CHANGELOG.md` * `env.cmd` * `LICENSE.md` @@ -178,6 +178,96 @@ This action will fail if [Git][] is not installed * Path: `auto\apps` * Typ: directory +### App Custom Script `extract` {#auto-apps-extract} + +* Description: Custom script for app resource extraction. +* Path: `auto\apps\.extract.ps1` +* Typ: file + +Custom scripts for app resource extraction must be named with the app ID +in lower case, and the name extension `.extract.ps1`. + +The custom script for extraction is executed if the +[`ArchiveTyp`](/ref/app-properties/#ArchiveTyp) is set to `auto` or `custom`. +If the [`ArchiveTyp`](/ref/app-properties/#ArchiveTyp) of the app is set +to `auto` and a custom script for extraction for this app exists, +the custom script takes precedence over the other extraction methods. + +Inside of the custom script the [PowerShell API](/ref/ps-api/) is available. +Custom extraction scripts are called with two command line arguments: + +1. The absolute path of the downloaded app resource archive +2. The absolute path of the target directory to extract the resources + +Example for extraction of a nested archive: + +```PowerShell +param ($archivePath, $targetDir) + +# create temporary directory +$tmpDir = Empty-Dir "$(Get-ConfigValue TempDir)\custom_extract" + +# get path of 7-Zip +$7z = App-Exe SvZ + +# call 7-Zip to extract outer archive +& $7z x "-o$tmpDir" "$archivePath" + +# check if expected inner archive exists +if (!(Test-Path "$tmpDir\nested.zip")) +{ + throw "Did not find the expected content in the app resource." +} + +# call 7-Zip to extract inner archive +& $7z x "-o$targetDir" "$tmpDir\nested.zip" + +# Delete temporary directory +Purge-Dir $tmpDir +``` + +### App Custom Script `setup` {#auto-apps-setup} + +* Description: Custom script for app setup. +* Path: `auto\apps\.setup.md` +* Typ: file + +Custom scripts for app resource extraction must be named with the app ID +in lower case, and the name extension `.setup.ps1`. + +If a custom setup script for an app exists, it is executed after +the installation of the (extracted) app resources in the +[apps target dir](#lib-app). +Inside of the custom script the [PowerShell API](/ref/ps-api/) is available. + +### App Custom Script `env` {#auto-apps-env} + +* Description: Custom script for environment setup. +* Path: `auto\apps\.env.ps1` +* Typ: file + +Custom scripts for environment setup must be named with the app ID +in lower case, and the name extension `.env.ps1`. + +If a custom environment setup script for an app exists, it is executed +after the setup to update configuration files depending +on the location of Bench or other [configuration properties](/ref/config). +It is also called if the _Upade Environment_ task for Bench is executed. +Inside of the custom script the [PowerShell API](/ref/ps-api/) is available. + +### App Custom Script `remove` {#auto-apps-remove} + +* Description: Custom script for app deinstallation. +* Path: `auto\apps\.remove.ps1` +* Typ: files + +Custom scripts for deinstallation must be named with the app ID +in lower case, and the name extension `.remove.ps1`. + +If a custom deinstallation script for an app exists, it is executed +instead of the default uninstall method. +Inside of the custom script the [PowerShell API](/ref/ps-api/) is available. + ### Bench Binary Directory {#auto-bin-dir} * Description: The directory with all binary executables and libraries of Bench. From 5ad272efebe329378625e2f25b955b5b5e973589 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Mon, 11 Jul 2016 13:51:54 +0200 Subject: [PATCH 15/52] added more file descriptions --- docs/content/ref/file-structure.md | 121 +++++++++++++++++++++++++---- 1 file changed, 108 insertions(+), 13 deletions(-) diff --git a/docs/content/ref/file-structure.md b/docs/content/ref/file-structure.md index aceaf965..c74b4be6 100644 --- a/docs/content/ref/file-structure.md +++ b/docs/content/ref/file-structure.md @@ -37,9 +37,11 @@ during the Bench setup, and _can not_ be moved via custom or site configuration. - [`.setup.ps1`](#auto-apps-setup) - [`.env.ps1`](#auto-apps-env) - [`.remove.ps1`](#auto-apps-remove) + - [`.pre-run.ps1`](#auto-apps-pre-run) + - [`.post-run.ps1`](#auto-apps-post-run) + [`bin`](#auto-bin-dir) Bench Binaries - - `BenchDashboard.exe` - - `BenchLib.dll` + - [`BenchDashboard.exe`](/ref/dashboard/) + - [`BenchLib.dll`](/ref/clr-api/) + [`lib`](#auto-lib-dir) Bench Scripts - `bench.lib.ps1` - ... @@ -47,20 +49,20 @@ during the Bench setup, and _can not_ be moved via custom or site configuration. + `editor.cmd` + `init.cmd` + `runps.cmd` -* `config` Custom Configuration +* [`config`](#config) Custom Configuration ([CustomConfigDir](/ref/config/#CustomConfigDir)) - + `apps.md` App Library + + [`apps.md`](#config-apps) App Library ([CustomAppIndexFile](/ref/config/#CustomAppIndexFile)) - + `apps-activated.txt` + + [`apps-activated.txt`](#config-apps-activated) App Activation List ([AppActivationFile](/ref/config/#AppActivationFile)) - + `apps-deactivated.txt` + + [`apps-deactivated.txt`](#config-apps-deactivated) App Deactivation List ([AppDeactivationFile](/ref/config/#AppDeactivationFile)) - + `config.md` + + [`config.md`](#config-config) Custom Configuration File ([CustomConfigFile](/ref/config/#CustomConfigFile)) + `ConEmu.xml` ([ConEmuConfigFile](/ref/config/#ConEmuConfigFile)) - + `env.ps1` - + `setup.ps1` + + `env.ps1` Environment Setup Hook + + `setup.ps1` Setup Hook * `res` Bench Resources + `apps` App Resources ([AppResourceBaseDir](/ref/config/#AppResourceBaseDir)) @@ -193,7 +195,7 @@ If the [`ArchiveTyp`](/ref/app-properties/#ArchiveTyp) of the app is set to `auto` and a custom script for extraction for this app exists, the custom script takes precedence over the other extraction methods. -Inside of the custom script the [PowerShell API](/ref/ps-api/) is available. +Inside of the custom script is the [PowerShell API](/ref/ps-api/) iis available. Custom extraction scripts are called with two command line arguments: 1. The absolute path of the downloaded app resource archive @@ -238,7 +240,7 @@ in lower case, and the name extension `.setup.ps1`. If a custom setup script for an app exists, it is executed after the installation of the (extracted) app resources in the [apps target dir](#lib-app). -Inside of the custom script the [PowerShell API](/ref/ps-api/) is available. +Inside of the custom script is the [PowerShell API](/ref/ps-api/) is available. ### App Custom Script `env` {#auto-apps-env} @@ -253,7 +255,7 @@ If a custom environment setup script for an app exists, it is executed after the setup to update configuration files depending on the location of Bench or other [configuration properties](/ref/config). It is also called if the _Upade Environment_ task for Bench is executed. -Inside of the custom script the [PowerShell API](/ref/ps-api/) is available. +Inside of the custom script is the [PowerShell API](/ref/ps-api/) iis available. ### App Custom Script `remove` {#auto-apps-remove} @@ -266,7 +268,37 @@ in lower case, and the name extension `.remove.ps1`. If a custom deinstallation script for an app exists, it is executed instead of the default uninstall method. -Inside of the custom script the [PowerShell API](/ref/ps-api/) is available. +Inside of the custom script is the [PowerShell API](/ref/ps-api/) iis available. + +### App Custom Script `pre-run` {#auto-apps-pre-run} + +* Description: Pre-run hook for adorned executables of an app. +* Path: `auto\apps\.pre-run.ps1` +* Typ: file + +The custom pre-run script is executed immediatly before an app executable is run. +It is only executed if an app executable is run via its execution proxy. +This is usually the case because it is listed in +[AdornedExecutables](/ref/app-properties/#AdornedExecutables). +The [main executable](/ref/app-properties/#Exe) of an app is automatically +included in the list of adorned executables +if the [registry isolation](/ref/app-properties/#RegistryKeys) is used. +Inside of the custom script is the [PowerShell API](/ref/ps-api/) iis available. + +### App Custom Script `post-run` {#auto-apps-post-run} + +* Description: Post-run hook for adorned executables of an app. +* Path: `auto\apps\.post-run.ps1` +* Typ: file + +The custom post-run script is executed immediatly after an app executable is run. +It is only executed if an app executable is run via its execution proxy. +This is usually the case because it is listed in +[AdornedExecutables](/ref/app-properties/#AdornedExecutables). +The [main executable](/ref/app-properties/#Exe) of an app is automatically +included in the list of adorned executables +if the [registry isolation](/ref/app-properties/#RegistryKeys) is used. +Inside of the custom script is the [PowerShell API](/ref/ps-api/) iis available. ### Bench Binary Directory {#auto-bin-dir} @@ -280,5 +312,68 @@ Inside of the custom script the [PowerShell API](/ref/ps-api/) is available. * Path: `auto\lib` * Typ: directory +### Configuration Directory {#config-dir} + +* Description: The directory for the custom configuration. +* Path: `config` +* Config Property: [CustomConfigDir](/ref/config/#CustomConfigDir) +* Typ: directory + +This directory is designed to be put under version control, +to manage and share Bench configurations. + +### Custom App Library {#config-apps} + +* Description: The custom app library. +* Path: `config\apps.md` +* Config Property: [CustomAppIndexFile](/ref/config/#CustomAppIndexFile) +* Typ: file + +The custom app libary file is written in [Markdown list syntax](/ref/markup-syntax). + +### App Activation List {#config-apps-activated} + +* Description: The list of activated apps. +* Path: `config\apps-activated.txt` +* Config Property: [AppActivationFile](/ref/config/#AppActivationFile) +* Typ: file + +The specified file must be an UTF8 encoded text file. +Every non empty line, which is not commented with a # is interpreted +as an app ID. +Only non-space characters, up to the first space or the end of a line, +are considered. + +### App Deactivation List {#config-apps-deactivated} + +* Description: The list of deactivated apps. +* Path: `config\apps-deactivated.txt` +* Config Property: [AppDeactivationFile](/ref/config/#AppDeactivationFile) +* Typ: file + +The specified file must be an UTF8 encoded text file. +Every non empty line, which is not commented with a # is interpreted +as an app ID. +Only non-space characters, up to the first space or the end of a line, +are considered. + +### Custom Configuration File {#config-config} + +* Description: The custom configuration file. +* Path: `config\config.md` +* Config Property: [CustomConfigFile](/ref/config/#CustomConfigFile) +* Typ: file + +The custom configuration file is written in [Markdown list syntax](/ref/markup-syntax). + +### Environment Setup Hook {#config-env} + +* Description: The hook script for environment setup. +* Path: `config\env.ps1` +* Typ: file + +This script is executed, at the end of the Bench environment setup. +Inside of the custom script is the [PowerShell API](/ref/ps-api/) iis available. + [Bench CLI]: /ref/bench-ctl [Git]: /ref/apps#Git From be56088384413470927bcb996fd1cc90f62de3aa Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Tue, 12 Jul 2016 14:59:46 +0200 Subject: [PATCH 16/52] moved custom styles to custom.less and added LESS to the Gulp tasks --- docs/gulpfile.js | 10 +- docs/package.json | 1 + docs/src-static/css/custom.css | 162 ++++++++++++++++---------------- docs/src-static/css/custom.less | 116 +++++++++++++++++++++++ docs/static/css/style.min.css | 2 +- 5 files changed, 210 insertions(+), 81 deletions(-) create mode 100644 docs/src-static/css/custom.less diff --git a/docs/gulpfile.js b/docs/gulpfile.js index fa5e5e17..a44f3e23 100644 --- a/docs/gulpfile.js +++ b/docs/gulpfile.js @@ -1,6 +1,7 @@ var os = require('os'); var gulp = require('gulp'); var concat = require('gulp-concat'); +var less = require('gulp-less'); var cleanCSS = require('gulp-clean-css'); var mdquery = require('mdquery').transform; var textTransformation = require('gulp-text-simple'); @@ -35,7 +36,14 @@ return gulp.src(['bower_components/font-awesome/fonts/*']) .pipe(gulp.dest('static/fonts')); }); -gulp.task('build-css', function () { +gulp.task('build-less', function () { + return gulp.src('./src-static/css/*.less') + .pipe(less()) + .pipe(concat('custom.css')) + .pipe(gulp.dest('./src-static/css/')); +}); + +gulp.task('build-css', ['build-less'], function () { return gulp.src(['./bower_components/pure/base.css', './bower_components/pure/grids-responsive.css', './bower_components/pure/menus-core.css', diff --git a/docs/package.json b/docs/package.json index 4dec1500..31759bf8 100644 --- a/docs/package.json +++ b/docs/package.json @@ -8,6 +8,7 @@ "gulp": "^3.9.1", "gulp-clean-css": "^2.0.10", "gulp-concat": "^2.6.0", + "gulp-less": "^3.1.0", "gulp-text-simple": "^0.4.0", "mdquery": "^0.2.2" } diff --git a/docs/src-static/css/custom.css b/docs/src-static/css/custom.css index 4d2aec41..fa2a3b68 100644 --- a/docs/src-static/css/custom.css +++ b/docs/src-static/css/custom.css @@ -1,105 +1,109 @@ #menu .brand { - font-weight: normal; - font-size: 1.3em; - margin: 0; + font-weight: normal; + font-size: 1.3em; + margin: 0; +} +h1:target, +h2:target, +h3:target, +h4:target, +h5:target, +h6:target { + color: #3b8bba; } - .content table { - border-collapse: collapse; - margin-top: 1em; - border: 1px solid #cbcbcb; + border-collapse: collapse; + margin-top: 1em; + border: 1px solid #cbcbcb; } -.content table thead { - background-color: #e0e0e0; - color: #000; +.content table td, +.content table th { + padding: 0.33em 0.66em; + border-left: 1px solid #cbcbcb; + border-right: 1px solid #cbcbcb; } -.content table thead td, .content table thead th { - border-bottom: 1ps solid #cbcbcb; +.content table tr:nth-child(even) { + background-color: #f2f2f2; } -.content table td, .content table th { - padding: 0.33em 0.66em; - border-left: 1px solid #cbcbcb; - border-right: 1px solid #cbcbcb; +.content table thead { + background-color: #e0e0e0; + color: #000; } -.content table tr:nth-child(even) { - background-color: #f2f2f2; +.content table thead td, +.content table thead th { + border-bottom: 1ps solid #cbcbcb; } - .list-item-description:before { - content: "\00A0\2013\00A0"; + content: "\00A0\2013\00A0"; } - article.teaser h2 { - text-align: left; - margin-left: 160px; - font-weight: normal; - font-size: 1.75em; - transition: margin-left 0.2s ease-out; - -webkit-transition: margin-left 0.2s ease-out; -} - + text-align: left; + margin-left: 160px; + font-weight: normal; + font-size: 1.75em; + transition: margin-left 0.2s ease-out; + -webkit-transition: margin-left 0.2s ease-out; +} .teaser-icon { - clear: left; - float: left; + clear: left; + float: left; } .teaser-icon .fa { - font-size: 128px; - transition: font-size 0.2s ease-out; - -webkit-transition: font-size 0.2s ease-out; + font-size: 128px; + transition: font-size 0.2s ease-out; + -webkit-transition: font-size 0.2s ease-out; } .teaser-text { - margin-left: 160px; - transition: margin-left 0.2s ease-out; - -webkit-transition: margin-left 0.2s ease-out; + margin-left: 160px; + transition: margin-left 0.2s ease-out; + -webkit-transition: margin-left 0.2s ease-out; } .teaser-text p:last-of-type { - margin-bottom: 0; + margin-bottom: 0; } .teaser-follow-up { - text-align: right; + text-align: right; } - @media (max-height: 48em) { - #menu { - width: 165px; - } + #menu { + width: 165px; + } } - @media (max-width: 48em) { - .list-item-description:before { - content: ""; - } - .list-item-description { - display: block; - } - article.teaser h2 { - margin-left: 120px; - } - .teaser-icon .fa { - font-size: 96px; - } - .teaser-text { - margin-left: 120px; - } + .list-item-description:before { + content: ""; + } + .list-item-description { + display: block; + } + article.teaser h2 { + margin-left: 120px; + } + .teaser-icon .fa { + font-size: 96px; + } + .teaser-text { + margin-left: 120px; + } } @media (max-width: 30em) { - .list-item-description { - display: none; - } - article.teaser h2 { - margin-left: 0; - margin-top: 0em; - text-align: center; - } - .teaser-icon { - float: none; - text-align: center; - margin: 1em 0; - } - .teaser-icon .fa { - font-size: 64px; - } - .teaser-text { - margin-left: inherit; - } -} \ No newline at end of file + .list-item-description { + display: none; + } + article.teaser h2 { + margin-left: 0; + margin-top: 0em; + text-align: center; + } + .teaser-icon { + float: none; + text-align: center; + margin: 1em 0; + } + .teaser-icon .fa { + font-size: 64px; + } + .teaser-text { + margin-left: inherit; + } +} diff --git a/docs/src-static/css/custom.less b/docs/src-static/css/custom.less new file mode 100644 index 00000000..8c5bff01 --- /dev/null +++ b/docs/src-static/css/custom.less @@ -0,0 +1,116 @@ +#menu .brand { + font-weight: normal; + font-size: 1.3em; + margin: 0; +} + +h1:target, h2:target, h3:target, h4:target, h5:target, h6:target { + color: rgb(59, 139, 186); +} + +.content table { + border-collapse: collapse; + margin-top: 1em; + border: 1px solid #cbcbcb; + + td, th { + padding: 0.33em 0.66em; + border-left: 1px solid #cbcbcb; + border-right: 1px solid #cbcbcb; + } + + tr:nth-child(even) { + background-color: #f2f2f2; + } + + thead { + background-color: #e0e0e0; + color: #000; + + td, th { + border-bottom: 1ps solid #cbcbcb; + } + } +} + +.list-item-description:before { + content: "\00A0\2013\00A0"; +} + +article.teaser h2 { + text-align: left; + margin-left: 160px; + font-weight: normal; + font-size: 1.75em; + transition: margin-left 0.2s ease-out; + -webkit-transition: margin-left 0.2s ease-out; +} + +.teaser-icon { + clear: left; + float: left; + + .fa { + font-size: 128px; + transition: font-size 0.2s ease-out; + -webkit-transition: font-size 0.2s ease-out; + } +} +.teaser-text { + margin-left: 160px; + transition: margin-left 0.2s ease-out; + -webkit-transition: margin-left 0.2s ease-out; + + p:last-of-type { + margin-bottom: 0; + } +} + +.teaser-follow-up { + text-align: right; +} + +@media (max-height: 48em) { + #menu { + width: 165px; + } +} + +@media (max-width: 48em) { + .list-item-description:before { + content: ""; + } + .list-item-description { + display: block; + } + article.teaser h2 { + margin-left: 120px; + } + .teaser-icon .fa { + font-size: 96px; + } + .teaser-text { + margin-left: 120px; + } +} +@media (max-width: 30em) { + .list-item-description { + display: none; + } + article.teaser h2 { + margin-left: 0; + margin-top: 0em; + text-align: center; + } + .teaser-icon { + float: none; + text-align: center; + margin: 1em 0; + .fa { + font-size: 64px; + } + } + .teaser-text { + margin-left: inherit; + } +} diff --git a/docs/static/css/style.min.css b/docs/static/css/style.min.css index 8559db8c..60c0191b 100644 --- a/docs/static/css/style.min.css +++ b/docs/static/css/style.min.css @@ -19,4 +19,4 @@ https://github.com/yahoo/pure/blob/master/LICENSE.md */.pure-menu{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.pure-menu-fixed{position:fixed;left:0;top:0;z-index:3}.fa-ul>li,.pure-menu-item,.pure-menu-list{position:relative}.pure-menu-list{list-style:none;margin:0;padding:0}.pure-menu-item{padding:0;margin:0;height:100%}.fa.fa-pull-left,.fa.pull-left{margin-right:.3em}.pure-menu-heading,.pure-menu-link{display:block;text-decoration:none;white-space:nowrap}.fa,.fa-stack{display:inline-block}/*! * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:FontAwesome;src:url(../fonts/fontawesome-webfont.eot?v=4.6.3);src:url(../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3) format('embedded-opentype'),url(../fonts/fontawesome-webfont.woff2?v=4.6.3) format('woff2'),url(../fonts/fontawesome-webfont.woff?v=4.6.3) format('woff'),url(../fonts/fontawesome-webfont.ttf?v=4.6.3) format('truetype'),url(../fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa.fa-pull-right,.fa.pull-right{margin-left:.3em}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right,.pull-right{float:right}.pull-left{float:left}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.hljs{display:block;overflow-x:auto;padding:.5em;color:#333;background:#f8f8f8}.hljs-comment,.hljs-quote{color:#998;font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:#333;font-weight:700}.hljs-literal,.hljs-number,.hljs-tag .hljs-attr,.hljs-template-variable,.hljs-variable{color:teal}.hljs-doctag,.hljs-string{color:#d14}.hljs-section,.hljs-selector-id,.hljs-title{color:#900;font-weight:700}.hljs-subst{font-weight:400}.hljs-class .hljs-title,.hljs-type{color:#458;font-weight:700}.hljs-attribute,.hljs-name,.hljs-tag{color:navy;font-weight:400}.hljs-meta,.hljs-strong{font-weight:700}.hljs-link,.hljs-regexp{color:#009926}.hljs-bullet,.hljs-symbol{color:#990073}.hljs-built_in,.hljs-builtin-name{color:#0086b3}.hljs-meta{color:#999}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.hljs-emphasis{font-style:italic}body{color:#777}.pure-img-responsive{max-width:100%;height:auto}#layout,#menu,.menu-link{-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}#layout{position:relative;padding-left:0}#layout.active #menu{left:150px;width:150px}#layout.active .menu-link{left:150px}#menu,.menu-link{position:fixed;top:0;left:0}.content{margin:0 auto 50px;padding:0 2em;max-width:800px;line-height:1.6em}.header{margin:0;color:#333;padding:2.5em 2em 0;border-bottom:1px solid #eee;font-family:Raleway,Helvetica,Arial,sans-serif}.header h1{margin:.2em 0;font-size:3em;font-weight:300}.header h2{font-weight:300;color:#ccc;padding:0;margin-top:0}.content-subhead{margin:50px 0 20px;font-weight:300;color:#888}#menu{margin-left:-150px;width:150px;bottom:0;z-index:1000;background:#191818;overflow-y:auto;-webkit-overflow-scrolling:touch}#menu a{color:#999;border:none;padding:.6em 0 .6em .6em}#menu .pure-menu,#menu .pure-menu ul{border:none;background:0 0}#menu .pure-menu .menu-item-divided,#menu .pure-menu ul{border-top:1px solid #333}#menu .pure-menu li a:focus,#menu .pure-menu li a:hover{background:#333}#menu .pure-menu-heading,#menu .pure-menu-selected{background:#1f8dd6}#menu .pure-menu-selected a{color:#fff}#menu .pure-menu-heading{font-size:110%;color:#fff;margin:0}.menu-link{display:block;background:#000;background:rgba(0,0,0,.7);font-size:10px;z-index:10;width:2em;height:auto;padding:2.1em 1.6em}.menu-link:focus,.menu-link:hover{background:#000}.menu-link span{position:relative;display:block}.menu-link span,.menu-link span:after,.menu-link span:before{background-color:#fff;width:100%;height:.2em}.menu-link span:after,.menu-link span:before{position:absolute;margin-top:-.6em;content:" "}.menu-link span:after{margin-top:.6em}@media (min-width:48em){.content,.header{padding-left:2em;padding-right:2em}#layout{padding-left:150px;left:0}#layout.active .menu-link,#menu,.menu-link{left:150px}.menu-link{position:fixed;display:none}}a{color:#3b8bba;text-decoration:none}.pagination a,a:visited{color:#265778}a:focus,a:hover{text-decoration:underline}.small-print{font-size:.8em;margin:.6em}.post-meta{font-size:90%}article>footer{text-align:right}.prev-next-post{margin-top:2em;padding-top:2em;padding-bottom:2em;border-top:1px solid #eee;border-bottom:1px solid #eee}.prev-next-post .prev{float:left;text-align:left;overflow:hidden}.prev-next-post .next{float:right;text-align:right;overflow:hidden}#menu .pure-menu{font-size:.9em}i{display:inline-block;margin-right:.2em}.pagination{text-align:center;margin-top:3em}#menu .brand{font-family:Raleway;letter-spacing:.1em;background:0 0;text-decoration:none;font-weight:400;font-size:1.3em;margin:0}.content table{margin-top:1em;border:1px solid #cbcbcb}.content table thead{background-color:#e0e0e0;color:#000}.content table thead td,.content table thead th{border-bottom:1ps solid #cbcbcb}.content table td,.content table th{padding:.33em .66em;border-left:1px solid #cbcbcb;border-right:1px solid #cbcbcb}.content table tr:nth-child(even){background-color:#f2f2f2}.list-item-description:before{content:"\00A0\2013\00A0"}article.teaser h2{text-align:left;margin-left:160px;font-weight:400;font-size:1.75em;transition:margin-left .2s ease-out;-webkit-transition:margin-left .2s ease-out}.teaser-icon{clear:left;float:left}.teaser-icon .fa{font-size:128px;transition:font-size .2s ease-out;-webkit-transition:font-size .2s ease-out}.teaser-text{margin-left:160px;transition:margin-left .2s ease-out;-webkit-transition:margin-left .2s ease-out}.teaser-text p:last-of-type{margin-bottom:0}.teaser-follow-up{text-align:right}@media (max-height:48em){#menu{width:165px}}@media (max-width:48em){#layout.active{position:relative;left:150px}.teaser-text,article.teaser h2{margin-left:120px}.list-item-description:before{content:""}.list-item-description{display:block}.teaser-icon .fa{font-size:96px}}@media (max-width:30em){.list-item-description{display:none}article.teaser h2{margin-left:0;margin-top:0;text-align:center}.teaser-icon{float:none;text-align:center;margin:1em 0}.teaser-icon .fa{font-size:64px}.teaser-text{margin-left:inherit}} \ No newline at end of file + */@font-face{font-family:FontAwesome;src:url(../fonts/fontawesome-webfont.eot?v=4.6.3);src:url(../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3) format('embedded-opentype'),url(../fonts/fontawesome-webfont.woff2?v=4.6.3) format('woff2'),url(../fonts/fontawesome-webfont.woff?v=4.6.3) format('woff'),url(../fonts/fontawesome-webfont.ttf?v=4.6.3) format('truetype'),url(../fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa.fa-pull-right,.fa.pull-right{margin-left:.3em}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right,.pull-right{float:right}.pull-left{float:left}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.hljs{display:block;overflow-x:auto;padding:.5em;color:#333;background:#f8f8f8}.hljs-comment,.hljs-quote{color:#998;font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:#333;font-weight:700}.hljs-literal,.hljs-number,.hljs-tag .hljs-attr,.hljs-template-variable,.hljs-variable{color:teal}.hljs-doctag,.hljs-string{color:#d14}.hljs-section,.hljs-selector-id,.hljs-title{color:#900;font-weight:700}.hljs-subst{font-weight:400}.hljs-class .hljs-title,.hljs-type{color:#458;font-weight:700}.hljs-attribute,.hljs-name,.hljs-tag{color:navy;font-weight:400}.hljs-meta,.hljs-strong{font-weight:700}.hljs-link,.hljs-regexp{color:#009926}.hljs-bullet,.hljs-symbol{color:#990073}.hljs-built_in,.hljs-builtin-name{color:#0086b3}.hljs-meta{color:#999}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.hljs-emphasis{font-style:italic}body{color:#777}.pure-img-responsive{max-width:100%;height:auto}#layout,#menu,.menu-link{-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}#layout{position:relative;padding-left:0}#layout.active #menu{left:150px;width:150px}#layout.active .menu-link{left:150px}#menu,.menu-link{position:fixed;top:0;left:0}.content{margin:0 auto 50px;padding:0 2em;max-width:800px;line-height:1.6em}.header{margin:0;color:#333;padding:2.5em 2em 0;border-bottom:1px solid #eee;font-family:Raleway,Helvetica,Arial,sans-serif}.header h1{margin:.2em 0;font-size:3em;font-weight:300}.header h2{font-weight:300;color:#ccc;padding:0;margin-top:0}.content-subhead{margin:50px 0 20px;font-weight:300;color:#888}#menu{margin-left:-150px;width:150px;bottom:0;z-index:1000;background:#191818;overflow-y:auto;-webkit-overflow-scrolling:touch}#menu a{color:#999;border:none;padding:.6em 0 .6em .6em}#menu .pure-menu,#menu .pure-menu ul{border:none;background:0 0}#menu .pure-menu .menu-item-divided,#menu .pure-menu ul{border-top:1px solid #333}#menu .pure-menu li a:focus,#menu .pure-menu li a:hover{background:#333}#menu .pure-menu-heading,#menu .pure-menu-selected{background:#1f8dd6}#menu .pure-menu-selected a{color:#fff}#menu .pure-menu-heading{font-size:110%;color:#fff;margin:0}.menu-link{display:block;background:#000;background:rgba(0,0,0,.7);font-size:10px;z-index:10;width:2em;height:auto;padding:2.1em 1.6em}.menu-link:focus,.menu-link:hover{background:#000}.menu-link span{position:relative;display:block}.menu-link span,.menu-link span:after,.menu-link span:before{background-color:#fff;width:100%;height:.2em}.menu-link span:after,.menu-link span:before{position:absolute;margin-top:-.6em;content:" "}.menu-link span:after{margin-top:.6em}@media (min-width:48em){.content,.header{padding-left:2em;padding-right:2em}#layout{padding-left:150px;left:0}#layout.active .menu-link,#menu,.menu-link{left:150px}.menu-link{position:fixed;display:none}}a{color:#3b8bba;text-decoration:none}.pagination a,a:visited{color:#265778}a:focus,a:hover{text-decoration:underline}.small-print{font-size:.8em;margin:.6em}.post-meta{font-size:90%}article>footer{text-align:right}.prev-next-post{margin-top:2em;padding-top:2em;padding-bottom:2em;border-top:1px solid #eee;border-bottom:1px solid #eee}.prev-next-post .prev{float:left;text-align:left;overflow:hidden}.prev-next-post .next{float:right;text-align:right;overflow:hidden}#menu .pure-menu{font-size:.9em}i{display:inline-block;margin-right:.2em}.pagination{text-align:center;margin-top:3em}#menu .brand{font-family:Raleway;letter-spacing:.1em;background:0 0;text-decoration:none;font-weight:400;font-size:1.3em;margin:0}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{color:#3b8bba}.content table{margin-top:1em;border:1px solid #cbcbcb}.content table td,.content table th{padding:.33em .66em;border-left:1px solid #cbcbcb;border-right:1px solid #cbcbcb}.content table tr:nth-child(even){background-color:#f2f2f2}.content table thead{background-color:#e0e0e0;color:#000}.content table thead td,.content table thead th{border-bottom:1ps solid #cbcbcb}.list-item-description:before{content:"\00A0\2013\00A0"}article.teaser h2{text-align:left;margin-left:160px;font-weight:400;font-size:1.75em;transition:margin-left .2s ease-out;-webkit-transition:margin-left .2s ease-out}.teaser-icon{clear:left;float:left}.teaser-icon .fa{font-size:128px;transition:font-size .2s ease-out;-webkit-transition:font-size .2s ease-out}.teaser-text{margin-left:160px;transition:margin-left .2s ease-out;-webkit-transition:margin-left .2s ease-out}.teaser-text p:last-of-type{margin-bottom:0}.teaser-follow-up{text-align:right}@media (max-height:48em){#menu{width:165px}}@media (max-width:48em){#layout.active{position:relative;left:150px}.teaser-text,article.teaser h2{margin-left:120px}.list-item-description:before{content:""}.list-item-description{display:block}.teaser-icon .fa{font-size:96px}}@media (max-width:30em){.list-item-description{display:none}article.teaser h2{margin-left:0;margin-top:0;text-align:center}.teaser-icon{float:none;text-align:center;margin:1em 0}.teaser-icon .fa{font-size:64px}.teaser-text{margin-left:inherit}} \ No newline at end of file From e1baef92a29a58e688974cd7b3d2c5b6ac06affd Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Tue, 12 Jul 2016 15:00:03 +0200 Subject: [PATCH 17/52] finished docs/ref/files-structure.md --- docs/content/ref/file-structure.md | 414 +++++++++++++++++++++++++---- 1 file changed, 355 insertions(+), 59 deletions(-) diff --git a/docs/content/ref/file-structure.md b/docs/content/ref/file-structure.md index c74b4be6..2784edd9 100644 --- a/docs/content/ref/file-structure.md +++ b/docs/content/ref/file-structure.md @@ -1,12 +1,11 @@ +++ date = "2016-06-22T13:43:12+02:00" description = "The layout of the folders and files in the Bench environment" -draft = true title = "File Structure" weight = 4 +++ -The file structure of Bench is devided in two groups, the core and the extended file structure. +The file structure of Bench is divided in two groups, the core and the extended file structure. If the location of files and directories is not changed via custom or site configuration, all files and folders of Bench live in one directory: the _root directory of Bench_. In the following sections, the file structure is described according to the default configuration. @@ -59,40 +58,40 @@ during the Bench setup, and _can not_ be moved via custom or site configuration. ([AppDeactivationFile](/ref/config/#AppDeactivationFile)) + [`config.md`](#config-config) Custom Configuration File ([CustomConfigFile](/ref/config/#CustomConfigFile)) - + `ConEmu.xml` + + [`ConEmu.xml`](#config-conemu) ([ConEmuConfigFile](/ref/config/#ConEmuConfigFile)) - + `env.ps1` Environment Setup Hook - + `setup.ps1` Setup Hook -* `res` Bench Resources - + `apps` App Resources + + [`env.ps1`](#config-env) Environment Setup Hook + + [`setup.ps1`](#config-setup) Setup Hook +* [`res`](#res-dir) Bench Resources + + [`apps`](#res-apps-dir) App Custom Resources ([AppResourceBaseDir](/ref/config/#AppResourceBaseDir)) - + `apps.template.md` + + [`apps.template.md`](#res-apps-template) ([CustomAppIndexTemplateFile](/ref/config/#CustomAppIndexTemplateFile)) - + `apps-activated.template.txt` + + [`apps-activated.template.txt`](#res-app-activation-template) ([AppActivationTemplateFile](/ref/config/#AppActivationTemplateFile)) - + `apps-deactivated.template.txt` + + [`apps-deactivated.template.txt`](#res-app-deactivation-template) ([AppDeactivationTemplateFile](/ref/config/#AppDeactivationTemplateFile)) - + `bench-install.bat` Bootstrap Batch File - + `bench-site.template.md` + + [`bench-install.bat`](#res-bench.install) Bootstrap Batch File + + [`bench-site.template.md`](#res-site-config-template) ([SiteConfigTemplateFile](/ref/config/#SiteConfigTemplateFile)) - + `ConEmu.template.xml` + + [`ConEmu.template.xml`](#res-conemu-template) ([ConEmuConfigTemplateFile](/ref/config/#ConEmuConfigTemplateFile)) - + `config.md` Default Configuration - + `config.template.md` + + [`config.md`](#res-config) Default Configuration + + [`config.template.md`](#res-config-template) ([CustomConfigTemplateFile](/ref/config/#CustomConfigTemplateFile)) - + `version.txt` Version String + + [`version.txt`](#res-version) Version String ([VersionFile](/ref/config/#VersionFile)) -* `lib` App Installations +* [`lib`](#lib-dir) App Installations ([LibDir](/ref/config/#LibDir)) - + `_proxies` + + [`_proxies`](#lib-proxies-dir) ([AppAdornmentBaseDir](/ref/config/#AppAdornmentBaseDir)) - + `_launcher` + + [`_launcher`](#lib-launcher-dir) ([LauncherScriptDir](/ref/config/#LauncherScriptDir)) - + `` App Target Dir -* `CHANGELOG.md` -* `env.cmd` -* `LICENSE.md` -* `README.md` + + ... +* [`CHANGELOG.md`](#changelog) +* [`env.cmd`](#env) +* [`LICENSE.md`](#license) +* [`README.md`](#readme) ## Extended Structure {#extended} @@ -100,31 +99,31 @@ The extended structure consists of directories and files, which are created during the usage of Bench – including the installation of apps, and _can_ be moved via custom or site configuration. -* `archive` +* [`archive`](#archive-dir) Project Archive ([ProjectArchiveDir](/ref/config/#ProjectArchiveDir)) -* `cache` +* [`cache`](#cache-dir) Downloaded App Resources ([DownloadDir](/ref/config/#DownloadDir)) -* `home` +* [`home`](#home-dir) Isolated User Profile ([HomeDir](/ref/config/#HomeDir)) + `AppData` - - `Local` + - [`Local`](#home-app-data-local-dir) ([LocalAppDataDir](/ref/config/#LocalAppDataDir)) - - `Roaming` + - [`Roaming`](#home-app-data-roaming-dir) ([AppDataDir](/ref/config/#AppDataDir)) + `Desktop` + `Documents` - + `registry_isolation` + + [`registry_isolation`](#home-registry-isolation-dir) ([AppRegistryBaseDir](/ref/config/#AppRegistryBaseDir)) + ... -* `launcher` +* [`launcher`](#launcher-dir) Launcher Shortcuts ([LauncherDir](/ref/config/#LauncherDir)) -* `log` +* [`log`](#log-dir) Log Files ([LogDir](/ref/config/#LogDir)) -* `projects` +* [`projects`](#projects-dir) Projects Root Directory ([ProjectRootDir](/ref/config/#ProjectRootDir)) -* `tmp` +* [`tmp`](#tmp-dir) Temporary Files ([TempDir](/ref/config/#TempDir)) -* `bench-site.md` +* [`bench-site.md`](#bench-site) Site Configuration ([SiteConfigFileName](/ref/config/#SiteConfigFileName)) ## Details {#details} @@ -138,7 +137,7 @@ and _can_ be moved via custom or site configuration. This directory contains `*.cmd` scripts to run a couple of useful tasks in the Bench environment. -They do load the `env.cmd` by themselfs if necessary. +They do load the `env.cmd` by them selfs if necessary. Therefore, they can be started directly from an arbitrary command prompt, via a Windows shortcut, or from the explorer. @@ -189,23 +188,25 @@ This action will fail if [Git][] is not installed Custom scripts for app resource extraction must be named with the app ID in lower case, and the name extension `.extract.ps1`. -The custom script for extraction is executed if the +The _custom script for extraction_ is executed if the [`ArchiveTyp`](/ref/app-properties/#ArchiveTyp) is set to `auto` or `custom`. If the [`ArchiveTyp`](/ref/app-properties/#ArchiveTyp) of the app is set -to `auto` and a custom script for extraction for this app exists, +to `auto` and a _custom script for extraction_ for this app exists, the custom script takes precedence over the other extraction methods. -Inside of the custom script is the [PowerShell API](/ref/ps-api/) iis available. +Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. Custom extraction scripts are called with two command line arguments: 1. The absolute path of the downloaded app resource archive 2. The absolute path of the target directory to extract the resources -Example for extraction of a nested archive: +Example for the extraction of a nested archive: ```PowerShell param ($archivePath, $targetDir) +$nestedArchive = "nested.zip" + # create temporary directory $tmpDir = Empty-Dir "$(Get-ConfigValue TempDir)\custom_extract" @@ -216,13 +217,13 @@ $7z = App-Exe SvZ & $7z x "-o$tmpDir" "$archivePath" # check if expected inner archive exists -if (!(Test-Path "$tmpDir\nested.zip")) +if (!(Test-Path "$tmpDir\$nestedArchive")) { throw "Did not find the expected content in the app resource." } # call 7-Zip to extract inner archive -& $7z x "-o$targetDir" "$tmpDir\nested.zip" +& $7z x "-o$targetDir" "$tmpDir\$nestedArchive" # Delete temporary directory Purge-Dir $tmpDir @@ -237,10 +238,10 @@ Purge-Dir $tmpDir Custom scripts for app resource extraction must be named with the app ID in lower case, and the name extension `.setup.ps1`. -If a custom setup script for an app exists, it is executed after -the installation of the (extracted) app resources in the +If a _custom setup script_ for an app exists, it is executed after +the installation of the (extracted) app resources in the [apps target dir](#lib-app). -Inside of the custom script is the [PowerShell API](/ref/ps-api/) is available. +Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) is available. ### App Custom Script `env` {#auto-apps-env} @@ -251,11 +252,11 @@ Inside of the custom script is the [PowerShell API](/ref/ps-api/) is available. Custom scripts for environment setup must be named with the app ID in lower case, and the name extension `.env.ps1`. -If a custom environment setup script for an app exists, it is executed +If a _custom environment setup script_ for an app exists, it is executed after the setup to update configuration files depending on the location of Bench or other [configuration properties](/ref/config). It is also called if the _Upade Environment_ task for Bench is executed. -Inside of the custom script is the [PowerShell API](/ref/ps-api/) iis available. +Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. ### App Custom Script `remove` {#auto-apps-remove} @@ -266,9 +267,9 @@ Inside of the custom script is the [PowerShell API](/ref/ps-api/) iis available. Custom scripts for deinstallation must be named with the app ID in lower case, and the name extension `.remove.ps1`. -If a custom deinstallation script for an app exists, it is executed +If a _custom deinstallation script_ for an app exists, it is executed instead of the default uninstall method. -Inside of the custom script is the [PowerShell API](/ref/ps-api/) iis available. +Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. ### App Custom Script `pre-run` {#auto-apps-pre-run} @@ -276,14 +277,14 @@ Inside of the custom script is the [PowerShell API](/ref/ps-api/) iis available. * Path: `auto\apps\.pre-run.ps1` * Typ: file -The custom pre-run script is executed immediatly before an app executable is run. +The _custom pre-run script_ is executed immediatly before an app executable is run. It is only executed if an app executable is run via its execution proxy. -This is usually the case because it is listed in +This is usually the case because it is listed in [AdornedExecutables](/ref/app-properties/#AdornedExecutables). The [main executable](/ref/app-properties/#Exe) of an app is automatically included in the list of adorned executables if the [registry isolation](/ref/app-properties/#RegistryKeys) is used. -Inside of the custom script is the [PowerShell API](/ref/ps-api/) iis available. +Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. ### App Custom Script `post-run` {#auto-apps-post-run} @@ -291,14 +292,14 @@ Inside of the custom script is the [PowerShell API](/ref/ps-api/) iis available. * Path: `auto\apps\.post-run.ps1` * Typ: file -The custom post-run script is executed immediatly after an app executable is run. +The _custom post-run script_ is executed immediatly after an app executable is run. It is only executed if an app executable is run via its execution proxy. -This is usually the case because it is listed in +This is usually the case because it is listed in [AdornedExecutables](/ref/app-properties/#AdornedExecutables). The [main executable](/ref/app-properties/#Exe) of an app is automatically included in the list of adorned executables if the [registry isolation](/ref/app-properties/#RegistryKeys) is used. -Inside of the custom script is the [PowerShell API](/ref/ps-api/) iis available. +Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. ### Bench Binary Directory {#auto-bin-dir} @@ -339,7 +340,7 @@ The custom app libary file is written in [Markdown list syntax](/ref/markup-synt * Typ: file The specified file must be an UTF8 encoded text file. -Every non empty line, which is not commented with a # is interpreted +Every non empty line, which is not commented with a `#` is interpreted as an app ID. Only non-space characters, up to the first space or the end of a line, are considered. @@ -352,7 +353,7 @@ are considered. * Typ: file The specified file must be an UTF8 encoded text file. -Every non empty line, which is not commented with a # is interpreted +Every non empty line, which is not commented with a `#` is interpreted as an app ID. Only non-space characters, up to the first space or the end of a line, are considered. @@ -364,7 +365,14 @@ are considered. * Config Property: [CustomConfigFile](/ref/config/#CustomConfigFile) * Typ: file -The custom configuration file is written in [Markdown list syntax](/ref/markup-syntax). +The _custom configuration file_ is written in [Markdown list syntax](/ref/markup-syntax). + +### ConEmu Configuration {#config-conemu} + +* Description: The configuration for the embedded ConEmu console in the [Dasboard](/ref/dashboard/). +* Path: `config\ConEmu.xml` +* Config Property: [ConEmuConfigFile](/ref/config/#ConEmuConfigFile) +* Typ: file ### Environment Setup Hook {#config-env} @@ -373,7 +381,295 @@ The custom configuration file is written in [Markdown list syntax](/ref/markup-s * Typ: file This script is executed, at the end of the Bench environment setup. -Inside of the custom script is the [PowerShell API](/ref/ps-api/) iis available. +Inside of the _environment setup hook script_ is the [PowerShell API](/ref/ps-api/) available. + +### Setup Hook {#config-setup} + +* Description: The hook script for app setup. +* Path: `configsetup.ps1` +* Typ: file + +This script is executed, at the end of the setup of one ore multiple apps. +Inside of the _setup hook script_ is the [PowerShell API](/ref/ps-api/) available. + +### Bench Resources Directory {#res-dir} + +* Description: This directory contains resources for the Bench system. +* Path: `res` +* Typ: directory + +### App Custom Resources Directory {#res-apps-dir} + +* Description: This directory contains resources used by custom scripts + of included apps. +* Path: `res\apps` +* Config Property: [AppResourceBaseDir](/ref/config/#AppResourceBaseDir) +* Typ: directory + +### Custom App Library Template {#res-apps-template} + +* Description: The template for the [custom app library](#config-apps). +* Path: `res\apps.template.md` +* Config Property: [CustomAppIndexTemplateFile](/ref/config/#CustomAppIndexTemplateFile) +* Typ: file + +### App Activation Template {#res-app-activation-template} + +* Description: The template for the [app activation list](#config-apps-activated) +* Path: `res\apps-activated.template.txt` +* Config Property: [AppActivationTemplateFile](/ref/config/#AppActivationTemplateFile) +* Typ: file + +### App Deactivation Template {#res-app-deactivation-template} + +* Description: The template for the [app deactivation list](#config-apps-deactivated) +* Path: `res\apps-deactivated.template.txt` +* Config Property: [AppDeactivationTemplateFile](/ref/config/#AppDeactivationTemplateFile) +* Typ: file + +### Bootstrap Batch File {#res-bench-install} + +* Description: The installation batch script for setup and upgrade of Bench. +* Path: `res\bench-install.batch` +* Typ: file + +### Site Configuration Template {#res-site-config-template} + +* Description: The template for the site configuration file. +* Path: `res\bench-site.template.md` +* Config Property: [SiteConfigTemplateFile](/ref/config/#SiteConfigTemplateFile) +* Typ: file + +The site configuration file is written in [Markdown list syntax](/ref/markup-syntax). + +### ConEmu Configuration Template {#res-conemu-template} + +* Description: The template for the [ConEmu configuration](#config-conemu). +* Path: `res\ConEmu.template.xml` +* Config Property: [ConEmuConfigTemplateFile](/ref/config/#ConEmuConfigTemplateFile) +* Typ: file + +### Default Configuration {#res-config} + +* Description: The default configuration of Bench. +* Path: `res\config.md` +* Typ: file + +The default configuration file is written in [Markdown list syntax](/ref/markup-syntax). + +### Custom Configuration Template {#res-config-template} + +* Description: The template for the [custom configuration](#config-config). +* Path: `res\config.template.md` +* Config Property: [CustomConfigTemplateFile](/ref/config/#CustomConfigTemplateFile) +* Typ: file + +### Version File {#res-version} + +* Description: A text file with the version number of the Bench release as the only content. +* Path: `res\version.txt` +* Config Property: [VersionFile](/ref/config/#VersionFile) +* Typ: file + +### App Installation Directory {#lib-dir} + +* Description: This directory contains the app installations. +* Path: `lib` +* Config Property: [LibDir](/ref/config/#LibDir) +* Typ: directory + +Every activated app gets installed in it's [target directory](/ref/app-properties/#Dir). +Usually the app target directories are direct sub-folders of the _app installation directory_. +The default value for the [target directory](/ref/app-properties/#Dir) of an app is +its ID in lower case. + +### Execution Proxy Directory {#lib-proxies-dir} + +* Description: Execution proxy scripts for adorned executables are stored in this directory. +* Path: `lib\_proxies` +* Config Property: [AppAdornmentBaseDir](/ref/config/#AppAdornmentBaseDir) +* Typ: directory + +For every adorned executable, a batch file is generated, which runs the actual +executable with registry isolation, pre-run, and post-run scripts. +These execution proxies are stored in a directory named with the apps ID, +and placed in the _execution proxy directory_. + +### Launcher Script Directory {#lib-launcher-dir} + +* Description: Launcher scripts are stored in this directory. +* Path: `lib\_launcher` +* Config Property: [LauncherScriptDir](/ref/config/#LauncherScriptDir) +* Typ: directory + +For every launcher, a batch file is generated, to inject command line arguments +in the shell call and call the execution proxy if necessary. + +### Changelog {#changelog} + +* Description: The file a description for all changes of Bench throughout the released versions. +* Path: `CHANGELOG.md` +* Typ: file + +### Environment Script File {#env} + +* Description: The Bench environment file. +* Path: `env.cmd` +* Typ: file + +This file is generated as a result of the environment setup of Bench. +It can be called from another batch script to load the Bench environment. + +This file sets a number of environment variables according to the Bench configuration. +These environment variables provide information about the Bench system, +provide the isolation from the Windows user profile, +and put the Bench apps on the `PATH`. +The following variables are always set: + +* `USERNAME` from [UserName](/ref/config/#UserName) +* `USEREMAIL` from [UserEmail](/ref/config/#UserEmail) +* `BENCH_HOME` the root directory of Bench +* `BENCH_DRIVE` the drive on which the root directory of Bench is stored +* `BENCH_VERSION` from [the version file](#res-version) +* `BENCH_PATH` the directories with executables from the Bench apps + +### License {#license} + +* Description: The text of the license under which Bench is published. +* Path: `LICENSE.md` +* Typ: file + +### Readme {#readme} + +* Description: A brief project description of Bench. +* Path: `README.md` +* Typ: file + +### Project Archive Directory {#archive-dir} + +* Description: When the Bench task for the creation of a project backup is executed, + it stores an archive file with the project in this directory. +* Path: `archive` +* Config Property: [ProjectArchiveDir](/ref/config/#ProjectArchiveDir) +* Typ: directory + +The format of the archive files can be controlled via the configuration property +[ProjectArchiveFormat](/ref/config/#ProjectArchiveFormat). +The name of the archive files in this directory is build with the respective +project name and a timestamp. + +### App Resource Cache {#cache-dir} + +* Description: This directory contains all downloaded app resources. +* Path: `cache` +* Config Property: [DownloadDir](/ref/config/#DownloadDir) +* Typ: directory + +### Home Directory {#home-dir} + +* Description: This directory is the isolated user profile root for the Bench environment. +* Path: `home` +* Config Property: [HomeDir](/ref/config/#HomeDir) +* Typ: directory + +If the configuration property [OverrideHome](/ref/config/#OverrideHome) +is set to `true`, the environment variables `HOME` and `USERPROFILE` +in the Bench environment are pointing to this directory. + +### Local Application Data Directory {#home-app-data-local-dir} + +* Description: This directory is the `AppData\Local` in the isolated user profile + for the Bench environment. +* Path: `home\AppData\Local` +* Config Property: [LocalAppDataDir](/ref/config/#LocalAppDataDir) +* Typ: directory + +If the configuration property [OverrideHome](/ref/config/#OverrideHome) +is set to `true`, the environment variable `LOCALAPPDATA` +in the Bench environment is pointing to this directory. + +### Application Data Directory {#home-app-data-roaming-dir} + +* Description: This directory is the `AppData\Roaming` in the isolated user profile + for the Bench environment. +* Path: `home\AppData\Roaming` +* Config Property: [AppDataDir](/ref/config/#AppDataDir) +* Typ: directory + +If the configuration property [OverrideHome](/ref/config/#OverrideHome) +is set to `true`, the environment variable `APPDATA` +in the Bench environment is pointing to this directory. + +### Registry Isolation Directory {#home-registry-isolation-dir} + +* Description: In this directory backups of registry keys are stored when the + registry isolation mechanism is used. +* Path: `home\registry_isolation` +* Config Property: [AppRegistryBaseDir](/ref/config/#AppRegistryBaseDir) +* Typ: directory + +### Launcher Directory {#launcher-dir} + +* Description: This directory contains Windows shortcuts for all activated apps with a launcher. +* Path: `launcher` +* Config Property: [LauncherDir](/ref/config/#LauncherDir) +* Typ: directory + +This directory can be added as a toolbar to the Windows taskbar. +This way the [Bench Dashboard][] and all graphical apps from Bench are directly +available on the Desktop. + +### Log Directory {#log-dir} + +* Description: For every setup and app installation process a log file is stored in this directory. +* Path: `log` +* Config Property: [LogDir](/ref/config/#LogDir) +* Typ: directory + +### Projects Root Directory {#projects-dir} + +* Description: This directory is the root for development projects. +* Path: `projects` +* Config Property: [ProjectRootDir](/ref/config/#ProjectRootDir) +* Typ: directory + +If a project folder is placed in this directory, Bench knows about it, +and can provide assistance when working on this project in the Bench environment. + +### Temporary Directory {#tmp-dir} + +* Description: This is the directory for temporary files in the Bench system. +* Path: `tmp` +* Config Property: [TempDir](/ref/config/#TempDir) +* Typ: directory + +If the configuration property [OverrideTemp](/ref/config/#OverrideTemp) +is set to `true`, the environment variables `TEMP` and `TMP` +in the Bench environment are pointing to this directory. + +### Site Configuration File {#bench-site} + +* Description: The site configuration file(s). +* Path: `bench-site.md` +* Config Property: [SiteConfigFileName](/ref/config/#SiteConfigFileName) +* Typ: file + +This file can exist multiple times in the Bench root directory and its parents. +All of them are loaded and applied after the [default](#res-config) +and [custom configuration](#config-config) – from the file system root down +to the Bench root. + +**Example** + +1. `D:\foo\bar\bench\res\config.md` (Default Configuration) +2. `D:\foo\bar\bench\config\config.md` (Custom Configuration) +3. `D:\foo\bench-site.md` (Site Configuration) +4. `D:\foo\bar\bench\bench-site.md` (Site Configuration) + +The configuration files are loaded in the listed order. +If a configuration value appears in multiple configuration files, +the value from the file, loaded latest, wins. [Bench CLI]: /ref/bench-ctl +[Bench Dashboard]: /ref/dashboard [Git]: /ref/apps#Git From 59225a778674afe5f8e9e81fc976c02ca40a6520 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Tue, 12 Jul 2016 15:07:08 +0200 Subject: [PATCH 18/52] improved automation for documentation --- build/build-docs.ps1 | 2 ++ build/publish-docs.ps1 | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/build/build-docs.ps1 b/build/build-docs.ps1 index 6c78378b..9d719f77 100644 --- a/build/build-docs.ps1 +++ b/build/build-docs.ps1 @@ -18,6 +18,8 @@ function check-success() { pushd $docsDir +del .\public -Recurse -Force + & "$myDir\update-app-list.ps1" if (!(Test-Path "$docsDir\node_modules")) { diff --git a/build/publish-docs.ps1 b/build/publish-docs.ps1 index 4af65d48..9fd690dd 100644 --- a/build/publish-docs.ps1 +++ b/build/publish-docs.ps1 @@ -6,6 +6,8 @@ $branchName = "gh-pages" $scriptsDir = Resolve-Path "$rootDir\auto\lib" $docsDir = Resolve-Path "$rootDir\docs" +pushd + & "$scriptsDir\Load-ClrLibs.ps1" $cfg = New-Object Mastersign.Bench.BenchConfiguration ($rootDir, $true, $true, $true) $benchEnv = New-Object Mastersign.Bench.BenchEnvironment ($cfg) @@ -54,3 +56,5 @@ cp "$docsDir\public\*" "$ghpDir\" -Recurse cd $ghpDir git add -A :/ git commit -m "Automatic Update" + +popd From e58ee85c26ae110b26be6cc26c0274532fd2398a Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Tue, 12 Jul 2016 16:07:50 +0200 Subject: [PATCH 19/52] started documenting PowerShell API --- docs/content/ref/ps-api.md | 62 +++++++++++++++++++++++++++++- docs/src-content/ref/ps-api.md | 69 ++++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 docs/src-content/ref/ps-api.md diff --git a/docs/content/ref/ps-api.md b/docs/content/ref/ps-api.md index 31de210e..add4e0ac 100644 --- a/docs/content/ref/ps-api.md +++ b/docs/content/ref/ps-api.md @@ -6,4 +6,64 @@ title = "PowerShell API" weight = 9 +++ -TODO +The _PowerShell API_ of Bench consists of a set of functions/commandlets, +available in custom and hook scripts. + +## Variables + +### `$global:BenchConfig` {#var-bench-config} + +This variable in the global scope holds a reference to a +[`Mastersign.Bench.BenchConfiguration`](/ref/clr-api/class/Mastersign.Bench.BenchConfiguration) +object. +This object holds the merged Bench configuration from all configuration files. + +## Functions + +### Utilities + +#### `Exit-OnError` {#fun-exit-onerror} + +* Description: Checks an process exit code and exits the current script if it is not 0. +* Parameter + + `exitCode` (optional) + The exit code to check. + Default value is `$LastExitCode`. + +#### `Pause` {#fun-pause} + +* Description: Prints a message and waits for an arbitrary key press before it returns. +* Parameter + + `msg` (optional) + The message to print. + Default value is `"Press any key to exit ..."`. + +#### `Run-Detached` {#fun-run-detached} + +### File System + +#### `Empty-Dir` {#fun-empty-dir} + +#### `Find-File` {#fun-find-file} + +#### `Find-Files` {#fun-find-files} + +#### `Purge-Dir` {#fun-purge-dir} + +#### `Safe-Dir` {#fun-safe-dir} + +### Configuration Properties + +#### `Get-ConfigValue` + +#### `Get-ConfigBooleanValue` + +#### `Get-ConfigListValue` + +### App Properties + +#### `Get-AppConfigValue` + +#### `Get-AppConfigBooleanValue` + +#### `Get-AppConfigListValue` diff --git a/docs/src-content/ref/ps-api.md b/docs/src-content/ref/ps-api.md new file mode 100644 index 00000000..add4e0ac --- /dev/null +++ b/docs/src-content/ref/ps-api.md @@ -0,0 +1,69 @@ ++++ +date = "2016-06-22T13:43:35+02:00" +description = "The programming interface for hooks and custom scripts" +draft = true +title = "PowerShell API" +weight = 9 ++++ + +The _PowerShell API_ of Bench consists of a set of functions/commandlets, +available in custom and hook scripts. + +## Variables + +### `$global:BenchConfig` {#var-bench-config} + +This variable in the global scope holds a reference to a +[`Mastersign.Bench.BenchConfiguration`](/ref/clr-api/class/Mastersign.Bench.BenchConfiguration) +object. +This object holds the merged Bench configuration from all configuration files. + +## Functions + +### Utilities + +#### `Exit-OnError` {#fun-exit-onerror} + +* Description: Checks an process exit code and exits the current script if it is not 0. +* Parameter + + `exitCode` (optional) + The exit code to check. + Default value is `$LastExitCode`. + +#### `Pause` {#fun-pause} + +* Description: Prints a message and waits for an arbitrary key press before it returns. +* Parameter + + `msg` (optional) + The message to print. + Default value is `"Press any key to exit ..."`. + +#### `Run-Detached` {#fun-run-detached} + +### File System + +#### `Empty-Dir` {#fun-empty-dir} + +#### `Find-File` {#fun-find-file} + +#### `Find-Files` {#fun-find-files} + +#### `Purge-Dir` {#fun-purge-dir} + +#### `Safe-Dir` {#fun-safe-dir} + +### Configuration Properties + +#### `Get-ConfigValue` + +#### `Get-ConfigBooleanValue` + +#### `Get-ConfigListValue` + +### App Properties + +#### `Get-AppConfigValue` + +#### `Get-AppConfigBooleanValue` + +#### `Get-AppConfigListValue` From 976ecb2802201cdecc613c50c37a7b11776c7763 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 13 Jul 2016 11:18:25 +0200 Subject: [PATCH 20/52] clean up scripts --- auto/lib/bench.lib.ps1 | 12 ++-- auto/lib/config.lib.ps1 | 10 +-- auto/lib/launcher.lib.ps1 | 125 -------------------------------------- 3 files changed, 9 insertions(+), 138 deletions(-) delete mode 100644 auto/lib/launcher.lib.ps1 diff --git a/auto/lib/bench.lib.ps1 b/auto/lib/bench.lib.ps1 index ed131a2c..d1656d92 100644 --- a/auto/lib/bench.lib.ps1 +++ b/auto/lib/bench.lib.ps1 @@ -2,19 +2,19 @@ . "$myDir\profile.ps1" . "$myDir\config.lib.ps1" -function Purge-Dir ($dir) +function Purge-Dir ($path) { - [Mastersign.Bench.FileSystem]::PurgeDir($dir) + [Mastersign.Bench.FileSystem]::PurgeDir($path) } -function Safe-Dir ($dir) +function Safe-Dir ($path) { - return [Mastersign.Bench.FileSystem]::AsureDir($dir) + return [Mastersign.Bench.FileSystem]::AsureDir($path) } -function Empty-Dir ($dir) +function Empty-Dir ($path) { - return [Mastersign.Bench.FileSystem]::EmptyDir($dir) + return [Mastersign.Bench.FileSystem]::EmptyDir($path) } function Find-Files($dir, $pattern) diff --git a/auto/lib/config.lib.ps1 b/auto/lib/config.lib.ps1 index 31e543a2..e1df34c3 100644 --- a/auto/lib/config.lib.ps1 +++ b/auto/lib/config.lib.ps1 @@ -27,10 +27,9 @@ function App-DownloadCookies([string]$name) { return $global:BenchConfig.Apps[$n function App-ResourceFile([string]$name) { return $global:BenchConfig.Apps[$name].ResourceFileName } function App-ResourceArchive([string]$name) { return $global:BenchConfig.Apps[$name].ResourceArchiveName } function App-ResourceArchiveTyp([string]$name) { return $global:BenchConfig.Apps[$name].ResourceArchiveTyp } -function App-ResourceArchiveSubDir([string]$name) { return $global:BenchConfig.Apps[$name].ResourceArchivePath } +function App-ResourceArchivePath([string]$name) { return $global:BenchConfig.Apps[$name].ResourceArchivePath } function App-Force([string]$name) { return $global:BenchConfig.Apps[$name].Force } -function App-NpmPackage([string]$name) { return $global:BenchConfig.Apps[$name].PackageName } -function App-PyPiPackage([string]$name) { return $global:BenchConfig.Apps[$name].PackageName } +function App-PackageName([string]$name) { return $global:BenchConfig.Apps[$name].PackageName } function App-Dir([string]$name) { return $global:BenchConfig.Apps[$name].Dir } function App-Paths([string]$name) { return $global:BenchConfig.Apps[$name].Path } function App-Exe([string]$name, [bool]$checkExist = $true) { return $global:BenchConfig.Apps[$name].Exe } @@ -43,9 +42,6 @@ function App-LauncherExecutable([string]$name) { return $global:BenchConfig.Apps function App-LauncherArguments([string]$name) { return $global:BenchConfig.Apps[$name].LauncherArguments } function App-LauncherIcon([string]$name) { return $global:BenchConfig.Apps[$name].LauncherIcon } function App-SetupTestFile([string]$name) { return $global:BenchConfig.Apps[$name].SetupTestFile } -function Check-DefaultApp([string]$name) { return $global:BenchConfig.Apps[$name].IsInstalled } -function Check-NpmPackage([string]$name) { return $global:BenchConfig.Apps[$name].IsInstalled } -function Check-PyPiPackage ([string]$pythonVersion, [string]$name) { return $global:BenchConfig.Apps[$name].IsInstalled } function Check-App([string]$name) { return $global:BenchConfig.Apps[$name].IsInstalled } function App-Path([string]$name) { @@ -58,4 +54,4 @@ function App-Path([string]$name) { { return $null } -} \ No newline at end of file +} diff --git a/auto/lib/launcher.lib.ps1 b/auto/lib/launcher.lib.ps1 deleted file mode 100644 index 995a6c7b..00000000 --- a/auto/lib/launcher.lib.ps1 +++ /dev/null @@ -1,125 +0,0 @@ -$launcherDir = Safe-Dir (Get-ConfigValue LauncherDir) -$launcherScriptDir = Safe-Dir ([IO.Path]::Combine((Get-ConfigValue BenchAuto), "launcher")) - -$wshShell = New-Object -ComObject WScript.Shell - -function Clean-Launchers() { - Debug "Cleaning launcher shortcuts: $launcherDir\*" - $_ = Empty-Dir $launcherDir - Debug "Cleaning launcher scripts: $launcherScriptDir\*" - $_ = Empty-Dir $launcherScriptDir -} - -function Get-LauncherScriptFile([string]$name) { - return [IO.Path]::Combine($launcherScriptDir, ($name.ToLowerInvariant() + '.cmd')) -} - -function Get-LauncherFile([string]$name) { - return [IO.Path]::Combine($launcherDir, (App-Launcher $name) + '.lnk') -} - -function Check-IsAdornedExecutable([string]$name, [string]$path) { - $adornedExecutables = App-AdornedExecutables $name - if ($adornedExecutables) { - $p1 = Resolve-Path $path - foreach ($exe in $adornedExecutables) { - $p2 = Resolve-Path $exe - if ([string]::Equals($p1, $p2, [StringComparison]::OrdinalIgnoreCase)) { - return $true - } - } - } - return $false -} - -function Create-LauncherScript([string]$name) -{ - $launcherLabel = App-Launcher $name - if (!$launcherLabel) { - return - } - Debug "Writing launcher script for '$launcherLabel' ..." - $executable = App-LauncherExecutable $name - $isAdorned = Check-IsAdornedExecutable $name $executable - Debug "Path of launcher target: $executable" - $arguments = App-LauncherArguments $name | % { - $arg = $_.Replace('"', '^"') - if ($_ -match "\s") { - return "`"$arg`"" - } else { - return $arg - } - } - $argumentsString = [string]::Join(' ', $arguments) - $launcherScriptFile = Get-LauncherScriptFile $name - Debug "Path of launcher script: $launcherScriptFile" - $nl = [Environment]::NewLine - $code = "@ECHO OFF$nl" - $code += "ECHO.Launching $launcherLabel in Bench Context ...$nl" - $code += "CALL `"%~dp0..\env.cmd`"$nl" - if ($isAdorned) { - $code += "runps Run-Adorned $name `"$executable`" $argumentsString$nl" - } else { - $code += "START `"$launcherLabel`" `"$executable`" $argumentsString$nl" - } - [IO.File]::WriteAllText($launcherScriptFile, $code, [Text.Encoding]::Default) -} - -function Create-Shortcut([string]$file, [string]$targetPath, [string]$arguments="", - [string]$workingDir=$null, [string]$iconPath=$targetPath, - [int]$windowStyle=1) { - - try { - $shortcut = $wshShell.CreateShortcut($file) - $shortcut.TargetPath = $targetPath - if ($arguments) { - $shortcut.Arguments = $arguments - } - if ($workingDir) { - $shortcut.WorkingDirectory = $workingDir - } - if ($iconPath) { - $shortcut.IconLocation = $iconPath - } - $shortcut.WindowStyle = $windowStyle # 1 Default, 3 Maximized, 7 Minimized - $shortcut.Save() - Debug "Create shortcut $file" - } catch { - Debug "Arguments: $([string]::Join(', ', '`"' + $arguments + '`"'))" - Debug "Working Dir: '$workingDir'" - Debug "Icon Path: '$iconPath'" - Debug "Window Style: $windowStyle" - Write-Warning $_.Exception.Message - } -} - -function Create-Launcher([string]$name) { - $launcherLabel = App-Launcher $name - if (!$launcherLabel) { - return - } - Create-LauncherScript $name - Debug "Creating launcher for '$launcherLabel' ..." - $launcherFile = Get-LauncherFile $name - Debug "Path of launcher: $launcherFile" - - Create-Shortcut $launcherFile (Get-LauncherScriptFile $name) ` - -workingDir (Get-ConfigValue BenchRoot) ` - -iconPath (App-LauncherIcon $name) -windowStyle 7 -} - -function Create-ActionLauncher($label, $action, $icon) { - $launcherFile = [IO.Path]::Combine($launcherDir, $label + '.lnk') - $targetPath = [IO.Path]::Combine((Get-ConfigValue ActionDir), "$action.cmd") - Debug "Creating launcher for '$label' ..." - Create-Shortcut $launcherFile $targetPath ` - -workingDir (Get-ConfigValue BenchRoot) ` - -iconPath $icon -} - -function Create-ActionLaunchers() { - Create-ActionLauncher 'Bench Control' 'bench-ctl' '%SystemRoot%\System32\imageres.dll,109' - Create-ActionLauncher 'Command Line' 'bench-cmd' '%SystemRoot%\System32\cmd.exe' - Create-ActionLauncher 'PowerShell' 'bench-ps' '%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe' - Create-ActionLauncher 'Bourne Again Shell' 'bench-bash' '%SystemRoot%\System32\imageres.dll,89' -} From 756742a00eb197dfe636cfab92fe1a980a951bbe Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 13 Jul 2016 11:18:39 +0200 Subject: [PATCH 21/52] finished documentation of PowerShell API --- docs/content/ref/ps-api.md | 448 +++++++++++++++++++++++++++++++-- docs/src-content/ref/ps-api.md | 412 ++++++++++++++++++++++++++++-- 2 files changed, 810 insertions(+), 50 deletions(-) diff --git a/docs/content/ref/ps-api.md b/docs/content/ref/ps-api.md index add4e0ac..997a166f 100644 --- a/docs/content/ref/ps-api.md +++ b/docs/content/ref/ps-api.md @@ -6,64 +6,462 @@ title = "PowerShell API" weight = 9 +++ -The _PowerShell API_ of Bench consists of a set of functions/commandlets, +The _PowerShell API_ of Bench consists of a set of global variables and functions, available in custom and hook scripts. -## Variables +[**Variables**](#vars) -### `$global:BenchConfig` {#var-bench-config} +* [`$BenchConfig`](#var-bench-config) -This variable in the global scope holds a reference to a +[**Utility Functions**](#util-funcs) + +* [`Exit-OnError`](#fun-exit-onerror) +* [`Pause`](#fun-pause) +* [`Run-Detached`](#fun-run-detached) + +[**File System Functions**](#fs-funcs) + +* [`Empty-Dir`](#fun-empty-dir) +* [`Find-File`](#fun-find-file) +* [`Find-Files`](#fun-find-files) +* [`Purge-Dir`](#fun-purge-dir) +* [`Safe-Dir`](#fun-safe-dir) + +[**Bench Configuration Functions**](#config-funcs) + +* [`Get-ConfigValue`](#fun-get-configvalue) +* [`Get-ConfigBooleanValue`](#fun-configbooleanvalue) +* [`Get-ConfigListValue`](#fun-configlistvalue) + +[**App Property Functions**](#app-config-funcs) + +* [`Get-AppConfigValue`](#fun-get-appconfigvalue) +* [`Get-AppConfigBooleanValue`](#fun-get-appconfigbooleanvalue) +* [`Get-AppConfigListValue`](#fun-get-appconfiglistvalue) +* [`App-Typ`](#fun-app-typ) +* [`App-Version`](#fun-app-version) +* [`App-Dependencies`](#fun-app-dependencies) +* [`App-Url`](#fun-app-url) +* [`App-DownloadHeaders`](#fun-app-downloadheaders) +* [`App-DownloadCookies`](#fun-app-downloadcookies) +* [`App-ResourceFile`](#fun-app-resourcefile) +* [`App-ResourceArchive`](#fun-app-resourcearchive) +* [`App-ResourceArchiveTyp`](#fun-app-resourcearchivetyp) +* [`App-ResourceArchivePath`](#fun-app-resourcearchivepath) +* [`App-Force`](#fun-app-force) +* [`App-PackageName`](#fun-app-packagename) +* [`App-Dir`](#fun-app-dir) +* [`App-Path`](#fun-app-path) +* [`App-Paths`](#fun-app-paths) +* [`App-Exe`](#fun-app-exe) +* [`App-Register`](#fun-app-register) +* [`App-Environment`](#fun-app-environment) +* [`App-AdornedExecutables`](#fun-app-adornedexecutables) +* [`App-RegistryKeys`](#fun-app-registrykeys) +* [`App-Launcher`](#fun-app-launcher) +* [`App-LauncherExecutable`](#fun-app-launcherexecutable) +* [`App-LauncherArguments`](#fun-app-launcherarguments) +* [`App-LauncherIcon`](#fun-app-launchericon) +* [`App-SetupTestFile`](#fun-app-setuptestfile) +* [`Check-App`](#fun-check-app) + +## Variables {#vars} + +### `$BenchConfig` {#var-bench-config} + +This variable in the global scope a [`Mastersign.Bench.BenchConfiguration`](/ref/clr-api/class/Mastersign.Bench.BenchConfiguration) object. This object holds the merged Bench configuration from all configuration files. -## Functions +**Hint**: Access via `$global:BenchConfig`. -### Utilities +## Utility Functions {#util-funcs} -#### `Exit-OnError` {#fun-exit-onerror} +### `Exit-OnError` {#fun-exit-onerror} * Description: Checks an process exit code and exits the current script if it is not 0. -* Parameter +* Parameter: + `exitCode` (optional) The exit code to check. Default value is `$LastExitCode`. -#### `Pause` {#fun-pause} +### `Pause` {#fun-pause} * Description: Prints a message and waits for an arbitrary key press before it returns. -* Parameter +* Parameter: + `msg` (optional) The message to print. Default value is `"Press any key to exit ..."`. -#### `Run-Detached` {#fun-run-detached} +### `Run-Detached` {#fun-run-detached} + +* Description: Starts a detached process without blocking. +* Parameter: + + `path` The absolute path to the executable. + + ... An arbitrary number of command line arguments + +## File System Functions {#fs-funcs} + +### `Empty-Dir` {#fun-empty-dir} + +* Description: Makes sure a path points to an empty directory. +* Parameter: + + `path` The absolute path to the directory. +* Return Value: The absolute path to the directory. + +If the directory exists, all of its children are deleted. +If the directory does not exist, it is created. + +This function is a wrapper for [Mastersign.Bench.FileSystem.EmptyDir()](/ref/clr-api/method/Mastersign.Bench.FileSystem.EmptyDir). + +### `Find-File` {#fun-find-file} + +* Description: Searches for the first file that matches a given pattern, in a given directory. +* Parameter: + + `dir` The absolute path to a directory. + + `pattern` The pattern to search for, syntax according to + [`System.IO.Directory.GetFiles()`](https://msdn.microsoft.com/de-de/library/wz42302f.aspx). +* Return Value: The absolute path of the found file or `$null`, + if the given directory does not exist or no file matches. + +If more than one file in the given directory matches the pattern, +it is not defined which one is returned. + +### `Find-Files` {#fun-find-files} + +* Description: Searches for files which match a given pattern, in a given directory. +* Parameter: + + `dir` The absolute path to a directory. + + `pattern` The pattern to search for, syntax according to + [`System.IO.Directory.GetFiles()`](https://msdn.microsoft.com/de-de/library/wz42302f.aspx). +* Return Value: An array with the found files. + +If the specified directory does not exist, an empty array is returned. + +### `Purge-Dir` {#fun-purge-dir} + +* Description: Deletes a directory and all of its content. +* Parameter: + + `path` The absolute path to the directory. + +Solves a problem with deleting directories recursively, if they contain read-only files. +This function is a wrapper for +[Mastersign.Bench.FileSystem.PurgeDir()](/ref/clr-api/method/Mastersign.Bench.FileSystem.PurgeDir). + +### `Safe-Dir` {#fun-safe-dir} + +* Description: Makes sure a directory exists. +* Parameter: + + `path` The absolute path to the directory. +* Return Value: The absolute path to the directory. + +This method is a wrapper for +[Mastersign.Bench.FileSystem.AsureDir()](/ref/clr-api/method/Mastersign.Bench.FileSystem.AsureDir). + +## Bench Configuration Functions {#config-funcs} + +### `Get-ConfigValue` {#fun-get-configvalue} + +* Description: Returns the value of a [Bench configuration property](/ref/config). +* Parameter: + + `name` The name of the configuration property. +* Return Value: The value of the property or `$null`. + +The data type of the property can be string, boolean, array of strings, +or dictionary with string keys and values. +If you want to read a boolean value use [`Get-ConfigBooleanValue`](#fun-get-configbooleanvalue), +because strings can be interpreted as booleans. +If you want to read a list value use [`Get-ConfigListValue`](#fun-get-configlistvalue), +because strings can be interpreted as an array with one element. + +### `Get-ConfigBooleanValue` {#fun-configbooleanvalue} + +* Description: Returns the boolean value of a [Bench configuration property](/ref/config). +* Parameter: + + `name` The name of the configuration property. +* Return Value: The value of the property as boolean. + +If the property has no value, `$false` is returned. + +### `Get-ConfigListValue` {#fun-configlistvalue} + +* Description: Returns the list value of a [Bench configuration property](/ref/config). +* Parameter: + + `name` The name of the configuration property. +* Return Value: The value of the property as array of strings. + +If the property only contains a string, an array with one element is returned. +If the property has no value, an empty array is returned. + +## App Property Functions {#app-config-funcs} + +### `Get-AppConfigValue` {#fun-get-appconfigvalue} + +* Description: Returns the value of an [Bench app property](/ref/app-properties). +* Parameter: + + `app` The ID of an app. + + `name` The name of the property. +* Return Value: The value of the property as string or `$null`. + +If the property has no value, or the app ID is not defined, `$null` is returned. +If you want to read a boolean value use [`Get-AppConfigBooleanValue`](#fun-get-appconfigbooleanvalue), +because strings can be interpreted as booleans. +If you want to read a list value use [`Get-AppConfigListValue`](#fun-get-appconfiglistvalue), +because strings can be interpreted as an array with one element. + +### `Get-AppConfigBooleanValue` {#fun-get-appconfigbooleanvalue} + +* Description: Returns the boolean value of an [Bench app property](/ref/app-properties). +* Parameter: + + `app` The ID of an app. + + `name` The name of the property. +* Return Value: The value of the property as boolean. + +If the property has no value, `$false` is returned. +If the app ID is not defined, `$null` is returned. + +### `Get-AppConfigListValue` {#fun-get-appconfiglistvalue} + +* Description: Returns the list value of an [Bench app property](/ref/app-properties). ++ `app` The ID of an app. ++ `name` The name of the property. +* Return Value: The value of the property as boolean. + +If the property only contains a string, an array with one element is returned. +If the property has no value, an empty array is returned. +If the app ID is not defined, `$null` is returned. + +### `App-Typ` {#fun-app-typ} + +* Description: This function returns the value of the + [`Typ`](/ref/app-properties/#Typ) property. +* Parameter: + + `app`: The app ID. +* Return Value: The string value of the property, + or `$null` in case the app ID is not defined. + +### `App-Version` {#fun-app-version} + +* Description: This function returns the value of the + [`Version`](/ref/app-properties/#Version) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. + +### `App-Dependencies` {#fun-app-dependencies} + +* Description: This function returns the list value of the + [`Dependencies`](/ref/app-properties/#Dependencies) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as array of strings, + or `$null` in case the app ID is not defined. + +### `App-Url` {#fun-app-url} + +* Description: This function returns the value of the + [`Url`](/ref/app-properties/#Url) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. + +### `App-DownloadHeaders` {#fun-app-downloadheaders} + +* Description: This function returns the dictionary value of the + [`DownloadHeaders`](/ref/app-properties/#DownloadHeaders) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as dictionary, + or `$null` in case the app ID is not defined. + +### `App-DownloadCookies` {#fun-app-downloadcookies} + +* Description: This function returns the dictionary value of the + [`DownloadCookies`](/ref/app-properties/#DownloadCookies) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as dictionary, + or `$null` in case the app ID is not defined. + +### `App-ResourceFile` {#fun-app-resourcefile} + +* Description: This function returns the string value of the + [`ResourceName`](/ref/app-properties/#ResourceName) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. + +### `App-ResourceArchive` {#fun-app-resourcearchive} + +* Description: This function returns the string value of the + [`ArchiveName`](/ref/app-properties/#ArchiveName) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. + +### `App-ResourceArchiveTyp` {#fun-app-resourcearchivetyp} + +* Description: This function returns the string value of the + [`ResourceArchiveTyp`](/ref/app-properties/#ResourceArchiveTyp) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. + +### `App-ResourceArchivePath` {#fun-app-resourcearchivepath} + +* Description: This function returns the string value of the + [`ArchivePath`](/ref/app-properties/#ArchivePath) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. + +### `App-Force` {#fun-app-force} + +* Description: This function returns the boolean value of the + [`Force`](/ref/app-properties/#Force) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as boolean, + or `$null` in case the app ID is not defined. + +### `App-PackageName` {#fun-app-packagename} + +* Description: This function returns the string value of the + [`PackageName`](/ref/app-properties/#PackageName) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. + +### `App-Dir` {#fun-app-dir} + +* Description: This function returns the string value of the + [`Dir`](/ref/app-properties/#Dir) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. + +### `App-Path` {#fun-app-path} + +* Description: This function returns the first element in the list value of the + [`Path`](/ref/app-properties/#Path) property. +* Parameter: + + `app`: The app ID. +* Return Value: The first item in the array value of the property as string, + or `$null` in case the app ID is not defined. + +### `App-Paths` {#fun-app-paths} + +* Description: This function returns the list value of the + [`Path`](/ref/app-properties/#Path) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as array of strings, + or `$null` in case the app ID is not defined. + +### `App-Exe` {#fun-app-exe} + +* Description: This function returns the string value of the + [`Exe`](/ref/app-properties/#Exe) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. + +### `App-Register` {#fun-app-register} + +* Description: This function returns the boolean value of the + [`Register`](/ref/app-properties/#Register) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as boolean, + or `$null` in case the app ID is not defined. + +### `App-Environment` {#fun-app-environment} + +* Description: This function returns the dictionary value of the + [`Environment`](/ref/app-properties/#Environment) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as dictionary, + or `$null` in case the app ID is not defined. + +### `App-AdornedExecutables` {#fun-app-adornedexecutables} + +* Description: This function returns the list value of the + [`AdornedExecutables`](/ref/app-properties/#AdornedExecutables) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as array of strings, + or `$null` in case the app ID is not defined. -### File System +### `App-RegistryKeys` {#fun-app-registrykeys} -#### `Empty-Dir` {#fun-empty-dir} +* Description: This function returns the list value of the + [`RegistryKeys`](/ref/app-properties/#RegistryKeys) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as array of strings, + or `$null` in case the app ID is not defined. -#### `Find-File` {#fun-find-file} +### `App-Launcher` {#fun-app-launcher} -#### `Find-Files` {#fun-find-files} +* Description: This function returns the string value of the + [`Launcher`](/ref/app-properties/#Launcher) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. -#### `Purge-Dir` {#fun-purge-dir} +### `App-LauncherExecutable` {#fun-app-launcherexecutable} -#### `Safe-Dir` {#fun-safe-dir} +* Description: This function returns the string value of the + [`LauncherExecutable`](/ref/app-properties/#LauncherExecutable) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. -### Configuration Properties +### `App-LauncherArguments` {#fun-app-launcherarguments} -#### `Get-ConfigValue` +* Description: This function returns the list value of the + [`LauncherArguments`](/ref/app-properties/#LauncherArguments) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as array of strings, + or `$null` in case the app ID is not defined. -#### `Get-ConfigBooleanValue` +### `App-LauncherIcon` {#fun-app-launchericon} -#### `Get-ConfigListValue` +* Description: This function returns the string value of the + [`LauncherIcon`](/ref/app-properties/#LauncherIcon) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. -### App Properties +### `App-SetupTestFile` {#fun-app-setuptestfile} -#### `Get-AppConfigValue` +* Description: This function returns the string value of the + [`SetupTestFile`](/ref/app-properties/#SetupTestFile) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. -#### `Get-AppConfigBooleanValue` +### `Check-App` {#fun-check-app} -#### `Get-AppConfigListValue` +* Description: This function returns a boolean value, indicating if this app is installed. +* Parameter: + + `app`: The app ID. +* Return Value: `$true` if the app is installed, + `$false` if the app is not installed, + and `$null` if the app ID is not defined. diff --git a/docs/src-content/ref/ps-api.md b/docs/src-content/ref/ps-api.md index add4e0ac..c697e978 100644 --- a/docs/src-content/ref/ps-api.md +++ b/docs/src-content/ref/ps-api.md @@ -6,64 +6,426 @@ title = "PowerShell API" weight = 9 +++ -The _PowerShell API_ of Bench consists of a set of functions/commandlets, +The _PowerShell API_ of Bench consists of a set of global variables and functions, available in custom and hook scripts. -## Variables +[**Variables**](#vars) -### `$global:BenchConfig` {#var-bench-config} + -This variable in the global scope holds a reference to a +[**Utility Functions**](#util-funcs) + + + +[**File System Functions**](#fs-funcs) + + + +[**Bench Configuration Functions**](#config-funcs) + + + +[**App Property Functions**](#app-config-funcs) + + + +## Variables {#vars} + +### `$BenchConfig` {#var-bench-config} + +This variable in the global scope a [`Mastersign.Bench.BenchConfiguration`](/ref/clr-api/class/Mastersign.Bench.BenchConfiguration) object. This object holds the merged Bench configuration from all configuration files. -## Functions +**Hint**: Access via `$global:BenchConfig`. -### Utilities +## Utility Functions {#util-funcs} -#### `Exit-OnError` {#fun-exit-onerror} +### `Exit-OnError` {#fun-exit-onerror} * Description: Checks an process exit code and exits the current script if it is not 0. -* Parameter +* Parameter: + `exitCode` (optional) The exit code to check. Default value is `$LastExitCode`. -#### `Pause` {#fun-pause} +### `Pause` {#fun-pause} * Description: Prints a message and waits for an arbitrary key press before it returns. -* Parameter +* Parameter: + `msg` (optional) The message to print. Default value is `"Press any key to exit ..."`. -#### `Run-Detached` {#fun-run-detached} +### `Run-Detached` {#fun-run-detached} + +* Description: Starts a detached process without blocking. +* Parameter: + + `path` The absolute path to the executable. + + ... An arbitrary number of command line arguments + +## File System Functions {#fs-funcs} + +### `Empty-Dir` {#fun-empty-dir} + +* Description: Makes sure a path points to an empty directory. +* Parameter: + + `path` The absolute path to the directory. +* Return Value: The absolute path to the directory. + +If the directory exists, all of its children are deleted. +If the directory does not exist, it is created. + +This function is a wrapper for [Mastersign.Bench.FileSystem.EmptyDir()](/ref/clr-api/method/Mastersign.Bench.FileSystem.EmptyDir). + +### `Find-File` {#fun-find-file} + +* Description: Searches for the first file that matches a given pattern, in a given directory. +* Parameter: + + `dir` The absolute path to a directory. + + `pattern` The pattern to search for, syntax according to + [`System.IO.Directory.GetFiles()`](https://msdn.microsoft.com/de-de/library/wz42302f.aspx). +* Return Value: The absolute path of the found file or `$null`, + if the given directory does not exist or no file matches. + +If more than one file in the given directory matches the pattern, +it is not defined which one is returned. + +### `Find-Files` {#fun-find-files} + +* Description: Searches for files which match a given pattern, in a given directory. +* Parameter: + + `dir` The absolute path to a directory. + + `pattern` The pattern to search for, syntax according to + [`System.IO.Directory.GetFiles()`](https://msdn.microsoft.com/de-de/library/wz42302f.aspx). +* Return Value: An array with the found files. + +If the specified directory does not exist, an empty array is returned. + +### `Purge-Dir` {#fun-purge-dir} + +* Description: Deletes a directory and all of its content. +* Parameter: + + `path` The absolute path to the directory. + +Solves a problem with deleting directories recursively, if they contain read-only files. +This function is a wrapper for +[Mastersign.Bench.FileSystem.PurgeDir()](/ref/clr-api/method/Mastersign.Bench.FileSystem.PurgeDir). + +### `Safe-Dir` {#fun-safe-dir} + +* Description: Makes sure a directory exists. +* Parameter: + + `path` The absolute path to the directory. +* Return Value: The absolute path to the directory. + +This method is a wrapper for +[Mastersign.Bench.FileSystem.AsureDir()](/ref/clr-api/method/Mastersign.Bench.FileSystem.AsureDir). + +## Bench Configuration Functions {#config-funcs} + +### `Get-ConfigValue` {#fun-get-configvalue} + +* Description: Returns the value of a [Bench configuration property](/ref/config). +* Parameter: + + `name` The name of the configuration property. +* Return Value: The value of the property or `$null`. + +The data type of the property can be string, boolean, array of strings, +or dictionary with string keys and values. +If you want to read a boolean value use [`Get-ConfigBooleanValue`](#fun-get-configbooleanvalue), +because strings can be interpreted as booleans. +If you want to read a list value use [`Get-ConfigListValue`](#fun-get-configlistvalue), +because strings can be interpreted as an array with one element. + +### `Get-ConfigBooleanValue` {#fun-configbooleanvalue} + +* Description: Returns the boolean value of a [Bench configuration property](/ref/config). +* Parameter: + + `name` The name of the configuration property. +* Return Value: The value of the property as boolean. + +If the property has no value, `$false` is returned. + +### `Get-ConfigListValue` {#fun-configlistvalue} + +* Description: Returns the list value of a [Bench configuration property](/ref/config). +* Parameter: + + `name` The name of the configuration property. +* Return Value: The value of the property as array of strings. + +If the property only contains a string, an array with one element is returned. +If the property has no value, an empty array is returned. + +## App Property Functions {#app-config-funcs} + +### `Get-AppConfigValue` {#fun-get-appconfigvalue} + +* Description: Returns the value of an [Bench app property](/ref/app-properties). +* Parameter: + + `app` The ID of an app. + + `name` The name of the property. +* Return Value: The value of the property as string or `$null`. + +If the property has no value, or the app ID is not defined, `$null` is returned. +If you want to read a boolean value use [`Get-AppConfigBooleanValue`](#fun-get-appconfigbooleanvalue), +because strings can be interpreted as booleans. +If you want to read a list value use [`Get-AppConfigListValue`](#fun-get-appconfiglistvalue), +because strings can be interpreted as an array with one element. + +### `Get-AppConfigBooleanValue` {#fun-get-appconfigbooleanvalue} + +* Description: Returns the boolean value of an [Bench app property](/ref/app-properties). +* Parameter: + + `app` The ID of an app. + + `name` The name of the property. +* Return Value: The value of the property as boolean. + +If the property has no value, `$false` is returned. +If the app ID is not defined, `$null` is returned. + +### `Get-AppConfigListValue` {#fun-get-appconfiglistvalue} + +* Description: Returns the list value of an [Bench app property](/ref/app-properties). ++ `app` The ID of an app. ++ `name` The name of the property. +* Return Value: The value of the property as boolean. + +If the property only contains a string, an array with one element is returned. +If the property has no value, an empty array is returned. +If the app ID is not defined, `$null` is returned. + +### `App-Typ` {#fun-app-typ} + +* Description: This function returns the value of the + [`Typ`](/ref/app-properties/#Typ) property. +* Parameter: + + `app`: The app ID. +* Return Value: The string value of the property, + or `$null` in case the app ID is not defined. + +### `App-Version` {#fun-app-version} + +* Description: This function returns the value of the + [`Version`](/ref/app-properties/#Version) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. + +### `App-Dependencies` {#fun-app-dependencies} + +* Description: This function returns the list value of the + [`Dependencies`](/ref/app-properties/#Dependencies) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as array of strings, + or `$null` in case the app ID is not defined. + +### `App-Url` {#fun-app-url} + +* Description: This function returns the value of the + [`Url`](/ref/app-properties/#Url) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. + +### `App-DownloadHeaders` {#fun-app-downloadheaders} + +* Description: This function returns the dictionary value of the + [`DownloadHeaders`](/ref/app-properties/#DownloadHeaders) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as dictionary, + or `$null` in case the app ID is not defined. + +### `App-DownloadCookies` {#fun-app-downloadcookies} + +* Description: This function returns the dictionary value of the + [`DownloadCookies`](/ref/app-properties/#DownloadCookies) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as dictionary, + or `$null` in case the app ID is not defined. + +### `App-ResourceFile` {#fun-app-resourcefile} + +* Description: This function returns the string value of the + [`ResourceName`](/ref/app-properties/#ResourceName) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. + +### `App-ResourceArchive` {#fun-app-resourcearchive} + +* Description: This function returns the string value of the + [`ArchiveName`](/ref/app-properties/#ArchiveName) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. + +### `App-ResourceArchiveTyp` {#fun-app-resourcearchivetyp} + +* Description: This function returns the string value of the + [`ResourceArchiveTyp`](/ref/app-properties/#ResourceArchiveTyp) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. + +### `App-ResourceArchivePath` {#fun-app-resourcearchivepath} + +* Description: This function returns the string value of the + [`ArchivePath`](/ref/app-properties/#ArchivePath) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. + +### `App-Force` {#fun-app-force} + +* Description: This function returns the boolean value of the + [`Force`](/ref/app-properties/#Force) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as boolean, + or `$null` in case the app ID is not defined. + +### `App-PackageName` {#fun-app-packagename} + +* Description: This function returns the string value of the + [`PackageName`](/ref/app-properties/#PackageName) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. + +### `App-Dir` {#fun-app-dir} + +* Description: This function returns the string value of the + [`Dir`](/ref/app-properties/#Dir) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. + +### `App-Path` {#fun-app-path} + +* Description: This function returns the first element in the list value of the + [`Path`](/ref/app-properties/#Path) property. +* Parameter: + + `app`: The app ID. +* Return Value: The first item in the array value of the property as string, + or `$null` in case the app ID is not defined. + +### `App-Paths` {#fun-app-paths} + +* Description: This function returns the list value of the + [`Path`](/ref/app-properties/#Path) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as array of strings, + or `$null` in case the app ID is not defined. + +### `App-Exe` {#fun-app-exe} + +* Description: This function returns the string value of the + [`Exe`](/ref/app-properties/#Exe) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. + +### `App-Register` {#fun-app-register} + +* Description: This function returns the boolean value of the + [`Register`](/ref/app-properties/#Register) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as boolean, + or `$null` in case the app ID is not defined. + +### `App-Environment` {#fun-app-environment} + +* Description: This function returns the dictionary value of the + [`Environment`](/ref/app-properties/#Environment) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as dictionary, + or `$null` in case the app ID is not defined. + +### `App-AdornedExecutables` {#fun-app-adornedexecutables} + +* Description: This function returns the list value of the + [`AdornedExecutables`](/ref/app-properties/#AdornedExecutables) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as array of strings, + or `$null` in case the app ID is not defined. -### File System +### `App-RegistryKeys` {#fun-app-registrykeys} -#### `Empty-Dir` {#fun-empty-dir} +* Description: This function returns the list value of the + [`RegistryKeys`](/ref/app-properties/#RegistryKeys) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as array of strings, + or `$null` in case the app ID is not defined. -#### `Find-File` {#fun-find-file} +### `App-Launcher` {#fun-app-launcher} -#### `Find-Files` {#fun-find-files} +* Description: This function returns the string value of the + [`Launcher`](/ref/app-properties/#Launcher) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. -#### `Purge-Dir` {#fun-purge-dir} +### `App-LauncherExecutable` {#fun-app-launcherexecutable} -#### `Safe-Dir` {#fun-safe-dir} +* Description: This function returns the string value of the + [`LauncherExecutable`](/ref/app-properties/#LauncherExecutable) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. -### Configuration Properties +### `App-LauncherArguments` {#fun-app-launcherarguments} -#### `Get-ConfigValue` +* Description: This function returns the list value of the + [`LauncherArguments`](/ref/app-properties/#LauncherArguments) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as array of strings, + or `$null` in case the app ID is not defined. -#### `Get-ConfigBooleanValue` +### `App-LauncherIcon` {#fun-app-launchericon} -#### `Get-ConfigListValue` +* Description: This function returns the string value of the + [`LauncherIcon`](/ref/app-properties/#LauncherIcon) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. -### App Properties +### `App-SetupTestFile` {#fun-app-setuptestfile} -#### `Get-AppConfigValue` +* Description: This function returns the string value of the + [`SetupTestFile`](/ref/app-properties/#SetupTestFile) property. +* Parameter: + + `app`: The app ID. +* Return Value: The value of the property as string, + or `$null` in case the app ID is not defined. -#### `Get-AppConfigBooleanValue` +### `Check-App` {#fun-check-app} -#### `Get-AppConfigListValue` +* Description: This function returns a boolean value, indicating if this app is installed. +* Parameter: + + `app`: The app ID. +* Return Value: `$true` if the app is installed, + `$false` if the app is not installed, + and `$null` if the app ID is not defined. From 23c8a27ae82b2f5ba9a1b969e12b2ffff325fc1c Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 13 Jul 2016 11:22:24 +0200 Subject: [PATCH 22/52] removed draft status --- docs/content/ref/ps-api.md | 1 - docs/src-content/ref/ps-api.md | 1 - 2 files changed, 2 deletions(-) diff --git a/docs/content/ref/ps-api.md b/docs/content/ref/ps-api.md index 997a166f..d0dfe0cd 100644 --- a/docs/content/ref/ps-api.md +++ b/docs/content/ref/ps-api.md @@ -1,7 +1,6 @@ +++ date = "2016-06-22T13:43:35+02:00" description = "The programming interface for hooks and custom scripts" -draft = true title = "PowerShell API" weight = 9 +++ diff --git a/docs/src-content/ref/ps-api.md b/docs/src-content/ref/ps-api.md index c697e978..2d623da2 100644 --- a/docs/src-content/ref/ps-api.md +++ b/docs/src-content/ref/ps-api.md @@ -1,7 +1,6 @@ +++ date = "2016-06-22T13:43:35+02:00" description = "The programming interface for hooks and custom scripts" -draft = true title = "PowerShell API" weight = 9 +++ From 4cad5367a4ed67c1159cbe42b4108bbe2b2a6047 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 13 Jul 2016 12:02:25 +0200 Subject: [PATCH 23/52] improved generation of app list --- build/update-app-list.ps1 | 20 ++++++++++---------- docs/content/ref/apps.md | 12 ++++++------ docs/src-content/ref/apps.md | 12 ++++++------ 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/build/update-app-list.ps1 b/build/update-app-list.ps1 index 2e440d7b..c903de35 100644 --- a/build/update-app-list.ps1 +++ b/build/update-app-list.ps1 @@ -57,9 +57,9 @@ function WriteAppBlock($sb, $app) $_ = $sb.AppendLine() } -function WriteAppTable($sb, $label) +function WriteAppTable($sb, $label, $anchor) { - $_ = $sb.AppendLine("**$label**") + $_ = $sb.AppendLine("[**$label**](#$anchor)") $_ = $sb.AppendLine() $_ = $sb.AppendLine(" -**Required Apps** +[**Required Apps**](#apps-required) -**Optional Apps** +[**Optional Apps**](#apps-optional) -## Groups +## Groups {#groups} ### 3D Modeling {#Dev3D} @@ -115,7 +115,7 @@ weight = 1 * Version: latest * Dependencies: [PHP 7](#PHP7), [MySQL](#MySQL), [MySQL Workbench](#MySQLWB), [Apache](#Apache), [Eclipse for PHP](#EclipsePHP) -## Required Apps +## Required Apps {#apps-required} ### 7-Zip {#SvZ} @@ -145,7 +145,7 @@ weight = 1 * Website: * Version: 1.3 -## Optional Apps +## Optional Apps {#apps-optional} ### Ant Renamer {#AntRenamer} From 4696eb1c6e3c572eab6c8a4626429c72aed5c7f4 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 13 Jul 2016 12:02:51 +0200 Subject: [PATCH 24/52] added documentation for `bench-ctl initialize` --- docs/content/ref/bench-ctl.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/content/ref/bench-ctl.md b/docs/content/ref/bench-ctl.md index b1941f86..9d92a4cc 100644 --- a/docs/content/ref/bench-ctl.md +++ b/docs/content/ref/bench-ctl.md @@ -107,3 +107,14 @@ But you can allways run the `setup` and `reinstall` tasks in an attempt to repa This script does not touch any user data in the _Bench_ home directory, and it does not touch the custom configuration (`config.md`, `apps.md`, ...) in the `config` folder either. + +### `initialize` +This task performs the initial setup or upgrade of a _Bench_ installation. +This task is run by the [bootstrap file](/ref/file-structure/#bench-install) +and usually does not need to be run manually. +It performs the following steps: + +* Initializing the [site configuration](/ref/file-structure/#bench-site) if none exists +* Installing the [required apps](/ref/apps/#apps-required) +* Initializing the [custom configuration](/ref/file-structure/#config-dir) if none exists +* Running the Bench setup (app installation and environment setup) with the custom configuration From a593f30b42b82a7a6771a69f2f413457f1ccd853 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 13 Jul 2016 12:03:15 +0200 Subject: [PATCH 25/52] fixed typos in docs/ref/file-structure.md --- docs/content/ref/file-structure.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/content/ref/file-structure.md b/docs/content/ref/file-structure.md index 2784edd9..6465118f 100644 --- a/docs/content/ref/file-structure.md +++ b/docs/content/ref/file-structure.md @@ -48,7 +48,7 @@ during the Bench setup, and _can not_ be moved via custom or site configuration. + `editor.cmd` + `init.cmd` + `runps.cmd` -* [`config`](#config) Custom Configuration +* [`config`](#config-dir) Custom Configuration ([CustomConfigDir](/ref/config/#CustomConfigDir)) + [`apps.md`](#config-apps) App Library ([CustomAppIndexFile](/ref/config/#CustomAppIndexFile)) @@ -71,7 +71,7 @@ during the Bench setup, and _can not_ be moved via custom or site configuration. ([AppActivationTemplateFile](/ref/config/#AppActivationTemplateFile)) + [`apps-deactivated.template.txt`](#res-app-deactivation-template) ([AppDeactivationTemplateFile](/ref/config/#AppDeactivationTemplateFile)) - + [`bench-install.bat`](#res-bench.install) Bootstrap Batch File + + [`bench-install.bat`](#res-bench-install) Bootstrap Batch File + [`bench-site.template.md`](#res-site-config-template) ([SiteConfigTemplateFile](/ref/config/#SiteConfigTemplateFile)) + [`ConEmu.template.xml`](#res-conemu-template) From beb8af2f2223e7f7cbbc501fbca8e6b6b71d3790 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 13 Jul 2016 12:03:32 +0200 Subject: [PATCH 26/52] added description for bench-install.bat --- docs/content/ref/file-structure.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/content/ref/file-structure.md b/docs/content/ref/file-structure.md index 6465118f..8d85fb5c 100644 --- a/docs/content/ref/file-structure.md +++ b/docs/content/ref/file-structure.md @@ -433,6 +433,10 @@ Inside of the _setup hook script_ is the [PowerShell API](/ref/ps-api/) availabl * Path: `res\bench-install.batch` * Typ: file +This file is the _installation program_ for Bench. +The latest version can be downloaded from: +. + ### Site Configuration Template {#res-site-config-template} * Description: The template for the site configuration file. From f78161e56aebafb08429e96e52e0b5000bd083d8 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 13 Jul 2016 12:03:50 +0200 Subject: [PATCH 27/52] started writing the tech guide for Bench setup --- docs/content/guide/setup.md | 28 +++++++++++++++++++++++++- docs/src-content/guide/setup.md | 35 +++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 docs/src-content/guide/setup.md diff --git a/docs/content/guide/setup.md b/docs/content/guide/setup.md index b640b339..da7b03de 100644 --- a/docs/content/guide/setup.md +++ b/docs/content/guide/setup.md @@ -6,4 +6,30 @@ title = "Bench Setup and Upgrade" weight = 2 +++ -TODO +The setup of the Bench system is performed in the following steps: + +* Creating a directory as Bench root +* Downloading the (latest) [bootstrap file][] in the Bench root +* Running the [bootstrap file][] ... + + Downloading the (latest) Bench archive (`bench.zip`) from GitHub + + Deleting the following folders in the Bench root: `actions`, `auto`, `res`, `lib`, `tmp` + + Extracting the Bench archive +* Running the Bench CLI in [initialization mode](/ref/bench-ctl/#initialize) ... + + Initializing the [site configuration][] + + Downloading missing app resources for [required apps][] + + Installing the [required apps][] + + Initializing the [custom configuration][] +* Running the Bench CLI in [setup mode](/ref/bench-ctl/#setup) ... + + Downloading missing app resources for activated apps + + Installing activated apps + + Writing the [Bench environment file][] + + Creating Launcher shortcuts + +Running the Bench CLI in [upgrade mode](/ref/bench-ctl/#upgrade) +performs all steps listed above, except creating the Bench root directory. + +[bootstrap file]: /ref/file-structure/#res-bench-install +[site configuration]: /ref/file-structure/#bench-site +[custom configuration]: /ref/file-structure/#config-dir +[required apps]: /ref/apps/#apps-required +[Bench environment file]: /ref/file-structure/#env diff --git a/docs/src-content/guide/setup.md b/docs/src-content/guide/setup.md new file mode 100644 index 00000000..da7b03de --- /dev/null +++ b/docs/src-content/guide/setup.md @@ -0,0 +1,35 @@ ++++ +date = "2016-06-22T13:05:14+02:00" +description = "The process of installing or upgrading Bench" +draft = true +title = "Bench Setup and Upgrade" +weight = 2 ++++ + +The setup of the Bench system is performed in the following steps: + +* Creating a directory as Bench root +* Downloading the (latest) [bootstrap file][] in the Bench root +* Running the [bootstrap file][] ... + + Downloading the (latest) Bench archive (`bench.zip`) from GitHub + + Deleting the following folders in the Bench root: `actions`, `auto`, `res`, `lib`, `tmp` + + Extracting the Bench archive +* Running the Bench CLI in [initialization mode](/ref/bench-ctl/#initialize) ... + + Initializing the [site configuration][] + + Downloading missing app resources for [required apps][] + + Installing the [required apps][] + + Initializing the [custom configuration][] +* Running the Bench CLI in [setup mode](/ref/bench-ctl/#setup) ... + + Downloading missing app resources for activated apps + + Installing activated apps + + Writing the [Bench environment file][] + + Creating Launcher shortcuts + +Running the Bench CLI in [upgrade mode](/ref/bench-ctl/#upgrade) +performs all steps listed above, except creating the Bench root directory. + +[bootstrap file]: /ref/file-structure/#res-bench-install +[site configuration]: /ref/file-structure/#bench-site +[custom configuration]: /ref/file-structure/#config-dir +[required apps]: /ref/apps/#apps-required +[Bench environment file]: /ref/file-structure/#env From 79c89d13fec5775237d848255e8ea9b497575946 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 13 Jul 2016 16:03:20 +0200 Subject: [PATCH 28/52] fix corrupted enumeration of possible values --- docs/content/ref/app-properties.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/content/ref/app-properties.md b/docs/content/ref/app-properties.md index fa976cb1..673fcb9a 100644 --- a/docs/content/ref/app-properties.md +++ b/docs/content/ref/app-properties.md @@ -53,11 +53,13 @@ weight = 8 * Description: The application typ * Data Type: string -* Possible Values: `default`, `meta`, `*-package`python3-package`, `ruby-package` +* Possible Values: `default`, `meta`, `node-package`, `python2-package`, `python3-package`, `ruby-package` * Required: `false` * Default: `default` * App Types: all +The meaning of the different possible values is explained in [App Types](/ref/app-types). + ## Dependencies {#Dependencies} * Description: A list with the IDs of all apps in this app group From 501ea10623a0b253e1fa2388c3cc8d9498b3e8ee Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 13 Jul 2016 16:04:43 +0200 Subject: [PATCH 29/52] introduce docs/src-content/ref/app-types.md remove the mention of different groups of app properties --- docs/content/ref/app-types.md | 42 ++++++---------- docs/src-content/ref/app-properties.md | 4 +- docs/src-content/ref/app-types.md | 68 ++++++++++++++++++++++++++ 3 files changed, 85 insertions(+), 29 deletions(-) create mode 100644 docs/src-content/ref/app-types.md diff --git a/docs/content/ref/app-types.md b/docs/content/ref/app-types.md index 69d9c188..9c34ad77 100644 --- a/docs/content/ref/app-types.md +++ b/docs/content/ref/app-types.md @@ -1,10 +1,12 @@ +++ -date = "2016-06-22T13:43:21+02:00" +date = "2016-07-13" description = "The different types of apps in Bench" title = "App Types" weight = 7 +++ +[`Typ`]: /ref/app-properties/#Typ + There are currently the following types of apps: * Typ `meta`: app groups or apps with a fully customized setup process @@ -14,22 +16,18 @@ There are currently the following types of apps: * Typ `python3-package`: Python packages for Python 3 from PyPI, installable with PIP * Typ `ruby-package`: Ruby packages, installable with Gem -## Meta App -An app is a _Meta App_ if its `typ` is set to `meta`. - -This app type recognizes the [common app properties]. +## Meta App {#meta} +An app is a _Meta App_ if its [`Typ`][] is set to `meta`. A _Meta App_ is an app without an actual program. -It can be used as a **group** by only referencing other apps as dependencies. +It can be used as a **group** by only referencing other apps as dependencies. Or it can be used to fully customize the download and setup process of an app with custom scripts. -## Default Windows App -An app is a _Default Windows App_ if its `typ` property +## Default Windows App {#default} +An app is a _Default Windows App_ if its [`Typ`][] property is set to `default` or not set at all. -This app type recognizes the [common app properties] and the [properties of default apps]. - A _Default Windows App_ is the definition for some kind of script or binary executable for the Windows operating system. In contrast to other apps, a _Default Windows App_ has a program resource, @@ -42,20 +40,16 @@ its files into its target directory. Optionally some custom scripts can be executed during the setup, to perform some additional configuration for the app. -## Node.js Package -An app is a _Node.js Package_ if its `typ` property is set to `node-package`. - -This app type recognizes the [common app properties] and the [properties of Node.js packages]. +## Node.js Package {#node-package} +An app is a _Node.js Package_ if its [`Typ`][] property is set to `node-package`. A _Node.js Package_ is downloaded and installed by _npm_ the Node.js package manager. To determine, if a _Node.js Package_ is already installed, the existence of its package folder in `node_modules` in the Node.js directory is checked. -## Python Package -An app is a _Python Package_ if its `typ` property is set to `python2-package` or `python3-package`. - -This app type recognizes the [common app properties] and the [properties of Python packages]. +## Python Package {#python-package} +An app is a _Python Package_ if its [`Typ`][] property is set to `python2-package` or `python3-package`. A _Python Package_ is downloaded and installed by _PIP_ the Python package manager. _Python Packages_ for Python 2 and Python 3 are defined separately. @@ -64,19 +58,11 @@ If you need a _Python Package_ for both major versions, you need to define it tw To determine, if a _Python Package_ is already installed, the existence of its package folder in `lib\site-packages` in the Python directory is checked. -## Ruby Package -An app is a _Ruby Package_ if its `typ` property is set to `ruby-package`. - -This app type recognizes the [common app properties] and the [properties of Ruby packages]. +## Ruby Package {#ruby-package} +An app is a _Ruby Package_ if its [`Typ`][] property is set to `ruby-package`. A _Ruby Package_ is actually a _gem_ and is downloaded and installed by the Ruby package manager, also called _gem_. To determine, if a _Ruby gem_ is already installed, the existence of its package folder in `lib\ruby\gems\\gems` in the Ruby directory is checked. - -[common app properties]: /ref/app-properties/#common-properties -[properties of default apps]: /ref/app-properties/#default-windows-app -[properties of Node.js packages]: /ref/app-properties/#node-js-package -[properties of Python packages]: /ref/app-properties/#python-package -[properties of Ruby packages]: /ref/app-properties/#ruby-package diff --git a/docs/src-content/ref/app-properties.md b/docs/src-content/ref/app-properties.md index 8ffa8896..e91aecb1 100644 --- a/docs/src-content/ref/app-properties.md +++ b/docs/src-content/ref/app-properties.md @@ -32,11 +32,13 @@ weight = 8 * Description: The application typ * Data Type: string -* Possible Values: `default`, `meta`, `*-package`python3-package`, `ruby-package` +* Possible Values: `default`, `meta`, `node-package`, `python2-package`, `python3-package`, `ruby-package` * Required: `false` * Default: `default` * App Types: all +The meaning of the different possible values is explained in [App Types](/ref/app-types). + ## Dependencies {#Dependencies} * Description: A list with the IDs of all apps in this app group diff --git a/docs/src-content/ref/app-types.md b/docs/src-content/ref/app-types.md new file mode 100644 index 00000000..9c34ad77 --- /dev/null +++ b/docs/src-content/ref/app-types.md @@ -0,0 +1,68 @@ ++++ +date = "2016-07-13" +description = "The different types of apps in Bench" +title = "App Types" +weight = 7 ++++ + +[`Typ`]: /ref/app-properties/#Typ + +There are currently the following types of apps: + +* Typ `meta`: app groups or apps with a fully customized setup process +* Typ `default`: Windows executables from a downloaded file, archive, or setup +* Typ `node-package`: Node.js packages, installable with NPM +* Typ `python2-package`: Python packages for Python 2 from PyPI, installable with PIP +* Typ `python3-package`: Python packages for Python 3 from PyPI, installable with PIP +* Typ `ruby-package`: Ruby packages, installable with Gem + +## Meta App {#meta} +An app is a _Meta App_ if its [`Typ`][] is set to `meta`. + +A _Meta App_ is an app without an actual program. +It can be used as a **group** by only referencing other apps as dependencies. +Or it can be used to fully customize the download and setup process +of an app with custom scripts. + +## Default Windows App {#default} +An app is a _Default Windows App_ if its [`Typ`][] property +is set to `default` or not set at all. + +A _Default Windows App_ is the definition for some kind of script or binary +executable for the Windows operating system. +In contrast to other apps, a _Default Windows App_ has a program resource, +which can be downloaded as a file. +The resource can be an executable on its own, or an archive of some kind, +even a setup or installer EXE. + +A _Default Windows App_ is extracted, and installed simply by copying +its files into its target directory. +Optionally some custom scripts can be executed during the setup, +to perform some additional configuration for the app. + +## Node.js Package {#node-package} +An app is a _Node.js Package_ if its [`Typ`][] property is set to `node-package`. + +A _Node.js Package_ is downloaded and installed by _npm_ the Node.js package manager. + +To determine, if a _Node.js Package_ is already installed, the existence of its package folder in +`node_modules` in the Node.js directory is checked. + +## Python Package {#python-package} +An app is a _Python Package_ if its [`Typ`][] property is set to `python2-package` or `python3-package`. + +A _Python Package_ is downloaded and installed by _PIP_ the Python package manager. +_Python Packages_ for Python 2 and Python 3 are defined separately. +If you need a _Python Package_ for both major versions, you need to define it twice. + +To determine, if a _Python Package_ is already installed, the existence of its package folder in +`lib\site-packages` in the Python directory is checked. + +## Ruby Package {#ruby-package} +An app is a _Ruby Package_ if its [`Typ`][] property is set to `ruby-package`. + +A _Ruby Package_ is actually a _gem_ and is downloaded and installed by the Ruby package +manager, also called _gem_. + +To determine, if a _Ruby gem_ is already installed, the existence of its package folder in +`lib\ruby\gems\\gems` in the Ruby directory is checked. From 94f1fe3a393c7fb93e94c35d897e5fa8a4425df9 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 13 Jul 2016 16:05:20 +0200 Subject: [PATCH 30/52] override summary layout, without metadata --- docs/layouts/_default/summary.html | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 docs/layouts/_default/summary.html diff --git a/docs/layouts/_default/summary.html b/docs/layouts/_default/summary.html new file mode 100644 index 00000000..0f705255 --- /dev/null +++ b/docs/layouts/_default/summary.html @@ -0,0 +1,15 @@ + From e066f12ec59e48a3c8a2a3a4db3730b75b1b78e0 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 13 Jul 2016 16:05:58 +0200 Subject: [PATCH 31/52] move the URL list from the bottom to the top, to work in a summary --- docs/content/guide/setup.md | 35 +++++++++++++++++++++------------ docs/src-content/guide/setup.md | 35 +++++++++++++++++++++------------ 2 files changed, 44 insertions(+), 26 deletions(-) diff --git a/docs/content/guide/setup.md b/docs/content/guide/setup.md index da7b03de..a6217c2f 100644 --- a/docs/content/guide/setup.md +++ b/docs/content/guide/setup.md @@ -1,25 +1,40 @@ +++ -date = "2016-06-22T13:05:14+02:00" +date = "2016-07-13" description = "The process of installing or upgrading Bench" -draft = true title = "Bench Setup and Upgrade" weight = 2 +++ -The setup of the Bench system is performed in the following steps: +[bootstrap file]: /ref/file-structure/#res-bench-install +[site configuration]: /ref/file-structure/#bench-site +[custom configuration]: /ref/file-structure/#config-dir +[Bench CLI]: /ref/bench-ctl +[required apps]: /ref/apps/#apps-required +[Bench environment file]: /ref/file-structure/#env +[initialization mode]: /ref/bench-ctl/#initialize +[setup mode]: /ref/bench-ctl/#setup + +Bench is installed and upgraded with a [bootstrap file][], which downloads +the archive `Bench.zip` with the Bench system files, extracts its content in the Bench root directory, +and starts the [Bench CLI][] with the [Initialization mode][] and the [setup mode][]. +The custom configuration is left untouched if it is already exists; +otherwise it can be initialized from a template or from a Git repository. + + +The full setup of the Bench system is performed in the following steps: * Creating a directory as Bench root * Downloading the (latest) [bootstrap file][] in the Bench root * Running the [bootstrap file][] ... - + Downloading the (latest) Bench archive (`bench.zip`) from GitHub + + Downloading the (latest) Bench archive (`Bench.zip`) from GitHub + Deleting the following folders in the Bench root: `actions`, `auto`, `res`, `lib`, `tmp` + Extracting the Bench archive -* Running the Bench CLI in [initialization mode](/ref/bench-ctl/#initialize) ... +* Running the Bench CLI in [initialization mode][] ... + Initializing the [site configuration][] + Downloading missing app resources for [required apps][] + Installing the [required apps][] - + Initializing the [custom configuration][] -* Running the Bench CLI in [setup mode](/ref/bench-ctl/#setup) ... + + Initializing the [custom configuration][] from template or existing Git repository +* Running the Bench CLI in [setup mode][] ... + Downloading missing app resources for activated apps + Installing activated apps + Writing the [Bench environment file][] @@ -27,9 +42,3 @@ The setup of the Bench system is performed in the following steps: Running the Bench CLI in [upgrade mode](/ref/bench-ctl/#upgrade) performs all steps listed above, except creating the Bench root directory. - -[bootstrap file]: /ref/file-structure/#res-bench-install -[site configuration]: /ref/file-structure/#bench-site -[custom configuration]: /ref/file-structure/#config-dir -[required apps]: /ref/apps/#apps-required -[Bench environment file]: /ref/file-structure/#env diff --git a/docs/src-content/guide/setup.md b/docs/src-content/guide/setup.md index da7b03de..a6217c2f 100644 --- a/docs/src-content/guide/setup.md +++ b/docs/src-content/guide/setup.md @@ -1,25 +1,40 @@ +++ -date = "2016-06-22T13:05:14+02:00" +date = "2016-07-13" description = "The process of installing or upgrading Bench" -draft = true title = "Bench Setup and Upgrade" weight = 2 +++ -The setup of the Bench system is performed in the following steps: +[bootstrap file]: /ref/file-structure/#res-bench-install +[site configuration]: /ref/file-structure/#bench-site +[custom configuration]: /ref/file-structure/#config-dir +[Bench CLI]: /ref/bench-ctl +[required apps]: /ref/apps/#apps-required +[Bench environment file]: /ref/file-structure/#env +[initialization mode]: /ref/bench-ctl/#initialize +[setup mode]: /ref/bench-ctl/#setup + +Bench is installed and upgraded with a [bootstrap file][], which downloads +the archive `Bench.zip` with the Bench system files, extracts its content in the Bench root directory, +and starts the [Bench CLI][] with the [Initialization mode][] and the [setup mode][]. +The custom configuration is left untouched if it is already exists; +otherwise it can be initialized from a template or from a Git repository. + + +The full setup of the Bench system is performed in the following steps: * Creating a directory as Bench root * Downloading the (latest) [bootstrap file][] in the Bench root * Running the [bootstrap file][] ... - + Downloading the (latest) Bench archive (`bench.zip`) from GitHub + + Downloading the (latest) Bench archive (`Bench.zip`) from GitHub + Deleting the following folders in the Bench root: `actions`, `auto`, `res`, `lib`, `tmp` + Extracting the Bench archive -* Running the Bench CLI in [initialization mode](/ref/bench-ctl/#initialize) ... +* Running the Bench CLI in [initialization mode][] ... + Initializing the [site configuration][] + Downloading missing app resources for [required apps][] + Installing the [required apps][] - + Initializing the [custom configuration][] -* Running the Bench CLI in [setup mode](/ref/bench-ctl/#setup) ... + + Initializing the [custom configuration][] from template or existing Git repository +* Running the Bench CLI in [setup mode][] ... + Downloading missing app resources for activated apps + Installing activated apps + Writing the [Bench environment file][] @@ -27,9 +42,3 @@ The setup of the Bench system is performed in the following steps: Running the Bench CLI in [upgrade mode](/ref/bench-ctl/#upgrade) performs all steps listed above, except creating the Bench root directory. - -[bootstrap file]: /ref/file-structure/#res-bench-install -[site configuration]: /ref/file-structure/#bench-site -[custom configuration]: /ref/file-structure/#config-dir -[required apps]: /ref/apps/#apps-required -[Bench environment file]: /ref/file-structure/#env From 254ac13c7e3188f4c7576ddd9092a569b079dce5 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 13 Jul 2016 16:06:17 +0200 Subject: [PATCH 32/52] start writing docs/guide/app-setup.md --- docs/content/guide/app-setup.md | 109 +++++++++++++++++++++++++ docs/src-content/guide/app-setup.md | 118 ++++++++++++++++++++++++++++ 2 files changed, 227 insertions(+) create mode 100644 docs/src-content/guide/app-setup.md diff --git a/docs/content/guide/app-setup.md b/docs/content/guide/app-setup.md index 2bd9ce0b..60a7a7c4 100644 --- a/docs/content/guide/app-setup.md +++ b/docs/content/guide/app-setup.md @@ -6,4 +6,113 @@ title = "App Setup and Upgrade" weight = 3 +++ +[App Types]: /ref/app-types +[App Version]: /ref/app-properties/#Version +[App Dependencies]: /ref/app-properties/#Dependencies +[App ArchiveTyp]: /ref/app-properties/#ArchiveTyp +[App SetupTestFile]: /ref/app-properties/#SetupTestFile +[App Automation Directory]: /ref/file-structure/#auto-apps-dir +[Setup Hook]: /ref/file-structure/#config-setup +[Environment Setup Hook]: /ref/file-structure/#config-env +[Custom Extract Script]: /ref/file-structure/#auto-apps-extract +[Custom Setup Script]: /ref/file-structure/#auto-apps-setup +[Custom Environment Setup Script]: /ref/file-structure/#auto-apps-env +[Custom Removal Script]: /ref/file-structure/#auto-apps-remove + +An app in Bench is installed according to its [typ][App Types]. +Default apps are installed by downloading their app resource file/archive +extracting or copying it into the apps target directory. +Meta apps are installed completely via custom scripts or they +just serve as groups for other apps via their [dependencies][App Dependencies]. +Package apps are installed via their package manager. +Custom scripts can extend or override different steps of the setup process. + + +If an app is included in the Bench system, its automation +is implemented as custom scripts and is stored in the [app automation directory][]. +If an app is defined in the custom app library, its automation +is implemented in the hooks for [setup][setup hook] and +[environment setup][environment setup hook]. + +## Meta Apps {#typ-meta} + +Meta apps do not have an app resource, which could be downloaded +and installed, via the install mechanisms Bench provides. +And it can not be installed via a package manager, which is supported by Bench. + +Therefore, all setup steps – given that there are some – +have to be performed by the custom scripts or hooks, respectively +for setup and environment setup. + +TODO + +## Default Apps {#typ-default} +Default apps are programs, which consist of at least one file, +which is executable by Windows. +This can be an `*.exe`, a `*.cmd`, or a `*.bat` file. +A default app has a resource file or archive which can be downloaded via a HTTP(S) URL. +If the app has resource file, usually the resource file itself is the executable. +If the app has a resource archive, the executable can be one of many files. + +### Installation {#typ-default-install} +The installation of a default app is performed by the following steps: + +* Download the resource file or archive if not cached +* **If** the resource is an archive file: + + **If** the [`ArchiveTyp`][App ArchiveTyp] is `auto` or `custom` and + a [custom extract script][] `.extract.ps1` is found: + Run the custom script to extract the archive content. + + **Else if** the [`ArchiveTyp`][App ArchiveTyp] is `auto`: + Select an extractor by the filename extension and extract the archive. + + **Else if** the [`ArchiveTyp`][App ArchiveTyp] is `msi`: + Use _LessMSI_ to extract the archive content. + + **Else if** the [`ArchiveTyp`][App ArchiveTyp] is `inno`: + Use _InnoUnpacker_ to extract the archive content. + + **Else if** the [`ArchiveTyp`][App ArchiveTyp] is `generic`: + Use _7-Zip_ if installed, else use _DotNetZip_ library to extract the archive content. +* **Else** + Copy the resource file to the apps target directory. +* Run the [custom setup script][] `.setup.ps1` if one is found. +* Run the [setup hook script][Setup Hook] if it exists. + If multiple apps are installed in one task, the hook script is only run one at the end. +* Run the [custom environment setup script][] `.env.ps1` if one is found. +* Run the [environment setup hook script][Environment Setup Hook] if it exists. + If multiple apps are installed in one task, the hook script is only run one at the end. + +Before an app can be installed, all of its dependencies must be installed. +This is necessary to allow custom setup scripts of an app +depend on the apps dependencies to be installed. +If an app with dependencies is installed in a task, then the task is automatically +extended to cover all dependencies not installed yet. + +If multiple apps are installed in one task, the steps _download_, _setup_, +and _environment setup_ can be performed consolidated. +Meaning first all _downloads_ are performed, then all _setups_ are performed, +and at last the _environment setup_ for all affected apps is performed. +Multiple apps are always installed in the order their ID is first listed in +the application libraries (first internal, then custom). + +To check if an app is already installed, the [`SetupTestFile`][App SetupTestFile] +is checked for existance. + +### Upgrade {#typ-default-upgrade} +An app can be upgraded, if it is installed, and its [`Version`][App Version] +is empty or set to `latest`. + +The upgrade of an app is performed by [removing](#typ-default-uninstall) the app, +deleting its app resource in case it is cached, and [installing](#typ-default-install) +the app afterwards. + +### Uninstalling {#typ-default-uninstall} +An app can be uninstalled, if it is installed. + +The removal of an app is performed in the following steps: + +* Run the [custom removal script][] `.remove.ps1` if it exists. +* Delete the apps target directory and all of its content. + +## Package Apps {#typ-package} +Package apps are apps, which are managed by some kind of package manager. +Examples are _npm_ for _Node.js_ or _PIP_ for _Python_. + TODO diff --git a/docs/src-content/guide/app-setup.md b/docs/src-content/guide/app-setup.md new file mode 100644 index 00000000..60a7a7c4 --- /dev/null +++ b/docs/src-content/guide/app-setup.md @@ -0,0 +1,118 @@ ++++ +date = "2016-06-22T13:22:33+02:00" +description = "The process of installing or upgrading an app" +draft = true +title = "App Setup and Upgrade" +weight = 3 ++++ + +[App Types]: /ref/app-types +[App Version]: /ref/app-properties/#Version +[App Dependencies]: /ref/app-properties/#Dependencies +[App ArchiveTyp]: /ref/app-properties/#ArchiveTyp +[App SetupTestFile]: /ref/app-properties/#SetupTestFile +[App Automation Directory]: /ref/file-structure/#auto-apps-dir +[Setup Hook]: /ref/file-structure/#config-setup +[Environment Setup Hook]: /ref/file-structure/#config-env +[Custom Extract Script]: /ref/file-structure/#auto-apps-extract +[Custom Setup Script]: /ref/file-structure/#auto-apps-setup +[Custom Environment Setup Script]: /ref/file-structure/#auto-apps-env +[Custom Removal Script]: /ref/file-structure/#auto-apps-remove + +An app in Bench is installed according to its [typ][App Types]. +Default apps are installed by downloading their app resource file/archive +extracting or copying it into the apps target directory. +Meta apps are installed completely via custom scripts or they +just serve as groups for other apps via their [dependencies][App Dependencies]. +Package apps are installed via their package manager. +Custom scripts can extend or override different steps of the setup process. + + +If an app is included in the Bench system, its automation +is implemented as custom scripts and is stored in the [app automation directory][]. +If an app is defined in the custom app library, its automation +is implemented in the hooks for [setup][setup hook] and +[environment setup][environment setup hook]. + +## Meta Apps {#typ-meta} + +Meta apps do not have an app resource, which could be downloaded +and installed, via the install mechanisms Bench provides. +And it can not be installed via a package manager, which is supported by Bench. + +Therefore, all setup steps – given that there are some – +have to be performed by the custom scripts or hooks, respectively +for setup and environment setup. + +TODO + +## Default Apps {#typ-default} +Default apps are programs, which consist of at least one file, +which is executable by Windows. +This can be an `*.exe`, a `*.cmd`, or a `*.bat` file. +A default app has a resource file or archive which can be downloaded via a HTTP(S) URL. +If the app has resource file, usually the resource file itself is the executable. +If the app has a resource archive, the executable can be one of many files. + +### Installation {#typ-default-install} +The installation of a default app is performed by the following steps: + +* Download the resource file or archive if not cached +* **If** the resource is an archive file: + + **If** the [`ArchiveTyp`][App ArchiveTyp] is `auto` or `custom` and + a [custom extract script][] `.extract.ps1` is found: + Run the custom script to extract the archive content. + + **Else if** the [`ArchiveTyp`][App ArchiveTyp] is `auto`: + Select an extractor by the filename extension and extract the archive. + + **Else if** the [`ArchiveTyp`][App ArchiveTyp] is `msi`: + Use _LessMSI_ to extract the archive content. + + **Else if** the [`ArchiveTyp`][App ArchiveTyp] is `inno`: + Use _InnoUnpacker_ to extract the archive content. + + **Else if** the [`ArchiveTyp`][App ArchiveTyp] is `generic`: + Use _7-Zip_ if installed, else use _DotNetZip_ library to extract the archive content. +* **Else** + Copy the resource file to the apps target directory. +* Run the [custom setup script][] `.setup.ps1` if one is found. +* Run the [setup hook script][Setup Hook] if it exists. + If multiple apps are installed in one task, the hook script is only run one at the end. +* Run the [custom environment setup script][] `.env.ps1` if one is found. +* Run the [environment setup hook script][Environment Setup Hook] if it exists. + If multiple apps are installed in one task, the hook script is only run one at the end. + +Before an app can be installed, all of its dependencies must be installed. +This is necessary to allow custom setup scripts of an app +depend on the apps dependencies to be installed. +If an app with dependencies is installed in a task, then the task is automatically +extended to cover all dependencies not installed yet. + +If multiple apps are installed in one task, the steps _download_, _setup_, +and _environment setup_ can be performed consolidated. +Meaning first all _downloads_ are performed, then all _setups_ are performed, +and at last the _environment setup_ for all affected apps is performed. +Multiple apps are always installed in the order their ID is first listed in +the application libraries (first internal, then custom). + +To check if an app is already installed, the [`SetupTestFile`][App SetupTestFile] +is checked for existance. + +### Upgrade {#typ-default-upgrade} +An app can be upgraded, if it is installed, and its [`Version`][App Version] +is empty or set to `latest`. + +The upgrade of an app is performed by [removing](#typ-default-uninstall) the app, +deleting its app resource in case it is cached, and [installing](#typ-default-install) +the app afterwards. + +### Uninstalling {#typ-default-uninstall} +An app can be uninstalled, if it is installed. + +The removal of an app is performed in the following steps: + +* Run the [custom removal script][] `.remove.ps1` if it exists. +* Delete the apps target directory and all of its content. + +## Package Apps {#typ-package} +Package apps are apps, which are managed by some kind of package manager. +Examples are _npm_ for _Node.js_ or _PIP_ for _Python_. + +TODO From 595224a005fb85e6cad434da86169a48e508d9d1 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Thu, 14 Jul 2016 08:33:18 +0200 Subject: [PATCH 33/52] added config property relativeURLs --- docs/config.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/config.toml b/docs/config.toml index 2d1ba945..81b9e28d 100644 --- a/docs/config.toml +++ b/docs/config.toml @@ -5,9 +5,9 @@ author = "Tobias Kiertscher" theme = "blackburn" -# Shown in the side menu copyright = "Content licensed
by Tobias Kiertscher" canonifyurls = true +relativeurls = false paginate = 10 [indexes] @@ -112,4 +112,3 @@ paginate = 10 github = "mastersign" #bitbucket = "*" #stackoverflow = "*" - \ No newline at end of file From bc92965ec341a55f4b17d6f83d5129c981269b9f Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 15 Jul 2016 14:53:53 +0200 Subject: [PATCH 34/52] started adding XML docs --- BenchManager/BenchLib/BenchConfiguration.cs | 57 +++++++++++++++++++++ BenchManager/BenchLib/BenchLib.csproj | 2 + 2 files changed, 59 insertions(+) diff --git a/BenchManager/BenchLib/BenchConfiguration.cs b/BenchManager/BenchLib/BenchConfiguration.cs index c7f9607a..be32c8f8 100644 --- a/BenchManager/BenchLib/BenchConfiguration.cs +++ b/BenchManager/BenchLib/BenchConfiguration.cs @@ -8,22 +8,79 @@ namespace Mastersign.Bench { + /// + /// The merged configuration and app library for a Bench environment. + /// + /// The configuration is merged by loading the following files: + /// + /// + /// + /// default + /// res\config.md + /// + /// + /// custom + /// config\config.md + /// + /// + /// site + /// bench-site.md files (filename can be changed via default/custom config) + /// + /// + /// + /// The app library is merged by loading the following files: + /// + /// + /// + /// default + /// res\apps.md + /// + /// + /// custom + /// config\apps.md + /// + /// + /// public class BenchConfiguration : ResolvingPropertyCollection { private const string AutoDir = @"auto"; private const string ScriptsDir = @"auto\lib"; private const string ConfigFile = @"res\config.md"; + + /// + /// The property group category, which contains app definitions of required apps. + /// public const string DefaultAppCategory = "Required"; private readonly AppIndexFacade appIndexFacade; + /// + /// The absolute path to the root directory of Bench. + /// public string BenchRootDir { get; private set; } + private string siteConfigFileName; // cached to prevent overriding by custom configuration + /// + /// A flag which indicates if the app library was loaded during initialization of the . + /// public bool WithAppIndex { get; private set; } + + /// + /// A flag which indicates if the custom configuration was loaded during initialization of the . + /// public bool WithCustomConfiguration { get; private set; } + + /// + /// A flag which indicates if the site configuration was loaded during the initialization of the . + /// public bool WithSiteConfiguration { get; private set; } + /// + /// Initializes a new instance of + /// loading all configuration and app library files. + /// + /// The absolute path to the root directory of Bench. public BenchConfiguration(string benchRootDir) : this(benchRootDir, true, true, true) { diff --git a/BenchManager/BenchLib/BenchLib.csproj b/BenchManager/BenchLib/BenchLib.csproj index 3944cb5a..43e960cd 100644 --- a/BenchManager/BenchLib/BenchLib.csproj +++ b/BenchManager/BenchLib/BenchLib.csproj @@ -25,6 +25,7 @@ prompt 4 false + bin\Debug\BenchLib.xml pdbonly @@ -35,6 +36,7 @@ 4 false false + bin\Release\BenchLib.xml From f003b5c629e42c0fac4e2d8d4c540430254e31b2 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 15 Jul 2016 14:54:13 +0200 Subject: [PATCH 35/52] started implementing XML docs to Markdown --- build/build-clr-docs.ps1 | 93 +++++++++++++++++++++++++++++++++ build/helper.xslt | 66 +++++++++++++++++++++++ build/xml-doc-to-md-member.xslt | 27 ++++++++++ build/xml-doc-to-md-type.xslt | 25 +++++++++ build/xml-doc-to-md.xslt | 51 ++++++++++++++++++ build/xml-doc-types.txt | 2 + 6 files changed, 264 insertions(+) create mode 100644 build/build-clr-docs.ps1 create mode 100644 build/helper.xslt create mode 100644 build/xml-doc-to-md-member.xslt create mode 100644 build/xml-doc-to-md-type.xslt create mode 100644 build/xml-doc-to-md.xslt create mode 100644 build/xml-doc-types.txt diff --git a/build/build-clr-docs.ps1 b/build/build-clr-docs.ps1 new file mode 100644 index 00000000..c56fde17 --- /dev/null +++ b/build/build-clr-docs.ps1 @@ -0,0 +1,93 @@ +param ( + $sourceFile = $(Resolve-Path "$myDir\..\BenchManager\BenchLib\bin\Debug\BenchLib.xml"), + $typesFile = $(Resolve-Path "$myDir\xml-doc-types.txt"), + $targetDir = $(Resolve-Path "$myDir\..\tmp\clr-docs") +) + +Set-Alias new New-Object +$myDir = [IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition) + +$typeStyleFile = Resolve-Path "$myDir\xml-doc-to-md-type.xslt" +$memberStyleFile = Resolve-Path "$myDir\xml-doc-to-md-member.xslt" + +$typeStyle = new System.Xml.Xsl.XslCompiledTransform +$typeStyle.Load([string]$typeStyleFile) +$memberStyle = new System.Xml.Xsl.XslCompiledTransform +$memberStyle.Load([string]$memberStyleFile) + +$source = new System.Xml.XmlDocument +$source.Load([string]$sourceFile) + +function member() +{ + $source.SelectNodes("/doc/members/member") +} + +function type-member($typeName) +{ + member | ? { $_.name -like "T:${typeName}" } +} + +function field-member($typeName) +{ + member | ? { $_.name -like "F:${typeName}.*" } +} + +function event-member($typeName) +{ + member | ? { $_.name -like "E:${typeName}.*" } +} + +function property-member($typeName) +{ + member | ? { $_.name -like "P:${typeName}.*" } +} + +function method-member($typeName) +{ + member | ? { $_.name -like "M:${typeName}.*" } +} + +function transform($style, [System.Xml.XmlElement]$m) +{ + $w = new System.IO.StringWriter + $sr = new System.IO.StringReader ("" + [string]$m.OuterXml + "") + $xr = [System.Xml.XmlReader]::Create($sr) + $xmlArgs = new System.Xml.Xsl.XsltArgumentList + try + { + $style.Transform($xr, $xmlArgs, $w) + } + catch + { + Write-Warning $_.Exception.Message + } + $xr.Close() + $sr.Close() + return $w.ToString() +} + +$types = Get-Content $typesFile + +foreach ($t in $types) +{ + $tm = type-member $t + + $out = [IO.File]::OpenWrite("$targetDir\${t}.md") + $writer = new System.IO.StreamWriter($out, (new System.Text.UTF8Encoding ($false))) + + $writer.WriteLine((transform $typeStyle $tm)) + [array]$methods = property-member $t + if ($methods) + { + $writer.WriteLine("## Methods {#methods}") + foreach ($m in $methods) + { + $writer.WriteLine("### " + $m.name) + $writer.WriteLine((transform $memberStyle $m)) + } + } + + $writer.Close() + $out.Close() +} diff --git a/build/helper.xslt b/build/helper.xslt new file mode 100644 index 00000000..bdc81117 --- /dev/null +++ b/build/helper.xslt @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build/xml-doc-to-md-member.xslt b/build/xml-doc-to-md-member.xslt new file mode 100644 index 00000000..4aa55dca --- /dev/null +++ b/build/xml-doc-to-md-member.xslt @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + diff --git a/build/xml-doc-to-md-type.xslt b/build/xml-doc-to-md-type.xslt new file mode 100644 index 00000000..6ee513b8 --- /dev/null +++ b/build/xml-doc-to-md-type.xslt @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + diff --git a/build/xml-doc-to-md.xslt b/build/xml-doc-to-md.xslt new file mode 100644 index 00000000..1d08cc28 --- /dev/null +++ b/build/xml-doc-to-md.xslt @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/build/xml-doc-types.txt b/build/xml-doc-types.txt new file mode 100644 index 00000000..0349e256 --- /dev/null +++ b/build/xml-doc-types.txt @@ -0,0 +1,2 @@ +Mastersign.Bench.BenchConfiguration +Mastersign.Bench.ActivationFile From 8401b841870209aeb438b16a406f8ad17ec801b5 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 16 Jul 2016 13:32:25 +0200 Subject: [PATCH 36/52] added more XML doc strings --- BenchManager/BenchLib/AppIndexFacade.cs | 7 +++++++ BenchManager/BenchLib/BenchConfiguration.cs | 23 +++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/BenchManager/BenchLib/AppIndexFacade.cs b/BenchManager/BenchLib/AppIndexFacade.cs index 4f436a6e..8e438c67 100644 --- a/BenchManager/BenchLib/AppIndexFacade.cs +++ b/BenchManager/BenchLib/AppIndexFacade.cs @@ -5,6 +5,9 @@ namespace Mastersign.Bench { + /// + /// A collection of Bench apps. + /// public class AppIndexFacade : IEnumerable { private readonly IConfiguration AppIndex; @@ -22,6 +25,10 @@ private AppFacade GetAppFacade(string appName) return app; } + /// + /// Initializes a new instance of . + /// + /// An instance of holding the configuration of Bench apps. public AppIndexFacade(IConfiguration appIndex) { AppIndex = appIndex; diff --git a/BenchManager/BenchLib/BenchConfiguration.cs b/BenchManager/BenchLib/BenchConfiguration.cs index be32c8f8..4f82a204 100644 --- a/BenchManager/BenchLib/BenchConfiguration.cs +++ b/BenchManager/BenchLib/BenchConfiguration.cs @@ -86,6 +86,14 @@ public BenchConfiguration(string benchRootDir) { } + /// + /// Initializes a new instance of + /// loading the specified set of configuration and app library files. + /// + /// The absolute path to the root directory of Bench. + /// A flag to control if app library files are going to be loaded. + /// A flag to control if custom configuration files are going to be loaded. + /// A flag to control if site configuration files are going to be loaded. public BenchConfiguration(string benchRootDir, bool loadAppIndex, bool loadCustomConfiguration, bool loadSiteConfiguration) { BenchRootDir = benchRootDir; @@ -197,6 +205,11 @@ private static string[] FindSiteConfigFiles(string benchRootDir, string fileName return results.ToArray(); } + /// + /// Search for all existing site configuration files in the root directory of Bench + /// and its parents. + /// + /// An array with the absolute paths of the found site configuration files. public string[] FindSiteConfigFiles() { return FindSiteConfigFiles(BenchRootDir, siteConfigFileName); @@ -296,8 +309,18 @@ private string GetBaseForPathProperty(string app, string property) } } + /// + /// The merged definition of the Bench apps as a . + /// public AppIndexFacade Apps { get { return appIndexFacade; } } + /// + /// Reloads the set of configuration files, specified during construction. + /// Call this method to create an updated instance of + /// after one of the configuration files was changed. + /// + /// A new instance of , + /// which has loaded the same set of configuration files as this instance. public BenchConfiguration Reload() { return new BenchConfiguration(BenchRootDir, From a8c18941dba8e41f3721fab36657ec9c8682e409 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 16 Jul 2016 13:32:43 +0200 Subject: [PATCH 37/52] fix parameter set --- build/build-clr-docs.ps1 | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/build/build-clr-docs.ps1 b/build/build-clr-docs.ps1 index c56fde17..c634d9de 100644 --- a/build/build-clr-docs.ps1 +++ b/build/build-clr-docs.ps1 @@ -1,9 +1,25 @@ param ( - $sourceFile = $(Resolve-Path "$myDir\..\BenchManager\BenchLib\bin\Debug\BenchLib.xml"), - $typesFile = $(Resolve-Path "$myDir\xml-doc-types.txt"), - $targetDir = $(Resolve-Path "$myDir\..\tmp\clr-docs") + $sourceFile = $(Resolve-Path "$([IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition))\..\BenchManager\BenchLib\bin\Debug\BenchLib.xml"), + $typesFile = $(Resolve-Path "$([IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition))\xml-doc-types.txt"), + $targetDir = $(Resolve-Path "$([IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition))\..\tmp\clr-docs") ) +if (!$sourceFile -or !(Test-Path $sourceFile -PathType Leaf)) +{ + Write-Error "Could not find the source file." + return +} +if (!$typesFile -or !(Test-Path $typesFile -PathType Leaf)) +{ + Write-Error "Could not find the list of types to consider." + return +} +if (!$targetDir -or !(Test-Path $targetDir -PathType Container)) +{ + Write-Error "Could not find the target directory." + return +} + Set-Alias new New-Object $myDir = [IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition) From 5b055106527efdc4512bd6419cc7e73b3cf8209d Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 16 Jul 2016 13:33:28 +0200 Subject: [PATCH 38/52] remove the necessity for helper.xslt --- build/xml-doc-to-md.xslt | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/build/xml-doc-to-md.xslt b/build/xml-doc-to-md.xslt index 1d08cc28..9c2a507b 100644 --- a/build/xml-doc-to-md.xslt +++ b/build/xml-doc-to-md.xslt @@ -2,7 +2,11 @@ - + -