DESCRIPCION DE EJERCICIO

#Para la economía de los primigenios, en la ciudad de R'lyeh,  el vector de rentas es (100,200,300,400,700), (en unidades monetarias: u.m.) el cual es ponderado por el siguiente vector de población (50,35,55,35,10) (en individuos)

#a) Calcule el coeficiente de Gini de la ciudad de R'lyeh

#b) El alcalde de R'lyeh  el "Gran  Primigenio Cthulhu" ha propuesto una transferencia del gobierno de 15% sobre el monto de las rentas de hasta 200 u.m. y un impuesto sobre la renta del 5% para las rentas superiores a las 200 u.m. ¿La desigualdad en R'lyeh  aumenta o disminuye? argumente su respuesta con el nuevo coeficiente de Gini, para la distribución de la renta  derivada de las políticas del primigenio alcalde, descritas en el literal b)

#c) La severidad de la pobreza (FGT2) aumenta o disminuye con la política del primigenio alcalde, descrita en el literal b), argumente su respuesta 


#d) De acuerdo a al indicador de Kuznet, hay cambios evidentes entre el 10% más rico y el 40% más pobre de la ciudad de R'lyeh, con la implementación de la política del primigenio alcalde, ya descrita con anterioridad. Argumente su respuesta

Calculo de la Renta media

y <- c(100, 200, 300, 400,700)
n <- c(50, 35, 55, 35,10)
#Cálculo de la renta media
renta_media <- function(vector_renta, vector_poblacion) {
  as.vector(crossprod(vector_renta, vector_poblacion) / sum(vector_poblacion))
}
renta_media(vector_renta = y, vector_poblacion = n)
## [1] 267.5676

a) Calcule el coeficiente de Gini de la ciudad de R’lyeh

options(scipen = 999999)
gini_debraj_ray <- function(vector_renta, vector_poblacion) {
  # Generación del Dataframe para el cálculo
  library(dplyr)
  df_y <- expand.grid(vector_renta, vector_renta)
  names(df_y) <- c("Yj", "Yk")
  df_n <- expand.grid(vector_poblacion, vector_poblacion)
  names(df_n) <- c("Nj", "Nk")
  gini_data <- bind_cols(df_n, df_y)
  # Cálculo del doble sumatorio
  renta_media(vector_renta = vector_renta,
              vector_poblacion=vector_poblacion)->mu
   N<-sum(vector_poblacion)
  gini_data %>% mutate(doble_sum = Nj * Nk * abs(Yj - Yk)) -> gini_data
  gini_data %>% summarise(Gini=(1/(2*mu*N^2))*sum(doble_sum)) %>% select(Gini)->Gini
  list(gini_data=gini_data,mu=mu,N=N,Gini=Gini[,1])
}

#Data original
g1<-gini_debraj_ray(vector_renta = y,vector_poblacion = n)
print(g1)
## $gini_data
##    Nj Nk  Yj  Yk doble_sum
## 1  50 50 100 100         0
## 2  35 50 200 100    175000
## 3  55 50 300 100    550000
## 4  35 50 400 100    525000
## 5  10 50 700 100    300000
## 6  50 35 100 200    175000
## 7  35 35 200 200         0
## 8  55 35 300 200    192500
## 9  35 35 400 200    245000
## 10 10 35 700 200    175000
## 11 50 55 100 300    550000
## 12 35 55 200 300    192500
## 13 55 55 300 300         0
## 14 35 55 400 300    192500
## 15 10 55 700 300    220000
## 16 50 35 100 400    525000
## 17 35 35 200 400    245000
## 18 55 35 300 400    192500
## 19 35 35 400 400         0
## 20 10 35 700 400    105000
## 21 50 10 100 700    300000
## 22 35 10 200 700    175000
## 23 55 10 300 700    220000
## 24 35 10 400 700    105000
## 25 10 10 700 700         0
## 
## $mu
## [1] 267.5676
## 
## $N
## [1] 185
## 
## $Gini
## [1] 0.2926563

b) El alcalde de R’lyeh el “Gran Primigenio Cthulhu” ha propuesto una transferencia del gobierno de 15% sobre el monto de las rentas de hasta 200 u.m. y un impuesto sobre la renta del 5% para las rentas superiores a las 200 u.m. ¿La desigualdad en R’lyeh aumenta o disminuye? argumente su respuesta con el nuevo coeficiente de Gini, para la distribución de la renta derivada de las políticas del primigenio alcalde, descritas en el literal b)

Se calcula nuevamente la renta media con las politicas del alcalde de R’lyeh

y2 <- c(100*(1.15), 200*(1.15), 300/(1.05), 400/(1.05),700/(1.05))
n2 <- c(50, 35, 55, 35,10)

#Cálculo de la renta media
renta_media <- function(vector_renta, vector_poblacion) {
  as.vector(crossprod(vector_renta, vector_poblacion) / sum(vector_poblacion))
}
renta_media(vector_renta = y2, vector_poblacion = n2)
## [1] 267.6448

Se calcula nuevamente el GINI con las politicas del alcalde de R’lyeh

options(scipen = 999999)
gini_debraj_ray <- function(vector_renta, vector_poblacion) {
  # Generación del Dataframe para el cálculo
  library(dplyr)
  df_y <- expand.grid(vector_renta, vector_renta)
  names(df_y) <- c("Yj", "Yk")
  df_n <- expand.grid(vector_poblacion, vector_poblacion)
  names(df_n) <- c("Nj", "Nk")
  gini_data <- bind_cols(df_n, df_y)
  # Cálculo del doble sumatorio
  renta_media(vector_renta = vector_renta,
              vector_poblacion=vector_poblacion)->mu
   N<-sum(vector_poblacion)
  gini_data %>% mutate(doble_sum = Nj * Nk * abs(Yj - Yk)) -> gini_data
  gini_data %>% summarise(Gini=(1/(2*mu*N^2))*sum(doble_sum)) %>% select(Gini)->Gini
  list(gini_data=gini_data,mu=mu,N=N,Gini=Gini[,1])
}

#Data original
g2<-gini_debraj_ray(vector_renta = y2,vector_poblacion = n2)
print(g2)
## $gini_data
##    Nj Nk       Yj       Yk doble_sum
## 1  50 50 115.0000 115.0000       0.0
## 2  35 50 230.0000 115.0000  201250.0
## 3  55 50 285.7143 115.0000  469464.3
## 4  35 50 380.9524 115.0000  465416.7
## 5  10 50 666.6667 115.0000  275833.3
## 6  50 35 115.0000 230.0000  201250.0
## 7  35 35 230.0000 230.0000       0.0
## 8  55 35 285.7143 230.0000  107250.0
## 9  35 35 380.9524 230.0000  184916.7
## 10 10 35 666.6667 230.0000  152833.3
## 11 50 55 115.0000 285.7143  469464.3
## 12 35 55 230.0000 285.7143  107250.0
## 13 55 55 285.7143 285.7143       0.0
## 14 35 55 380.9524 285.7143  183333.3
## 15 10 55 666.6667 285.7143  209523.8
## 16 50 35 115.0000 380.9524  465416.7
## 17 35 35 230.0000 380.9524  184916.7
## 18 55 35 285.7143 380.9524  183333.3
## 19 35 35 380.9524 380.9524       0.0
## 20 10 35 666.6667 380.9524  100000.0
## 21 50 10 115.0000 666.6667  275833.3
## 22 35 10 230.0000 666.6667  152833.3
## 23 55 10 285.7143 666.6667  209523.8
## 24 35 10 380.9524 666.6667  100000.0
## 25 10 10 666.6667 666.6667       0.0
## 
## $mu
## [1] 267.6448
## 
## $N
## [1] 185
## 
## $Gini
## [1] 0.2565267
#En este caso con la transferencia del gobierno del 15% a las rentas de hasta 200 u.m. y con el impuesto del 5% a las rentas superiores a las 200 u.m., se puede concluir que la desigualdad ha disminuido en la ciudad de R'lyeh, es decir, ahora es mas equitativo la distribución del ingres ya que se pasa de un Gini de 0.2926563 a 0.2565267.

c) La severidad de la pobreza (FGT2) aumenta o disminuye con la política del primigenio alcalde, descrita en el literal b), argumente su respuesta

Sin politicas de redistribucion del ingreso

Kuznets.X.Y <- function(vector_renta,
                        vector_poblacion = 1,
                        cuantil_x,
                        cuantil_y) {
  library(purrr)
  map2(vector_renta, vector_poblacion, .f = rep) %>%
    unlist() %>% quantile(probs = c(cuantil_x)) -> Pob.X
  map2(vector_renta, vector_poblacion, .f = rep) %>% 
    unlist() %>% quantile(probs = c(1-cuantil_y)) -> Pob.Y
  list(Kuznets.indice=unname(Pob.Y/Pob.X),Pob.X=Pob.X,Pob.Y=Pob.Y)
}
# Ejemplo de uso
Kuznets.X.Y(vector_renta = y,vector_poblacion = n,cuantil_x = 0.2,cuantil_y =0.2)
## $Kuznets.indice
## [1] 4
## 
## $Pob.X
## 20% 
## 100 
## 
## $Pob.Y
## 80% 
## 400

Con politicas de redistribucion del ingreso

Kuznets.X.Y <- function(vector_renta,
                        vector_poblacion = 1,
                        cuantil_x,
                        cuantil_y) {
  library(purrr)
  map2(vector_renta, vector_poblacion, .f = rep) %>%
    unlist() %>% quantile(probs = c(cuantil_x)) -> Pob.X
  map2(vector_renta, vector_poblacion, .f = rep) %>% 
    unlist() %>% quantile(probs = c(1-cuantil_y)) -> Pob.Y
  list(Kuznets.indice=unname(Pob.Y/Pob.X),Pob.X=Pob.X,Pob.Y=Pob.Y)
}
# Ejemplo de uso
Kuznets.X.Y(vector_renta = y2,vector_poblacion = n2,cuantil_x = 0.2,cuantil_y =0.2)
## $Kuznets.indice
## [1] 3.312629
## 
## $Pob.X
## 20% 
## 115 
## 
## $Pob.Y
##      80% 
## 380.9524
#En este punto se puede argumentar que la severidad de la pobreza disminuye ya que en el primer caso, cuando no se han aplicado las politicas de redistribucion del ingreso por cada u.m. que recibe el 20% mas pobre, le ingresan 3.47 u.m. al 20% mas rico.

#posterior a la aplicación de las politicas de redistribucion del ingreso se tiene que por cada u.m. que recibe el 20% mas pobre, le ingresan 3.3126 u.m. al 20% mas rico. 

d) De acuerdo a al indicador de Kuznet, hay cambios evidentes entre el 10% más rico y el 40% más pobre de la ciudad de R’lyeh, con la implementación de la política del primigenio alcalde, ya descrita con anterioridad. Argumente su respuesta

Sin la politica del alcalde de R’lyeh

Kuznets.X.Y <- function(vector_renta,
                        vector_poblacion = 1,
                        cuantil_x,
                        cuantil_y) {
  library(purrr)
  map2(vector_renta, vector_poblacion, .f = rep) %>%
    unlist() %>% quantile(probs = c(cuantil_x)) -> Pob.X
  map2(vector_renta, vector_poblacion, .f = rep) %>% 
    unlist() %>% quantile(probs = c(1-cuantil_y)) -> Pob.Y
  list(Kuznets.indice=unname(Pob.Y/Pob.X),Pob.X=Pob.X,Pob.Y=Pob.Y)
}
# Ejemplo de uso
Kuznets.X.Y(vector_renta = y,vector_poblacion = n,cuantil_x = 0.4,cuantil_y =0.1)
## $Kuznets.indice
## [1] 2
## 
## $Pob.X
## 40% 
## 200 
## 
## $Pob.Y
## 90% 
## 400

Con la politica del alcalde de R’lyeh

Kuznets.X.Y <- function(vector_renta,
                        vector_poblacion = 1,
                        cuantil_x,
                        cuantil_y) {
  library(purrr)
  map2(vector_renta, vector_poblacion, .f = rep) %>%
    unlist() %>% quantile(probs = c(cuantil_x)) -> Pob.X
  map2(vector_renta, vector_poblacion, .f = rep) %>% 
    unlist() %>% quantile(probs = c(1-cuantil_y)) -> Pob.Y
  list(Kuznets.indice=unname(Pob.Y/Pob.X),Pob.X=Pob.X,Pob.Y=Pob.Y)
}
# Ejemplo de uso
Kuznets.X.Y(vector_renta = y2,vector_poblacion = n2,cuantil_x = 0.4,cuantil_y =0.1)
## $Kuznets.indice
## [1] 1.656315
## 
## $Pob.X
## 40% 
## 230 
## 
## $Pob.Y
##      90% 
## 380.9524
#En este punto se puede argumentar que hay un mejor balance en el ingreso, ya que sin la politca del alcalde por cada u.m. que recibe el 40% mas pobre, le ingresan 2 u.m. al 10% mas rico.

#Ya con la implementacion de la politica del alcalde por cada u.m. que recibe el 40% mas pobre, la cantidad que recibe el 10% mas rico disminuye de 2 a 1.65 u.m., haciendo mas equitativo la distribucion del ingreso.
LS0tDQp0aXRsZTogIkVqZXJjaWNpbyBQcsOhY3RpY28gRUREIg0KYXV0aG9yOiAiSm9zdcOpIE5haHVtIEFtYXlhIEZsb3JlcyBBRjE2MDEwIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IHRydWUNCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCi0tLQ0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSkNCmBgYA0KDQojIyBERVNDUklQQ0lPTiBERSBFSkVSQ0lDSU8NCmBgYHtyfQ0KI1BhcmEgbGEgZWNvbm9tw61hIGRlIGxvcyBwcmltaWdlbmlvcywgZW4gbGEgY2l1ZGFkIGRlIFInbHllaCwgIGVsIHZlY3RvciBkZSByZW50YXMgZXMgKDEwMCwyMDAsMzAwLDQwMCw3MDApLCAoZW4gdW5pZGFkZXMgbW9uZXRhcmlhczogdS5tLikgZWwgY3VhbCBlcyBwb25kZXJhZG8gcG9yIGVsIHNpZ3VpZW50ZSB2ZWN0b3IgZGUgcG9ibGFjacOzbiAoNTAsMzUsNTUsMzUsMTApIChlbiBpbmRpdmlkdW9zKQ0KDQojYSkgQ2FsY3VsZSBlbCBjb2VmaWNpZW50ZSBkZSBHaW5pIGRlIGxhIGNpdWRhZCBkZSBSJ2x5ZWgNCg0KI2IpIEVsIGFsY2FsZGUgZGUgUidseWVoICBlbCAiR3JhbiAgUHJpbWlnZW5pbyBDdGh1bGh1IiBoYSBwcm9wdWVzdG8gdW5hIHRyYW5zZmVyZW5jaWEgZGVsIGdvYmllcm5vIGRlIDE1JSBzb2JyZSBlbCBtb250byBkZSBsYXMgcmVudGFzIGRlIGhhc3RhIDIwMCB1Lm0uIHkgdW4gaW1wdWVzdG8gc29icmUgbGEgcmVudGEgZGVsIDUlIHBhcmEgbGFzIHJlbnRhcyBzdXBlcmlvcmVzIGEgbGFzIDIwMCB1Lm0uIMK/TGEgZGVzaWd1YWxkYWQgZW4gUidseWVoICBhdW1lbnRhIG8gZGlzbWludXllPyBhcmd1bWVudGUgc3UgcmVzcHVlc3RhIGNvbiBlbCBudWV2byBjb2VmaWNpZW50ZSBkZSBHaW5pLCBwYXJhIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbGEgcmVudGEgIGRlcml2YWRhIGRlIGxhcyBwb2zDrXRpY2FzIGRlbCBwcmltaWdlbmlvIGFsY2FsZGUsIGRlc2NyaXRhcyBlbiBlbCBsaXRlcmFsIGIpDQoNCiNjKSBMYSBzZXZlcmlkYWQgZGUgbGEgcG9icmV6YSAoRkdUMikgYXVtZW50YSBvIGRpc21pbnV5ZSBjb24gbGEgcG9sw610aWNhIGRlbCBwcmltaWdlbmlvIGFsY2FsZGUsIGRlc2NyaXRhIGVuIGVsIGxpdGVyYWwgYiksIGFyZ3VtZW50ZSBzdSByZXNwdWVzdGEgDQoNCg0KI2QpIERlIGFjdWVyZG8gYSBhbCBpbmRpY2Fkb3IgZGUgS3V6bmV0LCBoYXkgY2FtYmlvcyBldmlkZW50ZXMgZW50cmUgZWwgMTAlIG3DoXMgcmljbyB5IGVsIDQwJSBtw6FzIHBvYnJlIGRlIGxhIGNpdWRhZCBkZSBSJ2x5ZWgsIGNvbiBsYSBpbXBsZW1lbnRhY2nDs24gZGUgbGEgcG9sw610aWNhIGRlbCBwcmltaWdlbmlvIGFsY2FsZGUsIHlhIGRlc2NyaXRhIGNvbiBhbnRlcmlvcmlkYWQuIEFyZ3VtZW50ZSBzdSByZXNwdWVzdGENCg0KDQpgYGANCg0KIyMjIyBDYWxjdWxvIGRlIGxhIFJlbnRhIG1lZGlhDQoNCmBgYHtyfQ0KeSA8LSBjKDEwMCwgMjAwLCAzMDAsIDQwMCw3MDApDQpuIDwtIGMoNTAsIDM1LCA1NSwgMzUsMTApDQojQ8OhbGN1bG8gZGUgbGEgcmVudGEgbWVkaWENCnJlbnRhX21lZGlhIDwtIGZ1bmN0aW9uKHZlY3Rvcl9yZW50YSwgdmVjdG9yX3BvYmxhY2lvbikgew0KICBhcy52ZWN0b3IoY3Jvc3Nwcm9kKHZlY3Rvcl9yZW50YSwgdmVjdG9yX3BvYmxhY2lvbikgLyBzdW0odmVjdG9yX3BvYmxhY2lvbikpDQp9DQpyZW50YV9tZWRpYSh2ZWN0b3JfcmVudGEgPSB5LCB2ZWN0b3JfcG9ibGFjaW9uID0gbikNCg0KDQpgYGANCg0KIyMjIGEpIENhbGN1bGUgZWwgY29lZmljaWVudGUgZGUgR2luaSBkZSBsYSBjaXVkYWQgZGUgUidseWVoDQoNCmBgYHtyfQ0Kb3B0aW9ucyhzY2lwZW4gPSA5OTk5OTkpDQpnaW5pX2RlYnJhal9yYXkgPC0gZnVuY3Rpb24odmVjdG9yX3JlbnRhLCB2ZWN0b3JfcG9ibGFjaW9uKSB7DQogICMgR2VuZXJhY2nDs24gZGVsIERhdGFmcmFtZSBwYXJhIGVsIGPDoWxjdWxvDQogIGxpYnJhcnkoZHBseXIpDQogIGRmX3kgPC0gZXhwYW5kLmdyaWQodmVjdG9yX3JlbnRhLCB2ZWN0b3JfcmVudGEpDQogIG5hbWVzKGRmX3kpIDwtIGMoIllqIiwgIllrIikNCiAgZGZfbiA8LSBleHBhbmQuZ3JpZCh2ZWN0b3JfcG9ibGFjaW9uLCB2ZWN0b3JfcG9ibGFjaW9uKQ0KICBuYW1lcyhkZl9uKSA8LSBjKCJOaiIsICJOayIpDQogIGdpbmlfZGF0YSA8LSBiaW5kX2NvbHMoZGZfbiwgZGZfeSkNCiAgIyBDw6FsY3VsbyBkZWwgZG9ibGUgc3VtYXRvcmlvDQogIHJlbnRhX21lZGlhKHZlY3Rvcl9yZW50YSA9IHZlY3Rvcl9yZW50YSwNCiAgICAgICAgICAgICAgdmVjdG9yX3BvYmxhY2lvbj12ZWN0b3JfcG9ibGFjaW9uKS0+bXUNCiAgIE48LXN1bSh2ZWN0b3JfcG9ibGFjaW9uKQ0KICBnaW5pX2RhdGEgJT4lIG11dGF0ZShkb2JsZV9zdW0gPSBOaiAqIE5rICogYWJzKFlqIC0gWWspKSAtPiBnaW5pX2RhdGENCiAgZ2luaV9kYXRhICU+JSBzdW1tYXJpc2UoR2luaT0oMS8oMiptdSpOXjIpKSpzdW0oZG9ibGVfc3VtKSkgJT4lIHNlbGVjdChHaW5pKS0+R2luaQ0KICBsaXN0KGdpbmlfZGF0YT1naW5pX2RhdGEsbXU9bXUsTj1OLEdpbmk9R2luaVssMV0pDQp9DQoNCiNEYXRhIG9yaWdpbmFsDQpnMTwtZ2luaV9kZWJyYWpfcmF5KHZlY3Rvcl9yZW50YSA9IHksdmVjdG9yX3BvYmxhY2lvbiA9IG4pDQpwcmludChnMSkNCmBgYA0KDQoNCiMjIyBiKSBFbCBhbGNhbGRlIGRlIFInbHllaCAgZWwgIkdyYW4gIFByaW1pZ2VuaW8gQ3RodWxodSIgaGEgcHJvcHVlc3RvIHVuYSB0cmFuc2ZlcmVuY2lhIGRlbCBnb2JpZXJubyBkZSAxNSUgc29icmUgZWwgbW9udG8gZGUgbGFzIHJlbnRhcyBkZSBoYXN0YSAyMDAgdS5tLiB5IHVuIGltcHVlc3RvIHNvYnJlIGxhIHJlbnRhIGRlbCA1JSBwYXJhIGxhcyByZW50YXMgc3VwZXJpb3JlcyBhIGxhcyAyMDAgdS5tLiDCv0xhIGRlc2lndWFsZGFkIGVuIFInbHllaCAgYXVtZW50YSBvIGRpc21pbnV5ZT8gYXJndW1lbnRlIHN1IHJlc3B1ZXN0YSBjb24gZWwgbnVldm8gY29lZmljaWVudGUgZGUgR2luaSwgcGFyYSBsYSBkaXN0cmlidWNpw7NuIGRlIGxhIHJlbnRhICBkZXJpdmFkYSBkZSBsYXMgcG9sw610aWNhcyBkZWwgcHJpbWlnZW5pbyBhbGNhbGRlLCBkZXNjcml0YXMgZW4gZWwgbGl0ZXJhbCBiKQ0KDQojIyMjIFNlIGNhbGN1bGEgbnVldmFtZW50ZSBsYSByZW50YSBtZWRpYSBjb24gbGFzIHBvbGl0aWNhcyBkZWwgYWxjYWxkZSBkZSBSJ2x5ZWgNCg0KYGBge3J9DQoNCnkyIDwtIGMoMTAwKigxLjE1KSwgMjAwKigxLjE1KSwgMzAwLygxLjA1KSwgNDAwLygxLjA1KSw3MDAvKDEuMDUpKQ0KbjIgPC0gYyg1MCwgMzUsIDU1LCAzNSwxMCkNCg0KI0PDoWxjdWxvIGRlIGxhIHJlbnRhIG1lZGlhDQpyZW50YV9tZWRpYSA8LSBmdW5jdGlvbih2ZWN0b3JfcmVudGEsIHZlY3Rvcl9wb2JsYWNpb24pIHsNCiAgYXMudmVjdG9yKGNyb3NzcHJvZCh2ZWN0b3JfcmVudGEsIHZlY3Rvcl9wb2JsYWNpb24pIC8gc3VtKHZlY3Rvcl9wb2JsYWNpb24pKQ0KfQ0KcmVudGFfbWVkaWEodmVjdG9yX3JlbnRhID0geTIsIHZlY3Rvcl9wb2JsYWNpb24gPSBuMikNCg0KDQpgYGANCiMjIyMgU2UgY2FsY3VsYSBudWV2YW1lbnRlIGVsIEdJTkkgY29uIGxhcyBwb2xpdGljYXMgZGVsIGFsY2FsZGUgZGUgUidseWVoDQoNCmBgYHtyfQ0Kb3B0aW9ucyhzY2lwZW4gPSA5OTk5OTkpDQpnaW5pX2RlYnJhal9yYXkgPC0gZnVuY3Rpb24odmVjdG9yX3JlbnRhLCB2ZWN0b3JfcG9ibGFjaW9uKSB7DQogICMgR2VuZXJhY2nDs24gZGVsIERhdGFmcmFtZSBwYXJhIGVsIGPDoWxjdWxvDQogIGxpYnJhcnkoZHBseXIpDQogIGRmX3kgPC0gZXhwYW5kLmdyaWQodmVjdG9yX3JlbnRhLCB2ZWN0b3JfcmVudGEpDQogIG5hbWVzKGRmX3kpIDwtIGMoIllqIiwgIllrIikNCiAgZGZfbiA8LSBleHBhbmQuZ3JpZCh2ZWN0b3JfcG9ibGFjaW9uLCB2ZWN0b3JfcG9ibGFjaW9uKQ0KICBuYW1lcyhkZl9uKSA8LSBjKCJOaiIsICJOayIpDQogIGdpbmlfZGF0YSA8LSBiaW5kX2NvbHMoZGZfbiwgZGZfeSkNCiAgIyBDw6FsY3VsbyBkZWwgZG9ibGUgc3VtYXRvcmlvDQogIHJlbnRhX21lZGlhKHZlY3Rvcl9yZW50YSA9IHZlY3Rvcl9yZW50YSwNCiAgICAgICAgICAgICAgdmVjdG9yX3BvYmxhY2lvbj12ZWN0b3JfcG9ibGFjaW9uKS0+bXUNCiAgIE48LXN1bSh2ZWN0b3JfcG9ibGFjaW9uKQ0KICBnaW5pX2RhdGEgJT4lIG11dGF0ZShkb2JsZV9zdW0gPSBOaiAqIE5rICogYWJzKFlqIC0gWWspKSAtPiBnaW5pX2RhdGENCiAgZ2luaV9kYXRhICU+JSBzdW1tYXJpc2UoR2luaT0oMS8oMiptdSpOXjIpKSpzdW0oZG9ibGVfc3VtKSkgJT4lIHNlbGVjdChHaW5pKS0+R2luaQ0KICBsaXN0KGdpbmlfZGF0YT1naW5pX2RhdGEsbXU9bXUsTj1OLEdpbmk9R2luaVssMV0pDQp9DQoNCiNEYXRhIG9yaWdpbmFsDQpnMjwtZ2luaV9kZWJyYWpfcmF5KHZlY3Rvcl9yZW50YSA9IHkyLHZlY3Rvcl9wb2JsYWNpb24gPSBuMikNCnByaW50KGcyKQ0KDQojRW4gZXN0ZSBjYXNvIGNvbiBsYSB0cmFuc2ZlcmVuY2lhIGRlbCBnb2JpZXJubyBkZWwgMTUlIGEgbGFzIHJlbnRhcyBkZSBoYXN0YSAyMDAgdS5tLiB5IGNvbiBlbCBpbXB1ZXN0byBkZWwgNSUgYSBsYXMgcmVudGFzIHN1cGVyaW9yZXMgYSBsYXMgMjAwIHUubS4sIHNlIHB1ZWRlIGNvbmNsdWlyIHF1ZSBsYSBkZXNpZ3VhbGRhZCBoYSBkaXNtaW51aWRvIGVuIGxhIGNpdWRhZCBkZSBSJ2x5ZWgsIGVzIGRlY2lyLCBhaG9yYSBlcyBtYXMgZXF1aXRhdGl2byBsYSBkaXN0cmlidWNpw7NuIGRlbCBpbmdyZXMgeWEgcXVlIHNlIHBhc2EgZGUgdW4gR2luaSBkZSAwLjI5MjY1NjMgYSAwLjI1NjUyNjcuDQoNCmBgYA0KDQojIyMgYykgTGEgc2V2ZXJpZGFkIGRlIGxhIHBvYnJlemEgKEZHVDIpIGF1bWVudGEgbyBkaXNtaW51eWUgY29uIGxhIHBvbMOtdGljYSBkZWwgcHJpbWlnZW5pbyBhbGNhbGRlLCBkZXNjcml0YSBlbiBlbCBsaXRlcmFsIGIpLCBhcmd1bWVudGUgc3UgcmVzcHVlc3RhDQoNCiMjIyMgU2luIHBvbGl0aWNhcyBkZSByZWRpc3RyaWJ1Y2lvbiBkZWwgaW5ncmVzbw0KDQpgYGB7cn0NCkt1em5ldHMuWC5ZIDwtIGZ1bmN0aW9uKHZlY3Rvcl9yZW50YSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHZlY3Rvcl9wb2JsYWNpb24gPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgY3VhbnRpbF94LA0KICAgICAgICAgICAgICAgICAgICAgICAgY3VhbnRpbF95KSB7DQogIGxpYnJhcnkocHVycnIpDQogIG1hcDIodmVjdG9yX3JlbnRhLCB2ZWN0b3JfcG9ibGFjaW9uLCAuZiA9IHJlcCkgJT4lDQogICAgdW5saXN0KCkgJT4lIHF1YW50aWxlKHByb2JzID0gYyhjdWFudGlsX3gpKSAtPiBQb2IuWA0KICBtYXAyKHZlY3Rvcl9yZW50YSwgdmVjdG9yX3BvYmxhY2lvbiwgLmYgPSByZXApICU+JSANCiAgICB1bmxpc3QoKSAlPiUgcXVhbnRpbGUocHJvYnMgPSBjKDEtY3VhbnRpbF95KSkgLT4gUG9iLlkNCiAgbGlzdChLdXpuZXRzLmluZGljZT11bm5hbWUoUG9iLlkvUG9iLlgpLFBvYi5YPVBvYi5YLFBvYi5ZPVBvYi5ZKQ0KfQ0KIyBFamVtcGxvIGRlIHVzbw0KS3V6bmV0cy5YLlkodmVjdG9yX3JlbnRhID0geSx2ZWN0b3JfcG9ibGFjaW9uID0gbixjdWFudGlsX3ggPSAwLjIsY3VhbnRpbF95ID0wLjIpDQpgYGANCg0KIyMjIyBDb24gcG9saXRpY2FzIGRlIHJlZGlzdHJpYnVjaW9uIGRlbCBpbmdyZXNvDQoNCmBgYHtyfQ0KS3V6bmV0cy5YLlkgPC0gZnVuY3Rpb24odmVjdG9yX3JlbnRhLA0KICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yX3BvYmxhY2lvbiA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICBjdWFudGlsX3gsDQogICAgICAgICAgICAgICAgICAgICAgICBjdWFudGlsX3kpIHsNCiAgbGlicmFyeShwdXJycikNCiAgbWFwMih2ZWN0b3JfcmVudGEsIHZlY3Rvcl9wb2JsYWNpb24sIC5mID0gcmVwKSAlPiUNCiAgICB1bmxpc3QoKSAlPiUgcXVhbnRpbGUocHJvYnMgPSBjKGN1YW50aWxfeCkpIC0+IFBvYi5YDQogIG1hcDIodmVjdG9yX3JlbnRhLCB2ZWN0b3JfcG9ibGFjaW9uLCAuZiA9IHJlcCkgJT4lIA0KICAgIHVubGlzdCgpICU+JSBxdWFudGlsZShwcm9icyA9IGMoMS1jdWFudGlsX3kpKSAtPiBQb2IuWQ0KICBsaXN0KEt1em5ldHMuaW5kaWNlPXVubmFtZShQb2IuWS9Qb2IuWCksUG9iLlg9UG9iLlgsUG9iLlk9UG9iLlkpDQp9DQojIEVqZW1wbG8gZGUgdXNvDQpLdXpuZXRzLlguWSh2ZWN0b3JfcmVudGEgPSB5Mix2ZWN0b3JfcG9ibGFjaW9uID0gbjIsY3VhbnRpbF94ID0gMC4yLGN1YW50aWxfeSA9MC4yKQ0KDQojRW4gZXN0ZSBwdW50byBzZSBwdWVkZSBhcmd1bWVudGFyIHF1ZSBsYSBzZXZlcmlkYWQgZGUgbGEgcG9icmV6YSBkaXNtaW51eWUgeWEgcXVlIGVuIGVsIHByaW1lciBjYXNvLCBjdWFuZG8gbm8gc2UgaGFuIGFwbGljYWRvIGxhcyBwb2xpdGljYXMgZGUgcmVkaXN0cmlidWNpb24gZGVsIGluZ3Jlc28gcG9yIGNhZGEgdS5tLiBxdWUgcmVjaWJlIGVsIDIwJSBtYXMgcG9icmUsIGxlIGluZ3Jlc2FuIDMuNDcgdS5tLiBhbCAyMCUgbWFzIHJpY28uDQoNCiNwb3N0ZXJpb3IgYSBsYSBhcGxpY2FjacOzbiBkZSBsYXMgcG9saXRpY2FzIGRlIHJlZGlzdHJpYnVjaW9uIGRlbCBpbmdyZXNvIHNlIHRpZW5lIHF1ZSBwb3IgY2FkYSB1Lm0uIHF1ZSByZWNpYmUgZWwgMjAlIG1hcyBwb2JyZSwgbGUgaW5ncmVzYW4gMy4zMTI2IHUubS4gYWwgMjAlIG1hcyByaWNvLiANCmBgYA0KDQojIyMgZCkgRGUgYWN1ZXJkbyBhIGFsIGluZGljYWRvciBkZSBLdXpuZXQsIGhheSBjYW1iaW9zIGV2aWRlbnRlcyBlbnRyZSBlbCAxMCUgbcOhcyByaWNvIHkgZWwgNDAlIG3DoXMgcG9icmUgZGUgbGEgY2l1ZGFkIGRlIFInbHllaCwgY29uIGxhIGltcGxlbWVudGFjacOzbiBkZSBsYSBwb2zDrXRpY2EgZGVsIHByaW1pZ2VuaW8gYWxjYWxkZSwgeWEgZGVzY3JpdGEgY29uIGFudGVyaW9yaWRhZC4gQXJndW1lbnRlIHN1IHJlc3B1ZXN0YQ0KDQojIyMjIFNpbiBsYSBwb2xpdGljYSBkZWwgYWxjYWxkZSBkZSBSJ2x5ZWgNCg0KYGBge3J9DQpLdXpuZXRzLlguWSA8LSBmdW5jdGlvbih2ZWN0b3JfcmVudGEsDQogICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3JfcG9ibGFjaW9uID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1YW50aWxfeCwNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1YW50aWxfeSkgew0KICBsaWJyYXJ5KHB1cnJyKQ0KICBtYXAyKHZlY3Rvcl9yZW50YSwgdmVjdG9yX3BvYmxhY2lvbiwgLmYgPSByZXApICU+JQ0KICAgIHVubGlzdCgpICU+JSBxdWFudGlsZShwcm9icyA9IGMoY3VhbnRpbF94KSkgLT4gUG9iLlgNCiAgbWFwMih2ZWN0b3JfcmVudGEsIHZlY3Rvcl9wb2JsYWNpb24sIC5mID0gcmVwKSAlPiUgDQogICAgdW5saXN0KCkgJT4lIHF1YW50aWxlKHByb2JzID0gYygxLWN1YW50aWxfeSkpIC0+IFBvYi5ZDQogIGxpc3QoS3V6bmV0cy5pbmRpY2U9dW5uYW1lKFBvYi5ZL1BvYi5YKSxQb2IuWD1Qb2IuWCxQb2IuWT1Qb2IuWSkNCn0NCiMgRWplbXBsbyBkZSB1c28NCkt1em5ldHMuWC5ZKHZlY3Rvcl9yZW50YSA9IHksdmVjdG9yX3BvYmxhY2lvbiA9IG4sY3VhbnRpbF94ID0gMC40LGN1YW50aWxfeSA9MC4xKQ0KDQpgYGANCg0KIyMjIyBDb24gbGEgcG9saXRpY2EgZGVsIGFsY2FsZGUgZGUgUidseWVoDQoNCmBgYHtyfQ0KDQpLdXpuZXRzLlguWSA8LSBmdW5jdGlvbih2ZWN0b3JfcmVudGEsDQogICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3JfcG9ibGFjaW9uID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1YW50aWxfeCwNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1YW50aWxfeSkgew0KICBsaWJyYXJ5KHB1cnJyKQ0KICBtYXAyKHZlY3Rvcl9yZW50YSwgdmVjdG9yX3BvYmxhY2lvbiwgLmYgPSByZXApICU+JQ0KICAgIHVubGlzdCgpICU+JSBxdWFudGlsZShwcm9icyA9IGMoY3VhbnRpbF94KSkgLT4gUG9iLlgNCiAgbWFwMih2ZWN0b3JfcmVudGEsIHZlY3Rvcl9wb2JsYWNpb24sIC5mID0gcmVwKSAlPiUgDQogICAgdW5saXN0KCkgJT4lIHF1YW50aWxlKHByb2JzID0gYygxLWN1YW50aWxfeSkpIC0+IFBvYi5ZDQogIGxpc3QoS3V6bmV0cy5pbmRpY2U9dW5uYW1lKFBvYi5ZL1BvYi5YKSxQb2IuWD1Qb2IuWCxQb2IuWT1Qb2IuWSkNCn0NCiMgRWplbXBsbyBkZSB1c28NCkt1em5ldHMuWC5ZKHZlY3Rvcl9yZW50YSA9IHkyLHZlY3Rvcl9wb2JsYWNpb24gPSBuMixjdWFudGlsX3ggPSAwLjQsY3VhbnRpbF95ID0wLjEpDQoNCiNFbiBlc3RlIHB1bnRvIHNlIHB1ZWRlIGFyZ3VtZW50YXIgcXVlIGhheSB1biBtZWpvciBiYWxhbmNlIGVuIGVsIGluZ3Jlc28sIHlhIHF1ZSBzaW4gbGEgcG9saXRjYSBkZWwgYWxjYWxkZSBwb3IgY2FkYSB1Lm0uIHF1ZSByZWNpYmUgZWwgNDAlIG1hcyBwb2JyZSwgbGUgaW5ncmVzYW4gMiB1Lm0uIGFsIDEwJSBtYXMgcmljby4NCg0KI1lhIGNvbiBsYSBpbXBsZW1lbnRhY2lvbiBkZSBsYSBwb2xpdGljYSBkZWwgYWxjYWxkZSBwb3IgY2FkYSB1Lm0uIHF1ZSByZWNpYmUgZWwgNDAlIG1hcyBwb2JyZSwgbGEgY2FudGlkYWQgcXVlIHJlY2liZSBlbCAxMCUgbWFzIHJpY28gZGlzbWludXllIGRlIDIgYSAxLjY1IHUubS4sIGhhY2llbmRvIG1hcyBlcXVpdGF0aXZvIGxhIGRpc3RyaWJ1Y2lvbiBkZWwgaW5ncmVzby4NCmBgYA0KDQo=