├── .gitignore ├── 01.Rmd ├── 02.Rmd ├── 03.Rmd ├── Dockerfile ├── Makefile ├── _bookdown.yml ├── docker-compose.yml ├── docs ├── .nojekyll ├── _main_files │ └── figure-html │ │ ├── unnamed-chunk-10-1.png │ │ ├── unnamed-chunk-11-1.png │ │ ├── unnamed-chunk-13-1.png │ │ ├── unnamed-chunk-18-1.png │ │ ├── unnamed-chunk-22-1.png │ │ ├── unnamed-chunk-23-1.png │ │ ├── unnamed-chunk-24-1.png │ │ ├── unnamed-chunk-26-1.png │ │ ├── unnamed-chunk-28-1.png │ │ ├── unnamed-chunk-32-1.png │ │ ├── unnamed-chunk-37-1.png │ │ ├── unnamed-chunk-40-1.png │ │ ├── unnamed-chunk-43-1.png │ │ ├── unnamed-chunk-45-1.png │ │ ├── unnamed-chunk-47-1.png │ │ ├── unnamed-chunk-48-1.png │ │ ├── unnamed-chunk-5-1.png │ │ ├── unnamed-chunk-51-1.png │ │ ├── unnamed-chunk-52-1.png │ │ ├── unnamed-chunk-55-1.png │ │ ├── unnamed-chunk-56-1.png │ │ ├── unnamed-chunk-57-1.png │ │ ├── unnamed-chunk-6-1.png │ │ ├── unnamed-chunk-61-1.png │ │ └── unnamed-chunk-63-1.png ├── index.html ├── libs │ ├── gitbook-2.6.7 │ │ ├── css │ │ │ ├── fontawesome │ │ │ │ └── fontawesome-webfont.ttf │ │ │ ├── plugin-bookdown.css │ │ │ ├── plugin-fontsettings.css │ │ │ ├── plugin-highlight.css │ │ │ ├── plugin-search.css │ │ │ ├── plugin-table.css │ │ │ └── style.css │ │ └── js │ │ │ ├── app.min.js │ │ │ ├── jquery.highlight.js │ │ │ ├── lunr.js │ │ │ ├── plugin-bookdown.js │ │ │ ├── plugin-fontsettings.js │ │ │ ├── plugin-search.js │ │ │ └── plugin-sharing.js │ └── jquery-2.2.3 │ │ └── jquery.min.js ├── search_index.json ├── section-1.html ├── section-2.html └── section-3.html └── index.Rmd /.gitignore: -------------------------------------------------------------------------------- 1 | .Rhistory 2 | .RData 3 | .Rproj.user 4 | /_bookdown_files/ 5 | /*.jpg 6 | -------------------------------------------------------------------------------- /01.Rmd: -------------------------------------------------------------------------------- 1 | # インストール 2 | 3 | 実行にはいろいろ必要です。(Rでできる、と言いつつRAW画像の読み込みにPythonを使います。) 4 | 5 | - R 6 | - [imager](https://github.com/dahtah/imager) (画像処理ライブラリ) 7 | - [reticulate](https://rstudio.github.io/reticulate/) (RからPython呼ぶやつ) 8 | - [tidyverse](https://www.tidyverse.org/) (宇宙) 9 | - Python 10 | - [rawpy](https://pypi.org/project/rawpy/) (RAW画像読み込むやつ) 11 | 12 | ## Dockerを使う 13 | 14 | インストールが面倒なものがあるので、[Docker](https://www.docker.com/)を使うのがおすすめです。 15 | 16 | 全てインストール済みのDocker imageを用意しました。 17 | 18 | https://hub.docker.com/r/igjit/r-raw-processing 19 | 20 | docker pullして実行 21 | 22 | ```sh 23 | docker pull igjit/r-raw-processing 24 | docker run --rm -p 8787:8787 -e PASSWORD=xxxx igjit/r-raw-processing 25 | ``` 26 | 27 | (`xxxx`は適宜変更してください。) 28 | 29 | ブラウザで http://localhost:8787/ にアクセスして、Username: `rstudio`、 Password: *(設定したもの)* を入力するとRStudioが使えるはずです。 30 | -------------------------------------------------------------------------------- /02.Rmd: -------------------------------------------------------------------------------- 1 | # 基本的な処理 2 | 3 | ## 準備 4 | 5 | ### RAW画像の準備 6 | 7 | RStudioのTerminalタブで以下を実行して、RAW画像ファイルをダウンロードします。 8 | 9 | ```sh 10 | wget https://github.com/moizumi99/camera_raw_processing/raw/master/chart.jpg 11 | ``` 12 | 13 | ### RAW画像の読み込み 14 | 15 | 必要なパッケージを読み込み 16 | 17 | ```{r setup, message=FALSE} 18 | library(reticulate) 19 | library(imager) 20 | ``` 21 | 22 | `reticulate::import`でPythonの`rawpy`モジュールをインポート 23 | 24 | ```{r} 25 | rawpy <- import("rawpy") 26 | ``` 27 | 28 | 画像の読み込み 29 | 30 | ```{r} 31 | raw_file <- "chart.jpg" 32 | raw <- rawpy$imread(raw_file) 33 | ``` 34 | 35 | 画像データをRの行列に読み込み 36 | 37 | ```{r} 38 | raw_array <- raw$raw_image 39 | ``` 40 | 41 | サイズの確認 42 | 43 | ```{r} 44 | raw_array %>% dim 45 | ``` 46 | 47 | 画像を表示 48 | 49 | ```{r cache=TRUE} 50 | raw_array %>% t %>% as.cimg %>% plot 51 | ``` 52 | 53 | ## 簡易デモザイク処理 54 | 55 | ### RAW画像の確認 56 | 57 | 拡大表示 58 | 59 | ```{r cache=TRUE} 60 | raw_array %>% t %>% as.cimg %>% 61 | imsub(x %inr% c(2641, 2700), y %inr% c(1341, 1400)) %>% 62 | plot(interpolate = FALSE) 63 | ``` 64 | 65 | RAW画像のBayer配列を確認 66 | 67 | ```{r} 68 | raw$raw_pattern 69 | ``` 70 | 71 | Bayer配列に対応するRGB画像を作リます。 72 | 73 | ```{r} 74 | raw_color <- array(0, c(dim(raw_array), 1, 3)) 75 | raw_color[c(T, F), c(T, F), 1, 3] <- raw_array[c(T, F), c(T, F)] 76 | raw_color[c(T, F), c(F, T), 1, 2] <- raw_array[c(T, F), c(F, T)] 77 | raw_color[c(F, T), c(T, F), 1, 2] <- raw_array[c(F, T), c(T, F)] 78 | raw_color[c(F, T), c(F, T), 1, 1] <- raw_array[c(F, T), c(F, T)] 79 | ``` 80 | 81 | 画像の行と列を入れ替える補助関数 82 | 83 | ```{r} 84 | ta <- function(a) aperm(a, c(2, 1, 3, 4)) 85 | ``` 86 | 87 | 表示 88 | 89 | ```{r cache=TRUE} 90 | raw_color %>% ta %>% as.cimg %>% plot 91 | ``` 92 | 93 | 拡大表示 94 | 95 | ```{r cache=TRUE} 96 | raw_color %>% ta %>% as.cimg %>% 97 | imsub(x %inr% c(2641, 2700), y %inr% c(1341, 1400)) %>% 98 | plot(interpolate = FALSE) 99 | ``` 100 | 101 | ### 簡易デモザイク処理 102 | 103 | 簡易デモザイク処理 104 | 105 | ```{r} 106 | simple_demosaic <- function(raw_array) { 107 | dms_img <- array(0, c(dim(raw_array) / 2, 1, 3)) 108 | dms_img[,, 1, 3] <- raw_array[c(T, F), c(T, F)] 109 | dms_img[,, 1, 2] <- (raw_array[c(T, F), c(F, T)] + raw_array[c(F, T), c(T, F)]) / 2 110 | dms_img[,, 1, 1] <- raw_array[c(F, T), c(F, T)] 111 | dms_img 112 | } 113 | ``` 114 | 115 | デモザイクして表示 116 | 117 | ```{r cache=TRUE} 118 | raw_array %>% simple_demosaic %>% ta %>% as.cimg %>% plot 119 | ``` 120 | 121 | ## ホワイトバランス補正 122 | 123 | ### ホワイトバランス補正処理 124 | 125 | ホワイトバランスのゲインを確認 126 | 127 | ```{r} 128 | raw$camera_whitebalance 129 | ``` 130 | 131 | ホワイトバランス補正処理 132 | 133 | ```{r} 134 | white_balance <- function(raw_array, wb_gain, raw_colors) { 135 | norm <- wb_gain[2] 136 | gain_matrix <- array(0, c(dim(raw_array))) 137 | for (color in 0:3) { 138 | gain_matrix[raw_colors == color] <- wb_gain[color + 1] / norm 139 | } 140 | raw_array * gain_matrix 141 | } 142 | ``` 143 | 144 | ホワイトバランス補正して簡易デモザイク 145 | 146 | ```{r cache=TRUE} 147 | gain <- raw$camera_whitebalance 148 | colors <- raw$raw_colors 149 | dms_img <- white_balance(raw_array, gain, colors) %>% simple_demosaic 150 | ``` 151 | 152 | 画像を0と1の間でノーマライズする補助関数 153 | 154 | ```{r} 155 | normalize <- function(img) { 156 | img <- img / 1024 157 | img[img < 0] <- 0 158 | img[img > 1] <- 1 159 | img 160 | } 161 | ``` 162 | 163 | 表示 164 | 165 | ```{r cache=TRUE} 166 | dms_img %>% normalize %>% ta %>% as.cimg %>% plot 167 | ``` 168 | 169 | ## ブラックレベル補正 170 | 171 | ### ブラックレベル補正処理 172 | 173 | ブラックレベルを確認 174 | 175 | ```{r} 176 | blc <- raw$black_level_per_channel 177 | ``` 178 | 179 | ```{r} 180 | blc 181 | ``` 182 | 183 | ブラックレベル補正処理 184 | 185 | ```{r} 186 | black_level_correction <- function(raw_array, blc, pattern) { 187 | pattern <- pattern + 1 188 | raw_array[c(T, F), c(T, F)] <- raw_array[c(T, F), c(T, F)] - blc[pattern[1, 1]] 189 | raw_array[c(T, F), c(F, T)] <- raw_array[c(T, F), c(F, T)] - blc[pattern[1, 2]] 190 | raw_array[c(F, T), c(T, F)] <- raw_array[c(F, T), c(T, F)] - blc[pattern[2, 1]] 191 | raw_array[c(F, T), c(F, T)] <- raw_array[c(F, T), c(F, T)] - blc[pattern[2, 2]] 192 | raw_array 193 | } 194 | ``` 195 | 196 | 確認 197 | 198 | ```{r cache=TRUE} 199 | dms_img <- raw_array %>% 200 | black_level_correction(blc, raw$raw_pattern) %>% 201 | white_balance(raw$camera_whitebalance, raw$raw_colors) %>% 202 | simple_demosaic 203 | 204 | dms_img %>% normalize %>% ta %>% as.cimg %>% plot 205 | ``` 206 | 207 | ## ガンマ補正 208 | 209 | ### ガンマ補正とは 210 | 211 | ガンマカーブ 212 | 213 | ```{r} 214 | curve(x ^ 2.2, 0, 1) 215 | ``` 216 | 217 | ガンマ補正カーブ 218 | 219 | ```{r} 220 | curve(x ^ (1 / 2.2), 0, 1) 221 | ``` 222 | 223 | ### ガンマ補正処理 224 | 225 | ガンマ補正処理 226 | 227 | ```{r} 228 | gamma_correction <- function(input_img, gamma) { 229 | input_img[input_img < 0] <- 0 230 | input_img[input_img > 1] <- 1 231 | input_img ^ (1 / gamma) 232 | } 233 | ``` 234 | 235 | 確認 236 | 237 | ```{r cache=TRUE} 238 | dms_img %>% normalize %>% gamma_correction(2.2) %>% ta %>% as.cimg %>% plot 239 | ``` 240 | -------------------------------------------------------------------------------- /03.Rmd: -------------------------------------------------------------------------------- 1 | # 重要な処理 2 | 3 | ## 線形補間デモザイク 4 | 5 | ### 簡易デモザイク処理の問題点 6 | 7 | 簡易デモザイク処理を使ったRAW現像 8 | 9 | ```{r cache=TRUE} 10 | raw_array <- raw$raw_image 11 | white_level <- 1024 12 | 13 | wb_raw <- raw_array %>% 14 | black_level_correction(raw$black_level_per_channel, raw$raw_pattern) %>% 15 | white_balance(raw$camera_whitebalance, raw$raw_colors) 16 | dms_img <- wb_raw %>% 17 | simple_demosaic %>% 18 | `/`(white_level) 19 | gmm_img <- gamma_correction(dms_img, 2.2) 20 | ``` 21 | 22 | 表示 23 | 24 | ```{r cache=TRUE} 25 | gmm_img %>% ta %>% as.cimg %>% plot 26 | ``` 27 | 28 | 現像後のサイズ 29 | 30 | ```{r} 31 | dim(gmm_img) %>% head(2) 32 | ``` 33 | 34 | RAWデータのサイズ 35 | 36 | ```{r} 37 | dim(raw_array) 38 | ``` 39 | 40 | JPEG画像の読み込み 41 | 42 | ```{r} 43 | jpg_img <- imager::load.image(raw_file) 44 | ``` 45 | 46 | 拡大して比較 47 | 48 | ```{r cache=TRUE} 49 | x1 <- 836 50 | y1 <- 741 51 | dx1 <- 100 52 | dy1 <- 100 53 | 54 | par(mfrow = c(1, 2)) 55 | gmm_img %>% ta %>% as.cimg %>% 56 | imsub(x %inr% c(x1, x1 + dx1), y %inr% c(y1, y1 + dy1)) %>% 57 | plot(interpolate = FALSE, main = "簡易デモザイク結果") 58 | jpg_img %>% 59 | imsub(x %inr% (c(x1, x1 + dx1) * 2), y %inr% (c(y1, y1 + dy1) * 2)) %>% 60 | plot(interpolate = FALSE, main = "JPEG画像") 61 | ``` 62 | 63 | ### 線形補完法 64 | 65 | 線形補間デモザイク 66 | 67 | ```{r} 68 | demosaic <- function(raw_array, raw_colors, pattern) { 69 | dms_img <- array(0, c(dim(raw_array), 1, 3)) 70 | 71 | g <- raw_array 72 | g[raw_colors %in% c(0, 2)] <- 0 73 | g_filter <- array(c(0, 1, 0, 74 | 1, 4, 1, 75 | 0, 1, 0) / 4, 76 | c(3, 3, 1, 1)) 77 | G(dms_img) <- convolve(as.cimg(g), g_filter) 78 | 79 | r <- raw_array 80 | r[raw_colors != 0] <- 0 81 | r_filter <- array(c(1/4, 1/2, 1/4, 82 | 1/2, 1, 1/2, 83 | 1/4, 1/2, 1/4), 84 | c(3, 3, 1, 1)) 85 | R(dms_img) <- convolve(as.cimg(r), r_filter) 86 | 87 | b <- raw_array 88 | b[raw_colors != 2] <- 0 89 | # 青のフィルターは赤と共通 90 | B(dms_img) <- convolve(as.cimg(b), r_filter) 91 | 92 | dms_img 93 | } 94 | ``` 95 | 96 | デモザイク処理 97 | 98 | ```{r cache=TRUE} 99 | dms_full_img <- wb_raw %>% 100 | demosaic(raw$raw_colors, raw$raw_pattern) 101 | ``` 102 | 103 | サイズを確認 104 | 105 | ```{r} 106 | dms_full_img %>% dim %>% head(2) 107 | ``` 108 | 109 | ガンマ補正処理 110 | 111 | ```{r cache=TRUE} 112 | gmm_full_img <- gamma_correction(dms_full_img / white_level, 2.2) 113 | ``` 114 | 115 | 比較 116 | 117 | ```{r cache=TRUE} 118 | par(mfrow = c(1, 2)) 119 | gmm_img %>% ta %>% as.cimg %>% 120 | imsub(x %inr% c(x1, x1 + dx1), y %inr% c(y1, y1 + dy1)) %>% 121 | plot(interpolate = FALSE, main = "簡易デモザイク") 122 | gmm_full_img %>% ta %>% as.cimg %>% 123 | imsub(x %inr% (c(x1, x1 + dx1) * 2), y %inr% (c(y1, y1 + dy1) * 2)) %>% 124 | plot(interpolate = FALSE, main = "線形補間デモザイク") 125 | ``` 126 | 127 | ## 欠陥画素補正 128 | 129 | *TODO* 130 | 131 | ## カラーマトリクス補正 132 | 133 | カラーマトリクス (CCM: Color Correction Matrix) 134 | 135 | ```{r} 136 | color_matrix <- matrix(c(6022, -2314, 394, 137 | -936, 4728, 310, 138 | 300, -4324, 8126), 139 | 3, 3, byrow = TRUE) / 4096 140 | ``` 141 | 142 | カラーマトリクス補正処理 143 | 144 | ```{r} 145 | color_correction_matrix <- function(rgb_array, color_matrix) { 146 | ccm_img <- array(0, dim(rgb_array)) 147 | for (col in 1:3) { 148 | ccm_img[,, 1, col] <- 149 | color_matrix[col, 1] * R(rgb_array) + 150 | color_matrix[col, 2] * G(rgb_array) + 151 | color_matrix[col, 3] * B(rgb_array) 152 | } 153 | ccm_img 154 | } 155 | ``` 156 | 157 | 比較 158 | 159 | ```{r cache=TRUE} 160 | par(mfrow = c(1, 2)) 161 | gmm_full_img %>% ta %>% as.cimg %>% 162 | plot(main = "CCM補正なし") 163 | dms_full_img %>% 164 | color_correction_matrix(color_matrix) %>% 165 | `/`(white_level) %>% 166 | gamma_correction(2.2) %>% 167 | ta %>% as.cimg %>% plot(main = "CCM補正あり") 168 | ``` 169 | 170 | ## シェーディング補正 171 | 172 | ### レンズシェーディングの確認 173 | 174 | RAW画像の読み込み 175 | 176 | ```{r} 177 | raw_file <- "flat.jpg" 178 | raw <- rawpy$imread(raw_file) 179 | raw_array <- raw$raw_image 180 | ``` 181 | 182 | RAW現像処理 183 | 184 | ```{r cache=TRUE} 185 | blc_raw <- raw_array %>% 186 | black_level_correction(raw$black_level_per_channel, raw$raw_pattern) 187 | original_img <- blc_raw %>% 188 | white_balance(raw$camera_whitebalance, raw$raw_colors) %>% 189 | demosaic(raw$raw_colors, raw$raw_pattern) %>% 190 | color_correction_matrix(color_matrix) %>% 191 | `/`(white_level) %>% 192 | gamma_correction(2.2) 193 | ``` 194 | 195 | 画像表示 196 | 197 | ```{r cache=TRUE} 198 | original_img %>% ta %>% as.cimg %>% plot 199 | ``` 200 | 201 | 明るさの横方向の変化 202 | 203 | ```{r message=FALSE} 204 | library(tidyverse) 205 | 206 | w <- ncol(raw_array) 207 | h <- nrow(raw_array) 208 | center_y <- h / 2 209 | center_x <- w / 2 210 | y <- center_y - 16 211 | 212 | horizontal_shading_profile <- function(img, w, y) { 213 | seq(1, w - 32, 32) %>% 214 | map_dfr(function(x) list(r = mean(img[y:(y + 32), x:(x + 32), 1, 1]), 215 | g = mean(img[y:(y + 32), x:(x + 32), 1, 2]), 216 | b = mean(img[y:(y + 32), x:(x + 32), 1, 3]))) %>% 217 | map_dfr(~ . / max(.)) %>% 218 | mutate(pos = 1:n()) 219 | } 220 | ``` 221 | 222 | ```{r cache=TRUE} 223 | shading_profile <- horizontal_shading_profile(original_img, w, y) 224 | 225 | ggplot(gather(shading_profile, "color", "value", -pos), aes(x = pos, y = value)) + 226 | geom_line(aes(color = color)) + 227 | ylim(0, 1) + 228 | scale_color_manual(values = c(r = "red", g = "green", b = "blue")) 229 | ``` 230 | 231 | ### レンズシェーディングのモデル化 232 | 233 | ```{r cache=TRUE} 234 | value_df <- map_dfr(seq(1, h - 32, 32), function(y) { 235 | map_dfr(seq(1, w - 32, 32), function(x) { 236 | xx <- x + 16 237 | yy <- y + 16 238 | list( 239 | xx = xx, 240 | yy = yy, 241 | radial = (yy - center_y) * (yy - center_y) + (xx - center_x) * (xx - center_x), 242 | b = mean(blc_raw[seq(y, y + 32, 2), seq(x, x + 32, 2)]), 243 | g1 = mean(blc_raw[seq(y, y + 32, 2), seq(x + 1, x + 32, 2)]), 244 | g2 = mean(blc_raw[seq(y + 1, y + 32, 2), seq(x, x + 32, 2)]), 245 | r = mean(blc_raw[seq(y + 1, y + 32, 2), seq(x + 1, x + 32, 2)])) 246 | }) 247 | }) 248 | ``` 249 | 250 | 最大値でノーマライズしてグラフにして確認 251 | 252 | ```{r cache=TRUE} 253 | norm_value_df <- value_df %>% 254 | transmute(radial, 255 | b = b / max(b), 256 | g1 = g1 / max(g1), 257 | g2 = g2 / max(g2), 258 | r = r / max(r)) 259 | 260 | colors <- c(r = "red", g1 = "green", g2 = "green", b = "blue") 261 | 262 | ggplot(gather(norm_value_df, "color", "value", -radial), aes(x = radial, y = value)) + 263 | geom_point(aes(color = color)) + 264 | ylim(0, 1) + 265 | scale_color_manual(values = colors) 266 | ``` 267 | 268 | 逆数のグラフ 269 | 270 | ```{r cache=TRUE} 271 | inv_norm_value_df <- norm_value_df %>% 272 | select(-radial) %>% 273 | map_dfc(~ 1 / .) %>% 274 | add_column(radial = norm_value_df$radial, .before = TRUE) 275 | 276 | ggplot(gather(inv_norm_value_df, "color", "value", -radial), aes(x = radial, y = value)) + 277 | geom_point(aes(color = color)) + 278 | scale_color_manual(values = colors) 279 | ``` 280 | 281 | 1次式で近似 282 | 283 | ```{r} 284 | models <- colnames(inv_norm_value_df)[-1] %>% 285 | paste("~ radial") %>% 286 | map(~ lm(as.formula(.), inv_norm_value_df)) 287 | 288 | model_df <- models %>% 289 | map_dfr(~ as.list(.$coefficients)) %>% 290 | transmute(color = colnames(inv_norm_value_df)[-1], intercept = `(Intercept)`, slope = radial) 291 | ``` 292 | 293 | 値を確認 294 | 295 | ```{r} 296 | model_df 297 | ``` 298 | 299 | プロット 300 | 301 | ```{r} 302 | ggplot(model_df) + 303 | geom_abline(aes(intercept = intercept, slope = slope, color = color)) + 304 | xlim(0, 4e6) + 305 | ylim(0, 6) + 306 | scale_color_manual(values = colors) 307 | ``` 308 | 309 | ### レンズシェーディング補正 310 | 311 | レンズシェーディング補正前 (ブラックレベル補正のみ) 312 | 313 | ```{r cache=TRUE} 314 | blc_raw %>% t %>% as.cimg %>% plot 315 | ``` 316 | 317 | 各画素に掛け合わせるゲインを計算 318 | 319 | ```{r cache=TRUE} 320 | gain_map <- array(0, dim(raw_array)) 321 | for (y in seq(1, h, 2)) { 322 | for (x in seq(1, w, 2)) { 323 | r2 <- (y - center_y) ^ 2 + (x - center_x) ^ 2 324 | gain <- model_df$intercept + model_df$slope * r2 325 | gain_map[y, x] <- gain[1] 326 | gain_map[y, x + 1] <- gain[2] 327 | gain_map[y + 1, x] <- gain[3] 328 | gain_map[y + 1, x + 1] <- gain[4] 329 | } 330 | } 331 | ``` 332 | 333 | ゲインをブラックレベル補正した画像に掛け合わせる 334 | 335 | ```{r cache=TRUE} 336 | lsc_raw <- blc_raw * gain_map 337 | ``` 338 | 339 | ```{r cache=TRUE} 340 | lsc_raw %>% normalize %>% t %>% as.cimg %>% plot 341 | ``` 342 | 343 | レンズシェーディング補正後のフルカラー画像 344 | 345 | ```{r cache=TRUE} 346 | shading_img <- lsc_raw %>% 347 | white_balance(raw$camera_whitebalance, raw$raw_colors) %>% 348 | demosaic(raw$raw_colors, raw$raw_pattern) %>% 349 | color_correction_matrix(color_matrix) %>% 350 | `/`(white_level) %>% 351 | gamma_correction(2.2) 352 | shading_img %>% ta %>% as.cimg %>% plot 353 | ``` 354 | 355 | 残っているシェーディング量を測定 356 | 357 | ```{r cache=TRUE} 358 | shading_after <- horizontal_shading_profile(shading_img, w, center_y - 16) 359 | 360 | ggplot(gather(shading_after, "color", "value", -pos), aes(x = pos, y = value)) + 361 | geom_line(aes(color = color)) + 362 | ylim(0, 1) + 363 | scale_color_manual(values = c(r = "red", g = "green", b = "blue")) 364 | ``` 365 | 366 | ### 通常画像への適用 367 | 368 | ```{r} 369 | raw_file <- "chart.jpg" 370 | raw <- rawpy$imread(raw_file) 371 | raw_array <- raw$raw_image 372 | 373 | blc_raw <- raw_array %>% 374 | black_level_correction(raw$black_level_per_channel, raw$raw_pattern) 375 | ``` 376 | 377 | レンズシェーディング補正なし 378 | 379 | ```{r cache=TRUE} 380 | no_shading_img <- blc_raw %>% 381 | white_balance(raw$camera_whitebalance, raw$raw_colors) %>% 382 | demosaic(raw$raw_colors, raw$raw_pattern) %>% 383 | color_correction_matrix(color_matrix) %>% 384 | `/`(white_level) %>% 385 | gamma_correction(2.2) 386 | ``` 387 | 388 | レンズシェーディング補正あり 389 | 390 | ```{r cache=TRUE} 391 | shading_img <- blc_raw %>% 392 | `*`(gain_map) %>% 393 | white_balance(raw$camera_whitebalance, raw$raw_colors) %>% 394 | demosaic(raw$raw_colors, raw$raw_pattern) %>% 395 | color_correction_matrix(color_matrix) %>% 396 | `/`(white_level) %>% 397 | gamma_correction(2.2) 398 | ``` 399 | 400 | 比較 401 | 402 | ```{r cache=TRUE} 403 | par(mfrow = c(1, 2)) 404 | no_shading_img %>% ta %>% as.cimg %>% plot(main = "レンズシェーディング補正なし") 405 | shading_img %>% ta %>% as.cimg %>% plot(main = "レンズシェーディング補正あり") 406 | ``` 407 | 408 | 良さそうなので補正処理を関数にする 409 | 410 | ```{r} 411 | lens_shading_correction <- function(raw_array, coef) { 412 | gain_map <- array(0, dim(raw_array)) 413 | h <- nrow(raw_array) 414 | w <- ncol(raw_array) 415 | center_y <- h / 2 416 | center_x <- w / 2 417 | 418 | x <- 1:w - center_x 419 | y <- 1:h - center_y 420 | r2 <- matrix(y, h, w, byrow = FALSE) ^ 2 + matrix(x, h, w, byrow = TRUE) ^ 2 421 | 422 | gain_map[c(T, F), c(T, F)] <- r2[c(T, F), c(T, F)] * coef[1,]$slope + coef[1,]$intercept 423 | gain_map[c(T, F), c(F, T)] <- r2[c(T, F), c(F, T)] * coef[2,]$slope + coef[2,]$intercept 424 | gain_map[c(F, T), c(T, F)] <- r2[c(F, T), c(T, F)] * coef[3,]$slope + coef[3,]$intercept 425 | gain_map[c(F, T), c(F, T)] <- r2[c(F, T), c(F, T)] * coef[4,]$slope + coef[4,]$intercept 426 | 427 | raw_array * gain_map 428 | } 429 | ``` 430 | 431 | 確認 432 | 433 | ```{r cache=TRUE} 434 | coef <- model_df %>% select(-color) 435 | shading_img2 <- blc_raw %>% 436 | lens_shading_correction(coef) %>% 437 | white_balance(raw$camera_whitebalance, raw$raw_colors) %>% 438 | demosaic(raw$raw_colors, raw$raw_pattern) %>% 439 | color_correction_matrix(color_matrix) %>% 440 | `/`(white_level) %>% 441 | gamma_correction(2.2) 442 | 443 | shading_img2 %>% ta %>% as.cimg %>% plot 444 | ``` 445 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM igjit/r-raw-processing 2 | 3 | RUN apt update && apt install -y \ 4 | fonts-ipaexfont \ 5 | && apt clean \ 6 | && rm -rf /var/lib/apt/lists/* 7 | 8 | RUN install2.r --error \ 9 | bookdown 10 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | USERID = $(shell id -u) 2 | RAWS = chart.jpg flat.jpg 3 | 4 | build: raw 5 | docker-compose run --rm -u $(USERID) r Rscript --vanilla -e 'bookdown::render_book("index.Rmd")' 6 | touch docs/.nojekyll 7 | 8 | raw: $(RAWS) 9 | 10 | %.jpg: 11 | wget https://github.com/moizumi99/camera_raw_processing/raw/master/$@ 12 | 13 | clean: 14 | rm -rf docs/ _bookdown_files/ 15 | 16 | .PHONY: build raw clean 17 | -------------------------------------------------------------------------------- /_bookdown.yml: -------------------------------------------------------------------------------- 1 | output_dir: "docs" 2 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | services: 3 | r: 4 | build: 5 | context: . 6 | environment: 7 | - "TZ=Asia/Tokyo" 8 | volumes: 9 | - .:/opt/work 10 | working_dir: /opt/work 11 | command: /usr/local/bin/R 12 | -------------------------------------------------------------------------------- /docs/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/.nojekyll -------------------------------------------------------------------------------- /docs/_main_files/figure-html/unnamed-chunk-10-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/_main_files/figure-html/unnamed-chunk-10-1.png -------------------------------------------------------------------------------- /docs/_main_files/figure-html/unnamed-chunk-11-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/_main_files/figure-html/unnamed-chunk-11-1.png -------------------------------------------------------------------------------- /docs/_main_files/figure-html/unnamed-chunk-13-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/_main_files/figure-html/unnamed-chunk-13-1.png -------------------------------------------------------------------------------- /docs/_main_files/figure-html/unnamed-chunk-18-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/_main_files/figure-html/unnamed-chunk-18-1.png -------------------------------------------------------------------------------- /docs/_main_files/figure-html/unnamed-chunk-22-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/_main_files/figure-html/unnamed-chunk-22-1.png -------------------------------------------------------------------------------- /docs/_main_files/figure-html/unnamed-chunk-23-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/_main_files/figure-html/unnamed-chunk-23-1.png -------------------------------------------------------------------------------- /docs/_main_files/figure-html/unnamed-chunk-24-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/_main_files/figure-html/unnamed-chunk-24-1.png -------------------------------------------------------------------------------- /docs/_main_files/figure-html/unnamed-chunk-26-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/_main_files/figure-html/unnamed-chunk-26-1.png -------------------------------------------------------------------------------- /docs/_main_files/figure-html/unnamed-chunk-28-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/_main_files/figure-html/unnamed-chunk-28-1.png -------------------------------------------------------------------------------- /docs/_main_files/figure-html/unnamed-chunk-32-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/_main_files/figure-html/unnamed-chunk-32-1.png -------------------------------------------------------------------------------- /docs/_main_files/figure-html/unnamed-chunk-37-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/_main_files/figure-html/unnamed-chunk-37-1.png -------------------------------------------------------------------------------- /docs/_main_files/figure-html/unnamed-chunk-40-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/_main_files/figure-html/unnamed-chunk-40-1.png -------------------------------------------------------------------------------- /docs/_main_files/figure-html/unnamed-chunk-43-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/_main_files/figure-html/unnamed-chunk-43-1.png -------------------------------------------------------------------------------- /docs/_main_files/figure-html/unnamed-chunk-45-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/_main_files/figure-html/unnamed-chunk-45-1.png -------------------------------------------------------------------------------- /docs/_main_files/figure-html/unnamed-chunk-47-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/_main_files/figure-html/unnamed-chunk-47-1.png -------------------------------------------------------------------------------- /docs/_main_files/figure-html/unnamed-chunk-48-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/_main_files/figure-html/unnamed-chunk-48-1.png -------------------------------------------------------------------------------- /docs/_main_files/figure-html/unnamed-chunk-5-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/_main_files/figure-html/unnamed-chunk-5-1.png -------------------------------------------------------------------------------- /docs/_main_files/figure-html/unnamed-chunk-51-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/_main_files/figure-html/unnamed-chunk-51-1.png -------------------------------------------------------------------------------- /docs/_main_files/figure-html/unnamed-chunk-52-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/_main_files/figure-html/unnamed-chunk-52-1.png -------------------------------------------------------------------------------- /docs/_main_files/figure-html/unnamed-chunk-55-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/_main_files/figure-html/unnamed-chunk-55-1.png -------------------------------------------------------------------------------- /docs/_main_files/figure-html/unnamed-chunk-56-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/_main_files/figure-html/unnamed-chunk-56-1.png -------------------------------------------------------------------------------- /docs/_main_files/figure-html/unnamed-chunk-57-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/_main_files/figure-html/unnamed-chunk-57-1.png -------------------------------------------------------------------------------- /docs/_main_files/figure-html/unnamed-chunk-6-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/_main_files/figure-html/unnamed-chunk-6-1.png -------------------------------------------------------------------------------- /docs/_main_files/figure-html/unnamed-chunk-61-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/_main_files/figure-html/unnamed-chunk-61-1.png -------------------------------------------------------------------------------- /docs/_main_files/figure-html/unnamed-chunk-63-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/_main_files/figure-html/unnamed-chunk-63-1.png -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Rでできる - ゼロから作るRAW現像 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 |
122 | 123 |
124 | 171 |
172 | 173 |
174 |
175 | 180 | 181 |
182 |
183 | 184 |
185 | 190 |
191 |

はじめに

192 |
193 |

これは何

194 |

Moiz氏の本、PythonとColabでできる - ゼロから作るRAW現像 の内容をRで実装しようとするものです。

195 |
196 |
197 |

ライセンス

198 |

この文章自体のライセンスはTBD

199 |

文章中の現像結果の画像は、Moiz氏が 200 | https://github.com/moizumi99/camera_raw_processing 201 | で公開しているRAW画像の派生物です。

202 | 203 |
204 |
205 |
206 | 207 |
208 |
209 |
210 | 211 | 212 |
213 |
214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 255 | 256 | 257 | 258 | 259 | -------------------------------------------------------------------------------- /docs/libs/gitbook-2.6.7/css/fontawesome/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/igjit/camera-raw-processing-r/8c49302a9795d7de6249a7d80ddd1071881ca8b0/docs/libs/gitbook-2.6.7/css/fontawesome/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /docs/libs/gitbook-2.6.7/css/plugin-bookdown.css: -------------------------------------------------------------------------------- 1 | .book .book-header h1 { 2 | padding-left: 20px; 3 | padding-right: 20px; 4 | } 5 | .book .book-header.fixed { 6 | position: fixed; 7 | right: 0; 8 | top: 0; 9 | left: 0; 10 | border-bottom: 1px solid rgba(0,0,0,.07); 11 | } 12 | span.search-highlight { 13 | background-color: #ffff88; 14 | } 15 | @media (min-width: 600px) { 16 | .book.with-summary .book-header.fixed { 17 | left: 300px; 18 | } 19 | } 20 | @media (max-width: 1240px) { 21 | .book .book-body.fixed { 22 | top: 50px; 23 | } 24 | .book .book-body.fixed .body-inner { 25 | top: auto; 26 | } 27 | } 28 | @media (max-width: 600px) { 29 | .book.with-summary .book-header.fixed { 30 | left: calc(100% - 60px); 31 | min-width: 300px; 32 | } 33 | .book.with-summary .book-body { 34 | transform: none; 35 | left: calc(100% - 60px); 36 | min-width: 300px; 37 | } 38 | .book .book-body.fixed { 39 | top: 0; 40 | } 41 | } 42 | 43 | .book .book-body.fixed .body-inner { 44 | top: 50px; 45 | } 46 | .book .book-body .page-wrapper .page-inner section.normal sub, .book .book-body .page-wrapper .page-inner section.normal sup { 47 | font-size: 85%; 48 | } 49 | 50 | @media print { 51 | .book .book-summary, .book .book-body .book-header, .fa { 52 | display: none !important; 53 | } 54 | .book .book-body.fixed { 55 | left: 0px; 56 | } 57 | .book .book-body,.book .book-body .body-inner, .book.with-summary { 58 | overflow: visible !important; 59 | } 60 | } 61 | .kable_wrapper { 62 | border-spacing: 20px 0; 63 | border-collapse: separate; 64 | border: none; 65 | margin: auto; 66 | } 67 | .kable_wrapper > tbody > tr > td { 68 | vertical-align: top; 69 | } 70 | .book .book-body .page-wrapper .page-inner section.normal table tr.header { 71 | border-top-width: 2px; 72 | } 73 | .book .book-body .page-wrapper .page-inner section.normal table tr:last-child td { 74 | border-bottom-width: 2px; 75 | } 76 | .book .book-body .page-wrapper .page-inner section.normal table td, .book .book-body .page-wrapper .page-inner section.normal table th { 77 | border-left: none; 78 | border-right: none; 79 | } 80 | .book .book-body .page-wrapper .page-inner section.normal table.kable_wrapper > tbody > tr, .book .book-body .page-wrapper .page-inner section.normal table.kable_wrapper > tbody > tr > td { 81 | border-top: none; 82 | } 83 | .book .book-body .page-wrapper .page-inner section.normal table.kable_wrapper > tbody > tr:last-child > td { 84 | border-bottom: none; 85 | } 86 | 87 | div.theorem, div.lemma, div.corollary, div.proposition, div.conjecture { 88 | font-style: italic; 89 | } 90 | span.theorem, span.lemma, span.corollary, span.proposition, span.conjecture { 91 | font-style: normal; 92 | } 93 | div.proof:after { 94 | content: "\25a2"; 95 | float: right; 96 | } 97 | .header-section-number { 98 | padding-right: .5em; 99 | } 100 | -------------------------------------------------------------------------------- /docs/libs/gitbook-2.6.7/css/plugin-fontsettings.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Theme 1 3 | */ 4 | .color-theme-1 .dropdown-menu { 5 | background-color: #111111; 6 | border-color: #7e888b; 7 | } 8 | .color-theme-1 .dropdown-menu .dropdown-caret .caret-inner { 9 | border-bottom: 9px solid #111111; 10 | } 11 | .color-theme-1 .dropdown-menu .buttons { 12 | border-color: #7e888b; 13 | } 14 | .color-theme-1 .dropdown-menu .button { 15 | color: #afa790; 16 | } 17 | .color-theme-1 .dropdown-menu .button:hover { 18 | color: #73553c; 19 | } 20 | /* 21 | * Theme 2 22 | */ 23 | .color-theme-2 .dropdown-menu { 24 | background-color: #2d3143; 25 | border-color: #272a3a; 26 | } 27 | .color-theme-2 .dropdown-menu .dropdown-caret .caret-inner { 28 | border-bottom: 9px solid #2d3143; 29 | } 30 | .color-theme-2 .dropdown-menu .buttons { 31 | border-color: #272a3a; 32 | } 33 | .color-theme-2 .dropdown-menu .button { 34 | color: #62677f; 35 | } 36 | .color-theme-2 .dropdown-menu .button:hover { 37 | color: #f4f4f5; 38 | } 39 | .book .book-header .font-settings .font-enlarge { 40 | line-height: 30px; 41 | font-size: 1.4em; 42 | } 43 | .book .book-header .font-settings .font-reduce { 44 | line-height: 30px; 45 | font-size: 1em; 46 | } 47 | .book.color-theme-1 .book-body { 48 | color: #704214; 49 | background: #f3eacb; 50 | } 51 | .book.color-theme-1 .book-body .page-wrapper .page-inner section { 52 | background: #f3eacb; 53 | } 54 | .book.color-theme-2 .book-body { 55 | color: #bdcadb; 56 | background: #1c1f2b; 57 | } 58 | .book.color-theme-2 .book-body .page-wrapper .page-inner section { 59 | background: #1c1f2b; 60 | } 61 | .book.font-size-0 .book-body .page-inner section { 62 | font-size: 1.2rem; 63 | } 64 | .book.font-size-1 .book-body .page-inner section { 65 | font-size: 1.4rem; 66 | } 67 | .book.font-size-2 .book-body .page-inner section { 68 | font-size: 1.6rem; 69 | } 70 | .book.font-size-3 .book-body .page-inner section { 71 | font-size: 2.2rem; 72 | } 73 | .book.font-size-4 .book-body .page-inner section { 74 | font-size: 4rem; 75 | } 76 | .book.font-family-0 { 77 | font-family: Georgia, serif; 78 | } 79 | .book.font-family-1 { 80 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 81 | } 82 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal { 83 | color: #704214; 84 | } 85 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal a { 86 | color: inherit; 87 | } 88 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h1, 89 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h2, 90 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h3, 91 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h4, 92 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h5, 93 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h6 { 94 | color: inherit; 95 | } 96 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h1, 97 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h2 { 98 | border-color: inherit; 99 | } 100 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h6 { 101 | color: inherit; 102 | } 103 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal hr { 104 | background-color: inherit; 105 | } 106 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal blockquote { 107 | border-color: #c4b29f; 108 | opacity: 0.9; 109 | } 110 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre, 111 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code { 112 | background: #fdf6e3; 113 | color: #657b83; 114 | border-color: #f8df9c; 115 | } 116 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal .highlight { 117 | background-color: inherit; 118 | } 119 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table th, 120 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table td { 121 | border-color: #f5d06c; 122 | } 123 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table tr { 124 | color: inherit; 125 | background-color: #fdf6e3; 126 | border-color: #444444; 127 | } 128 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table tr:nth-child(2n) { 129 | background-color: #fbeecb; 130 | } 131 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal { 132 | color: #bdcadb; 133 | } 134 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal a { 135 | color: #3eb1d0; 136 | } 137 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h1, 138 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h2, 139 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h3, 140 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h4, 141 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h5, 142 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h6 { 143 | color: #fffffa; 144 | } 145 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h1, 146 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h2 { 147 | border-color: #373b4e; 148 | } 149 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h6 { 150 | color: #373b4e; 151 | } 152 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal hr { 153 | background-color: #373b4e; 154 | } 155 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal blockquote { 156 | border-color: #373b4e; 157 | } 158 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre, 159 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code { 160 | color: #9dbed8; 161 | background: #2d3143; 162 | border-color: #2d3143; 163 | } 164 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal .highlight { 165 | background-color: #282a39; 166 | } 167 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table th, 168 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table td { 169 | border-color: #3b3f54; 170 | } 171 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table tr { 172 | color: #b6c2d2; 173 | background-color: #2d3143; 174 | border-color: #3b3f54; 175 | } 176 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table tr:nth-child(2n) { 177 | background-color: #35394b; 178 | } 179 | .book.color-theme-1 .book-header { 180 | color: #afa790; 181 | background: transparent; 182 | } 183 | .book.color-theme-1 .book-header .btn { 184 | color: #afa790; 185 | } 186 | .book.color-theme-1 .book-header .btn:hover { 187 | color: #73553c; 188 | background: none; 189 | } 190 | .book.color-theme-1 .book-header h1 { 191 | color: #704214; 192 | } 193 | .book.color-theme-2 .book-header { 194 | color: #7e888b; 195 | background: transparent; 196 | } 197 | .book.color-theme-2 .book-header .btn { 198 | color: #3b3f54; 199 | } 200 | .book.color-theme-2 .book-header .btn:hover { 201 | color: #fffff5; 202 | background: none; 203 | } 204 | .book.color-theme-2 .book-header h1 { 205 | color: #bdcadb; 206 | } 207 | .book.color-theme-1 .book-body .navigation { 208 | color: #afa790; 209 | } 210 | .book.color-theme-1 .book-body .navigation:hover { 211 | color: #73553c; 212 | } 213 | .book.color-theme-2 .book-body .navigation { 214 | color: #383f52; 215 | } 216 | .book.color-theme-2 .book-body .navigation:hover { 217 | color: #fffff5; 218 | } 219 | /* 220 | * Theme 1 221 | */ 222 | .book.color-theme-1 .book-summary { 223 | color: #afa790; 224 | background: #111111; 225 | border-right: 1px solid rgba(0, 0, 0, 0.07); 226 | } 227 | .book.color-theme-1 .book-summary .book-search { 228 | background: transparent; 229 | } 230 | .book.color-theme-1 .book-summary .book-search input, 231 | .book.color-theme-1 .book-summary .book-search input:focus { 232 | border: 1px solid transparent; 233 | } 234 | .book.color-theme-1 .book-summary ul.summary li.divider { 235 | background: #7e888b; 236 | box-shadow: none; 237 | } 238 | .book.color-theme-1 .book-summary ul.summary li i.fa-check { 239 | color: #33cc33; 240 | } 241 | .book.color-theme-1 .book-summary ul.summary li.done > a { 242 | color: #877f6a; 243 | } 244 | .book.color-theme-1 .book-summary ul.summary li a, 245 | .book.color-theme-1 .book-summary ul.summary li span { 246 | color: #877f6a; 247 | background: transparent; 248 | font-weight: normal; 249 | } 250 | .book.color-theme-1 .book-summary ul.summary li.active > a, 251 | .book.color-theme-1 .book-summary ul.summary li a:hover { 252 | color: #704214; 253 | background: transparent; 254 | font-weight: normal; 255 | } 256 | /* 257 | * Theme 2 258 | */ 259 | .book.color-theme-2 .book-summary { 260 | color: #bcc1d2; 261 | background: #2d3143; 262 | border-right: none; 263 | } 264 | .book.color-theme-2 .book-summary .book-search { 265 | background: transparent; 266 | } 267 | .book.color-theme-2 .book-summary .book-search input, 268 | .book.color-theme-2 .book-summary .book-search input:focus { 269 | border: 1px solid transparent; 270 | } 271 | .book.color-theme-2 .book-summary ul.summary li.divider { 272 | background: #272a3a; 273 | box-shadow: none; 274 | } 275 | .book.color-theme-2 .book-summary ul.summary li i.fa-check { 276 | color: #33cc33; 277 | } 278 | .book.color-theme-2 .book-summary ul.summary li.done > a { 279 | color: #62687f; 280 | } 281 | .book.color-theme-2 .book-summary ul.summary li a, 282 | .book.color-theme-2 .book-summary ul.summary li span { 283 | color: #c1c6d7; 284 | background: transparent; 285 | font-weight: 600; 286 | } 287 | .book.color-theme-2 .book-summary ul.summary li.active > a, 288 | .book.color-theme-2 .book-summary ul.summary li a:hover { 289 | color: #f4f4f5; 290 | background: #252737; 291 | font-weight: 600; 292 | } 293 | -------------------------------------------------------------------------------- /docs/libs/gitbook-2.6.7/css/plugin-highlight.css: -------------------------------------------------------------------------------- 1 | .book .book-body .page-wrapper .page-inner section.normal pre, 2 | .book .book-body .page-wrapper .page-inner section.normal code { 3 | /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ 4 | /* Tomorrow Comment */ 5 | /* Tomorrow Red */ 6 | /* Tomorrow Orange */ 7 | /* Tomorrow Yellow */ 8 | /* Tomorrow Green */ 9 | /* Tomorrow Aqua */ 10 | /* Tomorrow Blue */ 11 | /* Tomorrow Purple */ 12 | } 13 | .book .book-body .page-wrapper .page-inner section.normal pre .hljs-comment, 14 | .book .book-body .page-wrapper .page-inner section.normal code .hljs-comment, 15 | .book .book-body .page-wrapper .page-inner section.normal pre .hljs-title, 16 | .book .book-body .page-wrapper .page-inner section.normal code .hljs-title { 17 | color: #8e908c; 18 | } 19 | .book .book-body .page-wrapper .page-inner section.normal pre .hljs-variable, 20 | .book .book-body .page-wrapper .page-inner section.normal code .hljs-variable, 21 | .book .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute, 22 | .book .book-body .page-wrapper .page-inner section.normal code .hljs-attribute, 23 | .book .book-body .page-wrapper .page-inner section.normal pre .hljs-tag, 24 | .book .book-body .page-wrapper .page-inner section.normal code .hljs-tag, 25 | .book .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp, 26 | .book .book-body .page-wrapper .page-inner section.normal code .hljs-regexp, 27 | .book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-constant, 28 | .book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-constant, 29 | .book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-tag .hljs-title, 30 | .book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-tag .hljs-title, 31 | .book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-pi, 32 | .book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-pi, 33 | .book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-doctype, 34 | .book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-doctype, 35 | .book .book-body .page-wrapper .page-inner section.normal pre .html .hljs-doctype, 36 | .book .book-body .page-wrapper .page-inner section.normal code .html .hljs-doctype, 37 | .book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-id, 38 | .book .book-body .page-wrapper .page-inner section.normal code .css .hljs-id, 39 | .book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-class, 40 | .book .book-body .page-wrapper .page-inner section.normal code .css .hljs-class, 41 | .book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-pseudo, 42 | .book .book-body .page-wrapper .page-inner section.normal code .css .hljs-pseudo { 43 | color: #c82829; 44 | } 45 | .book .book-body .page-wrapper .page-inner section.normal pre .hljs-number, 46 | .book .book-body .page-wrapper .page-inner section.normal code .hljs-number, 47 | .book .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor, 48 | .book .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor, 49 | .book .book-body .page-wrapper .page-inner section.normal pre .hljs-pragma, 50 | .book .book-body .page-wrapper .page-inner section.normal code .hljs-pragma, 51 | .book .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in, 52 | .book .book-body .page-wrapper .page-inner section.normal code .hljs-built_in, 53 | .book .book-body .page-wrapper .page-inner section.normal pre .hljs-literal, 54 | .book .book-body .page-wrapper .page-inner section.normal code .hljs-literal, 55 | .book .book-body .page-wrapper .page-inner section.normal pre .hljs-params, 56 | .book .book-body .page-wrapper .page-inner section.normal code .hljs-params, 57 | .book .book-body .page-wrapper .page-inner section.normal pre .hljs-constant, 58 | .book .book-body .page-wrapper .page-inner section.normal code .hljs-constant { 59 | color: #f5871f; 60 | } 61 | .book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-class .hljs-title, 62 | .book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-class .hljs-title, 63 | .book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-rules .hljs-attribute, 64 | .book .book-body .page-wrapper .page-inner section.normal code .css .hljs-rules .hljs-attribute { 65 | color: #eab700; 66 | } 67 | .book .book-body .page-wrapper .page-inner section.normal pre .hljs-string, 68 | .book .book-body .page-wrapper .page-inner section.normal code .hljs-string, 69 | .book .book-body .page-wrapper .page-inner section.normal pre .hljs-value, 70 | .book .book-body .page-wrapper .page-inner section.normal code .hljs-value, 71 | .book .book-body .page-wrapper .page-inner section.normal pre .hljs-inheritance, 72 | .book .book-body .page-wrapper .page-inner section.normal code .hljs-inheritance, 73 | .book .book-body .page-wrapper .page-inner section.normal pre .hljs-header, 74 | .book .book-body .page-wrapper .page-inner section.normal code .hljs-header, 75 | .book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-symbol, 76 | .book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-symbol, 77 | .book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata, 78 | .book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata { 79 | color: #718c00; 80 | } 81 | .book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-hexcolor, 82 | .book .book-body .page-wrapper .page-inner section.normal code .css .hljs-hexcolor { 83 | color: #3e999f; 84 | } 85 | .book .book-body .page-wrapper .page-inner section.normal pre .hljs-function, 86 | .book .book-body .page-wrapper .page-inner section.normal code .hljs-function, 87 | .book .book-body .page-wrapper .page-inner section.normal pre .python .hljs-decorator, 88 | .book .book-body .page-wrapper .page-inner section.normal code .python .hljs-decorator, 89 | .book .book-body .page-wrapper .page-inner section.normal pre .python .hljs-title, 90 | .book .book-body .page-wrapper .page-inner section.normal code .python .hljs-title, 91 | .book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-function .hljs-title, 92 | .book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-function .hljs-title, 93 | .book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-title .hljs-keyword, 94 | .book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-title .hljs-keyword, 95 | .book .book-body .page-wrapper .page-inner section.normal pre .perl .hljs-sub, 96 | .book .book-body .page-wrapper .page-inner section.normal code .perl .hljs-sub, 97 | .book .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-title, 98 | .book .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-title, 99 | .book .book-body .page-wrapper .page-inner section.normal pre .coffeescript .hljs-title, 100 | .book .book-body .page-wrapper .page-inner section.normal code .coffeescript .hljs-title { 101 | color: #4271ae; 102 | } 103 | .book .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword, 104 | .book .book-body .page-wrapper .page-inner section.normal code .hljs-keyword, 105 | .book .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-function, 106 | .book .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-function { 107 | color: #8959a8; 108 | } 109 | .book .book-body .page-wrapper .page-inner section.normal pre .hljs, 110 | .book .book-body .page-wrapper .page-inner section.normal code .hljs { 111 | display: block; 112 | background: white; 113 | color: #4d4d4c; 114 | padding: 0.5em; 115 | } 116 | .book .book-body .page-wrapper .page-inner section.normal pre .coffeescript .javascript, 117 | .book .book-body .page-wrapper .page-inner section.normal code .coffeescript .javascript, 118 | .book .book-body .page-wrapper .page-inner section.normal pre .javascript .xml, 119 | .book .book-body .page-wrapper .page-inner section.normal code .javascript .xml, 120 | .book .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula, 121 | .book .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula, 122 | .book .book-body .page-wrapper .page-inner section.normal pre .xml .javascript, 123 | .book .book-body .page-wrapper .page-inner section.normal code .xml .javascript, 124 | .book .book-body .page-wrapper .page-inner section.normal pre .xml .vbscript, 125 | .book .book-body .page-wrapper .page-inner section.normal code .xml .vbscript, 126 | .book .book-body .page-wrapper .page-inner section.normal pre .xml .css, 127 | .book .book-body .page-wrapper .page-inner section.normal code .xml .css, 128 | .book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata, 129 | .book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata { 130 | opacity: 0.5; 131 | } 132 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre, 133 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code { 134 | /* 135 | 136 | Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull 137 | 138 | */ 139 | /* Solarized Green */ 140 | /* Solarized Cyan */ 141 | /* Solarized Blue */ 142 | /* Solarized Yellow */ 143 | /* Solarized Orange */ 144 | /* Solarized Red */ 145 | /* Solarized Violet */ 146 | } 147 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs, 148 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs { 149 | display: block; 150 | padding: 0.5em; 151 | background: #fdf6e3; 152 | color: #657b83; 153 | } 154 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-comment, 155 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-comment, 156 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-template_comment, 157 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-template_comment, 158 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .diff .hljs-header, 159 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .diff .hljs-header, 160 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-doctype, 161 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-doctype, 162 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-pi, 163 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-pi, 164 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .lisp .hljs-string, 165 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .lisp .hljs-string, 166 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-javadoc, 167 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-javadoc { 168 | color: #93a1a1; 169 | } 170 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword, 171 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-keyword, 172 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-winutils, 173 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-winutils, 174 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .method, 175 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .method, 176 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-addition, 177 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-addition, 178 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-tag, 179 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .css .hljs-tag, 180 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-request, 181 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-request, 182 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-status, 183 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-status, 184 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .nginx .hljs-title, 185 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .nginx .hljs-title { 186 | color: #859900; 187 | } 188 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-number, 189 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-number, 190 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-command, 191 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-command, 192 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-string, 193 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-string, 194 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-tag .hljs-value, 195 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-tag .hljs-value, 196 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-rules .hljs-value, 197 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-rules .hljs-value, 198 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-phpdoc, 199 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-phpdoc, 200 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula, 201 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula, 202 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp, 203 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-regexp, 204 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-hexcolor, 205 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-hexcolor, 206 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link_url, 207 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link_url { 208 | color: #2aa198; 209 | } 210 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-title, 211 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-title, 212 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-localvars, 213 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-localvars, 214 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-chunk, 215 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-chunk, 216 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-decorator, 217 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-decorator, 218 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in, 219 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-built_in, 220 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-identifier, 221 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-identifier, 222 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .vhdl .hljs-literal, 223 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .vhdl .hljs-literal, 224 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-id, 225 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-id, 226 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-function, 227 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .css .hljs-function { 228 | color: #268bd2; 229 | } 230 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute, 231 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-attribute, 232 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-variable, 233 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-variable, 234 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .lisp .hljs-body, 235 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .lisp .hljs-body, 236 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .smalltalk .hljs-number, 237 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .smalltalk .hljs-number, 238 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-constant, 239 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-constant, 240 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-class .hljs-title, 241 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-class .hljs-title, 242 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-parent, 243 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-parent, 244 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .haskell .hljs-type, 245 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .haskell .hljs-type, 246 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link_reference, 247 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link_reference { 248 | color: #b58900; 249 | } 250 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor, 251 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor, 252 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor .hljs-keyword, 253 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor .hljs-keyword, 254 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-pragma, 255 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-pragma, 256 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-shebang, 257 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-shebang, 258 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-symbol, 259 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-symbol, 260 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-symbol .hljs-string, 261 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-symbol .hljs-string, 262 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .diff .hljs-change, 263 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .diff .hljs-change, 264 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-special, 265 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-special, 266 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-attr_selector, 267 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-attr_selector, 268 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-subst, 269 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-subst, 270 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-cdata, 271 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-cdata, 272 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .clojure .hljs-title, 273 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .clojure .hljs-title, 274 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-pseudo, 275 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .css .hljs-pseudo, 276 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-header, 277 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-header { 278 | color: #cb4b16; 279 | } 280 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-deletion, 281 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-deletion, 282 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-important, 283 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-important { 284 | color: #dc322f; 285 | } 286 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link_label, 287 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link_label { 288 | color: #6c71c4; 289 | } 290 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula, 291 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula { 292 | background: #eee8d5; 293 | } 294 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre, 295 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code { 296 | /* Tomorrow Night Bright Theme */ 297 | /* Original theme - https://github.com/chriskempson/tomorrow-theme */ 298 | /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ 299 | /* Tomorrow Comment */ 300 | /* Tomorrow Red */ 301 | /* Tomorrow Orange */ 302 | /* Tomorrow Yellow */ 303 | /* Tomorrow Green */ 304 | /* Tomorrow Aqua */ 305 | /* Tomorrow Blue */ 306 | /* Tomorrow Purple */ 307 | } 308 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-comment, 309 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-comment, 310 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-title, 311 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-title { 312 | color: #969896; 313 | } 314 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-variable, 315 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-variable, 316 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute, 317 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-attribute, 318 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-tag, 319 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-tag, 320 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp, 321 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-regexp, 322 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-constant, 323 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-constant, 324 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-tag .hljs-title, 325 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-tag .hljs-title, 326 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-pi, 327 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-pi, 328 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-doctype, 329 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-doctype, 330 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .html .hljs-doctype, 331 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .html .hljs-doctype, 332 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-id, 333 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-id, 334 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-class, 335 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-class, 336 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-pseudo, 337 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-pseudo { 338 | color: #d54e53; 339 | } 340 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-number, 341 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-number, 342 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor, 343 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor, 344 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-pragma, 345 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-pragma, 346 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in, 347 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-built_in, 348 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-literal, 349 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-literal, 350 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-params, 351 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-params, 352 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-constant, 353 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-constant { 354 | color: #e78c45; 355 | } 356 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-class .hljs-title, 357 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-class .hljs-title, 358 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-rules .hljs-attribute, 359 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-rules .hljs-attribute { 360 | color: #e7c547; 361 | } 362 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-string, 363 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-string, 364 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-value, 365 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-value, 366 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-inheritance, 367 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-inheritance, 368 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-header, 369 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-header, 370 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-symbol, 371 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-symbol, 372 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata, 373 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata { 374 | color: #b9ca4a; 375 | } 376 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-hexcolor, 377 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-hexcolor { 378 | color: #70c0b1; 379 | } 380 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-function, 381 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-function, 382 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .python .hljs-decorator, 383 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .python .hljs-decorator, 384 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .python .hljs-title, 385 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .python .hljs-title, 386 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-function .hljs-title, 387 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-function .hljs-title, 388 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-title .hljs-keyword, 389 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-title .hljs-keyword, 390 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .perl .hljs-sub, 391 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .perl .hljs-sub, 392 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-title, 393 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-title, 394 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .coffeescript .hljs-title, 395 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .coffeescript .hljs-title { 396 | color: #7aa6da; 397 | } 398 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword, 399 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-keyword, 400 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-function, 401 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-function { 402 | color: #c397d8; 403 | } 404 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs, 405 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs { 406 | display: block; 407 | background: black; 408 | color: #eaeaea; 409 | padding: 0.5em; 410 | } 411 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .coffeescript .javascript, 412 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .coffeescript .javascript, 413 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .javascript .xml, 414 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .javascript .xml, 415 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula, 416 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula, 417 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .javascript, 418 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .javascript, 419 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .vbscript, 420 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .vbscript, 421 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .css, 422 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .css, 423 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata, 424 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata { 425 | opacity: 0.5; 426 | } 427 | -------------------------------------------------------------------------------- /docs/libs/gitbook-2.6.7/css/plugin-search.css: -------------------------------------------------------------------------------- 1 | .book .book-summary .book-search { 2 | padding: 6px; 3 | background: transparent; 4 | position: absolute; 5 | top: -50px; 6 | left: 0px; 7 | right: 0px; 8 | transition: top 0.5s ease; 9 | } 10 | .book .book-summary .book-search input, 11 | .book .book-summary .book-search input:focus, 12 | .book .book-summary .book-search input:hover { 13 | width: 100%; 14 | background: transparent; 15 | border: 1px solid #ccc; 16 | box-shadow: none; 17 | outline: none; 18 | line-height: 22px; 19 | padding: 7px 4px; 20 | color: inherit; 21 | box-sizing: border-box; 22 | } 23 | .book.with-search .book-summary .book-search { 24 | top: 0px; 25 | } 26 | .book.with-search .book-summary ul.summary { 27 | top: 50px; 28 | } 29 | .with-search .summary li[data-level] a[href*=".html#"] { 30 | display: none; 31 | } 32 | -------------------------------------------------------------------------------- /docs/libs/gitbook-2.6.7/css/plugin-table.css: -------------------------------------------------------------------------------- 1 | .book .book-body .page-wrapper .page-inner section.normal table{display:table;width:100%;border-collapse:collapse;border-spacing:0;overflow:auto}.book .book-body .page-wrapper .page-inner section.normal table td,.book .book-body .page-wrapper .page-inner section.normal table th{padding:6px 13px;border:1px solid #ddd}.book .book-body .page-wrapper .page-inner section.normal table tr{background-color:#fff;border-top:1px solid #ccc}.book .book-body .page-wrapper .page-inner section.normal table tr:nth-child(2n){background-color:#f8f8f8}.book .book-body .page-wrapper .page-inner section.normal table th{font-weight:700} 2 | -------------------------------------------------------------------------------- /docs/libs/gitbook-2.6.7/css/style.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v2.1.0 | MIT License | git.io/normalize */img,legend{border:0}*,.fa{-webkit-font-smoothing:antialiased}.fa-ul>li,sub,sup{position:relative}.book .book-body .page-wrapper .page-inner section.normal hr:after,.book-langs-index .inner .languages:after,.buttons:after,.dropdown-menu .buttons:after{clear:both}body,html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}.hidden,[hidden]{display:none}audio:not([controls]){display:none;height:0}html{font-family:sans-serif}body,figure{margin:0}a:focus{outline:dotted thin}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{padding:0}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button{margin-right:10px;}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}/*! 2 | * Preboot v2 3 | * 4 | * Open sourced under MIT license by @mdo. 5 | * Some variables and mixins from Bootstrap (Apache 2 license). 6 | */.link-inherit,.link-inherit:focus,.link-inherit:hover{color:inherit}.fa,.fa-stack{display:inline-block}/*! 7 | * Font Awesome 4.1.0 by @davegandy - http://fontawesome.io - @fontawesome 8 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 9 | */@font-face{font-family:FontAwesome;src:url(./fontawesome/fontawesome-webfont.ttf?v=4.1.0) format('truetype');font-weight:400;font-style:normal}.fa{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1;-moz-osx-font-smoothing:grayscale}.book .book-header,.book .book-summary{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.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;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0)}100%{-o-transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1,1);-moz-transform:scale(-1,1);-ms-transform:scale(-1,1);-o-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}.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-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{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:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.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{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-square:before,.fa-pied-piper: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-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel: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{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"}.book-langs-index{width:100%;height:100%;padding:40px 0;margin:0;overflow:auto}@media (max-width:600px){.book-langs-index{padding:0}}.book-langs-index .inner{max-width:600px;width:100%;margin:0 auto;padding:30px;background:#fff;border-radius:3px}.book-langs-index .inner h3{margin:0}.book-langs-index .inner .languages{list-style:none;padding:20px 30px;margin-top:20px;border-top:1px solid #eee}.book-langs-index .inner .languages:after,.book-langs-index .inner .languages:before{content:" ";display:table;line-height:0}.book-langs-index .inner .languages li{width:50%;float:left;padding:10px 5px;font-size:16px}@media (max-width:600px){.book-langs-index .inner .languages li{width:100%;max-width:100%}}.book .book-header{overflow:visible;height:50px;padding:0 8px;z-index:2;font-size:.85em;color:#7e888b;background:0 0}.book .book-header .btn{display:block;height:50px;padding:0 15px;border-bottom:none;color:#ccc;text-transform:uppercase;line-height:50px;-webkit-box-shadow:none!important;box-shadow:none!important;position:relative;font-size:14px}.book .book-header .btn:hover{position:relative;text-decoration:none;color:#444;background:0 0}.book .book-header h1{margin:0;font-size:20px;font-weight:200;text-align:center;line-height:50px;opacity:0;padding-left:200px;padding-right:200px;-webkit-transition:opacity .2s ease;-moz-transition:opacity .2s ease;-o-transition:opacity .2s ease;transition:opacity .2s ease;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.book .book-header h1 a,.book .book-header h1 a:hover{color:inherit;text-decoration:none}@media (max-width:1000px){.book .book-header h1{display:none}}.book .book-header h1 i{display:none}.book .book-header:hover h1{opacity:1}.book.is-loading .book-header h1 i{display:inline-block}.book.is-loading .book-header h1 a{display:none}.dropdown{position:relative}.dropdown-menu{position:absolute;top:100%;left:0;z-index:100;display:none;float:left;min-width:160px;padding:0;margin:2px 0 0;list-style:none;font-size:14px;background-color:#fafafa;border:1px solid rgba(0,0,0,.07);border-radius:1px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.open{display:block}.dropdown-menu.dropdown-left{left:auto;right:4%}.dropdown-menu.dropdown-left .dropdown-caret{right:14px;left:auto}.dropdown-menu .dropdown-caret{position:absolute;top:-8px;left:14px;width:18px;height:10px;float:left;overflow:hidden}.dropdown-menu .dropdown-caret .caret-inner,.dropdown-menu .dropdown-caret .caret-outer{display:inline-block;top:0;border-left:9px solid transparent;border-right:9px solid transparent;position:absolute}.dropdown-menu .dropdown-caret .caret-outer{border-bottom:9px solid rgba(0,0,0,.1);height:auto;left:0;width:auto;margin-left:-1px}.dropdown-menu .dropdown-caret .caret-inner{margin-top:-1px;top:1px;border-bottom:9px solid #fafafa}.dropdown-menu .buttons{border-bottom:1px solid rgba(0,0,0,.07)}.dropdown-menu .buttons:after,.dropdown-menu .buttons:before{content:" ";display:table;line-height:0}.dropdown-menu .buttons:last-child{border-bottom:none}.dropdown-menu .buttons .button{border:0;background-color:transparent;color:#a6a6a6;width:100%;text-align:center;float:left;line-height:1.42857143;padding:8px 4px}.alert,.dropdown-menu .buttons .button:hover{color:#444}.dropdown-menu .buttons .button:focus,.dropdown-menu .buttons .button:hover{outline:0}.dropdown-menu .buttons .button.size-2{width:50%}.dropdown-menu .buttons .button.size-3{width:33%}.alert{padding:15px;margin-bottom:20px;background:#eee;border-bottom:5px solid #ddd}.alert-success{background:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-info{background:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-danger{background:#f2dede;border-color:#ebccd1;color:#a94442}.alert-warning{background:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.book .book-summary{position:absolute;top:0;left:-300px;bottom:0;z-index:1;width:300px;color:#364149;background:#fafafa;border-right:1px solid rgba(0,0,0,.07);-webkit-transition:left 250ms ease;-moz-transition:left 250ms ease;-o-transition:left 250ms ease;transition:left 250ms ease}.book .book-summary ul.summary{position:absolute;top:0;left:0;right:0;bottom:0;overflow-y:auto;list-style:none;margin:0;padding:0;-webkit-transition:top .5s ease;-moz-transition:top .5s ease;-o-transition:top .5s ease;transition:top .5s ease}.book .book-summary ul.summary li{list-style:none}.book .book-summary ul.summary li.divider{height:1px;margin:7px 0;overflow:hidden;background:rgba(0,0,0,.07)}.book .book-summary ul.summary li i.fa-check{display:none;position:absolute;right:9px;top:16px;font-size:9px;color:#3c3}.book .book-summary ul.summary li.done>a{color:#364149;font-weight:400}.book .book-summary ul.summary li.done>a i{display:inline}.book .book-summary ul.summary li a,.book .book-summary ul.summary li span{display:block;padding:10px 15px;border-bottom:none;color:#364149;background:0 0;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;position:relative}.book .book-summary ul.summary li span{cursor:not-allowed;opacity:.3;filter:alpha(opacity=30)}.book .book-summary ul.summary li a:hover,.book .book-summary ul.summary li.active>a{color:#008cff;background:0 0;text-decoration:none}.book .book-summary ul.summary li ul{padding-left:20px}@media (max-width:600px){.book .book-summary{width:calc(100% - 60px);bottom:0;left:-100%}}.book.with-summary .book-summary{left:0}.book.without-animation .book-summary{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;transition:none!important}.book{position:relative;width:100%;height:100%}.book .book-body,.book .book-body .body-inner{position:absolute;top:0;left:0;overflow-y:auto;bottom:0;right:0}.book .book-body{color:#000;background:#fff;-webkit-transition:left 250ms ease;-moz-transition:left 250ms ease;-o-transition:left 250ms ease;transition:left 250ms ease}.book .book-body .page-wrapper{position:relative;outline:0}.book .book-body .page-wrapper .page-inner{max-width:800px;margin:0 auto;padding:20px 0 40px}.book .book-body .page-wrapper .page-inner section{margin:0;padding:5px 15px;background:#fff;border-radius:2px;line-height:1.7;font-size:1.6rem}.book .book-body .page-wrapper .page-inner .btn-group .btn{border-radius:0;background:#eee;border:0}@media (max-width:1240px){.book .book-body{-webkit-transition:-webkit-transform 250ms ease;-moz-transition:-moz-transform 250ms ease;-o-transition:-o-transform 250ms ease;transition:transform 250ms ease;padding-bottom:20px}.book .book-body .body-inner{position:static;min-height:calc(100% - 50px)}}@media (min-width:600px){.book.with-summary .book-body{left:300px}}@media (max-width:600px){.book.with-summary{overflow:hidden}.book.with-summary .book-body{-webkit-transform:translate(calc(100% - 60px),0);-moz-transform:translate(calc(100% - 60px),0);-ms-transform:translate(calc(100% - 60px),0);-o-transform:translate(calc(100% - 60px),0);transform:translate(calc(100% - 60px),0)}}.book.without-animation .book-body{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;transition:none!important}.buttons:after,.buttons:before{content:" ";display:table;line-height:0}.button{border:0;background:#eee;color:#666;width:100%;text-align:center;float:left;line-height:1.42857143;padding:8px 4px}.button:hover{color:#444}.button:focus,.button:hover{outline:0}.button.size-2{width:50%}.button.size-3{width:33%}.book .book-body .page-wrapper .page-inner section{display:none}.book .book-body .page-wrapper .page-inner section.normal{display:block;word-wrap:break-word;overflow:hidden;color:#333;line-height:1.7;text-size-adjust:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%}.book .book-body .page-wrapper .page-inner section.normal *{box-sizing:border-box;-webkit-box-sizing:border-box;}.book .book-body .page-wrapper .page-inner section.normal>:first-child{margin-top:0!important}.book .book-body .page-wrapper .page-inner section.normal>:last-child{margin-bottom:0!important}.book .book-body .page-wrapper .page-inner section.normal blockquote,.book .book-body .page-wrapper .page-inner section.normal code,.book .book-body .page-wrapper .page-inner section.normal figure,.book .book-body .page-wrapper .page-inner section.normal img,.book .book-body .page-wrapper .page-inner section.normal pre,.book .book-body .page-wrapper .page-inner section.normal table,.book .book-body .page-wrapper .page-inner section.normal tr{page-break-inside:avoid}.book .book-body .page-wrapper .page-inner section.normal h2,.book .book-body .page-wrapper .page-inner section.normal h3,.book .book-body .page-wrapper .page-inner section.normal h4,.book .book-body .page-wrapper .page-inner section.normal h5,.book .book-body .page-wrapper .page-inner section.normal p{orphans:3;widows:3}.book .book-body .page-wrapper .page-inner section.normal h1,.book .book-body .page-wrapper .page-inner section.normal h2,.book .book-body .page-wrapper .page-inner section.normal h3,.book .book-body .page-wrapper .page-inner section.normal h4,.book .book-body .page-wrapper .page-inner section.normal h5{page-break-after:avoid}.book .book-body .page-wrapper .page-inner section.normal b,.book .book-body .page-wrapper .page-inner section.normal strong{font-weight:700}.book .book-body .page-wrapper .page-inner section.normal em{font-style:italic}.book .book-body .page-wrapper .page-inner section.normal blockquote,.book .book-body .page-wrapper .page-inner section.normal dl,.book .book-body .page-wrapper .page-inner section.normal ol,.book .book-body .page-wrapper .page-inner section.normal p,.book .book-body .page-wrapper .page-inner section.normal table,.book .book-body .page-wrapper .page-inner section.normal ul{margin-top:0;margin-bottom:.85em}.book .book-body .page-wrapper .page-inner section.normal a{color:#4183c4;text-decoration:none;background:0 0}.book .book-body .page-wrapper .page-inner section.normal a:active,.book .book-body .page-wrapper .page-inner section.normal a:focus,.book .book-body .page-wrapper .page-inner section.normal a:hover{outline:0;text-decoration:underline}.book .book-body .page-wrapper .page-inner section.normal img{border:0;max-width:100%}.book .book-body .page-wrapper .page-inner section.normal hr{height:4px;padding:0;margin:1.7em 0;overflow:hidden;background-color:#e7e7e7;border:none}.book .book-body .page-wrapper .page-inner section.normal hr:after,.book .book-body .page-wrapper .page-inner section.normal hr:before{display:table;content:" "}.book .book-body .page-wrapper .page-inner section.normal h1,.book .book-body .page-wrapper .page-inner section.normal h2,.book .book-body .page-wrapper .page-inner section.normal h3,.book .book-body .page-wrapper .page-inner section.normal h4,.book .book-body .page-wrapper .page-inner section.normal h5,.book .book-body .page-wrapper .page-inner section.normal h6{margin-top:1.275em;margin-bottom:.85em;}.book .book-body .page-wrapper .page-inner section.normal h1{font-size:2em}.book .book-body .page-wrapper .page-inner section.normal h2{font-size:1.75em}.book .book-body .page-wrapper .page-inner section.normal h3{font-size:1.5em}.book .book-body .page-wrapper .page-inner section.normal h4{font-size:1.25em}.book .book-body .page-wrapper .page-inner section.normal h5{font-size:1em}.book .book-body .page-wrapper .page-inner section.normal h6{font-size:1em;color:#777}.book .book-body .page-wrapper .page-inner section.normal code,.book .book-body .page-wrapper .page-inner section.normal pre{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;direction:ltr;border:none;color:inherit}.book .book-body .page-wrapper .page-inner section.normal pre{overflow:auto;word-wrap:normal;margin:0 0 1.275em;padding:.85em 1em;background:#f7f7f7}.book .book-body .page-wrapper .page-inner section.normal pre>code{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;font-size:.85em;white-space:pre;background:0 0}.book .book-body .page-wrapper .page-inner section.normal pre>code:after,.book .book-body .page-wrapper .page-inner section.normal pre>code:before{content:normal}.book .book-body .page-wrapper .page-inner section.normal code{padding:.2em;margin:0;font-size:.85em;background-color:#f7f7f7}.book .book-body .page-wrapper .page-inner section.normal code:after,.book .book-body .page-wrapper .page-inner section.normal code:before{letter-spacing:-.2em;content:"\00a0"}.book .book-body .page-wrapper .page-inner section.normal ol,.book .book-body .page-wrapper .page-inner section.normal ul{padding:0 0 0 2em;margin:0 0 .85em}.book .book-body .page-wrapper .page-inner section.normal ol ol,.book .book-body .page-wrapper .page-inner section.normal ol ul,.book .book-body .page-wrapper .page-inner section.normal ul ol,.book .book-body .page-wrapper .page-inner section.normal ul ul{margin-top:0;margin-bottom:0}.book .book-body .page-wrapper .page-inner section.normal ol ol{list-style-type:lower-roman}.book .book-body .page-wrapper .page-inner section.normal blockquote{margin:0 0 .85em;padding:0 15px;opacity:0.75;border-left:4px solid #dcdcdc}.book .book-body .page-wrapper .page-inner section.normal blockquote:first-child{margin-top:0}.book .book-body .page-wrapper .page-inner section.normal blockquote:last-child{margin-bottom:0}.book .book-body .page-wrapper .page-inner section.normal dl{padding:0}.book .book-body .page-wrapper .page-inner section.normal dl dt{padding:0;margin-top:.85em;font-style:italic;font-weight:700}.book .book-body .page-wrapper .page-inner section.normal dl dd{padding:0 .85em;margin-bottom:.85em}.book .book-body .page-wrapper .page-inner section.normal dd{margin-left:0}.book .book-body .page-wrapper .page-inner section.normal .glossary-term{cursor:help;text-decoration:underline}.book .book-body .navigation{position:absolute;top:50px;bottom:0;margin:0;max-width:150px;min-width:90px;display:flex;justify-content:center;align-content:center;flex-direction:column;font-size:40px;color:#ccc;text-align:center;-webkit-transition:all 350ms ease;-moz-transition:all 350ms ease;-o-transition:all 350ms ease;transition:all 350ms ease}.book .book-body .navigation:hover{text-decoration:none;color:#444}.book .book-body .navigation.navigation-next{right:0}.book .book-body .navigation.navigation-prev{left:0}@media (max-width:1240px){.book .book-body .navigation{position:static;top:auto;max-width:50%;width:50%;display:inline-block;float:left}.book .book-body .navigation.navigation-unique{max-width:100%;width:100%}}.book .book-body .page-wrapper .page-inner section.glossary{margin-bottom:40px}.book .book-body .page-wrapper .page-inner section.glossary h2 a,.book .book-body .page-wrapper .page-inner section.glossary h2 a:hover{color:inherit;text-decoration:none}.book .book-body .page-wrapper .page-inner section.glossary .glossary-index{list-style:none;margin:0;padding:0}.book .book-body .page-wrapper .page-inner section.glossary .glossary-index li{display:inline;margin:0 8px;white-space:nowrap}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-overflow-scrolling:touch;-webkit-tap-highlight-color:transparent;-webkit-text-size-adjust:none;-webkit-touch-callout:none}a{text-decoration:none}body,html{height:100%}html{font-size:62.5%}body{text-rendering:optimizeLegibility;font-smoothing:antialiased;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;letter-spacing:.2px;text-size-adjust:100%} 10 | .book .book-summary ul.summary li a span {display:inline;padding:initial;overflow:visible;cursor:auto;opacity:1;} 11 | -------------------------------------------------------------------------------- /docs/libs/gitbook-2.6.7/js/jquery.highlight.js: -------------------------------------------------------------------------------- 1 | gitbook.require(["jQuery"], function(jQuery) { 2 | 3 | /* 4 | * jQuery Highlight plugin 5 | * 6 | * Based on highlight v3 by Johann Burkard 7 | * http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html 8 | * 9 | * Code a little bit refactored and cleaned (in my humble opinion). 10 | * Most important changes: 11 | * - has an option to highlight only entire words (wordsOnly - false by default), 12 | * - has an option to be case sensitive (caseSensitive - false by default) 13 | * - highlight element tag and class names can be specified in options 14 | * 15 | * Copyright (c) 2009 Bartek Szopka 16 | * 17 | * Licensed under MIT license. 18 | * 19 | */ 20 | 21 | jQuery.extend({ 22 | highlight: function (node, re, nodeName, className) { 23 | if (node.nodeType === 3) { 24 | var match = node.data.match(re); 25 | if (match) { 26 | var highlight = document.createElement(nodeName || 'span'); 27 | highlight.className = className || 'highlight'; 28 | var wordNode = node.splitText(match.index); 29 | wordNode.splitText(match[0].length); 30 | var wordClone = wordNode.cloneNode(true); 31 | highlight.appendChild(wordClone); 32 | wordNode.parentNode.replaceChild(highlight, wordNode); 33 | return 1; //skip added node in parent 34 | } 35 | } else if ((node.nodeType === 1 && node.childNodes) && // only element nodes that have children 36 | !/(script|style)/i.test(node.tagName) && // ignore script and style nodes 37 | !(node.tagName === nodeName.toUpperCase() && node.className === className)) { // skip if already highlighted 38 | for (var i = 0; i < node.childNodes.length; i++) { 39 | i += jQuery.highlight(node.childNodes[i], re, nodeName, className); 40 | } 41 | } 42 | return 0; 43 | } 44 | }); 45 | 46 | jQuery.fn.unhighlight = function (options) { 47 | var settings = { className: 'highlight', element: 'span' }; 48 | jQuery.extend(settings, options); 49 | 50 | return this.find(settings.element + "." + settings.className).each(function () { 51 | var parent = this.parentNode; 52 | parent.replaceChild(this.firstChild, this); 53 | parent.normalize(); 54 | }).end(); 55 | }; 56 | 57 | jQuery.fn.highlight = function (words, options) { 58 | var settings = { className: 'highlight', element: 'span', caseSensitive: false, wordsOnly: false }; 59 | jQuery.extend(settings, options); 60 | 61 | if (words.constructor === String) { 62 | words = [words]; 63 | // also match 'foo-bar' if search for 'foo bar' 64 | if (/\s/.test(words[0])) words.push(words[0].replace(/\s+/, '-')); 65 | } 66 | words = jQuery.grep(words, function(word, i){ 67 | return word !== ''; 68 | }); 69 | words = jQuery.map(words, function(word, i) { 70 | return word.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); 71 | }); 72 | if (words.length === 0) { return this; } 73 | 74 | var flag = settings.caseSensitive ? "" : "i"; 75 | var pattern = "(" + words.join("|") + ")"; 76 | if (settings.wordsOnly) { 77 | pattern = "\\b" + pattern + "\\b"; 78 | } 79 | var re = new RegExp(pattern, flag); 80 | 81 | return this.each(function () { 82 | jQuery.highlight(this, re, settings.element, settings.className); 83 | }); 84 | }; 85 | 86 | }); 87 | -------------------------------------------------------------------------------- /docs/libs/gitbook-2.6.7/js/lunr.js: -------------------------------------------------------------------------------- 1 | /** 2 | * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 0.5.12 3 | * Copyright (C) 2015 Oliver Nightingale 4 | * MIT Licensed 5 | * @license 6 | */ 7 | !function(){var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.5.12",t.utils={},t.utils.warn=function(t){return function(e){t.console&&console.warn&&console.warn(e)}}(this),t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var t=Array.prototype.slice.call(arguments),e=t.pop(),n=t;if("function"!=typeof e)throw new TypeError("last argument must be a function");n.forEach(function(t){this.hasHandler(t)||(this.events[t]=[]),this.events[t].push(e)},this)},t.EventEmitter.prototype.removeListener=function(t,e){if(this.hasHandler(t)){var n=this.events[t].indexOf(e);this.events[t].splice(n,1),this.events[t].length||delete this.events[t]}},t.EventEmitter.prototype.emit=function(t){if(this.hasHandler(t)){var e=Array.prototype.slice.call(arguments,1);this.events[t].forEach(function(t){t.apply(void 0,e)})}},t.EventEmitter.prototype.hasHandler=function(t){return t in this.events},t.tokenizer=function(t){return arguments.length&&null!=t&&void 0!=t?Array.isArray(t)?t.map(function(t){return t.toLowerCase()}):t.toString().trim().toLowerCase().split(/[\s\-\/]+/):[]},t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.registeredFunctions[e];if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");this._stack.splice(i,0,n)},t.Pipeline.prototype.remove=function(t){var e=this._stack.indexOf(t);-1!=e&&this._stack.splice(e,1)},t.Pipeline.prototype.run=function(t){for(var e=[],n=t.length,i=this._stack.length,o=0;n>o;o++){for(var r=t[o],s=0;i>s&&(r=this._stack[s](r,o,t),void 0!==r);s++);void 0!==r&&e.push(r)}return e},t.Pipeline.prototype.reset=function(){this._stack=[]},t.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Vector=function(){this._magnitude=null,this.list=void 0,this.length=0},t.Vector.Node=function(t,e,n){this.idx=t,this.val=e,this.next=n},t.Vector.prototype.insert=function(e,n){this._magnitude=void 0;var i=this.list;if(!i)return this.list=new t.Vector.Node(e,n,i),this.length++;if(en.idx?n=n.next:(i+=e.val*n.val,e=e.next,n=n.next);return i},t.Vector.prototype.similarity=function(t){return this.dot(t)/(this.magnitude()*t.magnitude())},t.SortedSet=function(){this.length=0,this.elements=[]},t.SortedSet.load=function(t){var e=new this;return e.elements=t,e.length=t.length,e},t.SortedSet.prototype.add=function(){var t,e;for(t=0;t1;){if(r===t)return o;t>r&&(e=o),r>t&&(n=o),i=n-e,o=e+Math.floor(i/2),r=this.elements[o]}return r===t?o:-1},t.SortedSet.prototype.locationFor=function(t){for(var e=0,n=this.elements.length,i=n-e,o=e+Math.floor(i/2),r=this.elements[o];i>1;)t>r&&(e=o),r>t&&(n=o),i=n-e,o=e+Math.floor(i/2),r=this.elements[o];return r>t?o:t>r?o+1:void 0},t.SortedSet.prototype.intersect=function(e){for(var n=new t.SortedSet,i=0,o=0,r=this.length,s=e.length,a=this.elements,h=e.elements;;){if(i>r-1||o>s-1)break;a[i]!==h[o]?a[i]h[o]&&o++:(n.add(a[i]),i++,o++)}return n},t.SortedSet.prototype.clone=function(){var e=new t.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},t.SortedSet.prototype.union=function(t){var e,n,i;return this.length>=t.length?(e=this,n=t):(e=t,n=this),i=e.clone(),i.add.apply(i,n.toArray()),i},t.SortedSet.prototype.toJSON=function(){return this.toArray()},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.Store,this.tokenStore=new t.TokenStore,this.corpusTokens=new t.SortedSet,this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var t=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,t)},t.Index.prototype.off=function(t,e){return this.eventEmitter.removeListener(t,e)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;return n._fields=e.fields,n._ref=e.ref,n.documentStore=t.Store.load(e.documentStore),n.tokenStore=t.TokenStore.load(e.tokenStore),n.corpusTokens=t.SortedSet.load(e.corpusTokens),n.pipeline=t.Pipeline.load(e.pipeline),n},t.Index.prototype.field=function(t,e){var e=e||{},n={name:t,boost:e.boost||1};return this._fields.push(n),this},t.Index.prototype.ref=function(t){return this._ref=t,this},t.Index.prototype.add=function(e,n){var i={},o=new t.SortedSet,r=e[this._ref],n=void 0===n?!0:n;this._fields.forEach(function(n){var r=this.pipeline.run(t.tokenizer(e[n.name]));i[n.name]=r,t.SortedSet.prototype.add.apply(o,r)},this),this.documentStore.set(r,o),t.SortedSet.prototype.add.apply(this.corpusTokens,o.toArray());for(var s=0;s0&&(i=1+Math.log(this.documentStore.length/n)),this._idfCache[e]=i},t.Index.prototype.search=function(e){var n=this.pipeline.run(t.tokenizer(e)),i=new t.Vector,o=[],r=this._fields.reduce(function(t,e){return t+e.boost},0),s=n.some(function(t){return this.tokenStore.has(t)},this);if(!s)return[];n.forEach(function(e,n,s){var a=1/s.length*this._fields.length*r,h=this,l=this.tokenStore.expand(e).reduce(function(n,o){var r=h.corpusTokens.indexOf(o),s=h.idf(o),l=1,u=new t.SortedSet;if(o!==e){var c=Math.max(3,o.length-e.length);l=1/Math.log(c)}return r>-1&&i.insert(r,a*s*l),Object.keys(h.tokenStore.get(o)).forEach(function(t){u.add(t)}),n.union(u)},new t.SortedSet);o.push(l)},this);var a=o.reduce(function(t,e){return t.intersect(e)});return a.map(function(t){return{ref:t,score:i.similarity(this.documentVector(t))}},this).sort(function(t,e){return e.score-t.score})},t.Index.prototype.documentVector=function(e){for(var n=this.documentStore.get(e),i=n.length,o=new t.Vector,r=0;i>r;r++){var s=n.elements[r],a=this.tokenStore.get(s)[e].tf,h=this.idf(s);o.insert(this.corpusTokens.indexOf(s),a*h)}return o},t.Index.prototype.toJSON=function(){return{version:t.version,fields:this._fields,ref:this._ref,documentStore:this.documentStore.toJSON(),tokenStore:this.tokenStore.toJSON(),corpusTokens:this.corpusTokens.toJSON(),pipeline:this.pipeline.toJSON()}},t.Index.prototype.use=function(t){var e=Array.prototype.slice.call(arguments,1);e.unshift(this),t.apply(this,e)},t.Store=function(){this.store={},this.length=0},t.Store.load=function(e){var n=new this;return n.length=e.length,n.store=Object.keys(e.store).reduce(function(n,i){return n[i]=t.SortedSet.load(e.store[i]),n},{}),n},t.Store.prototype.set=function(t,e){this.has(t)||this.length++,this.store[t]=e},t.Store.prototype.get=function(t){return this.store[t]},t.Store.prototype.has=function(t){return t in this.store},t.Store.prototype.remove=function(t){this.has(t)&&(delete this.store[t],this.length--)},t.Store.prototype.toJSON=function(){return{store:this.store,length:this.length}},t.stemmer=function(){var t={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},e={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",o=n+"[^aeiouy]*",r=i+"[aeiou]*",s="^("+o+")?"+r+o,a="^("+o+")?"+r+o+"("+r+")?$",h="^("+o+")?"+r+o+r+o,l="^("+o+")?"+i,u=new RegExp(s),c=new RegExp(h),f=new RegExp(a),d=new RegExp(l),p=/^(.+?)(ss|i)es$/,m=/^(.+?)([^s])s$/,v=/^(.+?)eed$/,y=/^(.+?)(ed|ing)$/,g=/.$/,S=/(at|bl|iz)$/,w=new RegExp("([^aeiouylsz])\\1$"),x=new RegExp("^"+o+i+"[^aeiouwxy]$"),k=/^(.+?[^aeiou])y$/,b=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,E=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,_=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,F=/^(.+?)(s|t)(ion)$/,O=/^(.+?)e$/,P=/ll$/,N=new RegExp("^"+o+i+"[^aeiouwxy]$"),T=function(n){var i,o,r,s,a,h,l;if(n.length<3)return n;if(r=n.substr(0,1),"y"==r&&(n=r.toUpperCase()+n.substr(1)),s=p,a=m,s.test(n)?n=n.replace(s,"$1$2"):a.test(n)&&(n=n.replace(a,"$1$2")),s=v,a=y,s.test(n)){var T=s.exec(n);s=u,s.test(T[1])&&(s=g,n=n.replace(s,""))}else if(a.test(n)){var T=a.exec(n);i=T[1],a=d,a.test(i)&&(n=i,a=S,h=w,l=x,a.test(n)?n+="e":h.test(n)?(s=g,n=n.replace(s,"")):l.test(n)&&(n+="e"))}if(s=k,s.test(n)){var T=s.exec(n);i=T[1],n=i+"i"}if(s=b,s.test(n)){var T=s.exec(n);i=T[1],o=T[2],s=u,s.test(i)&&(n=i+t[o])}if(s=E,s.test(n)){var T=s.exec(n);i=T[1],o=T[2],s=u,s.test(i)&&(n=i+e[o])}if(s=_,a=F,s.test(n)){var T=s.exec(n);i=T[1],s=c,s.test(i)&&(n=i)}else if(a.test(n)){var T=a.exec(n);i=T[1]+T[2],a=c,a.test(i)&&(n=i)}if(s=O,s.test(n)){var T=s.exec(n);i=T[1],s=c,a=f,h=N,(s.test(i)||a.test(i)&&!h.test(i))&&(n=i)}return s=P,a=c,s.test(n)&&a.test(n)&&(s=g,n=n.replace(s,"")),"y"==r&&(n=r.toLowerCase()+n.substr(1)),n};return T}(),t.Pipeline.registerFunction(t.stemmer,"stemmer"),t.stopWordFilter=function(e){return e&&t.stopWordFilter.stopWords[e]!==e?e:void 0},t.stopWordFilter.stopWords={a:"a",able:"able",about:"about",across:"across",after:"after",all:"all",almost:"almost",also:"also",am:"am",among:"among",an:"an",and:"and",any:"any",are:"are",as:"as",at:"at",be:"be",because:"because",been:"been",but:"but",by:"by",can:"can",cannot:"cannot",could:"could",dear:"dear",did:"did","do":"do",does:"does",either:"either","else":"else",ever:"ever",every:"every","for":"for",from:"from",get:"get",got:"got",had:"had",has:"has",have:"have",he:"he",her:"her",hers:"hers",him:"him",his:"his",how:"how",however:"however",i:"i","if":"if","in":"in",into:"into",is:"is",it:"it",its:"its",just:"just",least:"least",let:"let",like:"like",likely:"likely",may:"may",me:"me",might:"might",most:"most",must:"must",my:"my",neither:"neither",no:"no",nor:"nor",not:"not",of:"of",off:"off",often:"often",on:"on",only:"only",or:"or",other:"other",our:"our",own:"own",rather:"rather",said:"said",say:"say",says:"says",she:"she",should:"should",since:"since",so:"so",some:"some",than:"than",that:"that",the:"the",their:"their",them:"them",then:"then",there:"there",these:"these",they:"they","this":"this",tis:"tis",to:"to",too:"too",twas:"twas",us:"us",wants:"wants",was:"was",we:"we",were:"were",what:"what",when:"when",where:"where",which:"which","while":"while",who:"who",whom:"whom",why:"why",will:"will","with":"with",would:"would",yet:"yet",you:"you",your:"your"},t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter"),t.trimmer=function(t){var e=t.replace(/^\W+/,"").replace(/\W+$/,"");return""===e?void 0:e},t.Pipeline.registerFunction(t.trimmer,"trimmer"),t.TokenStore=function(){this.root={docs:{}},this.length=0},t.TokenStore.load=function(t){var e=new this;return e.root=t.root,e.length=t.length,e},t.TokenStore.prototype.add=function(t,e,n){var n=n||this.root,i=t[0],o=t.slice(1);return i in n||(n[i]={docs:{}}),0===o.length?(n[i].docs[e.ref]=e,void(this.length+=1)):this.add(o,e,n[i])},t.TokenStore.prototype.has=function(t){if(!t)return!1;for(var e=this.root,n=0;n indicates arrow keys):', 70 | '/: navigate to previous/next page', 71 | 's: Toggle sidebar']; 72 | if (config.search !== false) info.push('f: Toggle search input ' + 73 | '(use //Enter in the search input to navigate through search matches; ' + 74 | 'press Esc to cancel search)'); 75 | gitbook.toolbar.createButton({ 76 | icon: 'fa fa-info', 77 | label: 'Information about the toolbar', 78 | position: 'left', 79 | onClick: function(e) { 80 | e.preventDefault(); 81 | window.alert(info.join('\n\n')); 82 | } 83 | }); 84 | 85 | // highlight the current section in TOC 86 | var href = window.location.pathname; 87 | href = href.substr(href.lastIndexOf('/') + 1); 88 | if (href === '') href = 'index.html'; 89 | var li = $('a[href^="' + href + location.hash + '"]').parent('li.chapter').first(); 90 | var summary = $('ul.summary'), chaps = summary.find('li.chapter'); 91 | if (li.length === 0) li = chaps.first(); 92 | li.addClass('active'); 93 | chaps.on('click', function(e) { 94 | chaps.removeClass('active'); 95 | $(this).addClass('active'); 96 | gs.set('tocScrollTop', summary.scrollTop()); 97 | }); 98 | 99 | var toc = config.toc; 100 | // collapse TOC items that are not for the current chapter 101 | if (toc && toc.collapse) (function() { 102 | var type = toc.collapse; 103 | if (type === 'none') return; 104 | if (type !== 'section' && type !== 'subsection') return; 105 | // sections under chapters 106 | var toc_sub = summary.children('li[data-level]').children('ul'); 107 | if (type === 'section') { 108 | toc_sub.hide() 109 | .parent().has(li).children('ul').show(); 110 | } else { 111 | toc_sub.children('li').children('ul').hide() 112 | .parent().has(li).children('ul').show(); 113 | } 114 | li.children('ul').show(); 115 | var toc_sub2 = toc_sub.children('li'); 116 | if (type === 'section') toc_sub2.children('ul').hide(); 117 | summary.children('li[data-level]').find('a') 118 | .on('click.bookdown', function(e) { 119 | if (href === $(this).attr('href').replace(/#.*/, '')) 120 | $(this).parent('li').children('ul').toggle(); 121 | }); 122 | })(); 123 | 124 | // add tooltips to the 's that are truncated 125 | $('a').each(function(i, el) { 126 | if (el.offsetWidth >= el.scrollWidth) return; 127 | if (typeof el.title === 'undefined') return; 128 | el.title = el.text; 129 | }); 130 | 131 | // restore TOC scroll position 132 | var pos = gs.get('tocScrollTop'); 133 | if (typeof pos !== 'undefined') summary.scrollTop(pos); 134 | 135 | // highlight the TOC item that has same text as the heading in view as scrolling 136 | if (toc && toc.scroll_highlight !== false) (function() { 137 | // scroll the current TOC item into viewport 138 | var ht = $(window).height(), rect = li[0].getBoundingClientRect(); 139 | if (rect.top >= ht || rect.top <= 0 || rect.bottom <= 0) { 140 | summary.scrollTop(li[0].offsetTop); 141 | } 142 | // current chapter TOC items 143 | var items = $('a[href^="' + href + '"]').parent('li.chapter'), 144 | m = items.length; 145 | if (m === 0) { 146 | items = summary.find('li.chapter'); 147 | m = items.length; 148 | } 149 | if (m === 0) return; 150 | // all section titles on current page 151 | var hs = bookInner.find('.page-inner').find('h1,h2,h3'), n = hs.length, 152 | ts = hs.map(function(i, el) { return $(el).text(); }); 153 | if (n === 0) return; 154 | var scrollHandler = function(e) { 155 | var ht = $(window).height(); 156 | clearTimeout($.data(this, 'scrollTimer')); 157 | $.data(this, 'scrollTimer', setTimeout(function() { 158 | // find the first visible title in the viewport 159 | for (var i = 0; i < n; i++) { 160 | var rect = hs[i].getBoundingClientRect(); 161 | if (rect.top >= 0 && rect.bottom <= ht) break; 162 | } 163 | if (i === n) return; 164 | items.removeClass('active'); 165 | for (var j = 0; j < m; j++) { 166 | if (items.eq(j).children('a').first().text() === ts[i]) break; 167 | } 168 | if (j === m) j = 0; // highlight the chapter title 169 | // search bottom-up for a visible TOC item to highlight; if an item is 170 | // hidden, we check if its parent is visible, and so on 171 | while (j > 0 && items.eq(j).is(':hidden')) j--; 172 | items.eq(j).addClass('active'); 173 | }, 250)); 174 | }; 175 | bookInner.on('scroll.bookdown', scrollHandler); 176 | bookBody.on('scroll.bookdown', scrollHandler); 177 | })(); 178 | 179 | // do not refresh the page if the TOC item points to the current page 180 | $('a[href="' + href + '"]').parent('li.chapter').children('a') 181 | .on('click', function(e) { 182 | bookInner.scrollTop(0); 183 | bookBody.scrollTop(0); 184 | return false; 185 | }); 186 | 187 | var toolbar = config.toolbar; 188 | if (!toolbar || toolbar.position !== 'static') { 189 | var bookHeader = $('.book-header'); 190 | bookBody.addClass('fixed'); 191 | bookHeader.addClass('fixed') 192 | .css('background-color', bookBody.css('background-color')) 193 | .on('click.bookdown', function(e) { 194 | // the theme may have changed after user clicks the theme button 195 | bookHeader.css('background-color', bookBody.css('background-color')); 196 | }); 197 | } 198 | 199 | }); 200 | 201 | gitbook.events.bind("page.change", function(e) { 202 | // store TOC scroll position 203 | var summary = $('ul.summary'); 204 | gs.set('tocScrollTop', summary.scrollTop()); 205 | }); 206 | 207 | var bookBody = $('.book-body'), bookInner = bookBody.find('.body-inner'); 208 | var chapterTitle = function() { 209 | return bookInner.find('.page-inner').find('h1,h2').first().text(); 210 | }; 211 | var saveScrollPos = function(e) { 212 | // save scroll position before page is reloaded 213 | gs.set('bodyScrollTop', { 214 | body: bookBody.scrollTop(), 215 | inner: bookInner.scrollTop(), 216 | focused: document.hasFocus(), 217 | title: chapterTitle() 218 | }); 219 | }; 220 | $(document).on('servr:reload', saveScrollPos); 221 | 222 | // check if the page is loaded in an iframe (e.g. the RStudio preview window) 223 | var inIFrame = function() { 224 | var inIframe = true; 225 | try { inIframe = window.self !== window.top; } catch (e) {} 226 | return inIframe; 227 | }; 228 | if (inIFrame()) { 229 | $(window).on('blur unload', saveScrollPos); 230 | } 231 | 232 | $(function(e) { 233 | var pos = gs.get('bodyScrollTop'); 234 | if (pos) { 235 | if (pos.title === chapterTitle()) { 236 | if (pos.body !== 0) bookBody.scrollTop(pos.body); 237 | if (pos.inner !== 0) bookInner.scrollTop(pos.inner); 238 | } 239 | } 240 | if ((pos && pos.focused) || !inIFrame()) bookInner.find('.page-wrapper').focus(); 241 | // clear book body scroll position 242 | gs.remove('bodyScrollTop'); 243 | }); 244 | 245 | }); 246 | -------------------------------------------------------------------------------- /docs/libs/gitbook-2.6.7/js/plugin-fontsettings.js: -------------------------------------------------------------------------------- 1 | gitbook.require(["gitbook", "lodash", "jQuery"], function(gitbook, _, $) { 2 | var fontState; 3 | 4 | var THEMES = { 5 | "white": 0, 6 | "sepia": 1, 7 | "night": 2 8 | }; 9 | 10 | var FAMILY = { 11 | "serif": 0, 12 | "sans": 1 13 | }; 14 | 15 | // Save current font settings 16 | function saveFontSettings() { 17 | gitbook.storage.set("fontState", fontState); 18 | update(); 19 | } 20 | 21 | // Increase font size 22 | function enlargeFontSize(e) { 23 | e.preventDefault(); 24 | if (fontState.size >= 4) return; 25 | 26 | fontState.size++; 27 | saveFontSettings(); 28 | }; 29 | 30 | // Decrease font size 31 | function reduceFontSize(e) { 32 | e.preventDefault(); 33 | if (fontState.size <= 0) return; 34 | 35 | fontState.size--; 36 | saveFontSettings(); 37 | }; 38 | 39 | // Change font family 40 | function changeFontFamily(index, e) { 41 | e.preventDefault(); 42 | 43 | fontState.family = index; 44 | saveFontSettings(); 45 | }; 46 | 47 | // Change type of color 48 | function changeColorTheme(index, e) { 49 | e.preventDefault(); 50 | 51 | var $book = $(".book"); 52 | 53 | if (fontState.theme !== 0) 54 | $book.removeClass("color-theme-"+fontState.theme); 55 | 56 | fontState.theme = index; 57 | if (fontState.theme !== 0) 58 | $book.addClass("color-theme-"+fontState.theme); 59 | 60 | saveFontSettings(); 61 | }; 62 | 63 | function update() { 64 | var $book = gitbook.state.$book; 65 | 66 | $(".font-settings .font-family-list li").removeClass("active"); 67 | $(".font-settings .font-family-list li:nth-child("+(fontState.family+1)+")").addClass("active"); 68 | 69 | $book[0].className = $book[0].className.replace(/\bfont-\S+/g, ''); 70 | $book.addClass("font-size-"+fontState.size); 71 | $book.addClass("font-family-"+fontState.family); 72 | 73 | if(fontState.theme !== 0) { 74 | $book[0].className = $book[0].className.replace(/\bcolor-theme-\S+/g, ''); 75 | $book.addClass("color-theme-"+fontState.theme); 76 | } 77 | }; 78 | 79 | function init(config) { 80 | var $bookBody, $book; 81 | 82 | //Find DOM elements. 83 | $book = gitbook.state.$book; 84 | $bookBody = $book.find(".book-body"); 85 | 86 | // Instantiate font state object 87 | fontState = gitbook.storage.get("fontState", { 88 | size: config.size || 2, 89 | family: FAMILY[config.family || "sans"], 90 | theme: THEMES[config.theme || "white"] 91 | }); 92 | 93 | update(); 94 | }; 95 | 96 | 97 | gitbook.events.bind("start", function(e, config) { 98 | var opts = config.fontsettings; 99 | 100 | // Create buttons in toolbar 101 | gitbook.toolbar.createButton({ 102 | icon: 'fa fa-font', 103 | label: 'Font Settings', 104 | className: 'font-settings', 105 | dropdown: [ 106 | [ 107 | { 108 | text: 'A', 109 | className: 'font-reduce', 110 | onClick: reduceFontSize 111 | }, 112 | { 113 | text: 'A', 114 | className: 'font-enlarge', 115 | onClick: enlargeFontSize 116 | } 117 | ], 118 | [ 119 | { 120 | text: 'Serif', 121 | onClick: _.partial(changeFontFamily, 0) 122 | }, 123 | { 124 | text: 'Sans', 125 | onClick: _.partial(changeFontFamily, 1) 126 | } 127 | ], 128 | [ 129 | { 130 | text: 'White', 131 | onClick: _.partial(changeColorTheme, 0) 132 | }, 133 | { 134 | text: 'Sepia', 135 | onClick: _.partial(changeColorTheme, 1) 136 | }, 137 | { 138 | text: 'Night', 139 | onClick: _.partial(changeColorTheme, 2) 140 | } 141 | ] 142 | ] 143 | }); 144 | 145 | 146 | // Init current settings 147 | init(opts); 148 | }); 149 | }); 150 | 151 | 152 | -------------------------------------------------------------------------------- /docs/libs/gitbook-2.6.7/js/plugin-search.js: -------------------------------------------------------------------------------- 1 | gitbook.require(["gitbook", "lodash", "jQuery"], function(gitbook, _, $) { 2 | var index = null; 3 | var $searchInput, $searchLabel, $searchForm; 4 | var $highlighted = [], hi, hiOpts = { className: 'search-highlight' }; 5 | var collapse = false, toc_visible = []; 6 | 7 | // Use a specific index 8 | function loadIndex(data) { 9 | // [Yihui] In bookdown, I use a character matrix to store the chapter 10 | // content, and the index is dynamically built on the client side. 11 | // Gitbook prebuilds the index data instead: https://github.com/GitbookIO/plugin-search 12 | // We can certainly do that via R packages V8 and jsonlite, but let's 13 | // see how slow it really is before improving it. On the other hand, 14 | // lunr cannot handle non-English text very well, e.g. the default 15 | // tokenizer cannot deal with Chinese text, so we may want to replace 16 | // lunr with a dumb simple text matching approach. 17 | index = lunr(function () { 18 | this.ref('url'); 19 | this.field('title', { boost: 10 }); 20 | this.field('body'); 21 | }); 22 | data.map(function(item) { 23 | index.add({ 24 | url: item[0], 25 | title: item[1], 26 | body: item[2] 27 | }); 28 | }); 29 | } 30 | 31 | // Fetch the search index 32 | function fetchIndex() { 33 | return $.getJSON(gitbook.state.basePath+"/search_index.json") 34 | .then(loadIndex); // [Yihui] we need to use this object later 35 | } 36 | 37 | // Search for a term and return results 38 | function search(q) { 39 | if (!index) return; 40 | 41 | var results = _.chain(index.search(q)) 42 | .map(function(result) { 43 | var parts = result.ref.split("#"); 44 | return { 45 | path: parts[0], 46 | hash: parts[1] 47 | }; 48 | }) 49 | .value(); 50 | 51 | // [Yihui] Highlight the search keyword on current page 52 | $highlighted = results.length === 0 ? [] : $('.page-inner') 53 | .unhighlight(hiOpts).highlight(q, hiOpts).find('span.search-highlight'); 54 | scrollToHighlighted(0); 55 | 56 | return results; 57 | } 58 | 59 | // [Yihui] Scroll the chapter body to the i-th highlighted string 60 | function scrollToHighlighted(d) { 61 | var n = $highlighted.length; 62 | hi = hi === undefined ? 0 : hi + d; 63 | // navignate to the previous/next page in the search results if reached the top/bottom 64 | var b = hi < 0; 65 | if (d !== 0 && (b || hi >= n)) { 66 | var path = currentPath(), n2 = toc_visible.length; 67 | if (n2 === 0) return; 68 | for (var i = b ? 0 : n2; (b && i < n2) || (!b && i >= 0); i += b ? 1 : -1) { 69 | if (toc_visible.eq(i).data('path') === path) break; 70 | } 71 | i += b ? -1 : 1; 72 | if (i < 0) i = n2 - 1; 73 | if (i >= n2) i = 0; 74 | var lnk = toc_visible.eq(i).find('a[href$=".html"]'); 75 | if (lnk.length) lnk[0].click(); 76 | return; 77 | } 78 | if (n === 0) return; 79 | var $p = $highlighted.eq(hi); 80 | $p[0].scrollIntoView(); 81 | $highlighted.css('background-color', ''); 82 | // an orange background color on the current item and removed later 83 | $p.css('background-color', 'orange'); 84 | setTimeout(function() { 85 | $p.css('background-color', ''); 86 | }, 2000); 87 | } 88 | 89 | function currentPath() { 90 | var href = window.location.pathname; 91 | href = href.substr(href.lastIndexOf('/') + 1); 92 | return href === '' ? 'index.html' : href; 93 | } 94 | 95 | // Create search form 96 | function createForm(value) { 97 | if ($searchForm) $searchForm.remove(); 98 | if ($searchLabel) $searchLabel.remove(); 99 | if ($searchInput) $searchInput.remove(); 100 | 101 | $searchForm = $('
', { 102 | 'class': 'book-search', 103 | 'role': 'search' 104 | }); 105 | 106 | $searchLabel = $('
122 | 123 | 172 | 173 |
174 |
175 | 180 | 181 |
182 |
183 | 184 |
185 |
186 |

1 インストール

187 |

実行にはいろいろ必要です。(Rでできる、と言いつつRAW画像の読み込みにPythonを使います。)

188 |
    189 |
  • R 190 |
  • 195 |
  • Python 196 |
      197 |
    • rawpy (RAW画像読み込むやつ)
    • 198 |
  • 199 |
200 |
201 |

1.1 Dockerを使う

202 |

インストールが面倒なものがあるので、Dockerを使うのがおすすめです。

203 |

全てインストール済みのDocker imageを用意しました。

204 |

https://hub.docker.com/r/igjit/r-raw-processing

205 |

docker pullして実行

206 |
docker pull igjit/r-raw-processing
207 | docker run --rm -p 8787:8787 -e PASSWORD=xxxx igjit/r-raw-processing
208 |

(xxxxは適宜変更してください。)

209 |

ブラウザで http://localhost:8787/ にアクセスして、Username: rstudio、 Password: (設定したもの) を入力するとRStudioが使えるはずです。

210 | 211 |
212 |
213 |
214 | 215 |
216 |
217 |
218 | 219 | 220 |
221 |
222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 263 | 264 | 265 | 266 | 267 | -------------------------------------------------------------------------------- /docs/section-2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 2 基本的な処理 | Rでできる - ゼロから作るRAW現像 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 |
122 | 123 | 172 | 173 |
174 |
175 | 180 | 181 |
182 |
183 | 184 |
185 |
186 |

2 基本的な処理

187 |
188 |

2.1 準備

189 |
190 |

2.1.1 RAW画像の準備

191 |

RStudioのTerminalタブで以下を実行して、RAW画像ファイルをダウンロードします。

192 |
wget https://github.com/moizumi99/camera_raw_processing/raw/master/chart.jpg
193 |
194 |
195 |

2.1.2 RAW画像の読み込み

196 |

必要なパッケージを読み込み

197 |
library(reticulate)
198 | library(imager)
199 |

reticulate::importでPythonのrawpyモジュールをインポート

200 |
rawpy <- import("rawpy")
201 |

画像の読み込み

202 |
raw_file <- "chart.jpg"
203 | raw <- rawpy$imread(raw_file)
204 |

画像データをRの行列に読み込み

205 |
raw_array <- raw$raw_image
206 |

サイズの確認

207 |
raw_array %>% dim
208 |
## [1] 2464 3280
209 |

画像を表示

210 |
raw_array %>% t %>% as.cimg %>% plot
211 |

212 |
213 |
214 |
215 |

2.2 簡易デモザイク処理

216 |
217 |

2.2.1 RAW画像の確認

218 |

拡大表示

219 |
raw_array %>% t %>% as.cimg %>%
220 |   imsub(x %inr% c(2641, 2700), y %inr% c(1341, 1400)) %>%
221 |   plot(interpolate = FALSE)
222 |

223 |

RAW画像のBayer配列を確認

224 |
raw$raw_pattern
225 |
##      [,1] [,2]
226 | ## [1,]    2    3
227 | ## [2,]    1    0
228 |

Bayer配列に対応するRGB画像を作リます。

229 |
raw_color <- array(0, c(dim(raw_array), 1, 3))
230 | raw_color[c(T, F), c(T, F), 1, 3] <- raw_array[c(T, F), c(T, F)]
231 | raw_color[c(T, F), c(F, T), 1, 2] <- raw_array[c(T, F), c(F, T)]
232 | raw_color[c(F, T), c(T, F), 1, 2] <- raw_array[c(F, T), c(T, F)]
233 | raw_color[c(F, T), c(F, T), 1, 1] <- raw_array[c(F, T), c(F, T)]
234 |

画像の行と列を入れ替える補助関数

235 |
ta <- function(a) aperm(a, c(2, 1, 3, 4))
236 |

表示

237 |
raw_color %>% ta %>% as.cimg %>% plot
238 |

239 |

拡大表示

240 |
raw_color %>% ta %>% as.cimg %>%
241 |   imsub(x %inr% c(2641, 2700), y %inr% c(1341, 1400)) %>%
242 |   plot(interpolate = FALSE)
243 |

244 |
245 |
246 |

2.2.2 簡易デモザイク処理

247 |

簡易デモザイク処理

248 |
simple_demosaic <- function(raw_array) {
249 |   dms_img <- array(0, c(dim(raw_array) / 2, 1, 3))
250 |   dms_img[,, 1, 3] <- raw_array[c(T, F), c(T, F)]
251 |   dms_img[,, 1, 2] <- (raw_array[c(T, F), c(F, T)] + raw_array[c(F, T), c(T, F)]) / 2
252 |   dms_img[,, 1, 1] <- raw_array[c(F, T), c(F, T)]
253 |   dms_img
254 | }
255 |

デモザイクして表示

256 |
raw_array %>% simple_demosaic %>% ta %>% as.cimg %>% plot
257 |

258 |
259 |
260 |
261 |

2.3 ホワイトバランス補正

262 |
263 |

2.3.1 ホワイトバランス補正処理

264 |

ホワイトバランスのゲインを確認

265 |
raw$camera_whitebalance
266 |
## [1] 1.128 1.000 2.546 1.000
267 |

ホワイトバランス補正処理

268 |
white_balance <- function(raw_array, wb_gain, raw_colors) {
269 |   norm <- wb_gain[2]
270 |   gain_matrix <- array(0, c(dim(raw_array)))
271 |   for (color in 0:3) {
272 |     gain_matrix[raw_colors == color] <- wb_gain[color + 1] / norm
273 |   }
274 |   raw_array * gain_matrix
275 | }
276 |

ホワイトバランス補正して簡易デモザイク

277 |
gain <- raw$camera_whitebalance
278 | colors <- raw$raw_colors
279 | dms_img <- white_balance(raw_array, gain, colors) %>% simple_demosaic
280 |

画像を0と1の間でノーマライズする補助関数

281 |
normalize <- function(img) {
282 |   img <- img / 1024
283 |   img[img < 0] <- 0
284 |   img[img > 1] <- 1
285 |   img
286 | }
287 |

表示

288 |
dms_img %>% normalize %>% ta %>% as.cimg %>% plot
289 |

290 |
291 |
292 |
293 |

2.4 ブラックレベル補正

294 |
295 |

2.4.1 ブラックレベル補正処理

296 |

ブラックレベルを確認

297 |
blc <- raw$black_level_per_channel
298 |
blc
299 |
## [1] 66 66 66 66
300 |

ブラックレベル補正処理

301 |
black_level_correction <- function(raw_array, blc, pattern) {
302 |   pattern <- pattern + 1
303 |   raw_array[c(T, F), c(T, F)] <- raw_array[c(T, F), c(T, F)] - blc[pattern[1, 1]]
304 |   raw_array[c(T, F), c(F, T)] <- raw_array[c(T, F), c(F, T)] - blc[pattern[1, 2]]
305 |   raw_array[c(F, T), c(T, F)] <- raw_array[c(F, T), c(T, F)] - blc[pattern[2, 1]]
306 |   raw_array[c(F, T), c(F, T)] <- raw_array[c(F, T), c(F, T)] - blc[pattern[2, 2]]
307 |   raw_array
308 | }
309 |

確認

310 |
dms_img <- raw_array %>%
311 |   black_level_correction(blc, raw$raw_pattern) %>%
312 |   white_balance(raw$camera_whitebalance, raw$raw_colors) %>%
313 |   simple_demosaic
314 | 
315 | dms_img %>% normalize %>% ta %>% as.cimg %>% plot
316 |

317 |
318 |
319 |
320 |

2.5 ガンマ補正

321 |
322 |

2.5.1 ガンマ補正とは

323 |

ガンマカーブ

324 |
curve(x ^ 2.2, 0, 1)
325 |

326 |

ガンマ補正カーブ

327 |
curve(x ^ (1 / 2.2), 0, 1)
328 |

329 |
330 |
331 |

2.5.2 ガンマ補正処理

332 |

ガンマ補正処理

333 |
gamma_correction <- function(input_img, gamma) {
334 |   input_img[input_img < 0] <- 0
335 |   input_img[input_img > 1] <- 1
336 |   input_img ^ (1 / gamma)
337 | }
338 |

確認

339 |
dms_img %>% normalize %>% gamma_correction(2.2) %>% ta %>% as.cimg %>% plot
340 |

341 | 342 |
343 |
344 |
345 |
346 | 347 |
348 |
349 |
350 | 351 | 352 |
353 |
354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 395 | 396 | 397 | 398 | 399 | -------------------------------------------------------------------------------- /index.Rmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Rでできる - ゼロから作るRAW現像" 3 | author: | 4 | [\@igjit](https://twitter.com/igjit) 5 | date: "`r Sys.Date()`" 6 | site: bookdown::bookdown_site 7 | documentclass: book 8 | output: 9 | bookdown::gitbook: default 10 | --- 11 | 12 | # はじめに {-} 13 | 14 | ## これは何 {-} 15 | 16 | Moiz氏の本、[PythonとColabでできる - ゼロから作るRAW現像](https://moiz.booth.pm/items/1307327) の内容をRで実装しようとするものです。 17 | 18 | ## ライセンス {-} 19 | 20 | この文章自体のライセンスはTBD 21 | 22 | 文章中の現像結果の画像は、Moiz氏が 23 | https://github.com/moizumi99/camera_raw_processing 24 | で公開しているRAW画像の派生物です。 25 | --------------------------------------------------------------------------------