From 8be33a6a78227f5e5dc51164e4ed944a29d636c6 Mon Sep 17 00:00:00 2001 From: erex Date: Fri, 10 May 2024 13:21:58 +0100 Subject: [PATCH 1/8] prior to building pkgdown site --- .Rbuildignore | 3 + NEWS | 122 - NEWS.md | 113 + README.md | 26 +- _pkgdown.yml | 43 + docs/404.html | 105 + docs/Clarity.txt | 7 + docs/articles/GettingStarted.html | 757 ++ .../figure-html/density-1.png | Bin 0 -> 16724 bytes .../figure-html/densitygam-1.png | Bin 0 -> 16710 bytes .../figure-html/detect-1.png | Bin 0 -> 5883 bytes .../figure-html/hist.results-1.png | Bin 0 -> 5705 bytes .../figure-html/parallel.survey-1.png | Bin 0 -> 9689 bytes .../figure-html/paralleltransects-1.png | Bin 0 -> 3954 bytes .../figure-html/region-1.png | Bin 0 -> 3889 bytes .../figure-html/zigzag.survey-1.png | Bin 0 -> 10679 bytes .../figure-html/zigzagtransects-1.png | Bin 0 -> 4675 bytes docs/articles/SimulationDiagram.png | Bin 0 -> 79501 bytes docs/articles/dsims-examples.html | 1394 ++ .../figure-html/checksim-1.png | Bin 0 -> 8244 bytes .../figure-html/checksim2-1.png | Bin 0 -> 8323 bytes .../figure-html/covtruncation-1.png | Bin 0 -> 3783 bytes .../figure-html/density-1.png | Bin 0 -> 2589 bytes .../figure-html/density2-1.png | Bin 0 -> 12594 bytes .../figure-html/detect1-1.png | Bin 0 -> 3610 bytes .../figure-html/detect2-1.png | Bin 0 -> 4710 bytes .../figure-html/detectionfunction-1.png | Bin 0 -> 4433 bytes .../figure-html/makeplots-1.png | Bin 0 -> 3665 bytes .../figure-html/region-1.png | Bin 0 -> 2346 bytes .../figure-html/simhist-1.png | Bin 0 -> 3881 bytes .../figure-html/transects-1.png | Bin 0 -> 2317 bytes .../figure-html/truncdists1-1.png | Bin 0 -> 4434 bytes .../figure-html/truncdists2-1.png | Bin 0 -> 6616 bytes docs/articles/dsims_grouped_strata.html | 358 + .../figure-html/density-1.png | Bin 0 -> 27452 bytes .../figure-html/design_one-1.png | Bin 0 -> 10974 bytes .../figure-html/design_two-1.png | Bin 0 -> 11091 bytes .../figure-html/egsurvey-1.png | Bin 0 -> 11578 bytes .../figure-html/makereg-1.png | Bin 0 -> 9524 bytes .../figure-html/truedetect-1.png | Bin 0 -> 7798 bytes docs/articles/index.html | 91 + docs/authors.html | 110 + .../KFOmCnqEu92Fr1Mu4WxKOzY.woff2 | Bin 0 -> 7112 bytes .../Roboto-0.4.9/KFOmCnqEu92Fr1Mu4mxK.woff2 | Bin 0 -> 15744 bytes .../KFOmCnqEu92Fr1Mu5mxKOzY.woff2 | Bin 0 -> 9628 bytes .../KFOmCnqEu92Fr1Mu72xKOzY.woff2 | Bin 0 -> 15344 bytes .../KFOmCnqEu92Fr1Mu7GxKOzY.woff2 | Bin 0 -> 11872 bytes .../KFOmCnqEu92Fr1Mu7WxKOzY.woff2 | Bin 0 -> 5560 bytes .../KFOmCnqEu92Fr1Mu7mxKOzY.woff2 | Bin 0 -> 1484 bytes docs/deps/Roboto-0.4.9/font.css | 63 + .../bootstrap-5.3.1/bootstrap.bundle.min.js | 7 + .../bootstrap.bundle.min.js.map | 1 + docs/deps/bootstrap-5.3.1/bootstrap.min.css | 5 + docs/deps/data-deps.txt | 5 + docs/deps/jquery-3.6.0/jquery-3.6.0.js | 10881 ++++++++++++++++ docs/deps/jquery-3.6.0/jquery-3.6.0.min.js | 2 + docs/deps/jquery-3.6.0/jquery-3.6.0.min.map | 1 + docs/index.html | 171 + docs/link.svg | 12 + docs/news/index.html | 175 + docs/pkgdown.js | 156 + docs/pkgdown.yml | 9 + docs/reference/DS.Analysis-class.html | 157 + docs/reference/Density-class.html | 133 + docs/reference/Density.Summary-class.html | 106 + docs/reference/Detectability-class.html | 124 + docs/reference/Population-class.html | 139 + .../Population.Description-class.html | 153 + docs/reference/Rplot001.png | Bin 0 -> 29704 bytes docs/reference/Rplot002.png | Bin 0 -> 16065 bytes docs/reference/Simulation-class.html | 245 + docs/reference/Simulation.Summary-class.html | 107 + docs/reference/Survey-class.html | 98 + docs/reference/Survey.LT-class.html | 111 + docs/reference/Survey.PT-class.html | 111 + docs/reference/add.hotspot-methods.html | 127 + docs/reference/analyse.data-methods.html | 151 + docs/reference/description.summary.html | 103 + docs/reference/dsims-package.html | 116 + .../generate.population-methods.html | 135 + ...generate.transects.Simulation-methods.html | 114 + docs/reference/get.N-methods.html | 108 + docs/reference/get.densities-methods.html | 116 + docs/reference/histogram.N.ests-methods.html | 118 + docs/reference/index.html | 287 + docs/reference/make.density-1.png | Bin 0 -> 73730 bytes docs/reference/make.density.html | 191 + docs/reference/make.detectability-1.png | Bin 0 -> 89344 bytes docs/reference/make.detectability.html | 190 + docs/reference/make.ds.analysis.html | 209 + .../make.population.description-1.png | Bin 0 -> 49179 bytes .../make.population.description-2.png | Bin 0 -> 46988 bytes .../make.population.description.html | 221 + docs/reference/make.simulation-1.png | Bin 0 -> 91528 bytes docs/reference/make.simulation.html | 350 + docs/reference/plot-methods.html | 139 + docs/reference/plot.Density-methods.html | 137 + .../reference/plot.Detectability-methods.html | 160 + docs/reference/plot.Population-methods.html | 126 + docs/reference/run.simulation-methods.html | 153 + docs/reference/run.survey-methods.html | 148 + docs/reference/rztpois.html | 124 + docs/reference/save.sim.results-methods.html | 117 + docs/reference/set.densities-methods.html | 110 + .../show.Density.Summary-methods.html | 106 + docs/reference/show.Simulation-methods.html | 106 + .../show.Simulation.Summary-methods.html | 107 + docs/reference/summary.Density-methods.html | 110 + .../reference/summary.Simulation-methods.html | 119 + docs/search.json | 1 + docs/sitemap.xml | 147 + vignettes/GettingStarted.Rmd | 24 +- vignettes/SimulationDiagram.png | Bin 0 -> 79501 bytes vignettes/apa.csl | 1539 +++ vignettes/dsims-examples.Rmd | 937 ++ vignettes/dsims_grouped_strata.Rmd | 320 + vignettes/files/sim.results.ROBJ | Bin 0 -> 867896 bytes vignettes/refs-grouped.bib | 81 + vignettes/refs-transition.bib | 87 + vignettes/results/covmod_results_list.ROBJ | Bin 0 -> 1149250 bytes vignettes/results/covmod_summary_list.ROBJ | Bin 0 -> 2267 bytes vignettes/results/male_param.ROBJ | Bin 0 -> 38268 bytes vignettes/results/results_cov_list.ROBJ | Bin 0 -> 1202733 bytes vignettes/results/results_list.ROBJ | Bin 0 -> 712895 bytes vignettes/results/sigma_est.ROBJ | Bin 0 -> 36502 bytes vignettes/results/sim.ROBJ | Bin 0 -> 237172 bytes vignettes/results/sim_cov.ROBJ | Bin 0 -> 240538 bytes vignettes/results/summary_cov_list.ROBJ | Bin 0 -> 2345 bytes vignettes/results/summary_list.ROBJ | Bin 0 -> 1746 bytes 129 files changed, 23389 insertions(+), 146 deletions(-) delete mode 100644 NEWS create mode 100644 NEWS.md create mode 100644 _pkgdown.yml create mode 100644 docs/404.html create mode 100644 docs/Clarity.txt create mode 100644 docs/articles/GettingStarted.html create mode 100644 docs/articles/GettingStarted_files/figure-html/density-1.png create mode 100644 docs/articles/GettingStarted_files/figure-html/densitygam-1.png create mode 100644 docs/articles/GettingStarted_files/figure-html/detect-1.png create mode 100644 docs/articles/GettingStarted_files/figure-html/hist.results-1.png create mode 100644 docs/articles/GettingStarted_files/figure-html/parallel.survey-1.png create mode 100644 docs/articles/GettingStarted_files/figure-html/paralleltransects-1.png create mode 100644 docs/articles/GettingStarted_files/figure-html/region-1.png create mode 100644 docs/articles/GettingStarted_files/figure-html/zigzag.survey-1.png create mode 100644 docs/articles/GettingStarted_files/figure-html/zigzagtransects-1.png create mode 100644 docs/articles/SimulationDiagram.png create mode 100644 docs/articles/dsims-examples.html create mode 100644 docs/articles/dsims-examples_files/figure-html/checksim-1.png create mode 100644 docs/articles/dsims-examples_files/figure-html/checksim2-1.png create mode 100644 docs/articles/dsims-examples_files/figure-html/covtruncation-1.png create mode 100644 docs/articles/dsims-examples_files/figure-html/density-1.png create mode 100644 docs/articles/dsims-examples_files/figure-html/density2-1.png create mode 100644 docs/articles/dsims-examples_files/figure-html/detect1-1.png create mode 100644 docs/articles/dsims-examples_files/figure-html/detect2-1.png create mode 100644 docs/articles/dsims-examples_files/figure-html/detectionfunction-1.png create mode 100644 docs/articles/dsims-examples_files/figure-html/makeplots-1.png create mode 100644 docs/articles/dsims-examples_files/figure-html/region-1.png create mode 100644 docs/articles/dsims-examples_files/figure-html/simhist-1.png create mode 100644 docs/articles/dsims-examples_files/figure-html/transects-1.png create mode 100644 docs/articles/dsims-examples_files/figure-html/truncdists1-1.png create mode 100644 docs/articles/dsims-examples_files/figure-html/truncdists2-1.png create mode 100644 docs/articles/dsims_grouped_strata.html create mode 100644 docs/articles/dsims_grouped_strata_files/figure-html/density-1.png create mode 100644 docs/articles/dsims_grouped_strata_files/figure-html/design_one-1.png create mode 100644 docs/articles/dsims_grouped_strata_files/figure-html/design_two-1.png create mode 100644 docs/articles/dsims_grouped_strata_files/figure-html/egsurvey-1.png create mode 100644 docs/articles/dsims_grouped_strata_files/figure-html/makereg-1.png create mode 100644 docs/articles/dsims_grouped_strata_files/figure-html/truedetect-1.png create mode 100644 docs/articles/index.html create mode 100644 docs/authors.html create mode 100644 docs/deps/Roboto-0.4.9/KFOmCnqEu92Fr1Mu4WxKOzY.woff2 create mode 100644 docs/deps/Roboto-0.4.9/KFOmCnqEu92Fr1Mu4mxK.woff2 create mode 100644 docs/deps/Roboto-0.4.9/KFOmCnqEu92Fr1Mu5mxKOzY.woff2 create mode 100644 docs/deps/Roboto-0.4.9/KFOmCnqEu92Fr1Mu72xKOzY.woff2 create mode 100644 docs/deps/Roboto-0.4.9/KFOmCnqEu92Fr1Mu7GxKOzY.woff2 create mode 100644 docs/deps/Roboto-0.4.9/KFOmCnqEu92Fr1Mu7WxKOzY.woff2 create mode 100644 docs/deps/Roboto-0.4.9/KFOmCnqEu92Fr1Mu7mxKOzY.woff2 create mode 100644 docs/deps/Roboto-0.4.9/font.css create mode 100644 docs/deps/bootstrap-5.3.1/bootstrap.bundle.min.js create mode 100644 docs/deps/bootstrap-5.3.1/bootstrap.bundle.min.js.map create mode 100644 docs/deps/bootstrap-5.3.1/bootstrap.min.css create mode 100644 docs/deps/data-deps.txt create mode 100644 docs/deps/jquery-3.6.0/jquery-3.6.0.js create mode 100644 docs/deps/jquery-3.6.0/jquery-3.6.0.min.js create mode 100644 docs/deps/jquery-3.6.0/jquery-3.6.0.min.map create mode 100644 docs/index.html create mode 100644 docs/link.svg create mode 100644 docs/news/index.html create mode 100644 docs/pkgdown.js create mode 100644 docs/pkgdown.yml create mode 100644 docs/reference/DS.Analysis-class.html create mode 100644 docs/reference/Density-class.html create mode 100644 docs/reference/Density.Summary-class.html create mode 100644 docs/reference/Detectability-class.html create mode 100644 docs/reference/Population-class.html create mode 100644 docs/reference/Population.Description-class.html create mode 100644 docs/reference/Rplot001.png create mode 100644 docs/reference/Rplot002.png create mode 100644 docs/reference/Simulation-class.html create mode 100644 docs/reference/Simulation.Summary-class.html create mode 100644 docs/reference/Survey-class.html create mode 100644 docs/reference/Survey.LT-class.html create mode 100644 docs/reference/Survey.PT-class.html create mode 100644 docs/reference/add.hotspot-methods.html create mode 100644 docs/reference/analyse.data-methods.html create mode 100644 docs/reference/description.summary.html create mode 100644 docs/reference/dsims-package.html create mode 100644 docs/reference/generate.population-methods.html create mode 100644 docs/reference/generate.transects.Simulation-methods.html create mode 100644 docs/reference/get.N-methods.html create mode 100644 docs/reference/get.densities-methods.html create mode 100644 docs/reference/histogram.N.ests-methods.html create mode 100644 docs/reference/index.html create mode 100644 docs/reference/make.density-1.png create mode 100644 docs/reference/make.density.html create mode 100644 docs/reference/make.detectability-1.png create mode 100644 docs/reference/make.detectability.html create mode 100644 docs/reference/make.ds.analysis.html create mode 100644 docs/reference/make.population.description-1.png create mode 100644 docs/reference/make.population.description-2.png create mode 100644 docs/reference/make.population.description.html create mode 100644 docs/reference/make.simulation-1.png create mode 100644 docs/reference/make.simulation.html create mode 100644 docs/reference/plot-methods.html create mode 100644 docs/reference/plot.Density-methods.html create mode 100644 docs/reference/plot.Detectability-methods.html create mode 100644 docs/reference/plot.Population-methods.html create mode 100644 docs/reference/run.simulation-methods.html create mode 100644 docs/reference/run.survey-methods.html create mode 100644 docs/reference/rztpois.html create mode 100644 docs/reference/save.sim.results-methods.html create mode 100644 docs/reference/set.densities-methods.html create mode 100644 docs/reference/show.Density.Summary-methods.html create mode 100644 docs/reference/show.Simulation-methods.html create mode 100644 docs/reference/show.Simulation.Summary-methods.html create mode 100644 docs/reference/summary.Density-methods.html create mode 100644 docs/reference/summary.Simulation-methods.html create mode 100644 docs/search.json create mode 100644 docs/sitemap.xml create mode 100644 vignettes/SimulationDiagram.png create mode 100644 vignettes/apa.csl create mode 100644 vignettes/dsims-examples.Rmd create mode 100644 vignettes/dsims_grouped_strata.Rmd create mode 100644 vignettes/files/sim.results.ROBJ create mode 100644 vignettes/refs-grouped.bib create mode 100644 vignettes/refs-transition.bib create mode 100644 vignettes/results/covmod_results_list.ROBJ create mode 100644 vignettes/results/covmod_summary_list.ROBJ create mode 100644 vignettes/results/male_param.ROBJ create mode 100644 vignettes/results/results_cov_list.ROBJ create mode 100644 vignettes/results/results_list.ROBJ create mode 100644 vignettes/results/sigma_est.ROBJ create mode 100644 vignettes/results/sim.ROBJ create mode 100644 vignettes/results/sim_cov.ROBJ create mode 100644 vignettes/results/summary_cov_list.ROBJ create mode 100644 vignettes/results/summary_list.ROBJ diff --git a/.Rbuildignore b/.Rbuildignore index 8d5c8d8..2408bbd 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -5,3 +5,6 @@ cran-comments.md ^Meta$ ^CRAN-RELEASE$ ^\.github$ +^_pkgdown\.yml$ +^docs$ +^pkgdown$ diff --git a/NEWS b/NEWS deleted file mode 100644 index 3ffe293..0000000 --- a/NEWS +++ /dev/null @@ -1,122 +0,0 @@ -dsims 1.0.4 -------------------- - -Bug Fixes - - * Fixed a bug when generating the simulation summary which meant that only the first value of mean.k and n.miss.dists was repeated rather than including all values in the summary tables. Issue #84 - * The make.simulation function now throws an error if the P2 ER variance estimator is used with line transects designs (rather than after the simulation has completed). Issue #61 - -dsims 1.0.3 -------------------- - -Bug Fixes - - * Simulations were crashing if there were zero detections - now fixed and warnings displayed instead. Issue #77 - * Errors were also occuring when there were no individuals generated in a stratum, now fixed. Issue #80 - * Detections are no longer permitted across stratum boundaries - this was causing errors due to NA area values in the data. This is inline with expected protocols on surveys. Issue #81 - * Remove dependence on sp and rgeos. Issue #42 - -dsims 1.0.2 -------------------- - -Bug Fixes - - * Fixed transparency issue with detection distance histograms when saving to wmf (generated a warning in Distance for Windows) - * Only print summary table for individuals if animals occur as individuals (and not as clusters) - * Updated references to examples - * Fixed grouped strata bugs - * Can now read transect shapefiles in from file and will convert all to one strata if global region used. This allows regional simulations from stratified designs in distance for windows. - - -dsims 1.0.1 -------------------- - -New Features - - * Added save.sim.results function so that simulation results can be written to .txt files. This is mainly useful for Distance for Windows users as R users would probably prefer to just save the whole simulation object to file. - * Can write the simulation progress to file - this allows the simulation progress to be displayed when simulations are being run from Distance for Windows using dsims. - * Add segmented trackline design as an option in simulation summary (currently these design can only be generated inside Distance for Windows for use in simulations). - -Bug Fixes - - * Partial fix to the bug relating to grouping strata at the analysis stage. Strata grouping should now work when detections are of individuals. Still needs to be fixed for when clusters are present. - -dsims 1.0.0 -------------------- - -New Features - - * Reading transects from file - this functionality is primarily envisionged for use from within Distance for Windows. - -Enhancements - - * New routine which will generate covariate values from a zero-truncated Poisson distribution for non integer values. - * There is now no lower limit on the number of detections in simulations as this was introducing bias. There is now a warning system in place. Very low numbers of detections may cause issues fitting. There must be more detections than there are parameters in the model for the model to have a chance of fitting successfully. Note that distance sampling good practice recommends minimum of 60-80 detections for estimating the detection function for line transects and more for points. - * Improved histogram.N.ests function will now plot either a histogram of estimates of individuals or clusters. It also provides the use.max.reps argument so that the plot can be consistent with the option selected for the simulation summary. - -Bug Fixes - - * Fixed simulations where cluster size was included - there was a formatting change in mrds output tables. - * Added a check for repeat model definitions. - * Add code to deal with equal model criteria values. - * Fixed bug when no simulation repetitions had been successful - * AICc method fixed - * Warning indexes from parallel runs are now fixed - -dsims 0.2.2 / 0.2.3 -------------------- - -Bug Fixes - - * Minor modifications to stay CRAN compliant. - -dsims 0.2.1 ----------- - -New Features - - * Now interfaces with new syntax in Distance >= 1.0.5 (it will remain backwards compatible with older versions of Distance for this release) - -Bug Fixes - - * Plus sampling simulations now issue a warning and modify to minus sampling - these should not have run in previous versions. - * Fixed default simulation truncation distance to 50 in the analyses (will fix dssd to be consistent with this in release 0.3.2) - * Fixed the recording of warning / error indexing in parallel simulations - -dsims 0.2.0 ----------- - -New Features - - * Delta selection criteria is now recorded as the difference in informtion criteria between the top 2 best fitting models as determined by the information criteria.] - * The iteration numbers generating warnings or errors are now stored and displayed so user can choose what to do with these results. - -Bug Fixes - - * Fixed missing RMSE values - * Fix strata re-ordering for cluster size - * Models with -Inf information criteria no longer selected - * Models with dht = NULL are no longer selected - * Models which predict detection values < 1 no longer cause errors and are correctly excluded. - * Detectibility parameters for continuous covariates are now checked and validated. - * Fix situation where all reps are to be excluded due to problematic model fitting. - * There was a bug in the underlying code on windows machines that meant that segmented lines were not being clipped properly. The dependencies of sf have not been updated and the issue fixed. Please update sf if you run into missing segment transects. - -dsims 0.1.0 ----------- - -Enhancements - - * Introducing the new Distance Sampling Simulation package. dsims is our latest simulation package which interfaces with dssd so designs can be generated within R, thus making the simulation process a lot easier. Dsims also makes use of ggplot to produce cleaner looking graphics. - * Region and Design: dsims can make use of the region creation and all the designs currently in dssd. - * Density: dsims can generate density objects from constant values for each strata, from fitted mgcv gam objects with x and y as explantory covariates and from formulas of x and y. - * Density: Density grids are stored as sf polygons with their associated x, y central coordinates and density value - * Population Description: Populations can either be created with fixed population sizes or based on the densities in the density grid. - * Population Description: Both discrete and continuous individual level covariates can be included in the population - * Detectablity: The detectability of the population can be described by either half normal, hazard rate or uniform detection shapes. Parameters can vary by stratum - * Detectablity: Covariate parameters can be included to modify the scale parameter for each individual based on their covariate values. - * Analyses:A number of detection function analyses can be incorporated in a simulation and the model with the lowest criterion (AIC / AICc / BIC) will be selected. - * Analyses:Defining analyses is based on the arguments which are passed to our Distance R library. - * Simulations: Simulations can be run in serial or parallel and their progress is output. - * Simulations: The function run.survey can be used to create a single instance of a survey and check the simulation setup. - diff --git a/NEWS.md b/NEWS.md new file mode 100644 index 0000000..79e2b1e --- /dev/null +++ b/NEWS.md @@ -0,0 +1,113 @@ +# dsims 1.0.4 + +Bug Fixes + +* Fixed a bug when generating the simulation summary which meant that only the first value of mean.k and n.miss.dists was repeated rather than including all values in the summary tables. Issue #84 +* The make.simulation function now throws an error if the P2 ER variance estimator is used with line transects designs (rather than after the simulation has completed). Issue #61 + +# dsims 1.0.3 + +Bug Fixes + +* Simulations were crashing if there were zero detections - now fixed and warnings displayed instead. Issue #77 +* Errors were also occurring when there were no individuals generated in a stratum, now fixed. Issue #80 +* Detections are no longer permitted across stratum boundaries - this was causing errors due to NA area values in the data. This is inline with expected protocols on surveys. Issue #81 +* Remove dependence on sp and rgeos. Issue #42 + +# dsims 1.0.2 + +Bug Fixes + +* Fixed transparency issue with detection distance histograms when saving to wmf (generated a warning in Distance for Windows) +* Only print summary table for individuals if animals occur as individuals (and not as clusters) +* Updated references to examples +* Fixed grouped strata bugs +* Can now read transect shapefiles in from file and will convert all to one strata if global region used. This allows regional simulations from stratified designs in distance for windows. + + +# dsims 1.0.1 + +New Features + +* Added save.sim.results function so that simulation results can be written to .txt files. This is mainly useful for Distance for Windows users as R users would probably prefer to just save the whole simulation object to file. +* Can write the simulation progress to file - this allows the simulation progress to be displayed when simulations are being run from Distance for Windows using dsims. +* Add segmented trackline design as an option in simulation summary (currently these design can only be generated inside Distance for Windows for use in simulations). + +Bug Fixes + +* Partial fix to the bug relating to grouping strata at the analysis stage. Strata grouping should now work when detections are of individuals. Still needs to be fixed for when clusters are present. + +# dsims 1.0.0 + +New Features + +* Reading transects from file - this functionality is primarily envisioned for use from within Distance for Windows. + +Enhancements + +* New routine which will generate covariate values from a zero-truncated Poisson distribution for non integer values. +* There is now no lower limit on the number of detections in simulations as this was introducing bias. There is now a warning system in place. Very low numbers of detections may cause issues fitting. There must be more detections than there are parameters in the model for the model to have a chance of fitting successfully. Note that distance sampling good practice recommends minimum of 60-80 detections for estimating the detection function for line transects and more for points. +* Improved histogram.N.ests function will now plot either a histogram of estimates of individuals or clusters. It also provides the use.max.reps argument so that the plot can be consistent with the option selected for the simulation summary. + +Bug Fixes + +* Fixed simulations where cluster size was included - there was a formatting change in mrds output tables. +* Added a check for repeat model definitions. +* Add code to deal with equal model criteria values. +* Fixed bug when no simulation repetitions had been successful +* AICc method fixed +* Warning indexes from parallel runs are now fixed + +# dsims 0.2.2 / 0.2.3 + +Bug Fixes + +* Minor modifications to stay CRAN compliant. + +# dsims 0.2.1 + +New Features + +* Now interfaces with new syntax in Distance >= 1.0.5 (it will remain backwards compatible with older versions of Distance for this release) + +Bug Fixes + +* Plus sampling simulations now issue a warning and modify to minus sampling - these should not have run in previous versions. +* Fixed default simulation truncation distance to 50 in the analyses (will fix dssd to be consistent with this in release 0.3.2) +* Fixed the recording of warning / error indexing in parallel simulations + +# dsims 0.2.0 + +New Features + +* Delta selection criteria is now recorded as the difference in information criteria between the top 2 best fitting models as determined by the information criteria.] +* The iteration numbers generating warnings or errors are now stored and displayed so user can choose what to do with these results. + +Bug Fixes + +* Fixed missing RMSE values +* Fix strata re-ordering for cluster size +* Models with -Inf information criteria no longer selected +* Models with dht = NULL are no longer selected +* Models which predict detection values < 1 no longer cause errors and are correctly excluded. +* Detectibility parameters for continuous covariates are now checked and validated. +* Fix situation where all reps are to be excluded due to problematic model fitting. +* There was a bug in the underlying code on windows machines that meant that segmented lines were not being clipped properly. The dependencies of sf have not been updated and the issue fixed. Please update sf if you run into missing segment transects. + +# dsims 0.1.0 + +Enhancements + +* Introducing the new Distance Sampling Simulation package. # dsims is our latest simulation package which interfaces with dssd so designs can be generated within R, thus making the simulation process a lot easier. # dsims also makes use of ggplot to produce cleaner looking graphics. +* Region and Design: # dsims can make use of the region creation and all the designs currently in dssd. +* Density: # dsims can generate density objects from constant values for each strata, from fitted mgcv gam objects with x and y as explantory covariates and from formulas of x and y. +* Density: Density grids are stored as sf polygons with their associated x, y central coordinates and density value +* Population Description: Populations can either be created with fixed population sizes or based on the densities in the density grid. +* Population Description: Both discrete and continuous individual level covariates can be included in the population +* Detectablity: The detectability of the population can be described by either half normal, hazard rate or uniform detection shapes. Parameters can vary by stratum +* Detectablity: Covariate parameters can be included to modify the scale parameter for each individual based on their covariate values. +* Analyses:A number of detection function analyses can be incorporated in a simulation and the model with the lowest criterion (AIC / AICc / BIC) will be selected. +* Analyses:Defining analyses is based on the arguments which are passed to our Distance R library. +* Simulations: Simulations can be run in serial or parallel and their progress is output. +* Simulations: The function run.survey can be used to create a single instance of a survey and check the simulation setup. + diff --git a/README.md b/README.md index a9f4397..445dcd6 100644 --- a/README.md +++ b/README.md @@ -10,25 +10,14 @@ Distance Sampling Simulations # Using `dsims` -There is currently one vignette within the dsims package to help you get started using `dsims`: - - GettingStarted: "Getting Started with dsims" +There is currently three vignette within the dsims package to help you get started using `dsims`: -# Getting `dsims` - -We typically aim to keep `dsims` on CRAN, so it can be readily installed from within R-Studio or the R interface. However, at present there is an issue with our package `dssd` on which `dsims` relies (see [issue in dssd](https://github.com/DistanceDevelopment/dssd/issues/94) ) that prevents this. Therefore to obtain `dsims` at present, please use the following code. - - # First, ensure you have a copy of the devtools package - if (!nzchar(system.file(package = "devtools"))) install.packages("devtools") - # then ensure you have a copy of the dssd package: - if (!nzchar(system.file(package = "dssd"))) devtools::install_github("DistanceDevelopment/dssd", build_vignettes = TRUE) - # finally install dsims from github: - devtools::install_github("DistanceDevelopment/dsims", build_vignettes = TRUE) +- GettingStarted: *Getting Started with dsims* available from the navigation bar at top of the page +- Transition from `DSsim` to `dsims`: under *Articles* on the navigation bar +- Grouped strata: Combining abundance estimates across strata constructed for design purposes; under *Articles* on the navigation bar -### Troubleshooting tip - -During installation of packages, you may get the message "These packages have more recent versions available. It is recommended to update all of them. Which would you like to update?" and then a list of packages. We recommend you typically choose the option "CRAN packages only". Note you may then get the message that some packages cannot be installed because they are already loaded. In this case, a solution may be to note which packages these are, to open an R console (rather than R Studio) and to use the `Packages | Update packages` menu option (or the `update.packages` function) to update these packages. +# Getting `dsims` - + +### Troubleshooting tip + +During installation of packages, you may get the message "These packages have more recent versions available. It is recommended to update all of them. Which would you like to update?" and then a list of packages. We recommend you typically choose the option "CRAN packages only". Note you may then get the message that some packages cannot be installed because they are already loaded. In this case, a solution may be to note which packages these are, to open an R console (rather than R Studio) and to use the `Packages | Update packages` menu option (or the `update.packages` function) to update these packages. diff --git a/_pkgdown.yml b/_pkgdown.yml new file mode 100644 index 0000000..e66a5cb --- /dev/null +++ b/_pkgdown.yml @@ -0,0 +1,43 @@ +url: ~ +template: + bootstrap: 5 + bslib: + bg: "#fcfaf2" + fg: "#14059e" + primary: "#0542a3" + base_font: {google: "Roboto"} + include-in-header: + file: Clarity.txt + +navbar: + bg: primary + structure: + right: [twitter, github] + components: + twitter: + icon: fa-twitter + href: https://twitter.com/distancesamp + aria-label: Twitter + left: + - text: Function reference + href: reference/index.html + - text: Getting started + href: articles/GettingStarted.html + - text: Articles + menu: + - text: Transition from `DSsim` to `dsims` + href: articles/dsims-examples.html + - text: Grouped strata + href: articles/dsims_grouped_strata.html + - text: News + href: news/index.html + +footer: + structure: + right: donate + left: clarity + components: + donate: "If you wish to donate to development and maintenance" + clarity: "We improve our site and software support by using Microsoft Clarity to see
+ how you use our website. By using our site, you agree that we and Microsoft
+ can collect and use this data. Clarity is GDPR compliant." diff --git a/docs/404.html b/docs/404.html new file mode 100644 index 0000000..0e0db70 --- /dev/null +++ b/docs/404.html @@ -0,0 +1,105 @@ + + + + + + + +Page not found (404) • dsims + + + + + + + + + + Skip to contents + + +
+
+
+ +Content not found. Please use links in the navbar. + +
+
+ + +
+ + + +
+
+ + + + + + + diff --git a/docs/Clarity.txt b/docs/Clarity.txt new file mode 100644 index 0000000..418d756 --- /dev/null +++ b/docs/Clarity.txt @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/docs/articles/GettingStarted.html b/docs/articles/GettingStarted.html new file mode 100644 index 0000000..fb61be4 --- /dev/null +++ b/docs/articles/GettingStarted.html @@ -0,0 +1,757 @@ + + + + + + + + +Getting Started with dsims • dsims + + + + + + + + + + + Skip to contents + + +
+ + +
+
+ + + +
+

Distance Sampling Simulations +

+

This vignette introduces the basic procedure for setting up and running a distance sampling simulation using ‘dsims’ (Marshall 2021). The ‘dsims’ package uses the distance sampling survey design package ‘dssd’ (Marshall 2020a) to define the design and generate the surveys (sets of transects). For further details on defining designs please refer to the ‘dssd’ vignettes. ‘dsims’ was designed to be largely similar to the ‘DSsim’ package (Marshall 2020b) in terms of work flow, functions and arguments. The main differences in terms of its use lie in the definition of the designs which can now be generated in R using the ‘dssd’ package (these packages are automatically linked) and the definition of analyses. Analyses are now defined using terminology based on the ‘Distance’ package (Miller 2020). In addition, the underlying functionality now makes use of the ‘sf’ package (Pebesma and Baston 2021).

+

Distance Sampling techniques provide design based estimates of density and abundance for populations. The accuracy of these estimates relies on valid survey design. While general rules of thumb can help guide our design choices, simulations emulating a specific set of survey characteristics can often help us achieve more efficient and robust designs for individual studies. For example, simulations can help us investigate how effort allocation can affect our estimates or the effects of a more efficient design which has less uniform coverage probability. Due to the individual nature of each study, each with their specific set of characteristics, simulation can be a powerful tool in evaluating survey design.

+
+
+

Setting up the Region +

+

We will use the St Andrews bay area as an example study region for these simulations. This is a single strata study region which has been projected into metres. We will first load the ‘dsims’ package, this will also automatically load the ‘dssd’ package. As this shapefile does not have a projection recorded (in an associated .prj file) we tell ‘dsims’ that the units are metres.

+ +
## Loading required package: dssd
+
+# Find the file path to the example shapefile in dssd
+shapefile.name <- system.file("extdata", "StAndrew.shp", package = "dssd")
+# Create the survey region object
+region <- make.region(region.name = "St Andrews bay",
+                      shape = shapefile.name,
+                      units = "m")
+plot(region)
+
+ +Figure 1: The study region.

+Figure 1: Figure 1: The study region. +

+
+
+
+

Defining the study population +

+

To define a study population we require a number of intermediate steps. We describe these in turn below.

+
+

Population Density Grid +

+

The first step in defining your study population is to set up the density grid. One way to do this is to first create a flat surface and then add hot and low spots to represent where you think you might have areas of higher and lower density of animals.

+

If we were to assume that there were 300 groups in the St Andrews bay study area (which is a fairly large number!) this would only give us an average density of 3.04-07 groups per square metre. For this simulation, as we will use a fixed population size, we do not need to worry about the absolute values of the density surface. Instead, it can be simpler to work with larger values and be aware that we are defining a relative density surface. So where we create a surface to have a density of twice that in another area that relationship will be maintained (be it at much smaller absolute values) when we later generate the population.

+

For the purposes of simulation you will likely want to test over a range of plausible animal distributions (if you knew exactly how many you were going to find at any given location you probably wouldn’t be doing the study!). When testing non-uniform coverage designs it is advisable to try out worst case scenarios, i.e. set density in the area of higher or lower coverage to differ from the majority of the survey region. This will give an idea of the degree of potential bias which could be introduced.

+

In this example, for the equal spaced zigzag design, as it is generated in a convex hull the areas with differing coverage are likely to be at the very top and very bottom of the survey region. In the density grid below these areas are shown to have lower animal density than the rest of the survey region, a likely scenario when a study region has been constructed in order to catch the range of a population of interest.

+
+# We first create a flat density grid
+density <- make.density(region = region,
+                        x.space = 500,
+                        constant = 1)
+
+# Now we can add some high and low points to give some spatial variability
+density <- add.hotspot(object = density,
+                       centre = c(-170000, 6255000),
+                       sigma = 8000,
+                       amplitude = 4)
+
+density <- add.hotspot(object = density,
+                       centre = c(-160000, 6275000),
+                       sigma = 6000,
+                       amplitude = 4)
+
+density <- add.hotspot(object = density,
+                       centre = c(-155000, 6260000),
+                       sigma = 3000,
+                       amplitude = 2)
+
+density <- add.hotspot(object = density,
+                       centre = c(-150000, 6240000),
+                       sigma = 10000,
+                       amplitude = -0.9)
+
+density <- add.hotspot(object = density,
+                       centre = c(-155000, 6285000),
+                       sigma = 10000,
+                       amplitude = -1)
+
+# I will choose to plot in km rather than m (scale = 0.001)
+plot(density, region, scale = 0.001)
+
+ +Figure 2: A density map representing a plausible distributions of animals within the study region.

+Figure 2: Figure 2: A density map representing a plausible distributions of animals within the study region. +

+
+

In some situations you may not need to rely on constructing a density distribution from scratch. Now we will demonstrate how to use a gam to construct the density surface. As I do not have data for this area I will use the density grid I created above as an example dataset. I will fit a gam to this data and then use this to create a new density object. As I need to restrict the predicted values to be greater than zero, I will use a log link with the gaussian error distribution. This can also be a useful trick if you want to turn something created using the above method, which can look a bit lumpy and bumpy, into a smoother distribution surface. The gam fitted must only use a smooth over x and y to fit the model as no other predictor covariates will be present in the density surface.

+
+# First extract the data above - this is simple in this case as we only have a single strata
+# Multi-strata regions will involve combining the density grids for each strata into a 
+# single dataset.
+density.data <- density@density.surface[[1]]
+head(density.data)
+
## Simple feature collection with 6 features and 4 fields
+## Geometry type: POLYGON
+## Dimension:     XY
+## Bounding box:  xmin: -157572.4 ymin: 6241463 xmax: -154890.4 ymax: 6241543
+## CRS:           NA
+##            strata   density         x       y                       geometry
+## 34 St Andrews bay 0.6128054 -157640.4 6241293 POLYGON ((-157390.4 6241543...
+## 35 St Andrews bay 0.5614958 -157140.4 6241293 POLYGON ((-157390.4 6241543...
+## 36 St Andrews bay 0.5125986 -156640.4 6241293 POLYGON ((-156890.4 6241543...
+## 37 St Andrews bay 0.4662975 -156140.4 6241293 POLYGON ((-156390.4 6241543...
+## 38 St Andrews bay 0.4227525 -155640.4 6241293 POLYGON ((-155890.4 6241543...
+## 39 St Andrews bay 0.3821010 -155140.4 6241293 POLYGON ((-155390.4 6241543...
+
+# Fit a simple gam to the data
+library(mgcv)
+
## Loading required package: nlme
+
## This is mgcv 1.9-1. For overview type 'help("mgcv-package")'.
+
+fit.gam <- gam(density ~ s(x,y), data = density.data, family = gaussian(link="log"))
+
+# Use the gam object to create a density object
+gam.density <- make.density(region = region,
+                            x.space = 500,
+                            fitted.model = fit.gam)
+
+plot(gam.density, region, scale = 0.001)
+
+ +Figure 3: A density map representing a plausible distributions of animals within the study region.

+Figure 3: Figure 3: A density map representing a plausible distributions of animals within the study region. +

+
+
+
+

Other Population Parameters +

+

Once we have created a plausible animal density distribution we can go on to define other population parameters. We do this by constructing a population description.

+

We will assume animals occur in small clusters so we will first create a covariate list and define the distribution for cluster size (which must be named “size”) as a zero-truncated Poisson distribution with mean equal to 3. For those of you familiar with ‘DSsim’ please note the simplified format for defining population covariates.

+

The other population value we have to define is the population size. As we have clusters in our population, N will refer to the number of clusters rather than individuals. We will set the number of clusters to be 100. We then leave the fixed.N argument as the default TRUE to say we would like to generate the population based on the population size rather than the density surface.

+
+# Create a covariate list describing the distribution of cluster sizes
+covariates <- list(size = list(distribution = "ztruncpois", mean = 3))
+
+# Define the population description
+pop.desc <- make.population.description(region = region,
+                                        density = gam.density,
+                                        covariates = covariates,
+                                        N = 300,
+                                        fixed.N = TRUE)
+
+
+
+

Coverage Grid +

+

It is good practice to create a coverage grid over your study area to assess how coverage probability varies spatially across your study area for any specified designs. For designs where there may be non-uniform coverage, we advise coverage probability is assessed prior to running any simulations. However, as this step is not essential for running simulations we will omit it here and refer you to the ‘dssd’ vignettes for further details.

+
+
+

Defining the Design +

+

‘dsims’ working together with ‘dssd’ provides a number of point and line transect designs. Further details on defining designs can be found in the ‘dssd’ help and vignettes. We also provide examples online at .

+

For these simulations we will compare two line transect designs, systematically spaced parallel lines and equal spaced zigzag lines. The zigzag design will be generated within a convex hull to try to minimise the off-effort transit time between the ends of transects.

+

The design angles for each design were selected so that the transects run roughly perpendicular to the coast. The way the two designs are defined means that this is 90 degrees for the parallel line design and 0 for the zigzag design. Both designs assumed a minus sampling protocol and the truncation distance was set at 750m from the transect. The spacings for each design were selected to give the same trackline lengths of around 450 km (this was assessed by running the coverage simulations for these designs using ‘run.coverage’, see help in ‘dssd’). The trackline lengths can be thought of as an indicator of the cost of the survey as they give the total travel time (both on and off effort) from the beginning of the first transect to the end of the last transect.

+
+parallel.design <- make.design(region = region, 
+                               design = "systematic",
+                               spacing = 2500,
+                               edge.protocol = "minus",
+                               design.angle = 90,
+                               truncation = 750)
+
+zigzag.design <- make.design(region = region, 
+                             design = "eszigzag",
+                             spacing = 2233,
+                             edge.protocol = "minus",
+                             design.angle = 0,
+                             bounding.shape = "convex.hull",
+                             truncation = 750)
+
+

Generating a Set of Transects +

+

It is always a good idea to run a quick check that your design is as expected by generating a set of transects and plotting them.

+
+p.survey <- generate.transects(parallel.design)
+plot(region, p.survey)
+
+ +Figure 4: An example set of transects generated from the systematic parallel line design plotted within the study region.

+Figure 4: Figure 4: An example set of transects generated from the systematic parallel line design plotted within the study region. +

+
+
+z.survey <- generate.transects(zigzag.design)
+plot(region, z.survey)
+
+ +Figure 5: An example set of transects generated from the systematic parallel line design plotted within the study region.

+Figure 5: Figure 5: An example set of transects generated from the systematic parallel line design plotted within the study region. +

+
+
+
+
+

Defining Detectability +

+

Once we have defined both the population of interest and the design which we will use to survey our population we now need to provide information about how detectable the individuals or clusters are. For this example we will assume that larger clusters are more detectable. Take care when defining covariate parameters that the covariate names match those in the population description.

+

When setting the basic scale parameter along side covariate parameters values we need be aware of how the covariate parameter values are incorporated. The covariate parameter values provided adjust the value of the scale parameter on the log scale. The scale parameter for any individual (\(\sigma_j\)) can be calculated as:

+

\[\sigma_j = exp(log(\sigma_0)+\sum_{i=1}^{k}\beta_ix_{ij})\] +where \(j\) is the individual, \(\sigma_0\) is the base line scale parameter (passed in as argument ‘scale.param’ on the natural scale), the \(\beta_i\)’s are the covariate parameters passed in on the log scale for each covariate \(i\) and the \(x_{ij}\) values are the covariate values for covariate \(i\) and individual \(j\).

+

We will assume a half normal detection function with a scale parameter of 300. We will set the truncation distance to be the same as the design at 750 m. and set the covariate slope coefficient on the log scale to log(1.08) = 0.077. We can check what our detection functions will look like for the different covariate values by plotting them. To plot the example detection functions we need to provide the population description as well as detectability.

+
+# Define the covariate parameters on the log scale
+cov.param <- list(size = log(1.08))
+
+# Create the detectability description
+detect <- make.detectability(key.function = "hn",
+                             scale.param = 300,
+                             cov.param = cov.param,
+                             truncation = 750)
+
+# Plot the simulation detection functions
+plot(detect, pop.desc)
+
+ +Figure 6: Plot of the detection function for the mean group size (solid line) and for the 2.5 and 97.5 percentile values  of group size (dashed lines) for this population.

+Figure 6: Figure 6: Plot of the detection function for the mean group size (solid line) and for the 2.5 and 97.5 percentile values of group size (dashed lines) for this population. +

+
+

We can also calculate the average detection function for our mean cluster size of 3 as defined in our population description:

+

\[\sigma_{size = 3} = exp(log(300)+log(1.05)*3) = 347.3 \]

+
+
+

Defining Analyses +

+

The final component to a simulation is the analysis or set of analyses you wish to fit to the simulated data. We will define a number of models and allow automatic model selection based on the minimum AIC value. The models included below are a half-normal with no covariates, a hazard rate with no covariates and a half-normal with cluster size as a covariate. We will leave the truncation value at 750 as previously defined (it must be <= to the truncation values used previously). We will use the default error variance estimator “R2”. See ‘?mrds::varn’ for descriptions of the various empirical variance estimators for encounter rate.

+
+analyses <- make.ds.analysis(dfmodel = list(~1, ~1, ~size),
+                             key = c("hn", "hr", "hn"),
+                             truncation = 750,
+                             er.var = "R2",
+                             criteria = "AIC")
+
+
+

Putting the Simulation Together +

+

Now we have all the simulation components defined we can create our simulation objects. We will create one for the systematic parallel line design and one for the equal spaced zigzag design.

+
+sim.parallel <- make.simulation(reps = 999,
+                                design = parallel.design,
+                                population.description = pop.desc,
+                                detectability = detect,
+                                ds.analysis = analyses)
+
+sim.zigzag <- make.simulation(reps = 999,
+                              design = zigzag.design,
+                              population.description = pop.desc,
+                              detectability = detect,
+                              ds.analysis = analyses)
+

Once you have created a simulation we recommend you check to see what a simulated survey might look like.

+
+# Generate a single instance of a survey: a population, set of transects 
+# and the resulting distance data
+eg.parallel.survey <- run.survey(sim.parallel)
+
+# Plot it to view a summary
+plot(eg.parallel.survey, region)
+
+Figure 7: Example survey from systematic parallel design. Panels showing: top left - transects, top right - population, bottom left - transects, population and survey detections (cyan dots), bottom right -  histogram of detection distances

+(#fig:parallel.survey)Figure 7: Example survey from systematic parallel design. Panels showing: top left - transects, top right - population, bottom left - transects, population and survey detections (cyan dots), bottom right - histogram of detection distances +

+
+
+# Generate a single instance of a survey: a population, set of transects 
+# and the resulting distance data
+eg.zigzag.survey <- run.survey(sim.zigzag)
+
+# Plot it to view a summary
+plot(eg.zigzag.survey, region)
+
+Figure 8: Example survey from equal spaced zigzag design. Panels showing: top left - transects, top right - population, bottom left - transects, population and survey detections (cyan dots), bottom right -  histogram of detection distances

+(#fig:zigzag.survey)Figure 8: Example survey from equal spaced zigzag design. Panels showing: top left - transects, top right - population, bottom left - transects, population and survey detections (cyan dots), bottom right - histogram of detection distances +

+
+
+
+

Running the Simulation +

+

The simulations can be run as follows. Note that these will take some time to run!

+
+# Running the simulations
+sim.parallel <- run.simulation(sim.parallel)
+sim.zigzag <- run.simulation(sim.zigzag)
+
+
+

Simulation Results +

+

Once the simulations have run we can view a summary of the results. Viewing a summary of a simulation will first summarise the simulation setup and then if the simulation has been run provide a summary of the results. A glossary is also provided to aid interpretation of the results. Note that each run will produce slightly different results due to the random component of the generation of both the populations and the sets of survey transects.

+

Firstly, for the systematic parallel lines design we can see that there is very low bias 1.85% for the estimated abundance / density of individuals. The bias is even lower at only 0.16% for the estimated abundance / density of clusters. Also we can see that the analyses have done a good job at estimating the mean cluster size, there is only 1.72% bias.

+

We can also see that the 95% confidence intervals calculated for the abundance / density estimates are in fact capturing the true value around 97% of the time (CI.coverage.prob). We can also note that the observed standard deviation of the estimates of the mean is a bit lower than the mean se, meaning we are realising a lower variance than we would estimate. This is often seen with systematic designs as the default variance estimator assumes a completely random allocation of transect locations, systematic designs usually have lower variance.

+

Reassuringly, these results are as expected for the systematic parallel line design. We expect low bias, as by definition, parallel line designs produce a very uniform coverage probability. The only areas where this design might not produce uniform coverage is around the boundary where there could be minor edge effects due to the minus sampling.

+
+summary(sim.parallel)
+
## 
+## GLOSSARY
+## --------
+## 
+## Summary of Simulation Output
+## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+## 
+## Region          : the region name.
+## No. Repetitions : the number of times the simulation was repeated.
+## No. Excluded Repetitions : the number of times the simulation failed
+##                   (too few sightings, model fitting failure etc.)
+## 
+## Summary for Individuals
+## ~~~~~~~~~~~~~~~~~~~~~~~
+## 
+## Summary Statistics:
+##    mean.Cover.Area : mean covered across simulation.
+##    mean.Effort     : mean effort across simulation.
+##    mean.n          : mean number of observed objects across
+##                      simulation.
+##    mean.n.miss.dist: mean number of observed objects where no distance
+##                     was recorded (only displayed if value > 0).
+##    no.zero.n       : number of surveys in simulation where
+##                      nothing was detected (only displayed if value > 0).
+##    mean.ER         : mean encounter rate across simulation.
+##    mean.se.ER      : mean standard error of the encounter rates
+##                      across simulation.
+##    sd.mean.ER      : standard deviation of the encounter rates
+##                      across simulation.
+## 
+## Estimates of Abundance:
+##    Truth            : true population size, (or mean of true
+##                       population sizes across simulation for Poisson N.
+##    mean.Estimate    : mean estimate of abundance across simulation.
+##    percent.bias     : the percentage of bias in the estimates.
+##    RMSE             : root mean squared error/no. successful reps
+##    CI.coverage.prob : proportion of times the 95% confidence interval
+##                       contained the true value.
+##    mean.se          : the mean standard error of the estimates of
+##                       abundance
+##    sd.of.means      : the standard deviation of the estimates
+## 
+## Estimates of Density:
+##    Truth            : true average density.
+##    mean.Estimate    : mean estimate of density across simulation.
+##    percent.bias     : the percentage of bias in the estimates.
+##    RMSE             : root mean squared error/no. successful reps
+##    CI.coverage.prob : proportion of times the 95% confidence interval
+##                       contained the true value.
+##    mean.se          : the mean standard error of the estimates.
+##    sd.of.means      : the standard deviation of the estimates.
+## 
+## Detection Function Values
+## ~~~~~~~~~~~~~~~~~~~~~~~~~
+## 
+##  mean.observed.Pa : mean proportion of individuals/clusters observed in
+##                     the covered region.
+##  mean.estimte.Pa  : mean estimate of the proportion of individuals/
+##                     clusters observed in the covered region.
+##  sd.estimate.Pa   : standard deviation of the mean estimates of the
+##                     proportion of individuals/clusters observed in the
+##                     covered region.
+##  mean.ESW         : mean estimated strip width.
+##  sd.ESW           : standard deviation of the mean estimated strip widths.
+
## 
+## 
+## Region:  St Andrews bay
+## No. Repetitions:  999
+## No. Excluded Repetitions:  0
+## Using only repetitions where all models converged.
+## 
+## Design:  Systematic parallel line design
+##    design.type :  Systematic parallel line design
+##    bounding.shape :  rectangle
+##    spacing :  2500
+##    design.angle :  90
+##    edge.protocol :  minus
+## 
+## Individual Level Covariate Summary:
+##    size:ztruncpois , mean  =  3
+## Population Detectability Summary:
+##     key.function  =  hn
+##     scale.param  =  300
+##     truncation  =  750
+## 
+## Covariate Detectability Summary (params on log scale):
+##    size parameters: 
+## Strata St Andrews bay 
+##            0.07696104 
+## 
+## Analysis Summary:
+##    Candidate Models:
+##       Model 1: key function 'hn', formula '~1', was selected 474 time(s).
+##       Model 2: key function 'hr', formula '~1', was selected 201 time(s).
+##       Model 3: key function 'hn', formula '~size', was selected 324 time(s).
+##    criteria  =  AIC
+##    variance.estimator  =  R2
+##    truncation  =  750
+## 
+## Summary for Individuals
+## 
+## Estimates of Abundance (N)
+## 
+##   Truth mean.Estimate percent.bias   RMSE CI.coverage.prob mean.se sd.of.means
+## 1   900        916.67         1.85 149.89             0.97  155.99      149.04
+## 
+##      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+## Estimates of Density (D)
+## 
+##          Truth mean.Estimate percent.bias         RMSE CI.coverage.prob
+## 1 9.113923e-07  9.282781e-07     1.852743 1.517923e-07         0.968969
+##        mean.se  sd.of.means
+## 1 1.579674e-07 1.509258e-07
+## 
+##      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+##      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+## 
+## Summary for Clusters
+## 
+## Summary Statistics
+## 
+##   mean.Cover.Area mean.Effort   mean.n   mean.k      mean.ER   mean.se.ER
+## 1       592153913    394769.3 106.7317 15.82883 0.0002704223 3.569565e-05
+##     sd.mean.ER
+## 1 2.137828e-05
+## 
+##      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+## Estimates of Abundance (N)
+## 
+##   Truth mean.Estimate percent.bias  RMSE CI.coverage.prob mean.se sd.of.means
+## 1   300        300.49         0.16 45.02             0.97   49.01       45.04
+## 
+##      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+## Estimates of Density (D)
+## 
+##          Truth mean.Estimate percent.bias        RMSE CI.coverage.prob
+## 1 3.037974e-07  3.042914e-07    0.1626056 4.55915e-08         0.970971
+##        mean.se  sd.of.means
+## 1 4.962823e-08 4.561166e-08
+## 
+##      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+## Estimates of Expected Cluster Size
+## 
+##   Truth mean.Expected.S percent.bias mean.se.ExpS sd.mean.ExpS
+## 1     3            3.05         1.72         0.16          0.2
+## 
+##      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+##      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+## 
+## Detection Function Values
+## 
+##   mean.observed.Pa mean.estimate.Pa sd.estimate.Pa mean.ESW sd.ESW
+## 1              0.6              0.6           0.07   451.01  54.08
+

We can now check the results for the zigzag design. While zigzag designs generated inside a convex hull can be much more efficient than parallel line designs (less off-effort transit) there is the possibility of non-uniform coverage. The coverage can be assessed by running ‘run.coverage’ but by itself this does not give much of an indication of the likely effects on the survey results. The degree to which non-uniform coverage may affect survey results is determined not only by the variability in coverage but also in how that combines with the density of animals in the region. Note that while we have run only one density scenario here, if you have non-uniform coverage probability it is advisable to test the effects under a range of plausible animal distributions.

+

Under this assumed distribution of animals, it looks like any effects of non-uniform coverage are going to have minimal effects on the estimates of abundance / density. For individuals the bias is around 2.5% and for clusters it is 0.65%. Similar to the parallel line design, the confidence intervals are also giving a coverage of 97%.

+

What we can note is that the improved efficiency of this design has increased our on effort line length and corresponding covered area and is thus giving us a bit better precision than the systematic parallel line design.

+
+summary(sim.zigzag)
+
## 
+## GLOSSARY
+## --------
+## 
+## Summary of Simulation Output
+## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+## 
+## Region          : the region name.
+## No. Repetitions : the number of times the simulation was repeated.
+## No. Excluded Repetitions : the number of times the simulation failed
+##                   (too few sightings, model fitting failure etc.)
+## 
+## Summary for Individuals
+## ~~~~~~~~~~~~~~~~~~~~~~~
+## 
+## Summary Statistics:
+##    mean.Cover.Area : mean covered across simulation.
+##    mean.Effort     : mean effort across simulation.
+##    mean.n          : mean number of observed objects across
+##                      simulation.
+##    mean.n.miss.dist: mean number of observed objects where no distance
+##                     was recorded (only displayed if value > 0).
+##    no.zero.n       : number of surveys in simulation where
+##                      nothing was detected (only displayed if value > 0).
+##    mean.ER         : mean encounter rate across simulation.
+##    mean.se.ER      : mean standard error of the encounter rates
+##                      across simulation.
+##    sd.mean.ER      : standard deviation of the encounter rates
+##                      across simulation.
+## 
+## Estimates of Abundance:
+##    Truth            : true population size, (or mean of true
+##                       population sizes across simulation for Poisson N.
+##    mean.Estimate    : mean estimate of abundance across simulation.
+##    percent.bias     : the percentage of bias in the estimates.
+##    RMSE             : root mean squared error/no. successful reps
+##    CI.coverage.prob : proportion of times the 95% confidence interval
+##                       contained the true value.
+##    mean.se          : the mean standard error of the estimates of
+##                       abundance
+##    sd.of.means      : the standard deviation of the estimates
+## 
+## Estimates of Density:
+##    Truth            : true average density.
+##    mean.Estimate    : mean estimate of density across simulation.
+##    percent.bias     : the percentage of bias in the estimates.
+##    RMSE             : root mean squared error/no. successful reps
+##    CI.coverage.prob : proportion of times the 95% confidence interval
+##                       contained the true value.
+##    mean.se          : the mean standard error of the estimates.
+##    sd.of.means      : the standard deviation of the estimates.
+## 
+## Detection Function Values
+## ~~~~~~~~~~~~~~~~~~~~~~~~~
+## 
+##  mean.observed.Pa : mean proportion of individuals/clusters observed in
+##                     the covered region.
+##  mean.estimte.Pa  : mean estimate of the proportion of individuals/
+##                     clusters observed in the covered region.
+##  sd.estimate.Pa   : standard deviation of the mean estimates of the
+##                     proportion of individuals/clusters observed in the
+##                     covered region.
+##  mean.ESW         : mean estimated strip width.
+##  sd.ESW           : standard deviation of the mean estimated strip widths.
+
## 
+## 
+## Region:  St Andrews bay
+## No. Repetitions:  999
+## No. Excluded Repetitions:  0
+## Using only repetitions where all models converged.
+## 
+## Design:  Equal spaced zigzag line design
+##    design.type :  Equal spaced zigzag line design
+##    bounding.shape :  convex.hull
+##    spacing :  2233
+##    design.angle :  0
+##    edge.protocol :  minus
+## 
+## Individual Level Covariate Summary:
+##    size:ztruncpois , mean  =  3
+## Population Detectability Summary:
+##     key.function  =  hn
+##     scale.param  =  300
+##     truncation  =  750
+## 
+## Covariate Detectability Summary (params on log scale):
+##    size parameters: 
+## Strata St Andrews bay 
+##            0.07696104 
+## 
+## Analysis Summary:
+##    Candidate Models:
+##       Model 1: key function 'hn', formula '~1', was selected 476 time(s).
+##       Model 2: key function 'hr', formula '~1', was selected 178 time(s).
+##       Model 3: key function 'hn', formula '~size', was selected 345 time(s).
+##    criteria  =  AIC
+##    variance.estimator  =  R2
+##    truncation  =  750
+## 
+## Summary for Individuals
+## 
+## Estimates of Abundance (N)
+## 
+##   Truth mean.Estimate percent.bias   RMSE CI.coverage.prob mean.se sd.of.means
+## 1   900        922.42         2.49 134.29             0.97  145.28      132.47
+## 
+##      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+## Estimates of Density (D)
+## 
+##          Truth mean.Estimate percent.bias         RMSE CI.coverage.prob
+## 1 9.113923e-07  9.340926e-07     2.490729 1.359901e-07         0.971972
+##        mean.se  sd.of.means
+## 1 1.471139e-07 1.341493e-07
+## 
+##      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+##      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+## 
+## Summary for Clusters
+## 
+## Summary Statistics
+## 
+##   mean.Cover.Area mean.Effort   mean.n   mean.k      mean.ER   mean.se.ER
+## 1       663209990      442140 120.3654 18.47948 0.0002722232 3.346453e-05
+##     sd.mean.ER
+## 1 2.143639e-05
+## 
+##      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+## Estimates of Abundance (N)
+## 
+##   Truth mean.Estimate percent.bias  RMSE CI.coverage.prob mean.se sd.of.means
+## 1   300        301.94         0.65 41.32             0.97   45.58       41.29
+## 
+##      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+## Estimates of Density (D)
+## 
+##          Truth mean.Estimate percent.bias        RMSE CI.coverage.prob
+## 1 3.037974e-07  3.057631e-07    0.6470286 4.18412e-08         0.973974
+##        mean.se  sd.of.means
+## 1 4.616181e-08 4.181593e-08
+## 
+##      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+## Estimates of Expected Cluster Size
+## 
+##   Truth mean.Expected.S percent.bias mean.se.ExpS sd.mean.ExpS
+## 1     3            3.06         1.97         0.15          0.2
+## 
+##      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+##      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+## 
+## Detection Function Values
+## 
+##   mean.observed.Pa mean.estimate.Pa sd.estimate.Pa mean.ESW sd.ESW
+## 1              0.6              0.6           0.07   450.54  49.27
+

Histograms of the estimates of abundance from each of the simulation replicates can also be viewed to check for the possible effects of extreme values or skewed distributions.

+
+oldparams <- par(mfrow = c(1,2))
+histogram.N.ests(sim.parallel)
+histogram.N.ests(sim.zigzag)
+
+Figure 9: Left - histogram of estimates of abundance of clusters for systematic parallel design. Right - histogram of estimates of abundance of clusters for zigzag design.

+(#fig:hist.results)Figure 9: Left - histogram of estimates of abundance of clusters for systematic parallel design. Right - histogram of estimates of abundance of clusters for zigzag design. +

+
+
+par(oldparams)
+

We can see in Figure 9 that there were a couple of high estimates generated >500 for both the parallel line and zigzag designs. These probably represent data sets that were difficult to fit a model too (perhaps a chance spiked data set). Most of the estimates are centered around truth but these occasional high estimates may have increased the mean value slightly and could be associated with the small amount of positive bias.

+
+
+

Simulation Conclusions +

+

Under these simulation assumptions it appears that the zigzag design will cost us a little in accuracy but allow us to gain some precision. It should be noted that the cost in accuracy will vary depending on the distribution of animals in the survey region.

+
+
+

References +

+
+
+Marshall, L. 2020a. Dssd: Distance Sampling Survey Design. https://CRAN.R-project.org/package=dssd. +
+
+———. 2020b. DSsim: Distance Sampling Simulations. https://CRAN.R-project.org/package=DSsim. +
+
+———. 2021. Dsims: Distance Sampling Simulations. https://CRAN.R-project.org/package=dsims. +
+
+Miller, D. L. 2020. Distance: Distance Sampling Detection Function and Abundance Estimation. https://CRAN.R-project.org/package=Distance. +
+
+Pebesma, Bivand, E., and D. Baston. 2021. Sf: Simple Features for r. https://CRAN.R-project.org/package=sf. +
+
+
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/articles/GettingStarted_files/figure-html/density-1.png b/docs/articles/GettingStarted_files/figure-html/density-1.png new file mode 100644 index 0000000000000000000000000000000000000000..fcd9ffa92bbb74fe68954d232f715a5bb2164278 GIT binary patch literal 16724 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 W^&&o13HLk{a_DOtYZYl+3j2Q??Q!J* literal 0 HcmV?d00001 diff --git a/docs/articles/GettingStarted_files/figure-html/paralleltransects-1.png b/docs/articles/GettingStarted_files/figure-html/paralleltransects-1.png new file mode 100644 index 0000000000000000000000000000000000000000..4b53733680ec6825cadf71e7f7d8bc22f930bbd2 GIT binary patch literal 3954 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 Vs(;XWphNcWY;9p_upBtBIE!7 literal 0 HcmV?d00001 diff --git a/docs/articles/GettingStarted_files/figure-html/region-1.png b/docs/articles/GettingStarted_files/figure-html/region-1.png new file mode 100644 index 0000000000000000000000000000000000000000..c3b5cbe87baff7d783ae7a0145f28c281617a59e GIT binary patch literal 3889 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 literal 0 HcmV?d00001 diff --git a/docs/articles/GettingStarted_files/figure-html/zigzagtransects-1.png b/docs/articles/GettingStarted_files/figure-html/zigzagtransects-1.png new file mode 100644 index 0000000000000000000000000000000000000000..eb3b069030213d4c10fb935b95d75106c29bf9b6 GIT binary patch literal 4675 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 ZPpG*?l8#N$Ti(75GBdU`qFzMZ|1agJZxH|h literal 0 HcmV?d00001 diff --git a/docs/articles/SimulationDiagram.png b/docs/articles/SimulationDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..424562832458cfa8404ef9c3db645ec3ca5d19d7 GIT binary patch literal 79501 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 hs$K)#ja1#s0avh66{zwm%&y9h$GiiTmh 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 + + + + + + + +Transition from `DSsim` to `dsims` • dsims + + + + + + + + + + + Skip to contents + + +
+ + +
+
+ + + +
+

Preamble +

+

The first version of the simulation engine was a package called DSsim (Marshall, 2019); with improving GIS capabilities in R we have later released a second more efficient simulation package, dsims (Marshall, 2022a). This vignette was originally written for DSsim and so we use it now to not only demonstrate dsims but also as an example for users of DSsim showing how to transition to dsims. As the two packages have largely the same function names loading them together is not advised, this vignette will therefore leave the DSsim code in as comments for comparison with the dsims code. Please note that normal comments follow a single # and DSsim code follows double ##. It should also be noted that dsims now uses the distance sampling survey design package, dssd (Marshall, 2022b), to generate the transects based on the design so that shapefiles containing the transects no longer need to be created in advance.

+

If your goal is to transition to dsims from DSsim then you will find all you need in the sections up to and including the section on running simulations. The latter sections go on to run a series of additional simulations investigating pooling robustness and covariate parameter estimation with respect to truncation distance. If you are completely new to distance sampling simulations then an alternative place to start is the Getting Started vignette inside the dsims package. This vignette uses dsims to compare a systematic parallel design with a zigzag design to assess the accuracy/precision trade off. To view this open R and after installing dsims, enter the following code:

+
+vignette("GettingStarted", package = "dsims")
+
## Warning: vignette 'GettingStarted' not found
+
+
+

Introduction +

+

Distance sampling is a process in which a study area is surveyed to estimate the size of the population within it. It can be thought of as an extension to plot sampling. However, while plot sampling assumes that all objects within the plots are detected, distance sampling relaxes this assumption. To do this Distance sampling makes an assumptions about the distribution of objects with respect to the transects and to satisfy these assumptions the transects (the points or lines) must be randomly located within the study region. Note that for the purposes of distance sampling an object can either be an individual or a cluster or individuals.

+

The next step in distance sampling is then to record the distances from each detected object to the transect it was detected from and fit a detection function. From this function we can estimate how many objects were missed and hence the total number in the covered area. For example, Figure 1 shows histograms of distances that might be collected on a line transect survey, with a fitted detection function. If the lines have been placed at random within the study region then we would expect on average the same number of object to occur at any given distance from the transect. Therefore the drop in number of detection with increasing distance from the line can be attributed to a failure to detect all objects. We can therefore estimate from this detection function that the probability of seeing an object within the covered region out to a chosen truncation distance is the area under the curve (shaded grey) divided by the area of the rectangle.

+
+ +An example detection function. The histogram shows example distances recorded from a line transect. The smooth curve is the detection function. The grey shaded area represents the number of detected objects and the diagonal hash region represents the number of objects in the covered region that were not detected.

+Figure 1: An example detection function. The histogram shows example distances recorded from a line transect. The smooth curve is the detection function. The grey shaded area represents the number of detected objects and the diagonal hash region represents the number of objects in the covered region that were not detected. +

+
+

The R package dsims allows users to simulate both point and line transect surveys, and test out a range of design and analysis decisions specific to their population of interest. To simulate surveys the user must make some assumptions about the population of interest and the detection process giving rise to the observed distances. Simulations can be repeated over a range of assumptions so that the user can be confident that their chosen design will perform well despite any uncertainty.

+
+

Introduction to dsims +

+

dsims takes information from the user on the study region, population and detection process and uses it to generate distance sampling data. dsims can then be asked to fit detection functions to this data and produce estimates of density, abundance and the associated uncertainty. dsims splits this process into three stages. Firstly, it generates an instance of a population and a set of survey transects. Secondly, it simulates the distance sampling survey using the assumed detection function(s) provided by the user. Lastly, dsims analyses the data from the survey. Figure 2 illustrates the simulation process and highlights the information which must be provided by the user.

+

Distance sampling simulations can be very useful to researchers who wish to optimise their survey design for their specific study regions and species of interest in order to try and achieve the most accurate / precise estimates for their populations. Setting up and running such simulations to optimise a design is a very small cost in comparison to those associated with actually completing the survey!

+
+ +Illustrates the simulation process. Blue rectangles indicate information supplied by the user. Green rectangles are objects created by dsims in the simulation process. Orange diamonds indicate the processes carried out by dsims.

+Figure 2: Illustrates the simulation process. Blue rectangles indicate information supplied by the user. Green rectangles are objects created by dsims in the simulation process. Orange diamonds indicate the processes carried out by dsims. +

+
+

dsims is written using the S4 object orientated system in R. The S4 system is a more formal and rigorous style of object orientated programming than the more commonly implemented S3. The process of defining a simulation involves the specification of many variables relating to the survey region, population, survey design and finally the analysis. The design of dsims is based around each of these descriptions being contained in its own class and the formal S4 class definition procedure ensures that the objects created are of the correct format for the simulation. As the objects created by dsims are instances of S4 classes, if the user wishes to access information within them the symbol used is slightly different. To access named parts of S3 objects the “$” symbol would be used, while for S4 objects the “@” symbol must be used. The following code demonstrates this.

+
+# load simulation package
+## library(DSsim)
+library(dsims)
+
+# Make a default region object
+## eg.region <- make.region()
+eg.region <- make.region()
+
+# Let's check the structure of the object we have created
+str(eg.region)
+
## Formal class 'Region' [package "dssd"] with 5 slots
+##   ..@ region.name: chr "region"
+##   ..@ strata.name: chr "region"
+##   ..@ units      : chr(0) 
+##   ..@ area       : num 1e+06
+##   ..@ region     :Classes 'sf' and 'data.frame': 1 obs. of  2 variables:
+##   .. ..$ region  : chr "study_ar"
+##   .. ..$ geometry:sfc_POLYGON of length 1; first list element: List of 1
+##   .. .. ..$ : num [1:5, 1:2] 0 0 2000 2000 0 0 500 500 0 0
+##   .. .. ..- attr(*, "class")= chr [1:3] "XY" "POLYGON" "sfg"
+##   .. ..- attr(*, "sf_column")= chr "geometry"
+##   .. ..- attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA
+##   .. .. ..- attr(*, "names")= chr "region"
+
+# If we wanted to extract the area of the region we would use
+eg.region@area
+
## [1] 1e+06
+
+
+

Example Simulation Study: Which Truncation Distance? +

+

It is usual in distance sampling studies to truncate the data at some distance from the transect. This is because the observations far away from the transect are of lesser importance when fitting the detection function and also these sparse observations at large distances could have high influence on model selection and possibly increase variability in estimated abundance / density.

+

Buckland et al. (2001) suggest truncating the data where the probability of detection is around 0.15 as a general rule of thumb. However, distance sampling data is often costly to obtain and discarding some of the data points can feel counter intuitive. In this vignette we investigate truncation distance in distance sampling analyses. We will do this through a series of three simulations outlined below.

+

Firstly, this vignette will investigate data generated assuming a simple half normal detection function where every object has the same probability of detection at a specific distance from the transect. Figure 3 shows a simple half normal detection function with three possible truncation distances at \(1*\sigma\), \(2*\sigma\) and \(3*\sigma\) where \(\sigma\) is the scale parameter of the half normal detection function. The truncation distance at \(2*\sigma\) gives a probability of detection of 0.135 so close to the 0.15 rule of thumb.

+
+ +Half-normal detection function showing 3 proposed truncation distances at $1*\sigma$, $2*\sigma$ and $3*\sigma$. The truncation distance at twice sigma gives a probability of detection of 0.135 so close to the 0.15 rule of thumb.

+Figure 3: Half-normal detection function showing 3 proposed truncation distances at \(1*\sigma\), \(2*\sigma\) and \(3*\sigma\). The truncation distance at twice sigma gives a probability of detection of 0.135 so close to the 0.15 rule of thumb. +

+
+

While the first set of simulations assume a simple half normal detection function, in reality individual objects or clusters of objects will likely have varying probability of being detected based on certain characteristics. Perhaps the behaviour of males will make them easier to detect. It is also easy to see that larger clusters of individuals might be easier to spot at large distances than small clusters. We will also investigate the effects of truncation distance when individual level covariates affect the probability of detection. Figure 4 shows how covariates may affect detectability. We will use simulated distance data with one covariate (sex) to investigate both the effects of truncation when we assume that we were not able to measure the covariate affecting detectability and when we assume that we can and therefore will include the relevant covariate in the detection function model.

+
+ +Half-normal detection function which varies based on cluster size and animal sex.

+Figure 4: Half-normal detection function which varies based on cluster size and animal sex. +

+
+
+
+

Model Uncertainty and Pooling Robustness +

+

When we simulate data, we have to provide the detection function to generate detections, and we therefore know the underlying true detection function. When collecting data in the field, we will not have this information, and so we will have to rely on some form of model selection. One method of model selection is to compare information criterion, dsims allows the user to select either AIC, AICc or BIC as the model selection criteria. For these simulations we will use AIC and allow dsims to select between a half-normal and a hazard rate model in the first two sets of simulations.

+

In addition, if the probability of detection is affected by covariates then we may not only have a single underlying detection function but a combination of detection functions giving rise to our observed data. In this situation we can either model detectability as a function of these covariates or rely on a concept called pooling robustness. Pooling robustness refers to the fact that distance sampling techniques are robust to the pooling of multiple detection functions into one. This means that we do not necessarily need to include all the covariates which affect detectability in the detection function to accurately estimate density / abundance. This vignette will examine the concept of pooling robustness to see if it is affected by truncation distance.

+
+
+
+

Methods +

+

This vignette will guide you through the steps to create and run a series of simulations to investigate the effects of varying truncation distance on both data generated from a simple half-normal detection function and from a detection function where detectability is affected by a covariate.

+
+
+

Setup +

+

First we load the dsims library.

+
+## library(DSsim)
+library(dsims)
+
+
+

Simulation Components +

+

As detailed in Introduction to dsims a simulation comprises of a number of components. dsims is designed so that each of these components is defined individually before they are grouped together into a simulation. This helps keep the process clear and also allows reuse of simulation components between different simulations. Each of the function names to create a simulation component or simulation takes the form make.<component>.

+
+

Region +

+

These simulations will use a rectangular study region of 5 km by 20 km. Survey regions can be defined in any units but all units must be the same throughout the components of the simulation. If a shapefile is used to create the survey region, then information on the units will be taken from the .prj file. Here we will define the coordinates in m. As this is a simple study region (Figure 5) with few vertices we can simply provide the coordinates. A change from DSsim is that you now need to turn the coordinates into an sf polygon shape prior to creating the region. This step is documented below. Note that while standard shapefiles have their outer polygon coordinates given in a clockwise direction, sf uses counter clockwise for external polygons and clockwise for holes within polygons. Further details on creating multi-part or multi-strata sf objects can be found at the end of the multi-strata dssd vignette.

+

You will also note that units are no longer a plotting option. The plot functions have been modified to use ggplot2 and if additional plotting options are desired the ggplot object can be captured and modified.

+
+## # Create a polgon
+## poly1 <- data.frame(x = c(0,0,20000,20000,0), y = c(0,5000,5000,0,0))
+## 
+## # Create an empty list
+## # Store the polygon inside a list in the first element of the coords list referring to strata 1.
+## coords <- list()
+## coords[[1]] <- list(poly1)
+
+# Create an sf polgon
+library(sf)
+# Put the coordinates of the polygon in a matrix
+poly1 = matrix(c(0,0, 20000,0, 20000,5000, 0,5000, 0,0),ncol=2, byrow=TRUE)
+# Turn them into an sf polygon
+pl1 = st_polygon(list(poly1))
+
+## # Create the survey region
+## region <- make.region(region.name = "study area", 
+##                       units = "m",
+##                       coords = coords)
+## # The plot function allows plotting in km or m.
+## plot(region, plot.units = "km")
+
+# Create the survey region
+region <- make.region(region.name = "study area", 
+                      units = "m",
+                      shape = pl1)
+# The plot function allows plotting in km or m.
+plot(region)
+
+ +The study region.

+Figure 5: The study region. +

+
+
+
+

Population +

+

We will now define our population within our study region. Firstly, we must describe the distribution of the population by defining a density surface. For these simulations we will assume a uniform distribution of animals throughout the study region. dsims will generate an sf grid describing the density surface for us if we provide the x (and optionally the y) spacing and a constant density value for the surface. If the y spacing is omitted it will be assumed to be equal to the x spacing. In this example the value of the constant is not important as we will generate animals based on a fixed population size rather than using the exact values in the density grid.

+

There are two argument name changes in the make.density function: region.obj is now region and density.gam is now fitted model. The buffer argument is no longer needed and there is now an option to supply a formula for density based on x and y using density.formula.

+
+## # Create the density surface
+## density <- make.density(region.obj = region, 
+##                         x.space = 100, 
+##                         constant = 1)
+## 
+## # Plot the density surface
+## plot(density, style = "blocks")
+## plot(region, add = TRUE)
+
+density <- make.density(region = region, 
+                        x.space = 100, 
+                        constant = 1)
+
+# Plot the density surface
+plot(density, region)
+
+ +The density surface.

+Figure 6: The density surface. +

+
+

As an aside, if we wished to add areas of higher or lower density to our density surface we could do this using the add.hotspot function in dsims. This function adds these hot or low spots based on a Gaussian decay function. We have to provide the central coordinates and a sigma value to tell dsims about the location and shape of the hot/low spot. The amplitude argument gives the value of the hot or low spot at its centre and is combined with the existing density surface through addition.

+

The code used to do this in dsims is identical to that used with DSsim and so is not repeated in the code chunk below.

+
+# Add a hotspot to the density surface, centre located at x = 15000, y = 4000 with 
+# a Gaussian decay parameter sigma = 1500. The value at the centre point will now 
+# be 1 (the current value of the density surface defined above) + 0.5 = 1.5
+eg.density <- add.hotspot(density, centre = c(15000,4000), sigma = 1500, amplitude = 0.5)
+# Add a lowspot to this new density surface (eg.density)
+eg.density <- add.hotspot(eg.density, centre = c(10000,3000), sigma = 1000, amplitude = -0.25)
+# Plot the density surface
+plot(eg.density, region)
+
+ +The non-uniform density surface.

+Figure 7: The non-uniform density surface. +

+
+

We can now define other aspects of the population. For the simple case (with no covariates) we only need to define a fixed population size and provide the region and density grid we created above. This fixed population size of 200 was selected as a value sufficient to give around 100 detections per simulated survey while not so large as to cause the simulations to run more slowly. The minimum recommended number of detections for fitting a detection function to is 60 (Buckland et al., 2001).

+

There are only minor argument names changes to this function: region.obj is now region and density.obj is now density.

+
+## # Create the population description, with a population size N = 200
+## pop.desc <- make.population.description(region.obj = region, 
+##                                             density.obj = density, 
+##                                             N = 200,
+##                                             fixed.N = TRUE)
+
+# Create the population description, with a population size N = 200
+pop.desc <- make.population.description(region = region, 
+                                        density = density, 
+                                        N = 200,
+                                        fixed.N = TRUE)
+

For our simulations involving covariates we need to define how individuals will be allocated these covariate values. dsims allows the user to either define their own discrete distribution or alternatively provide a distribution (Normal, Poisson, Zero-truncated Poisson or Lognormal) with associated parameters. For these simulation we will use sex as a covariate and assume that 50% of the population are female and 50% are male.

+

In this example the sex covariate is defined in exactly the same way as in DSsim.

+
+# Create the covariate list
+covariate.list <- list()
+# The population will be 50% males and 50% females
+covariate.list$sex <- list(data.frame(level = c("female", "male"), 
+                                      prob = c(0.5,0.5)))
+
+
+## # Create the population description, with a population size N = 200
+## pop.desc.cov <- make.population.description(region = region, 
+##                                             density = density, 
+##                                             covariates = covariate.list, 
+##                                             N = 200)
+
+# Create the population description, with a population size N = 200
+pop.desc.cov <- make.population.description(region = region, 
+                                            density = density, 
+                                            covariates = covariate.list, 
+                                            N = 200)
+

Note that when defining covariates using distributions the format has changed slightly. An example is included below. In dsims the format has been simplified in that the covariate distribution list provided for each stratum is now just a list with named elements ‘distribution’ and the distribution parameters. Please refer to the help for which parameters should be defined for each distribution and further examples.

+
+## covariate.list <- list()
+## covariate.list$size <- list(list("poisson", list(lambda = 35)))
+
+covariate.list <- list()
+covariate.list$size <- list(list(distribution = "poisson", lambda = 35))
+
+
+

Detectability +

+

Detectability refers to the detection function or functions we feed into the simulation to generate the observations. In the simple case we can set all animals to have the same probability of detection given their distance from the transect. Here we define a half-normal detection function with scale parameter \(\sigma = 200\) and data generation truncation distance of 1000. The truncation distance defined here is to aid simulation efficiency and means that no detections can occur beyond this value. We can then plot this function to check we have defined it correctly. As we defined our survey region in m the scale parameter and truncation distance will also be assumed to be in metres.

+

The scale parameter of 200 was selected as on average it gives around 100 detections out to a truncation distance of 1000m with our chosen population size of 200.

+

Defining detectability in dsims uses identical code to that in DSsim and so the code is not repeated here.

+
+# Make a simple half normal detection function with a scale parameter of 200
+detect.hn <- make.detectability(key.function = "hn",
+                                 scale.param = 200, 
+                                 truncation = 1000)
+# We can now visualise these detection functions
+plot(detect.hn, pop.desc)
+
+ +The detection functions for males and females.

+Figure 8: The detection functions for males and females. +

+
+

When we have covariates in the population we may choose to vary the scale parameter of the detection function based on the covariate values. dsims assumes that the scale parameter is a function of the covariates as follows:

+

\[ \sigma = exp(\beta_0+\sum_{j=1}^{q}\beta_{j}z_{ij}) \]

+

where \(\beta_0\) is the log of the scale parameter supplied to make.detectability, the \(\beta_j\)’s are the covariate parameters supplied on the log scale and \(z_{ij}\) is the ith value of the jth covariate. This formula was taken from Buckland et al. (2004).

+

The covariate values were selected so that males had a higher probability of detection than females. The values selected in this example give a sample size of around 150 observations out to the 1000m truncation value for our population of 200.

+

Defining detectability in dsims uses identical code to that in DSsim and so the code is not repeated here.

+
+# Create the covariate parameter list
+cov.params <- list()
+# Note the covariate parameters are supplied on the log scale
+cov.params$sex = data.frame(level = c("female", "male"), 
+                            param = c(0, 1.5))
+
+detect.cov <- make.detectability(key.function = "hn" ,
+                                 scale.param = 120,
+                                 cov.param = cov.params, 
+                                 truncation = 1000)
+
+# This setup gives a scale parameter of around 120 for the females and 540 for 
+# the males. We can calculate the sigma for the males using the formula above:
+# exp(log(scale.param) + sex.male)
+exp(log(120) + 1.5)
+
## [1] 537.8027
+
+# We can now visualise these detection functions
+plot(detect.cov, pop.desc.cov)
+
+ +The detection functions for males and females.

+Figure 9: The detection functions for males and females. +

+
+
+
+

Design +

+

The design section of the simulations in dsims is the part which differs most significantly from DSsim. DSsim only generated very basic designs and anything more complex needed to be generated externally and loaded as shapefiles. dsims uses the dssd survey design package in R to specify designs and generate transects from them.

+

For this example we will use a systematic parallel line transect design. As the recommended minimum number of transects is between 10 and 20 (Buckland et al., 2001) we have set the spacing between the lines to be 1000 m to give 20 transects per survey.

+

For basic designs the arguments to the make.design function have only changed slightly: region.obj is now region and design.details is now design. Note, it is now important to define a truncation distance for the design, this allows design coverage to be assessed. dssd also now provides a more comprehensive set of arguments for defining designs. To investigate these further, please see our Getting Started with dssd vignette and our Multiple Strata in dssd vignette.

+
+## # Define the design
+## design <- make.design(region.obj = region,
+##                       transect.type = "line",
+##                       design.details = c("parallel", "systematic"),
+##                       spacing = 1000)
+
+# Define the design
+design <- make.design(region = region,
+                      transect.type = "line",
+                      design = "systematic",
+                      spacing = 1000,
+                      truncation = 1000)
+

The design objects now contain the survey region and so there is no need to supply this as a separate argument when generating transects. If you would like to plot the covered areas then the covered.area argument can be set to TRUE in the plot function, in this example the covered areas may not be obvious as the truncation distance is the same as the transect spacing.

+
+## transects <- generate.transects(design, region = region)
+## plot(region)
+## plot(transects, col = 4, lwd = 2)
+
+transects <- generate.transects(design)
+plot(region, transects)
+
+ +Example survey transects.

+Figure 10: Example survey transects. +

+
+
+
+

Analysis +

+

The final stage of the simulation is to analyse the distance sampling data that has been generated. As discussed above, when collecting data in the field we would not know the true underlying detection function and will therefore incorporate model uncertainty. We can ask the simulation to fit two models, a half-normal and a hazard rate, to the data and select the best model based on the minimum AIC.

+

There is a fairly substantial change to the syntax used to define the detection function models for the analyses as well as the function name itself. The syntax for DSsim was based on mrds which we felt was not as user friendly as the syntax used by the Distance R package (Miller, Rexstad, Thomas, Marshall, & Laake, 2019). We have therefore made the code in dsims more simililar to defining models for Distance.

+
+## ddf.analyses <- make.ddf.analysis.list(dsmodel = list(~cds(key = "hn", formula = ~1),
+##                                                       ~cds(key = "hr", formula = ~1)), 
+##                                        method = "ds",
+##                                        truncation = 600)
+##                                        criteria = "AIC",
+
+ddf.analyses <- make.ds.analysis(dfmodel = list(~1, ~1),
+                                 key = c("hn", "hr"),
+                                 criteria = "AIC",
+                                 truncation = 600)
+

In this code we have set the truncation distance to 600 but later we will vary this value to investigate the effects of truncation distance on our simulation results. Note that while the truncation distance can be set to any value, it should not exceed the truncation value defined in the detectability or design as no observations will occur beyond these values.

+

In addition, in the field it may be possible to identify the covariates that affect detectability so we may wish to fit a detection function that incorporates this. In this case, the following model would be appropriate:

+
+## ddf.analyses.cov <- make.ddf.analysis.list(dsmodel = list(~mcds(key = "hn", formula = ~sex)), 
+##                                            method = "ds",
+##                                            truncation = 600)
+
+ddf.analyses.cov <- make.ds.analysis(dfmodel = list(~sex),
+                                     key = c("hn"),
+                                     truncation = 600)
+
+
+
+

Simulations +

+

The simulation is created by grouping all these components together. We will create two simulations here, the first simple case will involve no difference in detectability between animals, the second will include the difference in detectability due to sex. Initially, we will only include the analyses which allow selection between a half-normal and hazard rate model, later we modify this to run a third set of simulations where we fit a detection function with sex included as a covariate.

+

Once we have created the simulation objects, it is a good idea to check that everything is as you intended. The function run.survey simulates a single survey and generates a set of transects and a population and then simulates the survey process to create a distance sampling data set. These can then be plotted (Figures 11 and 12).

+
+## sim <- make.simulation(reps = 999, 
+##                        region.obj = region,
+##                        design.obj = design,
+##                        detectability.obj = detect.hn,
+##                        ddf.analyses.list = ddf.analyses)
+##                        population.description.obj = pop.desc,
+## # Produce simulation setup plots
+## check.sim.setup(sim)
+
+sim <- make.simulation(reps = 999, 
+                       design = design,
+                       population.description = pop.desc,
+                       detectability = detect.hn,
+                       ds.analysis = ddf.analyses)
+# Produce survey and plot it
+survey <- run.survey(sim)
+plot(survey, region)
+
+ +Example survey. Top left - an example set of transects. Top right - an example population. Bottom left - the detections from the transects. Bottom right - A histogram of the distances from these observations to the transect it was detected.

+Figure 11: Example survey. Top left - an example set of transects. Top right - an example population. Bottom left - the detections from the transects. Bottom right - A histogram of the distances from these observations to the transect it was detected. +

+
+

We will now create a second simulation object for the simulations with covariates. We can re-use the design component and then add in the new population description and detectability to include the sex covariate. Here we include the same non-covariate analyses but for the final set of simulations we will change this to fit the covariate detection function model.

+
+## sim.cov <- make.simulation(reps = 999, 
+##                        region.obj = region,
+##                        design.obj = design,
+##                        population.description.obj = pop.desc.cov,
+##                        detectability.obj = detect.cov,
+##                        ddf.analyses.list = ddf.analyses)
+## # Produce simulation setup plots
+## check.sim.setup(sim.cov)
+
+sim.cov <- make.simulation(reps = 999, 
+                       design = design,
+                       population.description = pop.desc.cov,
+                       detectability = detect.cov,
+                       ds.analysis = ddf.analyses)
+# Produce survey and plot it
+survey.cov <- run.survey(sim.cov)
+plot(survey.cov, region)
+
+ +Example survey. Top left - an example set of transects. Top right - an example population. Bottom left - the detections from the transects. Bottom right - A histogram of the distances from these observations to the transect it was detected.

+Figure 12: Example survey. Top left - an example set of transects. Top right - an example population. Bottom left - the detections from the transects. Bottom right - A histogram of the distances from these observations to the transect it was detected. +

+
+

To check that our second simulation is correctly generating covariate values for our population we can examine the first few detections in the simulated distance data.

+
+head(survey.cov@dist.data)
+
##    object individual obs.Region.Label Sample.Label distance        x         y
+## 2       2          2       study area            1 439.6622 680.6209  833.2067
+## 15     15         13       study area            1 127.7175 113.2412 3562.4237
+## 16     16         14       study area            1 385.4299 626.3886 2696.8466
+## 36     36         35       study area            1 699.3118 940.2705 4044.2287
+## 47     47         45       study area            1 521.5709 762.5297  411.8589
+## 87     87         89       study area            1 349.0618 590.0205  710.0814
+##     sex Region.Label Effort  Area
+## 2  male   study area   5000 1e+08
+## 15 male   study area   5000 1e+08
+## 16 male   study area   5000 1e+08
+## 36 male   study area   5000 1e+08
+## 47 male   study area   5000 1e+08
+## 87 male   study area   5000 1e+08
+
+
+

Running Simulations +

+

To run simulations the syntax has changed slightly from run in DSsim to run.simulations in dsims and the object argument is now simulation. The simulations can still be run in parallel using run.parallel with the maximum cores set using max.cores and the counter argument is retained. The transect.path argument of the run.simulation function in dsims is where you can optionally supply a folder or filename if you wish to load pre-generated shapefiles (in DSsim this was specified in the design). This option is not expected to be widely used and was incorporated to allow simulations in Distance for Windows to be run using dsims.

+

Here we demonstrate how to run the basic simulation as an example. You will see the code to do this incorporated into the multiple simulations run within for loops in the following sections. Note that it is advisable to first run your simulation with a few iterations (<10) to give an indication that it should run without issues before setting it off on hundreds / thousands repetitions. Once you have run a simulation you can view the results using the summary function which provides a glossary to explain the output. A histogram of the estimates of abundance can also be viewed, Figure 13.

+
+## sim <- run(object = sim)
+
+sim <- run.simulation(simulation = sim, run.parallel = TRUE)
+# Display a summary of the simulation
+summary(sim)
+# Display a histogram of the estimates of abundance
+histogram.N.ests(sim)
+
## 
+## GLOSSARY
+## --------
+## 
+## Summary of Simulation Output
+## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+## 
+## Region          : the region name.
+## No. Repetitions : the number of times the simulation was repeated.
+## No. Excluded Repetitions : the number of times the simulation failed
+##                   (too few sightings, model fitting failure etc.)
+## 
+## Summary for Individuals
+## ~~~~~~~~~~~~~~~~~~~~~~~
+## 
+## Summary Statistics:
+##    mean.Cover.Area : mean covered across simulation.
+##    mean.Effort     : mean effort across simulation.
+##    mean.n          : mean number of observed objects across
+##                      simulation.
+##    mean.n.miss.dist: mean number of observed objects where no distance
+##                     was recorded (only displayed if value > 0).
+##    no.zero.n       : number of surveys in simulation where
+##                      nothing was detected (only displayed if value > 0).
+##    mean.ER         : mean encounter rate across simulation.
+##    mean.se.ER      : mean standard error of the encounter rates
+##                      across simulation.
+##    sd.mean.ER      : standard deviation of the encounter rates
+##                      across simulation.
+## 
+## Estimates of Abundance:
+##    Truth            : true population size, (or mean of true
+##                       population sizes across simulation for Poisson N.
+##    mean.Estimate    : mean estimate of abundance across simulation.
+##    percent.bias     : the percentage of bias in the estimates.
+##    RMSE             : root mean squared error/no. successful reps
+##    CI.coverage.prob : proportion of times the 95% confidence interval
+##                       contained the true value.
+##    mean.se          : the mean standard error of the estimates of
+##                       abundance
+##    sd.of.means      : the standard deviation of the estimates
+## 
+## Estimates of Density:
+##    Truth            : true average density.
+##    mean.Estimate    : mean estimate of density across simulation.
+##    percent.bias     : the percentage of bias in the estimates.
+##    RMSE             : root mean squared error/no. successful reps
+##    CI.coverage.prob : proportion of times the 95% confidence interval
+##                       contained the true value.
+##    mean.se          : the mean standard error of the estimates.
+##    sd.of.means      : the standard deviation of the estimates.
+## 
+## Detection Function Values
+## ~~~~~~~~~~~~~~~~~~~~~~~~~
+## 
+##  mean.observed.Pa : mean proportion of individuals/clusters observed in
+##                     the covered region.
+##  mean.estimte.Pa  : mean estimate of the proportion of individuals/
+##                     clusters observed in the covered region.
+##  sd.estimate.Pa   : standard deviation of the mean estimates of the
+##                     proportion of individuals/clusters observed in the
+##                     covered region.
+##  mean.ESW         : mean estimated strip width.
+##  sd.ESW           : standard deviation of the mean estimated strip widths.
+
## 
+## 
+## Region:  study area
+## No. Repetitions:  999
+## No. Excluded Repetitions:  0
+## Using only repetitions where all models converged.
+## 
+## Design:  Systematic parallel line design
+##    design.type :  Systematic parallel line design
+##    bounding.shape :  rectangle
+##    spacing :  1000
+##    design.angle :  0
+##    edge.protocol :  minus
+## 
+## Population Detectability Summary:
+##     key.function  =  hn
+##     scale.param  =  200
+##     truncation  =  1000
+## 
+## Analysis Summary:
+##    Candidate Models:
+##       Model 1: key function 'hn', formula '~1', was selected 798 time(s).
+##       Model 2: key function 'hr', formula '~1', was selected 201 time(s).
+##    criteria  =  AIC
+##    variance.estimator  =  R2
+##    truncation  =  600
+## 
+## Summary for Individuals
+## 
+## Summary Statistics
+## 
+##   mean.Cover.Area mean.Effort   mean.n mean.k      mean.ER   mean.se.ER
+## 1         1.2e+08       1e+05 99.11311     20 0.0009911311 9.838211e-05
+##     sd.mean.ER
+## 1 7.436991e-05
+## 
+##      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+## Estimates of Abundance (N)
+## 
+##   Truth mean.Estimate percent.bias  RMSE CI.coverage.prob mean.se sd.of.means
+## 1   200        198.33        -0.84 26.17             0.94   25.36       26.13
+## 
+##      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+## Estimates of Density (D)
+## 
+##   Truth mean.Estimate percent.bias         RMSE CI.coverage.prob      mean.se
+## 1 2e-06  1.983281e-06   -0.8359462 2.617061e-07        0.9379379 2.535869e-07
+##    sd.of.means
+## 1 2.613023e-07
+## 
+##      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+##      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+## 
+## Detection Function Values
+## 
+##   mean.observed.Pa mean.estimate.Pa sd.estimate.Pa mean.ESW sd.ESW
+## 1             0.42             0.42           0.05   252.75  27.29
+
+ +Histogram of abundance estimates from the simulation.

+Figure 13: Histogram of abundance estimates from the simulation. +

+
+

If your goal was to simply learn the syntax for switching from DSsim to dsims then you can finish here. The remainder of this vignette loops through further simulations to test how altering truncation distance affects pooling robustness and covariate parameter estimation. From now on only dsims code will be shown.

+
+
+

Running Multiple Simulations to investigate Truncation +

+

To investigate the effects of varying the truncation distance during analysis we do not simply need to run one simulation, but one for each truncation distance. The following code shows how we iterated over a number of different truncation distances and stored the simulation with its results and the simulation summaries as lists. In this first set of simulations detectability does not change with individual level covariates.

+
+# Truncation distances to iterate over
+truncation <- c(200, 400, 600)
+# Storage space for results
+results.list <- list()
+summary.list <- list()
+
+# We will now run the simulation for each of the analysis truncation distances.
+for(tdist in seq(along= truncation)){
+  # Screen display to indicate how far through the simulations we are
+  cat("\n Running for truncation = ", truncation[tdist], fill = T)
+  # Update analysis with new truncation distance
+  new.ds.analyses <- make.ds.analysis(dfmodel = list(~1, ~1),
+                                      key = c("hn", "hr"),
+                                      criteria = "AIC",
+                                      truncation = truncation[tdist])
+  # Update simulation to include new analysis component
+  # We can use the @ symbol to change the contents of a slot or alternatively we could have
+  # re-created the simulation with the new analyses using make.simulation().
+  sim@ds.analysis <- new.ds.analyses
+  # Run simulation and store the results in the appropriate list element
+  results.list[[tdist]] <- run.simulation(sim, run.parallel = TRUE)
+  # Store simulation summary in another list in the appropriate list element
+  # As we are storing the summary we do not need the description.summary displayed
+  summary.list[[tdist]] <- summary(results.list[[tdist]], description.summary = FALSE)
+}
+
+# Add names to the summary and results list so we know which truncation distance they
+# relate to
+names(results.list) <- paste("t", truncation, sep = "")
+names(summary.list) <- paste("t", truncation, sep = "")
+

We will now move on to investigate what happens when the sex covariate affects detectability. First, we need to select suitable candidate truncation distances; to do this we will plot some example data. Figure 12 shows data generated from a population size of 2500, this increase in population size will increase the number of detections and make the shape of the resulting data less variable. From this histogram five candidate truncation distances were selected and are shown by the red vertical lines. These were selected so that the truncation distances represent a range of values for the probability of detection starting at about 0.6 for the shortest truncation distance.

+
+ +Histogram of data from covariate simulation with an increased population size of 2500. The detection function shows the best fit to the data (the code was allowed to select between a half normal and hazard rate based on minimum AIC). The red lines indicate the manually selected candidate truncation distances.

+Figure 14: Histogram of data from covariate simulation with an increased population size of 2500. The detection function shows the best fit to the data (the code was allowed to select between a half normal and hazard rate based on minimum AIC). The red lines indicate the manually selected candidate truncation distances. +

+
+

We can now feed these candidate truncation distances into our covariate simulations in the same way as we did for the simple half normal simulation and again store the results and summaries as lists. Note that for now we are still fitting the half-normal and hazard rate intercept only models and are therefore testing pooling robustness.

+
+# Truncation distances to iterate over
+truncation <- c(200, 400, 600, 800, 1000)
+# Storage space for results
+cov.results.list <- list()
+cov.summary.list <- list()
+
+for(tdist in seq(along= truncation)){
+  # Screen display to indicate how far through the simulations we are
+  cat("\n Running for truncation = ", truncation[tdist], fill = T)
+  # Update analysis truncation distance
+  new.ds.analyses <- make.ds.analysis(dfmodel = list(~1, ~1),
+                                      key = c("hn", "hr"),
+                                      criteria = "AIC",
+                                      truncation = truncation[tdist])
+  # Update simulation
+  sim.cov@ds.analysis <- new.ds.analyses
+  # Run Simulation
+  cov.results.list[[tdist]] <- run.simulation(sim.cov, run.parallel = TRUE)
+  # Store simulation summaries
+  cov.summary.list[[tdist]] <- summary(cov.results.list[[tdist]], description.summary = FALSE)
+}
+# Add names to the summary and results list
+names(cov.results.list) <- paste("t", truncation, sep = "")
+names(cov.summary.list) <- paste("t", truncation, sep = "")
+

Finally, we may also wish to fit the covariate model we used to generate the data rather than the non covariate half-normal and hazard rate models. This will allow us to investigate the effects of truncation if in fact we were aware of and could “measure” the covariate that we knew to be affecting detectability.

+
+# Now include the ddf.analyses.cov in the simulation
+sim.cov <- make.simulation(reps = 999, 
+                           design = design,
+                           population.description = pop.desc.cov,
+                           detectability = detect.cov,
+                           ds.analysis = ddf.analyses.cov)
+
+# Truncation distances to iterate over
+truncation <- c(200, 400, 600, 800, 1000)
+
+# Storage space for results
+covmod.results.list <- list()
+covmod.summary.list <- list()
+
+for(tdist in seq(along= truncation)){
+  # Screen display to indicate how far through the simulations we are
+  cat("\n Running for truncation = ", truncation[tdist], fill = T)
+  # Update analysis truncation distance so that detecability is now modelled as a function of sex
+  new.ds.analyses <- make.ds.analysis(dfmodel = list(~sex),
+                                      key = c("hn"),
+                                      truncation = truncation[tdist])
+  # Update simulation
+  sim.cov@ds.analysis <- new.ds.analyses
+  # Run Simulation
+  covmod.results.list[[tdist]] <- run.simulation(sim.cov, run.parallel = TRUE)
+  # Store simulation summaries
+  covmod.summary.list[[tdist]] <- summary(covmod.results.list[[tdist]], description.summary = FALSE)
+}
+# Add names to the summary and results list
+names(covmod.results.list) <- paste("t", truncation, sep = "")
+names(covmod.summary.list) <- paste("t", truncation, sep = "")
+
+
+

Running Simulations to Check Detection Function Parameter Estimates +

+

The above simulations concentrate on the question of how accurately and precisely we can estimate the abundance and density of a population. However, we may also be interested in learning how individual level covariates affect detectability. To do this we require a different and slightly more advanced setup. dsims does not currently store the detection function parameter estimates therefore we need to do this manually, however dsims does provide functionality so that doing this is fairly straight forward. As before we create our simulation but then we need to get dsims to give us the survey data so that we can run the analyses and obtain the parameter estimates. Please note that the extraction of the parameter estimates from the ddf model is specific to this model, if you are adapting this code you will need to check the ddf documentation in mrds to understand the parameters for different models.

+
+sim.cov <- make.simulation(reps = 999, 
+                       design = design,
+                       population.description = pop.desc.cov,
+                       detectability = detect.cov,
+                       ds.analysis = ddf.analyses.cov)
+
+# Truncation distances to iterate over
+truncation <- c(200, 400, 600, 800, 1000)
+reps <- sim.cov@reps
+
+# To store values of interest
+sigma.est <- male.param <- array(NA, 
+                                 dim = c(length(truncation), reps), 
+                                 dimnames = list(truncation, 1:reps))
+
+# Iterate over truncation distances
+for(tdist in 2:5){#seq(along = truncation)){
+  # Screen display to indicate how far through the simulations we are
+  cat("\n Running for truncation = ", truncation[tdist], fill = T)
+  # Update truncation distance
+  new.ds.analyses <- make.ds.analysis(dfmodel = list(~sex),
+                                      key = c("hn"),
+                                      truncation = truncation[tdist])
+  # Update simulation
+  sim.cov@ds.analysis <- new.ds.analyses
+  # Simulation repetitions
+  for(i in 1:reps){
+    cat("\r", i, " out of ", reps,  " reps \r")
+    # Simulates the survey process 
+    simulated.data <- run.survey(sim.cov)
+    # Run analyses 
+    results <- analyse.data(new.ds.analyses, simulated.data)
+    # Obtain detection function model
+    ddf.results <- results$ddf
+    # Store values of interest
+    try(sigma.est[tdist,i] <- ddf.results$par[1])
+    try(male.param[tdist,i] <- ddf.results$par[2])
+  }
+}
+
+
+

Results +

+

As these simulations take a substantial amount of time to run we have saved the results and summaries; these can be downloaded as dsims_truncation_results.zip. Running one of these simulations with 999 repetitions for one truncation distance takes about 11 minutes on an i7-2600K 3.40GHz processor when running in parallel across 7 threads. When running in parallel the maximum number of cores (or threads) permitted is one less than the number on the machine, this is the default number used unless max.cores specifies a lower number.

+
+# Running simulations in parallel
+run.simulation(sim.cov, run.parallel = TRUE, max.cores = 7)
+

Once they have been downloaded and unzipped into a sub folder called results the results and summaries can be loaded as follows:

+
+# Simulations using a simple half normal detection function
+load("results/results_list.ROBJ")
+load("results/summary_list.ROBJ")
+
+# Covartiate simulations
+load("results/results_cov_list.ROBJ")
+load("results/summary_cov_list.ROBJ")
+
+# Covariate simulations with covariate model
+load("results/covmod_results_list.ROBJ")
+load("results/covmod_summary_list.ROBJ")
+load("results/sigma_est.ROBJ")
+load("results/male_param.ROBJ")
+

The objects this has loaded into the workspace include results.list, summary.list, cov.results.list, cov.summary.list, covmod.results.list, covmod.summary.list, sigma_est and male_param. results.list is a list of 3 simulation objects for the simple half normal simulations with truncation distances of 200, 400 and 600. summary.list is a list of the 3 simulation summaries associated with simulations in results.list. cov.results.list is a list of 5 simulation objects for the covariate simulations where detectability is affected by sex but sex is not included as a covariate in the detection function models. These simulations relate to truncation distances of 200, 400, 600, 800 and 1000. cov.summary.list is a list of the 5 simulation summaries associated with simulations in cov.results.list. covmod.results.list is a list of 5 simulation objects for the covariate simulations where detectability is affected by sex and with the analyses including the covariate sex in the detection function model. These simulations relate to truncation distances of 200, 400, 600, 800 and 1000. covmod.summary.list is a list of the 5 simulation summaries associated with simulations in covmod.results.list. sigma_est and male_param contains the parameter estimates from the same simulation set up as covmod.summary.list. sigma_est is a 2D array containing parameter estimates for sigma for the five truncation distances and male_param contains the parameter estimates for the male sex parameter for each truncation distance.

+
+# To view the full summary for the simple half normal simulation with a truncation distance of 200:
+summary.list$t200
+
+# To view the full summary for the covariate simulation with a truncation distance of 600:
+cov.summary.list$t600
+
+

Extracting Result Statistics +

+

To investigate how truncation distance affects the results we need to produce tables for comparison. This section details how this can be done using knitr. This section is provided for those interested but users can just skip to the next section where the results tables are actually presented. This code is only applicable to study regions which only have one strata, it would need to be modified to deal with multiple strata.

+
+library(knitr)
+
+N    <- unlist(lapply(summary.list, function(x){x@individuals$N$mean.Estimate}))
+n    <- unlist(lapply(summary.list, function(x){x@individuals$summary$mean.n}))
+se   <- unlist(lapply(summary.list, function(x){x@individuals$N$mean.se}))
+sd.N <- unlist(lapply(summary.list, function(x){x@individuals$N$sd.of.means}))
+bias <- unlist(lapply(summary.list, function(x){x@individuals$N$percent.bias}))
+RMSE <- unlist(lapply(summary.list, function(x){x@individuals$N$RMSE}))
+cov  <- unlist(lapply(summary.list, function(x){x@individuals$N$CI.coverage.prob}))
+
+sim.data <- data.frame(trunc = c(200,400,600), 
+                       n = round(n),
+                       N = round(N),
+                       se = round(se,2),
+                       sd.N = round(sd.N,2),
+                       bias = round(bias,2),
+                       RMSE = round(RMSE,2),
+                       cov = round(cov*100,1))
+
+kable(sim.data, 
+      col.names = c("$Truncation$", "$mean\\ n$", "$mean\\ \\hat{N}$", "$mean\\ se$", "$SD(\\hat{N})$", "$\\% Bias$", "$RMSE$", "$\\%\\ CI\\ Coverage$"),
+      row.names = FALSE,
+      align = c('c', 'c', 'c', 'c', 'c', 'c', 'c', 'c'),
+      caption = "Simulation Results for the simple half normal detection probability: The truncation distance, mean number of detections, mean estimated population size (N), mean standard error of $\\hat{N}$, the standard deviation of $\\hat{N}$, percentage bias, root mean squared error, percentage of times the true value of N was captured in the confidence intervals.",
+      table.placement="!h",
+      format = "html")
+
+
+
+

Simulation Results +

+
+

Simple Half-Normal Simulations +

+

For the simulations where the data were generated based on a single half-normal detection function the truncation distance used at the analysis stage made little difference to the estimates of abundance. There was perhaps some small decrease in coverage of the 95% confidence intervals as truncation distance was increased. A truncation distance of 400 or 600 didn’t quite capture truth 95% of the time, Table 1. The root mean squared error (RMSE) values suggested that the further away from the transect the distances were truncated the closer the abundance estimates were to truth, although bias appeared minimal for all three scenarios. Precision looked to improve with larger truncation distances.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Table 1: Simulation Results for the simple half normal detection probability. The truncation distance, mean number of detections, mean estimated population size (N), mean standard error of \(\hat{N}\), the standard deviation of \(\hat{N}\), percentage bias, root mean squared error, percentage of times the true value of N was captured in the 95% confidence intervals. +
+\(Truncation\) + +\(mean\ n\) + +\(mean\ \hat{N}\) + +\(mean\ se\) + +\(SD(\hat{N})\) + +\(\% Bias\) + +\(RMSE\) + +\(\%\ CI\ Coverage\) +
+200 + +68 + +203 + +33.72 + +33.50 + +1.43 + +33.61 + +95.5 +
+400 + +95 + +201 + +29.12 + +33.34 + +0.71 + +33.35 + +93.1 +
+600 + +99 + +198 + +25.39 + +26.13 + +-1.11 + +26.21 + +93.8 +
+
+
+

Covariate Simulation Testing Pooling Robustness +

+

These simulations test whether or not we can rely on our assumption of pooling robustness in this situation. We have deliberately not provided the model used to generate the data as a candidate model in the analysis stage. We can see that for this setup, when we have pooled two quite distinct detection functions, there is some bias in the abundance estimates when the truncation distance is larger, Table 2. These results also show that our 95% confidence intervals capture the true abundance substantially less than 95% of the time when we use large truncation distances. This could be down to an underestimation of the variability, Table 2 shows that for large truncation values the mean se (mean of the estimated standard errors) is lower than the standard deviation of the estimates of abundance. If the analyses were correctly estimating the variability we would expected these values to be similar. In addition, the RMSE suggests that the larger the truncation distance the further away from truth the abundance estimates become, with the most significant jump between 800 and 1000m.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Table 2: Simulation Results for the covariate detection probability, where detectability is affected by sex but the candidate models (half-normal and hazard rate) do not contain covariates. The truncation distance, mean number of detections, mean estimated population size (N), mean standard error of \(\hat{N}\), the standard deviation of \(\hat{N}\), percentage bias, root mean squared error, percentage of times the true value of N was captured in the 95% confidence intervals. +
+\(Truncation\) + +\(mean\ n\) + +\(mean\ \hat{N}\) + +\(mean\ se\) + +\(SD(\hat{N})\) + +\(\% Bias\) + +\(RMSE\) + +\(\%\ CI\ Coverage\) +
+200 + +66 + +199 + +34.25 + +34.98 + +-0.49 + +34.97 + +96.4 +
+400 + +102 + +190 + +31.36 + +34.69 + +-5.12 + +36.16 + +90.6 +
+600 + +128 + +188 + +33.94 + +35.95 + +-5.84 + +37.78 + +78.7 +
+800 + +144 + +191 + +34.85 + +37.17 + +-4.43 + +38.19 + +79.6 +
+1000 + +154 + +187 + +31.68 + +40.97 + +-6.41 + +42.91 + +69.7 +
+
+
+

Covariate Simulation with Covariate Model +

+

Finally we ran simulations and fitted the model we used to generate the data. In these simulations truncation distance had little influence on the accuracy of the estimates of abundance, with the exception of a small amount of bias for the smallest truncation distance, Table 3. The RMSE values suggest that the larger truncation distances did a better job at estimating abundance with the most significant improvement coming with the step from 200m truncation to 400m truncation. The 95% confidence intervals captured the true abundance at least 95% of the time for all truncation distances. In these simulations, the variability was always over estimated with the mean of the estimated standard errors always being higher than the standard deviation of the estimates.

+

While the estimates of abundance are not greatly affected by truncation distance for these simulations, the same cannot be said for the parameter estimates. Figure 15, suggests that parameter estimation is most accurate and reliable at maximum truncation distance. The unstable parameter estimates for the smallest truncation distance leading to sometimes very large estimates of sigma and a bimodal distribution for sex.male could explain the slight bias in abundance estimates for this truncation distance seen in Table 2. It is hoped that in practise this strange behaviour might be associated with a poor fit to the data and would be identified and such estimates rejected based on more extensive model selection criteria.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Table 3: Simulation Results for the covariate detection probability, where detectability is affected by sex and this is modelled in the detection function. The truncation distance, mean number of detections, mean estimated population size (N), mean standard error of \(\hat{N}\), the standard deviation of the \(\hat{N}\), percentage bias, root mean squared error, percentage of times the true value of N was captured in the 95% confidence intervals. +
+\(Truncation\) + +\(mean\ n\) + +\(mean\ \hat{N}\) + +\(mean\ se\) + +\(SD(\hat{N})\) + +\(\% Bias\) + +\(RMSE\) + +\(\%\ CI\ Coverage\) +
+200 + +66 + +208 + +36.14 + +28.57 + +3.76 + +29.52 + +98.0 +
+400 + +102 + +204 + +29.46 + +23.85 + +1.81 + +24.11 + +98.5 +
+600 + +128 + +202 + +27.78 + +22.16 + +1.15 + +22.27 + +97.8 +
+800 + +144 + +202 + +26.97 + +20.66 + +0.88 + +20.73 + +98.5 +
+1000 + +154 + +202 + +26.52 + +20.97 + +0.85 + +21.03 + +98.4 +
+
+ +Histograms of the parameter estimates for sigma and sex.male for three of the five truncation distances investigated. Red lines indicate truth.

+Figure 15: Histograms of the parameter estimates for sigma and sex.male for three of the five truncation distances investigated. Red lines indicate truth. +

+
+
+
+
+

Discussion +

+

In these simulations we have pushed the concept of pooling robustness to the limit in that our two detection functions for males and females were very distinct from one another. This would have increased the potential for spiked data in our simulations, that is when the number of detections falls away quickly at small distances and can make fitting the detection function unreliable (and in fact there were numerous warnings when running some of the simulations about such a scenario). The recommendation when performing distance sampling surveys is to review your data frequently in the field as it is being collected. If you detect spiked data then field methods should be adapted to achieve a wider shoulder in the detection function. This practise will help ensure that pooling robustness holds.

+

The model selection (if any) applied in these simulations was done purely on the basis of AIC. In practise the AIC value is one of a number of diagnostic techniques researchers rely on to select an appropriate detection function model. It is likely, especially due to the potential for spiked data, that some of the models in these simulations were not good fits to the data and would not have been selected by a researcher. If model selection would have been manual then a researcher may have chosen to include adjustment terms in the half-normal or hazard rate models which may have improved the model fit and associated estimates of abundance when relying on pooling robustness.

+

These simulations do suggest that there is only a small cost in precision to the researcher in truncating the data. In fact, truncation may be beneficial if there are large differences in the underlying detection functions due to a covariate which have not been included in the detection function models. We suspect that this is because when there are multiple detection functions pooled together the tails of the observed combined detection function only represent some of these detection functions while other have already dropped to extremely low probabilities of detection closer to the transect. It is a general rule in distance sampling that the shape of the detection function close to the transect is of more importance that what is going on in the tail. And indeed detections made at large distances, if included, can have an undesired large influence on detection function parameters. The generally accepted rule of thumb is to truncate data where the probability of detection is around 0.15.

+

Conversely, if the researcher hopes to identify which covariates affect detectability and obtain reliable parameter estimates then minimal (if any) truncation appears to be preferable.

+

The effects of truncation distance on estimated abundance precision are interesting, especially the comparison between our estimated and observed variability. When we only allow the simulations to fit the half-normal and hazard rate models but detectability if affected by the sex covariate, as truncation distance increases the estimated variability (mean se) stays roughly the same while the observed variability \((SD(\hat{N}))\) increases. So at larger truncation distances the variability in our estimated abundance is underestimated and our confidence interval coverage is low. However, when fitting the covariate model our estimated variance is higher than our observed variance suggesting that for this model we are over estimating variability for all truncation distances and our confidence interval coverage is high.

+
+
+

Conclusions +

+
    +
  • Truncation can help ensure the concept of pooling robustness holds when there are differences in the detection functions of the individuals in the population and the covariates affecting detectability are not modelled.
  • +
  • The estimates of abundance are more accurate and precise when the covariate affecting detectability is included in the detection function model.
  • +
  • Larger truncation distances or no truncation is preferable when trying to accurately obtain the parameters for the covariates that affect detectability.
  • +
+
+
+

References +

+
+
+Buckland, S. T., Anderson, D. R., Burnham, K. P., Borchers, D. L., & Thomas, L. (2001). Introduction to distance sampling. Oxford University Press, Oxford, UK. +
+
+Buckland, S. T., Anderson, D. R., Burnham, K. P., Laake, J. L., Borchers, D. L., & Thomas, L. (2004). Advanced distance sampling. Oxford University Press. +
+
+Marshall, L. (2019). DSsim: Distance sampling simulations. Retrieved from https://CRAN.R-project.org/package=DSsim +
+
+Marshall, L. (2022a). Dsims: Distance sampling simulations. Retrieved from https://CRAN.R-project.org/package=dsims +
+
+Marshall, L. (2022b). Dssd: Distance sampling survey design. Retrieved from https://CRAN.R-project.org/package=dssd +
+
+Miller, D. L., Rexstad, E., Thomas, L., Marshall, L., & Laake, J. L. (2019). Distance sampling in R. Journal of Statistical Software, 89(1), 1–28. https://doi.org/10.18637/jss.v089.i01 +
+
+
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/articles/dsims-examples_files/figure-html/checksim-1.png b/docs/articles/dsims-examples_files/figure-html/checksim-1.png new file mode 100644 index 0000000000000000000000000000000000000000..135d3586eeda774d0eee9e6e26a739a5416e0f27 GIT binary patch literal 8244 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 literal 0 HcmV?d00001 diff --git a/docs/articles/dsims-examples_files/figure-html/checksim2-1.png b/docs/articles/dsims-examples_files/figure-html/checksim2-1.png new file mode 100644 index 0000000000000000000000000000000000000000..fcec5da6d45cb19bf457bec50c154f91a5ee289a GIT binary patch literal 8323 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 R)Sn;#(jVnNl!)p3{y)#2pe6tS literal 0 HcmV?d00001 diff --git a/docs/articles/dsims-examples_files/figure-html/detect1-1.png b/docs/articles/dsims-examples_files/figure-html/detect1-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d264a9a9738e750973b2bfbc4c06da5dad6d44af GIT binary patch literal 3610 zcmcIndoNHY$%yA&(mJ9CN?AcinaWyldTczw2}MIp?$Y{+@l#UTc5PH_hJGQjkxY4*(!& zg)?^q00F@b!@~hH>0C}{;I7i%#>oQi0l)%409Y)*!jc3C6nG9#uz;||Z9VXSgeAbB zU`a6Ogg*|1KNbWMg#a@Y3V{MkHVF$z1Q=Kn3D(d_bP976JPBF|`^;Wp(8-uOZ|VQ@cEA_!@jwQ-?Tv&cSoy$aQT%qT ze4~HSPYXJoq*eN*gPR=Be&E-zW;(x~_uQGyv}{r!t)x&`pOrw1Ch005qH8*RfY_tnjkn-NszBJwX13TS>tebR3UM; zwZL&wCpLW4Z|()^`idGjBek_h4v3ArP9J-krE|qi=~CIEi}HEzw5B+!08J`o_YSvJ zfbZmjK5)-%n}A*&AKqu9cL7QBk-=EkhJmffCBVvjLkwf?z)Qqkj>VLkouf!76tJV? z#5%iwX7xtUR#OUCb4u2p0SHWEEdyzS`}^??2g|Ae9plAEF+<2_gS5EitM%Fu#TtF? zkCCH$5}C=KCa?_(NTu6%5+fc7v7nGkEYsQib2V<@=Gw-``)<56EY`rBC!j@Lxd_h-TJjt4U8nWGhLQ z+3lVSXmbIV0Uw!e?XI6ArBYZ98s^H>Y{;z0>~a+Xx{1sy@Xg`s?tW#vwjQzwXLOz#RjElX4_pn`B}arkhCoB~qBT9oG3 zc>G!og}6YU5ZX-d_C$(U8R?Hc$rHADvaHUD$&CeXchdTdL?G8+l^i*AyBO)348^}t z0xXd4e`u+4r4TUC{>Q7$EAGIMgblCFANc(lOp>;GGO0 zv+r-F@W>)D0GaM+d=cQ44U|_ox+er?V|N9AC!>L4Jh)iesiR~-NBlMpn&oRlXdZl0 z+lL(f{+roPF2b7Rn0A~-)iCh%W8ew(kXOe2n6J$K{nIE+2EgnE(EgNip7de>ydEqU z8wbwTov(u3NJJXhSN`+ZgI7H8(*5W|M3w;CMK4ImEALiZvEW=uO)(F;V1)?2H?T2I zK%=d1Zd}}S$gcY58%gl5fx-IpxXgvaMuY)($h2klNqYv*zPguHV!i{>jC ztipJwndo=jA$3C!-PaH^2ZFQE2`Rh$g*@C0s-%zhu%s z)eI5!y9Q?2#|^K$p%N@fLRw=!9AIcIutk22y6+d7%8yw0NZbNgBl- z(^belVH!R>vm7Y^c8fWn7S>~&1Yh$_<9E-XCZj2?+><&Axz0Wqi3}HFAHZ@zC1;&^ z)YKQ}i9_drs+LR#p)$MU^6KuWIt3- zv+vRX`BDov2-Mdo8xsIgQXfay@_K779_Hck33nf;U`wTo(AtuY#QodoFuTCepgo+@tk=kB4=X0CT()~g$6j66 zu;TBBvbi6+^Q*tT4L_n*n~ryE{nF~HqEJGlt!{4chCA%a=@K{5Y3aU`N!PP(Ndk~u z_Kwt&on86*2{=A-(u)?)2l?;U_wyu0HM`tI#|U$V{KZBc zk>!VV*b`^gV`?3d1)$VTGBp9CtR5&-UMIa!uuVdj?RD6xIR{ZWRIx7N>tclw1lweF z*6SmsAU<>{Qe>9ui*m*lDFf|XvkFA>X)Q7qxfexPwR`KXBogiYKoxH^I!7kTFr@Jj!Ez%eF|AQ!e4; zfzvASFPN%wB4T%T$niHXd^*Ghp(PLI;kY>4ckoLqIU*A7A$m

~9=D+QjTI<)WvV zyxUVb6%><87QS(4p444rAzYa%R!>XQ_t?h@DH{q`xuaGJ2NbKbdBr~SIi`u*6#XDV zR@Lsv2%ucAeTo+f<&Cy{^Xaz^{PlWX=DH{0RH%uEY66sb^A!1De&!&FkjD8M(a~aP zY4qsCJudkLu5O_wKiz%Xuf1_Nkh<#P7`>I_hN;{mMfZ-nmbptLhybroi$j+y2fqp8 zo+~5eu7zj_TpUg{FEcMB-7>U#y;$-vaTQ8y=9dp{iZy8fYl-c}kUXx7lNOT*SBnK+ zK2!UaSlZ(DcIC^{{wbMV4#P9>LccFnhWBd1|rl3bH{Gr01;Lhgo&RnTMx#sKB|xirsB$iA#2 z+bmcHFW7OEo#RdFm%9AR8Nc^z#g<`PaJA;H@8tG%gqD)=HpY!!ZI$^L-fd>}d_jjB ztyTxEb6W<)Qq6B0ykthSXYEj$JTR|~5(k)NtJU$v{d>pmIIZK|e?N@Z*dJCb_~u#; z716x?NE2VJJy@Lzv}#%s?%1Xxtto( zi0AtZ?ta}XNIOGH5IfEZPW}_pG!4=*;39s^Qx2}+|B1bVfbpwY*Zjh4SBGTgbp%IX z|M+7jYPtCkaUbdgb7J6q&jZ`Wb$2Up`BeZVTrntX*MF{)@2YL_5Mxlm>$pFAD^lwZND{725$_udv$sH zE)Dn2MtLZ6fr(QnH)4|%GkN0qx^Wl?>~GET-DYFW;D#>g`$uZHhXqVCUtG-wkjK1E zdGD{8e#Y;KmD3KW`jfRU;^&GJLu}k7P01C;cK3h4c8-A5Qgqx?S)O|3*^=J1Mo$NA zr5W2C(eZ{zE#1DdeEpS`;ogZT;n!TWaG4*Yj^a8~XJ0z#mXt&_=i9V6T19~1u5``U zA5{38jF#nb63tZmNG;j)pQ`DYfp%OAP0!iuuC$tQz4L{S{38mPjJ3~8IKzpfgOBwe z9FF^xA5tBr<&cawBrB zz~WR$u!T4uxEG#9&%iBcNhQM<`xC{ZocMhzU|hu@7)!m%!fd81wRw+)563s=-Ou4k zinlL(+<*V-gL{a}b_lR5*s~LXzpUictaY*MWwfXVYuij{`unj8lDm@*G&grr?=NFX zrG}=NdQP+}|Bd(${`cD7|Hy5wL_(*iuX+(SVulN{o0jTt)b?IEYpvDlI0T%~yCqLM z7=2S@eNv~RLESloe+tF_h^jPHk>p8dwDqD|XWfO~+FEen?O&>bjf@K6!EzqyX{ci^ zt|A*@a-I7Qxd1KRkgIDP6nGAFuc0q+<*J_zdxuI!)=Q=1r!Ndp(DMo79?loM&vEq# mzpX|)DMRV-oyy{W#!`G$A2;;5SFUL5AJ59d)|_mHPy7e<|6e}< literal 0 HcmV?d00001 diff --git a/docs/articles/dsims-examples_files/figure-html/detect2-1.png b/docs/articles/dsims-examples_files/figure-html/detect2-1.png new file mode 100644 index 0000000000000000000000000000000000000000..54180c0d32090313b2514c723d59b8d1fa4e3be0 GIT binary patch literal 4710 zcmc&&XIN9+vQ7*nv>+XU(5p&sp@{(j0YmQ!1cZ+!y($_AMd=z4kt#J*1!)1P0YN|! z1*G@h0(>F}Qp^p0_nu$p?>%SjS+i!|d1tL>??1El#2Fjjgwk-*0001}p01WD006|0 zCm$7vjKou#JCT?7#z=E*@(KW`001rk6%~LASz`e%WWkdmvabSgIfu^&*}$r}kOi-T zCCik{pB$Gz3>Pfkg^b|wE_kvgVO0QFGTQ}!by2}$$>M^=;>iydKZPYnr|{S*65a)X zcTpjy;j!c-a%2im21$54i8O^(nZmkE;mLwMhtCIz93-nL5{aBiW{{@H#B(kg@HP5D zMScltUtOC30D%7e`2_a(lsW?djCy)n8s_)2x9y-I#5%@SYAFMZseSENHpR!LZcexF zC(+i)4@?nBB#U}=iQUTWWQCuvt=iU{Yww{xC(4iNra5z*uohtIfbT#<;AMJUF03k_ z7h>nX1Q7aIstb8geS7Kx|xpLFz`isaVpB*Zt4sezIj zEJvs9zkh9qA5QYph_IB3v#N`)`&UP2k*?J}o2r@c+K+%6c|okp^vwuj7NwW7GOeye z1|jkWVWzfgm=C(H0|63g65xni43zZ?4IN*OHOp&pw~8eRchL6XXP;|TN(3pqXSYd( z32-&U)#0sBXwNGO5{9>uLCyR$)cHtjX_4OQzGw5m<>rB>h zGW)ghEaD|d(2Me}TNI2S6cddH*;a3A8as~g+&`N%KfZ%fU)A!pWyeUGMB_HQI>FnD zg;c6)qb!Aa$*?Ciop{cq%Kopw2xqPgd0T~hiMB1ENS(%=qB==QR?*)D?db&*+{%1vJ06IesO2*_ z@79N!?ym~(QM37=3w`YNAo`|!$NLHknkyrLv9^NKN_=XwO-e?K2Umv;nxH}9(_MLA zfj3hQM?~jxyg_L@n4d}3;~mocx9zHqOZ^A^ph`;i^P8X0GfpPkHv(2R!xH0fOm@G@ zPa!pZr({>`%wJYHxWm0|OK?Ao^xVTKc6Jy?^Mq43jjL>_Sk3B*P69$&Xm&w?a-7jm zce5Jjq|K$wQCoO@Sm2FT=Mdic7j?U!7Esy*bmpW(Y0BsuJR@9o4&7pmPJz!oJ{u}# zcYapEH4WeWx!Yd3l-9Q5HA4+qLccP}2(>&?t(FxVLe#V}TPoTJMFjtv}B&u#Xi`{QpQCNa}McaT4% z2-?eyRpbl#_rM`8B+R|r8S$fDYdPgJD;;8MY%^*iB5Dq2_pRZs2;Zqmhxp(^mbbMG z#gUK4g(<^lRTd8F1oYs=#MkNEzNp~bj6IYT=>hPtTRG2`Tl%WQZ`QEx$w_DqyD!QX zYAqwh&@H)r{8_=c8Yr_|vm>^x7;3Px2@pYq?ka2qE zgF1iEj}{dSZR~s|r*UDU9XElp3u{-stGI>XX3x8h21!e^-JWFauDZxA{`zff0DvpK zTY}v|G(Pr@B*DdUGHqM@+!`9YEDYYuZ18QHwj8sU)f| zREj%R)UxRrs@MRTa$v8*U=X-Oryau0H(i;kcF|q_MamWYJ-pS6)5}w-?bEmA2x@-yEU2m z^7Y|RgxjKbKzr4<(3qkQs+!qbkb<~P9pXx%=ovi9KG-})Atdhxnr3Cb6B*L1LS-Bj zTEH1^{E3-;6SI^O7lNU=FzBHIC?9%KD)KJ=1owoG2SS&&lS)6%-cUG}m7UHQaQ%Jz z$WF-yk^eU~+u@p=xfisx$U;aj_bkgZYt=Ju6?us4UF9VyM4 zekRUx3=(t7G^31Ky@r0eyvPK~`V}=k-;04QY?_Xd054EiN0kVHxP*$EGu21NFDvcQ zRfg*bp8|BwD6hBkxLi~0c8{WN>p@~;Bp*Xb2IE$BbfIkHn?p@VdZ&pO0=)qC%A6Iv z{TzAXK-=aoqnoqmy5F~2s5hfOl>_$xb1s_8-978hCQ`KS{*7P345{V?Ydbn=b2nCn zHwMtZl^7l6wfsu&>pDqKWeRtH_(QvXj+t8SuFPTq6Tb}0q+5V3C^+|QM*V0hLADfl z@>7`S8)h`)t;!Lnbh>Ey_AA{CMyGENudJ+3<_Xp&%~duA+J&Ky-n707#9yJ12s(Mo zI-KpU%!f4Cic6_oj4R@(P7duG?K(lAp1mjs9v%-ewhH={!S&%)kKZ!(+O{1?nT4qg zjk5OeTK?V27gB5idgRfw{)I}p$G}od?rxypQvcwx7@nqY^{)%Z2c|~?jTgt8)xXZd zLhGtM=7@0%^c7oQjz458dw?>(rJl+6K9KGzbM5L~RSNTrlx#UQbep1m%RJnbWGpAp zC!=3h@~Xoy8)e({`lV_$8YLY$9yUDD6&kmgzVaE;#eDVTc7B{oSJM}|I9QG;Q>;i6 zS9RZ$!iR=XeFNRA6k5zB?TlNhaB-!}2d4;mzdcUuwEBL@T6&5a^&SjK8!K8|2mGN{ z5dG?rUw^ELuo;H2OO8l6$Z8u2Qu-?ORC_{0Vks*Hne*854u`=$mxfS2%7-*TC6UB8 zaJjF`rq|ErpvzA|!gQD5Zghh**Y+K_mg>AHzMP(o=X88}1_$rcXY=GI2I$NBvF-KZ zmF^BjO**&USX-)>G1L?O`(qL4T^)^`CRX>FYP;7m!F?#{p#VFMabd?Q>Qo36Q8v2=7 zSZylZ3YG-X$pkrCE=SW%G<{FkpnMi4n`{QF9ikVmb=&whVCc-+^Sa*bGcwe$%th2= zJ-??-npM;rJU@Mq5=Rr}jN8o2O<;o4`mTEPb)oN#$~uY(*!x@&5@56u&S><3YKqc* zNHWfT`k=mB%riFXdrm#L-%d!bf@=wL_Xtd=np|`P36!d(D=;MoJrHm#iC=y4CLl54 zwH5fsFU;#+W>=due|o|L_wQXD5*iN$j3y94%AAzsbz4O zonXXYA+t4MwR^hAO;C-etRItK|KyTP2GF?!XtMYVW38@QEQ=9u;Ez}1Xa1B67}gS~ zF*eHn%~34}ZfEYjaLpvNnbRGin=Pt8f;nPg2Fea`E_NAx{DDiSPfU&#zsyH-O;}l= zFM56tXhZkBjl!>=tthG+;>-d2$kZ*9MTiLG#Zn60%QVjx8p=i(dd8Odm?e!hQwbem zvi)0V4E+S3e~w5tM7R!A_Vql){@Nx$1`%FK&j9*gv$*Z1 zXSdtGzc8I&sYH@*o4h(2t!UY~vmX)Y(g8?%!=u`cqm{aM2XB7->84RhS<$102qhJ$ zhi@}y&GJFMOKLe*4b5kVTT5^wmKSg4pxpLNbIf`2zJ_q2s{)b2D<^>1yTcA?Rdh-B zvNB@!j{AloLmRl~4>_l@g=pdLzw=kb*k@#oI9-vLgCJP4z^FP3Z*<4~V?@*5YQ-c_ z{^zHdH`K-aO(B2?`vv=pV=yzPz3qrgvWy~!bsD$={M6vd@QAAg7sAPEj5N6pej+yg zn6G@l#4P3icyuX|`L`EVHd;5#&qlM#lgDxKOq)%`gXkZ6gcDSV$Pr7umkR)Y3;C-sJqzpH!Wcg0*sVNdA>8p)K$D?frskf5 zZj!Y-bgD=a3g+93i!INO*ix8m(vwt z^5=n}DdGR|f84}K^iuroAsDf)cFqc^Nx2A&i&wo!}qxP z3eaj~5GItyh`lL{>%P7NwquBvg_D#5dZiy;vp zVkISOX4@9WpO~ZI>t}Y?j(^UtR91kqx%s>ZViYsRyO`qypNr*u6bfF147(FBR?&fF zI%&N1vejW?>6Lo{-^XSQ)&MgnCPCUhDC6uq*U0^bLSH2olZiDu+R{VB2+B)s?@eU; nMWqJAubSMx8vpe{5RSvCk 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 ZmggBX?AWPpz4~kDaM0Pd^cTO_{{nyO&)@(6 literal 0 HcmV?d00001 diff --git a/docs/articles/dsims-examples_files/figure-html/region-1.png b/docs/articles/dsims-examples_files/figure-html/region-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d6ccbfb2a7b0d933cb1e3b47f825eb1b781c112e GIT binary patch literal 2346 zcmdT`X;f3!7QO}$WC#jX6rqS9g9xFZ3<-!>D4--@1q4zV1OpYg35EiqfI%fjcp)u= z2w||aVjCnh+As(;fHnkWlKKD>OBf!53<)v>ByitN*Ltfzp8kI8o%Nk>-Lt2&&%XPf zb!q-MFD-R_bpQage7rrr1b{7KcQv4FCiHjRw##GXMhD z-rgP-DFli^Koejv&;%};0YivY3=oT@V?h>{-VqWKLV*3zFbD(&gTN3HxLg7kW(YO{ zu^@=0gCGnR$Qq~r9Di|VxR#A0S20(aOE<%LWU4xfmoKpn$GHAvBt+);}Dks za2aSWtmg{3LKqMi5^^D^gO2ThARz-SWDta07z~9H9uRB-Gc?Wu$02B9;{D9b3>*b^ zfUOm-<17e{0V%v;D+q#~`WrrjE3u8_9YO{GWV>Q+;S=vi1AuCWkB56eDs%2lTvUGm zKwSW${;4sDyl&Zcj2ha!ud+;?gOqZNqY56ZZ4N&rf0ul+$iek%TyS^Aq%7-flf!i? z^YC+BFE(af$(9rCC^{&O8X>TZhBdx zB+!zi<8TYyiI5Bu*){BvM-H;h#)^K7>9Avpt=l(ubxygwf=XX|i^oPF&AU!1}@8Ya%Q zo|>?~3?yCAiGH`pr&LEJIg)cEJCFaVV~&1t_e*)Qt6i!1AuefpIJzfprOPVwUJQpb zR_n_C<>IjBzw&ttl(pY)ln&wL57Y?@(1n*rV^FW3UKTsfXg*FDb*^)k)0%QJH6^)| zya_@7`6qcd(~A3y>AX?3L;sF7weL7*uZVjx8i7w+xCW62K5nSgJuV( zbf9_4shDT&A9>TpQ(W}X?~sg)H=iQepk2Bta5_JeIcg$AEyXK5eSnQN&*52%cc;pw z1FEkkqsx{%Ta}Yb@^?xSUT?YM95Rw9%FgPj>_xP@er4F{8u-g1`c&z&)SxZ)-?2bI9Kmb950h<0dKE7^RoZbFCW+zQfV| zly8Yyh>c3%6_f#u#MT?w+m;w(vE7ML5vnTMA?V)hb?S2q+L&+A$8Q-vuS#qEHy>sW zG7lfI&XG*5Tvg-vx?mA~M)*TIaqy^C4X8_>8tv|>ywC7GT4(8*w#vnnnuNE~pU^p(;R?ttK2Coa`M ziOAkK$BhWH(e(S#xWp1Ol331(QnEj9?h?k0K-8c4k*BDfrS0kDw)Vt2r|xLlhcC?r zG{re^&sBX2T%0U@%B4nIP0^721@fh~{3@=psBz#kDfi~M-t^wHv`d+?HiV0Ech@#)TdrHOl0{>vcMG*5<$w+`$9q%b zNTUvU7>;o@2yCUzWenm;-`_1PhBm#h@vWP(R@zI)A=df%Lhokl{kjdb0|m{{DcyCk zhzX!(o$NCXAA+M if20NeF5my^X+xVJ%HGOSDb-Z`^Z0n;JZg_eWc?el_+?1| literal 0 HcmV?d00001 diff --git a/docs/articles/dsims-examples_files/figure-html/simhist-1.png b/docs/articles/dsims-examples_files/figure-html/simhist-1.png new file mode 100644 index 0000000000000000000000000000000000000000..631e66d51ab3e11e2cbfa258cb106f8549f5d3f6 GIT binary patch literal 3881 zcmb_fc|4R|-=8wpv6VGan2bVkt1M$HyGA1;vW#tF?2Is$EVr2=4H{9=&~#fO*_W~F z9?Okv*$P7qvP_8VMZA~Z&-;1*dOpt|&vUNd*}mudJJ&hCvnSj@n(*;R@PI%dJ~LB8 z6bN*L33zEPHUM#$z99reT{p~c8UZl~1P6hzAUGTZ2SPFk3kVH>fIJ+8J%kS(kRZdc zfY9J%Kp5EHI@sR~EEbLh9GQ$I)387hjfSNG;Q<*AB4Yu8AC{15z(=Mr$N63OCNwE(iqTZ$0!!IsyvZfCPt`;nkaAnaf$>w;434IF{0jk#I+c*Q^i4 zPZ%YP9$%jiX@2$R(%hpD1TIg21WdtgY&)}2`=&|>8V^jQ`FUIhK!d_Q9-tlwScsF5 zz(#M2b(y}R5-6RnA!vS*3&#H+!nZ;#fc2xbGkBsSHZfmSi|XDN?+nS?=0@19@@A0a1?W2OFl(ws4=E<=^JUDG*L~!= zur!{azzs2 zt(H4Hh5&x(rV%3v6NnO>@FP;4x{mKQ6raf^_LlVB{Z*rwF1FPDcE5g|2M_gx;GcK< z7q$|zs=l~}xPlviUmyu~t}&sd4TezfvPkgbnQn;1{&5vNF`{VR?Y&TQMvM)3N_ z&!eIrKXX8CWn;#pkvOCI(6rS^fBXKlb%2LN#gzc)6Z6llk(5m&kAdY)_c`vyY9y)T5In1Sycx~l~?Jho_n&+!Sl;JvMVCt%^H+o%LN0Ort z8a4_AKa$B+L26aDhb-5b8sNNNatO(n@!431O{s|!X1Eo3e`%jxdDem=+2eyTLj#wj0!}BdO~3tUsBG zo?`!mcc9Bqlol0kLdW~_iC=rz(;>S4_n3W#9gTXg4k;oW0Zu<=#C1l5E^8S0x~~3F zGCW6#Ps?F87>CyM8LP_(MzSN7BYM`arQgP%diO?A?LuTwv$ei~P<0{BMLN)2^(FY{1~KhyK?N841Y2&EEEa}KL@o<|BVw~(GJ>at1_3}K^{b30{363Q7Ms>yNbKB!IRTC zO;Z8qo0O_#7p`79Yy?Nd{qpIXa=%%9r5AXUFDR*iEi6jKqDIW!WeHK})H<|`CjVCZ z#SyzX!%?&ThCDrh9Fskh_%@?vBc6F;Vc&OaVluZ*9Sme}-#8JKx*^vu?mpcY)Mnc{ z{;RIhG7OsyEtgn&O99iLI`Qdllac{V>Qb}{*unnog69`wc=X)l;Aw)#%Ux3P;+&?m zhNkL^g+G~pxM>d@q2K1RuYdf(kQ128ZmetGt!KDSUF{qcIWX){_-$<&#H|~|i)TDp z*DylBB$2o}I`||P23HZ&iA#J|a%ENgf9t9mXL9F|czEeUse{N+plyKlrvo~P?Zr}^p>Xa^f zmf-@=0UEsf>5;-f8<%DRbCWLEs4F9Xtg+?u-DL_G7WN5@x{aqpy;mQr(0x2)*p4!o z2*tf;U_ytW%}V~*c8sia81ISDGeGDAY0mDCMSdta`oebfF{@NqtyIYXccDvv73I4A zP8B@=SP85w@~^oI?5{@ss4~)1B~VO+&dB<@)uU0q75ccF6(h^)=C}=3$p{C6KD*+c zbGFp+8MX1%xv_+=(#Kq(L&c-FplWuf)D-OSN&&@x+sV0S_dW*2QVN4RZKV^_nmsMmVOaZ%T%?F6YTg{7-EaS8)@9-m}pqxV?HgI;9K zUH`4KdOq-@Qs`uaXMF|hQPWKcxvO0dq3cbC2-~Ly5&Ygc)B-1y*>4EJ^b+%n^_9>^ z0@rD%MdO(vN9(d4-{r*c3pwg34^F5rlufa=4DKcOc`w73f;HXot-1efWQXf^`~AJ} zt9BqnCGtx^Yh1n$k0z#t4%q0!y?)>9R&+KZ`o~nvP3ZjR;mf4cK8NN*hDx_Byj1fI ztB_4wpc>^W(tA1nn|H)6t_ve5v-yFx%}-Hg)48GbS-}H zUr){}e-LITp$bVl%A9th7!us3EOPN^bK>)rYiF*R`}(zs;nycqyen}wzHxGD&lm-4 zMJ}5u+%7X#)J`!6$(je{%<#G(ADptnR>q$Flj*yxX5~D%-N$*2n7UU`+mH$xmQ6r0 zjIj{2mEV7Q_SThX1-N#^-Fqm=oU`cn4B@tBF`Ly7W4=Uo+_V*Ufz5}uUgyp%q0Hp8 zok~fO-NYF7F-}!R->$5m{Gtq_0Br&%T<5dVvV#-0lhz;AqTgA#v2}bZ-VCual&)Um z$yLsvkw*@SK`>pbnjVj@BbGG_=jmAm!OdA<95Wb%$=qShK8uHh zc7y}ep3n<%AW~j=S(}atK7_5`;q!0*SW165a5;VUi(b8KD0@w+cP7joi4rMt+W?a= zZ?b-#zriqhtyoghiKcoI!=H@XUp0nmWs6X~@+f__*jm1ChIyZMQa$5@rlCxLw}`srh`r-ILtU|ZfVxdxMblK&qXCyrY5?m2>j>o atbKur#tovU2FLBgC$E_i(y&C|h44Rs4kL8{ literal 0 HcmV?d00001 diff --git a/docs/articles/dsims-examples_files/figure-html/transects-1.png b/docs/articles/dsims-examples_files/figure-html/transects-1.png new file mode 100644 index 0000000000000000000000000000000000000000..dd36ef889d31a29a646f920681a91d54d7fec775 GIT binary patch literal 2317 zcmds(`!if=8pqFRj9W;AMA8~vZcB_Zu89_L-xi~#&5&rabWn$NX)>9(OP?hnB-4A4 ziCYA5Nu<|p$mxU;64%DWpa?oTndk^Q#1Plu?CI3ZR;uE`kc0Dv&Q$Z}G6B}>LT7~d$;J-l7>WhsNU4IK2!81NTD|90)=X2oXRi3ZZz$a1o2f zV$nD(77mxi6>&b$h2r57X7?(xkO4J-~FPAG4aYYyk0VqO2 z@pDvw3UDwK6QCH@%c1pRm;j*&5J-UHAd*8oFkFIXOvGi0Fl=UKODq=SU2p@gmRLnx z4DW$S+_(zEu$*FH4n7R|7&pcR08s9bEU+i~UI+ll-aF~y=pBD+p*SK?m8zC;M#Zc( zOtr}^qP3|DZBXZ;Wi>aiO)B1lLGzbb?)Q+je2d=1)Wn|clPkwfZi7Fy=#LDaY=kT4NW0yEpTaG>SLM`bh?{%+L1y>un#>yG43R%toR+RQHS}9{!e89l9jCiFJ3rm1 zDpdtDc&2vN@3r;U+MD}n;zjs;&$}XFTlYRAl z!b>jn+meb|?)pkf({i!k$)Q)$73X(*e^%9Fnr?>lkTA%i7wtC}^EHn)Z#izTwu;5F z+K~CL!t>#q$;3f{kvzVOgZY|l1i zB58#Mx()0yMtQf>fT!y(zl8_Ad}^w}UuCDv@Pa#Dm&~~zD?0O{IpX&QnokNi)4uzv zZ|Yrkd|O}S{x)KB&-{_gvjkyX&S|HsU$%Ri=0ckzOt%m)Hl|gD*M-?8>ll0i2JIvN znNp?Cro~@ZsTYJlV6h6yGiv;!2dXo?9fUnClatiU@v+ETW5>XvsPzZy6;ZMFcB=^6 zYrD}Iu3T@L*5W*#GM_T#E$`h_@3Oa*K2#FvSA))7+UX{xjPULAzX#&;g1Z{(>vQyj z;?rp*{`o(ws7GIi7t=UmnUB0}{Xu(C%_<`yg5euq^rs~AjC&Fs+GtlTOD_GZFV$hy z3;-+7AwXVK;vkxMYHWD!)EWq`KCRbcJ_q}YM-<`IivYpBV@b_hj^N}hef4uX=wR&{ z-_qNV$s1KRr0SMh?os=7XTBxY!G?%;&4+~}fhE#EmJcq7LahfB3{9v-Q&xE~hE#4M zoYJ_ikO&aMFFO)mgf7>N5rg5FgQ7&>O;`gk20DTIWU{3TeC%`fsMfzfO0`h(k&jUn zW>YNR%&yQJb*<#wRo)u6Kb|n6mSn@r-!;t%0~hI>n`>}3?*uM6(7rhP@EihPLd!@d zV(=Y@qm_QQ)M?*7qK*UUbJFE!g>h`7K}&D_b{|snUdoMfAHv$y#VWNjO(}(}^Eb*P zE;GObeM66zoo)P{OL4Sn564oCLmd}yGOmM1z`51XxF!#Wt#vSJ4D4gj&E({iRLIJo z<1DkGuRcOAfKzyO#osk~w9hP?qO$a?eRs)yL!o-5?lzP1rKA+cB*|bdN`LjmRT(HbFY_OkB z8*UwET3;HuHhh`}ZkhqFy}TS2SKx2YYGBiTE|C$ar*W7jy@u~cCI{rsqma0%N(E4H z_|GS};2Vc0dJjnJp#?{I3g{E>kY%WFsXN)<%=2HfV-^!tRjP>bY1zh!XH8}-+hi+) z==*!42Y3gjJF{4Jxe?(M@R5_NVe8#u4~=Qm>GU1uw<$5ffB(b%=#zW&N|5axaivVr zKe)HMDonbph$}6@y2axaD|{=fV)$$WMNQy5RaC>YO&(1*h`L`ll%IF_ZKr`S(ct-w zdf9kufqI>6r%eN&cRO=js){Ie{7T&H{oYR6sui(cF2A-W)ql{1B$bslTKVwycoOPU zulZO<_2}sHut?-tm0iOf|3OjV{yM3w=z{^-jlQxTNkLceRy<|6`v2l3`t+FQV}Rw3 V>h4BBDqZqhbJEq*rPhg=`fvZE|0w_f literal 0 HcmV?d00001 diff --git a/docs/articles/dsims-examples_files/figure-html/truncdists1-1.png b/docs/articles/dsims-examples_files/figure-html/truncdists1-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f2da94380f134f2696d220d4fcdb85d1a063bf90 GIT binary patch literal 4434 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 B_C){y literal 0 HcmV?d00001 diff --git a/docs/articles/dsims_grouped_strata.html b/docs/articles/dsims_grouped_strata.html new file mode 100644 index 0000000..7954bd6 --- /dev/null +++ b/docs/articles/dsims_grouped_strata.html @@ -0,0 +1,358 @@ + + + + + + + + +Grouping strata during simulation • dsims + + + + + + + + + + + Skip to contents + + +

+ + +
+
+ + + + +

These example simulations demonstrate the option to group strata at the analysis stage during a simulation. There are different reasons why we may wish to divide our study region into strata, or perhaps strata into sub strata, but sometimes we might need to create strata purely to optimise the design. For example, if we have a narrow study region that follows a coastline and we wish to keep our lines perpendicular to the coast then we may need to divide the region into strata and use different design angles in each stratum. Assuming we keep the coverage constant across these strata, the data can then be grouped at the analysis stage. We will illustrate an example of grouping strata at the analysis stage below.

+
+

Getting started +

+

Ensure you have administrator privileges on your computer and install the necessary R packages.

+
+

Running the simulation and viewing the results for yourself +

+

It is advisable to download the .Rmd file if you would like to replicate the simulations for yourself. In addition, results from these simulations are provided to allow you to compile the .Rmd document. The results are included in a zip archive results.zip. Uncompressing the contents into a folder called results within the same folder as the .Rmd file should give you the required structure to run the code in the .Rmd file. You should end up with the file sim.results.ROBJ within the results folder.

+
+
+
+

Creating a grouped strata simulation +

+
+

Creating a region object +

+

First, we create the region object using a shapefile stored within the package directory. The shapefile provided contains a marine study area off the coast of Ireland. This region has already been projected into metres and dssd will detect that from the shapefile .prj file. The study region has also been divided into six strata and we will provide names in the code below to identify them (“North”, “NW”, “West Upper”, “West Lower”, “SW”, “South”). Care should be taken to check that the order of the strata is as expected by checking a plot of the study region.

+

The division of the study area into six strata was for design purposes, this allows us to specify design angles for each stratum individually. However, for analysis purposes we are interested in estimates for only two distinct areas in this study region, these will consist of the three northern strata grouped together and the three southern strata grouped together.

+
+# Find the full file path to the shapefile on the users machine
+shapefile.path <- system.file("extdata", "AreaRProjStrata.shp", package = "dssd")
+
+# Create the region object
+region <- make.region(region.name = "study area", strata.name = c("North", "NW",
+    "West Upper", "West Lower", "SW", "South"), shape = shapefile.path)
+
+# Plot the survey region
+plot(region)
+

+
+
+

Creating a design object +

+

As mentioned above, we have two sub regions of interest in this study area, for which we would like estimates of density / abundance (the northern three strata and the southern three strata). Let’s start by constructing our design as though we had only divided our study region into two strata. We expect more animals in the southern strata so we will implement a non-uniform coverage design by allocating more effort per unit area (i.e. higher coverage) to this strata than the northern strata.

+

Let’s assume that our effort calculations have suggested that we have sufficient resources to survey parallel lines with a spacing of 16,000m in the northern strata and a spacing of 8,000m in the southern strata. Note that as our shapefile units are metres, all our simulation measurements must also be provided in metres. We will supply a single design angle for the three northern strata and one for the three southern strata, let’s set these to be 135 and 70 degrees, respectively. We will also specify that we will be doing minus sampling and do not expect to observe animals beyond 1,500m.

+

We will generate a set of transects from this design and assess them for desirable design qualities.

+
+# Define a design based on only two strata
+design <- make.design(region = region, transect.type = "line", design = "systematic",
+    spacing = c(rep(16000, 3), rep(8000, 3)), design.angle = c(135, 135, 135, 70,
+        70, 70), edge.protocol = "minus", truncation = 1500)
+
+# Generate and plot a single set of transects
+survey <- generate.transects(design)
+plot(region, survey)
+

+

An optimal design will aim to both maximise the number of samplers (many short lines are better than fewer long lines) and place them parallel to any density gradients. In the case of a long thin study region such as this, we want to lay the transects across the short dimension of the region (i.e. perpendicular to the coast). It is also often the case that marine species are distributed in relation to the coast (usually having a particular depth preference) so again laying the transects perpendicular to the coast should align them parallel to any density gradient and thereby reduce variability in encounter rate between transects resulting in more precise estimates.

+

We can see from this first design, given the complexity of the region, choosing a single design angle for the northern and southern groups of strata is not going to achieve this goal. This is particularly problematic in the southern strata where selecting a design angle to give lines perpendicular to the coast in one area gives lines that are parallel to the coast in another. We now make use of the fact that we have six strata and select appropriate design angles in each with the aim of orientating the transects so they are perpendicular to the coast.

+
+# Define the design
+design <- make.design(region = region, transect.type = "line", design = "systematic",
+    spacing = c(rep(16000, 3), rep(8000, 3)), design.angle = c(160, 135, 80, 135,
+        50, 150), edge.protocol = "minus", truncation = 1500)
+
+
+# Create a single set of transects to check
+survey <- generate.transects(design)
+plot(region, survey)
+

+

We can see from the image above that further dividing the northern and southern regions of interest into substrata allows us to better orientate our lines to both maximise the number of samplers and place them perpendicular to the coast.

+

As this further stratification was purely for design purposes (so we could modify the design angle as we moved along the coast) we would still treat each of the three substrata as one when we come to analyse the data. However, it is important to note that we can only do this because we have kept a uniform coverage across the substrata. However, the above design would not allow us to simply group all 6 strata at the analysis stage. As the northern strata have lower coverage than the southern strata the full dataset will be more representative of the southern strata than the northern and we must therefore ensure that any differences in detectability are modelled.

+
+
+

Creating a density object +

+

We will create a density surface to represent a distribution of animals which is more abundant in the south and also prefers coastal waters.

+

In order to get an idea of where to place the hostpots we can first check the range of the coordinates on the projected scale. Note that the plot of the region gives the scale in lat and lon despite the region being projected. We can access this information by requesting the bounding box of the sf object stored within the dssd region.

+
+# Get the bounding box of the sf object within the region
+sf::st_bbox(region@region)
+

We can now create a density grid with a spacing of 2,500m in both dimensions and add two hotspots to simulate a potentially realistic distribution of animals which prefer to stick closely to the coast. Adding hotspots is largely done by trial and error once we know the range of the x-y coordinate values. Again all measurement values must be provided in metres. As we will later use a fixed population size in the simulations, we do not need to worry about the exact values we provide in the density grid only how they relate to one another. For example, an area with a density cell with a value twice that of another density cell will, on average, end up with twice as many animals when the population is generated.

+
+# Make a density grid with values of 1 across the region
+my.density <- make.density(region = region, x.space = 2500, y.space = 2500, constant = 1)
+
+# Add a hotspot at coordinates (0, 1900000)
+my.density <- add.hotspot(my.density, centre = c(0, 1900000), sigma = 70000, amplitude = 10)
+
+# Add a hotspot at coordinates (80000, 210000)
+my.density <- add.hotspot(my.density, centre = c(80000, 2100000), sigma = 1e+05,
+    amplitude = 5)
+
+# Plot this example density surface
+plot(my.density, region)
+

+
+

Population size +

+

We will base our simulation on a total population size of 2,500 animals. As the make.population command requires us to specify how many individuals per stratum, we will have to calculate this using the density summary.

+
+# View the density summary
+summary(my.density)
+
##       strata             area       ave.N    ave.D
+## 1      North 4176461143 [m^2]  8731625315 2.090676
+## 2         NW 8180996497 [m^2] 25656220203 3.136075
+## 3 West Upper 6316380968 [m^2] 17438152704 2.760782
+## 4 West Lower 8188111047 [m^2] 41315196625 5.045754
+## 5         SW 2654685511 [m^2] 13585880563 5.117699
+## 6      South 9291229356 [m^2] 48534037861 5.223640
+

We can see from the table that if we used the exact densities in the density grid we would generate a lot of animals (see ave.N column)! However, as mentioned above, the simulation will only use this density surface as a guide to relative density across the region. Therefore, we will use these value to decide how many animals to allocate to each strata by scaling them.

+
+# Extract average N values
+ave.N.vals <- summary(my.density)@summary$ave.N
+# Scale average N vals to sum to 2500
+N.per.stratum <- round(2500 * ave.N.vals/sum(ave.N.vals))
+
+# View the allocation per stratum
+N.per.stratum
+
## [1] 141 413 281 665 219 781
+
+# Check the total sums to 2500 (sometimes rounding may cause slight variation)
+sum(N.per.stratum)
+
## [1] 2500
+

At this point, we will also create an individual level covariate to indicate whether the animals are in the northern group of strata or the southern group of strata. We will do this to enable us to later model any differences in detectability between the northern and southern sub populations. Ignoring any differences would not only lead bias in our estimates of abundance for the northern and southern strata but also in our total estimates due to the non-uniform coverage design.

+
+# Create the population description
+covs <- list()
+# Adds a strata group entry allocating 'North' to all animals in the North, NW
+# and West Upper strata and allocating 'South' to all animals in the West
+# Lower, SW and South strata.
+covs$strata.group <- data.frame(level = c(rep("North", 3), rep("South", 3)), prob = rep(1,
+    6), strata = c("North", "NW", "West Upper", "West Lower", "SW", "South"))
+

We will now include the above information in our population description and set the fixed population size argument to be true.

+
+# Create the population description
+pop.description <- make.population.description(region = region, density = my.density,
+    covariates = covs, N = N.per.stratum, fixed.N = TRUE)
+
+
+

True detection function +

+

We will simulate using a half-normal detection function but change \(\sigma\) (scale.param) depending on stratum and use a truncation distance of 1500m. By changing the detection functions across strata we can demonstrate when pooling robustness applies. Pooling robustness refers to a property in distance sampling which allows us to obtain unbiased abundance estimates from a single ‘pooled’ detection function fitted across a number of sub populations, even when detectability may vary greatly, (Rexstad, Buckland, Marshall, & Borchers, 2023). Pooling robustness applies when our data are a representative sample across the population for which we are generating estimates. In this example, the data in our three northern sub-strata can be pooled and the data in our three southern sub- strata can be pooled as these have the same coverage as each other. We cannot pool detections from any strata / sub-strata where coverage varies (without accounting for the non-uniform coverage) as the resulting detection function will be more representative of the strata with higher coverage.

+
+# Create the detectability
+detect <- make.detectability(key.function = "hn", scale.param = c(950, 850, 750,
+    650, 550, 450), truncation = 1500)
+
+# Plot the detectability
+plot(detect, pop.description)
+

+
+
+
+

Creating the analyses object +

+

The simulation engine currently only fits one global detection function to each simulated dataset. In the scenario we have constructed, we know that pooling robustness does not apply across the study region as a whole as we have different levels of coverage between the northern and southern stratum groups. Given we cannot fit separate detection functions, we must allow our model to be able to vary the detection function across the two groups of strata. To achieve this we can include the strata.group covariate (which we included in the population description) in the model, this will allow a different scale parameter to be estimated for the northern three strata than for the southern three.

+

Note that we could have simply included Region.Label as a covariate in the detection function model, however, within the simulation at the stage of fitting the detection function all strata are included in the dataset and this would have resulted in a scale parameter being estimated for all 6 strata individually.

+

It is at the analysis stage that we also need to define how the strata will be grouped in order to obtain estimates for our regions of interest. The dataframe created in the code below tells the simulation how to group the strata.

+
+# Create a dataframe describing how the strata will be grouped
+group.strata <- data.frame(design.id = c("North", "NW", "West Upper", "West Lower",
+    "SW", "South"), analysis.id = c(rep("North", 3), rep("South", 3)))
+
+# View the dataframe
+print(group.strata)
+
##    design.id analysis.id
+## 1      North       North
+## 2         NW       North
+## 3 West Upper       North
+## 4 West Lower       South
+## 5         SW       South
+## 6      South       South
+

We will now define the analyses. As we are simulating detections from a range of difference detection functions, we will incorporate some model uncertainty by allowing the simulation to select between a half normal and a hazard rate model. Both these models will include the strata.group covariate and we will use the AIC as the criterion for model selection.

+
+# Define the analyses - both the hn and hr models use the ~strata.group formula
+ds.analyses <- make.ds.analysis(dfmodel = list(~strata.group, ~strata.group), key = c("hn",
+    "hr"), truncation = 1500, group.strata = group.strata, criteria = "AIC")
+
+
+

Running the simulation +

+

Before running the simulation we group all the components into a simulation object and define the number of repetitions. For this example we will simulate 1000 surveys from our simulation definition. Note that the first time you run a simulation you should limit the number of repetitions to only a few to check everything works as expected.

+
+# Create the simulation
+simulation <- make.simulation(reps = 1000, design = design, population.description = pop.description,
+    detectability = detect, ds.analysis = ds.analyses)
+

A useful way to check the simulation setup is to generate a single example survey, this may take a moment to complete.

+
+# Simulate the data generation for a single survey
+eg.survey <- run.survey(simulation)
+
+# Plot the example survey
+plot(eg.survey, region)
+

+

If the previous plots lead you to believe you have properly parameterised your simulation, it is time to run it. If you run it for a small number of repetitions it should only take a minute or two to complete, running for a 1000 repetitions will take considerably longer and so this simulation has already been run and the results can be loaded instead.

+
+# Run the simulation in parallel
+simulation <- run.simulation(simulation, run.parallel = TRUE)
+
+# Load the simulation object which has already been run
+load("files/sim.results.ROBJ")
+

After you have loaded the simulation with the results, you can view them. To view the full summary use summary(simulation), below we will store the simulation summary and look at specific tables within it. Firstly, we will view the summary table. Notice that as requested we have results for only a northern and a southern strata instead of all six of the substrata. The summary table indicates that around 98 detections were made on average in the northern strata and 275 in the southern strata. It is important to check that there are sufficient detections in each strata so that any differences in detectability can be accurately modelled in the detection function.

+
+# Create a summary (silently without the description)
+sim.summary <- summary(simulation, description.summary = FALSE)
+
+# Display the summary table
+sim.summary@individuals$summary
+
##       mean.Cover.Area mean.Effort  mean.n mean.k      mean.ER   mean.se.ER
+## North      3498729895     1166243  98.490 27.912 8.445558e-05 9.150347e-06
+## South      7551517574     2517173 274.998 71.931 1.092477e-04 7.244126e-06
+## Total     11050247469     3683416 373.488 99.843 9.731804e-05 5.812492e-06
+##         sd.mean.ER
+## North 7.782846e-06
+## South 5.842293e-06
+## Total 4.780433e-06
+

Next we will view the table giving the abundance estimates. There is only a small amount of negative bias for both strata and in the total estimate of abundance. However, the coverage of the confidence intervals (which should be 0.95) is only 0.92 for the southern strata and the total estimate. Sometimes reduced confidence interval coverage can be due to the variance being under estimated but in this case the mean.se (mean of the estimated standard error) and the sd.of.means (truth - observed standard error of the estimates) are very close suggesting the variance has been estimated accurately.

+
+# Display the table of abundance estimates
+round(sim.summary@individuals$N, 3)
+
##       Truth mean.Estimate percent.bias    RMSE CI.coverage.prob mean.se
+## North   835       819.344       -1.875 111.016            0.956 115.122
+## South  1665      1604.102       -3.658 145.372            0.924 132.674
+## Total  2500      2423.446       -3.062 193.676            0.915 176.878
+##       sd.of.means
+## North     109.962
+## South     132.068
+## Total     177.993
+
+
+

Discussion +

+

Even though the detectability of animals was varied across each of the six sub-strata, the estimates for the northern and southern groups of sub-strata combined had very low bias. This result was due to pooling robustness applying across both these groups of sub strata (coverage was the same in each group). Meanwhile, the difference in detectability between the northern and southern groups was modelled explicitly using the strata.group covariate in each of the models. If the simulation was repeated, but this covariate was omitted, we would expect to see bias in the abundance estimated for the northern and southern regions as well as the overall estimate. This would be due to the differences in coverage between the three northen sub-strata and the three southern sub-strata and the fitted detection function being more representative of the southern region (due to the higher coverage) than the northern region.

+

The setup for the analysis in this simulation is a little complex due to the restrictions of the simulation package (i.e. needing to include the stratum covariate in the population description). When analysing your own distance sampling data from the field, if you have a similar scenario, you will be able to either fit separate detection functions to the data from the different regions of interest or create any kind of stratum variable you want, giving you more analysis options.

+
+
+

References +

+
+
+Rexstad, E., Buckland, S., Marshall, L., & Borchers, D. (2023). Pooling robustness in distance sampling: Avoiding bias when there is unmodelled heterogeneity. Ecology and Evolution, 13(1), e9684. Retrieved fromhttps://onlinelibrary.wiley.com/doi/10.1002/ece3.9684 +
+
+
+
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/articles/dsims_grouped_strata_files/figure-html/density-1.png b/docs/articles/dsims_grouped_strata_files/figure-html/density-1.png new file mode 100644 index 0000000000000000000000000000000000000000..0c14091669a3a0550b8b2f93fd4743ef66824fa3 GIT binary patch literal 27452 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 literal 0 HcmV?d00001 diff --git a/docs/articles/dsims_grouped_strata_files/figure-html/design_one-1.png b/docs/articles/dsims_grouped_strata_files/figure-html/design_one-1.png new file mode 100644 index 0000000000000000000000000000000000000000..3a49ec1120f3fc118c24ad1272c23542d971871c GIT binary patch literal 10974 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 literal 0 HcmV?d00001 diff --git a/docs/articles/dsims_grouped_strata_files/figure-html/egsurvey-1.png b/docs/articles/dsims_grouped_strata_files/figure-html/egsurvey-1.png new file mode 100644 index 0000000000000000000000000000000000000000..32b7680d5da5a212fd8ebaf465feabbb57b581f8 GIT binary patch literal 11578 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 literal 0 HcmV?d00001 diff --git a/docs/articles/dsims_grouped_strata_files/figure-html/makereg-1.png b/docs/articles/dsims_grouped_strata_files/figure-html/makereg-1.png new file mode 100644 index 0000000000000000000000000000000000000000..8a6c8673bc8624268f9b258251276294698e5b90 GIT binary patch literal 9524 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 literal 0 HcmV?d00001 diff --git a/docs/articles/dsims_grouped_strata_files/figure-html/truedetect-1.png b/docs/articles/dsims_grouped_strata_files/figure-html/truedetect-1.png new file mode 100644 index 0000000000000000000000000000000000000000..289de352d8ece3fba554b33f7169db2cee565cfd GIT binary patch literal 7798 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�}Wq6fsq@sgtX5nYZ{W2)rkV-}Ou4e8B>VNtd)_;nU+ z$8~BCjc>$YZlRzEf`2yzS-8dPEY6%L%52{{Y+hWt&q>= z7`GH|uGHG)9dO5f)9;35+PR6%>i%XqAR&b9Ki&WTKL}kO3hr(`J~o<6dGt4aYyq=| JmR-D#{Vyi2kVyal literal 0 HcmV?d00001 diff --git a/docs/articles/index.html b/docs/articles/index.html new file mode 100644 index 0000000..aa54e7a --- /dev/null +++ b/docs/articles/index.html @@ -0,0 +1,91 @@ + +Articles • dsims + Skip to contents + + +
+
+
+ +
+

All vignettes

+
+ +
Transition from `DSsim` to `dsims`
+

Learning the distinction between the former simulation engine and the current simulation engine by using dsims to investigate truncation distances with individual level covariates

+
Grouping strata during simulation
+

Estimation when combining strata for logistical or design reasons.

+
Getting Started with dsims
+

Assessing behaviour of a survey before going into the field

+
+
+ + +
+ + + +
+ + + + + + + diff --git a/docs/authors.html b/docs/authors.html new file mode 100644 index 0000000..e3f7734 --- /dev/null +++ b/docs/authors.html @@ -0,0 +1,110 @@ + +Authors and Citation • dsims + Skip to contents + + +
+
+
+ +
+

Authors

+ +
  • +

    Laura Marshall. Author, maintainer. +

    +
  • +
  • +

    Thomas Len. Contributor. +

    +
  • +
+ +
+

Citation

+

Source: DESCRIPTION

+ +

Marshall L (2024). +dsims: Distance Sampling Simulations. +R package version 1.0.4, https://github.com/DistanceDevelopment/dsims. +

+
@Manual{,
+  title = {dsims: Distance Sampling Simulations},
+  author = {Laura Marshall},
+  year = {2024},
+  note = {R package version 1.0.4},
+  url = {https://github.com/DistanceDevelopment/dsims},
+}
+
+
+ + +
+ + + +
+ + + + + + + diff --git a/docs/deps/Roboto-0.4.9/KFOmCnqEu92Fr1Mu4WxKOzY.woff2 b/docs/deps/Roboto-0.4.9/KFOmCnqEu92Fr1Mu4WxKOzY.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..fc71d944a5838fcf1a870298679652ccc81ee878 GIT binary patch literal 7112 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 literal 0 HcmV?d00001 diff --git a/docs/deps/Roboto-0.4.9/KFOmCnqEu92Fr1Mu4mxK.woff2 b/docs/deps/Roboto-0.4.9/KFOmCnqEu92Fr1Mu4mxK.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..020729ef8d353ff843438008300bedee1f519380 GIT binary patch literal 15744 zcmV-`J%7S?Pew8T0RR9106l;J5&!@I0FHD306iK20RR9100000000000000000000 z0000QWE+`e9EDy6U;u+42viA!JP`~Ef!ut7#Cr>b3IGy<5CJv1bO#^| zf=L@QeIH9Q~s*wo$G+O0+bRhOPkhty_{Qu_!%|r&d`6R7%PDO=Kghib} zYZTk-J<50vIaqr2U;|0mCp(d`IBl!y{hLV*M5nHX)qqwHgCyFa5w^n_>hw9pRP*yvG;mAb1lz?~e?h?9qK z?H~V4GTFUb0>#X(w(OV{AuB*t#~)sPp5Nx5``)9(07UFR47AbyipA1u42+6Z8o3r@ z+00eBY^yeV*~$QIvqMB(t7xxu)785fkr+`p3kwSy!9Y;4zywSbW1I<4(AduQF+I;|0Y00z(ib^soN2Jiqp00T%~{8Hy9t-zA)I2(l&1wY|C z;_jCRb$Jz5SK;(HJ@6vwM#GcwDyOdr{scfpyQRdm#$*1Y7~VYq`_#5eX-QWRCa%+ze&2nhi!t$|%Xjuo+4_6OG_i<{z#Y>e1iX6^7Do0+ zr!^x>h8eAN4+J&0chv)}c4a#kASclS3#O6cPD+aA35xc?_rES&c&)VhwjV zK}NLTGn;M@Er+Ei>C06m*)j~+pBm3^*`I8GBD)9NUSewZ0AX)N5Fua+6sOEVn6Lk( zYPSD@C*FxVTH19k8jo8S-GXosM^`#kCG|yWae$HuI!PB5oI~aN*bBtc38Yh?LkO*} zb4q37qBcbB(whZ5!BtHx4X7q)rhs~V0C{{J!#Rw<4MgPOo3CmfsNrte6hgry#Nt$( z!mRn%wLiB1FZ@xro;^YtxDi9oU&dzkBgHyGZ^S@dRKO^j{C3+LMh=fFWWE^4B8woa ztb(ku22!RBQmGPBtroK1A()$fK@bd>4_F8S0;;ST|fTIml=@E#IX|5%#bE)~50Cd&136i;!h`l_uzByREHyjEWn$mLt~ zGqwJdX#G*>sgA9v*07Hx+NEQ@(M6y3s;S0y^bYkfLyb{1+F{-7{5@)S1HEo1CRTTP z-6smd=mloxns{WX1eA{2#A@s6irCUsrcujs8St*0=C(h=JJ7f%77B&@k%M0SpEqzejhm2=s_>~ z(BD@T83WzXtYmTTIS;@S-Uy`{qLxPu#ULRxq1ha5(ip}ufl2c>hCle*m(IP{Jm3j$ zgrXLs7{fRwFnQ`YFG|8$6JsI^*2D+kBR=6XzVszwv=$4EXu)>=4tzMG2fgS+eE_Cw#`2bC1*Ortsbow+pAxxY>OcuS6KH-s;gy$SPA=kzB7G zoUYhY7loH467^6xC-?rhn%x~sTd+#4GUFYK)u1JyeM2VrVN){uwetSWsA*$ z0|ky8$q^9H;KYd86{ITkgX=@Bq_8Pmr|hhVr+$x| z^(1yWNb0;cR6f(~0YDqdc8AaBBF+v$A#T~7gJyH#-Ry$_%x^mpjG%pdHwxL`yDtX_ z)Y^)Sg7y`d%-G>P@We(hS1t^|I(1u#~j`Vx_;3lKU8^4Cu_io+{=rTzy2?Z4` z!N&2#$Y#J>lQV!fL?^Z)aukBXjIk2*pFf9T4w4TX+Wa$Zh719`93X^&1}&H-@~*f_ zlL`)1YSaZQYGcDl5T)%zEwWV|Ja8EM!OJ6s~EfNn(=@$d+w^L zdmhdrU;AN99b%0D2h0EnI%7P`q6i7Jo0}4dW#Zxbsg$eDw8;zUe6R|z2e2$)mwo)* zK?wTv05jm^v8n)E=ng<`-lVv=@KUI1F&8N|h^YDDYF9!eRA7F~?R3;J*WB^cxQ}GW zDuT=1GE;g>|FRf&;?B!mZ0_d6yw1n@W&UCQi(AA!x@@o6|1#NhmjTR=Yo}d~Ij+rJ z&rJA~RRk&Syy)D_!(l(q-%nNazxpVhK0&3A0~PdX&?6JXZTjBynd#HR^~06bC&}vJ z71E_ZnH^5y?dH(Wq1A(%P@ChBu4{8QkvjrstAC37kgMGE^6Bj-ezi4v^y<@Zz*_4J z8Zzva*G7~nf7<&iw?d__zWMHlpQ`*~Vw;t!EYvQEpGf86h}afqm$j;M3s`I}4%np` zx9Xs$06S|jniP9bqZ0cuhc=2s4>I5pMKJRQEkI&~u9_g(r;kER!?zm;WX2p`JW!ki zW(H(p9dI*_fb*h}l$DR%qv!pR8}al09t1D8CfYn4BdQDtmKU~kh*$`f=Bgi5YYs#? zMuf)*9L}$W*sB%x@b8e!+7sgj0~rcddVgt>X~cVOc$uo973N#xiLD`It^5L0_W*?dP(a1`fVbXRkCU=I%Ys#?(R3oNskxwo%Hfn;Rn!9<{Ed ziUu3ISgEwJSa{j-Lg0mySYds_D{K+57GCcLhr)`&=-i6vQ?D3En91J3Fj)x?FbQT< za8~^{zvWN;CoxTV<0SKr&muxK^-~YWn=nv@R@GCMip+wrVv7u22P9Wg4N&60Yefkf z2=qL#s>XGwN84J5r=^blpfaHA!oXUIwHfvmE(O`1NCwWzfy4be zAuoBeVT;FIoxBDG3f!b?XPLJ#hYV-SJ#9nKyW}wFJrz@pXH8VH#2-kXSd3QMAhtO_ z`t|xmxB4$zd?EV%phwT9=l=gOv^mY%Ko@VA{u=9K5MNK>oZeTfEDF&9I&jrtcwTL) zKuzLHyQZUK4=cFQLqrS8B>^Z^D}h|f&1nRs{G*E@H;!1Dk-!b%f?NfG6LLO%vkKC- zb~HFYDUR^03h}uAm7b5bEO~3H*bO~ae97}L~Lzh7k z-rJ{xJxUHZO*nJOD|qWFxElGhA_(OSz9>ZYC@S}nr8=gB_bKPrBDBj_ePF0NYsY+3 zRacIjG6FR-baco{`5`shL(6A%GL#2W@{O3wmU%=7TZi)w=*P9nw^H;tCxgCKqipVd z6R+K@ykt;8`kk(g+J_o+hzsHYAt%%HzPT3cl&H9c*HI3Ra0z_c@0jcEjYzw0pkiKLuGq8}hiwVLfAysyr!)Y?x+-xP$OX%F z;fQNILheb}`aO0_ERqL2q%C$Sd8QsM&n8n|^-SWfnM`_8JZA7x!`2p@UFQKMz^mY` z1tC@iHg#Mc-0?J^3|$RQqn&*wCt2i$lg^XvFoLp#x|SQhIBRcSXv;76OrkP``fB8F*rFliNmzv zxHdS5utCZ#D-4gWFQT2 zwkY_kA?mm>EznB18THz-tJQlamE6uV-459)O%zvfNJ5Y5ZJ1}PeC?!=Q+Mi-M#J%Z z8Jm!&af{s@`?OQgX*Q zceh1@Xr+;C-sq3UrBPN!X?ayTuTs{@M<~waux3%;AsM^s+bl(+AP_m++on(1Uu;S_ z7(ZkqKT2(!o2XM!v5Z4^ewzQ`zY_Hsl8$B9r`$Km;ja#4F|7nReHm?jQ+Jf5;k zyQj_~p~BviHd^Mr%Md$j-cgF?VtIEib83aH70lB~1HXR_jd+a0M*URklxTi=p|1(A6HG5uM!-K$qmD4>+d<@gloIFZ{;2F70#cJ|~C-o1Mzs-O3 zH`C^Be-sWcF5-S0rn!LA#a;^}%V(2!ku9u|)5ok8EW98e{2n|XMWj>UWG{e3VPZ@Y z-km5ttOJ9haUgGSj7L>7u&y$3a*LxJ0+H&Gj0lq#a7LXAiUQu(oXQ;*7XMwzXIn`u zCwiB6%-ElcaL%4abQ+&lbkscI+2|F2Kkt`qWf4W1&)A=@SS2&j3!PS>xUN63T-P|V zLWe#kZ8eLqUo8w4WH%ub(~=`^XQAW+S`+LjVGPbfzu;)uD2spf=?sfdOv=HM(n5L4 zDzJ10HoLJEXO=~$XJQz1LLQHeD;#F#;_qx>;~Z4x9OQ7R=N6XU!qePLFeAw=?S|O? z0c7qR;0&{M3A8YC3vl}WCC%W!IAn-HDm*7NuCp=DFW!J?MxPvNAy3}Pc5^F>v=6f} z!Wd=Jn*S9Cmc9?hAuSAMjDt5ouQp+&Nl^hUy!2#DLPY`Br6+#z#CQjzTM90^MuBct z4!)7OXEut3qB4PqO&Ye9j_dZsT%Lb zRlIk{n#)F4#B*Uz4ZuhzRB2wcskKeiPM zR3u*gngSCFP~(6cDf()wv}g zLW;Wo3r;!5f$dNpadq;;ZNpEqw>hq`g+~?}FWands6QA^Or{ z&O00T);&&2D;yw^iw5ltoy}$X%qL_>VnP)Um2{_+BajULTQTxkLy5zGcb~2P9=@D_ z9*&XsyA{Pi48D3WKKA;-u|nVEs>+|_^6w=DSWIc509+y>Cnqi{3%8Sn+sPxql@8Dv z#FkuCJzPoTi@6ls!|!uMRT;K94&0Y(t{j2Ck28OG*Th_Mg!NMnlafo>m88Nk zPkw%0Y|QUlHc}}iN>a&FB03E>4eJc`4QmarD0Jh?xJFd`lS@?mQ^rK#m7oNLJS#^` zj-yXRXhcHj?UZm&7O3uErhj;q)74qWK!lsyRg7uhkpBpBMAUsf@wrR2Z%DaW#R=~K zD=dB{IDdLCifg1a)IQ_7t*+8F!KbA$gk8uf!7S5qoBL`rJ&DJ^(0|q=WXD!KdT(@J zMsCh4g#Jw3>!zQOI3c**pYrzIkHp=MCjI^BQw4VAZrYJSmwfo-zNYHOSG+-JucQXx zQf8#5nJv;A%;|3Nci#>=F#w2k>&@HAvD>jVf!E_N;s()Ee}*R2TTbfaRN<3(&+Ao6 zr<2nVC<20b*3CL|QR3h6vJ&g;k>88X2BPj=E#22GnXd-~jAuPhpoP%YVuRzY?VZP4i255N zAn;S6q5fqdt}mItUi`;m&z;8pIi+c6s(#TBe|P%p{dT_5Z=xFas)nLGOha`c7u?oP zkg=96k8%djVNi;n%mnOKIEs0k;aA!i1wfBPM*1-L^VzJpuH-*rlas@O z=92>&qPn2#&&Xh8{%pp0)MZ5IT8-z`x3{mO~+lc)8L z#zlmgoq|&`B9S7I&^Vb+5eRe4{i+ehOYUH9Wpn!|NG(|H@WJ-{%6>R}J>~!ZF9a4} z7`woxbW1_K#(;9UNZ|-0K>b!=da>{MD8N%OT9E`$&L>^w%4RZUdE}T-VC%|crI1`P zZu%$I_!Wu9q2c}Z>zf(ZHruXfpv%k3%g&x_{GSGr*}Zi2AI%<}-BUZ?OJD%(sa|LQ zSY%9KcAy#C9!Z{ZO&D5ZgBw1QWL)__=et(BOPlQ!JI%Vr`llLl34A{^8(WAf;!AA> zc;Jgm6du2K4Lry_T)dDsV9Qu{V)SO0F5K3^1ePZ9x_5GW#Wzm{Ms9N(0JEsEU%Jc7 z`rkjI9P8u_Da;8isN#%W8mhc+=_B*w6@PRjGE7sb1Q znl8SP2_@~hUt%=j{^WrS&mef9dJWg&SO#$@ zZOg7%jrNiGH)S+E7K!FXv;vS`7I#!4d+NFT??GO6&02PoOR=D9VSNr|J>pty8CjuU zzY1Updbv_Pikel2&E%ynSVlXDX*D|9#M))=4Rj734VSU4&=CPaF|KAtp+-VFZO#rT z*Wzb)SeRMQ=te&lw-+9P3{7`}i^c2naEKh5fr`Gt#T2qR)Fd^Hgr`jtr+MNP(c$6g zD;>S}fT=dt(ARtICKM=3lj-#S596lZu$ZxCfmoL2u)1;WKLvJTL3=gH{ISaXU}ZA2 zQFHK=*GYa~kH5n|^cO)$Z~oZ)qwE1f+FxYT@y%(an>S`8mG|MNwxo?ulA%5! zmQwJm5n`8ba$p+dq;gN3jH9?!r83quF@mYkeROyBQ~QSXkI&HAJA2)VGRS2^3CYFG8MY^fWa5<){ECaJ-FPv ze@8*l<`Zo@`(d7WhH^`(#ii>uj$uBvpxS{2f)zopv-Zchk58Xg|~obj-v0WnW*EV7g!)n54i@{6zAt&5VEY(cWX4#t161!=V~BtnhU2N zpWS&5ezm|#Ypx;`)*=H;)NFI~&)c?`Mf+)>&$qgZ!X#`3VQ>>u727NWNqeR>)Ddpt zhDT)aID3XP#MvV{uJia3pEvm!TG?JprQBWZk7SOlR@b&QkV*o5oIHKP^HO3^&5tL1 zyu2KP{;p}KT^4N87igkgZf~VX3DWCop^el_NCt=P4x2$+%&^@#(><=R<(X;NVxMbe z=vbGtr87D)GbK2Rp4g61&P_G3QBkTr5!{xUmt9$yqwOzl=b3!N^$NQ%+5rgHRq~0_ z+D~NjW!LFRx<6!|L(UB5#A@rHEj3c@Z8aC6&wm7ses(CZ7piQ*q@`r&Cn*4pE-n!M z;x*RAGrmZ0XGV<~$kjmA!de@S?@)XqQcJ8A=es->QdS)nQc@KfRzeC1C6WFL+gq4w zXj;Hj)nGOVn1#aCQWr!yg4#^YEYGAg3kiKPsxUHdt#U=&5Jv==DE!v;Hnr5CAnB!i zmFbZoVPTFookc_!{<7OnFf(m=xfiAyFvV+>fcoUrylPa4nu&*jSlLx#7$X&z)sz-a zm9x<@GBwvyim3*<B$BdI;Pv#>vqK8Dtaa7vpH}8v*h&yj~TZOX{~7pKxaJ{l-I?Wa8N zcc2Dg4pj6&H*Lzzg$2i*1yJ|SZ>6}ITiBY}BqW>Lm@_VLky8k>tJ3O0*a@~_?ER_= ziBE?|LmcC!^SxP`db_cJ`WMFr$>`_@evZ$-WP}Tfqz7fkYZY*+UkxMe7~`Rr6r26o znI-~Z%7~Ue4oMhKpWq!o6x3h?5Gm`fv~VGfj7p)Aa{+f_mh1B3OLp&6H!UrLW12L{MeFnTJe8_X6V}w+OvV5zT zOF`*Hlg%j>!f%e^K!gZK>rgKhuySl!D?eW1LRNMON6AF^J8z>mHSTv;eNOIUG-@}e zH0t?cW@ZB_=GH`h{-aX!fKd$AqhDT~`c~x*{w~@)kOzB8^d#QgtGI5YIiEg>POI1- zbTM3Ydph{kS3^UFI*IBS0=WOv> z{2k;Qpgkbu(KZ+RYails>oyFRHv>ua!g;49(r~0odHCDojU+}Hqw?ezr95Tnc(iLu zoTpcEe0y@zU~&@7`Ie!Pg1nJIfT6L1qJhbEr6*g6&Zm1i{>GMB@hMIY$bCuu*<8J%SN*yZ`2{H4^v}4W8&(X^IPyg3=Ptp}uSB zLr%1&cIS1cbsvLho&OY;a~@iUkdAC*av+y7($INmg3c2uLY^`Km**iKO)Ml9MvHrV zzPst3=e;s}Or&l%!KmEmEGN!F;x4a!LRFXF-peg{)@|3{5AKifDLH`kY|t4UG(CUoR~W{hOXv z_dPhR99R!GHvz{~cE<#@IrP*!5BgPN)f(ga@{R&RbsIpdYpCiV6qL7tYHE1K@Y&#= zo(V!0xYwMI{Nm7rRm?U{M%_;+-sSVTS%$7`hOblu9eg zNusAg;MKCznK*>A*U!Yj#`;Tpf{B(EpH#rb1y4a zvbu3b+R4F5PsiFO)zs3yk?qB%dzDOM!j7tq#ZNm&ZJvHmLVjL)Qavp*uey<|RHr5% z>X$*r`X^I-u9<2(+SqDqSvndSSXg^Qq5M#OaVS(=N5=fJj5+%Evyt8Fmr=@Rtw4U#c za#LCr!D*dfRhliZ?_2QsP(P-0F{GR5|Z6i>w5@nYaLLY+J)Y z9YG4pEgZ*jqb}7?>aF@I{dDY1Meu;ee;{qC1#GGEAYffg(^tl`ykK6)hkZyaj?u(A z_jh0Kc7nUi@LOWmhg}$Gh8lBGtoEPGc)>h>n}fvSz$ez(yh(;z%sg>kKag0=F0rl) zH_7OEfwf)sH?Y~J;SlP&P4hl&QRgken8-P9lM6{n;HWnHM%ahM;$SD%xwT1#Z-Gk& z!};@RL1U>gcbe%<53R zV1Rj-$*_L$61LNM1FQojf*)ivc3co#ojuiqnNK`8cB&toyO$F;$sh?Ll-ON8g1N*a zV#fv%-`M&fTFxX{bXUefg9Fe-jLamA!&I4?rmpGHSd3})XzOAxwlx);a8d%p`pW`7 zcV(0APugGFzejc&GoBknp}cR3h6=AerzWYW+9wpWt6GNuhj)=X@$c=DJ%x}3RoVvE z-R@6SS}K%F1C(=eO4$Iwwf%cO@tl2WE<=qepcE8J8rKY@-W_zRjn z@+`%LM0;M|-zBG=l=taGk#tKKD3`VYyfUjOU}tH8w$x~U5!XF@_=|U+4NB*X@nO5= z5XhZJLsat0z6WuEtVzSNAG-S#c1B0>=#e+P*|Zr&S4n@@XcPy;^|vHXtGPb%@Tj`n z@QV`2=e?Hw0Ms`FVEy(ke!J};7By$gUZa9{o? zkQ=mHV&0425O(s8`!=SgOqv4{)3TkkR_NNIq%OmML6jqTB|l&pEcg3^CxxOwI+ieX zx=uoHu_#tdSMR^GfG$V_Akhzbc!&!o7qM>twh87&McID4eOW2Pz?`ZRH3;rS?NrgQd^Wz@D@-YFYOgHREZK9TSfG zZ}t#=VI2lm@KLff0Mw*nQarEKW`cN_Nsq~trx`iP(^G(ssXl-l2t*=y3@YXnz{Q3jVG(=)PsmB7?-#->fQlMj)PUG9mRu9@Hi7XJ@M@8*x*~bUDW^SH zxT-^&v<_+L?S2B#`V}(gi_#qrJ@n}%dbxn7uG)+PpFBFR^8Hv-YoUQ!V{&s4n4k-q zL>VJ6UCMbKkS(OIHHl~2-GBtddWJMk*tjt*dSP6^-KgT#o_(Q|oKbX%G+VR9#hC+PKpB)4M-H6cTmRlA5$7N#t58v@2<33DUI+RGT4_{dz)R#v(anH-W&w zSaK<}*brx|G24U{i{p2bO&gXS8{jsA#Ge!vZLE)*d2I&*NUXEdNLDq zj$1H#AM)+=2c(bH{~|nv)yA{>b@lyhJmMf*6aXL*$^`ZMrxo~D5l>&$w>s_k97{gp zo-c8P=`Z(H(p@dV!P#7qN77vjAqESc!vsbF>0kWpdxeKE$?)(BKEPK9&i694o;b|= ze;?Xc-YcR?N~NSyX3y-6eYEJ&6)|=DWWASI%A#N|vkP(-s2<`OnlrIAo~)}tL1=Rx zn`O@y)DiSZM{Qhguk2Wes%VQ$eKdx()?`y!$f3DRAXdy^wcObyIng4mrjUWuEX+J< z8Hgpqv*vk;_!Fy2AY9;f#RgFsC5%M4QgC48$RGQEMpwzXgX=@Tht2(STkM|jYr0AxAP%xwN-5AR+p(LFHlDV$OeBOf5WZ&0 zQt}Mvk{k=;&LoH>;U45yKI>)l4Bo&;uud{`kxF}M@9m4NGi4?(m+}M=7S@Vg=&m}F zLmCxG7<^~tqP8_e$oCN}Xu!%8a_t<7$yTJy8RrHig3XoFra&qQGNUpVIl7$L!wCpF zc$Ja9j>ZrN`mjAGrHimQ!dgTi8QPL_K%L?f0)g1{S_RLy*~ zr>5sfY%D8LK(@q>Q>N8TYmkSVitI@`LEE6WNJDjj{zG+0ALV}z9w!xIQdS9G=?%{e zld0_toBW$Y>P?5iBk&MsZa7vs%9FyssdaC^tJSX#h)$4H6PQUevMSl;WUx_T+RO`| zvdfcL7d<0?!>iJ1I37bp)*yW4M1t@0F$WuLQ8QFYZ_GIHGDPAR5Wos0a!QG7M#t%l zVg;PKPa_eQuCts@e2fx~E>^`xsLXMPQni4W91G(0#$VA`JEuAB*S=LCW5LFo3{+x= zv|YL^ML&^HtQ0%Zr#;lvLQVN5Yn&OAM%NM}WoP$*BB-1T$Y88FVWaF~jb%{Cqmf*j zmsU*}ZkKZ3LHR%{b*Q51r*{O|W!}0yw-<5ysuMFhNJufRJg;>EZwk9fUx-t7kZWaZ zzy%7ZQ;qgeF`49yEK44OEy!2696j)`kT)Kzw9rtz=ySjKcpxj}9y#({3aL#QGCmhs zK}XsrF-nt66Jwon0!zu-ZJLOch@QjaID)%SXw*l{sueb8Ck~;y&oq}eGZ$fi7 zq6HD-U4jzSJ(5Qm%kh}!V5W7;^7fO_!(^wDvPnQmWRQ31m-evE%xBB*a}a>u`yQq$ zxD#__E%$D+_*!^lWT??;vqg%5nJJ$7^K@pKm#m|r%o>@7$fR80w{a*N!6`tALg;xj zG}n?zVR~B+MYXV@e_2SpRMAwV=~mE`-7B$oV4a)EY%q<0_K_3#bU{6zo0*P}qIc-w zh8PQ^a@K|%O^+}1L(!8{2IInx)=1qb(SV1BsT9Ne%fM7Ev$8yGTS*X<(DfL~vYFGg zBJO=f5T`U{!BRp%zO6_ybG!wv`AOeoyZGv6Y-7E}%h;0bV4; zY*?LNP4(mzK%?JyZoao?u+oLJo(J2E?H%4W+f~0KAJ?_3GuIh+Pxr({eOlk$GP53} zOfWlH{F#DQ#Ogw|tQlDL`gSX_&~rf$nY2)&lK>0ls@d_qD7VyjcY8AKP|jETrBT9H zJzx(^Ucwbs!fM@`{47c2$(&hCI&Z>!aL8QFhXs?pGsS;-_HW8S1mpawLYD`1fj8iJ zG4lOlnzinB{At)qkufsn&*qtKryx+$J|B|PEv>=9rgiJmz%V>taw;?KBqFG%TRuaju719r+tM#YyVj0ukGv)qKf%_$oq>C)r`@vlY ziFMr7(FT(U>cJvkVxh>kuJpXfso0Qcr~=c-A=v#;rovKLdZ?l&DGX1GIFHH}z&e4> z3Ct_;IkY^B-Vujx0)Ly-Q$*pcWmsvisQQO#Jz#Gy$ULplm{M)5gqn_L~MXb_A;9QpUE)m_t29&sb8W3qs?_Q(vFX5G{}Lu~`vS zxd65iRTTsv%WYwwEb)TS!{Vj}nrj$J56e4vx2T31UGMp%T^n)FDKx1+_~_ot*1+$n zH;m0=$&H^fy7Va8y3K!Okv`i0E$XVtpQJsnM|YL}VHx;g=Fb1x5HH$cUM`)!x;K(` zdLGm`IZI!Q(=!q;IEnF`-c9U(FwClRq-nZGlxE7rG%@pfUh0Bu4NYae22b9qbtQ$w zsjSAGE7cxW)B3?-r60Iu^aw#HY|B<^JEe4qGAn4$(e1oTZF!d5d$1)mPkn}eoCPPo zT}^iPh>YrFS(OAica>?Fyb@(yXGFNqh+W8okfazMdn zEZ|LjJb_DCL!21m*Y-hH-8Acj7)i*PaH+L3G!8FGdIBOD1t)vmT7sVGSO8tvC`}g0 zx%hA*FhC7aOmMG)vL(?L*s-^!qq25|m>(9vTI+7YBka>w_B}ChKr3Cs6@#o?K4pMtK}_vi|ers2K?s`(!>=G|w=K=w@)ZHSyBG+hpH-wZ)%5QEYn24#Q-nGR%`=~4p& z95F_UJVfZIiMHWxKS+BCXYq=|ggjS1qST;fh@~0wN+Se;Q`Apl^VK9l6e(vRDgc{C z1G6Xq(FyNrT99Pm;8}xIIK4=WKiUQ&ta!{LaS^LTnaO}(TQLjc3mU}>UKR#eBt{Ym zO3xldPGV#*kVR`&A#9htkjML(D09$sI{^#|blP4O=+rqP;CaWDAC$^t@b~=iIJWEj zpI)kQHUaR)XYv8~vYXdt5pjN$ zFShgn7tbvPEz?!hJvsvpru8S|dLPG$aBC!tPfj3GZu!Tg%R6(*JFaE5C5h8iUzl4&Y>Hos$~%i| zgT-}BO4|}Ts0bJ|&J)qlN|J4VPN*Kn`6bixEasj#;;gYHerg`;q>aYn z>y$&K!=gH4NeY3u8w3DtTe}B6>!VU!RI-c)`lVf3dCa+7r(arCH4mH1ZCT~Eh}yuZ zd}N=?#WoP6W{HCtX;xNq9@>vde`L0isI7{{gaEk09%6_ffImEMp#aH1W>}6D^YS96 zx=2{-Q!5X)Xp|NlGf+#~?dTC9?0e`U?d~s98?D$7)P{8+P^*ne)Oyr*b+l#t>`s@h z-91fRYPp7>cB=z{KsR5yS<{|0zIj%bkR;t&j-(exIRql19!Cfg1h4=ouoaOZU?v3) zB@MvQfZG+37qcryQARVKZYHoRiGhW?l4;p~X%&UIXs%p&7AcS}RhlAP)+||7CYQTh zPDYmGzMgU<;)~e|veH4>s*n}QJW5ueBo&hIl|rtB6GbGdOjRsPyb&U^K%sP%QycsR zHvZ>iWc>d+t;|QNURflMfJMbhBffZfOJ$-o$@nA+5-bYo5)*RBYI_SlJk2$qpI|m@ z<~Ft^+@#bqB>8+~z8jB#sn*~xrqQ~vrXS}PzVmq5N1(3ZT$pdcUy9!2Y3jDCgHb2u zu!AkH68h}rY}$&euDP~BNz73TtTiQy&x;c1Nv59?;HV+xw3EF-A)Ronx4rf;*c1Ka zvX36CN_3VJTFBDK^4ja~L#m*^q48ME_++-Zm)1oZis>WpTet33w?YaZi#=gQSY**- y{^U~631l%Viyw0%mK9y;eEd1R+BRin*BQKQwQHNpR1lbbSd4^;oEAhKlGtgK2ZCDPPWh20ob zA&)R+sqdbyR*+~+aVI%YaG-eWl&PTgdD+rD8JCtAk`!r`ZhC1u>f=?T1*7OWdtOsg zrYY&mRDb{AhcIwtR-o8qK0-?$@e)LK{8zo(vorq;M`j8j6ynR?Ib|dzInh7=p7rM@ zsiwj}#U_QA4y1OVbVYydJ{jNg*J^;~)~!S`tbrglRvc9}U4s^>c221tW5~#jG7tKW z2gZXzNQFd=$dLxGk5y~7dxUcdPZ*|R#0wz_6!57>W46nOf1WOWXLjGr|3DcAT9^k( z0=yUgtF`Ri5YHSCyM&EQlw#v!?CW3S)Y)+Fdm(VZ?^>!`s0zJ|!-zzyC*3n9uIqo7 z{qLsT3WF`sR5Bdj>{tva?QJX>-Tq{a%T#yc9 zIJz0v3kSS_dT#2IhPkX8zZ$y>1TMk%pN$fBRCTO`;m?Zh|NqpI>gtcr8Sf%Fo!Prx z>45Dn3P1rQghBM8tyF-5P*?yC04!(NDFVillzCh@61Gw zLp#Qpp7;#BI#%O4(Apv6)kqr5(KUA8pG$6R#Nt*JSfVNYSTty%iS&xG|e zL&-0xoLHsHrztPFIszmm0IIT%B0z@ZZxo+x_d(|GzToy~#z`0{NT6lasMnxLvlbmX_2@Nd*oZOXCge<-F>B5OM!{0ctgzB*Ypt`zOHwrT zA?ssomt5-{&G0rLT(4+s@p>gZQb;4?)3vD))S(_tXyH!OpJ*LZpF+EQft4dyw_r_d z>oVRfyd~!yQg3JVaI^!a@oQA7_EFZE|gJw8YzjXj?SvF;Ow| zMuCIiN7f=~+nuIu_&O3~7B*0@#IiK=NQ7LHYbDY_BFA$*Ui8f1<#yH-K22L>+9Mmu zCcc=ta_zv~;-Gj&`5G;4lZdiVAX43CAa6DjH4;_eb2P7>efn7x$Rvr;Evjuv2eAo! zIpU1EiR_GwHMxbB-DZ@|(KU}$-_R^$#uk5fYs-?Y=->%3!*QYZb{30`S+FpR8L$M4 zBQOqNHL!|VLqNEzNDpS@&e|a=9J^P#A=)P8j1z(s(#SB)aE+jj>wzY;pp%yaD|yWc zgkUpvFy1cR71$o4_pu@rg}bg6r47yE$TnFY@bUdxwJLHj@Ny)tNN=e2kp|>K3^M7> z0)!zWMgsAz1rgijp=9Jg(+$4oJzat_U_OBmO8hxl0xI;AzF9?<5m?1*J+|-Rh{QI< zS8ay@yufxdWn!#{LWe*LHf+noI2rojCYewHzHIL)HKegAt@Y`y_VhLjFCEw0r>@pc z0DYe&SVLdAAAIhzFvTt>Tt3yDMOx!f-OKl;0ArvOp&SZL6+6`(r4(dQ1Tk1jelR}} zQGsv}5sYw+3d6D%FOzaOH*9K=>f{Q74Gn^lZ2(_2x;+_qV>8B)jc;iC!lJToUx~pP zs57I1^Ol(khb{(QWzL$wFO0s@`8pGnE&$G&Ft9N=8%_hT9@gF&7D3&h8mF+4jmS6? z0q!bA&M$_MSAzJo1h5Vf0U;I+Fk_SA65~iE8acS=yt-|#k;jD*0YF16J4k0$518c| za3f9x*FZQD3;+Nb)Y(UIjhC*A6%`Xt@c7vBAod^}0yI;kN8CA_We#m)dm@Tf^S@8`AN)MdRyv^M=*ylB7W*2oZ`v5kRp88rqLuAh zu)YesyJezc;+9KDN=aKGbCob{oHgEV+-76jt+&BOo36W6v&&{X5E(PMh$v2w&*e1h zx0|hQo=d^=DkNzIHh4y%xUxyzC-E~xF^L2=MC3?Nu400RNwj=}4On5mr2)KF4iWlD zgzlX=`61zxu?Djc*_{Cz)!-H|lhP0t3V@SAlhZ!bED4c(U&1W z2k*keJ6YjH+@O))w)tz6rBqu`b#5@W7#A-_4_1mSUamhV zFWc(RxH72KjP1u=Lbal^Xu48H$ZicgarHspV;|a;R`_uYx{sqg@8bW4(|-}mhc+8(S!Sv--M$U5f^ST zf5CwN4&vh2VyJI_#GM#r+Z8N$`58`5pF^W#TtYG0W)u(sUE>{C-FutCW13h?dE!I# zyTR(u0OD2<7l7?P-z4O8B~?v;3A6)dMdrXc6eBFfY1iX0!e$eioj1FDHv!e{-V!xW zCZ)*b+=ToQjEII7?`86_DjXRvx3)Esf=xcTt4~By1~kKNpiHd~6m|QKt*U{@XP*K& zl8$zL5oiw4AVzGjHl*NWi4+fabp6?~b&u%ZgqB2|7NRleIpfGN zBJo(9T87Du9AY@eg^q@`1r2mIkVJ#U@3BR?`8&Q;$x20uyH`@Z(;d%^zN7BCO_Pr>KCp(!886-6thskFi9t(E4$cq3$3ya!Hy(Y_>~3HDfn(a3vm6{@l&UuuP$s zdm<~nLNqW?_sQglV|#DoMu%i=i%b$F(`deQHdJ``!*VHGZ3RIrTO3H;`@kI`aZveU z>j>9v=5Kt)DA)8Nm9KivvKp)~b9AUh9Fz6|Zs7XV-z+(*yfG8Bry*;tO8>k%C}reQ zSM*fQzSaY=5ygGc(Ti269Y-8(uh&CN^5yE*pY2tSD}!uYY#ciuEDG&E>cS~xzqqK3 zXH~KyjS~Xz=kXW*r>e-FShS0k%l5_xd$8rvmUq4 zo+w;ajHGETbr93)kEWD}uS^Ofyfd=q2`*-|pmG;0uRF4>_vhzo@4k0RwtC8G z8%z2c@>r*dtR%;KGl#ygVFhnAmb)ynhq+*-W^IZ0Z{)ewrI`Ew!Mn1fbcL^ITYfYxEe-vI(I2O3Zx8(qbFn%)aDr* z9>y9@jHLP2@*D+XMB-$npr@od2-c1e--DsDz?ZM|eOWM0+an=U+$79uY|L@y6bCVC zYLlq1Jq1cs$fn)FidS8qinFZ%S}~560PaMPq#3~G4xB5%psZq0Rv2%E-Z1-^(9hDJ zpi=2U=u^cJ_RmtoG62W;`bG=W$(QDE-d`%Fj@bHlYUxfXk7Cs8xDXD!a+Y)iCEOz@ z-XrEjn&M;Gw>8|Yi!w-P#1u5&UzE{UVXSj`gei?bR>nB_`-J6h3p$)&Wv8DQpbFXEzGQ7_ zrkhqal&r*20=?rbO}m5o=GvF4%Jt^mN3POjmBB_7rdy=Grbh(5=l)+G9!5I&(0}Az z?t)AJN7#HjZ3Bl{KaFW-ujwhVBzkrdnxJ#vUuXajngCqr&vm+dR-I%iH`~!WG{JJb z?RzznJ*ig*_4;7na(VE(rNEp7f%BSrqel0+UzK8fPD^b4}ID zB)Uh)x7{nVP%sV8$B_{I+QSG2;V*c(ryk+vp&staB2{4Ronwku$vsi+y$3*j$% z-n@0r8p7hC`RTl{zmu`a69QNN=gke;pN>x(7r6QdK3r8invhsD{-vUHJR!DZR8w_U z@aK$N^Czz`P8h)L%MJ&6#kaN0${wo2)Mod`lp2t6`sr^YX?MwAEeJMHJr}=?9slE`ESXUo5;BwlLN*&cnww!jSOe13PZS zPRv7k=r{Q{dDuhRPHf0vosYle!slZ*W(d6F(i%JzVQZI%CkbbtN}RgX{@{?2g`9^+ z*o<4=pP&0zg%|z|oLe?S#s~qC6LOKm!HhJXqV%9lt%pzUYdv|aeMTK8)ChQ`xs>M@ zbp?RtMeeG}<)2vR?tM)mt}nF9uXY7DD=@R`sEq8)6f!EYFr$zXD_4BYljP;P5gs=q z|JLzsNjJEPp*Lenye-bjgun5jmcbkljsDdq_Q^bS({%!kV|RQ;ZBJn209*i$B=}C6 z%Djz9Mk(ibTOM+7yS~h|eWLlcPrr&yLP5?eA}u=>6(}xqw=0lo?>2)5&W0vnX%Ztx z>!LLSXudOhz&%OIOAPVLjE_Y}K5!Hgfb!0K+}|2SkM}os0gH)blog%(mk9{eTo)T| z9MlYmU4R%y@6fr~x$C}~s8C~-+Z_7fZvBK>p2S>&XZ2}d%h)96W)efGi3uocOK-;} zM^Psx(5IEFCxLfB($g8h#YWA~{_7%ddG_7xtR9f4G%Ax?l%2V`e9-c7jucoF#0<(M z1Jnc0RDdpS5a{$FE@pbl4(U+kCzCbi~9+M zd;XJ3j&~u0gnzy-eCrxzH63+EoR2pRt+am~T5hr8+Jkhtn=HYD_j~6Q9z{ZWKA(ll ziML{&zqf|blkONvZ*09;qb)89@px~FCTIKJwf6$Rk?)^0s+umiS7c**<;>4ugu+1< z`sQp5>+>hn$_)BEfUCSVH<7VPa@do`qwK_GtZfRplbM^3-c28-L9hOq*!A;&7afCd z$12~X9@j9AOx`E$6x{&s?FwKrF zK9om3$MLy0T;Q`$>p_1@zQswm|J5?+w{ zjgjtf+V@ZAuE3OFmjCAXtCa7Y(tGAce^P&3h?lU_R;Gq~#fKh`#WPMb>Ljw#%06Vq zJ8t5odN`Wf00B{e&Qa_Cob?2rpFJ$N;^t0FmQS6*JCb}fSQ$3`4DLc9wJ>D zTp?Yy;+z(1dd`HI5fV+))?B1ZE2(ljLXUh+9qmbunste*mF127g_-wFf^}v7QT``m z{ynpPyM|V$li=m*_QLLog~t0p} zNB7m$Ae9>+h!l8=ug{EO`{s7A1i61UgKQrz4=D3INuLR2|6EsVrDO z`d4g3vA})*Bekf(`hvo-7NosU^|x=Pu#2~wmAR*n1Io^*^`wJ9Sd9!K?qanxo^yBg ztm>Tq*>t2{);Oeu8$(w9Wi14^e(aSWlGK3xp_sTT_EZVvlo;m}m{rT2Poa`|Q!}7Q zBTuZz@Zm%41H31=Se&_`f2U$ndN~F7M=`@N2*YQqibsz!CO(&!OeDmWjOHu&fgn;O z{y*a@Khs&(GuMqgQ3V4N4|UvaO@Y%>T+YD+htoG;JUWE($plS0^`@+xs;I}8c9Ep* zY$+Aw;_YP~Z6o^_1H%j|<0JeLAFWMtNDt&NgRoYCB`x-zljt)5{<7bX;Yf1L<|xN| zh{Gi*%7v5#ani_CGG`w3U7q4DNW)j7`>M$4ef2fy;Q~FeB4Ls2IR;9VZeYmysFx3Ht1i?N=!jXe-N-Z*b_})d6<` zb@Q`lN{?<#&P;v_zr7LaYGr$Q(0~9F%s?%*n-Z8q85hi-xN9h&jJMer2trINBvyBSZhL9Yi!7J7q;YJz)Sx zhpdLTcWtqBVtG=U`6)@1KQGu9nhn=iUByL=Vt!~%cTwL7O^;Jne2E>w&96!*SxLEJ z&&((xZjPNH_Vj1v!UKyGj8DRs=UcD&FO^O$2p!7sBZ!L#3kxek{vJMJE&WSc9Xuzn zrvb@JzI!9l8}(xi*TmQDOqp8M|Nc(HrzXT$aeF(Vao)@-=Blyh$z}gazF)iN{q5pw zJolC7id%RVIr;tRCgr~mHc0=aq}wkqG@m{AHJ6{p0nwq{>!Fs4YOP|W_=kW8D#5$1 zJTDY^3-l8lKFbY_D=Mshm2X3x1mP{fYGgH#9B#@?Ucasif#3?ER5wB-*g`BMLMG*c z4e?uCt979g#iC4>HjX?`?GT_Le2WiiO_n?hg;SZWX54{PHi3jDU#lonmey}%-gQ#9 zQf74hdfFhr#Ty_HKlI0MYm{x?!GHa#l{bFpJgIZQBY@net9c3#w>78+!E|Zo0B>t| zXM z&o$_w`i@+qBuT13QYJX`6K_<3ODnGn3yvJO;?qW!PHT zZt{ogI|zuO+#({tUauIDs1CcYGlLyapqV?XDV;-d3Va_)&L0RB<7N!&wMMW-jsg4L z1&Q8Lt6ph8li?@Q6Rm@CPo{Jut{@7`Nq{~;LGk@pD00ses;{8ywf*6Q3&FCxe!H9X zo3+k9T;Ub}2+C(Fn=*9ey#IIX_-oyp+^X&386Wx0uv9g(vH{|6n7~xv;U{8BQNBLy z*i8Wl{=oA~0(s+5W#%vlYQ>(1=nJrfA>>SUBe9*zBMhJ|NWN8%fPt;Iz(6P38OvIK z|7;h|@Q80X1rHsvmzR9uA2Xo{)&1n*zcx|StsbDdfmC1w2V7FL9&@SPiMrJ+Mz0Y& zNYKsgSSx^lW!_BXrVP_)H+G1xR53|)ORjo!hcx{*8MMX|yeu{x1Kb0nq{nD#Quv-m zBhM-a;Jx2lnG(}e!X5)ZEWal>VSyD#myJx#3Z)*v3vc|0Y8F*6iC=DT|Fn2wDSfv| zzLy~(ZU1lajAeb0xzj*)>IK?IOys^=5}imTJ+64lTG?_*=zU0wNsS4?9M611(LGC{ z+%*Dra`%Y9jAoYhG%F`NKr}uE7SUKZof-&ZL4kEiK+!LtQdMKRl-XV}C^=Ns$lMtwGLMkZgdu-;F^z`5^igv3RM)+s z&Sp<(1msjaH&w9Qu}%ldcFj;iuMYxo)T?knHqTn@+IC# zl&yXA6Ro62Yf3UqTs(&uCgK^dcl1p-{nT#GhwWpfFVRRjx$z$Kn`*b@paJBona%!C?wDM;_JM;tv*$GV12_ z;@ha5zgjzO@!)EzkiWu6F|3VZpg7`MV>4_EX8L1n<` zRBWZp!N4?v9I?h(gq!IZyz7th~;q z)fu@A*`kn!%P^~34!g5h&Cp(GAyfoM;VTH88}~1tMX%?0qqCK|Cn~4Iu)IY~0CRi; z0brZZbV3QWC6!b+hwRfUebs-xK!@JDGf(p&ztX8+LRpCpS*D7cf)N6bK!fINwqSjR zG$-|&GPuPnQ}iL{JRfWp=?+_42Uw#t5j9P-zOfMiqK}jWNuDNQRH;C|#1;&4Wn!yv zI0^g$s#-7|tlw6_D^XG04%!#OFI;Whz)GoXtnkL*+%}#FM-CZ;)-B-)HfWT40pJD2 zu8FH8!5C2;@e*kxXjN0hR$GH$H{oS3#tvy#L_+BML0(B$y;vD)MG9Uf(8#!5Y-fG> zMeb+JVosn!n-$;EbR(HZ-kSe_SzLp>hcO4}KAg@!k8&m!21Z57s;4ZX+|S3fM`h_( zsME6%&xl=(PF}5VA}Y_>(|sAUS7D={;{E)lHE$BXo`jY6e8xDVqGu|forCEDf<_s( zM9**9?68dRDM~?ZE~O6-krllv&Dy zCHr2B`YRm3bYEbHXDgjXH|R|H-*xZG&KjOwl-SHhYxDK^;MUoJIpWbKy9+8_*K+&? z^%9S+<{S$TLx4IwiC$GBy`Ha+QfjR6@n-SB(`4@BG1mJoM>m8oBh#XEPn#&*h_|+gU#0%nL0qAC9H*a7#noKdEUllYWI$&o(%l3x6z{y4`Kx?z`8Y z*qDTb%Xf?sM#9lDC!h$kNFL(#DBY?v)~;GjFdvk32LL##1(+ilGTX7Ysc?M%j0O?(ur*;6|I>V@IP> z`I|>KgW|)m6jcDEKI{@*F+Hq__lU-%Zb*<@bFD`)J?lnhbmOfDQ3sC87q{ z!fTnTO3ETQP>tx1Np;2Nk(Z;98f$#)jN|e=i{CY+RtkLLp^Jp%36V<>v3&>EasBi# zQBPe>S_>zF0d5Q!TzX7LDwp8=wTq;+_u8arxtOM0$|YPhGZEY;hp?to_FlD%mbGVW z4})PBjVVHIZ$?>D4iZ+2!prFa#?;E7M9L5lt1>@OulA1r4KOyt&69=-p1yX{7g;we zR3nr~#HM^?mCEj^Qiaqu2=p9=$>8&h$Cdy?b!Zq-OCMVbU$7JfR7)<39m8E;#CSnquwDWq} zGq=fBB+}F8)l^3eP5Rs=qFx8^fU*{a6(4j_JWQ!}Rf7)qxC^|Vw^wjAPNSf>NF~HJ z4C`Enbq74x>u!+(?a@DcCtA@!Lk?7m22|jC*>RG7KLDEyME%x0(y~E+(G<_k;8JvC zn3|z(nS%V0Q7Y{7+ZzztrVLvhd7*S0uEDjBbN#tX#{q}6o!DWwPP`c$tK>+ZJZ7(- zeUiN1OQnE%g2Zp`*0E}U-?3+B zF|WYqZh}Ps>(#o$MHo9HH}~wQ*+S&|^gM-Cp%r2Fu%$po-9A@Ta1F92d?itUy~Y|huC?9RQyhIZ z7=uELWW7@}0eCti1tyY4F$NiSbu-C~o1(+JsL^>ic%L3d+twNBK_;0spHyR2bH@x6 z$w%yllO(}BxgQ#$3lyczB5G=q(uf0Pe-ozH00qwcbJ#H=R``uuIsm{YKaOnx{1E!T z?r(nQi@Y*?fmJYo0R86wc>q?O`uDNB^?3y{y4_=Q0)pZ351<{QV&e8??WWa}@bXp4 zCOJ=~8}G)#jpa`@L=>=juqMgRoEr}G5FdZbmWXa}&{CRqPYb@k0qzK|&GDp2EwYYP@!FLmY9M0ZyyZ)GlT z4rn?Tb?i|OwGgLzG^jH@yaBIqvVc5^`c&Mn-YaT}nn-6!y}K^r#J~mtk4Yw`6AN95wZH`1 z0Xw|jFbRi}2jEhGZAJu!H)BL*m*VlIM7^1XvSu?|g-ewpot~xsZx&elaxabX26cr*m23sJEy3U8x!-H?MUmjHKnPsP2%Z5qX@;(cy< zO2E+Rg#Pg!Ql*pDXGYAWI(2IgZK+s?-j`%uOG}8*U;u(x2viA!JP`~Ef#@)S&^Zf(S^yG(cmXy7Bm;*q1Rw>1bO#^| zf=L@ueihspH*g+6P=4#a+H8dFaS(i{CW_KcI=JBfuL)|%*gw_*xH(Hi7(u3ru!NeR zr&MbE&ctS>wD8Fsf_=GS2_HP(% zv52zuly_yAhCN5g<>JC0L!je8e&$rT_?BBlM|WD;5gPj>m*@Ypd;Wh`_uADDL`H;C z1SkX;$+7SyjU0?FP7U#M`+FN>fK&;RMiYWHiIt@aWy6 zwi#+u2=iU1DgDkJ(qYWsT&mxeWa)?BS@Y910H4PTkXQk+leUzOg-LOP1-lC{K}s?E z6~I6A?{5E;Q)~XHwgTX`6Dh7>Wq;J!`y|VO_hjo_03K+eHm*VTKBw_lA=slh%#ZO_kH_^ z{{PW8*Z;j+=|qEs=xDEj5qAA+@l#;rU4#NLVg_Qt0>s7*5IgqZT)2XG^8vxYfCLHx z2^R$tD-I+94kSeiNV-fAygU#B0!Wb}5E2qdsd5l1D#$(eKx);2G^K4%paC{=$SFL>pJ;v)9Jw++G8i1WHWCvAj@;xG9SV+sZoE1& z6o`TdlLXKJ6JR0^2k_#G=g;5)92B`Y=2;2nFQJrh{b+0Cs*DJV$tUGryB-`Do{|-WP7(Cdqae_fvkJuWe3+ z&sWKpY6jpnxSeScZ`IZB{CdS^fPB>@z1J;NG*s=pZvyt(d;b?b`fO( ztzS%*gmEULTcZ|T6~QZ}FKpBiyq>2ryi+)5cSa89^~YW&ezC^3UoY-g=Q3yVlJ!HgQMcgrYQn=lSslJgM;Ej zOrH_NDDqr6D-?LVP(QKpMSxEVeNpTkigEk`Op7-z(G;8knYIuTQj{QyDO8_9%B?^^ z{m8~A0k#$Tied*$fE~$L{45Ofu*ff@hFzBz?;V^u`FfBoD^CnGXMQ5??ptJ$+1N-F zr`9J4&>F`T^*D*jp5o30%d{z9kV1uuH6cq>o(Kv8MiJKf0Ev0O8iutc(K3QjMQGZ~ zDw0v764PZhN=m{Cl!*k5Yvp}1IOXk1Qyvl!LK@#E2|#7CFvi9+0hn#yMH@lAj9!9X zXt!~ZMwbDg=~Z(7>QR%2bb1b3w;qpa)mXb)!)Up5LBdsFOn@^*oEiK)K=MY240wNI-g@{Zbxro6dBo7hy5myJlMuasX>LL3y!>7ZAch#2}Doz`X=+7^D%Ty@uZ?(#GI7jK@mD$op_ElszXw8>4gso;*vpLb!&Ttb#ty0kWdA}hrHVN)i zAc3&)+sFguAwML_ZsFZ`^LjJks%&Rf7#^qSo^@KtebO0&vYzHUVYOn*cec z7?df4H`knOgVip=(~dV$doRkaenaJoge5+AQjmM0r#b8lXF99-T2O6K5(Bv`J_%1k zvQn6eG=!P%jASNj`Bt#na$xNYuyzb!?K5C42UxoStX&1x<_*xO0`>tMMh|cS;0nN_ zfENI71CEBWp++rZHUYlKrmN?~c^#d-&W$^dwQbUq7uU?z-~luYUw*c{<(K4~d5#&l zCK1kxRkpcjNs`@?B2}7nw=Gzd;f_o_9&t}L*ArQ?Mf0>7Io$P?`p$py&DutD&k0m1 za$rqBv*aw3Cwtn{WsflB>j!MJ@*K&jobs$x+yS}Et056l1==yRoI8iEd?^KHxSf39Q7r_LdHTlkzH~P22Rc&d(qAeZ4V@Eh~ zO2)9qQ#EoWdl#c>5n-h=^>Ip}MkE#;aEJmay-_*gD)5@?C#4m6gU4enU1$1mG*8`N z48is&Clv@9Kbeo)3d-Y~MmagiG=-8;XTesro_JRb7_H+gEIlHD_a8I4iuMw}e0`a` zP6BLV3VyA;z%qDWlrZZF#=n0^236o}g<9cc>(0SgqW!>;0qrYpd=3zR!0>^Me>Mm3 zcYyXgz;A%fjs>>;834H-nEnPFy$+Nw4F&Ss2Y`FYGI)^Wo@x((7wCeJ=65u&xi9a2CnsKlaRPjK3%gZNL)%YrEuFW{ z_+#DA1a&k5F>>WIjC2D4Kr?e%DU7|o&H1v4kB43plQs8z*|eM1ob>}&<1jLet)t86 zQS>l+X)aAa;bYuK8-}5shvqso2fEYqN~ni%YQjKZyMT{l-?YszJuc?+={AIEd7L`& zhnZ5*HuPLiiiKiHFRQ*x^(HtUb=tj7quy`ZQ$AX{|jz`E;;Js*C}rGIce`ppAo41WcGo(G>rr9>Baol4x#InCy{m|?!4kF*DTsW2=l z`P@rbn^=vB#L93jfGh8)Rwpa09M+x+yr@)qeYB_%7uYT;N&-uT?ybtwfJ;=M-jXa_ z&7qnX?v$&}0^w>)h+B1XD_qlDi#1|n+{MfKB8Gr*+XH>CO?nDYbt>r$IYuL&p317p zD3Ec+FX3%3-ra9MEs0nE^=S2aJ$6*$=2#fsns|QB1oYTIykp8}x40m2z0i?|jfl1Y zcs?b^jvoqipi;J+hMFTB65HwWYZJnpLIqIw9x>ARnsg`^V~Eg?&2)?t8exg2bfPSm z;{rM1&P7P7lEz95HZ#A>)vD{$ZKkEfprlMsF;y0uY^bYh1-#mtDiUDR>UAzQ4Qgv= zlYPLwgMeffqrwn}{B6xCBt<#R3gm&VA3`PerVMIP!(Dg&8U&euX3CH&nFdT1@%Ast zLpsnq6-v%g{)=Na-U6DJw(wbXGb#|OzNh5QSzv^2I8AAB^M17 zhnn{fi`PmUfqp3#&t~?%l6s!8(|K=~yHBHuw|P_+o*cKQTGk=<>t#`%i8{4;JBdp|+6IRGXkr*NIO_oEJXR zo57UDM)Zp#cwt7XzX1ZJw1~o949-4?O{KzZ8(XC*b>xp-Hnj{G;Y5&^^DN+U-p2TQ znIq55#c_9Uu1hv^%Q{rL)y^ij?cB5OB5w6^dciFj8@ugN?i>3pyZ*6DEGcv89+e#1 zk7wiKi3*3$Cf3P@*+iVrXOxNBH`1@N2NccR(ai~hZeHwVQAwO!V#{N*vWEK$O^jZ@$WXEp5uKu#8I{6T>Pn?z9< z9E-0;7BlswNSuDaNMc8>uNFUwF#q7f5dqR@^nxJLM6%j=Z>4L|YC&r5Gm-8b zqz*T5TGKN1#!f3%nF%*o)*>2!aX}9ZQ$ZsP?sL=)*o*qqlgGFCpA&jV>9R)WQ;1%8 zfVoJFWa%l4bz6x^b*T|XM=R34bS78bhk`yaVaviS#&4uFE@){rCf2?j`jTw;MvsQ6 z%SUvloq|uBz5b}xv4vn^XIG6ErCJe_$!q>H7GZn>EQ@JSX@7CHy@i2Nc@)p~V6%~k zRq7^i>0j>RLAW>;i97C)ElSwzo?k^u-EI!4h}R=-PR~QVW;xBst#KOl#L{jarz3JL zG=hgUDHrdZFIdxqMoI8#ODWVWVD;MrE_%_~*b_vb%8$L*02e|P=BdQGM$X_B2z z=VaepZv-!SKyj5(%yx-qHQso<0N5kJON}Tmi!MN&HYjUXXFFezKwwv0GiFG=UPLRg z|Jh3bu@NWmoFoad*TwmMw}f_}1gl(LWs723j$Mp4?kzBmkzQCEf|8LVquYAo+INkF-jz(dBcntPhQrjS>r3~l*Us!Cciw6^#cU@;TTtdNQk8w#_sNmTd#ye zZds5UJR(EI-^eWuo>SLOz<3YIULM7HXC*#W9bnX}PBI3V`**+B-?T^_mfKYP`2lt= z;vD|PT`m5a=C?91=?$)I)BSQ{*K3hqdG7~gm=z6o)p>>s~PN=9qN z%eGuPV83g#^NNa$@X7EoV%tO#`yFDt$Jy}e&n1T)MECFx7RcmAg}B>=U{i~keU18|F_k8ABU!D zvjDGZ;EM{)eEMid>qi%F7ir`U!~?7+#&O|c+~T7Qk7VtqA(JlSr#mLqcedx-~dZ|!Fmaz{lmhXGd&Jlz*&G- zu}qzh+{67@$}U(G)%+_&!~R^!EnE=Q{LSKPyFZK1t6dmm)-T|*>t+qVJ>1Qi@sbW! zo%+A{qD&u8f|vBvjrYPLeJ7vFYp$^_QyRnK#lE1r_^a!ao&-rFgp2?ufmH>E|7!**mjVxX#Ks#vy$>&7o3mVTs1rVW~9ugLWM?75(z zZc*qJ8&MWw!z%yV_4MU;MiKj^uERmEc$4DI+UM*a%zW1Md~{Iw9cR;uz5e2rcZf*M zeiXAo=E(+=XDeRrNzAqk{D3;YuFlbI7&jq>u0Z z{d2pX7FUbqU}$6Hz8u9*|=;Y3I-<&<6xjsx{ZKyi1``15v zvq#wRP47wPM75LgR5k$%F7vd}S_!a{q!|6LjOpxnpPKOYg^TO$W`$uqJ?Q{p1@`L* zt2iEfkW~O(qei&$`UGmd6ZovawW4@Sez90q*6z`Ya`MEUaj|klkeuNGXVB?~9hG>_ zO`Dl#Ftq;H@8YlUKsxmQPt&laaqci6Wo1-9?mydMB(3EhxDNX_{?`EXZV7%GAi()} z(4&AxN=YQ=;UTLVujE@B?p8EC6M}ZH(5}26mS7X_m&-PBr8i_?Zy5sj^R?e4rA@J>($psZOH+5_Uy<&;#bI%hWqViL1=7_1Bb@#s zZXV@`@lL}ScI9oiwmcrMBAGbETOWLM?NP~_CQkR~4oa65K0F{W)yvW)*fNSm8G6K% zt$iECLb0Tjw4_)lmbBr*%gk476#IF6(9p^Q?PDZlPEbQtJ{a(l-trVxc}d0oL%RVK$0A`Dv1sdkJ0>RKu!46SL0r zu(RToQeI4qK)w1b6P`~SDe+2jY$Ln={hiQccV*RlANx6qB}kI+j|g;g4vqAItd!F` zeC{UMGu&e6edxe(9*u8G42c8_^9!!kL_Kr-=!W|qun3R|q5E!48r0V57ftqCu4Lp46Sma(b zT-W;qG%v6g0meD{hIeS3-z>cn?m)HdJWlz zx;n|-;sN2YXs=M54-_qvt~1EPDLjmzHg3xPliA|PKDbXMwGHziRuxH#a_vGN4jui2 z5Lx8BW~11H7YH2<9gjL_r1k;jNyYG5;q(gomJAVCr$0N=)z&c%1{WM@NsbQS4{f z&8sKHK;ne_-u5_bI+=?F1&OJpP=;OrH+CS4mYM*^-{vI4rnkqxoXE^zdS;03-!jA! zJK!&eMn@5fOT9`w`{F#}k@wDhMH zTUdA7=}vkp=Ir=jH~ly^m3fAIatSfb^h>FZJe7JZt1+#gZ(~Ip4+{xM)%{?Ci`T~2`6Se&RRZk{ zKr4#p)8#28-?_H0wU$V)5cne&`M;O|HRnVWzkaf97<9h$==1mVToX*J^T8?I=Hkx} zpPkVuG{q&J%dYbp4V;UB^wi%QSINMJ(`HEs6)C(!_pGYullfPW^p*w3PiSP_T@*BI zBG@q^4*w(x|NcsFANp>`&_D7;61hEw#5*6km+*Tfr(i-zL12TQmiT8m>+X{9nO~Y5 z124g{>P}b%>mW9%vQ4Q5q@gnm)nF&;nkyRD_AQZZ$n##Jhp(q>!M$rj~=2L-WmW*7O$qrRl`<#~zwbI3@csKB9~TUh0k9#)QXk}rWLwuvoNA&=7JGExW_KXDEyx zo;_F^`(r9Qw{>@=z8RCBi@9As+pbh!GM5SqF>~lqexRSAN^jSxU&&K$&`&tj@G@AX z!4Rj~&}~|~NjlVE6t6^=P(OPxsTP2@JP4`*Gvc!MrNWYfLJy?~hew{^hN@*$3V^Q*E zl%JbNw69%+roP&#LmEck?4o_$JQPW#!S#rmHt%iGZA|SnUXCFTM6l%KS-H)l`+`++ zN~|k%da7HmFEz#6dK!AdYpQzUZ3>fm9Qg3UJki_fx-sL@#S|C050$Qw_4N-8YK%vU z4xhJy!QsIZ>rj!Qj={i*b8rQy$Uygc--(M762~#Jx@xn`TL*|zFS(b?=ITmHxZgN& z{ufaR@x{J>NBq+Zwr^NccCc>_Ip$owtlS|Tm$VwnUC8s2qqo6<5Nrs>UUyCGLjW-p z7lH{%a6BJ15RT(#0mMH#UtD3R)ih`Q(;oy;r>FpP$CJI@KQ(0}H(rAHy1y4HSERTk_?ZC&f=N z3y*Ozlf{!KU_-czuzW_d2edR#rlb*nrS6{O*nQXu(QJ8@^@?3tUTXI|A#iB55&2qk zJ59Ri>QdwtauTOGl}nYK4fHfcf0{g98eO>@xizZQ7u{HwxcImoz9P;~K3D}^^UkRF zp#q;iEK&7(g)FB|NK{HFNh<8VUs1Eps{CBZMqz@Sl@Clajq`LHner_(-TuawXqC~b z+n^@4=+Er^o$X`2*Kt_SbjgPGGQZ!C@Ub0lwEk?a+-;2W8npE{cg4zn^P&~&T0Iw0N?Us z*n9mJ#ZuDiWBn8@3KI!q#iSWiv4(gMUnkct8%K(RxKJu7HE|dqa$JB&lg0iudYo{R zkf;_X^^^V={9MhhP7#}~)m5{QieU_c(ya7~b0un6!8qj(4?c-55h}@oA4=Z-_%H*X zowlB3XBmpy@?{b;ng!V}pf-J$8PC|m{jx;q8~g^Ma%}5tfB?s}OZ&x-)$lH3oL5iw zqrr1+Mpy4jE1Fv$cOi?{_E(Xet#I}dZF!2nD~T|9SH0k5w}r)TFI#JE)$)IjYOBJX zAFIqVHy+TqFuzC7F+cjxxC60GcZ!P8>Jq8x&jv%nUuxdS!%)Jd8G}BNrz#=?gs&mv zzDo(7{>k@4eiI_yE#M46Lr+Ja0!fc#pC^j1R@>Zs`X3~QiK`R7U)aoPB-B96Fuc<) z*+VOdGKU$3FAF(mEzN{%+$lIo& zXXNL4G~oU(PUSH~znTx$>gGVXj#PV{!c|AZm^~!yi~M43&cz|Md{?T2xD<-M$Rj+b zsX8~d?xi^?o3rp|_h)`vkXE?#%he^rUej%S#ips|Z+XZ5}O;6sXZxi7mx| zn7j|;B3mm1efu_-Zckz2AE&b;sI;WK>f(6SbI1yk8y`w5>dF&y8Ae*&bH9v&L1qToCXypr2jhWNelV_esx1{cf95d zc;MDnw$8dyP{u2G7o4p#&6ajhXTxs6e}6qTsD~6b*TLQ?hz7o!6Oe;P7!*?m%Yu`2 zYuip`$lT(CzuesIx&zA!<4rT7&b)$3IPoCF-qa4~8iPQT$o9eJ?~|$BChc1A7N3V$ z61^If;W7~CL`W)IurH%SYa2d`hHxaEUhL&LXnrlg$U0IeB&ZeEP>@W($9Zx)0df8< zRLT4*Lp-_w3-YzIy< z^RlNC)+#um1Kt2{(Rtn~Wu?x5B|@b^Z+fuUhs;jEz*v?rZem3UW-4h+xW>06RFjufAzPMDx2M zDdxvyZZ6A1_hf{GGacl6&+0c7U=k8?eQFNnb%7y_s}LQ;4#lpZ(V={4Dph}Pn+w(6|BCP!ej1`_Q!cWNhR zH)lpJdx+O<9dQ(}KZT~*^coUR?i)SLB}1d7a_q?bKsY>CJ5}8afSS|+RB8^6LGyI> zREhIhmT+yssV*dV8d5U7!3oKAoRj%#IJU&iH-|Gzy!?>!<@{J&o9~B!)VHA}`Q?f7 z@dip2@0@h1eFWh2^jTHqcRvgNu3~Rg&vgrusU628hB%X&Z@x~QN+BGY?_^5tTPYX) zRAJVhC&suTNz#$dT>$$|E2TXhA)Ts58C|X}O8SEp=e0K~anU_nxaB2`!Bh)@e>JMq zrWD$bra!IoN00Gd5eT&horlP$Qjp3(#{bZ{Wo9%pw!dIPdUyLEINn`nY`dT)*6VmXq&pE>(Z zv8gMprK%Q)PPCTBk8{PVcAT8tJcjT2^La%YCnx7sUdX5Y&ycZWd5J-~VD#BFDb7lJ z>L*lUe{;_9S15~JoEDQv)R}iY0`AuY4UXj{;njZ!?VwGz!*Q#vLpu(9^Kmi7-y-0n zRk^LpeiS(c?bSzqRk~@#ASK7>m7p+JBn@;#;Yn5KkdQ8L6}rgt10Tn{h{)@Q{f_97 zOVn58)+?vLq!Wf9?#7gYHopHODqmy}wK5}GxrAnjW_B@CcqcOssOpFt@hRLLbOvhA zpvUT1=_BbW^5_0`{2Gvr>+4+XZB8eaVrh)msD9Qf8vmn>?+pYSxdu`ya6$I}o@W;5gp9#v0H9WbmG&0BQAd zz8#VfLa`ah-`8`AtJHjtO#1bBu|Jnh#a_qRBSagshZ8mGqkQSgTbfOOX zpQ=;9GsGcZ6;waoO93`O@)9vJPw*te!xhq@KPFuMQC4)+H-N0@^7Lkru9dc?9j!1ky_%96PA56!vHQR6smIzXjk!UuK%Gg71UhO_k`_!xnvmenfwyNdV~N3Kp4ommp>0 zj0~JJ7W&Ph07YJmO(|-i$e*n!DH?e6W~Q6CgMM9B*C1_`tv2)y4gQ8 z4hyTtQ}^ljQ;VR36`UfvH4C>&JLt&XEl1{g@Z!A#D z1<`(vPGi>jsc_VMZaDwBb8Q7R2~NPW*QV55E=q2);7RUS!MX&rh7hiW(5$BbA(N#X za4O4s3QbbxYV0B12ZXJG4zR>g`5YYcF{8sq%8m(AyE330(=Pi=>!!v(u9%ozE5MeJE~S^%bP9CTYhn)u)tJ$#PY1V>$= z_0A+jb!p{vAV@@RRm#Y4^2^eH?qnOF6VtX^seF>ImAP9f-0j_MFH3BK+-^q8`@_R- zl2~3QN7#=U* z@j{T8pG5wA{==UJbjsBccrNJ5eqW;0JnRtqs@TP#?Y)ljW!u;X}c_)lb<9UxEhgY?!>+FKI= zn2_2zBr~QK#c2vM1G^h}W7H4%O0IjC#Sxo)qU&bcY@4sRX<)MXQ9SQk!u=LQtB#W? zkap5;2Qo((SlaQh4c~+x!=K=Q)jed$SLA#0TRF+D5QnT-Q-EEVfOS|yJ8M?9gu8AG z)4;+uA|`lst7$`q{5^zes3CZkt6Rl4L2);Xmq@chW%)l6$^v%gq*Y=z0q`%br9{f| zOLE*sx|X8cDwDd?^k7{}%UmY$**?$dXOw7ZDV`QdJKEOJrn-fTgCgj($b3$^ z?U$3*&DlH?HJ*Lh(_=gBdoat3J6p+}gJUu#yNizrXe+&%3j;28O}L4A(?`Qd(V#4L zQb$@%#ruP_ep@z}i*7?26O*!7SDZ6DonnIM&2ZWXu_h3-1_t8b;)FoB{C)VlLp6Gf zAkyp1O?lnhv9?f-_wrOS^Q;Zq{*Nxa)>J!hyg#?MW{KplPNnNh2M-ZOV}oNG8DE&Z z$tSj@`MC6gfn-Gd5|NU+5Dp-&9jvz^&~~{`Q_)D(%vaC4BblnLn`&DX)mgm==<0}> z#d2irf~vB64`kATZ0J;zpm+ie&U}jioz?hq3f>_awIpc_p?ycIs~l<_M?GQ3>_%BG zx{|pzq~qI2TG7>PfhVJb0U^m3d52h#%peAcXqpb*LG1$_wCq(_@WLe&s|jX)rjN1V zDp=|m!kLnWCL&YUCrwJ{(SP;1Gi@5xv3a~d znA943#&kcFwK3b)P1%r{$(x(AdTW#4$PRR=f%1bb$XHeateu5I2Z=3V6cOE+T_+|4 z4?K<8p|&w_1$~6R{`qoU#C>4L#0zLhZc)OLX?H(i4?%zv%aAZAF(OQX; zyAaL*YYB{DmprSizQO<*pt_g0ibUqX=Cpf=TDw;$!)mSB5-2E54~_`c%>5Yj!mWQ- zYH)u-jmXmR+zTaaR&7x%77H-U5AlvJOdge4{6-TG+|1iSI!pCMpD#)+-7NM-w4gd- ztPt&D05HWgq9anDs%2Qn!hCCb{y1j&M0LRZ5&FgGbn#{C#gJ+=8u>WoPFu!M#Br~} zfCq*PL)@->kY$RXD&+qQ)35T}99-Mc0nn!g9!Fljo-raaAxSjLu)nzUW(Z=a_>X`X%3rHS2;MEp5w22$I+2Sbc9i#zQ)dRvC^B+FY(J{*^Yv(S#FoT z<=H5zE5%lQdNoJbqzQ*)x?j(rBjEJDq7gaCHXGu{gZ{iju zRkcddsarKV=?&(rrEsm6N|}_uQd6sB zU{t%Zpu3*SXQR`ebv&+tVdxv0a5-)XCrJ}(Nd&ygsTAH4ZIO(2XOAYfG=Vz5C$5}Fk zlQ1>Gs=E^1{yVold?%OC`L%D;^^acna{rlb)6@5#a~6KMV9&V-+|m7kc#qHS@JnN) z8h4~&azLq_k+g?qlm;}Xj1DQKTXd_wgde@+W%Wgu=o($K@6j!KTK%*bJ=;I~%aHvE zk+upyK?{3K3!3rlpwAT&a4l`dZJyJEfzYy21V*R1=6P|Y z{>K%x_nT7p2Z5I$I(kgI72$PMRrd)BWGnIZUp`;pjPSD1Ug4d;eC=Us=n);#Bl{h6wZ7e;W2GKV4imowSPz#w7M=oV zRuiSuk+No*y{P_Q*KzTb3bI`?g3iR2Sesb&kvA!xM|j1Ia8kfybGdLk4=7iX4FfI> z;6Z3(ch-Y--G~>_z?bqYpDz%JGcud_4IN3WiImIxd0u=K=7HEzAj)h|1epLnlm!E(^AH1mm<&=2YF?OR^eG=xJL)GjLtf z#_v-?X3pYLMXVughJ`U~h8&uFNQ=R46ll@~;+l(3Dx&@oK|q4yzBVRkQQb_*oxOW1 zvM*TAwS%q04Kg%PhoOPnf+0hO40|wsR7veH_s9J*5$7LU>nss5#|GvJf+@MGG?CFn zx||#&3yI69UsHCuuZ97U*)25DKFl^$l+$Vd)@k2G>pnWgC_Bm{hB54`M7ZKvPff3)E!MDvA=I11^pf7=E zjAG8$x1#29qiq5_DRju4Z9`g=y{{-ivDq- z6k1xgMRga$);ZdCdToykjrycCs)a}aMU(-yWDXs)YAZsSSmDbQrII_NLuO@I5A_q-615D{Wn|FSGGer+=CEVC zAANK=8Bu14Xwu)fbN00rizK^Gsyqw=Yb$IJS<`GRrWYZqBuxq;ugQokHWM;TK6EZ= zaC=zGh>dhFvy@Bw0o=C~K~!vk7_P`!7%+u)xGQ#`6aQNhjb9xiAm7?&d;tRRv|VbN zK<7tzM+@{RjY)6eR`a{yEDj3Ttz%h#|4?anE6a|^-x=Xs$CRk=G zwx0qMo*1|^1Z_ZUow!XKnF$C!=_cs&PMXFr%8r<~ihlq63DI3gOtEY(7CzL|$gYl? ztSHNjr`>@s(j~Z#J3mtyA)mZfe0biQ=}tN-Rc;hlnrNcu7Tpi#eK$CoM{3;FDS^NO zjo?gUEB)Ak-t<Qsnk!XyB4dE~$J`rfk}Jnd7%->$yTPtQx1^^WoM+ z8uPVZA{~h5n#2P`+5{6rOfWHI>zOcN!lXx%>Y=7VqPAZ0Kxo6O%zE=xW2+2{Dg>;2 zdI(&yNJp($krl!VVS^__AsY93zK3v7i6H2mxi?0*oN2LZH5w_G&98g@-A>On^Mh$5 z*K=KsZSA|f7~6}hw~G|559=*NrTQ#u+10>k|IcyH(&t;Eo}juGJ!~Apm*RVdt|?%T zONOcRFz3)4NmXwNyGt_2(-pSp!=F`NKZ+B zV_-4}=>_Uu2@YPrKz!s=Jo2V5d$c+&j)+=@e13w6TAg3tM%gie;d4Oe z8{;?*&Tn%WKi(n>Ue9W8v%i+g$0GNa)IzvYCzMFDj!Nz|brg3T+%fB;(|)}yr5WSj z!oiry5+PZ>g>VOho7o~bQ2_;@VM2 zKv}0d-5-a2Xsja?z(7;TNe?0e$j&u{QexV&w+3~VgDvNyJs*hGD%d#Csfz@l^Is6A zBb)pE_g|-`{ig#>0Rez-{X0HD0e;y^t&_0kIIO3$18&QP!17MU-P`D6vIJg;TYQ8Y;>><5-;d#St|Y&;8Ll%7#+v+jYBWy)Hk5Jy>oSvW=z-yDSqKH=rOJ>ztDT7yZI(I3NY2=U@5y^ zXv7Yqp3hFrL47@wo##T~>J#EAil-T?|oy9p83XtS&d zY#+Sx`8MDS4$6jrO90tAh#>cMFv0@Q3$H#ek64Fr1a=*-188?t*iCHu!i0+#DS#h; z(UhH`LGuz+W+aT@PQfsnnh51XP1SAS;HYhDJxXd}L|v^&vBE-AYgl2t5l4fPCYAOdtL*)JTmSvAPw& zXT+g^b!>I!Oz1OY>4wlx<49|O+c~ol2yI%dKa__6hl98yaZ_Ya9v>JM%`2W>A z0ekt{EJ6W)|L@vVRpJv*FH{%E|L~Jl%jp4_&&Zn{FXA^SAmamyEUY@S)a O=*P}hnT+8U0002VxO@Nr literal 0 HcmV?d00001 diff --git a/docs/deps/Roboto-0.4.9/KFOmCnqEu92Fr1Mu7GxKOzY.woff2 b/docs/deps/Roboto-0.4.9/KFOmCnqEu92Fr1Mu7GxKOzY.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..8a8de615eb2f70380f60b851f97814cdf1ccda94 GIT binary patch literal 11872 zcmV-mE}zkNPew8T0RR9104`tv5&!@I0COw=04@3e0RR9100000000000000000000 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

3C=zk= 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 literal 0 HcmV?d00001 diff --git a/docs/deps/Roboto-0.4.9/font.css b/docs/deps/Roboto-0.4.9/font.css new file mode 100644 index 0000000..171e30a --- /dev/null +++ b/docs/deps/Roboto-0.4.9/font.css @@ -0,0 +1,63 @@ +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(KFOmCnqEu92Fr1Mu72xKOzY.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(KFOmCnqEu92Fr1Mu5mxKOzY.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(KFOmCnqEu92Fr1Mu7mxKOzY.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(KFOmCnqEu92Fr1Mu4WxKOzY.woff2) format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(KFOmCnqEu92Fr1Mu7WxKOzY.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(KFOmCnqEu92Fr1Mu7GxKOzY.woff2) format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(KFOmCnqEu92Fr1Mu4mxK.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/docs/deps/bootstrap-5.3.1/bootstrap.bundle.min.js b/docs/deps/bootstrap-5.3.1/bootstrap.bundle.min.js new file mode 100644 index 0000000..e8f21f7 --- /dev/null +++ b/docs/deps/bootstrap-5.3.1/bootstrap.bundle.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.3.1 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=I(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return P(s,{delegateTarget:r}),n.oneOff&&N.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return P(n,{delegateTarget:t}),i.oneOff&&N.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function $(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function I(t){return t=t.replace(y,""),T[t]||t}const N={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))$(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==I(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=P(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function P(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function M(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function j(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const F={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${j(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${j(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=M(t.dataset[n])}return e},getDataAttribute:(t,e)=>M(t.getAttribute(`data-bs-${j(e)}`))};class H{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?F.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?F.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends H{constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),N.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.1"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return n(e)},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;N.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},q=".bs.alert",V=`close${q}`,K=`closed${q}`;class Q extends W{static get NAME(){return"alert"}close(){if(N.trigger(this._element,V).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),N.trigger(this._element,K),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(Q,"close"),m(Q);const X='[data-bs-toggle="button"]';class Y extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=Y.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}N.on(document,"click.bs.button.data-api",X,(t=>{t.preventDefault();const e=t.target.closest(X);Y.getOrCreateInstance(e).toggle()})),m(Y);const U=".bs.swipe",G=`touchstart${U}`,J=`touchmove${U}`,Z=`touchend${U}`,tt=`pointerdown${U}`,et=`pointerup${U}`,it={endCallback:null,leftCallback:null,rightCallback:null},nt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class st extends H{constructor(t,e){super(),this._element=t,t&&st.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return it}static get DefaultType(){return nt}static get NAME(){return"swipe"}dispose(){N.off(this._element,U)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(N.on(this._element,tt,(t=>this._start(t))),N.on(this._element,et,(t=>this._end(t))),this._element.classList.add("pointer-event")):(N.on(this._element,G,(t=>this._start(t))),N.on(this._element,J,(t=>this._move(t))),N.on(this._element,Z,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ot=".bs.carousel",rt=".data-api",at="next",lt="prev",ct="left",ht="right",dt=`slide${ot}`,ut=`slid${ot}`,ft=`keydown${ot}`,pt=`mouseenter${ot}`,mt=`mouseleave${ot}`,gt=`dragstart${ot}`,_t=`load${ot}${rt}`,bt=`click${ot}${rt}`,vt="carousel",yt="active",wt=".active",At=".carousel-item",Et=wt+At,Tt={ArrowLeft:ht,ArrowRight:ct},Ct={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class xt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===vt&&this.cycle()}static get Default(){return Ct}static get DefaultType(){return Ot}static get NAME(){return"carousel"}next(){this._slide(at)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(lt)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?N.one(this._element,ut,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void N.one(this._element,ut,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?at:lt;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&N.on(this._element,ft,(t=>this._keydown(t))),"hover"===this._config.pause&&(N.on(this._element,pt,(()=>this.pause())),N.on(this._element,mt,(()=>this._maybeEnableCycle()))),this._config.touch&&st.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))N.on(t,gt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ct)),rightCallback:()=>this._slide(this._directionToOrder(ht)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new st(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Tt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(wt,this._indicatorsElement);e.classList.remove(yt),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(yt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===at,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>N.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(dt).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(yt),i.classList.remove(yt,c,l),this._isSliding=!1,r(ut)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(Et,this._element)}_getItems(){return z.find(At,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ct?lt:at:t===ct?at:lt}_orderToDirection(t){return p()?t===lt?ct:ht:t===lt?ht:ct}static jQueryInterface(t){return this.each((function(){const e=xt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}N.on(document,bt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(vt))return;t.preventDefault();const i=xt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===F.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),N.on(window,_t,(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)xt.getOrCreateInstance(e)})),m(xt);const kt=".bs.collapse",Lt=`show${kt}`,St=`shown${kt}`,Dt=`hide${kt}`,$t=`hidden${kt}`,It=`click${kt}.data-api`,Nt="show",Pt="collapse",Mt="collapsing",jt=`:scope .${Pt} .${Pt}`,Ft='[data-bs-toggle="collapse"]',Ht={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Bt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(Ft);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Ht}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Bt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(N.trigger(this._element,Lt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Pt),this._element.classList.add(Mt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt,Nt),this._element.style[e]="",N.trigger(this._element,St)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(N.trigger(this._element,Dt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(Mt),this._element.classList.remove(Pt,Nt);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt),N.trigger(this._element,$t)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(Nt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Ft);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(jt,this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Bt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}N.on(document,It,Ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))Bt.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(Bt);var zt="top",Rt="bottom",qt="right",Vt="left",Kt="auto",Qt=[zt,Rt,qt,Vt],Xt="start",Yt="end",Ut="clippingParents",Gt="viewport",Jt="popper",Zt="reference",te=Qt.reduce((function(t,e){return t.concat([e+"-"+Xt,e+"-"+Yt])}),[]),ee=[].concat(Qt,[Kt]).reduce((function(t,e){return t.concat([e,e+"-"+Xt,e+"-"+Yt])}),[]),ie="beforeRead",ne="read",se="afterRead",oe="beforeMain",re="main",ae="afterMain",le="beforeWrite",ce="write",he="afterWrite",de=[ie,ne,se,oe,re,ae,le,ce,he];function ue(t){return t?(t.nodeName||"").toLowerCase():null}function fe(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function pe(t){return t instanceof fe(t).Element||t instanceof Element}function me(t){return t instanceof fe(t).HTMLElement||t instanceof HTMLElement}function ge(t){return"undefined"!=typeof ShadowRoot&&(t instanceof fe(t).ShadowRoot||t instanceof ShadowRoot)}const _e={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];me(s)&&ue(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});me(n)&&ue(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function be(t){return t.split("-")[0]}var ve=Math.max,ye=Math.min,we=Math.round;function Ae(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ee(){return!/^((?!chrome|android).)*safari/i.test(Ae())}function Te(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&me(t)&&(s=t.offsetWidth>0&&we(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&we(n.height)/t.offsetHeight||1);var r=(pe(t)?fe(t):window).visualViewport,a=!Ee()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Ce(t){var e=Te(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Oe(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ge(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function xe(t){return fe(t).getComputedStyle(t)}function ke(t){return["table","td","th"].indexOf(ue(t))>=0}function Le(t){return((pe(t)?t.ownerDocument:t.document)||window.document).documentElement}function Se(t){return"html"===ue(t)?t:t.assignedSlot||t.parentNode||(ge(t)?t.host:null)||Le(t)}function De(t){return me(t)&&"fixed"!==xe(t).position?t.offsetParent:null}function $e(t){for(var e=fe(t),i=De(t);i&&ke(i)&&"static"===xe(i).position;)i=De(i);return i&&("html"===ue(i)||"body"===ue(i)&&"static"===xe(i).position)?e:i||function(t){var e=/firefox/i.test(Ae());if(/Trident/i.test(Ae())&&me(t)&&"fixed"===xe(t).position)return null;var i=Se(t);for(ge(i)&&(i=i.host);me(i)&&["html","body"].indexOf(ue(i))<0;){var n=xe(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Ie(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Ne(t,e,i){return ve(t,ye(e,i))}function Pe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function Me(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const je={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=be(i.placement),l=Ie(a),c=[Vt,qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Pe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:Me(t,Qt))}(s.padding,i),d=Ce(o),u="y"===l?zt:Vt,f="y"===l?Rt:qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=$e(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=Ne(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Oe(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Fe(t){return t.split("-")[1]}var He={top:"auto",right:"auto",bottom:"auto",left:"auto"};function We(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=Vt,y=zt,w=window;if(c){var A=$e(i),E="clientHeight",T="clientWidth";A===fe(i)&&"static"!==xe(A=Le(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===zt||(s===Vt||s===qt)&&o===Yt)&&(y=Rt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Vt&&(s!==zt&&s!==Rt||o!==Yt)||(v=qt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&He),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:we(i*s)/s||0,y:we(n*s)/s||0}}({x:f,y:m},fe(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const Be={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:be(e.placement),variation:Fe(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,We(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,We(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ze={passive:!0};const Re={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=fe(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ze)})),a&&l.addEventListener("resize",i.update,ze),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ze)})),a&&l.removeEventListener("resize",i.update,ze)}},data:{}};var qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Ve(t){return t.replace(/left|right|bottom|top/g,(function(t){return qe[t]}))}var Ke={start:"end",end:"start"};function Qe(t){return t.replace(/start|end/g,(function(t){return Ke[t]}))}function Xe(t){var e=fe(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ye(t){return Te(Le(t)).left+Xe(t).scrollLeft}function Ue(t){var e=xe(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ge(t){return["html","body","#document"].indexOf(ue(t))>=0?t.ownerDocument.body:me(t)&&Ue(t)?t:Ge(Se(t))}function Je(t,e){var i;void 0===e&&(e=[]);var n=Ge(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=fe(n),r=s?[o].concat(o.visualViewport||[],Ue(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Je(Se(r)))}function Ze(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ti(t,e,i){return e===Gt?Ze(function(t,e){var i=fe(t),n=Le(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ee();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ye(t),y:l}}(t,i)):pe(e)?function(t,e){var i=Te(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ze(function(t){var e,i=Le(t),n=Xe(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ve(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ve(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ye(t),l=-n.scrollTop;return"rtl"===xe(s||i).direction&&(a+=ve(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Le(t)))}function ei(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?be(s):null,r=s?Fe(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case zt:e={x:a,y:i.y-n.height};break;case Rt:e={x:a,y:i.y+i.height};break;case qt:e={x:i.x+i.width,y:l};break;case Vt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?Ie(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Xt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Yt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ii(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Ut:a,c=i.rootBoundary,h=void 0===c?Gt:c,d=i.elementContext,u=void 0===d?Jt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Pe("number"!=typeof g?g:Me(g,Qt)),b=u===Jt?Zt:Jt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Je(Se(t)),i=["absolute","fixed"].indexOf(xe(t).position)>=0&&me(t)?$e(t):t;return pe(i)?e.filter((function(t){return pe(t)&&Oe(t,i)&&"body"!==ue(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=ti(t,i,n);return e.top=ve(s.top,e.top),e.right=ye(s.right,e.right),e.bottom=ye(s.bottom,e.bottom),e.left=ve(s.left,e.left),e}),ti(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(pe(y)?y:y.contextElement||Le(t.elements.popper),l,h,r),A=Te(t.elements.reference),E=ei({reference:A,element:v,strategy:"absolute",placement:s}),T=Ze(Object.assign({},v,E)),C=u===Jt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Jt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[qt,Rt].indexOf(t)>=0?1:-1,i=[zt,Rt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function ni(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?ee:l,h=Fe(n),d=h?a?te:te.filter((function(t){return Fe(t)===h})):Qt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ii(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[be(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const si={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=be(g),b=l||(_!==g&&p?function(t){if(be(t)===Kt)return[];var e=Ve(t);return[Qe(t),e,Qe(e)]}(g):[Ve(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(be(i)===Kt?ni(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,S=L?"width":"height",D=ii(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?qt:Vt:k?Rt:zt;y[S]>w[S]&&($=Ve($));var I=Ve($),N=[];if(o&&N.push(D[x]<=0),a&&N.push(D[$]<=0,D[I]<=0),N.every((function(t){return t}))){T=O,E=!1;break}A.set(O,N)}if(E)for(var P=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==P(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function oi(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ri(t){return[zt,qt,Rt,Vt].some((function(e){return t[e]>=0}))}const ai={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ii(e,{elementContext:"reference"}),a=ii(e,{altBoundary:!0}),l=oi(r,n),c=oi(a,s,o),h=ri(l),d=ri(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},li={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=ee.reduce((function(t,i){return t[i]=function(t,e,i){var n=be(t),s=[Vt,zt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[Vt,qt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ci={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ei({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},hi={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ii(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=be(e.placement),b=Fe(e.placement),v=!b,y=Ie(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?zt:Vt,D="y"===y?Rt:qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],M=f?-T[$]/2:0,j=b===Xt?E[$]:T[$],F=b===Xt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?Ce(H):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=Ne(0,E[$],W[$]),V=v?E[$]/2-M-q-z-O.mainAxis:j-q-z-O.mainAxis,K=v?-E[$]/2+M+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&$e(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=I+K-Y,G=Ne(f?ye(N,I+V-Y-X):N,I,f?ve(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?zt:Vt,tt="x"===y?Rt:qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[zt,Vt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=Ne(t,e,i);return n>i?i:n}(at,et,lt):Ne(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function di(t,e,i){void 0===i&&(i=!1);var n,s,o=me(e),r=me(e)&&function(t){var e=t.getBoundingClientRect(),i=we(e.width)/t.offsetWidth||1,n=we(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=Le(e),l=Te(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==ue(e)||Ue(a))&&(c=(n=e)!==fe(n)&&me(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Xe(n)),me(e)?((h=Te(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function ui(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var fi={placement:"bottom",modifiers:[],strategy:"absolute"};function pi(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(F.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ei,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:z.prev(this,Ii)[0]||z.next(this,Ii)[0]||z.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}N.on(document,Si,Ii,qi.dataApiKeydownHandler),N.on(document,Si,Pi,qi.dataApiKeydownHandler),N.on(document,Li,qi.clearMenus),N.on(document,Di,qi.clearMenus),N.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),m(qi);const Vi="backdrop",Ki="show",Qi=`mousedown.bs.${Vi}`,Xi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Yi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends H{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(Ki),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ki),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(N.off(this._element,Qi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),N.on(t,Qi,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends H{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),N.off(document,Gi),N.on(document,Ji,(t=>this._handleFocusin(t))),N.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,N.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&F.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=F.getDataAttribute(t,e);null!==i?(F.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of z.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",An="show",En="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends W{constructor(t,e){super(t,e),this._dialog=z.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||N.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(N.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(An),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){N.off(window,hn),N.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=z.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(An),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,N.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){N.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),N.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),N.on(this._element,bn,(t=>{N.one(this._element,_n,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(wn),this._resetAdjustments(),this._scrollBar.reset(),N.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(N.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(En)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(En),this._queueCallback((()=>{this._element.classList.remove(En),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}N.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=z.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),N.one(e,pn,(t=>{t.defaultPrevented||N.one(e,fn,(()=>{a(this)&&this.focus()}))}));const i=z.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),R(On),m(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,Mn=`hide${xn}`,jn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Wn=`click${xn}${kn}`,Bn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||N.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),N.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(N.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),N.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():N.trigger(this._element,jn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){N.on(this._element,Bn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():N.trigger(this._element,jn))}))}static jQueryInterface(t){return this.each((function(){const e=qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}N.on(document,Wn,'[data-bs-toggle="offcanvas"]',(function(t){const e=z.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;N.one(e,Fn,(()=>{a(this)&&this.focus()}));const i=z.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),N.on(window,Ln,(()=>{for(const t of z.find(In))qn.getOrCreateInstance(t).show()})),N.on(window,Hn,(()=>{for(const t of z.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),R(qn),m(qn);const Vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Kn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Qn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Xn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Kn.has(i)||Boolean(Qn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Yn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"

"},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends H{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Yn}static get DefaultType(){return Un}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Gn)}_setContent(t,e,i){const n=z.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Xn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return g(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},as={allowList:Vn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ls={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cs extends W{constructor(t,e){if(void 0===vi)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return as}static get DefaultType(){return ls}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),N.off(this._element.closest(is),ns,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=N.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),N.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.on(t,"mouseover",h);this._queueCallback((()=>{N.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!N.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),N.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ts,es),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=g(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return bi(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return g(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...g(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)N.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");N.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),N.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},N.on(this._element.closest(is),ns,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=F.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},As={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Es extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ws}static get DefaultType(){return As}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(N.off(this._config.target,ms),N.on(this._config.target,ms,bs,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=z.find(bs,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=z.findOne(decodeURI(e.hash),this._element);a(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(_s),this._activateParents(t),N.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))z.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of z.parents(t,".nav, .list-group"))for(const t of z.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=z.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=Es.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(window,gs,(()=>{for(const t of z.find('[data-bs-spy="scroll"]'))Es.getOrCreateInstance(t)})),m(Es);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",Ms="Home",js="End",Fs="active",Hs="fade",Ws="show",Bs=":not(.dropdown-toggle)",zs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Rs=`.nav-link${Bs}, .list-group-item${Bs}, [role="tab"]${Bs}, ${zs}`,qs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Vs extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),N.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?N.trigger(e,Cs,{relatedTarget:t}):null;N.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),N.trigger(t,ks,{relatedTarget:e})):t.classList.add(Ws)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),N.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Ws)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,Ms,js].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!l(t)));let i;if([Ms,js].includes(t.key))i=e[t.key===Ms?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=b(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Vs.getOrCreateInstance(i).show())}_getChildren(){return z.find(Rs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=z.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=z.findOne(t,i);s&&s.classList.toggle(n,e)};n(".dropdown-toggle",Fs),n(".dropdown-menu",Ws),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Fs)}_getInnerElement(t){return t.matches(Rs)?t:z.findOne(Rs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Vs.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(document,Ls,zs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||Vs.getOrCreateInstance(this).show()})),N.on(window,Ds,(()=>{for(const t of z.find(qs))Vs.getOrCreateInstance(t)})),m(Vs);const Ks=".bs.toast",Qs=`mouseover${Ks}`,Xs=`mouseout${Ks}`,Ys=`focusin${Ks}`,Us=`focusout${Ks}`,Gs=`hide${Ks}`,Js=`hidden${Ks}`,Zs=`show${Ks}`,to=`shown${Ks}`,eo="hide",io="show",no="showing",so={animation:"boolean",autohide:"boolean",delay:"number"},oo={animation:!0,autohide:!0,delay:5e3};class ro extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return oo}static get DefaultType(){return so}static get NAME(){return"toast"}show(){N.trigger(this._element,Zs).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(eo),d(this._element),this._element.classList.add(io,no),this._queueCallback((()=>{this._element.classList.remove(no),N.trigger(this._element,to),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(N.trigger(this._element,Gs).defaultPrevented||(this._element.classList.add(no),this._queueCallback((()=>{this._element.classList.add(eo),this._element.classList.remove(no,io),N.trigger(this._element,Js)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(io),super.dispose()}isShown(){return this._element.classList.contains(io)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){N.on(this._element,Qs,(t=>this._onInteraction(t,!0))),N.on(this._element,Xs,(t=>this._onInteraction(t,!1))),N.on(this._element,Ys,(t=>this._onInteraction(t,!0))),N.on(this._element,Us,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ro.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(ro),m(ro),{Alert:Q,Button:Y,Carousel:xt,Collapse:Bt,Dropdown:qi,Modal:On,Offcanvas:qn,Popover:us,ScrollSpy:Es,Tab:Vs,Toast:ro,Tooltip:cs}})); +//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/docs/deps/bootstrap-5.3.1/bootstrap.bundle.min.js.map b/docs/deps/bootstrap-5.3.1/bootstrap.bundle.min.js.map new file mode 100644 index 0000000..3863da8 --- /dev/null +++ b/docs/deps/bootstrap-5.3.1/bootstrap.bundle.min.js.map @@ -0,0 +1 @@ +{"version":3,"names":["elementMap","Map","Data","set","element","key","instance","has","instanceMap","get","size","console","error","Array","from","keys","remove","delete","TRANSITION_END","parseSelector","selector","window","CSS","escape","replace","match","id","triggerTransitionEnd","dispatchEvent","Event","isElement","object","jquery","nodeType","getElement","length","document","querySelector","isVisible","getClientRects","elementIsVisible","getComputedStyle","getPropertyValue","closedDetails","closest","summary","parentNode","isDisabled","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","getAttribute","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","noop","reflow","offsetHeight","getjQuery","jQuery","body","DOMContentLoadedCallbacks","isRTL","dir","defineJQueryPlugin","plugin","callback","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","readyState","addEventListener","push","execute","possibleCallback","args","defaultValue","executeAfterTransition","transitionElement","waitForTransition","emulatedDuration","transitionDuration","transitionDelay","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","split","getTransitionDurationFromElement","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","listLength","index","indexOf","Math","max","min","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","nativeEvents","Set","makeEventUid","uid","getElementEvents","findHandler","events","callable","delegationSelector","Object","values","find","event","normalizeParameters","originalTypeEvent","delegationFunction","isDelegated","typeEvent","getTypeEvent","addHandler","oneOff","wrapFunction","relatedTarget","delegateTarget","call","this","handlers","previousFunction","domElements","querySelectorAll","domElement","hydrateObj","EventHandler","off","type","apply","bootstrapDelegationHandler","bootstrapHandler","removeHandler","Boolean","removeNamespacedHandlers","namespace","storeElementEvent","handlerKey","entries","includes","on","one","inNamespace","isNamespace","startsWith","elementEvent","slice","keyHandlers","trigger","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","evt","cancelable","preventDefault","obj","meta","value","_unused","defineProperty","configurable","normalizeData","toString","JSON","parse","decodeURIComponent","normalizeDataKey","chr","toLowerCase","Manipulator","setDataAttribute","setAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","bsKeys","dataset","filter","pureKey","charAt","getDataAttribute","Config","Default","DefaultType","Error","_getConfig","config","_mergeConfigObj","_configAfterMerge","_typeCheckConfig","jsonConfig","constructor","configTypes","property","expectedTypes","valueType","prototype","RegExp","test","TypeError","toUpperCase","BaseComponent","super","_element","_config","DATA_KEY","dispose","EVENT_KEY","propertyName","getOwnPropertyNames","_queueCallback","isAnimated","getInstance","getOrCreateInstance","VERSION","eventName","getSelector","hrefAttribute","trim","SelectorEngine","concat","Element","findOne","children","child","matches","parents","ancestor","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","map","join","el","getSelectorFromElement","getElementFromSelector","getMultipleElementsFromSelector","enableDismissTrigger","component","method","clickEvent","tagName","EVENT_CLOSE","EVENT_CLOSED","Alert","close","_destroyElement","each","data","undefined","SELECTOR_DATA_TOGGLE","Button","toggle","button","EVENT_TOUCHSTART","EVENT_TOUCHMOVE","EVENT_TOUCHEND","EVENT_POINTERDOWN","EVENT_POINTERUP","endCallback","leftCallback","rightCallback","Swipe","isSupported","_deltaX","_supportPointerEvents","PointerEvent","_initEvents","_start","_eventIsPointerPenTouch","clientX","touches","_end","_handleSwipe","_move","absDeltaX","abs","direction","add","pointerType","navigator","maxTouchPoints","DATA_API_KEY","ORDER_NEXT","ORDER_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","EVENT_SLIDE","EVENT_SLID","EVENT_KEYDOWN","EVENT_MOUSEENTER","EVENT_MOUSELEAVE","EVENT_DRAG_START","EVENT_LOAD_DATA_API","EVENT_CLICK_DATA_API","CLASS_NAME_CAROUSEL","CLASS_NAME_ACTIVE","SELECTOR_ACTIVE","SELECTOR_ITEM","SELECTOR_ACTIVE_ITEM","KEY_TO_DIRECTION","ArrowLeft","ArrowRight","interval","keyboard","pause","ride","touch","wrap","Carousel","_interval","_activeElement","_isSliding","touchTimeout","_swipeHelper","_indicatorsElement","_addEventListeners","cycle","_slide","nextWhenVisible","hidden","_clearInterval","_updateInterval","setInterval","_maybeEnableCycle","to","items","_getItems","activeIndex","_getItemIndex","_getActive","order","defaultInterval","_keydown","_addTouchEventListeners","img","swipeConfig","_directionToOrder","endCallBack","clearTimeout","_setActiveIndicatorElement","activeIndicator","newActiveIndicator","elementInterval","parseInt","isNext","nextElement","nextElementIndex","triggerEvent","_orderToDirection","isCycling","directionalClassName","orderClassName","completeCallBack","_isAnimated","clearInterval","carousel","slideIndex","carousels","EVENT_SHOW","EVENT_SHOWN","EVENT_HIDE","EVENT_HIDDEN","CLASS_NAME_SHOW","CLASS_NAME_COLLAPSE","CLASS_NAME_COLLAPSING","CLASS_NAME_DEEPER_CHILDREN","parent","Collapse","_isTransitioning","_triggerArray","toggleList","elem","filterElement","foundElement","_initializeChildren","_addAriaAndCollapsedClass","_isShown","hide","show","activeChildren","_getFirstLevelChildren","activeInstance","dimension","_getDimension","style","scrollSize","complete","getBoundingClientRect","selected","triggerArray","isOpen","top","bottom","right","left","auto","basePlacements","start","end","clippingParents","viewport","popper","reference","variationPlacements","reduce","acc","placement","placements","beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite","modifierPhases","getNodeName","nodeName","getWindow","node","ownerDocument","defaultView","isHTMLElement","HTMLElement","isShadowRoot","applyStyles$1","enabled","phase","_ref","state","elements","forEach","styles","assign","effect","_ref2","initialStyles","position","options","strategy","margin","arrow","hasOwnProperty","attribute","requires","getBasePlacement","round","getUAString","uaData","userAgentData","brands","isArray","item","brand","version","userAgent","isLayoutViewport","includeScale","isFixedStrategy","clientRect","scaleX","scaleY","offsetWidth","width","height","visualViewport","addVisualOffsets","x","offsetLeft","y","offsetTop","getLayoutRect","rootNode","isSameNode","host","isTableElement","getDocumentElement","getParentNode","assignedSlot","getTrueOffsetParent","offsetParent","getOffsetParent","isFirefox","currentNode","css","transform","perspective","contain","willChange","getContainingBlock","getMainAxisFromPlacement","within","mathMax","mathMin","mergePaddingObject","paddingObject","expandToHashMap","hashMap","arrow$1","_state$modifiersData$","arrowElement","popperOffsets","modifiersData","basePlacement","axis","len","padding","rects","toPaddingObject","arrowRect","minProp","maxProp","endDiff","startDiff","arrowOffsetParent","clientSize","clientHeight","clientWidth","centerToReference","center","offset","axisProp","centerOffset","_options$element","requiresIfExists","getVariation","unsetSides","mapToStyles","_Object$assign2","popperRect","variation","offsets","gpuAcceleration","adaptive","roundOffsets","isFixed","_offsets$x","_offsets$y","_ref3","hasX","hasY","sideX","sideY","win","heightProp","widthProp","_Object$assign","commonStyles","_ref4","dpr","devicePixelRatio","roundOffsetsByDPR","computeStyles$1","_ref5","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","passive","eventListeners","_options$scroll","scroll","_options$resize","resize","scrollParents","scrollParent","update","hash","getOppositePlacement","matched","getOppositeVariationPlacement","getWindowScroll","scrollLeft","pageXOffset","scrollTop","pageYOffset","getWindowScrollBarX","isScrollParent","_getComputedStyle","overflow","overflowX","overflowY","getScrollParent","listScrollParents","_element$ownerDocumen","isBody","updatedList","rectToClientRect","rect","getClientRectFromMixedType","clippingParent","html","layoutViewport","getViewportRect","clientTop","clientLeft","getInnerBoundingClientRect","winScroll","scrollWidth","scrollHeight","getDocumentRect","computeOffsets","commonX","commonY","mainAxis","detectOverflow","_options","_options$placement","_options$strategy","_options$boundary","boundary","_options$rootBoundary","rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","altContext","clippingClientRect","mainClippingParents","clipperElement","getClippingParents","firstClippingParent","clippingRect","accRect","getClippingRect","contextElement","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","multiply","computeAutoPlacement","flipVariations","_options$allowedAutoP","allowedAutoPlacements","allPlacements","allowedPlacements","overflows","sort","a","b","flip$1","_skip","_options$mainAxis","checkMainAxis","_options$altAxis","altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","_options$flipVariatio","preferredPlacement","oppositePlacement","getExpandedFallbackPlacements","referenceRect","checksMap","makeFallbackChecks","firstFittingPlacement","i","_basePlacement","isStartVariation","isVertical","mainVariationSide","altVariationSide","checks","every","check","_loop","_i","fittingPlacement","reset","getSideOffsets","preventedOffsets","isAnySideFullyClipped","some","side","hide$1","preventOverflow","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","offset$1","_options$offset","invertDistance","skidding","distance","distanceAndSkiddingToXY","_data$state$placement","popperOffsets$1","preventOverflow$1","_options$tether","tether","_options$tetherOffset","tetherOffset","isBasePlacement","tetherOffsetValue","normalizedTetherOffsetValue","offsetModifierState","_offsetModifierState$","mainSide","altSide","additive","minLen","maxLen","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","clientOffset","offsetModifierValue","tetherMax","preventedOffset","_offsetModifierState$2","_mainSide","_altSide","_offset","_len","_min","_max","isOriginSide","_offsetModifierValue","_tetherMin","_tetherMax","_preventedOffset","v","withinMaxClamp","getCompositeRect","elementOrVirtualElement","isOffsetParentAnElement","offsetParentIsScaled","isElementScaled","modifiers","visited","result","modifier","dep","depModifier","DEFAULT_OPTIONS","areValidElements","arguments","_key","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","pending","orderedModifiers","effectCleanupFns","isDestroyed","setOptions","setOptionsAction","cleanupModifierEffects","merged","orderModifiers","current","existing","m","_ref$options","cleanupFn","forceUpdate","_state$elements","_state$orderedModifie","_state$orderedModifie2","Promise","resolve","then","destroy","onFirstUpdate","createPopper","computeStyles","applyStyles","flip","ARROW_UP_KEY","ARROW_DOWN_KEY","EVENT_KEYDOWN_DATA_API","EVENT_KEYUP_DATA_API","SELECTOR_DATA_TOGGLE_SHOWN","SELECTOR_MENU","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","autoClose","display","popperConfig","Dropdown","_popper","_parent","_menu","_inNavbar","_detectNavbar","_createPopper","focus","_completeHide","Popper","referenceElement","_getPopperConfig","_getPlacement","parentDropdown","isEnd","_getOffset","popperData","defaultBsPopperConfig","_selectMenuItem","clearMenus","openToggles","context","composedPath","isMenuTarget","dataApiKeydownHandler","isInput","isEscapeEvent","isUpOrDownEvent","getToggleButton","stopPropagation","EVENT_MOUSEDOWN","className","clickCallback","rootElement","Backdrop","_isAppended","_append","_getElement","_emulateAnimation","backdrop","createElement","append","EVENT_FOCUSIN","EVENT_KEYDOWN_TAB","TAB_NAV_BACKWARD","autofocus","trapElement","FocusTrap","_isActive","_lastTabNavDirection","activate","_handleFocusin","_handleKeydown","deactivate","shiftKey","SELECTOR_FIXED_CONTENT","SELECTOR_STICKY_CONTENT","PROPERTY_PADDING","PROPERTY_MARGIN","ScrollBarHelper","getWidth","documentWidth","innerWidth","_disableOverFlow","_setElementAttributes","calculatedValue","_resetElementAttributes","isOverflowing","_saveInitialAttribute","styleProperty","scrollbarWidth","_applyManipulationCallback","setProperty","actualValue","removeProperty","callBack","sel","EVENT_HIDE_PREVENTED","EVENT_RESIZE","EVENT_CLICK_DISMISS","EVENT_MOUSEDOWN_DISMISS","EVENT_KEYDOWN_DISMISS","CLASS_NAME_OPEN","CLASS_NAME_STATIC","Modal","_dialog","_backdrop","_initializeBackDrop","_focustrap","_initializeFocusTrap","_scrollBar","_adjustDialog","_showElement","_hideModal","handleUpdate","modalBody","transitionComplete","_triggerBackdropTransition","event2","_resetAdjustments","isModalOverflowing","initialOverflowY","isBodyOverflowing","paddingLeft","paddingRight","showEvent","alreadyOpen","CLASS_NAME_SHOWING","CLASS_NAME_HIDING","OPEN_SELECTOR","Offcanvas","blur","completeCallback","DefaultAllowlist","area","br","col","code","div","em","hr","h1","h2","h3","h4","h5","h6","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","uriAttributes","SAFE_URL_PATTERN","allowedAttribute","allowedAttributeList","attributeName","nodeValue","attributeRegex","regex","allowList","content","extraClass","sanitize","sanitizeFn","template","DefaultContentType","entry","TemplateFactory","getContent","_resolvePossibleFunction","hasContent","changeContent","_checkContent","toHtml","templateWrapper","innerHTML","_maybeSanitize","text","_setContent","arg","templateElement","_putElementInTemplate","textContent","unsafeHtml","sanitizeFunction","createdDocument","DOMParser","parseFromString","elementName","attributeList","allowedAttributes","sanitizeHtml","DISALLOWED_ATTRIBUTES","CLASS_NAME_FADE","SELECTOR_MODAL","EVENT_MODAL_HIDE","TRIGGER_HOVER","TRIGGER_FOCUS","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","animation","container","customClass","delay","title","Tooltip","_isEnabled","_timeout","_isHovered","_activeTrigger","_templateFactory","_newContent","tip","_setListeners","_fixTitle","enable","disable","toggleEnabled","click","_leave","_enter","_hideModalHandler","_disposePopper","_isWithContent","isInTheDom","_getTipElement","_isWithActiveTrigger","_getTitle","_createTipElement","_getContentForTemplate","_getTemplateFactory","tipId","prefix","floor","random","getElementById","getUID","setContent","_initializeOnDelegatedTarget","_getDelegateConfig","attachment","triggers","eventIn","eventOut","_setTimeout","timeout","dataAttributes","dataAttribute","Popover","_getContent","EVENT_ACTIVATE","EVENT_CLICK","SELECTOR_TARGET_LINKS","SELECTOR_NAV_LINKS","SELECTOR_LINK_ITEMS","rootMargin","smoothScroll","threshold","ScrollSpy","_targetLinks","_observableSections","_rootElement","_activeTarget","_observer","_previousScrollData","visibleEntryTop","parentScrollTop","refresh","_initializeTargetsAndObservables","_maybeEnableSmoothScroll","disconnect","_getNewObserver","section","observe","observableSection","scrollTo","behavior","IntersectionObserver","_observerCallback","targetElement","_process","userScrollsDown","isIntersecting","_clearActiveClass","entryIsLowerThanPrevious","targetLinks","anchor","decodeURI","_activateParents","listGroup","activeNodes","spy","ARROW_LEFT_KEY","ARROW_RIGHT_KEY","HOME_KEY","END_KEY","NOT_SELECTOR_DROPDOWN_TOGGLE","SELECTOR_INNER_ELEM","SELECTOR_DATA_TOGGLE_ACTIVE","Tab","_setInitialAttributes","_getChildren","innerElem","_elemIsActive","active","_getActiveElem","hideEvent","_deactivate","_activate","relatedElem","_toggleDropDown","nextActiveElement","preventScroll","_setAttributeIfNotExists","_setInitialAttributesOnChild","_getInnerElement","isActive","outerElem","_getOuterElement","_setInitialAttributesOnTargetPanel","open","EVENT_MOUSEOVER","EVENT_MOUSEOUT","EVENT_FOCUSOUT","CLASS_NAME_HIDE","autohide","Toast","_hasMouseInteraction","_hasKeyboardInteraction","_clearTimeout","_maybeScheduleHide","isShown","_onInteraction","isInteracting"],"sources":["../../js/src/dom/data.js","../../js/src/util/index.js","../../js/src/dom/event-handler.js","../../js/src/dom/manipulator.js","../../js/src/util/config.js","../../js/src/base-component.js","../../js/src/dom/selector-engine.js","../../js/src/util/component-functions.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/util/swipe.js","../../js/src/carousel.js","../../js/src/collapse.js","../../node_modules/@popperjs/core/lib/enums.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindow.js","../../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","../../node_modules/@popperjs/core/lib/modifiers/applyStyles.js","../../node_modules/@popperjs/core/lib/utils/getBasePlacement.js","../../node_modules/@popperjs/core/lib/utils/math.js","../../node_modules/@popperjs/core/lib/utils/userAgent.js","../../node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","../../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","../../node_modules/@popperjs/core/lib/dom-utils/contains.js","../../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","../../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","../../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","../../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","../../node_modules/@popperjs/core/lib/utils/within.js","../../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","../../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","../../node_modules/@popperjs/core/lib/utils/expandToHashMap.js","../../node_modules/@popperjs/core/lib/modifiers/arrow.js","../../node_modules/@popperjs/core/lib/utils/getVariation.js","../../node_modules/@popperjs/core/lib/modifiers/computeStyles.js","../../node_modules/@popperjs/core/lib/modifiers/eventListeners.js","../../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","../../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","../../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","../../node_modules/@popperjs/core/lib/utils/rectToClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","../../node_modules/@popperjs/core/lib/utils/computeOffsets.js","../../node_modules/@popperjs/core/lib/utils/detectOverflow.js","../../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","../../node_modules/@popperjs/core/lib/modifiers/flip.js","../../node_modules/@popperjs/core/lib/modifiers/hide.js","../../node_modules/@popperjs/core/lib/modifiers/offset.js","../../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","../../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","../../node_modules/@popperjs/core/lib/utils/getAltAxis.js","../../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","../../node_modules/@popperjs/core/lib/utils/orderModifiers.js","../../node_modules/@popperjs/core/lib/createPopper.js","../../node_modules/@popperjs/core/lib/utils/debounce.js","../../node_modules/@popperjs/core/lib/utils/mergeByName.js","../../node_modules/@popperjs/core/lib/popper-lite.js","../../node_modules/@popperjs/core/lib/popper.js","../../js/src/dropdown.js","../../js/src/util/backdrop.js","../../js/src/util/focustrap.js","../../js/src/util/scrollbar.js","../../js/src/modal.js","../../js/src/offcanvas.js","../../js/src/util/sanitizer.js","../../js/src/util/template-factory.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/index.umd.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1_000_000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`)\n }\n\n return selector\n}\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`\n }\n\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false\n }\n\n if (typeof object.jquery !== 'undefined') {\n object = object[0]\n }\n\n return typeof object.nodeType !== 'undefined'\n}\n\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object\n }\n\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object))\n }\n\n return null\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])')\n\n if (!closedDetails) {\n return elementIsVisible\n }\n\n if (closedDetails !== element) {\n const summary = element.closest('summary')\n if (summary && summary.parentNode !== closedDetails) {\n return false\n }\n\n if (summary === null) {\n return false\n }\n }\n\n return elementIsVisible\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight // eslint-disable-line no-unused-expressions\n}\n\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback()\n }\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]\n }\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n defineJQueryPlugin,\n execute,\n executeAfterTransition,\n findShadowRoot,\n getElement,\n getjQuery,\n getNextActiveElement,\n getTransitionDurationFromElement,\n getUID,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop,\n onDOMContentLoaded,\n parseSelector,\n reflow,\n triggerTransitionEnd,\n toType\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index.js'\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\n\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getElementEvents(element) {\n const uid = makeEventUid(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, { delegateTarget: element })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue\n }\n\n hydrateObj(event, { delegateTarget: target })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n}\n\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events)\n .find(event => event.callable === callable && event.delegationSelector === delegationSelector)\n}\n\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string'\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : (handler || delegationFunction)\n let typeEvent = getTypeEvent(originalTypeEvent)\n\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent\n }\n\n return [isDelegated, callable, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n return fn.call(this, event)\n }\n }\n }\n\n callable = wrapFunction(callable)\n }\n\n const events = getElementEvents(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null)\n\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff\n\n return\n }\n\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = isDelegated ?\n bootstrapDelegationHandler(element, handler, callable) :\n bootstrapHandler(element, callable)\n\n fn.delegationSelector = isDelegated ? handler : null\n fn.callable = callable\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, isDelegated)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '')\n return customEvents[event] || event\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false)\n },\n\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getElementEvents(element)\n const storeElementEvent = events[typeEvent] || {}\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return\n }\n\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null)\n return\n }\n\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n }\n }\n\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = getTypeEvent(event)\n const inNamespace = event !== typeEvent\n\n let jQueryEvent = null\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n const evt = hydrateObj(new Event(event, { bubbles, cancelable: true }), args)\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value\n } catch {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value\n }\n })\n }\n }\n\n return obj\n}\n\nexport default EventHandler\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true\n }\n\n if (value === 'false') {\n return false\n }\n\n if (value === Number(value).toString()) {\n return Number(value)\n }\n\n if (value === '' || value === 'null') {\n return null\n }\n\n if (typeof value !== 'string') {\n return value\n }\n\n try {\n return JSON.parse(decodeURIComponent(value))\n } catch {\n return value\n }\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'))\n\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)\n attributes[pureKey] = normalizeData(element.dataset[key])\n }\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n }\n}\n\nexport default Manipulator\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport { isElement, toType } from './index.js'\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {}\n }\n\n static get DefaultType() {\n return {}\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n return config\n }\n\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {} // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n }\n }\n\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property]\n const valueType = isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n }\n }\n}\n\nexport default Config\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data.js'\nimport EventHandler from './dom/event-handler.js'\nimport Config from './util/config.js'\nimport { executeAfterTransition, getElement } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.1'\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super()\n\n element = getElement(element)\n if (!element) {\n return\n }\n\n this._element = element\n this._config = this._getConfig(config)\n\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null\n }\n }\n\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`\n }\n}\n\nexport default BaseComponent\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible, parseSelector } from '../util/index.js'\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`\n }\n\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null\n }\n\n return parseSelector(selector)\n}\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n let ancestor = element.parentNode.closest(selector)\n\n while (ancestor) {\n parents.push(ancestor)\n ancestor = ancestor.parentNode.closest(selector)\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n },\n\n focusableChildren(element) {\n const focusables = [\n 'a',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'details',\n '[tabindex]',\n '[contenteditable=\"true\"]'\n ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',')\n\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n },\n\n getSelectorFromElement(element) {\n const selector = getSelector(element)\n\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null\n }\n\n return null\n },\n\n getElementFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.findOne(selector) : null\n },\n\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.find(selector) : []\n }\n}\n\nexport default SelectorEngine\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isDisabled } from './index.js'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport { execute } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'swipe'\nconst EVENT_KEY = '.bs.swipe'\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n}\n\nconst DefaultType = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n}\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super()\n this._element = element\n\n if (!element || !Swipe.isSupported()) {\n return\n }\n\n this._config = this._getConfig(config)\n this._deltaX = 0\n this._supportPointerEvents = Boolean(window.PointerEvent)\n this._initEvents()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY)\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX\n\n return\n }\n\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX\n }\n }\n\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX\n }\n\n this._handleSwipe()\n execute(this._config.endCallback)\n }\n\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ?\n 0 :\n event.touches[0].clientX - this._deltaX\n }\n\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX)\n\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltaX / this._deltaX\n\n this._deltaX = 0\n\n if (!direction) {\n return\n }\n\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback)\n }\n\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event))\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event))\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event))\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event))\n }\n }\n\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n }\n}\n\nexport default Swipe\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getNextActiveElement,\n isRTL,\n isVisible,\n reflow,\n triggerTransitionEnd\n} from './util/index.js'\nimport Swipe from './util/swipe.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)', // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._interval = null\n this._activeElement = null\n this._isSliding = false\n this.touchTimeout = null\n this._swipeHelper = null\n\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n this._addEventListeners()\n\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT)\n }\n\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next()\n }\n }\n\n prev() {\n this._slide(ORDER_PREV)\n }\n\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element)\n }\n\n this._clearInterval()\n }\n\n cycle() {\n this._clearInterval()\n this._updateInterval()\n\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval)\n }\n\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle())\n return\n }\n\n this.cycle()\n }\n\n to(index) {\n const items = this._getItems()\n if (index > items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n return\n }\n\n const activeIndex = this._getItemIndex(this._getActive())\n if (activeIndex === index) {\n return\n }\n\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV\n\n this._slide(order, items[index])\n }\n\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose()\n }\n\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval\n return config\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER, () => this.pause())\n EventHandler.on(this._element, EVENT_MOUSELEAVE, () => this._maybeEnableCycle())\n }\n\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault())\n }\n\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n }\n\n this._swipeHelper = new Swipe(this._element, swipeConfig)\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n const direction = KEY_TO_DIRECTION[event.key]\n if (direction) {\n event.preventDefault()\n this._slide(this._directionToOrder(direction))\n }\n }\n\n _getItemIndex(element) {\n return this._getItems().indexOf(element)\n }\n\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return\n }\n\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n activeIndicator.removeAttribute('aria-current')\n\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement)\n\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE)\n newActiveIndicator.setAttribute('aria-current', 'true')\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || this._getActive()\n\n if (!element) {\n return\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n this._config.interval = elementInterval || this._config.defaultInterval\n }\n\n _slide(order, element = null) {\n if (this._isSliding) {\n return\n }\n\n const activeElement = this._getActive()\n const isNext = order === ORDER_NEXT\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap)\n\n if (nextElement === activeElement) {\n return\n }\n\n const nextElementIndex = this._getItemIndex(nextElement)\n\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n })\n }\n\n const slideEvent = triggerEvent(EVENT_SLIDE)\n\n if (slideEvent.defaultPrevented) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return\n }\n\n const isCycling = Boolean(this._interval)\n this.pause()\n\n this._isSliding = true\n\n this._setActiveIndicatorElement(nextElementIndex)\n this._activeElement = nextElement\n\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n\n nextElement.classList.add(orderClassName)\n\n reflow(nextElement)\n\n activeElement.classList.add(directionalClassName)\n nextElement.classList.add(directionalClassName)\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n this._isSliding = false\n\n triggerEvent(EVENT_SLID)\n }\n\n this._queueCallback(completeCallBack, activeElement, this._isAnimated())\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE)\n }\n\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n }\n\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element)\n }\n\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n }\n\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n }\n\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config)\n\n if (typeof config === 'number') {\n data.to(config)\n return\n }\n\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n event.preventDefault()\n\n const carousel = Carousel.getOrCreateInstance(target)\n const slideIndex = this.getAttribute('data-bs-slide-to')\n\n if (slideIndex) {\n carousel.to(slideIndex)\n carousel._maybeEnableCycle()\n return\n }\n\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next()\n carousel._maybeEnableCycle()\n return\n }\n\n carousel.prev()\n carousel._maybeEnableCycle()\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getElement,\n reflow\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\nconst Default = {\n parent: null,\n toggle: true\n}\n\nconst DefaultType = {\n parent: '(null|element)',\n toggle: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isTransitioning = false\n this._triggerArray = []\n\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem)\n const filterElement = SelectorEngine.find(selector)\n .filter(foundElement => foundElement === this._element)\n\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem)\n }\n }\n\n this._initializeChildren()\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning || this._isShown()) {\n return\n }\n\n let activeChildren = []\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES)\n .filter(element => element !== this._element)\n .map(element => Collapse.getOrCreateInstance(element, { toggle: false }))\n }\n\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n if (startEvent.defaultPrevented) {\n return\n }\n\n for (const activeInstance of activeChildren) {\n activeInstance.hide()\n }\n\n const dimension = this._getDimension()\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE)\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n this._addAriaAndCollapsedClass(this._triggerArray, true)\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n this._element.style[dimension] = ''\n\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n\n this._queueCallback(complete, this._element, true)\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n if (startEvent.defaultPrevented) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger)\n\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false)\n }\n }\n\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n\n this._queueCallback(complete, this._element, true)\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle) // Coerce string values\n config.parent = getElement(config.parent)\n return config\n }\n\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT\n }\n\n _initializeChildren() {\n if (!this._config.parent) {\n return\n }\n\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE)\n\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element)\n\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected))\n }\n }\n }\n\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element))\n }\n\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return\n }\n\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen)\n element.setAttribute('aria-expanded', isOpen)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {}\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for
elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n event.preventDefault()\n }\n\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, { toggle: false }).toggle()\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n execute,\n getElement,\n getNextActiveElement,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center'\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)'\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR = '.navbar'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\nconst PLACEMENT_TOPCENTER = 'top'\nconst PLACEMENT_BOTTOMCENTER = 'bottom'\n\nconst Default = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n}\n\nconst DefaultType = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n}\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._popper = null\n this._parent = this._element.parentNode // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.prev(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.findOne(SELECTOR_MENU, this._parent)\n this._inNavbar = this._detectNavbar()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show()\n }\n\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._createPopper()\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n this._menu.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n }\n\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n this._completeHide(relatedTarget)\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._element.setAttribute('aria-expanded', 'false')\n Manipulator.removeDataAttribute(this._menu, 'popper')\n EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n }\n\n _getConfig(config) {\n config = super._getConfig(config)\n\n if (typeof config.reference === 'object' && !isElement(config.reference) &&\n typeof config.reference.getBoundingClientRect !== 'function'\n ) {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n }\n\n return config\n }\n\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = this._parent\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference)\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference\n }\n\n const popperConfig = this._getPopperConfig()\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n }\n\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW)\n }\n\n _getPlacement() {\n const parentDropdown = this._parent\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n }\n\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static') // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n }\n }\n\n _selectMenuItem({ key, target }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element))\n\n if (!items.length) {\n return\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY)) {\n return\n }\n\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN)\n\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle)\n if (!context || context._config.autoClose === false) {\n continue\n }\n\n const composedPath = event.composedPath()\n const isMenuTarget = composedPath.includes(context._menu)\n if (\n composedPath.includes(context._element) ||\n (context._config.autoClose === 'inside' && !isMenuTarget) ||\n (context._config.autoClose === 'outside' && isMenuTarget)\n ) {\n continue\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue\n }\n\n const relatedTarget = { relatedTarget: context._element }\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n context._completeHide(relatedTarget)\n }\n }\n\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName)\n const isEscapeEvent = event.key === ESCAPE_KEY\n const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)\n\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return\n }\n\n if (isInput && !isEscapeEvent) {\n return\n }\n\n event.preventDefault()\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ?\n this :\n (SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode))\n\n const instance = Dropdown.getOrCreateInstance(getToggleButton)\n\n if (isUpOrDownEvent) {\n event.stopPropagation()\n instance.show()\n instance._selectMenuItem(event)\n return\n }\n\n if (instance._isShown()) { // else is escape and we check if it is shown\n event.stopPropagation()\n instance.hide()\n getToggleButton.focus()\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n Dropdown.getOrCreateInstance(this).toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport { execute, executeAfterTransition, getElement, reflow } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nconst Default = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n}\n\nconst DefaultType = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n}\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isAppended = false\n this._element = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._append()\n\n const element = this._getElement()\n if (this._config.isAnimated) {\n reflow(element)\n }\n\n element.classList.add(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n execute(callback)\n })\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n this.dispose()\n execute(callback)\n })\n }\n\n dispose() {\n if (!this._isAppended) {\n return\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n this._element.remove()\n this._isAppended = false\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div')\n backdrop.className = this._config.className\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE)\n }\n\n this._element = backdrop\n }\n\n return this._element\n }\n\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement)\n return config\n }\n\n _append() {\n if (this._isAppended) {\n return\n }\n\n const element = this._getElement()\n this._config.rootElement.append(element)\n\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback)\n })\n\n this._isAppended = true\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n }\n}\n\nexport default Backdrop\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nconst Default = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n}\n\nconst DefaultType = {\n autofocus: 'boolean',\n trapElement: 'element'\n}\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isActive = false\n this._lastTabNavDirection = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return\n }\n\n if (this._config.autofocus) {\n this._config.trapElement.focus()\n }\n\n EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n this._isActive = true\n }\n\n deactivate() {\n if (!this._isActive) {\n return\n }\n\n this._isActive = false\n EventHandler.off(document, EVENT_KEY)\n }\n\n // Private\n _handleFocusin(event) {\n const { trapElement } = this._config\n\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement)\n\n if (elements.length === 0) {\n trapElement.focus()\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus()\n } else {\n elements[0].focus()\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n }\n}\n\nexport default FocusTrap\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\nconst PROPERTY_PADDING = 'padding-right'\nconst PROPERTY_MARGIN = 'margin-right'\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth\n return Math.abs(window.innerWidth - documentWidth)\n }\n\n hide() {\n const width = this.getWidth()\n this._disableOverFlow()\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width)\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow')\n this._resetElementAttributes(this._element, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN)\n }\n\n isOverflowing() {\n return this.getWidth() > 0\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow')\n this._element.style.overflow = 'hidden'\n }\n\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth()\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return\n }\n\n this._saveInitialAttribute(element, styleProperty)\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty)\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty)\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue)\n }\n }\n\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty)\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty)\n return\n }\n\n Manipulator.removeDataAttribute(element, styleProperty)\n element.style.setProperty(styleProperty, value)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector)\n return\n }\n\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel)\n }\n }\n}\n\nexport default ScrollBarHelper\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport { defineJQueryPlugin, isRTL, isVisible, reflow } from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst OPEN_SELECTOR = '.modal.show'\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\n\nconst Default = {\n backdrop: true,\n focus: true,\n keyboard: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._isShown = false\n this._isTransitioning = false\n this._scrollBar = new ScrollBarHelper()\n\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._isTransitioning = true\n\n this._scrollBar.hide()\n\n document.body.classList.add(CLASS_NAME_OPEN)\n\n this._adjustDialog()\n\n this._backdrop.show(() => this._showElement(relatedTarget))\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n this._isTransitioning = true\n this._focustrap.deactivate()\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated())\n }\n\n dispose() {\n EventHandler.off(window, EVENT_KEY)\n EventHandler.off(this._dialog, EVENT_KEY)\n\n this._backdrop.dispose()\n this._focustrap.deactivate()\n\n super.dispose()\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.scrollTop = 0\n\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n if (modalBody) {\n modalBody.scrollTop = 0\n }\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate()\n }\n\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n })\n }\n\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated())\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n this._triggerBackdropTransition()\n })\n\n EventHandler.on(window, EVENT_RESIZE, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog()\n }\n })\n\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return\n }\n\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition()\n return\n }\n\n if (this._config.backdrop) {\n this.hide()\n }\n })\n })\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._scrollBar.reset()\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n })\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE)\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const initialOverflowY = this._element.style.overflowY\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return\n }\n\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden'\n }\n\n this._element.classList.add(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY\n }, this._dialog)\n }, this._dialog)\n\n this._element.focus()\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const scrollbarWidth = this._scrollBar.getWidth()\n const isBodyOverflowing = scrollbarWidth > 0\n\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide()\n }\n\n const data = Modal.getOrCreateInstance(target)\n\n data.toggle(this)\n})\n\nenableDismissTrigger(Modal)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin,\n isDisabled,\n isVisible\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\nconst CLASS_NAME_HIDING = 'hiding'\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n scroll: false\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isShown = false\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._backdrop.show()\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide()\n }\n\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.classList.add(CLASS_NAME_SHOWING)\n\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate()\n }\n\n this._element.classList.add(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n }\n\n this._queueCallback(completeCallBack, this._element, true)\n }\n\n hide() {\n if (!this._isShown) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._focustrap.deactivate()\n this._element.blur()\n this._isShown = false\n this._element.classList.add(CLASS_NAME_HIDING)\n this._backdrop.hide()\n\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW, CLASS_NAME_HIDING)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset()\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._queueCallback(completeCallback, this._element, true)\n }\n\n dispose() {\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n return\n }\n\n this.hide()\n }\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop)\n\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n })\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus()\n }\n })\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide()\n }\n\n const data = Offcanvas.getOrCreateInstance(target)\n data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show()\n }\n})\n\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide()\n }\n }\n})\n\nenableDismissTrigger(Offcanvas)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n// js-docs-end allow-list\n\nconst uriAttributes = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\n// eslint-disable-next-line unicorn/better-regex\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue))\n }\n\n return true\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)\n .some(regex => regex.test(attributeName))\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase()\n\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove()\n continue\n }\n\n const attributeList = [].concat(...element.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])\n\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName)\n }\n }\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\nimport { DefaultAllowlist, sanitizeHtml } from './sanitizer.js'\nimport { execute, getElement, isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'TemplateFactory'\n\nconst Default = {\n allowList: DefaultAllowlist,\n content: {}, // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '
'\n}\n\nconst DefaultType = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n}\n\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n}\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content)\n .map(config => this._resolvePossibleFunction(config))\n .filter(Boolean)\n }\n\n hasContent() {\n return this.getContent().length > 0\n }\n\n changeContent(content) {\n this._checkContent(content)\n this._config.content = { ...this._config.content, ...content }\n return this\n }\n\n toHtml() {\n const templateWrapper = document.createElement('div')\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template)\n\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector)\n }\n\n const template = templateWrapper.children[0]\n const extraClass = this._resolvePossibleFunction(this._config.extraClass)\n\n if (extraClass) {\n template.classList.add(...extraClass.split(' '))\n }\n\n return template\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config)\n this._checkContent(config.content)\n }\n\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({ selector, entry: content }, DefaultContentType)\n }\n }\n\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template)\n\n if (!templateElement) {\n return\n }\n\n content = this._resolvePossibleFunction(content)\n\n if (!content) {\n templateElement.remove()\n return\n }\n\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement)\n return\n }\n\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content)\n return\n }\n\n templateElement.textContent = content\n }\n\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this])\n }\n\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = ''\n templateElement.append(element)\n return\n }\n\n templateElement.textContent = element.textContent\n }\n}\n\nexport default TemplateFactory\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport { defineJQueryPlugin, execute, findShadowRoot, getElement, getUID, isRTL, noop } from './util/index.js'\nimport { DefaultAllowlist } from './util/sanitizer.js'\nimport TemplateFactory from './util/template-factory.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tooltip'\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`\n\nconst EVENT_MODAL_HIDE = 'hide.bs.modal'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\nconst EVENT_HIDE = 'hide'\nconst EVENT_HIDDEN = 'hidden'\nconst EVENT_SHOW = 'show'\nconst EVENT_SHOWN = 'shown'\nconst EVENT_INSERTED = 'inserted'\nconst EVENT_CLICK = 'click'\nconst EVENT_FOCUSIN = 'focusin'\nconst EVENT_FOCUSOUT = 'focusout'\nconst EVENT_MOUSEENTER = 'mouseenter'\nconst EVENT_MOUSELEAVE = 'mouseleave'\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '
' +\n '
' +\n '
' +\n '
',\n title: '',\n trigger: 'hover focus'\n}\n\nconst DefaultType = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n}\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)')\n }\n\n super(element, config)\n\n // Private\n this._isEnabled = true\n this._timeout = 0\n this._isHovered = null\n this._activeTrigger = {}\n this._popper = null\n this._templateFactory = null\n this._newContent = null\n\n // Protected\n this.tip = null\n\n this._setListeners()\n\n if (!this._config.selector) {\n this._fixTitle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle() {\n if (!this._isEnabled) {\n return\n }\n\n this._activeTrigger.click = !this._activeTrigger.click\n if (this._isShown()) {\n this._leave()\n return\n }\n\n this._enter()\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'))\n }\n\n this._disposePopper()\n super.dispose()\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n if (!(this._isWithContent() && this._isEnabled)) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW))\n const shadowRoot = findShadowRoot(this._element)\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element)\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper()\n\n const tip = this._getTipElement()\n\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'))\n\n const { container } = this._config\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip)\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED))\n }\n\n this._popper = this._createPopper(tip)\n\n tip.classList.add(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN))\n\n if (this._isHovered === false) {\n this._leave()\n }\n\n this._isHovered = false\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n hide() {\n if (!this._isShown()) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE))\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const tip = this._getTipElement()\n tip.classList.remove(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n this._isHovered = null // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n if (!this._isHovered) {\n this._disposePopper()\n }\n\n this._element.removeAttribute('aria-describedby')\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN))\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n update() {\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle())\n }\n\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate())\n }\n\n return this.tip\n }\n\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml()\n\n // TODO: remove this check in v6\n if (!tip) {\n return null\n }\n\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`)\n\n const tipId = getUID(this.constructor.NAME).toString()\n\n tip.setAttribute('id', tipId)\n\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE)\n }\n\n return tip\n }\n\n setContent(content) {\n this._newContent = content\n if (this._isShown()) {\n this._disposePopper()\n this.show()\n }\n }\n\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content)\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n })\n }\n\n return this._templateFactory\n }\n\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n }\n }\n\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title')\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())\n }\n\n _isAnimated() {\n return this._config.animation || (this.tip && this.tip.classList.contains(CLASS_NAME_FADE))\n }\n\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW)\n }\n\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element])\n const attachment = AttachmentMap[placement.toUpperCase()]\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element])\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [\n {\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n },\n {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n },\n {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement)\n }\n }\n ]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n }\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ')\n\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context.toggle()\n })\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSEENTER) :\n this.constructor.eventName(EVENT_FOCUSIN)\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSELEAVE) :\n this.constructor.eventName(EVENT_FOCUSOUT)\n\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true\n context._enter()\n })\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] =\n context._element.contains(event.relatedTarget)\n\n context._leave()\n })\n }\n }\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide()\n }\n }\n\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title')\n\n if (!title) {\n return\n }\n\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title)\n }\n\n this._element.setAttribute('data-bs-original-title', title) // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title')\n }\n\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true\n return\n }\n\n this._isHovered = true\n\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show()\n }\n }, this._config.delay.show)\n }\n\n _leave() {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n this._isHovered = false\n\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide()\n }\n }, this._config.delay.hide)\n }\n\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout)\n this._timeout = setTimeout(handler, timeout)\n }\n\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true)\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute]\n }\n }\n\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container)\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value\n }\n }\n\n config.selector = false\n config.trigger = 'manual'\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config\n }\n\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n\n if (this.tip) {\n this.tip.remove()\n this.tip = null\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Tooltip from './tooltip.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'popover'\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\nconst Default = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '
' +\n '
' +\n '

' +\n '
' +\n '
',\n trigger: 'click'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n}\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent()\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n }\n }\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content)\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport { defineJQueryPlugin, getElement, isDisabled, isVisible } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_TARGET_LINKS = '[href]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst Default = {\n offset: null, // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n}\n\nconst DefaultType = {\n offset: '(number|null)', // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n}\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map()\n this._observableSections = new Map()\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element\n this._activeTarget = null\n this._observer = null\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n }\n this.refresh() // initialize\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables()\n this._maybeEnableSmoothScroll()\n\n if (this._observer) {\n this._observer.disconnect()\n } else {\n this._observer = this._getNewObserver()\n }\n\n for (const section of this._observableSections.values()) {\n this._observer.observe(section)\n }\n }\n\n dispose() {\n this._observer.disconnect()\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin\n\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value))\n }\n\n return config\n }\n\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK)\n\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash)\n if (observableSection) {\n event.preventDefault()\n const root = this._rootElement || window\n const height = observableSection.offsetTop - this._element.offsetTop\n if (root.scrollTo) {\n root.scrollTo({ top: height, behavior: 'smooth' })\n return\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height\n }\n })\n }\n\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n }\n\n return new IntersectionObserver(entries => this._observerCallback(entries), options)\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`)\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop\n this._process(targetElement(entry))\n }\n\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop\n this._previousScrollData.parentScrollTop = parentScrollTop\n\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null\n this._clearActiveClass(targetElement(entry))\n\n continue\n }\n\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry)\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return\n }\n\n continue\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry)\n }\n }\n }\n\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map()\n this._observableSections = new Map()\n\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target)\n\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue\n }\n\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element)\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor)\n this._observableSections.set(anchor.hash, observableSection)\n }\n }\n }\n\n _process(target) {\n if (this._activeTarget === target) {\n return\n }\n\n this._clearActiveClass(this._config.target)\n this._activeTarget = target\n target.classList.add(CLASS_NAME_ACTIVE)\n this._activateParents(target)\n\n EventHandler.trigger(this._element, EVENT_ACTIVATE, { relatedTarget: target })\n }\n\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n return\n }\n\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both