We describe a new R package, paleofire, for analysis and synthesis of charcoal time series, such as those contained in the Global Charcoal Database (GCD), that are used to reconstruct paleofire activity (past biomass burning). paleofire is an initiative of the Global Paleofire Working Group core team (www.gpwg.org), whose aim is to encourage the use of sedimentary charcoal series to develop regional-to-global syntheses of paleofire activity, and to enhance access to the GCD data by providing a common research framework. Currently, paleofire features are organized into three different parts related to (i) site selection and charcoal series extraction from the GCD; (ii) charcoal data transformation; and (iii) charcoal series compositing and synthesis. We provide a technical description of paleofire and describe some new implementations such as the circular block bootstrap procedure. We tested the software using GCDv3 data from eastern North America, and provide examples of interpreting results of regional and global syntheses.

charcoal, fire, biomass burning, databases, R statistical language

Introduction

In the last decade, regional and global syntheses of sedimentary charcoal records have been used to examine broad-scale patterns in palaeofire activity (C. Carcaillet et al. 2002; M. Power et al. 2008; Daniau et al. 2012). The linkages among fire, climate, vegetation and humans at centennial-millennial timescales have likewise been examined using global and regional syntheses (J.R. Marlon et al. 2008; A. A. Ali et al. 2012). Syntheses of charcoal records can also aid the validation and calibration of fire simulations (Flannigan et al. 2001; Pechony and Shindell 2009; Girardin et al. 2013; Brücher et al. 2014). Because fire influences ecosystems at all spatio-temporal scales (ranging from days to centuries and from microsites to biomes), a growing interest in paleofire research has emerged. Additionally, future wildfire regimes may have no analogues from recent decades, and so identifying reference conditions and baselines in the past has become crucial to projecting future wildfire activity (Girardin et al. 2013). Sedimentary charcoal series from individual sites are distributed worldwide, and are increasingly included in the Global Charcoal Database (Power et al. 2010 GCD), which provides the scientific community a global charcoal dataset for research and archiving for sedimentary records of fire (the GCD is available at http://gpwg.org/gpwgdb.html). Syntheses of spatio-temporal changes in fire at global (J.R. Marlon et al. 2008; M. Power et al. 2008; Daniau et al. 2012; J. R. Marlon et al. 2013) and regional (Marlon et al. 2009; S. Mooney et al. 2011; B. Vannière et al. 2011; Power et al. 2013) scales were obtained by applying several analytical steps implemented by a set of Fortran programs (Bartlein, P. J. unpublished). Because these statistical methods are not easily usable or modifiable, the Global Paleofire Working Group core team has developed a package using the open-source R statistical programming language. The new package should increase accessibility to paleofire data while providing the fire-science community with new analytical tools that include and extend the previously used functions for GCD data extraction and statistical analysis.
The aim of this paper is to describe the paleofire R package that facilitates the analysis of charcoal records contained in the GCD. The paleofire package functions are organized into three parts: (i) GCD site selection and data extraction using a variety of criteria (geographic, sedimentary, etc.), (ii) charcoal data transformation, including re-scaling, single-record variance homogenization and nonparametric trend estimation and (iii) data synthesis, including confidence limit estimation using resampling procedures.

Global Charcoal Database to paleofire data synthesis

The paleofire package works in conjunction with the GCD R package that contains a simplified version of the charcoal dataset in order to accommodate the different update frequency between the paleofire package (frequent updates) and the Global Charcoal Database (infrequent updates). The checkGCDversion() function can be used to determine whether the GCD data package is current. If it is not, the function asks whether the user wants to update the data. The minimal package version numbers required for running the examples presented in this study are 1.1.3 and 3.0.3 for the paleofire and GCD packages respectively. Backward compatibility will be ensured from these versions.
As of , the GCD v3.0.3 contains a total of 736 charcoal records and is provided as a Microsoft Access database available at http://gpwg.org. The GCD data package is a simplified and reduced version of the GCD database. The package consists of two data frames containing site metadata and charcoal data. The two data frames combine several tables from the GCD in order to simplify analysis in R, and exclude chronology development information, such as radiocarbon dates; these will likely be added however in future releases. Although most analyses in paleofire may use data directly from the dataframes in the GCD package, it is also possible to analyze user-defined database extracts or other charcoal series not in the database using the pfAddData function. There is currently no mechanism for permanently adding data to the GCD package automatically; interested contributors should contact the GPWG instead. The site metadata is accessible by typing the data(paleofiresites) command at the R prompt. This data frame provides a unique identifier for each site in the id_site column and associated metadata such as chronological, sedimentary or geographical information.

The raw charcoal data are accessible with the data(paleofiredata) command. The data consist of a seven column data frame containing: (i) site unique identifier, (ii) sample depth, (iii) sample age, (iv) sample charcoal value, (v) sample charcoal unit, (vi) extraction method (sieved charcoal, pollen slide charcoals, etc.) and (vii) sample type unit (influx or concentration). The default setting for the R package is to select the preferred units (e.g., concentration or influx values are typically preferred over charcoal-to-pollen ratios if both are available) used in previous analysis (see Daniau et al. 2012 or; M. Power et al. 2008), however paleofire allows one to analyse charcoal records with user-defined units or methods (e.g. sieved vs pollen slide charcoals, see pfSiteSel and pfTransform functions help for details).

Technical description of paleofire

Here we provide a technical description and several illustrative examples of paleofire. The paleofire package is written in the R scientific computing language (R Development Core Team, 2011) and was developed under the R 3.0.3 version but remains compatible with R >=2.10.0. The functions in paleofire are arranged into three groups associated with data selection, charcoal series transformation, and synthesis. We used the S3 method scheme to implement generic plotting and summary functions.

To present some of the paleofire capabilities, the examples below use charcoal series from Eastern North America. For additional examples and a detailed overview of individual functions, the reader is referred to the online help available at http://cran.r-project.org/web/packages/paleofire/paleofire.pdf.

Site selection

Two functions are dedicated to site selection. The first one, pfInteractive requires users to interactively draw a polygon on a map to select sites with respect to their geographic location. The function returns a list object containing site names and identifiers that is further used in the following analysis steps and is called using pfInteractive().

library(paleofire)
Loading required package: GCD
This is paleofire v1.1.9 | GCD v3.0.5

The pfSiteSel function is more versatile than pfInteractive and has arguments for a variety of user-defined criteria. In the example below we select charcoal series between 30° and 90° latitude and -100° and -50° longitude, and include only those with at least one geochronological (14C or 210Pb dating, tephra layer, etc.) control point each 2500 year.

length(ID$id_site)
[1] 71

Seventy-one sites are selected and stored in the ID object of the class pfSiteSel. The summary function associated with the pfSiteSel object returns a table (Table SI1) containing site information, including geographic (latitude, longitude and elevation) and chronological descriptors (number of chronological control points, number of samples, minimum and maximum estimated ages). In the example below the summary function is applied to the ID object and the pfSiteSel function is used to select site records with at least 20 samples.

length(ID$id_site)
[1] 57

The 57 selected sites can be plotted on a map using the generic plot function ; a zoom level can be specified using the zoom argument. The use of this function is illustrated in the example below, which is used to construct Figure 1. The plot function may also be used to explore the sampling resolution of sites using the type=chronology argument.

Data transformation

Charcoal values contained in the GCD can vary widely among and within sites due to multiple factors. For instance, variations in (absolute) charcoal abundances can be related to different analytical methods (i.e. sediment treatment; Tinner and Hu 2003) as well as to unique physiographic site characteristics Jennifer Marlon, Bartlein, and Whitlock (2006). Variations in charcoal values may also be linked to differences in the types of records (pollen slide charcoals, sieved charcoals, charcoal/pollen ratios, Carcaillet et al. 2001). Lastly, differences in the original sample quantities (influx, concentration, percentage) could also contribute to variations in charcoal values. Consequently, transformation and standardization of different charcoal records is a highly recommended step in generating a synthesis. A methodology to standardize charcoal records was proposed by M. Power et al. (2008) and involved a three-step data transformation including a minimax data-rescaling, variance homogenization using Box and Cox (1964) data transformation, and a final rescaling to Z-scores. Using the pfTransform function these transformations are done on influx using the following command:

TR1 <- pfTransform(ID, method=c("MinMax","Box-Cox","Z-Score"))
Loading and preparing data...
Transforming...
Percentage done: 10 20 30 40 50 60 70 80 90 100 

Note that by default the pfTransform function calculates influx for series whose data is given in concentrations, by multiplying concentrations by sediment vertical accretion rate (\(cm.yr^{-1}\)) calculated using the age-depth model for each record (the QuantType=NONE argument can be passed to the pfTransform function for keeping original units but it is not recommended). The method argument may list single or multiple methods (that are computed in the same order as given in the function), relating to charcoal data transformation or smoothing. The distributions of charcoal values typically have long right tails, and can generally be easily transformed to a symmetrical “normal”-like distribution P. E. Higuera et al. (2011). The transformations we implemented include both the Box and Cox (1964) parametric power transformation technique (default method) and the modified Box-Cox modulus transformation, proposed by John and Draper (1980), which is known to more effectively produce normality in long tailed data, i.e. in the case of charcoal series data presenting numerous zero values. These are accessible through the pfTransform function using the type=c(BoxCox1964 , JohnDraper) argument.

The types of filtering (smoothing or compositing) techniques implemented here include running means, median, min, max, quantiles, locally weighted scatter plot smoother (LOESS) and smoothing splines; all these methods take an additional parameter giving the window width for computations (RunWidth argument) or the smoothing parameter in the case of the LOESS or the smoothing-spline methods (span argument). Associated to pfTransform users may choose to add their own data to the analysis using the pfAddData function that uses the CharAnalysis file type format P. E. Higuera et al. (2009 freely available at https://github.com/phiguera/CharAnalysis), or any file containing charcoal quantities and associated depth and age information as input. In the following example we will add the charcoal data from Senici et al. (2013). The BasePeriod argument is used to set the period 200-4000 BP as a base period for the Z-score calculation (M. Power et al. 2008). Note that a minimax data-rescaling step was added after the Box-Cox transformation because Box-Cox transformed series are comparable only if they share identical \(\lambda\) values (J.R. Marlon et al. 2008).

download.file(url="http://blarquez.com/public/data/data_cageo.zip", 
                destfile="data_cageo.zip")
trying URL 'http://blarquez.com/public/data/data_cageo.zip'
Content type 'application/zip' length 14857 bytes (14 KB)
==================================================
downloaded 14 KB
download.file(url="http://blarquez.com/public/data/data_cageo.zip", 
                destfile="data_cageo.zip")
trying URL 'http://blarquez.com/public/data/data_cageo.zip'
Content type 'application/zip' length 14857 bytes (14 KB)
==================================================
downloaded 14 KB
unzip("data_cageo.zip")
mydata=pfAddData(files=c("Ben.csv","Small.csv"), 
                   metadata="metadata.csv", type="CharAnalysis")
incomplete final line found by readTableHeader on 'metadata.csv'
mydata=pfAddData(files=c("Ben.csv","Small.csv"), 
                   metadata="metadata.csv", type="CharAnalysis")
incomplete final line found by readTableHeader on 'metadata.csv'
TR2 <- pfTransform(ID,add=mydata,BasePeriod=c(200,4000),
                   method=c("MinMax","Box-Cox","MinMax","Z-Score"))
Loading and preparing data...
Transforming...
Percentage done: 10 20 30 40 50 60 70 80 90 100 
mydata=pfAddData(files=c("Ben.csv","Small.csv"), 
                   metadata="metadata.csv", type="CharAnalysis")
incomplete final line found by readTableHeader on 'metadata.csv'
TR2 <- pfTransform(ID,add=mydata,BasePeriod=c(200,4000),
                   method=c("MinMax","Box-Cox","MinMax","Z-Score"))
Loading and preparing data...
Transforming...
Percentage done: 10 20 30 40 50 60 70 80 90 100 
file.remove(c("Ben.csv","Small.csv","data_cageo.zip","metadata.csv"))
[1] TRUE TRUE TRUE TRUE

Data synthesis and compositing

Synthesizing or compositing charcoal series typically involves pooling the different series in order to calculate the mean charcoal value (across sites) at each time step. This simple operation could be performed in different ways using the pfComposite function. Alternatively, a data-binning procedure can be used to calculate a composite curve. The binning sequence must be supplied in order to allow the pfComposite function to calculate the mean charcoal value for each series within each binning interval and then calculate the mean for all series. This can be achieved using arbitrary 500-year bin widths:

This approach (pfComposite) is equivalent to M. Power et al. (2008) but paleofire also implements the methods proposed by J.R. Marlon et al. (2008) and Daniau et al. (2012), which consists of a two-stage smoothing method (pfCompositeLF). The procedure implemented in the package was slightly modified compared to J.R. Marlon et al. (2008) but returns highly comparable results (see SI for details). The two-stage smoothing method first “pre-bins” individual charcoal series using non-overlapping bins in order to ensure that records with high sample resolution do not have a disproportionate influence on the composite record, and that data will be not interpolated for records with a lower resolution. The second step smooths the pre-binned series using a locally-weighted scatter plot smoother “LOWESS” (Cleveland 1979) with a pre-defined constant bandwidth (half-width) given in the years (hw argument). In the following example we will pre-bin the data with 20 year non-overlapping bins and a LOWESS smoother with a 500 year window half width (i.e., a 1000-year smoothing window).

COMP2 <- pfCompositeLF(TR2, tarAge=seq(-50,12000,20), 
                       binhw=10, hw=500, nboot=100)
Prebinning...
Percentage done: 10 20 30 40 50 60 70 80 90 100 
Bootstrapping...
Percentage done: 10 20 30 40 50 60 70 80 90 100 

The tarAge argument is used to define the center of each bin in the prebinning procedure (binhw being the prebinning bin half width) and the ages where the LOWESS estimation takes place.

Confidence intervals

Option A
The confidence intervals for the pfComposite function are calculated by bootstrap resampling of the binned charcoal series and calculatiion of the mean for each bin n times, using the argument nboot to choose n value (by default nboot=1000). For the pfCompositeLF function confidence intervals are calculated by bootstrap resampling the prebinned series (as opposed to individual samples) and then applying the LOWESS curve fitting. This operation is repeated n times and is defined using the argument nboot. The confidences intervals are estimated based on the distribution of the bootstrap replicates.

Objects of the class pfComposite and pfCompositeLF can be plotted using the generic plot function. Confidence intervals are specified using the conf argument. The add=sitenum plot function argument can be used to display the number of charcoal sites contributing to each composite value at each time step (Figure 2).

[Composite charcoal series for North Eastern American sites. (a) Composite values and associated confidence intervals using the pfComposite function. (b) Composite values and associated confidence intervals using the pfCompositeLF function (b). Dashed lines correspond to the 97.5th, 2.5th and 95th, 0.5th percentiles respectively.]

Option B
Bootstrapped confidence intervals are usually calculated by resampling the charcoal series with replacement in order to test the sensitivity of the composite record to individual series (or sites, option A). However, because the values in charcoal series are autocorrelated, testing the significance of their temporal variations is not straightforward. Block bootstrap has been proposed to test the significance of changes in stationary time series (Kunsch 1989). Here we implemented a new procedure in the paleofire package of “moving” or “circular” block bootstrap, which consists of splitting each charcoal series into \(n-b+1\) overlapping blocks of data, where \(n\) is sample size and \(b\) the block size. These blocks are randomly selected (with replacement) to reconstruct new individual charcoal series that are in turn used to estimate the confidence intervals around the charcoal series composite mean. This procedure may dampen the long-term trends in data, particularly if individual sites record opposing trends. If the observed trend does not exceed the confidence intervals, then there the composite values at that time are not greater than by chance if records are not at all synchronized. However, a composite curve not exceeding the confidence intervals does not exclude the occurrence of important trends in the composite series. This procedure is rather used for testing the significance of local minima or maxima in the composite time series.
The optimal block size for a given series is given by: \(b=2\times(-1/log(\rho))\), where \(\rho\) is the lag one autocorrelation coefficient of that series (Adams, Mann, and Ammann 2003).

The circular block bootstrap method is commonly used in Superposed Epoch Analysis, a compositing technique that aims to find the response of a variable to one or multiple particular events, for instance insect outbreaks (Nola et al. 2006 e.g.) or fires (Swetnam 1993 e.g.) using dendrochronological series or paleoecological proxy series (Blarquez and Carcaillet 2010). The R implementation follows the Matlab SEA function available at http://blarquez.com that was inspired by Adams, Mann, and Ammann (2003) methodology. The pfCircular function is called using the following command and returns an object of class pfCircular that can be plotted using the generic plot function:

circboot <- pfCircular(COMP1, b=NULL, nboot=100,
                        conf=c(0.005,0.025,0.975,0.995))
# of Bootstrap: 10 20 30 40 50 60 70 80 90 100
circboot <- pfCircular(COMP1, b=NULL, nboot=100,
                        conf=c(0.005,0.025,0.975,0.995))
# of Bootstrap: 10 20 30 40 50 60 70 80 90 100
plot(circboot)

[Composite mean of charcoal series for Eastern North American sites (black line) and associated confidence intervals estimated using a circular block bootstrap procedure (dashed lines). Dashed lines correspond to the 99.5th, 97.5th, 2.5th and 0.5th bootstrapped percentiles, respectively.]

The b=NULL argument indicates that the block size is automatically calculated for each series using the formulation above.

Results interpretations

On figure 2, we see that before c. 10,500 cal BP, the two approaches (simple binning and LOWESS fitting) give different results. Because the pfCompositeLF used a local regression approach with a bandwidth of 1000 years, composite edges (-50-1050 and 11000-12000 cal BP periods) may suffer from bias (edge effect), however this bias should be minimal here and reducing his effect does not change the results significantly (results not shown of for an application of the minimum-slope correction approach of M. E. Mann (2004; M. E. Mann 2008), which is implemented in the pfCompositeLF function, see the help for usage details). Additionally the number of sites contributing to the overall composite curve before 10,500 cal BP is low (\(<\) 30 sites) and thus the curve should be interpreted with caution. The period from 10,500 to 8000 cal BP and from c. 200 cal BP to present, displays large positive anomalies in composite values for both approaches. On Figure 3 we see that the positive charcoal composite anomalies during the period 9000-10 000 cal BP and negative ones during the periods 6000-7000 and 10,500-12,000 are significantly different from a 12,000 year linear trend and exceed the 95th confidence interval range given by the circular block bootstrap procedure (Fig 3). However, large classical (site resampling based) confidence intervals during the 10,500-12,000 cal BP period indicate that the response is not homogeneous among the charcoal series (Fig 2a-b). The negative composite values at 6000-7000 cal BP are associated with confidence intervals that are narrower compared to previous periods indicating that the within-sites response is relatively homogeneous and thus likely related to forcing factors occurring at a broad spatial scale (e.g. climate).

Conclusion

We have presented the paleofire package that allows the paleofire community to easily interrogate data contained within the Global Charcoal Database and to perform the analytical steps required to produce a regional charcoal synthesis using a few simple commands. The paleofire package introduces some new analyses such as the circular block-bootstrap procedure and various new charcoal data-transformation techniques and background-estimation procedures. The package also provides an integrated research framework linking the GCD to the open-source R statistical language. The implemented features are likely to be extended by future releases and new implementations that will increase paleofire capabilities, such as spatio-temporal clustering, which is currently in development. The stable release of paleofire is available from the CRAN website but users may choose to test development releases from Git (https://github.com/paleofire/paleofire). We hope paleofire will be of broad interest to fire scientists and ecosystem managers, and we encourage its use to perform original research and welcome any development requests and feedback.

Acknowledgements

We wish to thank all data contributors to the GCD, PAGES workshop funding, the UMR Chrono-Environnement, the University of Franche-Comté and the Région of Franche-Comté for supporting the Global Paleofire Working Group workshop in Frasne (October 2013). OB was supported by a postdoctoral grant from the Fonds Québécois de la Recherche sur la Nature et les Technologies and the FONCER program. JM was supported by NSF grant EF-1241870.

References

Adams, J. B., M. E. Mann, and C. M. Ammann. 2003. “Proxy evidence for an El Nino-like response to volcanic forcing.” Nature 426 (6964): 274–78. doi:10.1038/nature02101.

Ali, A. A., O. Blarquez, M. P. Girardin, C. Hély, F. Tinquaut, A. El Guellab, V. Valsecchi, et al. 2012. “Control of the multi-millennial wildfire size in boreal North America by spring climatic conditions.” Proceedings of the National Academy of Sciences of the United States of America 109: 20966–70.

Blarquez, O., and C. Carcaillet. 2010. “Fire, fuel composition and resilience threshold in subalpine ecosystem.” PLOS ONE 5 (8): e12480.

Box, George EP, and David R Cox. 1964. “An analysis of transformations.” Journal of the Royal Statistical Society. Series B (Methodological) 26: 211–52.

Brücher, Tim, Victor Brovkin, Silvia Kloster, JR Marlon, and MJ Power. 2014. “Comparing Modelled Fire Dynamics with Charcoal Records for the Holocene.” Climate of the Past 10 (2). Copernicus GmbH: 811–24.

Carcaillet, C, H Almquist, H Asnong, RHW Bradshaw, JS Carrion, MJ Gaillard, K Gajewski, JN Haas, SG Haberle, and P Hadorn. 2002. “Holocene biomass burning and global dynamics of the carbon cycle.” Chemosphere 49 (8): 845–63.

Carcaillet, C., M. Bouvier, B. Fréchette, A.C. Larouche, and P.J.H. Richard. 2001. “Comparison of pollen-slide and sieving methods in lacustrine charcoal analyses for local and regional fire history.” The Holocene 11: 467–76.

Cleveland, William S. 1979. “Robust Locally Weighted Regression and Smoothing Scatterplots.” Journal of the American Statistical Association 74 (368). Taylor &amp; Francis Group: 829–36.

Daniau, A. L., P. J. Bartlein, S. P. Harrison, I. C. Prentice, S. Brewer, P. Friedlingstein, T. I. Harrison-Prentice, et al. 2012. “Predictability of biomass burning in response to climate changes.” Global Biogeochemical Cycles 26 (4): GB4007. doi:10.1029/2011gb004249.

Flannigan, Mike, Ian Campbell, Mike Wotton, Christopher Carcaillet, Pierre Richard, and Yves Bergeron. 2001. “Future fire in Canada’s boreal forest: paleoecology results and general circulation model-regional climate model simulations.” Canadian Journal of Forest Research 31 (5): 854–64.

Girardin, M. P., A. A. Ali, C Carcaillet, O Blarquez, C Hély, A. Terrier, A Genries, and Y Bergeron. 2013. “Efficacy of vegetation changes to limit boreal wildfire activity in a warmer climate.” New Phytologist 199: 1001–10111.

Higuera, Philip E, Linda B Brubaker, Patricia M Anderson, Feng Sheng Hu, and Thomas A Brown. 2009. “Vegetation Mediated the Impacts of Postglacial Climate Change on Fire Regimes in the South-Central Brooks Range, Alaska.” Ecological Monographs 79 (2). Eco Soc America: 201–19.

Higuera, Philip E, Daniel G Gavin, Patrick J Bartlein, and Douglas J Hallett. 2011. “Peak Detection in Sediment–charcoal Records: Impacts of Alternative Data Analysis Methods on Fire-History Interpretations.” International Journal of Wildland Fire 19 (8). CSIRO: 996–1014.

John, JA, and NR Draper. 1980. “An alternative family of transformations.” Applied Statistics 29: 190–97.

Kunsch, Hans R. 1989. “The jackknife and the bootstrap for general stationary observations.” The Annals of Statistics 17 (3): 1217–41.

Mann, Michael E. 2004. “On Smoothing Potentially Non-Stationary Climate Time Series.” Geophysical Research Letters 31 (7): L07214.

———. 2008. “Smoothing of Climate Time Series Revisited.” Geophysical Research Letters 35 (16): L16708.

Marlon, J.R., J.P. Bartlein, C. Carcaillet, D.G. Gavin, S.P. Harrison, P.E. Higuera, F. Joos, M.J. Power, and I. C. Prentice. 2008. “Climate and human influences on global biomass burning over the past two millennia.” Nature Geoscience 1: 697–702.

Marlon, Jennifer R, Patrick J Bartlein, Anne-Laure Daniau, Sandy P Harrison, Shira Y Maezumi, Mitchell J Power, Willy Tinner, and Boris Vanniére. 2013. “Global biomass burning: A synthesis and review of Holocene paleofire records and their controls.” Quaternary Science Reviews 65: 5–25.

Marlon, Jennifer, Patrick J Bartlein, and Cathy Whitlock. 2006. “Fire-fuel-climate linkages in the northwestern USA during the Holocene.” The Holocene 16 (8): 1059–71.

Marlon, JR, PJ Bartlein, MK Walsh, SP Harrison, KJ Brown, ME Edwards, PE Higuera, MJ Power, RS Anderson, and C. Briles. 2009. “Wildfire responses to abrupt climate change in North America.” Proceedings of the National Academy of Sciences 106 (8): 2519–24.

Mooney, SD, SP Harrison, PJ Bartlein, A-L Daniau, Janelle Stevenson, KC Brownlie, Solomon Buckman, Matthew Cupper, Jonathon Luly, and Manus Black. 2011. “Late Quaternary fire regimes of Australasia.” Quaternary Science Reviews 30 (1): 28–46.

Nola, P., M. Morales, R. Motta, and R. Villalba. 2006. “The role of larch budmoth (Zeiraphera diniana Gn.) on forest succession in a larch (Larix decidua Mill.) and Swiss stone pine (Pinus cembra L.) stand in the Susa Valley (Piedmont, Italy).” Trees-Structure and Function 20 (3): 371–82.

Pechony, O, and DT Shindell. 2009. “Fire parameterization on a global scale.” Journal of Geophysical Research: Atmospheres (1984–2012) 114 (D16).

Power, M., J. Marlon, N. Ortiz, P. Bartlein, S. Harrison, F. Mayle, A. Ballouche, et al. 2008. “Changes in fire regimes since the Last Glacial Maximum: an assessment based on a global synthesis and analysis of charcoal data.” Climate Dynamics 30 (7): 887–907. doi:10.1007/s00382-007-0334-x.

Power, MJ, JR Marlon, PJ Bartlein, and SP Harrison. 2010. “Fire history and the Global Charcoal Database: a new tool for hypothesis testing and data exploration.” Palaeogeography, Palaeoclimatology, Palaeoecology 291 (1): 52–59.

Power, MJ, FE Mayle, PJ Bartlein, JR Marlon, RS Anderson, H. Behling, KJ Brown, C. Carcaillet, D. Colombaroli, and DG Gavin. 2013. “Climatic control of the biomass-burning decline in the Americas after AD 1500.” The Holocene 23 (1): 3–13.

Senici, Dominic, Aurore Lucas, Han Y. H. Chen, Yves Bergeron, Alayn Larouche, Benoit Brossier, Olivier Blarquez, and Adam A. Ali. 2013. “Multi-millennial fire frequency and tree abundance differ between xeric and mesic boreal forests in central Canada.” Journal of Ecology 101: 356–67. doi:10.1111/1365-2745.12047.

Swetnam, Thomas W. 1993. “Fire history and climate change in giant sequoia groves.” Science 262 (5135): 885–89. doi:10.1126/science.262.5135.885.

Tinner, Willy, and Feng Sheng Hu. 2003. “Size parameters, size-class distribution and area-number relationship of microscopic charcoal: relevance for fire reconstruction.” The Holocene 13 (4): 499–505.

Vannière, Boris, Mitchell James Power, Neil Roberts, Willy Tinner, José Carrión, Michel Magny, Patrick Bartlein, D Colombaroli, AL Daniau, and W Finsinger. 2011. “Circum-Mediterranean fire activity and climate changes during the mid-Holocene environmental transition (8500-2500 cal. BP).” The Holocene 21 (1): 53–73.

LS0tCnRpdGxlOiAicGFsZW9maXJlOiBhbiBSIHBhY2thZ2UgdG8gYW5hbHlzZSBzZWRpbWVudGFyeSBjaGFyY29hbCByZWNvcmRzIGZyb20gdGhlIEdsb2JhbCBDaGFyY29hbCBEYXRhYmFzZSB0byByZWNvbnN0cnVjdCBwYXN0IGJpb21hc3MgYnVybmluZyIKYXV0aG9yOiAnQmxhcnF1ZXogZXQgYWwuIDIwMTQnCm91dHB1dDoKICBodG1sX2RvY3VtZW50OiBkZWZhdWx0CiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0CmJpYmxpb2dyYXBoeTogcGFsZW9maXJlLXBhcGVyLmJpYgotLS0KCgpXZSBkZXNjcmliZSBhIG5ldyBgUmAgcGFja2FnZSwgYHBhbGVvZmlyZWAsIGZvciBhbmFseXNpcyBhbmQgc3ludGhlc2lzCm9mIGNoYXJjb2FsIHRpbWUgc2VyaWVzLCBzdWNoIGFzIHRob3NlIGNvbnRhaW5lZCBpbiB0aGUgR2xvYmFsIENoYXJjb2FsCkRhdGFiYXNlIChHQ0QpLCB0aGF0IGFyZSB1c2VkIHRvIHJlY29uc3RydWN0IHBhbGVvZmlyZSBhY3Rpdml0eSAocGFzdApiaW9tYXNzIGJ1cm5pbmcpLiBgcGFsZW9maXJlYCBpcyBhbiBpbml0aWF0aXZlIG9mIHRoZSBHbG9iYWwgUGFsZW9maXJlCldvcmtpbmcgR3JvdXAgY29yZSB0ZWFtICh3d3cuZ3B3Zy5vcmcpLCB3aG9zZSBhaW0gaXMgdG8gZW5jb3VyYWdlIHRoZQp1c2Ugb2Ygc2VkaW1lbnRhcnkgY2hhcmNvYWwgc2VyaWVzIHRvIGRldmVsb3AgcmVnaW9uYWwtdG8tZ2xvYmFsCnN5bnRoZXNlcyBvZiBwYWxlb2ZpcmUgYWN0aXZpdHksIGFuZCB0byBlbmhhbmNlIGFjY2VzcyB0byB0aGUgR0NEIGRhdGEKYnkgcHJvdmlkaW5nIGEgY29tbW9uIHJlc2VhcmNoIGZyYW1ld29yay4gQ3VycmVudGx5LCBgcGFsZW9maXJlYApmZWF0dXJlcyBhcmUgb3JnYW5pemVkIGludG8gdGhyZWUgZGlmZmVyZW50IHBhcnRzIHJlbGF0ZWQgdG8gKGkpIHNpdGUKc2VsZWN0aW9uIGFuZCBjaGFyY29hbCBzZXJpZXMgZXh0cmFjdGlvbiBmcm9tIHRoZSBHQ0Q7IChpaSkgY2hhcmNvYWwKZGF0YSB0cmFuc2Zvcm1hdGlvbjsgYW5kIChpaWkpIGNoYXJjb2FsIHNlcmllcyBjb21wb3NpdGluZyBhbmQKc3ludGhlc2lzLiBXZSBwcm92aWRlIGEgdGVjaG5pY2FsIGRlc2NyaXB0aW9uIG9mIGBwYWxlb2ZpcmVgIGFuZApkZXNjcmliZSBzb21lIG5ldyBpbXBsZW1lbnRhdGlvbnMgc3VjaCBhcyB0aGUgY2lyY3VsYXIgYmxvY2sgYm9vdHN0cmFwCnByb2NlZHVyZS4gV2UgdGVzdGVkIHRoZSBzb2Z0d2FyZSB1c2luZyBHQ0R2MyBkYXRhIGZyb20gZWFzdGVybiBOb3J0aApBbWVyaWNhLCBhbmQgcHJvdmlkZSBleGFtcGxlcyBvZiBpbnRlcnByZXRpbmcgcmVzdWx0cyBvZiByZWdpb25hbCBhbmQKZ2xvYmFsIHN5bnRoZXNlcy4KCmNoYXJjb2FsLCBmaXJlLCBiaW9tYXNzIGJ1cm5pbmcsIGRhdGFiYXNlcywgYFJgIHN0YXRpc3RpY2FsIGxhbmd1YWdlCgpJbnRyb2R1Y3Rpb24KPT09PT09PT09PT09CgpJbiB0aGUgbGFzdCBkZWNhZGUsIHJlZ2lvbmFsIGFuZCBnbG9iYWwgc3ludGhlc2VzIG9mIHNlZGltZW50YXJ5CmNoYXJjb2FsIHJlY29yZHMgaGF2ZSBiZWVuIHVzZWQgdG8gZXhhbWluZSBicm9hZC1zY2FsZSBwYXR0ZXJucyBpbgpwYWxhZW9maXJlIGFjdGl2aXR5IFtAQ2FyY2FpbGxldDIwMDI7IEBQb3dlcjIwMDg7IEBEYW5pYXUyMDEyXS4gVGhlCmxpbmthZ2VzIGFtb25nIGZpcmUsIGNsaW1hdGUsIHZlZ2V0YXRpb24gYW5kIGh1bWFucyBhdApjZW50ZW5uaWFsLW1pbGxlbm5pYWwgdGltZXNjYWxlcyBoYXZlIGxpa2V3aXNlIGJlZW4gZXhhbWluZWQgdXNpbmcKZ2xvYmFsIGFuZCByZWdpb25hbCBzeW50aGVzZXMgW0BNYXJsb24yMDA4OyBAQWxpMjAxMl0uIFN5bnRoZXNlcyBvZgpjaGFyY29hbCByZWNvcmRzIGNhbiBhbHNvIGFpZCB0aGUgdmFsaWRhdGlvbiBhbmQgY2FsaWJyYXRpb24gb2YgZmlyZQpzaW11bGF0aW9ucyBbQEZsYW5uaWdhbjIwMDE7IEBQZWNob255MjAwOTsgQEdpcmFyZGluMjAxMzsgQEJydWNoZXIyMDE0XS4KQmVjYXVzZSBmaXJlIGluZmx1ZW5jZXMgZWNvc3lzdGVtcyBhdCBhbGwgc3BhdGlvLXRlbXBvcmFsIHNjYWxlcwoocmFuZ2luZyBmcm9tIGRheXMgdG8gY2VudHVyaWVzIGFuZCBmcm9tIG1pY3Jvc2l0ZXMgdG8gYmlvbWVzKSwgYQpncm93aW5nIGludGVyZXN0IGluIHBhbGVvZmlyZSByZXNlYXJjaCBoYXMgZW1lcmdlZC4gQWRkaXRpb25hbGx5LCBmdXR1cmUKd2lsZGZpcmUgcmVnaW1lcyBtYXkgaGF2ZSBubyBhbmFsb2d1ZXMgZnJvbSByZWNlbnQgZGVjYWRlcywgYW5kIHNvCmlkZW50aWZ5aW5nIHJlZmVyZW5jZSBjb25kaXRpb25zIGFuZCBiYXNlbGluZXMgaW4gdGhlIHBhc3QgaGFzIGJlY29tZQpjcnVjaWFsIHRvIHByb2plY3RpbmcgZnV0dXJlIHdpbGRmaXJlIGFjdGl2aXR5IFtAR2lyYXJkaW4yMDEzXS4KU2VkaW1lbnRhcnkgY2hhcmNvYWwgc2VyaWVzIGZyb20gaW5kaXZpZHVhbCBzaXRlcyBhcmUgZGlzdHJpYnV0ZWQKd29ybGR3aWRlLCBhbmQgYXJlIGluY3JlYXNpbmdseSBpbmNsdWRlZCBpbiB0aGUgR2xvYmFsIENoYXJjb2FsIERhdGFiYXNlCltAUG93ZXIyMDEwIEdDRF0sIHdoaWNoIHByb3ZpZGVzIHRoZSBzY2llbnRpZmljIGNvbW11bml0eSBhIGdsb2JhbApjaGFyY29hbCBkYXRhc2V0IGZvciByZXNlYXJjaCBhbmQgYXJjaGl2aW5nIGZvciBzZWRpbWVudGFyeSByZWNvcmRzIG9mCmZpcmUgKHRoZSBHQ0QgaXMgYXZhaWxhYmxlIGF0IDxodHRwOi8vZ3B3Zy5vcmcvZ3B3Z2RiLmh0bWw+KS4gU3ludGhlc2VzCm9mIHNwYXRpby10ZW1wb3JhbCBjaGFuZ2VzIGluIGZpcmUgYXQgZ2xvYmFsCltATWFybG9uMjAwODsgQFBvd2VyMjAwODsgQERhbmlhdTIwMTI7IEBNYXJsb24yMDEzXSBhbmQgcmVnaW9uYWwKW0BNYXJsb24yMDA5OyBATW9vbmV5MjAxMTsgQFZhbm5pZXJlMjAxMTsgQFBvd2VyMjAxM10gc2NhbGVzIHdlcmUKb2J0YWluZWQgYnkgYXBwbHlpbmcgc2V2ZXJhbCBhbmFseXRpY2FsIHN0ZXBzIGltcGxlbWVudGVkIGJ5IGEgc2V0IG9mCkZvcnRyYW4gcHJvZ3JhbXMgKEJhcnRsZWluLCBQLiBKLiB1bnB1Ymxpc2hlZCkuIEJlY2F1c2UgdGhlc2UKc3RhdGlzdGljYWwgbWV0aG9kcyBhcmUgbm90IGVhc2lseSB1c2FibGUgb3IgbW9kaWZpYWJsZSwgdGhlIEdsb2JhbApQYWxlb2ZpcmUgV29ya2luZyBHcm91cCBjb3JlIHRlYW0gaGFzIGRldmVsb3BlZCBhIHBhY2thZ2UgdXNpbmcgdGhlCm9wZW4tc291cmNlIGBSYCBzdGF0aXN0aWNhbCBwcm9ncmFtbWluZyBsYW5ndWFnZS4gVGhlIG5ldyBwYWNrYWdlIHNob3VsZAppbmNyZWFzZSBhY2Nlc3NpYmlsaXR5IHRvIHBhbGVvZmlyZSBkYXRhIHdoaWxlIHByb3ZpZGluZyB0aGUKZmlyZS1zY2llbmNlIGNvbW11bml0eSB3aXRoIG5ldyBhbmFseXRpY2FsIHRvb2xzIHRoYXQgaW5jbHVkZSBhbmQgZXh0ZW5kCnRoZSBwcmV2aW91c2x5IHVzZWQgZnVuY3Rpb25zIGZvciBHQ0QgZGF0YSBleHRyYWN0aW9uIGFuZCBzdGF0aXN0aWNhbAphbmFseXNpcy5cClRoZSBhaW0gb2YgdGhpcyBwYXBlciBpcyB0byBkZXNjcmliZSB0aGUgYHBhbGVvZmlyZWAgYFJgIHBhY2thZ2UgdGhhdApmYWNpbGl0YXRlcyB0aGUgYW5hbHlzaXMgb2YgY2hhcmNvYWwgcmVjb3JkcyBjb250YWluZWQgaW4gdGhlIEdDRC4gVGhlCmBwYWxlb2ZpcmVgIHBhY2thZ2UgZnVuY3Rpb25zIGFyZSBvcmdhbml6ZWQgaW50byB0aHJlZSBwYXJ0czogKGkpIEdDRApzaXRlIHNlbGVjdGlvbiBhbmQgZGF0YSBleHRyYWN0aW9uIHVzaW5nIGEgdmFyaWV0eSBvZiBjcml0ZXJpYQooZ2VvZ3JhcGhpYywgc2VkaW1lbnRhcnksIGV0Yy4pLCAoaWkpIGNoYXJjb2FsIGRhdGEgdHJhbnNmb3JtYXRpb24sCmluY2x1ZGluZyByZS1zY2FsaW5nLCBzaW5nbGUtcmVjb3JkIHZhcmlhbmNlIGhvbW9nZW5pemF0aW9uIGFuZApub25wYXJhbWV0cmljIHRyZW5kIGVzdGltYXRpb24gYW5kIChpaWkpIGRhdGEgc3ludGhlc2lzLCBpbmNsdWRpbmcKY29uZmlkZW5jZSBsaW1pdCBlc3RpbWF0aW9uIHVzaW5nIHJlc2FtcGxpbmcgcHJvY2VkdXJlcy4KCkdsb2JhbCBDaGFyY29hbCBEYXRhYmFzZSB0byBwYWxlb2ZpcmUgZGF0YSBzeW50aGVzaXMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIGBwYWxlb2ZpcmVgIHBhY2thZ2Ugd29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYEdDRGAgYFJgIHBhY2thZ2UKdGhhdCBjb250YWlucyBhIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0aGUgY2hhcmNvYWwgZGF0YXNldCBpbiBvcmRlciB0bwphY2NvbW1vZGF0ZSB0aGUgZGlmZmVyZW50IHVwZGF0ZSBmcmVxdWVuY3kgYmV0d2VlbiB0aGUgYHBhbGVvZmlyZWAKcGFja2FnZSAoZnJlcXVlbnQgdXBkYXRlcykgYW5kIHRoZSBHbG9iYWwgQ2hhcmNvYWwgRGF0YWJhc2UgKGluZnJlcXVlbnQKdXBkYXRlcykuIFRoZSBgY2hlY2tHQ0R2ZXJzaW9uKClgIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZQp3aGV0aGVyIHRoZSBgR0NEYCBkYXRhIHBhY2thZ2UgaXMgY3VycmVudC4gSWYgaXQgaXMgbm90LCB0aGUgZnVuY3Rpb24KYXNrcyB3aGV0aGVyIHRoZSB1c2VyIHdhbnRzIHRvIHVwZGF0ZSB0aGUgZGF0YS4gVGhlIG1pbmltYWwgcGFja2FnZQp2ZXJzaW9uIG51bWJlcnMgcmVxdWlyZWQgZm9yIHJ1bm5pbmcgdGhlIGV4YW1wbGVzIHByZXNlbnRlZCBpbiB0aGlzCnN0dWR5IGFyZSAxLjEuMyBhbmQgMy4wLjMgZm9yIHRoZSBgcGFsZW9maXJlYCBhbmQgYEdDRGAgcGFja2FnZXMKcmVzcGVjdGl2ZWx5LiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpbGwgYmUgZW5zdXJlZCBmcm9tIHRoZXNlCnZlcnNpb25zLlwKQXMgb2YgLCB0aGUgR0NEIHYzLjAuMyBjb250YWlucyBhIHRvdGFsIG9mIDczNiBjaGFyY29hbCByZWNvcmRzIGFuZCBpcwpwcm92aWRlZCBhcyBhIE1pY3Jvc29mdCBBY2Nlc3MgZGF0YWJhc2UgYXZhaWxhYmxlIGF0IDxodHRwOi8vZ3B3Zy5vcmc+LgpUaGUgYEdDRGAgZGF0YSBwYWNrYWdlIGlzIGEgc2ltcGxpZmllZCBhbmQgcmVkdWNlZCB2ZXJzaW9uIG9mIHRoZSBHQ0QKZGF0YWJhc2UuIFRoZSBwYWNrYWdlIGNvbnNpc3RzIG9mIHR3byBkYXRhIGZyYW1lcyBjb250YWluaW5nIHNpdGUKbWV0YWRhdGEgYW5kIGNoYXJjb2FsIGRhdGEuIFRoZSB0d28gZGF0YSBmcmFtZXMgY29tYmluZSBzZXZlcmFsIHRhYmxlcwpmcm9tIHRoZSBHQ0QgaW4gb3JkZXIgdG8gc2ltcGxpZnkgYW5hbHlzaXMgaW4gYFJgLCBhbmQgZXhjbHVkZQpjaHJvbm9sb2d5IGRldmVsb3BtZW50IGluZm9ybWF0aW9uLCBzdWNoIGFzIHJhZGlvY2FyYm9uIGRhdGVzOyB0aGVzZQp3aWxsIGxpa2VseSBiZSBhZGRlZCBob3dldmVyIGluIGZ1dHVyZSByZWxlYXNlcy4gQWx0aG91Z2ggbW9zdCBhbmFseXNlcwppbiBgcGFsZW9maXJlYCBtYXkgdXNlIGRhdGEgZGlyZWN0bHkgZnJvbSB0aGUgZGF0YWZyYW1lcyBpbiB0aGUgYEdDRGAKcGFja2FnZSwgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBhbmFseXplIHVzZXItZGVmaW5lZCBkYXRhYmFzZSBleHRyYWN0cwpvciBvdGhlciBjaGFyY29hbCBzZXJpZXMgbm90IGluIHRoZSBkYXRhYmFzZSB1c2luZyB0aGUgcGZBZGREYXRhCmZ1bmN0aW9uLiBUaGVyZSBpcyBjdXJyZW50bHkgbm8gbWVjaGFuaXNtIGZvciBwZXJtYW5lbnRseSBhZGRpbmcgZGF0YSB0bwp0aGUgR0NEIHBhY2thZ2UgYXV0b21hdGljYWxseTsgaW50ZXJlc3RlZCBjb250cmlidXRvcnMgc2hvdWxkIGNvbnRhY3QKdGhlIEdQV0cgaW5zdGVhZC4gVGhlIHNpdGUgbWV0YWRhdGEgaXMgYWNjZXNzaWJsZSBieSB0eXBpbmcgdGhlCmBkYXRhKHBhbGVvZmlyZXNpdGVzKWAgY29tbWFuZCBhdCB0aGUgYFJgIHByb21wdC4gVGhpcyBkYXRhIGZyYW1lCnByb3ZpZGVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGVhY2ggc2l0ZSBpbiB0aGUgaWRcX3NpdGUgY29sdW1uIGFuZAphc3NvY2lhdGVkIG1ldGFkYXRhIHN1Y2ggYXMgY2hyb25vbG9naWNhbCwgc2VkaW1lbnRhcnkgb3IgZ2VvZ3JhcGhpY2FsCmluZm9ybWF0aW9uLgoKVGhlIHJhdyBjaGFyY29hbCBkYXRhIGFyZSBhY2Nlc3NpYmxlIHdpdGggdGhlIGBkYXRhKHBhbGVvZmlyZWRhdGEpYApjb21tYW5kLiBUaGUgZGF0YSBjb25zaXN0IG9mIGEgc2V2ZW4gY29sdW1uIGRhdGEgZnJhbWUgY29udGFpbmluZzogKGkpCnNpdGUgdW5pcXVlIGlkZW50aWZpZXIsIChpaSkgc2FtcGxlIGRlcHRoLCAoaWlpKSBzYW1wbGUgYWdlLCAoaXYpIHNhbXBsZQpjaGFyY29hbCB2YWx1ZSwgKHYpIHNhbXBsZSBjaGFyY29hbCB1bml0LCAodmkpIGV4dHJhY3Rpb24gbWV0aG9kIChzaWV2ZWQKY2hhcmNvYWwsIHBvbGxlbiBzbGlkZSBjaGFyY29hbHMsIGV0Yy4pIGFuZCAodmlpKSBzYW1wbGUgdHlwZSB1bml0CihpbmZsdXggb3IgY29uY2VudHJhdGlvbikuIFRoZSBkZWZhdWx0IHNldHRpbmcgZm9yIHRoZSBgUmAgcGFja2FnZSBpcyB0bwpzZWxlY3QgdGhlIHByZWZlcnJlZCB1bml0cyAoZS5nLiwgY29uY2VudHJhdGlvbiBvciBpbmZsdXggdmFsdWVzIGFyZQp0eXBpY2FsbHkgcHJlZmVycmVkIG92ZXIgY2hhcmNvYWwtdG8tcG9sbGVuIHJhdGlvcyBpZiBib3RoIGFyZQphdmFpbGFibGUpIHVzZWQgaW4gcHJldmlvdXMgYW5hbHlzaXMgW3NlZSBARGFuaWF1MjAxMiBvcjsgQFBvd2VyMjAwOF0sCmhvd2V2ZXIgYHBhbGVvZmlyZWAgYWxsb3dzIG9uZSB0byBhbmFseXNlIGNoYXJjb2FsIHJlY29yZHMgd2l0aAp1c2VyLWRlZmluZWQgdW5pdHMgb3IgbWV0aG9kcyAoZS5nLiBzaWV2ZWQgKnZzKiBwb2xsZW4gc2xpZGUgY2hhcmNvYWxzLApzZWUgcGZTaXRlU2VsIGFuZCBwZlRyYW5zZm9ybSBmdW5jdGlvbnMgaGVscCBmb3IgZGV0YWlscykuCgpUZWNobmljYWwgZGVzY3JpcHRpb24gb2YgYHBhbGVvZmlyZWAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpIZXJlIHdlIHByb3ZpZGUgYSB0ZWNobmljYWwgZGVzY3JpcHRpb24gYW5kIHNldmVyYWwgaWxsdXN0cmF0aXZlCmV4YW1wbGVzIG9mIGBwYWxlb2ZpcmVgLiBUaGUgYHBhbGVvZmlyZWAgcGFja2FnZSBpcyB3cml0dGVuIGluIHRoZSBgUmAKc2NpZW50aWZpYyBjb21wdXRpbmcgbGFuZ3VhZ2UgKGBSYCBEZXZlbG9wbWVudCBDb3JlIFRlYW0sIDIwMTEpIGFuZCB3YXMKZGV2ZWxvcGVkIHVuZGVyIHRoZSBgUmAgMy4wLjMgdmVyc2lvbiBidXQgcmVtYWlucyBjb21wYXRpYmxlIHdpdGgKYFJgIFw+PTIuMTAuMC4gVGhlIGZ1bmN0aW9ucyBpbiBgcGFsZW9maXJlYCBhcmUgYXJyYW5nZWQgaW50byB0aHJlZQpncm91cHMgYXNzb2NpYXRlZCB3aXRoIGRhdGEgc2VsZWN0aW9uLCBjaGFyY29hbCBzZXJpZXMgdHJhbnNmb3JtYXRpb24sCmFuZCBzeW50aGVzaXMuIFdlIHVzZWQgdGhlIFMzIG1ldGhvZCBzY2hlbWUgdG8gaW1wbGVtZW50IGdlbmVyaWMKcGxvdHRpbmcgYW5kIHN1bW1hcnkgZnVuY3Rpb25zLgoKVG8gcHJlc2VudCBzb21lIG9mIHRoZSBgcGFsZW9maXJlYCBjYXBhYmlsaXRpZXMsIHRoZSBleGFtcGxlcyBiZWxvdyB1c2UKY2hhcmNvYWwgc2VyaWVzIGZyb20gRWFzdGVybiBOb3J0aCBBbWVyaWNhLiBGb3IgYWRkaXRpb25hbCBleGFtcGxlcyBhbmQKYSBkZXRhaWxlZCBvdmVydmlldyBvZiBpbmRpdmlkdWFsIGZ1bmN0aW9ucywgdGhlIHJlYWRlciBpcyByZWZlcnJlZCB0bwp0aGUgb25saW5lIGhlbHAgYXZhaWxhYmxlIGF0CjxodHRwOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9wYWxlb2ZpcmUvcGFsZW9maXJlLnBkZj4uCgpTaXRlIHNlbGVjdGlvbgotLS0tLS0tLS0tLS0tLQoKVHdvIGZ1bmN0aW9ucyBhcmUgZGVkaWNhdGVkIHRvIHNpdGUgc2VsZWN0aW9uLiBUaGUgZmlyc3Qgb25lLApgcGZJbnRlcmFjdGl2ZWAgcmVxdWlyZXMgdXNlcnMgdG8gaW50ZXJhY3RpdmVseSBkcmF3IGEgcG9seWdvbiBvbiBhIG1hcAp0byBzZWxlY3Qgc2l0ZXMgd2l0aCByZXNwZWN0IHRvIHRoZWlyIGdlb2dyYXBoaWMgbG9jYXRpb24uIFRoZSBmdW5jdGlvbgpyZXR1cm5zIGEgbGlzdCBvYmplY3QgY29udGFpbmluZyBzaXRlIG5hbWVzIGFuZCBpZGVudGlmaWVycyB0aGF0IGlzCmZ1cnRoZXIgdXNlZCBpbiB0aGUgZm9sbG93aW5nIGFuYWx5c2lzIHN0ZXBzIGFuZCBpcyBjYWxsZWQgdXNpbmcKYHBmSW50ZXJhY3RpdmUoKWAuCgpgYGB7cn0KaW5zdGFsbC5wYWNrYWdlcygncGFsZW9maXJl4oCdLHJlcG894oCcaHR0cDovL2NyYW4uci1wcm9qZWN0Lm9yZycpCmxpYnJhcnkocGFsZW9maXJlKQpgYGAKCgpUaGUgYHBmU2l0ZVNlbGAgZnVuY3Rpb24gaXMgbW9yZSB2ZXJzYXRpbGUgdGhhbiBgcGZJbnRlcmFjdGl2ZWAgYW5kIGhhcwphcmd1bWVudHMgZm9yIGEgdmFyaWV0eSBvZiB1c2VyLWRlZmluZWQgY3JpdGVyaWEuIEluIHRoZSBleGFtcGxlIGJlbG93CndlIHNlbGVjdCBjaGFyY29hbCBzZXJpZXMgYmV0d2VlbiAzMMKwIGFuZCA5MMKwIGxhdGl0dWRlIGFuZCAtMTAwwrAKYW5kIC01MMKwIGxvbmdpdHVkZSwgYW5kIGluY2x1ZGUgb25seSB0aG9zZSB3aXRoIGF0IGxlYXN0IG9uZQpnZW9jaHJvbm9sb2dpY2FsICheMTReQyBvciBeMjEwXlBiIGRhdGluZywgdGVwaHJhIGxheWVyLCBldGMuKSBjb250cm9sCnBvaW50IGVhY2ggMjUwMCB5ZWFyLgoKYGBge3J9CklEIDwtIHBmU2l0ZVNlbChsYXQ+MzAgJiBsYXQ8OTAsIGxvbmc+LTEwMCAmIGxvbmc8KC01MCksIGRhdGVfaW50PD0yNTAwKSAKbGVuZ3RoKElEJGlkX3NpdGUpCmBgYAoKClNldmVudHktb25lIHNpdGVzIGFyZSBzZWxlY3RlZCBhbmQgc3RvcmVkIGluIHRoZSBJRCBvYmplY3Qgb2YgdGhlIGNsYXNzCmBwZlNpdGVTZWxgLiBUaGUgc3VtbWFyeSBmdW5jdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGBwZlNpdGVTZWxgIG9iamVjdApyZXR1cm5zIGEgdGFibGUgKFRhYmxlIFNJMSkgY29udGFpbmluZyBzaXRlIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcKZ2VvZ3JhcGhpYyAobGF0aXR1ZGUsIGxvbmdpdHVkZSBhbmQgZWxldmF0aW9uKSBhbmQgY2hyb25vbG9naWNhbApkZXNjcmlwdG9ycyAobnVtYmVyIG9mIGNocm9ub2xvZ2ljYWwgY29udHJvbCBwb2ludHMsIG51bWJlciBvZiBzYW1wbGVzLAptaW5pbXVtIGFuZCBtYXhpbXVtIGVzdGltYXRlZCBhZ2VzKS4gSW4gdGhlIGV4YW1wbGUgYmVsb3cgdGhlIGBzdW1tYXJ5YApmdW5jdGlvbiBpcyBhcHBsaWVkIHRvIHRoZSBJRCBvYmplY3QgYW5kIHRoZSBgcGZTaXRlU2VsYCBmdW5jdGlvbiBpcwp1c2VkIHRvIHNlbGVjdCBzaXRlIHJlY29yZHMgd2l0aCBhdCBsZWFzdCAyMCBzYW1wbGVzLgoKYGBge3J9CnN1bUlEIDwtIHN1bW1hcnkoSUQpCklEIDwtIHBmU2l0ZVNlbChpZF9zaXRlICVpbiUgSUQkaWRfc2l0ZSAmIG51bV9zYW1wPj0yMCkKbGVuZ3RoKElEJGlkX3NpdGUpCmBgYAoKClRoZSA1NyBzZWxlY3RlZCBzaXRlcyBjYW4gYmUgcGxvdHRlZCBvbiBhIG1hcCB1c2luZyB0aGUgZ2VuZXJpYyBgcGxvdGAKZnVuY3Rpb24gOyBhIHpvb20gbGV2ZWwgY2FuIGJlIHNwZWNpZmllZCB1c2luZyB0aGUgem9vbSBhcmd1bWVudC4gVGhlCnVzZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIGlsbHVzdHJhdGVkIGluIHRoZSBleGFtcGxlIGJlbG93LCB3aGljaCBpcyB1c2VkCnRvIGNvbnN0cnVjdCBGaWd1cmUgMS4gVGhlIGBwbG90YCBmdW5jdGlvbiBtYXkgYWxzbyBiZSB1c2VkIHRvIGV4cGxvcmUKdGhlIHNhbXBsaW5nIHJlc29sdXRpb24gb2Ygc2l0ZXMgdXNpbmcgdGhlIGB0eXBlPWNocm9ub2xvZ3lgIGFyZ3VtZW50LgoKYGBge3J9CnBsb3QoSUQsIHpvb209IndvcmxkIikKYGBgCgoKRGF0YSB0cmFuc2Zvcm1hdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tCgpDaGFyY29hbCB2YWx1ZXMgY29udGFpbmVkIGluIHRoZSBHQ0QgY2FuIHZhcnkgd2lkZWx5IGFtb25nIGFuZCB3aXRoaW4Kc2l0ZXMgZHVlIHRvIG11bHRpcGxlIGZhY3RvcnMuIEZvciBpbnN0YW5jZSwgdmFyaWF0aW9ucyBpbiAoYWJzb2x1dGUpCmNoYXJjb2FsIGFidW5kYW5jZXMgY2FuIGJlIHJlbGF0ZWQgdG8gZGlmZmVyZW50IGFuYWx5dGljYWwgbWV0aG9kcyBbaS5lLgpzZWRpbWVudCB0cmVhdG1lbnQ7IEBUaW5uZXIyMDAzXSBhcyB3ZWxsIGFzIHRvIHVuaXF1ZSBwaHlzaW9ncmFwaGljIHNpdGUKY2hhcmFjdGVyaXN0aWNzIEBNYXJsb24yMDA2LiBWYXJpYXRpb25zIGluIGNoYXJjb2FsIHZhbHVlcyBtYXkgYWxzbyBiZQpsaW5rZWQgdG8gZGlmZmVyZW5jZXMgaW4gdGhlIHR5cGVzIG9mIHJlY29yZHMgW3BvbGxlbiBzbGlkZSBjaGFyY29hbHMsCnNpZXZlZCBjaGFyY29hbHMsIGNoYXJjb2FsL3BvbGxlbiByYXRpb3MsIEBDYXJjYWlsbGV0MjAwMWFdLiBMYXN0bHksCmRpZmZlcmVuY2VzIGluIHRoZSBvcmlnaW5hbCBzYW1wbGUgcXVhbnRpdGllcyAoaW5mbHV4LCBjb25jZW50cmF0aW9uLApwZXJjZW50YWdlKSBjb3VsZCBhbHNvIGNvbnRyaWJ1dGUgdG8gdmFyaWF0aW9ucyBpbiBjaGFyY29hbCB2YWx1ZXMuCkNvbnNlcXVlbnRseSwgdHJhbnNmb3JtYXRpb24gYW5kIHN0YW5kYXJkaXphdGlvbiBvZiBkaWZmZXJlbnQgY2hhcmNvYWwKcmVjb3JkcyBpcyBhIGhpZ2hseSByZWNvbW1lbmRlZCBzdGVwIGluIGdlbmVyYXRpbmcgYSBzeW50aGVzaXMuIEEKbWV0aG9kb2xvZ3kgdG8gc3RhbmRhcmRpemUgY2hhcmNvYWwgcmVjb3JkcyB3YXMgcHJvcG9zZWQgYnkgQFBvd2VyMjAwOAphbmQgaW52b2x2ZWQgYSB0aHJlZS1zdGVwIGRhdGEgdHJhbnNmb3JtYXRpb24gaW5jbHVkaW5nIGEgbWluaW1heApkYXRhLXJlc2NhbGluZywgdmFyaWFuY2UgaG9tb2dlbml6YXRpb24gdXNpbmcgQEJveDE5NjQgZGF0YQp0cmFuc2Zvcm1hdGlvbiwgYW5kIGEgZmluYWwgcmVzY2FsaW5nIHRvIFotc2NvcmVzLiBVc2luZyB0aGUKYHBmVHJhbnNmb3JtYCBmdW5jdGlvbiB0aGVzZSB0cmFuc2Zvcm1hdGlvbnMgYXJlIGRvbmUgb24gaW5mbHV4IHVzaW5nCnRoZSBmb2xsb3dpbmcgY29tbWFuZDoKCmBgYHtyfQpUUjEgPC0gcGZUcmFuc2Zvcm0oSUQsIG1ldGhvZD1jKCJNaW5NYXgiLCJCb3gtQ294IiwiWi1TY29yZSIpKQpgYGAKCgpOb3RlIHRoYXQgYnkgZGVmYXVsdCB0aGUgYHBmVHJhbnNmb3JtYCBmdW5jdGlvbiBjYWxjdWxhdGVzIGluZmx1eCBmb3IKc2VyaWVzIHdob3NlIGRhdGEgaXMgZ2l2ZW4gaW4gY29uY2VudHJhdGlvbnMsIGJ5IG11bHRpcGx5aW5nCmNvbmNlbnRyYXRpb25zIGJ5IHNlZGltZW50IHZlcnRpY2FsIGFjY3JldGlvbiByYXRlICgkY20ueXJeey0xfSQpCmNhbGN1bGF0ZWQgdXNpbmcgdGhlIGFnZS1kZXB0aCBtb2RlbCBmb3IgZWFjaCByZWNvcmQgKHRoZQpgUXVhbnRUeXBlPU5PTkVgIGFyZ3VtZW50IGNhbiBiZSBwYXNzZWQgdG8gdGhlIGBwZlRyYW5zZm9ybWAgZnVuY3Rpb24KZm9yIGtlZXBpbmcgb3JpZ2luYWwgdW5pdHMgYnV0IGl0IGlzIG5vdCByZWNvbW1lbmRlZCkuIFRoZSBgbWV0aG9kYAphcmd1bWVudCBtYXkgbGlzdCBzaW5nbGUgb3IgbXVsdGlwbGUgbWV0aG9kcyAodGhhdCBhcmUgY29tcHV0ZWQgaW4gdGhlCnNhbWUgb3JkZXIgYXMgZ2l2ZW4gaW4gdGhlIGZ1bmN0aW9uKSwgcmVsYXRpbmcgdG8gY2hhcmNvYWwgZGF0YQp0cmFuc2Zvcm1hdGlvbiBvciBzbW9vdGhpbmcuIFRoZSBkaXN0cmlidXRpb25zIG9mIGNoYXJjb2FsIHZhbHVlcwp0eXBpY2FsbHkgaGF2ZSBsb25nIHJpZ2h0IHRhaWxzLCBhbmQgY2FuIGdlbmVyYWxseSBiZSBlYXNpbHkgdHJhbnNmb3JtZWQKdG8gYSBzeW1tZXRyaWNhbCDigJxub3JtYWzigJ0tbGlrZSBkaXN0cmlidXRpb24gQEhpZ3VlcmEyMDExLiBUaGUKdHJhbnNmb3JtYXRpb25zIHdlIGltcGxlbWVudGVkIGluY2x1ZGUgYm90aCB0aGUgQEJveDE5NjQgcGFyYW1ldHJpYwpwb3dlciB0cmFuc2Zvcm1hdGlvbiB0ZWNobmlxdWUgKGRlZmF1bHQgbWV0aG9kKSBhbmQgdGhlIG1vZGlmaWVkIEJveC1Db3gKbW9kdWx1cyB0cmFuc2Zvcm1hdGlvbiwgcHJvcG9zZWQgYnkgQEpvaG4xOTgwLCB3aGljaCBpcyBrbm93biB0byBtb3JlCmVmZmVjdGl2ZWx5IHByb2R1Y2Ugbm9ybWFsaXR5IGluIGxvbmcgdGFpbGVkIGRhdGEsIGkuZS4gaW4gdGhlIGNhc2Ugb2YKY2hhcmNvYWwgc2VyaWVzIGRhdGEgcHJlc2VudGluZyBudW1lcm91cyB6ZXJvIHZhbHVlcy4gVGhlc2UgYXJlCmFjY2Vzc2libGUgdGhyb3VnaCB0aGUgcGZUcmFuc2Zvcm0gZnVuY3Rpb24gdXNpbmcgdGhlCmB0eXBlPWMoQm94Q294MTk2NCAsIEpvaG5EcmFwZXIpYCBhcmd1bWVudC4KClRoZSB0eXBlcyBvZiBmaWx0ZXJpbmcgKHNtb290aGluZyBvciBjb21wb3NpdGluZykgdGVjaG5pcXVlcyBpbXBsZW1lbnRlZApoZXJlIGluY2x1ZGUgcnVubmluZyBtZWFucywgbWVkaWFuLCBtaW4sIG1heCwgcXVhbnRpbGVzLCBsb2NhbGx5CndlaWdodGVkIHNjYXR0ZXIgcGxvdCBzbW9vdGhlciAoTE9FU1MpIGFuZCBzbW9vdGhpbmcgc3BsaW5lczsgYWxsIHRoZXNlCm1ldGhvZHMgdGFrZSBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciBnaXZpbmcgdGhlIHdpbmRvdyB3aWR0aCBmb3IKY29tcHV0YXRpb25zIChSdW5XaWR0aCBhcmd1bWVudCkgb3IgdGhlIHNtb290aGluZyBwYXJhbWV0ZXIgaW4gdGhlIGNhc2UKb2YgdGhlIExPRVNTIG9yIHRoZSBzbW9vdGhpbmctc3BsaW5lIG1ldGhvZHMgKHNwYW4gYXJndW1lbnQpLiBBc3NvY2lhdGVkCnRvIGBwZlRyYW5zZm9ybWAgdXNlcnMgbWF5IGNob29zZSB0byBhZGQgdGhlaXIgb3duIGRhdGEgdG8gdGhlIGFuYWx5c2lzCnVzaW5nIHRoZSBgcGZBZGREYXRhYCBmdW5jdGlvbiB0aGF0IHVzZXMgdGhlIENoYXJBbmFseXNpcyBmaWxlIHR5cGUKZm9ybWF0IEBIaWd1ZXJhMjAwOSBbZnJlZWx5IGF2YWlsYWJsZSBhdAo8aHR0cHM6Ly9naXRodWIuY29tL3BoaWd1ZXJhL0NoYXJBbmFseXNpcz5dLCBvciBhbnkgZmlsZSBjb250YWluaW5nCmNoYXJjb2FsIHF1YW50aXRpZXMgYW5kIGFzc29jaWF0ZWQgZGVwdGggYW5kIGFnZSBpbmZvcm1hdGlvbiBhcyBpbnB1dC4KSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIHdlIHdpbGwgYWRkIHRoZSBjaGFyY29hbCBkYXRhIGZyb20gQFNlbmljaTIwMTMuClRoZSBgQmFzZVBlcmlvZGAgYXJndW1lbnQgaXMgdXNlZCB0byBzZXQgdGhlIHBlcmlvZCAyMDAtNDAwMCBCUCBhcyBhCmJhc2UgcGVyaW9kIGZvciB0aGUgWi1zY29yZSBjYWxjdWxhdGlvbiBbQFBvd2VyMjAwOF0uIE5vdGUgdGhhdCBhCm1pbmltYXggZGF0YS1yZXNjYWxpbmcgc3RlcCB3YXMgYWRkZWQgYWZ0ZXIgdGhlIEJveC1Db3ggdHJhbnNmb3JtYXRpb24KYmVjYXVzZSBCb3gtQ294IHRyYW5zZm9ybWVkIHNlcmllcyBhcmUgY29tcGFyYWJsZSBvbmx5IGlmIHRoZXkgc2hhcmUKaWRlbnRpY2FsICRcbGFtYmRhJCB2YWx1ZXMgW0BNYXJsb24yMDA4XS4KCmBgYHtyfQojIyBBZGQgQmVuIGxha2UgYW5kIFNtYWxsIGxha2UgZGF0YSB0byB0aGUgCiMgYW5hbHlzaXMgKFNlbmljaSBldCBhbC4sIDIwMTMpIApkb3dubG9hZC5maWxlKHVybD0iaHR0cDovL2JsYXJxdWV6LmNvbS9wdWJsaWMvZGF0YS9kYXRhX2NhZ2VvLnppcCIsIAogICAgICAgICAgICAgICAgZGVzdGZpbGU9ImRhdGFfY2FnZW8uemlwIikKdW56aXAoImRhdGFfY2FnZW8uemlwIikKbXlkYXRhPXBmQWRkRGF0YShmaWxlcz1jKCJCZW4uY3N2IiwiU21hbGwuY3N2IiksIAogICAgICAgICAgICAgICAgICAgbWV0YWRhdGE9Im1ldGFkYXRhLmNzdiIsIHR5cGU9IkNoYXJBbmFseXNpcyIpCgojIyBUcmFuc2Zvcm06ClRSMiA8LSBwZlRyYW5zZm9ybShJRCxhZGQ9bXlkYXRhLEJhc2VQZXJpb2Q9YygyMDAsNDAwMCksCiAgICAgICAgICAgICAgICAgICBtZXRob2Q9YygiTWluTWF4IiwiQm94LUNveCIsIk1pbk1heCIsIlotU2NvcmUiKSkKIyMgRGVsZXRlIGRvd25sb2FkZWQgZmlsZXMKZmlsZS5yZW1vdmUoYygiQmVuLmNzdiIsIlNtYWxsLmNzdiIsImRhdGFfY2FnZW8uemlwIiwibWV0YWRhdGEuY3N2IikpCmBgYAoKRGF0YSBzeW50aGVzaXMgYW5kIGNvbXBvc2l0aW5nCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKU3ludGhlc2l6aW5nIG9yIGNvbXBvc2l0aW5nIGNoYXJjb2FsIHNlcmllcyB0eXBpY2FsbHkgaW52b2x2ZXMgcG9vbGluZwp0aGUgZGlmZmVyZW50IHNlcmllcyBpbiBvcmRlciB0byBjYWxjdWxhdGUgdGhlIG1lYW4gY2hhcmNvYWwgdmFsdWUKKGFjcm9zcyBzaXRlcykgYXQgZWFjaCB0aW1lIHN0ZXAuIFRoaXMgc2ltcGxlIG9wZXJhdGlvbiBjb3VsZCBiZQpwZXJmb3JtZWQgaW4gZGlmZmVyZW50IHdheXMgdXNpbmcgdGhlIGBwZkNvbXBvc2l0ZWAgZnVuY3Rpb24uCkFsdGVybmF0aXZlbHksIGEgZGF0YS1iaW5uaW5nIHByb2NlZHVyZSBjYW4gYmUgdXNlZCB0byBjYWxjdWxhdGUgYQpjb21wb3NpdGUgY3VydmUuIFRoZSBiaW5uaW5nIHNlcXVlbmNlIG11c3QgYmUgc3VwcGxpZWQgaW4gb3JkZXIgdG8gYWxsb3cKdGhlIGBwZkNvbXBvc2l0ZWAgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBtZWFuIGNoYXJjb2FsIHZhbHVlIGZvciBlYWNoCnNlcmllcyB3aXRoaW4gZWFjaCBiaW5uaW5nIGludGVydmFsIGFuZCB0aGVuIGNhbGN1bGF0ZSB0aGUgbWVhbiBmb3IgYWxsCnNlcmllcy4gVGhpcyBjYW4gYmUgYWNoaWV2ZWQgdXNpbmcgYXJiaXRyYXJ5IDUwMC15ZWFyIGJpbiB3aWR0aHM6CgpgYGB7cn0KQ09NUDEgPC0gcGZDb21wb3NpdGUoVFIyLCBiaW5uaW5nPVRSVUUsIAogICAgICAgICAgICAgICAgICAgICBiaW5zPXNlcShmcm9tPTAsdG89MTEwMDAsIGJ5PTUwMCkpCmBgYAoKCgpUaGlzIGFwcHJvYWNoIChgcGZDb21wb3NpdGVgKSBpcyBlcXVpdmFsZW50IHRvIEBQb3dlcjIwMDggYnV0CmBwYWxlb2ZpcmVgIGFsc28gaW1wbGVtZW50cyB0aGUgbWV0aG9kcyBwcm9wb3NlZCBieSBATWFybG9uMjAwOCBhbmQKQERhbmlhdTIwMTIsIHdoaWNoIGNvbnNpc3RzIG9mIGEgdHdvLXN0YWdlIHNtb290aGluZyBtZXRob2QKKGBwZkNvbXBvc2l0ZUxGYCkuIFRoZSBwcm9jZWR1cmUgaW1wbGVtZW50ZWQgaW4gdGhlIHBhY2thZ2Ugd2FzIHNsaWdodGx5Cm1vZGlmaWVkIGNvbXBhcmVkIHRvIEBNYXJsb24yMDA4IGJ1dCByZXR1cm5zIGhpZ2hseSBjb21wYXJhYmxlIHJlc3VsdHMKKHNlZSBTSSBmb3IgZGV0YWlscykuIFRoZSB0d28tc3RhZ2Ugc21vb3RoaW5nIG1ldGhvZCBmaXJzdCDigJxwcmUtYmluc+KAnQppbmRpdmlkdWFsIGNoYXJjb2FsIHNlcmllcyB1c2luZyBub24tb3ZlcmxhcHBpbmcgYmlucyBpbiBvcmRlciB0byBlbnN1cmUKdGhhdCByZWNvcmRzIHdpdGggaGlnaCBzYW1wbGUgcmVzb2x1dGlvbiBkbyBub3QgaGF2ZSBhIGRpc3Byb3BvcnRpb25hdGUKaW5mbHVlbmNlIG9uIHRoZSBjb21wb3NpdGUgcmVjb3JkLCBhbmQgdGhhdCBkYXRhIHdpbGwgYmUgbm90CmludGVycG9sYXRlZCBmb3IgcmVjb3JkcyB3aXRoIGEgbG93ZXIgcmVzb2x1dGlvbi4gVGhlIHNlY29uZCBzdGVwCnNtb290aHMgdGhlIHByZS1iaW5uZWQgc2VyaWVzIHVzaW5nIGEgbG9jYWxseS13ZWlnaHRlZCBzY2F0dGVyIHBsb3QKc21vb3RoZXIg4oCcTE9XRVNT4oCdIFtAQ2xldmVsYW5kMTk3OV0gd2l0aCBhIHByZS1kZWZpbmVkIGNvbnN0YW50IGJhbmR3aWR0aAooaGFsZi13aWR0aCkgZ2l2ZW4gaW4gdGhlIHllYXJzIChgaHdgIGFyZ3VtZW50KS4gSW4gdGhlIGZvbGxvd2luZwpleGFtcGxlIHdlIHdpbGwgcHJlLWJpbiB0aGUgZGF0YSB3aXRoIDIwIHllYXIgbm9uLW92ZXJsYXBwaW5nIGJpbnMgYW5kIGEKTE9XRVNTIHNtb290aGVyIHdpdGggYSA1MDAgeWVhciB3aW5kb3cgaGFsZiB3aWR0aCAoaS5lLiwgYSAxMDAwLXllYXIKc21vb3RoaW5nIHdpbmRvdykuCgpgYGB7cn0KQ09NUDIgPC0gcGZDb21wb3NpdGVMRihUUjIsIHRhckFnZT1zZXEoLTUwLDEyMDAwLDIwKSwgCiAgICAgICAgICAgICAgICAgICAgICAgYmluaHc9MTAsIGh3PTUwMCwgbmJvb3Q9MTAwKQpgYGAKCgpUaGUgYHRhckFnZWAgYXJndW1lbnQgaXMgdXNlZCB0byBkZWZpbmUgdGhlIGNlbnRlciBvZiBlYWNoIGJpbiBpbiB0aGUKcHJlYmlubmluZyBwcm9jZWR1cmUgKGBiaW5od2AgYmVpbmcgdGhlIHByZWJpbm5pbmcgYmluIGhhbGYgd2lkdGgpIGFuZAp0aGUgYWdlcyB3aGVyZSB0aGUgTE9XRVNTIGVzdGltYXRpb24gdGFrZXMgcGxhY2UuCgpDb25maWRlbmNlIGludGVydmFscwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKKk9wdGlvbiBBKlwKVGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGZvciB0aGUgYHBmQ29tcG9zaXRlYCBmdW5jdGlvbiBhcmUgY2FsY3VsYXRlZApieSBib290c3RyYXAgcmVzYW1wbGluZyBvZiB0aGUgYmlubmVkIGNoYXJjb2FsIHNlcmllcyBhbmQgY2FsY3VsYXRpaW9uCm9mIHRoZSBtZWFuIGZvciBlYWNoIGJpbiBuIHRpbWVzLCB1c2luZyB0aGUgYXJndW1lbnQgYG5ib290YCB0byBjaG9vc2Ugbgp2YWx1ZSAoYnkgZGVmYXVsdCBuYm9vdD0xMDAwKS4gRm9yIHRoZSBgcGZDb21wb3NpdGVMRmAgZnVuY3Rpb24KY29uZmlkZW5jZSBpbnRlcnZhbHMgYXJlIGNhbGN1bGF0ZWQgYnkgYm9vdHN0cmFwIHJlc2FtcGxpbmcgdGhlCnByZWJpbm5lZCBzZXJpZXMgKGFzIG9wcG9zZWQgdG8gaW5kaXZpZHVhbCBzYW1wbGVzKSBhbmQgdGhlbiBhcHBseWluZwp0aGUgTE9XRVNTIGN1cnZlIGZpdHRpbmcuIFRoaXMgb3BlcmF0aW9uIGlzIHJlcGVhdGVkIG4gdGltZXMgYW5kIGlzCmRlZmluZWQgdXNpbmcgdGhlIGFyZ3VtZW50IGBuYm9vdGAuIFRoZSBjb25maWRlbmNlcyBpbnRlcnZhbHMgYXJlCmVzdGltYXRlZCBiYXNlZCBvbiB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSBib290c3RyYXAgcmVwbGljYXRlcy4KCk9iamVjdHMgb2YgdGhlIGNsYXNzIGBwZkNvbXBvc2l0ZWAgYW5kIGBwZkNvbXBvc2l0ZUxGYCBjYW4gYmUgcGxvdHRlZAp1c2luZyB0aGUgZ2VuZXJpYyBgcGxvdGAgZnVuY3Rpb24uIENvbmZpZGVuY2UgaW50ZXJ2YWxzIGFyZSBzcGVjaWZpZWQKdXNpbmcgdGhlIGBjb25mYCBhcmd1bWVudC4gVGhlIGBhZGQ9c2l0ZW51bWAgcGxvdCBmdW5jdGlvbiBhcmd1bWVudCBjYW4KYmUgdXNlZCB0byBkaXNwbGF5IHRoZSBudW1iZXIgb2YgY2hhcmNvYWwgc2l0ZXMgY29udHJpYnV0aW5nIHRvIGVhY2gKY29tcG9zaXRlIHZhbHVlIGF0IGVhY2ggdGltZSBzdGVwIChGaWd1cmUgMikuCgpgYGB7cn0KcGFyKG1mcm93PWMoMiwxKSkKcGxvdChDT01QMSxjb25mPWMoMC4wMjUsMC45NzUpLG1haW49IihhKSIpCnBsb3QoQ09NUDIsY29uZj1jKDAuMDUsMC45NSksbWFpbj0iKGIpIikKYGBgCgohW0NvbXBvc2l0ZSBjaGFyY29hbCBzZXJpZXMgZm9yIE5vcnRoIEVhc3Rlcm4gQW1lcmljYW4gc2l0ZXMuIChhKQpDb21wb3NpdGUgdmFsdWVzIGFuZCBhc3NvY2lhdGVkIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHVzaW5nIHRoZQpwZkNvbXBvc2l0ZSBmdW5jdGlvbi4gKGIpIENvbXBvc2l0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0ZWQgY29uZmlkZW5jZQppbnRlcnZhbHMgdXNpbmcgdGhlIHBmQ29tcG9zaXRlTEYgZnVuY3Rpb24gKGIpLiBEYXNoZWQgbGluZXMgY29ycmVzcG9uZAp0byB0aGUgOTcuNXRoLCAyLjV0aCBhbmQgOTV0aCwgMC41dGggcGVyY2VudGlsZXMKcmVzcGVjdGl2ZWx5Ll0KCipPcHRpb24gQipcCkJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscyBhcmUgdXN1YWxseSBjYWxjdWxhdGVkIGJ5IHJlc2FtcGxpbmcKdGhlIGNoYXJjb2FsIHNlcmllcyB3aXRoIHJlcGxhY2VtZW50IGluIG9yZGVyIHRvIHRlc3QgdGhlIHNlbnNpdGl2aXR5IG9mCnRoZSBjb21wb3NpdGUgcmVjb3JkIHRvIGluZGl2aWR1YWwgc2VyaWVzIChvciBzaXRlcywgb3B0aW9uIEEpLiBIb3dldmVyLApiZWNhdXNlIHRoZSB2YWx1ZXMgaW4gY2hhcmNvYWwgc2VyaWVzIGFyZSBhdXRvY29ycmVsYXRlZCwgdGVzdGluZyB0aGUKc2lnbmlmaWNhbmNlIG9mIHRoZWlyIHRlbXBvcmFsIHZhcmlhdGlvbnMgaXMgbm90IHN0cmFpZ2h0Zm9yd2FyZC4gQmxvY2sKYm9vdHN0cmFwIGhhcyBiZWVuIHByb3Bvc2VkIHRvIHRlc3QgdGhlIHNpZ25pZmljYW5jZSBvZiBjaGFuZ2VzIGluCnN0YXRpb25hcnkgdGltZSBzZXJpZXMgW0BLdW5zY2gxOTg5XS4gSGVyZSB3ZSBpbXBsZW1lbnRlZCBhIG5ldwpwcm9jZWR1cmUgaW4gdGhlIGBwYWxlb2ZpcmVgIHBhY2thZ2Ugb2Yg4oCcbW92aW5n4oCdIG9yIOKAnGNpcmN1bGFy4oCdIGJsb2NrCmJvb3RzdHJhcCwgd2hpY2ggY29uc2lzdHMgb2Ygc3BsaXR0aW5nIGVhY2ggY2hhcmNvYWwgc2VyaWVzIGludG8gJG4tYisxJApvdmVybGFwcGluZyBibG9ja3Mgb2YgZGF0YSwgd2hlcmUgJG4kIGlzIHNhbXBsZSBzaXplIGFuZCAkYiQgdGhlIGJsb2NrCnNpemUuIFRoZXNlIGJsb2NrcyBhcmUgcmFuZG9tbHkgc2VsZWN0ZWQgKHdpdGggcmVwbGFjZW1lbnQpIHRvCnJlY29uc3RydWN0IG5ldyBpbmRpdmlkdWFsIGNoYXJjb2FsIHNlcmllcyB0aGF0IGFyZSBpbiB0dXJuIHVzZWQgdG8KZXN0aW1hdGUgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGFyb3VuZCB0aGUgY2hhcmNvYWwgc2VyaWVzIGNvbXBvc2l0ZQptZWFuLiBUaGlzIHByb2NlZHVyZSBtYXkgZGFtcGVuIHRoZSBsb25nLXRlcm0gdHJlbmRzIGluIGRhdGEsCnBhcnRpY3VsYXJseSBpZiBpbmRpdmlkdWFsIHNpdGVzIHJlY29yZCBvcHBvc2luZyB0cmVuZHMuIElmIHRoZSBvYnNlcnZlZAp0cmVuZCBkb2VzIG5vdCBleGNlZWQgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLCB0aGVuIHRoZXJlIHRoZSBjb21wb3NpdGUKdmFsdWVzIGF0IHRoYXQgdGltZSBhcmUgbm90IGdyZWF0ZXIgdGhhbiBieSBjaGFuY2UgaWYgcmVjb3JkcyBhcmUgbm90IGF0CmFsbCBzeW5jaHJvbml6ZWQuIEhvd2V2ZXIsIGEgY29tcG9zaXRlIGN1cnZlIG5vdCBleGNlZWRpbmcgdGhlCmNvbmZpZGVuY2UgaW50ZXJ2YWxzIGRvZXMgbm90IGV4Y2x1ZGUgdGhlIG9jY3VycmVuY2Ugb2YgaW1wb3J0YW50IHRyZW5kcwppbiB0aGUgY29tcG9zaXRlIHNlcmllcy4gVGhpcyBwcm9jZWR1cmUgaXMgcmF0aGVyIHVzZWQgZm9yIHRlc3RpbmcgdGhlCnNpZ25pZmljYW5jZSBvZiBsb2NhbCBtaW5pbWEgb3IgbWF4aW1hIGluIHRoZSBjb21wb3NpdGUgdGltZSBzZXJpZXMuXApUaGUgb3B0aW1hbCBibG9jayBzaXplIGZvciBhIGdpdmVuIHNlcmllcyBpcyBnaXZlbiBieToKJGI9Mlx0aW1lcygtMS9sb2coXHJobykpJCwgd2hlcmUgJFxyaG8kIGlzIHRoZSBsYWcgb25lIGF1dG9jb3JyZWxhdGlvbgpjb2VmZmljaWVudCBvZiB0aGF0IHNlcmllcyBbQEFkYW1zMjAwM10uCgpUaGUgY2lyY3VsYXIgYmxvY2sgYm9vdHN0cmFwIG1ldGhvZCBpcyBjb21tb25seSB1c2VkIGluIFN1cGVycG9zZWQgRXBvY2gKQW5hbHlzaXMsIGEgY29tcG9zaXRpbmcgdGVjaG5pcXVlIHRoYXQgYWltcyB0byBmaW5kIHRoZSByZXNwb25zZSBvZiBhCnZhcmlhYmxlIHRvIG9uZSBvciBtdWx0aXBsZSBwYXJ0aWN1bGFyIGV2ZW50cywgZm9yIGluc3RhbmNlIGluc2VjdApvdXRicmVha3MgW0BOb2xhMjAwNiBlLmcuXSBvciBmaXJlcyBbQFN3ZXRuYW0xOTkzIGUuZy5dIHVzaW5nCmRlbmRyb2Nocm9ub2xvZ2ljYWwgc2VyaWVzIG9yIHBhbGVvZWNvbG9naWNhbCBwcm94eSBzZXJpZXMKW0BCbGFycXVlejIwMTBhXS4gVGhlIGBSYCBpbXBsZW1lbnRhdGlvbiBmb2xsb3dzIHRoZSBNYXRsYWIgU0VBIGZ1bmN0aW9uCmF2YWlsYWJsZSBhdCA8aHR0cDovL2JsYXJxdWV6LmNvbT4gdGhhdCB3YXMgaW5zcGlyZWQgYnkgQEFkYW1zMjAwMwptZXRob2RvbG9neS4gVGhlIGBwZkNpcmN1bGFyYCBmdW5jdGlvbiBpcyBjYWxsZWQgdXNpbmcgdGhlIGZvbGxvd2luZwpjb21tYW5kIGFuZCByZXR1cm5zIGFuIG9iamVjdCBvZiBjbGFzcyBgcGZDaXJjdWxhcmAgdGhhdCBjYW4gYmUgcGxvdHRlZAp1c2luZyB0aGUgZ2VuZXJpYyBwbG90IGZ1bmN0aW9uOgoKYGBge3J9CmNpcmNib290IDwtIHBmQ2lyY3VsYXIoQ09NUDEsIGI9TlVMTCwgbmJvb3Q9MTAwLAogICAgICAgICAgICAgICAgICAgICAgICBjb25mPWMoMC4wMDUsMC4wMjUsMC45NzUsMC45OTUpKQpwbG90KGNpcmNib290KQpgYGAKCgohW0NvbXBvc2l0ZSBtZWFuIG9mIGNoYXJjb2FsIHNlcmllcyBmb3IgRWFzdGVybiBOb3J0aCBBbWVyaWNhbiBzaXRlcwooYmxhY2sgbGluZSkgYW5kIGFzc29jaWF0ZWQgY29uZmlkZW5jZSBpbnRlcnZhbHMgZXN0aW1hdGVkIHVzaW5nIGEKY2lyY3VsYXIgYmxvY2sgYm9vdHN0cmFwIHByb2NlZHVyZSAoZGFzaGVkIGxpbmVzKS4gRGFzaGVkIGxpbmVzCmNvcnJlc3BvbmQgdG8gdGhlIDk5LjV0aCwgOTcuNXRoLCAyLjV0aCBhbmQgMC41dGggYm9vdHN0cmFwcGVkCnBlcmNlbnRpbGVzLCByZXNwZWN0aXZlbHkuXQoKVGhlIGBiPU5VTExgIGFyZ3VtZW50IGluZGljYXRlcyB0aGF0IHRoZSBibG9jayBzaXplIGlzIGF1dG9tYXRpY2FsbHkKY2FsY3VsYXRlZCBmb3IgZWFjaCBzZXJpZXMgdXNpbmcgdGhlIGZvcm11bGF0aW9uIGFib3ZlLgoKUmVzdWx0cyBpbnRlcnByZXRhdGlvbnMKPT09PT09PT09PT09PT09PT09PT09PT0KCk9uIGZpZ3VyZSAyLCB3ZSBzZWUgdGhhdCBiZWZvcmUgYy4gMTAsNTAwIGNhbCBCUCwgdGhlIHR3byBhcHByb2FjaGVzCihzaW1wbGUgYmlubmluZyBhbmQgTE9XRVNTIGZpdHRpbmcpIGdpdmUgZGlmZmVyZW50IHJlc3VsdHMuIEJlY2F1c2UgdGhlCmBwZkNvbXBvc2l0ZUxGYCB1c2VkIGEgbG9jYWwgcmVncmVzc2lvbiBhcHByb2FjaCB3aXRoIGEgYmFuZHdpZHRoIG9mCjEwMDAgeWVhcnMsIGNvbXBvc2l0ZSBlZGdlcyAoLTUwLTEwNTAgYW5kIDExMDAwLTEyMDAwIGNhbCBCUCBwZXJpb2RzKQptYXkgc3VmZmVyIGZyb20gYmlhcyAoZWRnZSBlZmZlY3QpLCBob3dldmVyIHRoaXMgYmlhcyBzaG91bGQgYmUgbWluaW1hbApoZXJlIGFuZCByZWR1Y2luZyBoaXMgZWZmZWN0IGRvZXMgbm90IGNoYW5nZSB0aGUgcmVzdWx0cyBzaWduaWZpY2FudGx5CihyZXN1bHRzIG5vdCBzaG93biBvZiBmb3IgYW4gYXBwbGljYXRpb24gb2YgdGhlIG1pbmltdW0tc2xvcGUgY29ycmVjdGlvbgphcHByb2FjaCBvZiBATWFubjIwMDQgW0BNYW5uMjAwOF0sIHdoaWNoIGlzIGltcGxlbWVudGVkIGluIHRoZQpwZkNvbXBvc2l0ZUxGIGZ1bmN0aW9uLCBzZWUgdGhlIGhlbHAgZm9yIHVzYWdlIGRldGFpbHMpLiBBZGRpdGlvbmFsbHkKdGhlIG51bWJlciBvZiBzaXRlcyBjb250cmlidXRpbmcgdG8gdGhlIG92ZXJhbGwgY29tcG9zaXRlIGN1cnZlIGJlZm9yZQoxMCw1MDAgY2FsIEJQIGlzIGxvdyAoJDwkIDMwIHNpdGVzKSBhbmQgdGh1cyB0aGUgY3VydmUgc2hvdWxkIGJlCmludGVycHJldGVkIHdpdGggY2F1dGlvbi4gVGhlIHBlcmlvZCBmcm9tIDEwLDUwMCB0byA4MDAwIGNhbCBCUCBhbmQgZnJvbQpjLiAyMDAgY2FsIEJQIHRvIHByZXNlbnQsIGRpc3BsYXlzIGxhcmdlIHBvc2l0aXZlIGFub21hbGllcyBpbiBjb21wb3NpdGUKdmFsdWVzIGZvciBib3RoIGFwcHJvYWNoZXMuIE9uIEZpZ3VyZSAzIHdlIHNlZSB0aGF0IHRoZSBwb3NpdGl2ZQpjaGFyY29hbCBjb21wb3NpdGUgYW5vbWFsaWVzIGR1cmluZyB0aGUgcGVyaW9kIDkwMDAtMTAgMDAwIGNhbCBCUCBhbmQKbmVnYXRpdmUgb25lcyBkdXJpbmcgdGhlIHBlcmlvZHMgNjAwMC03MDAwIGFuZCAxMCw1MDAtMTIsMDAwIGFyZQpzaWduaWZpY2FudGx5IGRpZmZlcmVudCBmcm9tIGEgMTIsMDAwIHllYXIgbGluZWFyIHRyZW5kIGFuZCBleGNlZWQgdGhlCjk1dGggY29uZmlkZW5jZSBpbnRlcnZhbCByYW5nZSBnaXZlbiBieSB0aGUgY2lyY3VsYXIgYmxvY2sgYm9vdHN0cmFwCnByb2NlZHVyZSAoRmlnIDMpLiBIb3dldmVyLCBsYXJnZSBjbGFzc2ljYWwgKHNpdGUgcmVzYW1wbGluZyBiYXNlZCkKY29uZmlkZW5jZSBpbnRlcnZhbHMgZHVyaW5nIHRoZSAxMCw1MDAtMTIsMDAwIGNhbCBCUCBwZXJpb2QgaW5kaWNhdGUKdGhhdCB0aGUgcmVzcG9uc2UgaXMgbm90IGhvbW9nZW5lb3VzIGFtb25nIHRoZSBjaGFyY29hbCBzZXJpZXMgKEZpZwoyYS1iKS4gVGhlIG5lZ2F0aXZlIGNvbXBvc2l0ZSB2YWx1ZXMgYXQgNjAwMC03MDAwIGNhbCBCUCBhcmUgYXNzb2NpYXRlZAp3aXRoIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHRoYXQgYXJlIG5hcnJvd2VyIGNvbXBhcmVkIHRvIHByZXZpb3VzIHBlcmlvZHMKaW5kaWNhdGluZyB0aGF0IHRoZSB3aXRoaW4tc2l0ZXMgcmVzcG9uc2UgaXMgcmVsYXRpdmVseSBob21vZ2VuZW91cyBhbmQKdGh1cyBsaWtlbHkgcmVsYXRlZCB0byBmb3JjaW5nIGZhY3RvcnMgb2NjdXJyaW5nIGF0IGEgYnJvYWQgc3BhdGlhbApzY2FsZSAoZS5nLiBjbGltYXRlKS4KCkNvbmNsdXNpb24KPT09PT09PT09PQoKV2UgaGF2ZSBwcmVzZW50ZWQgdGhlIGBwYWxlb2ZpcmVgIHBhY2thZ2UgdGhhdCBhbGxvd3MgdGhlIHBhbGVvZmlyZQpjb21tdW5pdHkgdG8gZWFzaWx5IGludGVycm9nYXRlIGRhdGEgY29udGFpbmVkIHdpdGhpbiB0aGUgR2xvYmFsCkNoYXJjb2FsIERhdGFiYXNlIGFuZCB0byBwZXJmb3JtIHRoZSBhbmFseXRpY2FsIHN0ZXBzIHJlcXVpcmVkIHRvCnByb2R1Y2UgYSByZWdpb25hbCBjaGFyY29hbCBzeW50aGVzaXMgdXNpbmcgYSBmZXcgc2ltcGxlIGNvbW1hbmRzLiBUaGUKYHBhbGVvZmlyZWAgcGFja2FnZSBpbnRyb2R1Y2VzIHNvbWUgbmV3IGFuYWx5c2VzIHN1Y2ggYXMgdGhlIGNpcmN1bGFyCmJsb2NrLWJvb3RzdHJhcCBwcm9jZWR1cmUgYW5kIHZhcmlvdXMgbmV3IGNoYXJjb2FsIGRhdGEtdHJhbnNmb3JtYXRpb24KdGVjaG5pcXVlcyBhbmQgYmFja2dyb3VuZC1lc3RpbWF0aW9uIHByb2NlZHVyZXMuIFRoZSBwYWNrYWdlIGFsc28KcHJvdmlkZXMgYW4gaW50ZWdyYXRlZCByZXNlYXJjaCBmcmFtZXdvcmsgbGlua2luZyB0aGUgR0NEIHRvIHRoZQpvcGVuLXNvdXJjZSBgUmAgc3RhdGlzdGljYWwgbGFuZ3VhZ2UuIFRoZSBpbXBsZW1lbnRlZCBmZWF0dXJlcyBhcmUKbGlrZWx5IHRvIGJlIGV4dGVuZGVkIGJ5IGZ1dHVyZSByZWxlYXNlcyBhbmQgbmV3IGltcGxlbWVudGF0aW9ucyB0aGF0CndpbGwgaW5jcmVhc2UgYHBhbGVvZmlyZWAgY2FwYWJpbGl0aWVzLCBzdWNoIGFzIHNwYXRpby10ZW1wb3JhbApjbHVzdGVyaW5nLCB3aGljaCBpcyBjdXJyZW50bHkgaW4gZGV2ZWxvcG1lbnQuIFRoZSBzdGFibGUgcmVsZWFzZSBvZgpgcGFsZW9maXJlYCBpcyBhdmFpbGFibGUgZnJvbSB0aGUgQ1JBTiB3ZWJzaXRlIGJ1dCB1c2VycyBtYXkgY2hvb3NlIHRvCnRlc3QgZGV2ZWxvcG1lbnQgcmVsZWFzZXMgZnJvbSBHaXQKKDxodHRwczovL2dpdGh1Yi5jb20vcGFsZW9maXJlL3BhbGVvZmlyZT4pLiBXZSBob3BlIGBwYWxlb2ZpcmVgIHdpbGwgYmUKb2YgYnJvYWQgaW50ZXJlc3QgdG8gZmlyZSBzY2llbnRpc3RzIGFuZCBlY29zeXN0ZW0gbWFuYWdlcnMsIGFuZCB3ZQplbmNvdXJhZ2UgaXRzIHVzZSB0byBwZXJmb3JtIG9yaWdpbmFsIHJlc2VhcmNoIGFuZCB3ZWxjb21lIGFueQpkZXZlbG9wbWVudCByZXF1ZXN0cyBhbmQgZmVlZGJhY2suCgpBY2tub3dsZWRnZW1lbnRzCj09PT09PT09PT09PT09PT0KCldlIHdpc2ggdG8gdGhhbmsgYWxsIGRhdGEgY29udHJpYnV0b3JzIHRvIHRoZSBHQ0QsIFBBR0VTIHdvcmtzaG9wCmZ1bmRpbmcsIHRoZSBVTVIgQ2hyb25vLUVudmlyb25uZW1lbnQsIHRoZSBVbml2ZXJzaXR5IG9mIEZyYW5jaGUtQ29tdMOpCmFuZCB0aGUgUsOpZ2lvbiBvZiBGcmFuY2hlLUNvbXTDqSBmb3Igc3VwcG9ydGluZyB0aGUgR2xvYmFsIFBhbGVvZmlyZQpXb3JraW5nIEdyb3VwIHdvcmtzaG9wIGluIEZyYXNuZSAoT2N0b2JlciAyMDEzKS4gT0Igd2FzIHN1cHBvcnRlZCBieSBhCnBvc3Rkb2N0b3JhbCBncmFudCBmcm9tIHRoZSBGb25kcyBRdcOpYsOpY29pcyBkZSBsYSBSZWNoZXJjaGUgc3VyIGxhCk5hdHVyZSBldCBsZXMgVGVjaG5vbG9naWVzIGFuZCB0aGUgRk9OQ0VSIHByb2dyYW0uIEpNIHdhcyBzdXBwb3J0ZWQgYnkKTlNGIGdyYW50IEVGLTEyNDE4NzAuCgpSZWZlcmVuY2VzCj09PT09PT09PT0KCgoKCg==