From 8f6461f2ad665197dedfdfe27acdb7ffc4d943a9 Mon Sep 17 00:00:00 2001 From: Adam Black Date: Thu, 27 Apr 2023 12:32:42 -0400 Subject: [PATCH 01/46] fix R check issues --- R/conceptSet.R | 2 +- tests/testthat/test-cohort.R | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/R/conceptSet.R b/R/conceptSet.R index e60dd174..c1b54de4 100644 --- a/R/conceptSet.R +++ b/R/conceptSet.R @@ -504,7 +504,7 @@ readConceptSet <- function(path, name, id = NULL) { conceptClassId = df[["concept_class_id"]] %||% "" %>% as.character() ) %>% dplyr::mutate( - dplyr::across(.data$conceptName:.data$conceptClassId, ~tidyr::replace_na(.x, "")) #convert na to "" + dplyr::across(conceptName:conceptClassId, ~tidyr::replace_na(.x, "")) #convert na to "" ) conceptList <- purrr::pmap(conceptDf, newConcept) } diff --git a/tests/testthat/test-cohort.R b/tests/testthat/test-cohort.R index 85776a6b..6b09d916 100644 --- a/tests/testthat/test-cohort.R +++ b/tests/testthat/test-cohort.R @@ -142,11 +142,13 @@ test_that("full cohort works without group", { test_that("Capr cohort generates on synpuf", { skip_if_not_installed("CirceR") + skip_if_not_installed("Eunomia") # need simple cohort for synpuf cd <- cohort( entry = entry( drug(cs(descendants(1118084), name = "celecoxib"), male()), - observationWindow = continuousObservation(365, 0) + observationWindow = continuousObservation(0, 0) + # observationWindow = continuousObservation(1, 0) # TODO this line causes an error. ) ) @@ -172,7 +174,6 @@ test_that("Capr cohort generates on synpuf", { ) connectionDetails <- Eunomia::getEunomiaConnectionDetails() - cohortTableNames <- CohortGenerator::getCohortTableNames("cohort") invisible(capture_output(suppressMessages({ From ff849d0dbecfe320d350c88cd87f0193ad45591a Mon Sep 17 00:00:00 2001 From: Adam Black Date: Thu, 27 Apr 2023 16:13:47 -0400 Subject: [PATCH 02/46] fix tests for r check --- DESCRIPTION | 2 +- NAMESPACE | 4 +- NEWS.md | 4 + R/cohort.R | 109 +++++------------- R/conceptSet.R | 21 +--- man/as.json.Rd | 22 ---- man/{compile.Cohort.Rd => compile-methods.Rd} | 15 ++- man/compile.Rd | 20 ++++ tests/testthat/test-cohort.R | 10 +- tests/testthat/test-conceptSet.R | 4 +- 10 files changed, 76 insertions(+), 135 deletions(-) delete mode 100644 man/as.json.Rd rename man/{compile.Cohort.Rd => compile-methods.Rd} (57%) create mode 100644 man/compile.Rd diff --git a/DESCRIPTION b/DESCRIPTION index dd036661..21f6aa44 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: Capr Title: Cohort Definition Application Programming -Version: 2.0.1 +Version: 2.0.2 Authors@R: c( person("Martin", "Lavallee", , "mdlavallee92@gmail.com", role = c("aut", "cre")), person("Adam", "Black", , "black@ohdsi.org", role = "aut") diff --git a/NAMESPACE b/NAMESPACE index 702b8477..126f4688 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -3,14 +3,13 @@ S3method(compile,Cohort) export("%>%") export(age) -export(as.json) export(atLeast) export(atMost) export(attrition) export(bt) export(censoringEvents) export(cohort) -export(compile.Cohort) +export(compile) export(condition) export(conditionEra) export(continuousObservation) @@ -68,6 +67,7 @@ export(withAtMost) export(writeCohort) export(writeConceptSet) exportMethods("==") +exportMethods(compile) import(dplyr) importFrom(generics,compile) importFrom(magrittr,"%>%") diff --git a/NEWS.md b/NEWS.md index 96f5c711..49633c1e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,7 @@ +Capr 2.0.2 +========== +- fix tests for CRAN + Capr 2.0.1 ========== - additions and corrections to vignettes and documentation diff --git a/R/cohort.R b/R/cohort.R index efb6524f..10ab9858 100644 --- a/R/cohort.R +++ b/R/cohort.R @@ -47,7 +47,6 @@ setClass("CohortExit", ) ## CohortEra---- - setClass("CohortEra", slots = c( eraDays = "integer", @@ -126,8 +125,6 @@ attrition <- function(..., expressionLimit = c("First", "All", "Last")) { } - - #' Function that creates a cohort exit object #' @param endStrategy the endStrategy object to specify for the exit #' @param censor the censoring criteria to specify for the exit @@ -318,50 +315,19 @@ toCirce <- function(cd) { return(cdCirce) } +#' Compile a Capr object to json +#' +#' @param object A Capr object such as a cohort, list of cohorts, or concept set. +#' @param ... Arguments passed on to jsonlite::toJSON. +#' e.g. `pretty = TRUE` for nicely formatted json. +#' +#' @return The json representation of the Capr object +#' @export +setGeneric("compile", function(object, ...) { standardGeneric("compile") }) -# cs1 <- cs(descendants(exclude(436665),440383,442306,4175329)) -# cs2 <- cs(descendants(exclude(436665),440383,4175329)) - - -# #' @export -# setMethod("as.list", "Cohort", function (x, ...) { -# -# # entry events -# entryConceptSets <- purrr::map(x@entry@entryEvents, collectConceptSets) -# -# # re-number concept sets -# allConceptSets <- entryConceptSets # need to add criteria concept sets -# -# r <- dedupConceptSets(allConceptSets) -# lookup <- r$lookup -# uniqueConceptSets <- purrr::map(r$uniqueConceptSets, function(x) { -# x <- as.list(x) -# x$id <- unname(lookup[x$id]) -# x -# }) -# -# cohortList <- list( -# ConceptSets = uniqueConceptSets, -# PrimaryCriteria = list(CriteriaList = purrr::map(x@entry@entryEvents, ~lst(!!.@domain := list(CodesetId = .@conceptSet@id))), -# ObservationWindow = list(priorDays = x@entry@observationWindow@priorDays, postDays = x@entry@observationWindow@postDays), -# PrimaryCriteriaLimit = list(Type = x@entry@primaryCriteriaLimit) -# ), -# QualifiedLimit = list(Type = x@entry@qualifiedLimit), -# ExpressionLimit = list(Type = x@attrition@expressionLimit), -# InclusionRules = x@attrition@rules, # TODO use map(rules, as.list) -# CensoringCriteria = x@exit@censor, -# CollapseSettings = list(collapseType = "ERA", EraPad = x@era@eraDays), -# CensorWindow = list() # TODO implement censor window -# ) -# -# cohortList$PrimaryCriteria$CriteriaList <- purrr::map(cohortList$PrimaryCriteria$CriteriaList, -# function(criteria) { -# criteria[[1]]$CodesetId <- unname(lookup[criteria[[1]]$CodesetId]) -# criteria -# }) -# cohortList -# }) - +compile.Cohort <- function(object, ...) { + as.character(jsonlite::toJSON(toCirce(object), auto_unbox = TRUE, ...)) +} #' Compile a Capr cohort to json #' @@ -370,26 +336,32 @@ toCirce <- function(cd) { #' e.g. `pretty = TRUE` for nicely formatted json. #' #' @return The json representation of Capr cohorts -#' @export #' @importFrom generics compile #' @exportS3Method compile Cohort +#' @export +#' @rdname compile-methods #' @examples #' \dontrun{ #' ch <- cohort(condition(cs(1,2))) #' compile(ch) #' } -compile.Cohort <- function(object, ...) { - as.character(jsonlite::toJSON(toCirce(object), auto_unbox = TRUE, ...)) -} - setMethod("compile", "Cohort", compile.Cohort) +compile.ConceptSet <- function(object, ...) { + x <- list(items = lapply(object@Expression, as.list)) + as.character(jsonlite::toJSON(x, auto_unbox = TRUE, ...)) +} -#' @rdname as.json -#' @aliases as.json,Cohort-method -setMethod("as.json", "Cohort", function(x, pretty = TRUE, ...) { - as.character(jsonlite::toJSON(toCirce(x), auto_unbox = TRUE, pretty = pretty, ...)) -}) +#' Compile a Capr Concept Set to json +#' +#' @export +#' @rdname compile-methods +#' @param object A Capr Concept Set created with `cs` +#' @param ... Arguments passed on to jsonlite::toJSON. +#' e.g. `pretty = TRUE` for nicely formatted json. +#' +#' @return The json representation of Capr cohorts +setMethod("compile", "ConceptSet", compile.ConceptSet) setMethod("show", "Cohort", function(object) { # TODO make this pretty on the console @@ -400,9 +372,7 @@ setMethod("show", "Cohort", function(object) { #' #' @param x A Capr cohort #' @param path The name of the file to create -#' #' @export -#' #' @examples #' \dontrun{ #' cs1 <- cs(descendants(exclude(436665),440383,442306,4175329)) @@ -415,9 +385,6 @@ writeCohort <- function(x, path) { checkmate::assertClass(x, "Cohort") checkmate::assertCharacter(path, len = 1, min.chars = 1, pattern = "\\.json$") - # ParallelLogger::logInfo( - # "Cohort written to", path - # ) toCirce(x) %>% jsonlite::write_json( path = path, @@ -440,25 +407,5 @@ generateCaprTemplate <- function(file, .capr) { #generate cohort from template .capr(conceptSet) - } -# writeCohort <- function(x, path, ...) { -# checkmate::assertClass(x, "Cohort") -# checkmate::assertCharacter(path, len = 1, min.chars = 1, pattern = "\\.json$") -# # check that concept set details are filled in -# check <- unlist(x$ConceptSets, recursive = TRUE) -# if (any(check[grepl( "CONCEPT_NAME|STANDARD_CONCEPT", names(check))] == "")) { -# rlang::abort("Concept set details are missing. Fill in concept set details using `getConceptSetDetails()`") -# } -# jsonlite::write_json(x = as.list(x), path = path, auto_unbox = TRUE, pretty = TRUE, ...) -# } - - - - - - - - - diff --git a/R/conceptSet.R b/R/conceptSet.R index c1b54de4..6bb4d0d7 100644 --- a/R/conceptSet.R +++ b/R/conceptSet.R @@ -353,19 +353,6 @@ setMethod("as.list", "ConceptSet", function(x){ 'expression' = list('items' = lapply(x@Expression, as.list))) }) -#' Coerce Capr object to json -#' @param x the capr object -#' @param pretty a toggle to make the json look nice, part of jsonlite -#' @param ... additional arguments passes to jsonlite::toJSON -#' @export -#' @docType methods -setGeneric("as.json", function(x, pretty = TRUE, ...) standardGeneric("as.json")) - -setMethod("as.json", "ConceptSet", function(x, pretty = TRUE, ...){ - items <- list(items = lapply(x@Expression, as.list)) - jsonlite::toJSON(x = items, pretty = pretty, auto_unbox = TRUE, ...) -}) - #' Save a concept set as a json file #' #' The resulting concept Set JSON file can be imported into Atlas. @@ -501,11 +488,9 @@ readConceptSet <- function(path, name, id = NULL) { conceptCode = df[["concept_code"]] %||% df[["concept code"]] %||% "" %>% as.character(), domainId = df[["domain_id"]] %||% df[["domain"]] %||% "" %>% as.character(), vocabularyId = df[["vocabulary_id"]] %||% df[["vocabulary"]] %||% "" %>% as.character(), - conceptClassId = df[["concept_class_id"]] %||% "" %>% as.character() - ) %>% - dplyr::mutate( - dplyr::across(conceptName:conceptClassId, ~tidyr::replace_na(.x, "")) #convert na to "" - ) + conceptClassId = df[["concept_class_id"]] %||% "" %>% as.character()) %>% + dplyr::mutate_if(is.character, ~tidyr::replace_na(.x, "")) + conceptList <- purrr::pmap(conceptDf, newConcept) } diff --git a/man/as.json.Rd b/man/as.json.Rd deleted file mode 100644 index 47a9cf1d..00000000 --- a/man/as.json.Rd +++ /dev/null @@ -1,22 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/conceptSet.R, R/cohort.R -\docType{methods} -\name{as.json} -\alias{as.json} -\alias{as.json,Cohort-method} -\title{Coerce Capr object to json} -\usage{ -as.json(x, pretty = TRUE, ...) - -\S4method{as.json}{Cohort}(x, pretty = TRUE, ...) -} -\arguments{ -\item{x}{the capr object} - -\item{pretty}{a toggle to make the json look nice, part of jsonlite} - -\item{...}{additional arguments passes to jsonlite::toJSON} -} -\description{ -Coerce Capr object to json -} diff --git a/man/compile.Cohort.Rd b/man/compile-methods.Rd similarity index 57% rename from man/compile.Cohort.Rd rename to man/compile-methods.Rd index 92ff735c..a3fc112e 100644 --- a/man/compile.Cohort.Rd +++ b/man/compile-methods.Rd @@ -1,22 +1,29 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/cohort.R -\name{compile.Cohort} -\alias{compile.Cohort} +\name{compile,Cohort-method} +\alias{compile,Cohort-method} +\alias{compile,ConceptSet-method} \title{Compile a Capr cohort to json} \usage{ -compile.Cohort(object, ...) +\S4method{compile}{Cohort}(object, ...) + +\S4method{compile}{ConceptSet}(object, ...) } \arguments{ -\item{object}{A Capr cohort or list of Capr cohorts} +\item{object}{A Capr Concept Set created with `cs`} \item{...}{Arguments passed on to jsonlite::toJSON. e.g. `pretty = TRUE` for nicely formatted json.} } \value{ +The json representation of Capr cohorts + The json representation of Capr cohorts } \description{ Compile a Capr cohort to json + +Compile a Capr Concept Set to json } \examples{ \dontrun{ diff --git a/man/compile.Rd b/man/compile.Rd new file mode 100644 index 00000000..4aed49b0 --- /dev/null +++ b/man/compile.Rd @@ -0,0 +1,20 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/cohort.R +\name{compile} +\alias{compile} +\title{Compile a Capr object to json} +\usage{ +compile(object, ...) +} +\arguments{ +\item{object}{A Capr object such as a cohort, list of cohorts, or concept set.} + +\item{...}{Arguments passed on to jsonlite::toJSON. +e.g. `pretty = TRUE` for nicely formatted json.} +} +\value{ +The json representation of the Capr object +} +\description{ +Compile a Capr object to json +} diff --git a/tests/testthat/test-cohort.R b/tests/testthat/test-cohort.R index 6b09d916..e164acf3 100644 --- a/tests/testthat/test-cohort.R +++ b/tests/testthat/test-cohort.R @@ -11,10 +11,10 @@ test_that("cohort entry works", { expect_s4_class(x, "Cohort") expect_type(as.list(x), "list") # TODO Do we keep as.list and as.json? expect_type(toCirce(x), "list") - expect_type(as.json(x), "character") + expect_type(compile(x), "character") - sql <- CirceR::cohortExpressionFromJson(as.json(x)) %>% + sql <- CirceR::cohortExpressionFromJson(compile(x)) %>% CirceR::buildCohortQuery(options = CirceR::createGenerateOptions(generateStats = TRUE)) expect_type(sql, "character") @@ -23,11 +23,11 @@ test_that("cohort entry works", { cs2 <- cs(descendants(exclude(436665),440383,442306)) x <- cohort(entry(condition(cs1), drug(cs2))) expect_s4_class(x, "Cohort") - expect_type(as.list(x), "list") # TODO Do we keep as.list and as.json? + expect_type(as.list(x), "list") expect_type(toCirce(x), "list") - expect_type(as.json(x), "character") + expect_type(compile(x), "character") - sql <- CirceR::cohortExpressionFromJson(as.json(x)) %>% + sql <- CirceR::cohortExpressionFromJson(compile(x)) %>% CirceR::buildCohortQuery(options = CirceR::createGenerateOptions(generateStats = TRUE)) expect_type(sql, "character") diff --git a/tests/testthat/test-conceptSet.R b/tests/testthat/test-conceptSet.R index 5067f2e8..a6e2fe86 100644 --- a/tests/testthat/test-conceptSet.R +++ b/tests/testthat/test-conceptSet.R @@ -113,8 +113,8 @@ test_that("read/writeConceptSet works", { expect_true(nrow(as.data.frame(cs4)) == 2) }) -test_that("as.json for concept sets", { +test_that("compile concept set to json", { giBleed <- cs(descendants(35208414), name = "Gastrointestinal hemorrhage") - expect_gt(nchar(as.json(giBleed)), 5) + expect_gt(nchar(compile(giBleed)), 5) }) From 999e692e5275d537b718d8bb4e68379a9466ae68 Mon Sep 17 00:00:00 2001 From: Adam Black Date: Thu, 27 Apr 2023 16:23:09 -0400 Subject: [PATCH 03/46] update site and github action workflow --- .github/workflows/R_CMD_check_Hades.yaml | 3 +- docs/404.html | 14 +- docs/LICENSE.html | 14 +- docs/articles/Capr-conceptSets.html | 74 ++--- docs/articles/Examples.html | 16 +- docs/articles/Using-Capr.html | 16 +- docs/articles/capr_design.html | 14 +- docs/articles/capr_templates.html | 14 +- docs/articles/index.html | 22 +- docs/authors.html | 14 +- docs/index.html | 18 +- docs/news/index.html | 18 +- docs/pkgdown.yml | 8 +- docs/reference/Capr-package.html | 14 +- docs/reference/CensoringCriteria-class.html | 14 +- docs/reference/Concept-class.html | 14 +- docs/reference/ConceptAttribute-class.html | 14 +- docs/reference/ConceptSet-class.html | 14 +- docs/reference/ConceptSetItem-class.html | 14 +- docs/reference/Criteria-class.html | 14 +- docs/reference/DrugExposureExit-class.html | 14 +- docs/reference/Endpoint-class.html | 14 +- docs/reference/EventAperture-class.html | 14 +- docs/reference/EventWindow-class.html | 14 +- docs/reference/FixedDurationExit-class.html | 14 +- docs/reference/Group-class.html | 14 +- docs/reference/LogicAttribute-class.html | 14 +- docs/reference/ObservationExit-class.html | 14 +- docs/reference/ObservationWindow-class.html | 14 +- docs/reference/Occurrence-class.html | 14 +- docs/reference/Query-class.html | 14 +- docs/reference/age.html | 14 +- .../as.data.frame-ConceptSet-method.html | 14 +- docs/reference/atLeast.html | 14 +- docs/reference/atMost.html | 14 +- docs/reference/attributes.html | 14 +- docs/reference/attrition.html | 14 +- docs/reference/bt.html | 14 +- docs/reference/censoringEvents.html | 14 +- docs/reference/cohort.html | 14 +- docs/reference/compile-methods.html | 142 ++++++++++ docs/reference/compile.html | 125 +++++++++ docs/reference/condition.html | 14 +- docs/reference/conditionEra.html | 14 +- docs/reference/continuousObservation.html | 14 +- docs/reference/cs.html | 14 +- docs/reference/daysOfSupply.html | 14 +- docs/reference/death.html | 14 +- docs/reference/drug.html | 14 +- docs/reference/drugEra.html | 14 +- docs/reference/drugExit.html | 14 +- docs/reference/drugQuantity.html | 14 +- docs/reference/drugRefills.html | 14 +- docs/reference/duringInterval.html | 14 +- docs/reference/endDate.html | 14 +- docs/reference/entry.html | 14 +- docs/reference/eq.html | 14 +- docs/reference/equals-methods.html | 14 +- docs/reference/era.html | 14 +- docs/reference/eventEnds.html | 14 +- docs/reference/eventStarts.html | 14 +- docs/reference/exactly.html | 14 +- docs/reference/exit.html | 14 +- docs/reference/firstOccurrence.html | 14 +- docs/reference/fixedExit.html | 14 +- docs/reference/generateCaprTemplate.html | 14 +- docs/reference/getConceptSetCall.html | 14 +- docs/reference/getConceptSetDetails.html | 14 +- docs/reference/gt.html | 14 +- docs/reference/gte.html | 14 +- docs/reference/index.html | 140 +++++----- docs/reference/lt.html | 14 +- docs/reference/lte.html | 14 +- docs/reference/measurement.html | 14 +- docs/reference/nbt.html | 14 +- docs/reference/nestedAttribute-class.html | 14 +- docs/reference/nestedWithAll.html | 14 +- docs/reference/nestedWithAny.html | 14 +- docs/reference/nestedWithAtLeast.html | 14 +- docs/reference/nestedWithAtMost.html | 14 +- docs/reference/observation.html | 14 +- docs/reference/observationExit.html | 14 +- docs/reference/opAttributeDate-class.html | 14 +- docs/reference/opAttributeInteger-class.html | 14 +- docs/reference/opAttributeNumeric-class.html | 14 +- docs/reference/pipe.html | 14 +- docs/reference/procedure.html | 14 +- docs/reference/rangeHigh.html | 14 +- docs/reference/rangeLow.html | 14 +- docs/reference/readConceptSet.html | 14 +- docs/reference/startDate.html | 14 +- docs/reference/toCirce.html | 14 +- docs/reference/unit.html | 14 +- docs/reference/valueAsNumber.html | 14 +- docs/reference/visit.html | 14 +- docs/reference/withAll.html | 14 +- docs/reference/withAny.html | 14 +- docs/reference/withAtLeast.html | 14 +- docs/reference/withAtMost.html | 14 +- docs/reference/writeCohort.html | 14 +- docs/reference/writeConceptSet.html | 14 +- docs/sitemap.xml | 262 +++++++++--------- 102 files changed, 1194 insertions(+), 910 deletions(-) create mode 100644 docs/reference/compile-methods.html create mode 100644 docs/reference/compile.html diff --git a/.github/workflows/R_CMD_check_Hades.yaml b/.github/workflows/R_CMD_check_Hades.yaml index 222a7928..5c88ca4b 100644 --- a/.github/workflows/R_CMD_check_Hades.yaml +++ b/.github/workflows/R_CMD_check_Hades.yaml @@ -48,9 +48,10 @@ jobs: steps: - uses: actions/checkout@v2 - - uses: r-lib/actions/setup-r@v1 + - uses: r-lib/actions/setup-r@v2 with: r-version: ${{ matrix.config.r }} + use-public-rspm: true - uses: r-lib/actions/setup-tinytex@v1 diff --git a/docs/404.html b/docs/404.html index 12505c0c..e96a15af 100644 --- a/docs/404.html +++ b/docs/404.html @@ -39,7 +39,7 @@ Capr - 2.0.1 + 2.0.2 @@ -59,16 +59,16 @@ Working with Concept Sets in Capr
  • - Capr Design Guide and Roadmap + Cohort Definition Examples
  • - Capr for Templating Cohort Definitions + Using Capr
  • - Cohort Definition Examples + Capr Design Guide and Roadmap
  • - Using Capr + Capr for Templating Cohort Definitions
  • @@ -78,7 +78,7 @@
  • Changelog
  • @@ -79,7 +79,7 @@ @@ -79,7 +79,7 @@ @@ -79,7 +79,7 @@ @@ -79,7 +79,7 @@ @@ -79,7 +79,7 @@
  • Changelog
  • Changelog
  • @@ -85,7 +85,7 @@
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • @@ -81,7 +81,7 @@
  • Changelog
  • @@ -82,7 +82,7 @@
    @@ -82,7 +82,7 @@ @@ -82,7 +82,7 @@ @@ -82,7 +82,7 @@ @@ -82,7 +82,7 @@ @@ -82,7 +82,7 @@
  • Changelog
  • Changelog
  • @@ -88,7 +88,7 @@
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog
  • Changelog