Mercurial > repos > ecology > estimate_endem
annotate EstimEndem.R @ 1:f3a977826375 draft default tip
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit cbd0cb48be9f2aa5e30c917d6a9031ef1a7a83c8
| author | ecology | 
|---|---|
| date | Thu, 05 Jun 2025 16:50:45 +0000 | 
| parents | f7a55ccf2a3e | 
| children | 
| rev | line source | 
|---|---|
| 
0
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
1 #!/bin/Rscript | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
2 # phyloregions | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
3 | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
4 args = commandArgs(trailingOnly=TRUE) | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
5 #args = c("input/matrix_file", "input/tree_file.txt", "input/grid_aq_3_PF.shp") | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
6 | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
7 # library | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
8 library(phyloregion) | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
9 library(ape) | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
10 library(Matrix) | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
11 library(SparseArray) | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
12 library(sf) | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
13 library(sp) | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
14 library(raster) | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
15 library(dplyr) | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
16 | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
17 | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
18 save_sf <- function(){ | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
19 #st_write(phyloreg_sf[,-(3:5)], paste0(tempdir(), "/", "output.shp"), delete_layer = TRUE) | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
20 write_sf(phyloreg_sf, "output.shp") | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
21 } | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
22 | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
23 | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
24 if (length(args)<5){stop('Usage : sparseMatrix.csv tree.txt grid.shp nb_clust clust_method') | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
25 }else{ | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
26 # read enter files | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
27 comm_tree <- read.tree(args[1]) | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
28 | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
29 comm_matrix <- readSparseCSV(args[2], sep = "\t") | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
30 comm_matrix <- as(comm_matrix,"dgCMatrix") | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
31 | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
32 grid <- read_sf(args[3]) | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
33 | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
34 nb_clust <- as.integer(args[4]) | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
35 | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
36 clust_method <- toString(args[5]) | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
37 | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
38 # calculate phylogenetic Beta diversity - a phylogenetic distance matrix between grid cells | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
39 phylo_beta <- phylobeta(comm_matrix, comm_tree, index.family = "sorensen") | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
40 | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
41 #select the less distorting clustering method, best fitting between phylogenetic distances in phylobeta matrix | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
42 # and raw distances from branch lengths of the tree | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
43 select_linkage(phylo_beta[[1]]) | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
44 | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
45 #select optimal number of clusters with selected method | 
| 
1
 
f3a977826375
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit cbd0cb48be9f2aa5e30c917d6a9031ef1a7a83c8
 
ecology 
parents: 
0 
diff
changeset
 | 
46 optim <- optimal_phyloregion(phylo_beta[[3]]) | 
| 
0
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
47 print(paste("the best number of cluster is :", optim$optimal$k)) | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
48 #plot(optim$df$k, optim$df$ev, pch = 20) # k - nbr of clusters VS explained variance given k | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
49 # k has to be selected by a user | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
50 | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
51 # pass the grid cell to spatial format | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
52 grid_sp <- as_Spatial(grid) | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
53 #proj4string(grid_sp) | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
54 | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
55 # calculate phyloregions clusters | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
56 y <- phyloregion(phylo_beta[[3]], pol = grid_sp, k = nb_clust, method = clust_method) | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
57 #summary(y) | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
58 #phylo_nmds <- y$NMDS | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
59 | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
60 # take an shp spatial file for phyloregions and put it to sf format | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
61 phyloreg_sf <- y$pol | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
62 # print(st_crs(phyloreg_sf)) | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
63 #plot(phyloreg_sf) | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
64 phyloreg_sf <- st_as_sf(phyloreg_sf, crs = st_crs(grid)) | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
65 # print(st_crs(phyloreg_sf)) | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
66 | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
67 names(phyloreg_sf)[3:8] <- c("R_val", "G_val", "B_val", "r_code", "g_code", "b_code") | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
68 | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
69 | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
70 save_sf() | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
71 } | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
72 | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
73 | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
74 # sf_recup <- read_sf("output.shp") | 
| 
 
f7a55ccf2a3e
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Phylodiversity_workflow commit 0de557d919c26eb0b5ab61504bc597d551503ac3
 
ecology 
parents:  
diff
changeset
 | 
75 | 
