From 69ea602d90f78ad4e2e4a37cf653c53d46155740 Mon Sep 17 00:00:00 2001 From: David Smith Date: Tue, 28 Jan 2025 13:07:13 -0800 Subject: [PATCH 1/3] Update pkgdown.yml --- docs/pkgdown.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index bfa6545..77e0fa9 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -7,7 +7,7 @@ articles: Fitting: Fitting.html Scaling: Scaling.html Seasonality: Seasonality.html -last_built: 2025-01-28T18:29Z +last_built: 2025-01-28T20:55Z urls: reference: https://dd-harp.github.io/ramp.xds/reference article: https://dd-harp.github.io/ramp.xds/articles From 5520f9fc765945e974258fb9b58d2e04405037aa Mon Sep 17 00:00:00 2001 From: David Smith Date: Tue, 28 Jan 2025 14:15:17 -0800 Subject: [PATCH 2/3] minor bug fixes --- NAMESPACE | 1 + R/{convert.R => convert_terms.R} | 0 R/index_of_dispersal.R | 25 ++++----- R/plot-terms.R | 8 +-- R/pr2eir_history.R | 38 ++++++++++++++ R/season.R | 90 ++++++++++++++++---------------- docs/articles/Scaling.html | 34 ++++++------ docs/pkgdown.yml | 2 +- docs/reference/index.html | 4 +- man/add_orbits.Rd | 6 +-- man/add_orbits_px.Rd | 6 +-- man/compute_IoD_F.Rd | 6 +-- man/compute_IoD_S.Rd | 14 ++--- man/compute_IoD_pr.Rd | 12 ++--- man/mean_phase_peak.Rd | 4 +- man/pr_ts2eir_history.Rd | 29 ++++++++++ man/xde_eir2ni.Rd | 2 +- man/xde_eir2pr.Rd | 2 +- man/xde_pr2eir.Rd | 2 +- man/xde_pr2lambda.Rd | 2 +- man/xde_pr2m.Rd | 2 +- man/xde_pr2ni.Rd | 2 +- vignettes/Fitting.Rmd | 3 +- vignettes/Fitting.html | 36 +++---------- vignettes/Scaling.R | 7 ++- vignettes/Scaling.Rmd | 9 ++-- vignettes/Scaling.html | 17 +++--- 27 files changed, 193 insertions(+), 170 deletions(-) rename R/{convert.R => convert_terms.R} (100%) create mode 100644 R/pr2eir_history.R create mode 100644 man/pr_ts2eir_history.Rd diff --git a/NAMESPACE b/NAMESPACE index 0c39c7e..b1d10ce 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -23,6 +23,7 @@ export(mean_phase_peak) export(plot_eirVpr) export(plot_eirpr) export(pr2Lambda) +export(pr_ts2eir_history) export(ssMYZ) export(sse_season) export(update_by_ar) diff --git a/R/convert.R b/R/convert_terms.R similarity index 100% rename from R/convert.R rename to R/convert_terms.R diff --git a/R/index_of_dispersal.R b/R/index_of_dispersal.R index 611fb51..4930bea 100644 --- a/R/index_of_dispersal.R +++ b/R/index_of_dispersal.R @@ -1,43 +1,40 @@ -#' Compute the Index of Dispersal for a PR orbit -#' for the \eqn{i^{th}} element of -#' eirpr$scaling. +#' Compute the Index of Dispersal for a PR seasonal orbit +#' for the \eqn{i^{th}} element of `eirpr$scaling` #' +#' @param i the index of the orbit to be evaluated #' @param pars an **`xds`** object #' #' @export compute_IoD_pr = function(i, pars){ pr <- pars$outputs$eirpr$scaling[[i]]$pr - var(pr)/mean(pr) + stats::var(pr)/mean(pr) } #' Compute the Index of Dispersal for a seasonal pattern -#' S(t) over one year. This assumes that +#' \eqn{S(t)} over one year. This assumes that #' \deqn{\int_0^{365} S(t)dt = 365} +#' #' If in doubt, use [compute_IoD_F] #' -#' @param pars an **`xds`** object -#' @param clrs a [character] vector of colors -#' @param llty a [list] +#' @param S a function describing a seasonal pattern #' #' @export compute_IoD_S = function(S){ S2 = function(t, mean){(1-S(t))^2} - return(integrate(S2, 0, 365, mean=mean)$val/365) + return(stats::integrate(S2, 0, 365, mean=mean)$val/365) } #' Compute the Index of Dispersal for a function #' F(t) over one year. #' -#' @param pars an **`xds`** object -#' @param clrs a [character] vector of colors -#' @param llty a [list] +#' @param F a function describing a seasonality function (possibly not normalized) #' #' @export compute_IoD_F = function(F){ - mean = integrate(F, 0, 365)$val/365 + mean = stats::integrate(F, 0, 365)$val/365 F2 = function(t, mean){(mean-F(t))^2} - var = integrate(F2, 0, 365, mean=mean)$val/365 + var = stats::integrate(F2, 0, 365, mean=mean)$val/365 var/mean^2 } diff --git a/R/plot-terms.R b/R/plot-terms.R index 3beb749..581e359 100644 --- a/R/plot-terms.R +++ b/R/plot-terms.R @@ -88,9 +88,9 @@ eirpr_seasonal_profile = function(ix, pars, clrs){ #' Draw the orbit for the \eqn{i^{th}} element of #' eirpr$scaling. #' +#' @param i the index of the orbit to plot #' @param pars an **`xds`** object -#' @param clrs a [character] vector of colors -#' @param llty a [list] +#' @param clr a [character] vector of colors #' #' @export add_orbits = function(i, pars, clr){ @@ -103,9 +103,9 @@ add_orbits = function(i, pars, clr){ #' eirpr$scaling, and add points at the #' minimum and maximum eir and pr #' +#' @param i the index of the orbit to plot #' @param pars an **`xds`** object -#' @param clrs a [character] vector of colors -#' @param llty a [list] +#' @param clr a [character] vector of colors #' #' @export add_orbits_px = function(i, pars, clr){ diff --git a/R/pr2eir_history.R b/R/pr2eir_history.R new file mode 100644 index 0000000..8b01d84 --- /dev/null +++ b/R/pr2eir_history.R @@ -0,0 +1,38 @@ + + +#' @title Reconstruct a history of exposure from a PR time series +#' @description Construct a function describing the EIR, including +#' the mean EIR, the seasonal pattern, and the i +#' +#' +#' For set of paired a time series \eqn{X,} compute the +#' phase of a seasonal pattern for the EIR +#' @note This utility relies on `xds_cohort` +#' @param pr_ts the PR observed +#' @param times the times of the observations +#' @param model an `xds` model +#' @return an `xds` object +#' @export +pr_ts2eir_history <- function(pr_ts, times, model){ + + # First pass: set the mean eir from the mean pr + model <- xde_scaling_eir(model, 25) + mean_pr <- mean(pr_ts) + model$EIRpar$eir <- xde_pr2eir(mean_pr, model, TRUE) + + # First pass: fit the phase and amplitude + fit_phase_sin_season(pr_ts, times, model) -> phase0 + Fs0 <- make_F_sin(phase=phase0) + Fs1 <- fit_amplitude_sin_season(Fs0, pr_ts, times, model) + model$EIRpar$F_season <- make_function(Fs1) + + # First pass: fit the phase and amplitude + fit_phase_sin_season(pr_ts, times, model) -> phase0 + Fs0 <- make_F_sin(phase=phase0) + Fs1 <- fit_amplitude_sin_season(Fs0, pr_ts, times, model) + model$EIRpar$F_season <- make_function(Fs1) + + + + return(model) +} diff --git a/R/season.R b/R/season.R index 77648a0..2c80be5 100644 --- a/R/season.R +++ b/R/season.R @@ -1,8 +1,8 @@ #' @title Compute the phase of the peak -#' @description For a time series \eqn{X,} compute the +#' @description For a time series of paired values \eqn{c(t,X)} compute the #' phase, the time of the year when there is a peak #' @param t the times -#' @param X the data +#' @param X the variable #' @param window days around t #' @return a list with the mean peak and the values #' @export @@ -17,6 +17,48 @@ mean_phase_peak = function(t, X, window=170){ return(list(mean_peak = mean(peak), full = peak)) } + +#' @title Fit the phase for a time series +#' @description For a time series \eqn{X,} compute the +#' phase of a seasonal pattern for the EIR +#' @param data the PR observed +#' @param times the times of the observations +#' @param model an `xds` model +#' @param Fp parameters for +#' @return a list with the mean peak and the values +#' @export +fit_phase_sin_season <- function(data, times, model, Fp=NULL){ + if(is.null(Fp)) Fp <- makepar_F_sin() + ph <- seq(0, 360, by = 45) + ss = ph*0 + for(i in 1:length(ph)){ + Fp$phase <- ph[i] + ss[i] <- sse_season(Fp, data, times, model) + } + ix = which.min(ss) + ff <- ss[ix] + best <- ph[ix] + + ph1 <- seq(ph[ix]-40, ph[ix]+40, by=10) + ss1 = ph1*0 + for(i in 1:length(ph1)){ + Fp$phase <- ph1[i] + ss1[i] <- sse_season(Fp, data, times, model) + } + ix1 <- which.min(ss1) + ff1 <- ss1[ix1] + best1 <- ph1[ix1] + + if(ff1January 28, 2025
-

Also see SimBA

+

Also see SimBA


Load the required packages:

@@ -98,7 +98,7 @@ 

January 28, 2025

library(ramp.work) library(deSolve) library(viridisLite)
-
##  Loading ramp.work
+

Scaling

An important question in malaria is the relationship between various metrics, especially the relationships between mosquito density, the annual entomological inoculation rate (aEIR), the parasite rate (PR), @@ -127,45 +127,41 @@

xde_scaling_eirmob_library/Work

To illustrate, we pick a function describing a seasonal pattern using ramp.xds::make_F_sin

-
+
 tt <- seq(0, 730, by=5) 
 p1 <- makepar_F_sin(floor=0.2, pw=1.2)
 Fsin <- make_function(p1)
 plot(tt, Fsin(tt), type="l", xlab = "Time (Days)", ylab = "Seasonal Pattern")

Next, we set up a cohort model:

-
+
 xds_setup_cohort(Xname = "SIS", F_season=Fsin) -> sis
-
+
 xds_solve_cohort(sis) -> sis

The function xde_scaling_eir runs the model over a mesh of N=25 values:

-
+
 xde_scaling_eir(sis, 25) -> sis

The results are attached as sis$outputs$eirpr

-
+
 

-
+
 eirpr_seasonal_profile(c(5,10,15,20), sis, clrs = turbo(25))
-

xde_scaling_lambda

-
+
 Lo = list(
   F_season = Fsin
 )
 xds_setup(Xname = "SIS", Lopts = Lo) -> sis_full
-
+
 xds_solve(sis_full) -> sis_full
-
-devtools::load_all()
-
##  Loading ramp.work
-
+
 xde_scaling_lambda(sis_full, 1.1, 30) -> sis_full
-
+
 plot_eirpr(sis_full)

@@ -179,18 +175,18 @@

in mob_library/Work

We can run this for 50 randomly chosen values of the PfPR.

-
+
 preir_i = xde_pr2eir(c(0.001, runif(25, 0, 1), 0.999), sis)

The function flags any values that are outside of the acceptable range. This may not seem important for the SIS model, but the range of other models can be bounded, so we don’t want to return nonsense values.

-
+
 preir_i$errors
##         pr1         pr2         pr3 
 ## 0.001000000 0.007399441 0.999000000

We can plot the others:

-
+
 plot_eirpr(sis)
 with(sis$outputs$eirpr, points(aeir, pr, pch = 15))
 with(preir_i, points(365*eir, pr, pch = 19, col = "red"))
diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index 77e0fa9..56894ee 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -7,7 +7,7 @@ articles: Fitting: Fitting.html Scaling: Scaling.html Seasonality: Seasonality.html -last_built: 2025-01-28T20:55Z +last_built: 2025-01-28T22:15Z urls: reference: https://dd-harp.github.io/ramp.xds/reference article: https://dd-harp.github.io/ramp.xds/articles diff --git a/docs/reference/index.html b/docs/reference/index.html index 5abadd9..535fe31 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -199,11 +199,11 @@

Seasonality

compute_IoD_S()

-

Compute the Index of Dispersal for a seasonal pattern S(t) over one year. This assumes that $$\int_0^{365} S(t)dt = 365$$ If in doubt, use [compute_IoD_F]

+

Compute the Index of Dispersal for a seasonal pattern \(S(t)\) over one year. This assumes that $$\int_0^{365} S(t)dt = 365$$

compute_IoD_pr()

-

Compute the Index of Dispersal for a PR orbit for the \(i^{th}\) element of eirpr$scaling.

+

Compute the Index of Dispersal for a PR seasonal orbit for the \(i^{th}\) element of `eirpr$scaling`

eirpr_seasonal_profile()

diff --git a/man/add_orbits.Rd b/man/add_orbits.Rd index 7dee66b..28afffc 100644 --- a/man/add_orbits.Rd +++ b/man/add_orbits.Rd @@ -8,11 +8,11 @@ eirpr$scaling.} add_orbits(i, pars, clr) } \arguments{ -\item{pars}{an **`xds`** object} +\item{i}{the index of the orbit to plot} -\item{clrs}{a [character] vector of colors} +\item{pars}{an **`xds`** object} -\item{llty}{a [list]} +\item{clr}{a [character] vector of colors} } \description{ Draw the orbit for the \eqn{i^{th}} element of diff --git a/man/add_orbits_px.Rd b/man/add_orbits_px.Rd index 3262e40..ef8c066 100644 --- a/man/add_orbits_px.Rd +++ b/man/add_orbits_px.Rd @@ -9,11 +9,11 @@ minimum and maximum eir and pr} add_orbits_px(i, pars, clr) } \arguments{ -\item{pars}{an **`xds`** object} +\item{i}{the index of the orbit to plot} -\item{clrs}{a [character] vector of colors} +\item{pars}{an **`xds`** object} -\item{llty}{a [list]} +\item{clr}{a [character] vector of colors} } \description{ Draw the orbit for the \eqn{i^{th}} element of diff --git a/man/compute_IoD_F.Rd b/man/compute_IoD_F.Rd index 885d5e6..0f97874 100644 --- a/man/compute_IoD_F.Rd +++ b/man/compute_IoD_F.Rd @@ -8,11 +8,7 @@ F(t) over one year.} compute_IoD_F(F) } \arguments{ -\item{pars}{an **`xds`** object} - -\item{clrs}{a [character] vector of colors} - -\item{llty}{a [list]} +\item{F}{a function describing a seasonality function (possibly not normalized)} } \description{ Compute the Index of Dispersal for a function diff --git a/man/compute_IoD_S.Rd b/man/compute_IoD_S.Rd index 451b01c..7e16e3a 100644 --- a/man/compute_IoD_S.Rd +++ b/man/compute_IoD_S.Rd @@ -3,22 +3,14 @@ \name{compute_IoD_S} \alias{compute_IoD_S} \title{Compute the Index of Dispersal for a seasonal pattern -S(t) over one year. This assumes that -\deqn{\int_0^{365} S(t)dt = 365} -If in doubt, use [compute_IoD_F]} +\eqn{S(t)} over one year. This assumes that +\deqn{\int_0^{365} S(t)dt = 365}} \usage{ compute_IoD_S(S) } \arguments{ -\item{pars}{an **`xds`** object} - -\item{clrs}{a [character] vector of colors} - -\item{llty}{a [list]} +\item{S}{a function describing a seasonal pattern} } \description{ -Compute the Index of Dispersal for a seasonal pattern -S(t) over one year. This assumes that -\deqn{\int_0^{365} S(t)dt = 365} If in doubt, use [compute_IoD_F] } diff --git a/man/compute_IoD_pr.Rd b/man/compute_IoD_pr.Rd index 1807461..6f64cd6 100644 --- a/man/compute_IoD_pr.Rd +++ b/man/compute_IoD_pr.Rd @@ -2,17 +2,17 @@ % Please edit documentation in R/index_of_dispersal.R \name{compute_IoD_pr} \alias{compute_IoD_pr} -\title{Compute the Index of Dispersal for a PR orbit -for the \eqn{i^{th}} element of -eirpr$scaling.} +\title{Compute the Index of Dispersal for a PR seasonal orbit +for the \eqn{i^{th}} element of `eirpr$scaling`} \usage{ compute_IoD_pr(i, pars) } \arguments{ +\item{i}{the index of the orbit to be evaluated} + \item{pars}{an **`xds`** object} } \description{ -Compute the Index of Dispersal for a PR orbit -for the \eqn{i^{th}} element of -eirpr$scaling. +Compute the Index of Dispersal for a PR seasonal orbit +for the \eqn{i^{th}} element of `eirpr$scaling` } diff --git a/man/mean_phase_peak.Rd b/man/mean_phase_peak.Rd index 550c637..f9d8f8c 100644 --- a/man/mean_phase_peak.Rd +++ b/man/mean_phase_peak.Rd @@ -9,7 +9,7 @@ mean_phase_peak(t, X, window = 170) \arguments{ \item{t}{the times} -\item{X}{the data} +\item{X}{the variable} \item{window}{days around t} } @@ -17,6 +17,6 @@ mean_phase_peak(t, X, window = 170) a list with the mean peak and the values } \description{ -For a time series \eqn{X,} compute the +For a time series of paired values \eqn{c(t,X)} compute the phase, the time of the year when there is a peak } diff --git a/man/pr_ts2eir_history.Rd b/man/pr_ts2eir_history.Rd new file mode 100644 index 0000000..5c193d3 --- /dev/null +++ b/man/pr_ts2eir_history.Rd @@ -0,0 +1,29 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/pr2eir_history.R +\name{pr_ts2eir_history} +\alias{pr_ts2eir_history} +\title{Reconstruct a history of exposure from a PR time series} +\usage{ +pr_ts2eir_history(pr_ts, times, model) +} +\arguments{ +\item{pr_ts}{the PR observed} + +\item{times}{the times of the observations} + +\item{model}{an `xds` model} +} +\value{ +an `xds` object +} +\description{ +Construct a function describing the EIR, including +the mean EIR, the seasonal pattern, and the i + + +For set of paired a time series \eqn{X,} compute the +phase of a seasonal pattern for the EIR +} +\note{ +This utility relies on `xds_cohort` +} diff --git a/man/xde_eir2ni.Rd b/man/xde_eir2ni.Rd index 6e86f97..c36a823 100644 --- a/man/xde_eir2ni.Rd +++ b/man/xde_eir2ni.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/convert.R +% Please edit documentation in R/convert_terms.R \name{xde_eir2ni} \alias{xde_eir2ni} \title{Convert eir to ni} diff --git a/man/xde_eir2pr.Rd b/man/xde_eir2pr.Rd index 4757b9f..3397421 100644 --- a/man/xde_eir2pr.Rd +++ b/man/xde_eir2pr.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/convert.R +% Please edit documentation in R/convert_terms.R \name{xde_eir2pr} \alias{xde_eir2pr} \title{Convert eir to pr} diff --git a/man/xde_pr2eir.Rd b/man/xde_pr2eir.Rd index b1cc97f..9d9ffcf 100644 --- a/man/xde_pr2eir.Rd +++ b/man/xde_pr2eir.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/convert.R +% Please edit documentation in R/convert_terms.R \name{xde_pr2eir} \alias{xde_pr2eir} \title{Convert pr to eir} diff --git a/man/xde_pr2lambda.Rd b/man/xde_pr2lambda.Rd index a281a0f..77815b9 100644 --- a/man/xde_pr2lambda.Rd +++ b/man/xde_pr2lambda.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/convert.R +% Please edit documentation in R/convert_terms.R \name{xde_pr2lambda} \alias{xde_pr2lambda} \title{Convert pr to lambda} diff --git a/man/xde_pr2m.Rd b/man/xde_pr2m.Rd index 2f3f4e6..e2c5f57 100644 --- a/man/xde_pr2m.Rd +++ b/man/xde_pr2m.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/convert.R +% Please edit documentation in R/convert_terms.R \name{xde_pr2m} \alias{xde_pr2m} \title{Convert pr to mosquito density} diff --git a/man/xde_pr2ni.Rd b/man/xde_pr2ni.Rd index 97b1b04..75f3414 100644 --- a/man/xde_pr2ni.Rd +++ b/man/xde_pr2ni.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/convert.R +% Please edit documentation in R/convert_terms.R \name{xde_pr2ni} \alias{xde_pr2ni} \title{Convert pr to ni} diff --git a/vignettes/Fitting.Rmd b/vignettes/Fitting.Rmd index 54a1781..b66100a 100644 --- a/vignettes/Fitting.Rmd +++ b/vignettes/Fitting.Rmd @@ -2,8 +2,7 @@ title: "Fitting Models to Data" date: "`r format(Sys.time(), '%B %d, %Y')`" output: - html_document: - theme: paper + html_document vignette: > %\VignetteIndexEntry{Fitting Models to Data} %\VignetteEngine{knitr::rmarkdown} diff --git a/vignettes/Fitting.html b/vignettes/Fitting.html index c7c6f55..210c8a2 100644 --- a/vignettes/Fitting.html +++ b/vignettes/Fitting.html @@ -10,7 +10,7 @@ - + Fitting Models to Data @@ -31,31 +31,7 @@ !function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 -