analisis DRIS,realizado en base al curso de Nutricon vegetal Universidad de Caldas 2016.

datos iniciales de analisis foliares del cultivo de papa en fincas del Departamento de Caldas.

primero,se sube el archivo de analisis foliares que llamaremos Relaciones_binarias,el cual se ha subido en formato “data.frame” con Rstudio

library(readxl)
Relaciones_binarias <- read_excel("~/Descargas/1.xlsx")
View(Relaciones_binarias)

segundo,se calculan las variables para el analisis DRIS,por el metodo en R de agregar columnas al “data.frame” relaciones con Nitrogeno


#relacion nitrogeno fosforo
Relaciones_binarias$`N/P`<-Relaciones_binarias$`% N`/Relaciones_binarias$`% P`

Relaciones_binarias$`P/N`<-Relaciones_binarias$`% P`/Relaciones_binarias$`% N`

#relacion nitrogeno potasio

Relaciones_binarias$`N/K`<-Relaciones_binarias$`% N`/Relaciones_binarias$`% K`
Relaciones_binarias$`K/N`<-Relaciones_binarias$`% K`/Relaciones_binarias$`% N`

#relacion nitrogeno Calcio

Relaciones_binarias$`N/Ca`<-Relaciones_binarias$`% N`/Relaciones_binarias$`% Ca`
Relaciones_binarias$`Ca/N`<-Relaciones_binarias$`% Ca`/Relaciones_binarias$`% N`

#relacion nitrogeno Magnesio
Relaciones_binarias$`N/Mg`<-Relaciones_binarias$`% N`/Relaciones_binarias$`% Mg`
Relaciones_binarias$`Mg/N`<-Relaciones_binarias$`% Mg`/Relaciones_binarias$`% N`

#relacion nitrogeno Azufre
Relaciones_binarias$`N/S`<-Relaciones_binarias$`% N`/Relaciones_binarias$`% S`
Relaciones_binarias$`S/N`<-Relaciones_binarias$`% S`/Relaciones_binarias$`% N`

#para aquellos elementos que se presentan como partes por millon se debe multiplicar el elemento presentado como %, por 100.

#relacion nitrogeno Hierro
Relaciones_binarias$`N/Fe`<-((Relaciones_binarias$`% N`)*100)/Relaciones_binarias$`Fe ppm`
Relaciones_binarias$`Fe/N`<-Relaciones_binarias$`Fe ppm`/((Relaciones_binarias$`% N`)*100)

#relacion nitrogeno Boro

Relaciones_binarias$`N/B`<-((Relaciones_binarias$`% N`)*100)/Relaciones_binarias$`B ppm`
Relaciones_binarias$`B/N`<-Relaciones_binarias$`B ppm`/((Relaciones_binarias$`% N`)*100)

#relacion nitrogeno Zinc

Relaciones_binarias$`N/Zn`<-((Relaciones_binarias$`% N`)*100)/Relaciones_binarias$`Zn ppm`
Relaciones_binarias$`Zn/N`<-Relaciones_binarias$`Zn ppm`/((Relaciones_binarias$`% N`)*100)

#relacion nitrogeno Manganeso

Relaciones_binarias$`N/Mn`<-((Relaciones_binarias$`% N`)*100)/Relaciones_binarias$`Mn ppm`
Relaciones_binarias$`Mn/N`<-Relaciones_binarias$`Mn ppm`/((Relaciones_binarias$`% N`)*100)

#relacion nitrogeno Cobre

Relaciones_binarias$`N/Cu`<-((Relaciones_binarias$`% N`)*100)/Relaciones_binarias$`Cu ppm`
Relaciones_binarias$`Cu/N`<-Relaciones_binarias$`Cu ppm`/((Relaciones_binarias$`% N`)*100)

relaciones con Fosforo. como ya se han calculado las relaciones con Nitrogeno estas se han omitido.

#relacion fosforo potasio

Relaciones_binarias$`P/K`<-Relaciones_binarias$`% P`/Relaciones_binarias$`% K`
Relaciones_binarias$`K/P`<-Relaciones_binarias$`% K`/Relaciones_binarias$`% P`

#relacion fosforo Calcio

Relaciones_binarias$`P/Ca`<-Relaciones_binarias$`% P`/Relaciones_binarias$`% Ca`
Relaciones_binarias$`Ca/P`<-Relaciones_binarias$`% Ca`/Relaciones_binarias$`% P`

#relacion fosforo Magnesio
Relaciones_binarias$`P/Mg`<-Relaciones_binarias$`% P`/Relaciones_binarias$`% Mg`
Relaciones_binarias$`Mg/P`<-Relaciones_binarias$`% Mg`/Relaciones_binarias$`% P`

#relacion fosforo Azufre
Relaciones_binarias$`P/S`<-Relaciones_binarias$`% P`/Relaciones_binarias$`% S`
Relaciones_binarias$`S/P`<-Relaciones_binarias$`% S`/Relaciones_binarias$`% P`

#para aquellos elementos que se presentan como partes por millon se debe multiplicar el elemento presentado como %, por 100.

#relacion fosforo Hierro
Relaciones_binarias$`P/Fe`<-((Relaciones_binarias$`% P`)*100)/Relaciones_binarias$`Fe ppm`
Relaciones_binarias$`Fe/P`<-Relaciones_binarias$`Fe ppm`/((Relaciones_binarias$`% P`)*100)

#relacion fosforo Boro

Relaciones_binarias$`P/B`<-((Relaciones_binarias$`% P`)*100)/Relaciones_binarias$`B ppm`
Relaciones_binarias$`B/P`<-Relaciones_binarias$`B ppm`/((Relaciones_binarias$`% P`)*100)

#relacion fosforo Zinc

Relaciones_binarias$`P/Zn`<-((Relaciones_binarias$`% P`)*100)/Relaciones_binarias$`Zn ppm`
Relaciones_binarias$`Zn/P`<-Relaciones_binarias$`Zn ppm`/((Relaciones_binarias$`% P`)*100)

#relacion fosforo Manganeso

Relaciones_binarias$`P/Mn`<-((Relaciones_binarias$`% P`)*100)/Relaciones_binarias$`Mn ppm`
Relaciones_binarias$`Mn/P`<-Relaciones_binarias$`Mn ppm`/((Relaciones_binarias$`% P`)*100)

#relacion fosforo Cobre

Relaciones_binarias$`P/Cu`<-((Relaciones_binarias$`% P`)*100)/Relaciones_binarias$`Cu ppm`
Relaciones_binarias$`Cu/P`<-Relaciones_binarias$`Cu ppm`/((Relaciones_binarias$`% P`)*100)

relaciones con Potasio. como ya se han calculado las relaciones con Nitrogeno y fosforo estas se han omitido.

#relacion potasio Calcio

Relaciones_binarias$`K/Ca`<-Relaciones_binarias$`% K`/Relaciones_binarias$`% Ca`
Relaciones_binarias$`Ca/K`<-Relaciones_binarias$`% Ca`/Relaciones_binarias$`% K`

#relacion potasio Magnesio
Relaciones_binarias$`K/Mg`<-Relaciones_binarias$`% K`/Relaciones_binarias$`% Mg`
Relaciones_binarias$`Mg/K`<-Relaciones_binarias$`% Mg`/Relaciones_binarias$`% K`

#relacion potasio Azufre
Relaciones_binarias$`K/S`<-Relaciones_binarias$`% K`/Relaciones_binarias$`% S`
Relaciones_binarias$`S/K`<-Relaciones_binarias$`% S`/Relaciones_binarias$`% K`

#para aquellos elementos que se presentan como partes por millon se debe multiplicar el elemento presentado como %, por 100.

#relacion potasio Hierro
Relaciones_binarias$`K/Fe`<-((Relaciones_binarias$`% K`)*100)/Relaciones_binarias$`Fe ppm`
Relaciones_binarias$`Fe/K`<-Relaciones_binarias$`Fe ppm`/((Relaciones_binarias$`% K`)*100)

#relacion potasio Boro

Relaciones_binarias$`K/B`<-((Relaciones_binarias$`% K`)*100)/Relaciones_binarias$`B ppm`
Relaciones_binarias$`B/K`<-Relaciones_binarias$`B ppm`/((Relaciones_binarias$`% K`)*100)

#relacion potasio Zinc

Relaciones_binarias$`K/Zn`<-((Relaciones_binarias$`% K`)*100)/Relaciones_binarias$`Zn ppm`
Relaciones_binarias$`Zn/K`<-Relaciones_binarias$`Zn ppm`/((Relaciones_binarias$`% K`)*100)

#relacion potasio Manganeso

Relaciones_binarias$`K/Mn`<-((Relaciones_binarias$`% K`)*100)/Relaciones_binarias$`Mn ppm`
Relaciones_binarias$`Mn/K`<-Relaciones_binarias$`Mn ppm`/((Relaciones_binarias$`% K`)*100)

#relacion potasio Cobre

Relaciones_binarias$`K/Cu`<-((Relaciones_binarias$`% K`)*100)/Relaciones_binarias$`Cu ppm`
Relaciones_binarias$`Cu/K`<-Relaciones_binarias$`Cu ppm`/((Relaciones_binarias$`% K`)*100)

relaciones con Calcio. como ya se han calculado las relaciones con Nitrogeno, Fosforo y Potasio estas se han omitido.

#relacion Calcio Magnesio
Relaciones_binarias$`Ca/Mg`<-Relaciones_binarias$`% Ca`/Relaciones_binarias$`% Mg`
Relaciones_binarias$`Mg/Ca`<-Relaciones_binarias$`% Mg`/Relaciones_binarias$`% Ca`

#relacion Calcio Azufre
Relaciones_binarias$`Ca/S`<-Relaciones_binarias$`% Ca`/Relaciones_binarias$`% S`
Relaciones_binarias$`S/Ca`<-Relaciones_binarias$`% S`/Relaciones_binarias$`% Ca`

#para aquellos elementos que se presentan como partes por millon se debe multiplicar el elemento presentado como %, por 100.

#relacion Calcio Hierro
Relaciones_binarias$`Ca/Fe`<-((Relaciones_binarias$`% Ca`)*100)/Relaciones_binarias$`Fe ppm`
Relaciones_binarias$`Fe/Ca`<-Relaciones_binarias$`Fe ppm`/((Relaciones_binarias$`% Ca`)*100)

#relacion Calcio Boro

Relaciones_binarias$`Ca/B`<-((Relaciones_binarias$`% Ca`)*100)/Relaciones_binarias$`B ppm`
Relaciones_binarias$`B/Ca`<-Relaciones_binarias$`B ppm`/((Relaciones_binarias$`% Ca`)*100)

#relacion Calcio Zinc

Relaciones_binarias$`Ca/Zn`<-((Relaciones_binarias$`% Ca`)*100)/Relaciones_binarias$`Zn ppm`
Relaciones_binarias$`Zn/Ca`<-Relaciones_binarias$`Zn ppm`/((Relaciones_binarias$`% Ca`)*100)

#relacion Calcio Manganeso

Relaciones_binarias$`Ca/Mn`<-((Relaciones_binarias$`% Ca`)*100)/Relaciones_binarias$`Mn ppm`
Relaciones_binarias$`Mn/Ca`<-Relaciones_binarias$`Mn ppm`/((Relaciones_binarias$`% Ca`)*100)

#relacion Calcio Cobre

Relaciones_binarias$`Ca/Cu`<-((Relaciones_binarias$`% Ca`)*100)/Relaciones_binarias$`Cu ppm`
Relaciones_binarias$`Cu/Ca`<-Relaciones_binarias$`Cu ppm`/((Relaciones_binarias$`% Ca`)*100)

relaciones con Magnesio. como ya se han calculado las relaciones con Nitrogeno, Fosforo,Potasio y Calcio estas se han omitido.

#relacion Magnesio Azufre
Relaciones_binarias$`Mg/S`<-Relaciones_binarias$`% Mg`/Relaciones_binarias$`% S`
Relaciones_binarias$`S/Mg`<-Relaciones_binarias$`% S`/Relaciones_binarias$`% Mg`

#para aquellos elementos que se presentan como partes por millon se debe multiplicar el elemento presentado como %, por 100.

#relacion Magnesio Hierro
Relaciones_binarias$`Mg/Fe`<-((Relaciones_binarias$`% Mg`)*100)/Relaciones_binarias$`Fe ppm`
Relaciones_binarias$`Fe/Mg`<-Relaciones_binarias$`Fe ppm`/((Relaciones_binarias$`% Mg`)*100)

#relacion Magnesio Boro

Relaciones_binarias$`Mg/B`<-((Relaciones_binarias$`% Mg`)*100)/Relaciones_binarias$`B ppm`
Relaciones_binarias$`B/Mg`<-Relaciones_binarias$`B ppm`/((Relaciones_binarias$`% Mg`)*100)

#relacion Magnesio Zinc

Relaciones_binarias$`Mg/Zn`<-((Relaciones_binarias$`% Mg`)*100)/Relaciones_binarias$`Zn ppm`
Relaciones_binarias$`Zn/Mg`<-Relaciones_binarias$`Zn ppm`/((Relaciones_binarias$`% Mg`)*100)

#relacion Magnesio Manganeso

Relaciones_binarias$`Mg/Mn`<-((Relaciones_binarias$`% Mg`)*100)/Relaciones_binarias$`Mn ppm`
Relaciones_binarias$`Mn/Mg`<-Relaciones_binarias$`Mn ppm`/((Relaciones_binarias$`% Mg`)*100)

#relacion Magnesio Cobre

Relaciones_binarias$`Mg/Cu`<-((Relaciones_binarias$`% Mg`)*100)/Relaciones_binarias$`Cu ppm`
Relaciones_binarias$`Cu/Mg`<-Relaciones_binarias$`Cu ppm`/((Relaciones_binarias$`% Mg`)*100)

relaciones con Azufre. como ya se han calculado las relaciones con Nitrogeno, Fosforo,Potasio,Calcio y Magnesio estas se han omitido.



#para aquellos elementos que se presentan como partes por millon se debe multiplicar el elemento presentado como %, por 100.

#relacion Azufre Hierro
Relaciones_binarias$`S/Fe`<-((Relaciones_binarias$`% S`)*100)/Relaciones_binarias$`Fe ppm`
Relaciones_binarias$`Fe/S`<-Relaciones_binarias$`Fe ppm`/((Relaciones_binarias$`% S`)*100)

#relacion Azufre Boro

Relaciones_binarias$`S/B`<-((Relaciones_binarias$`% S`)*100)/Relaciones_binarias$`B ppm`
Relaciones_binarias$`B/S`<-Relaciones_binarias$`B ppm`/((Relaciones_binarias$`% S`)*100)

#relacion Azufre Zinc

Relaciones_binarias$`S/Zn`<-((Relaciones_binarias$`% S`)*100)/Relaciones_binarias$`Zn ppm`
Relaciones_binarias$`Zn/S`<-Relaciones_binarias$`Zn ppm`/((Relaciones_binarias$`% S`)*100)

#relacion Azufre Manganeso

Relaciones_binarias$`S/Mn`<-((Relaciones_binarias$`% S`)*100)/Relaciones_binarias$`Mn ppm`
Relaciones_binarias$`Mn/S`<-Relaciones_binarias$`Mn ppm`/((Relaciones_binarias$`% S`)*100)

#relacion Azufre Cobre

Relaciones_binarias$`S/Cu`<-((Relaciones_binarias$`% S`)*100)/Relaciones_binarias$`Cu ppm`
Relaciones_binarias$`Cu/S`<-Relaciones_binarias$`Cu ppm`/((Relaciones_binarias$`% S`)*100)

relaciones con Hierro. como Hierro es presentado en el analisi de suelos como ppm,no es necesario multiplicar por 100 para las variables que se presentan como ppm. como ya se han calculado las relaciones con Nitrogeno, Fosforo,Potasio,Calcio,Magnesio y Azufre estas se han omitido.


#relacion Hierro Boro

Relaciones_binarias$`Fe ppm/B`<-(Relaciones_binarias$`Fe ppm`)/Relaciones_binarias$`B ppm`
Relaciones_binarias$`B/Fe ppm`<-Relaciones_binarias$`B ppm`/(Relaciones_binarias$`Fe ppm`)

#relacion Hierro Zinc

Relaciones_binarias$`Fe ppm/Zn`<-(Relaciones_binarias$`Fe ppm`)/Relaciones_binarias$`Zn ppm`
Relaciones_binarias$`Zn/Fe ppm`<-Relaciones_binarias$`Zn ppm`/(Relaciones_binarias$`Fe ppm`)

#relacion Hierro Manganeso

Relaciones_binarias$`Fe ppm/Mn`<-(Relaciones_binarias$`Fe ppm`)/Relaciones_binarias$`Mn ppm`
Relaciones_binarias$`Mn/Fe ppm`<-Relaciones_binarias$`Mn ppm`/(Relaciones_binarias$`Fe ppm`)

#relacion Hierro Cobre

Relaciones_binarias$`Fe ppm/Cu`<-(Relaciones_binarias$`Fe ppm`)/Relaciones_binarias$`Cu ppm`
Relaciones_binarias$`Cu/Fe ppm`<-Relaciones_binarias$`Cu ppm`/(Relaciones_binarias$`Fe ppm`)

relaciones con Boro. como Boro es presentado en el analisi de suelos como ppm,no es necesario multiplicar por 100 para las variables que se presentan como ppm. como ya se han calculado las relaciones con Nitrogeno, Fosforo,Potasio,Calcio,Magnesio,Azufre y Hierro estas se han omitido.

#relacion Boro Zinc

Relaciones_binarias$`B ppm/Zn`<-(Relaciones_binarias$`B ppm`)/Relaciones_binarias$`Zn ppm`
Relaciones_binarias$`Zn/B ppm`<-Relaciones_binarias$`Zn ppm`/(Relaciones_binarias$`B ppm`)

#relacion Boro Manganeso

Relaciones_binarias$`B ppm/Mn`<-(Relaciones_binarias$`B ppm`)/Relaciones_binarias$`Mn ppm`
Relaciones_binarias$`Mn/B ppm`<-Relaciones_binarias$`Mn ppm`/(Relaciones_binarias$`B ppm`)

#relacion Boro Cobre

Relaciones_binarias$`B ppm/Cu`<-(Relaciones_binarias$`B ppm`)/Relaciones_binarias$`Cu ppm`
Relaciones_binarias$`Cu/B ppm`<-Relaciones_binarias$`Cu ppm`/(Relaciones_binarias$`B ppm`)

relaciones con Zinc. como Zinc es presentado en el analisi de suelos como ppm,no es necesario multiplicar por 100 para las variables que se presentan como ppm. como ya se han calculado las relaciones con Nitrogeno, Fosforo,Potasio,Calcio,Magnesio,Azufre,Hierro y Boro estas se han omitido.

#relacion Zinc  Manganeso

Relaciones_binarias$`Zn ppm/Mn`<-(Relaciones_binarias$`Zn ppm`)/Relaciones_binarias$`Mn ppm`
Relaciones_binarias$`Mn/Zn ppm`<-Relaciones_binarias$`Mn ppm`/(Relaciones_binarias$`Zn ppm`)

#relacion Zinc Cobre

Relaciones_binarias$`Zn ppm/Cu`<-(Relaciones_binarias$`Zn ppm`)/Relaciones_binarias$`Cu ppm`
Relaciones_binarias$`Cu/Zn ppm`<-Relaciones_binarias$`Cu ppm`/(Relaciones_binarias$`Zn ppm`)

relaciones con Cobre y Manganeso. como Cobre y Manganeso es presentado en el analisi de suelos como ppm,no es necesario multiplicar por 100 para las variables que se presentan como ppm. como ya se han calculado las relaciones con Nitrogeno, Fosforo,Potasio,Calcio,Magnesio,Azufre,Hierro,Boro y Zinc

#relacion Manganeso Cobre

Relaciones_binarias$`Mn ppm/Cu`<-(Relaciones_binarias$`Mn ppm`)/Relaciones_binarias$`Cu ppm`
Relaciones_binarias$`Cu/Mn ppm`<-Relaciones_binarias$`Cu ppm`/(Relaciones_binarias$`Mn ppm`)
head(Relaciones_binarias)

si desearamos corregir datos del data.frame


##  fix(Relaciones_binarias)

estadisticas de todas las columnas


seleccion<-Relaciones_binarias[,14:123]
media<-apply(seleccion,2,mean)
varianza<-apply(seleccion,2,var)
desviacion_estandar<-apply(seleccion,2,sd)

data.frame con la estasdisticas

estadisticas<-data.frame(media,varianza,desviacion_estandar)

agregamos la columna coeficiente de variacion que nos servira mas adelante para el analisis DRIS

estadisticas$coeficiente_de_variacion<-estadisticas$desviacion_estandar/estadisticas$media

para arreglar la tabla de estadisticas en una manera comoda de ver utilizamos la funcion t(),para transponer los datos

estadisticas_en_filas<-t(estadisticas)
LS0tCnRpdGxlOiAiYW5hbGlzaXMgRFJJU3MiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCgphbmFsaXNpcyBEUklTLHJlYWxpemFkbyBlbiBiYXNlIGFsIGN1cnNvIGRlIE51dHJpY29uIHZlZ2V0YWwgVW5pdmVyc2lkYWQgZGUgQ2FsZGFzIDIwMTYuCgpkYXRvcyBpbmljaWFsZXMgZGUgYW5hbGlzaXMgZm9saWFyZXMgZGVsIGN1bHRpdm8gZGUgcGFwYSBlbiBmaW5jYXMgZGVsIERlcGFydGFtZW50byBkZSBDYWxkYXMuCgpwcmltZXJvLHNlIHN1YmUgZWwgYXJjaGl2byBkZSBhbmFsaXNpcyBmb2xpYXJlcyAgcXVlIGxsYW1hcmVtb3MgUmVsYWNpb25lc19iaW5hcmlhcyxlbCBjdWFsIHNlIGhhIHN1YmlkbyBlbiBmb3JtYXRvICJkYXRhLmZyYW1lIiBjb24gUnN0dWRpbwoKYGBge3J9CmxpYnJhcnkocmVhZHhsKQpSZWxhY2lvbmVzX2JpbmFyaWFzIDwtIHJlYWRfZXhjZWwoIn4vRGVzY2FyZ2FzLzEueGxzeCIpClZpZXcoUmVsYWNpb25lc19iaW5hcmlhcykKYGBgCgoKc2VndW5kbyxzZSBjYWxjdWxhbiBsYXMgdmFyaWFibGVzIHBhcmEgZWwgYW5hbGlzaXMgRFJJUyxwb3IgZWwgbWV0b2RvIGVuIFIgZGUgYWdyZWdhciBjb2x1bW5hcyBhbCAiZGF0YS5mcmFtZSIKcmVsYWNpb25lcyBjb24gTml0cm9nZW5vCgpgYGB7ciByZWxhY2lvbmVzIGNvbiBOaXRyb2dlbm99CgojcmVsYWNpb24gbml0cm9nZW5vIGZvc2Zvcm8KUmVsYWNpb25lc19iaW5hcmlhcyRgTi9QYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgJSBOYC9SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIFBgCgpSZWxhY2lvbmVzX2JpbmFyaWFzJGBQL05gPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIFBgL1JlbGFjaW9uZXNfYmluYXJpYXMkYCUgTmAKCiNyZWxhY2lvbiBuaXRyb2dlbm8gcG90YXNpbwoKUmVsYWNpb25lc19iaW5hcmlhcyRgTi9LYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgJSBOYC9SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIEtgClJlbGFjaW9uZXNfYmluYXJpYXMkYEsvTmA8LVJlbGFjaW9uZXNfYmluYXJpYXMkYCUgS2AvUmVsYWNpb25lc19iaW5hcmlhcyRgJSBOYAoKI3JlbGFjaW9uIG5pdHJvZ2VubyBDYWxjaW8KClJlbGFjaW9uZXNfYmluYXJpYXMkYE4vQ2FgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE5gL1JlbGFjaW9uZXNfYmluYXJpYXMkYCUgQ2FgClJlbGFjaW9uZXNfYmluYXJpYXMkYENhL05gPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIENhYC9SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE5gCgojcmVsYWNpb24gbml0cm9nZW5vIE1hZ25lc2lvClJlbGFjaW9uZXNfYmluYXJpYXMkYE4vTWdgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE5gL1JlbGFjaW9uZXNfYmluYXJpYXMkYCUgTWdgClJlbGFjaW9uZXNfYmluYXJpYXMkYE1nL05gPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE1nYC9SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE5gCgojcmVsYWNpb24gbml0cm9nZW5vIEF6dWZyZQpSZWxhY2lvbmVzX2JpbmFyaWFzJGBOL1NgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE5gL1JlbGFjaW9uZXNfYmluYXJpYXMkYCUgU2AKUmVsYWNpb25lc19iaW5hcmlhcyRgUy9OYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgJSBTYC9SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE5gCgojcGFyYSBhcXVlbGxvcyBlbGVtZW50b3MgcXVlIHNlIHByZXNlbnRhbiBjb21vIHBhcnRlcyBwb3IgbWlsbG9uIHNlIGRlYmUgbXVsdGlwbGljYXIgZWwgZWxlbWVudG8gcHJlc2VudGFkbyBjb21vICUsIHBvciAxMDAuCgojcmVsYWNpb24gbml0cm9nZW5vIEhpZXJybwpSZWxhY2lvbmVzX2JpbmFyaWFzJGBOL0ZlYDwtKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE5gKSoxMDApL1JlbGFjaW9uZXNfYmluYXJpYXMkYEZlIHBwbWAKUmVsYWNpb25lc19iaW5hcmlhcyRgRmUvTmA8LVJlbGFjaW9uZXNfYmluYXJpYXMkYEZlIHBwbWAvKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE5gKSoxMDApCgojcmVsYWNpb24gbml0cm9nZW5vIEJvcm8KClJlbGFjaW9uZXNfYmluYXJpYXMkYE4vQmA8LSgoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBOYCkqMTAwKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBCIHBwbWAKUmVsYWNpb25lc19iaW5hcmlhcyRgQi9OYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgQiBwcG1gLygoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBOYCkqMTAwKQoKI3JlbGFjaW9uIG5pdHJvZ2VubyBaaW5jCgpSZWxhY2lvbmVzX2JpbmFyaWFzJGBOL1puYDwtKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE5gKSoxMDApL1JlbGFjaW9uZXNfYmluYXJpYXMkYFpuIHBwbWAKUmVsYWNpb25lc19iaW5hcmlhcyRgWm4vTmA8LVJlbGFjaW9uZXNfYmluYXJpYXMkYFpuIHBwbWAvKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE5gKSoxMDApCgojcmVsYWNpb24gbml0cm9nZW5vIE1hbmdhbmVzbwoKUmVsYWNpb25lc19iaW5hcmlhcyRgTi9NbmA8LSgoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBOYCkqMTAwKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYE1uL05gPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG1gLygoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBOYCkqMTAwKQoKI3JlbGFjaW9uIG5pdHJvZ2VubyBDb2JyZQoKUmVsYWNpb25lc19iaW5hcmlhcyRgTi9DdWA8LSgoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBOYCkqMTAwKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBDdSBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYEN1L05gPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGBDdSBwcG1gLygoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBOYCkqMTAwKQoKCgpgYGAKCnJlbGFjaW9uZXMgY29uIEZvc2Zvcm8uCmNvbW8geWEgc2UgaGFuIGNhbGN1bGFkbyBsYXMgcmVsYWNpb25lcyBjb24gTml0cm9nZW5vIGVzdGFzIHNlIGhhbiBvbWl0aWRvLgoKCgpgYGB7ciByZWxhY2lvbmVzIGNvbiBGb3Nmb3JvfQojcmVsYWNpb24gZm9zZm9ybyBwb3Rhc2lvCgpSZWxhY2lvbmVzX2JpbmFyaWFzJGBQL0tgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIFBgL1JlbGFjaW9uZXNfYmluYXJpYXMkYCUgS2AKUmVsYWNpb25lc19iaW5hcmlhcyRgSy9QYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgJSBLYC9SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIFBgCgojcmVsYWNpb24gZm9zZm9ybyBDYWxjaW8KClJlbGFjaW9uZXNfYmluYXJpYXMkYFAvQ2FgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIFBgL1JlbGFjaW9uZXNfYmluYXJpYXMkYCUgQ2FgClJlbGFjaW9uZXNfYmluYXJpYXMkYENhL1BgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIENhYC9SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIFBgCgojcmVsYWNpb24gZm9zZm9ybyBNYWduZXNpbwpSZWxhY2lvbmVzX2JpbmFyaWFzJGBQL01nYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgJSBQYC9SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE1nYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBNZy9QYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgJSBNZ2AvUmVsYWNpb25lc19iaW5hcmlhcyRgJSBQYAoKI3JlbGFjaW9uIGZvc2Zvcm8gQXp1ZnJlClJlbGFjaW9uZXNfYmluYXJpYXMkYFAvU2A8LVJlbGFjaW9uZXNfYmluYXJpYXMkYCUgUGAvUmVsYWNpb25lc19iaW5hcmlhcyRgJSBTYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBTL1BgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIFNgL1JlbGFjaW9uZXNfYmluYXJpYXMkYCUgUGAKCiNwYXJhIGFxdWVsbG9zIGVsZW1lbnRvcyBxdWUgc2UgcHJlc2VudGFuIGNvbW8gcGFydGVzIHBvciBtaWxsb24gc2UgZGViZSBtdWx0aXBsaWNhciBlbCBlbGVtZW50byBwcmVzZW50YWRvIGNvbW8gJSwgcG9yIDEwMC4KCiNyZWxhY2lvbiBmb3Nmb3JvIEhpZXJybwpSZWxhY2lvbmVzX2JpbmFyaWFzJGBQL0ZlYDwtKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIFBgKSoxMDApL1JlbGFjaW9uZXNfYmluYXJpYXMkYEZlIHBwbWAKUmVsYWNpb25lc19iaW5hcmlhcyRgRmUvUGA8LVJlbGFjaW9uZXNfYmluYXJpYXMkYEZlIHBwbWAvKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIFBgKSoxMDApCgojcmVsYWNpb24gZm9zZm9ybyBCb3JvCgpSZWxhY2lvbmVzX2JpbmFyaWFzJGBQL0JgPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgUGApKjEwMCkvUmVsYWNpb25lc19iaW5hcmlhcyRgQiBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYEIvUGA8LVJlbGFjaW9uZXNfYmluYXJpYXMkYEIgcHBtYC8oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgUGApKjEwMCkKCiNyZWxhY2lvbiBmb3Nmb3JvIFppbmMKClJlbGFjaW9uZXNfYmluYXJpYXMkYFAvWm5gPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgUGApKjEwMCkvUmVsYWNpb25lc19iaW5hcmlhcyRgWm4gcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBabi9QYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgWm4gcHBtYC8oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgUGApKjEwMCkKCiNyZWxhY2lvbiBmb3Nmb3JvIE1hbmdhbmVzbwoKUmVsYWNpb25lc19iaW5hcmlhcyRgUC9NbmA8LSgoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBQYCkqMTAwKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYE1uL1BgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG1gLygoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBQYCkqMTAwKQoKI3JlbGFjaW9uIGZvc2Zvcm8gQ29icmUKClJlbGFjaW9uZXNfYmluYXJpYXMkYFAvQ3VgPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgUGApKjEwMCkvUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UgcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBDdS9QYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UgcHBtYC8oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgUGApKjEwMCkKYGBgCgpyZWxhY2lvbmVzIGNvbiBQb3Rhc2lvLgpjb21vIHlhIHNlIGhhbiBjYWxjdWxhZG8gbGFzIHJlbGFjaW9uZXMgY29uIE5pdHJvZ2VubyB5IGZvc2Zvcm8gZXN0YXMgc2UgaGFuIG9taXRpZG8uCgpgYGB7ciBSZWxhY2lvbmVzIGNvbiBQb3Rhc2lvfQojcmVsYWNpb24gcG90YXNpbyBDYWxjaW8KClJlbGFjaW9uZXNfYmluYXJpYXMkYEsvQ2FgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIEtgL1JlbGFjaW9uZXNfYmluYXJpYXMkYCUgQ2FgClJlbGFjaW9uZXNfYmluYXJpYXMkYENhL0tgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIENhYC9SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIEtgCgojcmVsYWNpb24gcG90YXNpbyBNYWduZXNpbwpSZWxhY2lvbmVzX2JpbmFyaWFzJGBLL01nYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgJSBLYC9SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE1nYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBNZy9LYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgJSBNZ2AvUmVsYWNpb25lc19iaW5hcmlhcyRgJSBLYAoKI3JlbGFjaW9uIHBvdGFzaW8gQXp1ZnJlClJlbGFjaW9uZXNfYmluYXJpYXMkYEsvU2A8LVJlbGFjaW9uZXNfYmluYXJpYXMkYCUgS2AvUmVsYWNpb25lc19iaW5hcmlhcyRgJSBTYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBTL0tgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIFNgL1JlbGFjaW9uZXNfYmluYXJpYXMkYCUgS2AKCiNwYXJhIGFxdWVsbG9zIGVsZW1lbnRvcyBxdWUgc2UgcHJlc2VudGFuIGNvbW8gcGFydGVzIHBvciBtaWxsb24gc2UgZGViZSBtdWx0aXBsaWNhciBlbCBlbGVtZW50byBwcmVzZW50YWRvIGNvbW8gJSwgcG9yIDEwMC4KCiNyZWxhY2lvbiBwb3Rhc2lvIEhpZXJybwpSZWxhY2lvbmVzX2JpbmFyaWFzJGBLL0ZlYDwtKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIEtgKSoxMDApL1JlbGFjaW9uZXNfYmluYXJpYXMkYEZlIHBwbWAKUmVsYWNpb25lc19iaW5hcmlhcyRgRmUvS2A8LVJlbGFjaW9uZXNfYmluYXJpYXMkYEZlIHBwbWAvKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIEtgKSoxMDApCgojcmVsYWNpb24gcG90YXNpbyBCb3JvCgpSZWxhY2lvbmVzX2JpbmFyaWFzJGBLL0JgPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgS2ApKjEwMCkvUmVsYWNpb25lc19iaW5hcmlhcyRgQiBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYEIvS2A8LVJlbGFjaW9uZXNfYmluYXJpYXMkYEIgcHBtYC8oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgS2ApKjEwMCkKCiNyZWxhY2lvbiBwb3Rhc2lvIFppbmMKClJlbGFjaW9uZXNfYmluYXJpYXMkYEsvWm5gPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgS2ApKjEwMCkvUmVsYWNpb25lc19iaW5hcmlhcyRgWm4gcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBabi9LYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgWm4gcHBtYC8oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgS2ApKjEwMCkKCiNyZWxhY2lvbiBwb3Rhc2lvIE1hbmdhbmVzbwoKUmVsYWNpb25lc19iaW5hcmlhcyRgSy9NbmA8LSgoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBLYCkqMTAwKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYE1uL0tgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG1gLygoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBLYCkqMTAwKQoKI3JlbGFjaW9uIHBvdGFzaW8gQ29icmUKClJlbGFjaW9uZXNfYmluYXJpYXMkYEsvQ3VgPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgS2ApKjEwMCkvUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UgcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBDdS9LYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UgcHBtYC8oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgS2ApKjEwMCkKYGBgCgpyZWxhY2lvbmVzIGNvbiBDYWxjaW8uCmNvbW8geWEgc2UgaGFuIGNhbGN1bGFkbyBsYXMgcmVsYWNpb25lcyBjb24gTml0cm9nZW5vLCBGb3Nmb3JvIHkgUG90YXNpbyBlc3RhcyBzZSBoYW4gb21pdGlkby4KCmBgYHtyIENhbGNpb30KI3JlbGFjaW9uIENhbGNpbyBNYWduZXNpbwpSZWxhY2lvbmVzX2JpbmFyaWFzJGBDYS9NZ2A8LVJlbGFjaW9uZXNfYmluYXJpYXMkYCUgQ2FgL1JlbGFjaW9uZXNfYmluYXJpYXMkYCUgTWdgClJlbGFjaW9uZXNfYmluYXJpYXMkYE1nL0NhYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgJSBNZ2AvUmVsYWNpb25lc19iaW5hcmlhcyRgJSBDYWAKCiNyZWxhY2lvbiBDYWxjaW8gQXp1ZnJlClJlbGFjaW9uZXNfYmluYXJpYXMkYENhL1NgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIENhYC9SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIFNgClJlbGFjaW9uZXNfYmluYXJpYXMkYFMvQ2FgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIFNgL1JlbGFjaW9uZXNfYmluYXJpYXMkYCUgQ2FgCgojcGFyYSBhcXVlbGxvcyBlbGVtZW50b3MgcXVlIHNlIHByZXNlbnRhbiBjb21vIHBhcnRlcyBwb3IgbWlsbG9uIHNlIGRlYmUgbXVsdGlwbGljYXIgZWwgZWxlbWVudG8gcHJlc2VudGFkbyBjb21vICUsIHBvciAxMDAuCgojcmVsYWNpb24gQ2FsY2lvIEhpZXJybwpSZWxhY2lvbmVzX2JpbmFyaWFzJGBDYS9GZWA8LSgoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBDYWApKjEwMCkvUmVsYWNpb25lc19iaW5hcmlhcyRgRmUgcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBGZS9DYWA8LVJlbGFjaW9uZXNfYmluYXJpYXMkYEZlIHBwbWAvKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIENhYCkqMTAwKQoKI3JlbGFjaW9uIENhbGNpbyBCb3JvCgpSZWxhY2lvbmVzX2JpbmFyaWFzJGBDYS9CYDwtKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIENhYCkqMTAwKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBCIHBwbWAKUmVsYWNpb25lc19iaW5hcmlhcyRgQi9DYWA8LVJlbGFjaW9uZXNfYmluYXJpYXMkYEIgcHBtYC8oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgQ2FgKSoxMDApCgojcmVsYWNpb24gQ2FsY2lvIFppbmMKClJlbGFjaW9uZXNfYmluYXJpYXMkYENhL1puYDwtKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIENhYCkqMTAwKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBabiBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYFpuL0NhYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgWm4gcHBtYC8oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgQ2FgKSoxMDApCgojcmVsYWNpb24gQ2FsY2lvIE1hbmdhbmVzbwoKUmVsYWNpb25lc19iaW5hcmlhcyRgQ2EvTW5gPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgQ2FgKSoxMDApL1JlbGFjaW9uZXNfYmluYXJpYXMkYE1uIHBwbWAKUmVsYWNpb25lc19iaW5hcmlhcyRgTW4vQ2FgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG1gLygoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBDYWApKjEwMCkKCiNyZWxhY2lvbiBDYWxjaW8gQ29icmUKClJlbGFjaW9uZXNfYmluYXJpYXMkYENhL0N1YDwtKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIENhYCkqMTAwKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBDdSBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYEN1L0NhYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UgcHBtYC8oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgQ2FgKSoxMDApCmBgYAoKcmVsYWNpb25lcyBjb24gTWFnbmVzaW8uCmNvbW8geWEgc2UgaGFuIGNhbGN1bGFkbyBsYXMgcmVsYWNpb25lcyBjb24gTml0cm9nZW5vLCBGb3Nmb3JvLFBvdGFzaW8geSBDYWxjaW8gZXN0YXMgc2UgaGFuIG9taXRpZG8uCgpgYGB7ciBNYWduZXNpb30KI3JlbGFjaW9uIE1hZ25lc2lvIEF6dWZyZQpSZWxhY2lvbmVzX2JpbmFyaWFzJGBNZy9TYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgJSBNZ2AvUmVsYWNpb25lc19iaW5hcmlhcyRgJSBTYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBTL01nYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgJSBTYC9SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE1nYAoKI3BhcmEgYXF1ZWxsb3MgZWxlbWVudG9zIHF1ZSBzZSBwcmVzZW50YW4gY29tbyBwYXJ0ZXMgcG9yIG1pbGxvbiBzZSBkZWJlIG11bHRpcGxpY2FyIGVsIGVsZW1lbnRvIHByZXNlbnRhZG8gY29tbyAlLCBwb3IgMTAwLgoKI3JlbGFjaW9uIE1hZ25lc2lvIEhpZXJybwpSZWxhY2lvbmVzX2JpbmFyaWFzJGBNZy9GZWA8LSgoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBNZ2ApKjEwMCkvUmVsYWNpb25lc19iaW5hcmlhcyRgRmUgcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBGZS9NZ2A8LVJlbGFjaW9uZXNfYmluYXJpYXMkYEZlIHBwbWAvKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE1nYCkqMTAwKQoKI3JlbGFjaW9uIE1hZ25lc2lvIEJvcm8KClJlbGFjaW9uZXNfYmluYXJpYXMkYE1nL0JgPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgTWdgKSoxMDApL1JlbGFjaW9uZXNfYmluYXJpYXMkYEIgcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBCL01nYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgQiBwcG1gLygoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBNZ2ApKjEwMCkKCiNyZWxhY2lvbiBNYWduZXNpbyBaaW5jCgpSZWxhY2lvbmVzX2JpbmFyaWFzJGBNZy9abmA8LSgoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBNZ2ApKjEwMCkvUmVsYWNpb25lc19iaW5hcmlhcyRgWm4gcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBabi9NZ2A8LVJlbGFjaW9uZXNfYmluYXJpYXMkYFpuIHBwbWAvKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE1nYCkqMTAwKQoKI3JlbGFjaW9uIE1hZ25lc2lvIE1hbmdhbmVzbwoKUmVsYWNpb25lc19iaW5hcmlhcyRgTWcvTW5gPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgTWdgKSoxMDApL1JlbGFjaW9uZXNfYmluYXJpYXMkYE1uIHBwbWAKUmVsYWNpb25lc19iaW5hcmlhcyRgTW4vTWdgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG1gLygoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBNZ2ApKjEwMCkKCiNyZWxhY2lvbiBNYWduZXNpbyBDb2JyZQoKUmVsYWNpb25lc19iaW5hcmlhcyRgTWcvQ3VgPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgTWdgKSoxMDApL1JlbGFjaW9uZXNfYmluYXJpYXMkYEN1IHBwbWAKUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UvTWdgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGBDdSBwcG1gLygoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBNZ2ApKjEwMCkKYGBgCgpyZWxhY2lvbmVzIGNvbiBBenVmcmUuCmNvbW8geWEgc2UgaGFuIGNhbGN1bGFkbyBsYXMgcmVsYWNpb25lcyBjb24gTml0cm9nZW5vLCBGb3Nmb3JvLFBvdGFzaW8sQ2FsY2lvIHkgTWFnbmVzaW8gZXN0YXMgc2UgaGFuIG9taXRpZG8uCgpgYGB7ciBBenVmcmV9CgoKI3BhcmEgYXF1ZWxsb3MgZWxlbWVudG9zIHF1ZSBzZSBwcmVzZW50YW4gY29tbyBwYXJ0ZXMgcG9yIG1pbGxvbiBzZSBkZWJlIG11bHRpcGxpY2FyIGVsIGVsZW1lbnRvIHByZXNlbnRhZG8gY29tbyAlLCBwb3IgMTAwLgoKI3JlbGFjaW9uIEF6dWZyZSBIaWVycm8KUmVsYWNpb25lc19iaW5hcmlhcyRgUy9GZWA8LSgoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBTYCkqMTAwKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBGZSBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYEZlL1NgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGBGZSBwcG1gLygoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBTYCkqMTAwKQoKI3JlbGFjaW9uIEF6dWZyZSBCb3JvCgpSZWxhY2lvbmVzX2JpbmFyaWFzJGBTL0JgPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgU2ApKjEwMCkvUmVsYWNpb25lc19iaW5hcmlhcyRgQiBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYEIvU2A8LVJlbGFjaW9uZXNfYmluYXJpYXMkYEIgcHBtYC8oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgU2ApKjEwMCkKCiNyZWxhY2lvbiBBenVmcmUgWmluYwoKUmVsYWNpb25lc19iaW5hcmlhcyRgUy9abmA8LSgoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBTYCkqMTAwKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBabiBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYFpuL1NgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGBabiBwcG1gLygoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBTYCkqMTAwKQoKI3JlbGFjaW9uIEF6dWZyZSBNYW5nYW5lc28KClJlbGFjaW9uZXNfYmluYXJpYXMkYFMvTW5gPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgU2ApKjEwMCkvUmVsYWNpb25lc19iaW5hcmlhcyRgTW4gcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBNbi9TYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgTW4gcHBtYC8oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgU2ApKjEwMCkKCiNyZWxhY2lvbiBBenVmcmUgQ29icmUKClJlbGFjaW9uZXNfYmluYXJpYXMkYFMvQ3VgPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgU2ApKjEwMCkvUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UgcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBDdS9TYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UgcHBtYC8oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgU2ApKjEwMCkKYGBgCgpyZWxhY2lvbmVzIGNvbiBIaWVycm8uCmNvbW8gSGllcnJvIGVzIHByZXNlbnRhZG8gZW4gZWwgYW5hbGlzaSBkZSBzdWVsb3MgY29tbyBwcG0sbm8gZXMgbmVjZXNhcmlvIG11bHRpcGxpY2FyIHBvciAxMDAgcGFyYSBsYXMgdmFyaWFibGVzIHF1ZSBzZSBwcmVzZW50YW4gY29tbyBwcG0uCmNvbW8geWEgc2UgaGFuIGNhbGN1bGFkbyBsYXMgcmVsYWNpb25lcyBjb24gTml0cm9nZW5vLCBGb3Nmb3JvLFBvdGFzaW8sQ2FsY2lvLE1hZ25lc2lvIHkgQXp1ZnJlIGVzdGFzIHNlIGhhbiBvbWl0aWRvLgoKCmBgYHtyIEhpZXJyb30KCiNyZWxhY2lvbiBIaWVycm8gQm9ybwoKUmVsYWNpb25lc19iaW5hcmlhcyRgRmUgcHBtL0JgPC0oUmVsYWNpb25lc19iaW5hcmlhcyRgRmUgcHBtYCkvUmVsYWNpb25lc19iaW5hcmlhcyRgQiBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYEIvRmUgcHBtYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgQiBwcG1gLyhSZWxhY2lvbmVzX2JpbmFyaWFzJGBGZSBwcG1gKQoKI3JlbGFjaW9uIEhpZXJybyBaaW5jCgpSZWxhY2lvbmVzX2JpbmFyaWFzJGBGZSBwcG0vWm5gPC0oUmVsYWNpb25lc19iaW5hcmlhcyRgRmUgcHBtYCkvUmVsYWNpb25lc19iaW5hcmlhcyRgWm4gcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBabi9GZSBwcG1gPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGBabiBwcG1gLyhSZWxhY2lvbmVzX2JpbmFyaWFzJGBGZSBwcG1gKQoKI3JlbGFjaW9uIEhpZXJybyBNYW5nYW5lc28KClJlbGFjaW9uZXNfYmluYXJpYXMkYEZlIHBwbS9NbmA8LShSZWxhY2lvbmVzX2JpbmFyaWFzJGBGZSBwcG1gKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYE1uL0ZlIHBwbWA8LVJlbGFjaW9uZXNfYmluYXJpYXMkYE1uIHBwbWAvKFJlbGFjaW9uZXNfYmluYXJpYXMkYEZlIHBwbWApCgojcmVsYWNpb24gSGllcnJvIENvYnJlCgpSZWxhY2lvbmVzX2JpbmFyaWFzJGBGZSBwcG0vQ3VgPC0oUmVsYWNpb25lc19iaW5hcmlhcyRgRmUgcHBtYCkvUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UgcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBDdS9GZSBwcG1gPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGBDdSBwcG1gLyhSZWxhY2lvbmVzX2JpbmFyaWFzJGBGZSBwcG1gKQpgYGAKCgpyZWxhY2lvbmVzIGNvbiBCb3JvLgpjb21vIEJvcm8gZXMgcHJlc2VudGFkbyBlbiBlbCBhbmFsaXNpIGRlIHN1ZWxvcyBjb21vIHBwbSxubyBlcyBuZWNlc2FyaW8gbXVsdGlwbGljYXIgcG9yIDEwMCBwYXJhIGxhcyB2YXJpYWJsZXMgcXVlIHNlIHByZXNlbnRhbiBjb21vIHBwbS4KY29tbyB5YSBzZSBoYW4gY2FsY3VsYWRvIGxhcyByZWxhY2lvbmVzIGNvbiBOaXRyb2dlbm8sIEZvc2Zvcm8sUG90YXNpbyxDYWxjaW8sTWFnbmVzaW8sQXp1ZnJlIHkgSGllcnJvIGVzdGFzIHNlIGhhbiBvbWl0aWRvLgoKCmBgYHtyIEJvcm99CiNyZWxhY2lvbiBCb3JvIFppbmMKClJlbGFjaW9uZXNfYmluYXJpYXMkYEIgcHBtL1puYDwtKFJlbGFjaW9uZXNfYmluYXJpYXMkYEIgcHBtYCkvUmVsYWNpb25lc19iaW5hcmlhcyRgWm4gcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBabi9CIHBwbWA8LVJlbGFjaW9uZXNfYmluYXJpYXMkYFpuIHBwbWAvKFJlbGFjaW9uZXNfYmluYXJpYXMkYEIgcHBtYCkKCiNyZWxhY2lvbiBCb3JvIE1hbmdhbmVzbwoKUmVsYWNpb25lc19iaW5hcmlhcyRgQiBwcG0vTW5gPC0oUmVsYWNpb25lc19iaW5hcmlhcyRgQiBwcG1gKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYE1uL0IgcHBtYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgTW4gcHBtYC8oUmVsYWNpb25lc19iaW5hcmlhcyRgQiBwcG1gKQoKI3JlbGFjaW9uIEJvcm8gQ29icmUKClJlbGFjaW9uZXNfYmluYXJpYXMkYEIgcHBtL0N1YDwtKFJlbGFjaW9uZXNfYmluYXJpYXMkYEIgcHBtYCkvUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UgcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBDdS9CIHBwbWA8LVJlbGFjaW9uZXNfYmluYXJpYXMkYEN1IHBwbWAvKFJlbGFjaW9uZXNfYmluYXJpYXMkYEIgcHBtYCkKYGBgCgoKCgoKcmVsYWNpb25lcyBjb24gWmluYy4KY29tbyBaaW5jIGVzIHByZXNlbnRhZG8gZW4gZWwgYW5hbGlzaSBkZSBzdWVsb3MgY29tbyBwcG0sbm8gZXMgbmVjZXNhcmlvIG11bHRpcGxpY2FyIHBvciAxMDAgcGFyYSBsYXMgdmFyaWFibGVzIHF1ZSBzZSBwcmVzZW50YW4gY29tbyBwcG0uCmNvbW8geWEgc2UgaGFuIGNhbGN1bGFkbyBsYXMgcmVsYWNpb25lcyBjb24gTml0cm9nZW5vLCBGb3Nmb3JvLFBvdGFzaW8sQ2FsY2lvLE1hZ25lc2lvLEF6dWZyZSxIaWVycm8geSBCb3JvIGVzdGFzIHNlIGhhbiBvbWl0aWRvLgoKCmBgYHtyIFppbmN9CiNyZWxhY2lvbiBaaW5jICBNYW5nYW5lc28KClJlbGFjaW9uZXNfYmluYXJpYXMkYFpuIHBwbS9NbmA8LShSZWxhY2lvbmVzX2JpbmFyaWFzJGBabiBwcG1gKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYE1uL1puIHBwbWA8LVJlbGFjaW9uZXNfYmluYXJpYXMkYE1uIHBwbWAvKFJlbGFjaW9uZXNfYmluYXJpYXMkYFpuIHBwbWApCgojcmVsYWNpb24gWmluYyBDb2JyZQoKUmVsYWNpb25lc19iaW5hcmlhcyRgWm4gcHBtL0N1YDwtKFJlbGFjaW9uZXNfYmluYXJpYXMkYFpuIHBwbWApL1JlbGFjaW9uZXNfYmluYXJpYXMkYEN1IHBwbWAKUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UvWm4gcHBtYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UgcHBtYC8oUmVsYWNpb25lc19iaW5hcmlhcyRgWm4gcHBtYCkKYGBgCgpyZWxhY2lvbmVzIGNvbiBDb2JyZSB5IE1hbmdhbmVzby4KY29tbyBDb2JyZSB5IE1hbmdhbmVzbyBlcyBwcmVzZW50YWRvIGVuIGVsIGFuYWxpc2kgZGUgc3VlbG9zIGNvbW8gcHBtLG5vIGVzIG5lY2VzYXJpbyBtdWx0aXBsaWNhciBwb3IgMTAwIHBhcmEgbGFzIHZhcmlhYmxlcyBxdWUgc2UgcHJlc2VudGFuIGNvbW8gcHBtLgpjb21vIHlhIHNlIGhhbiBjYWxjdWxhZG8gbGFzIHJlbGFjaW9uZXMgY29uIE5pdHJvZ2VubywgRm9zZm9ybyxQb3Rhc2lvLENhbGNpbyxNYWduZXNpbyxBenVmcmUsSGllcnJvLEJvcm8geSBaaW5jCgoKYGBge3IgQ29icmUgTWFuZ2FuZXNvfQojcmVsYWNpb24gTWFuZ2FuZXNvIENvYnJlCgpSZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG0vQ3VgPC0oUmVsYWNpb25lc19iaW5hcmlhcyRgTW4gcHBtYCkvUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UgcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBDdS9NbiBwcG1gPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGBDdSBwcG1gLyhSZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG1gKQpoZWFkKFJlbGFjaW9uZXNfYmluYXJpYXMpCmBgYAoKCnNpIGRlc2VhcmFtb3MgY29ycmVnaXIgZGF0b3MgZGVsIGRhdGEuZnJhbWUKCmBgYHtyfQoKIyMgIGZpeChSZWxhY2lvbmVzX2JpbmFyaWFzKQpgYGAKCmVzdGFkaXN0aWNhcyAgZGUgdG9kYXMgbGFzIGNvbHVtbmFzCgpgYGB7cn0KCnNlbGVjY2lvbjwtUmVsYWNpb25lc19iaW5hcmlhc1ssMTQ6MTIzXQptZWRpYTwtYXBwbHkoc2VsZWNjaW9uLDIsbWVhbikKdmFyaWFuemE8LWFwcGx5KHNlbGVjY2lvbiwyLHZhcikKZGVzdmlhY2lvbl9lc3RhbmRhcjwtYXBwbHkoc2VsZWNjaW9uLDIsc2QpCgpgYGAKCgpkYXRhLmZyYW1lIGNvbiBsYSBlc3Rhc2Rpc3RpY2FzIAoKYGBge3J9CmVzdGFkaXN0aWNhczwtZGF0YS5mcmFtZShtZWRpYSx2YXJpYW56YSxkZXN2aWFjaW9uX2VzdGFuZGFyKQpgYGAKCmFncmVnYW1vcyBsYSBjb2x1bW5hIGNvZWZpY2llbnRlIGRlIHZhcmlhY2lvbiBxdWUgbm9zIHNlcnZpcmEgbWFzIGFkZWxhbnRlIHBhcmEgZWwgYW5hbGlzaXMgRFJJUwoKCmBgYHtyfQplc3RhZGlzdGljYXMkY29lZmljaWVudGVfZGVfdmFyaWFjaW9uPC1lc3RhZGlzdGljYXMkZGVzdmlhY2lvbl9lc3RhbmRhci9lc3RhZGlzdGljYXMkbWVkaWEKYGBgCgoKcGFyYSBhcnJlZ2xhciBsYSB0YWJsYSBkZSBlc3RhZGlzdGljYXMgZW4gdW5hIG1hbmVyYSBjb21vZGEgZGUgdmVyIHV0aWxpemFtb3MgbGEgZnVuY2lvbiB0KCkscGFyYSB0cmFuc3BvbmVyIGxvcyBkYXRvcwpgYGB7cn0KZXN0YWRpc3RpY2FzX2VuX2ZpbGFzPC10KGVzdGFkaXN0aWNhcykKYGBgCgoKCgoKCgoKCg==