library(mgcv)
Warning: package ‘mgcv’ was built under R version 4.2.2Carregando pacotes exigidos: nlme
Warning: package ‘nlme’ was built under R version 4.2.2This is mgcv 1.8-42. For overview type 'help("mgcv-package")'.
library(readr)
Warning: package ‘readr’ was built under R version 4.2.2
library(tidyverse)
Warning: package ‘tidyverse’ was built under R version 4.2.3Warning: package ‘ggplot2’ was built under R version 4.2.3Warning: package ‘tidyr’ was built under R version 4.2.3Warning: package ‘purrr’ was built under R version 4.2.2Warning: package ‘dplyr’ was built under R version 4.2.2Warning: package ‘stringr’ was built under R version 4.2.3Warning: package ‘forcats’ was built under R version 4.2.2Warning: package ‘lubridate’ was built under R version 4.2.2-- Attaching core tidyverse packages ------------------------------------------------ tidyverse 2.0.0 --
v dplyr     1.1.0     v purrr     1.0.1
v forcats   1.0.0     v stringr   1.5.1
v ggplot2   3.5.0     v tibble    3.1.8
v lubridate 1.9.2     v tidyr     1.3.0-- Conflicts ------------------------------------------------------------------ tidyverse_conflicts() --
x dplyr::collapse() masks nlme::collapse()
x dplyr::filter()   masks stats::filter()
x dplyr::lag()      masks stats::lag()
i Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(tidylog)
Warning: package ‘tidylog’ was built under R version 4.2.3
Attaching package: ‘tidylog’

The following objects are masked from ‘package:dplyr’:

    add_count, add_tally, anti_join, count, distinct, distinct_all, distinct_at,
    distinct_if, filter, filter_all, filter_at, filter_if, full_join, group_by,
    group_by_all, group_by_at, group_by_if, inner_join, left_join, mutate, mutate_all,
    mutate_at, mutate_if, relocate, rename, rename_all, rename_at, rename_if, rename_with,
    right_join, sample_frac, sample_n, select, select_all, select_at, select_if, semi_join,
    slice, slice_head, slice_max, slice_min, slice_sample, slice_tail, summarise,
    summarise_all, summarise_at, summarise_if, summarize, summarize_all, summarize_at,
    summarize_if, tally, top_frac, top_n, transmute, transmute_all, transmute_at,
    transmute_if, ungroup

The following objects are masked from ‘package:tidyr’:

    drop_na, fill, gather, pivot_longer, pivot_wider, replace_na, spread, uncount

The following object is masked from ‘package:stats’:

    filter
library(data.table)
Warning: package ‘data.table’ was built under R version 4.2.2Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
data.table 1.14.8 using 6 threads (see ?getDTthreads).  Latest news: r-datatable.com

Attaching package: ‘data.table’

The following objects are masked from ‘package:lubridate’:

    hour, isoweek, mday, minute, month, quarter, second, wday, week, yday, year

The following objects are masked from ‘package:dplyr’:

    between, first, last

The following object is masked from ‘package:purrr’:

    transpose
library(skimr)
Warning: package ‘skimr’ was built under R version 4.2.3

Analise da Base de dados

t2 <- fread("reservatorio_base_analise.csv")
|--------------------------------------------------|
|==================================================|
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument

t2 %>% str()
Classes ‘data.table’ and 'data.frame':  624825 obs. of  78 variables:
 $ V1                                          : int  1 2 3 4 5 6 7 8 9 10 ...
 $ ...1                                        : num  1 2 3 4 5 6 7 8 9 10 ...
 $ nom_reservatorio                            : chr  "A. VERMELHA" "ANTA" "B. BONITA" "BALBINA" ...
 $ cod_resplanejamento.x                       : int  18 128 37 277 86 20 118 190 27 14 ...
 $ tip_reservatorio.x                          : chr  "Reservat<f3>rio com Usina" "Reservat<f3>rio sem usina" "Reservat<f3>rio com Usina" "Reservat<f3>rio com Usina" ...
 $ nom_bacia.x                                 : chr  "GRANDE" "PARAIBA DO SUL" "TIETE" "AMAZONAS" ...
 $ nom_ree.x                                   : chr  "PARANA" "SUDESTE" "PARANA" "MANAUS-AMAPA" ...
 $ id_subsistema.x                             : chr  "SE" "SE" "SE" "N" ...
 $ nom_subsistema.x                            : chr  "SUDESTE" "SUDESTE" "SUDESTE" "NORTE" ...
 $ id_subsistema_jusante                       : chr  NA NA NA NA ...
 $ nom_subsistema_jusante                      : chr  NA NA NA NA ...
 $ ear_data                                    : IDate, format: "2023-01-01" "2023-01-01" "2023-01-01" "2023-01-01" ...
 $ ear_reservatorio_subsistema_proprio_mwmes   : num  1817 NA 2227 430 2346 ...
 $ ear_reservatorio_subsistema_jusante_mwmes   : num  NA NA NA NA NA NA NA NA NA NA ...
 $ earmax_reservatorio_subsistema_proprio_mwmes: num  4340 NA 2714 786 2991 ...
 $ earmax_reservatorio_subsistema_jusante_mwmes: num  NA NA NA NA NA NA NA NA NA NA ...
 $ ear_reservatorio_percentual                 : num  41.9 NA 82.1 54.7 78.4 ...
 $ ear_total_mwmes                             : num  1817 0 2227 430 2346 ...
 $ ear_maxima_total_mwmes                      : num  4340 0 2714 786 2991 ...
 $ val_contribearbacia                         : num  0.0572 0 0.2919 0.4667 0.4588 ...
 $ val_contribearmaxbacia                      : num  0.0842 0 0.279 0.3874 0.4445 ...
 $ val_contribearsubsistema                    : num  0.0166 0 0.0203 0.0455 0.136 ...
 $ val_contribearmaxsubsistema                 : num  0.0212 0 0.0133 0.0513 0.1462 ...
 $ val_contribearsubsistemajusante             : num  0 0 0 0 0 0 0 0 0 0 ...
 $ val_contribearmaxsubsistemajusante          : num  0 0 0 0 0 0 0 0 0 0 ...
 $ val_contribearsin                           : num  0.0106 0 0.013 0.00251 0.01369 ...
 $ val_contribearmaxsin                        : num  0.01486 0 0.00929 0.00269 0.01024 ...
 $ tip_reservatorio.y                          : chr  "RESERVAT<d3>RIO COM USINA" NA "RESERVAT<d3>RIO COM USINA" "RESERVAT<d3>RIO COM USINA" ...
 $ cod_resplanejamento.y                       : int  18 NA 37 277 86 20 NA 190 27 14 ...
 $ cod_posto                                   : int  18 NA 237 269 215 22 NA 190 207 14 ...
 $ nom_usina                                   : chr  "<c1>GUA VERMELHA" NA "BARRA BONITA" "BALBINA" ...
 $ ceg                                         : chr  "UHE.PH.MG.000041-8.01" NA "UHE.PH.SP.000208-9.01" "UHE.PH.AM.000190-2.01" ...
 $ id_subsistema.y                             : chr  "SE" NA "SE" "N" ...
 $ nom_subsistema.y                            : chr  "SUDESTE/CENTRO-OESTE" NA "SUDESTE/CENTRO-OESTE" "NORTE" ...
 $ nom_bacia.y                                 : chr  "GRANDE" NA "TIETE" "AMAZONAS" ...
 $ nom_rio                                     : chr  "GRANDE" NA "TIET<ca>" "UATUMA" ...
 $ nom_ree.y                                   : chr  "PARANA" NA "PARANA" "MANAUS-AMAPA" ...
 $ dat_entrada                                 : IDate, format: "1978-03-01" NA "1963-02-01" "1989-02-13" ...
 $ val_cotamaxima                              : num  383 NA 452 51 647 ...
 $ val_cotaminima                              : num  373 NA 440 46 617 ...
 $ val_volmax                                  : num  11025 NA 3135 20006 4904 ...
 $ val_volmin                                  : num  5856 NA 569 9712 2712 ...
 $ val_volutiltot                              : num  5169 NA 2567 10210 2193 ...
 $ val_produtibilidadeespecifica               : num  0.00882 NA 0.00885 0.00898 0.00922 ...
 $ val_produtividade65volutil                  : num  0.463 NA 0.178 0.208 1.415 ...
 $ val_tipoperda                               : chr  "m" NA "m" "m" ...
 $ val_perda                                   : num  0.75 NA 0.41 0.3 2.79 1.2 NA 0.53 1.84 0.87 ...
 $ val_latitude                                : num  -19.87 NA -22.52 -1.91 -27.78 ...
 $ val_longitude                               : num  -50.3 NA -48.5 -59.5 -51.2 ...
 $ cod_modalidadeoperacao                      : chr  NA NA NA NA ...
 $ nom_subsistema.x.x                          : chr  NA NA NA NA ...
 $ nom_estado                                  : chr  NA NA NA NA ...
 $ nom_tipousina                               : chr  NA NA NA NA ...
 $ nom_tipocombustivel                         : chr  NA NA NA NA ...
 $ preciptation                                : num  NA NA NA NA NA NA NA NA NA NA ...
 $ temperature                                 : num  NA NA NA NA NA NA NA NA NA NA ...
 $ humidity                                    : num  NA NA NA NA NA NA NA NA NA NA ...
 $ wind_speed                                  : num  NA NA NA NA NA NA NA NA NA NA ...
 $ co_ppb                                      : num  NA NA NA NA NA NA NA NA NA NA ...
 $ no2_ppb                                     : num  NA NA NA NA NA NA NA NA NA NA ...
 $ o3_ppb                                      : num  NA NA NA NA NA NA NA NA NA NA ...
 $ pm25_ugm3                                   : num  NA NA NA NA NA NA NA NA NA NA ...
 $ so2_ugm3                                    : num  NA NA NA NA NA NA NA NA NA NA ...
 $ val_geracao                                 : num  NA NA NA NA NA NA NA NA NA NA ...
 $ cod_resplanejamento                         : int  18 NA 37 277 86 20 NA NA 27 14 ...
 $ tip_reservatorio                            : chr  "Reservatório com Usina" NA "Reservatório com Usina" "Reservatório com Usina" ...
 $ nom_bacia                                   : chr  "GRANDE" NA "TIETE" "AMAZONAS" ...
 $ nom_ree                                     : chr  "PARANA" NA "PARANA" "MANAUS-AMAPA" ...
 $ id_subsistema                               : chr  "SE" NA "SE" "N" ...
 $ nom_subsistema.y.y                          : chr  "SUDESTE" NA "SUDESTE" "NORTE" ...
 $ ena_bruta_res_mwmed                         : num  1653 NA 187 188 104 ...
 $ ena_bruta_res_percentualmlt                 : num  100 NA 155 227 39 ...
 $ ena_armazenavel_res_mwmed                   : num  1653.1 NA 68.7 187.9 80.3 ...
 $ ena_armazenavel_res_percentualmlt           : num  100.1 NA 56.7 226.9 30 ...
 $ ena_queda_bruta                             : num  1610 NA 199 192 108 ...
 $ mlt_ena                                     : num  1651.7 NA 121.3 82.8 267.7 ...
 $ X                                           : int  NA NA NA NA NA NA NA NA NA NA ...
 $ sum.val_geracao_day.                        : num  NA NA NA NA NA NA NA NA NA NA ...
 - attr(*, ".internal.selfref")=<externalptr> 
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
df %>% skim()## estatistica descritivas das colunas
Error in as.Date.numeric(e) : 'origin' deve ser especificado
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument

Analise de valores faltantes

df %>% mutate(yea=year(ear_data)) %>%# select(yea)%>%  unique() 
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  group_by(yea) %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  summarise(n(),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            n_unique(nom_reservatorio),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            n_unique(nom_subsistema.x),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            n_unique(nom_estado),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            miss_preciptation=sum(is.na(preciptation))/n(),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            miss_temperature=sum(is.na(temperature))/n(),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            miss_gera=sum(is.na(val_geracao))/n(),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            miss_gera_sub=sum(is.na(sum.val_geracao_day.))/n(),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            #miss_ena=sum(is.na(ena_bruta_res_mwmed,))/n(),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            miss_ear=sum(is.na(ear_reservatorio_subsistema_proprio_mwmes))/n())
mutate: new variable 'yea' (integer) with 24 unique values and 0% NA
group_by: one grouping variable (yea)
summarise: now 24 rows and 10 columns, ungrouped
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
df %>% mutate(yea=year(ear_data)) %>%# select(yea)%>%  unique() 
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  group_by(nom_subsistema.x) %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  summarise(n(),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            n_unique(nom_reservatorio),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            n_unique(nom_subsistema.x),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            n_unique(nom_estado),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            miss_preciptation=sum(is.na(preciptation))/n(),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            miss_temperature=sum(is.na(temperature))/n(),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            miss_gera=sum(is.na(val_geracao))/n(),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            miss_gera_sub=sum(is.na(sum.val_geracao_day.))/n(),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            #miss_ena=sum(is.na(ena_bruta_res_mwmed,))/n(),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            miss_ear=sum(is.na(ear_reservatorio_subsistema_proprio_mwmes))/n())
mutate: new variable 'yea' (integer) with 24 unique values and 0% NA
group_by: one grouping variable (nom_subsistema.x)
summarise: now 4 rows and 10 columns, ungrouped
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
df %>% mutate(yea=year(ear_data)) %>% drop_na(preciptation,sum.val_geracao_day.,ena_bruta_res_mwmed,ear_reservatorio_subsistema_proprio_mwmes) %>% # select(yea)%>%  unique()
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  group_by(yea) %>% 
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  summarise(n(),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            n_unique(nom_reservatorio),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            n_unique(nom_subsistema.x),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            n_unique(nom_estado),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            miss_preciptation=sum(is.na(preciptation))/n(),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            miss_temperature=sum(is.na(temperature))/n(),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            miss_gera=sum(is.na(val_geracao))/n(),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            miss_gera_sub=sum(is.na(sum.val_geracao_day.))/n(),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            #miss_ena=sum(is.na(ena_bruta_res_mwmed,))/n(),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            #miss_ear=sum(is.na(ear_reservatorio_subsistema_proprio_mwmes))/n()
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
            )
mutate: new variable 'yea' (integer) with 24 unique values and 0% NA
drop_na: removed 388,276 rows (62%), 236,549 rows remaining
group_by: one grouping variable (yea)
summarise: now 19 rows and 9 columns, ungrouped
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
df1 %>% ggplot(aes(val_geracao,sum.val_geracao_day.,col=nom_subsistema.x))+geom_point() + geom_smooth()
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument

df1 %>% ggplot(aes(val_geracao,ena_bruta_res_mwmed,col=nom_subsistema.x))+geom_jitter() 
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument

df1 %>% ggplot(aes(val_geracao,ear_reservatorio_subsistema_proprio_mwmes,col=nom_subsistema.x))+geom_jitter() 
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument

df1 %>% ggplot(aes(val_geracao,ear_data,col=nom_subsistema.x))+geom_jitter() 
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument

df1 %>% ggplot(aes(yea,ena_bruta_res_mwmed,col=nom_subsistema.x))+geom_jitter() 
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument

df1 %>% ggplot(aes(yea,ear_reservatorio_subsistema_proprio_mwmes,col=nom_subsistema.x))+geom_jitter() 
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument

df1 %>% ggplot(aes(yea,val_geracao,col=nom_subsistema.x))+geom_jitter() 
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument

Analise Inferencial

results %>% distinct()
distinct: removed 2 rows (33%), 4 rows remaining
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
results
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
results %>% ggplot(aes(x=Generation_Trend,y=subset,col=model,
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
                       xmax=Generation_Trend+se*1.96,
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
                       xmin=Generation_Trend-se*1.96))+
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
                     geom_point()+
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  facet_wrap(~`Variavel Respota`,scales="free")+geom_errorbar()+coord_flip()
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument

LS0tDQp0aXRsZTogIkFuYWxpc2UgUmVzZXJ2YXTDs3JpbyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyfQ0KbGlicmFyeShtZ2N2KQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeSh0aWR5bG9nKQ0KbGlicmFyeShkYXRhLnRhYmxlKQ0KbGlicmFyeShza2ltcikNCg0KYGBgDQoNCiMgQW5hbGlzZSBkYSBCYXNlIGRlIGRhZG9zDQoNCmBgYHtyfQ0KdDIgPC0gZnJlYWQoInJlc2VydmF0b3Jpb19iYXNlX2FuYWxpc2UuY3N2IikNCg0KDQpgYGANCg0KYGBge3J9DQoNCnQyICU+JSBzdHIoKQ0KDQpgYGANCg0KYGBge3J9DQpkZjwtdDIgJT4lIHNlbGVjdCgtZW5kc193aXRoKCJ5IikpICMgcmV0aXJhciBjb2x1bmFzIGR1cGxpY2FkYXMgcGVsYSB1bmnDo28gZGUgZGFkb3MNCmRmICU+JSBza2ltKCkjIyBlc3RhdGlzdGljYSBkZXNjcml0aXZhcyBkYXMgY29sdW5hcw0KICANCmBgYA0KDQpBbmFsaXNlIGRlIHZhbG9yZXMgZmFsdGFudGVzDQoNCmBgYHtyfQ0KZGYgJT4lIG11dGF0ZSh5ZWE9eWVhcihlYXJfZGF0YSkpICU+JSMgc2VsZWN0KHllYSklPiUgIHVuaXF1ZSgpIA0KICBncm91cF9ieSh5ZWEpICU+JQ0KICBzdW1tYXJpc2UobigpLA0KICAgICAgICAgICAgbl91bmlxdWUobm9tX3Jlc2VydmF0b3JpbyksDQogICAgICAgICAgICBuX3VuaXF1ZShub21fc3Vic2lzdGVtYS54KSwNCiAgICAgICAgICAgIG5fdW5pcXVlKG5vbV9lc3RhZG8pLA0KICAgICAgICAgICAgbWlzc19wcmVjaXB0YXRpb249c3VtKGlzLm5hKHByZWNpcHRhdGlvbikpL24oKSwNCiAgICAgICAgICAgIG1pc3NfdGVtcGVyYXR1cmU9c3VtKGlzLm5hKHRlbXBlcmF0dXJlKSkvbigpLA0KICAgICAgICAgICAgbWlzc19nZXJhPXN1bShpcy5uYSh2YWxfZ2VyYWNhbykpL24oKSwNCiAgICAgICAgICAgIG1pc3NfZ2VyYV9zdWI9c3VtKGlzLm5hKHN1bS52YWxfZ2VyYWNhb19kYXkuKSkvbigpLA0KICAgICAgICAgICAgI21pc3NfZW5hPXN1bShpcy5uYShlbmFfYnJ1dGFfcmVzX213bWVkLCkpL24oKSwNCiAgICAgICAgICAgIG1pc3NfZWFyPXN1bShpcy5uYShlYXJfcmVzZXJ2YXRvcmlvX3N1YnNpc3RlbWFfcHJvcHJpb19td21lcykpL24oKSkNCg0KYGBgDQoNCmBgYHtyfQ0KZGYgJT4lIG11dGF0ZSh5ZWE9eWVhcihlYXJfZGF0YSkpICU+JSMgc2VsZWN0KHllYSklPiUgIHVuaXF1ZSgpIA0KICBncm91cF9ieShub21fc3Vic2lzdGVtYS54KSAlPiUNCiAgc3VtbWFyaXNlKG4oKSwNCiAgICAgICAgICAgIG5fdW5pcXVlKG5vbV9yZXNlcnZhdG9yaW8pLA0KICAgICAgICAgICAgbl91bmlxdWUobm9tX3N1YnNpc3RlbWEueCksDQogICAgICAgICAgICBuX3VuaXF1ZShub21fZXN0YWRvKSwNCiAgICAgICAgICAgIG1pc3NfcHJlY2lwdGF0aW9uPXN1bShpcy5uYShwcmVjaXB0YXRpb24pKS9uKCksDQogICAgICAgICAgICBtaXNzX3RlbXBlcmF0dXJlPXN1bShpcy5uYSh0ZW1wZXJhdHVyZSkpL24oKSwNCiAgICAgICAgICAgIG1pc3NfZ2VyYT1zdW0oaXMubmEodmFsX2dlcmFjYW8pKS9uKCksDQogICAgICAgICAgICBtaXNzX2dlcmFfc3ViPXN1bShpcy5uYShzdW0udmFsX2dlcmFjYW9fZGF5LikpL24oKSwNCiAgICAgICAgICAgICNtaXNzX2VuYT1zdW0oaXMubmEoZW5hX2JydXRhX3Jlc19td21lZCwpKS9uKCksDQogICAgICAgICAgICBtaXNzX2Vhcj1zdW0oaXMubmEoZWFyX3Jlc2VydmF0b3Jpb19zdWJzaXN0ZW1hX3Byb3ByaW9fbXdtZXMpKS9uKCkpDQpgYGANCg0KYGBge3J9DQpkZiAlPiUgbXV0YXRlKHllYT15ZWFyKGVhcl9kYXRhKSkgJT4lIGRyb3BfbmEocHJlY2lwdGF0aW9uLHN1bS52YWxfZ2VyYWNhb19kYXkuLGVuYV9icnV0YV9yZXNfbXdtZWQsZWFyX3Jlc2VydmF0b3Jpb19zdWJzaXN0ZW1hX3Byb3ByaW9fbXdtZXMpICU+JSAjIHNlbGVjdCh5ZWEpJT4lICB1bmlxdWUoKQ0KICBncm91cF9ieSh5ZWEpICU+JSANCiAgc3VtbWFyaXNlKG4oKSwNCiAgICAgICAgICAgIG5fdW5pcXVlKG5vbV9yZXNlcnZhdG9yaW8pLA0KICAgICAgICAgICAgbl91bmlxdWUobm9tX3N1YnNpc3RlbWEueCksDQogICAgICAgICAgICBuX3VuaXF1ZShub21fZXN0YWRvKSwNCiAgICAgICAgICAgIG1pc3NfcHJlY2lwdGF0aW9uPXN1bShpcy5uYShwcmVjaXB0YXRpb24pKS9uKCksDQogICAgICAgICAgICBtaXNzX3RlbXBlcmF0dXJlPXN1bShpcy5uYSh0ZW1wZXJhdHVyZSkpL24oKSwNCiAgICAgICAgICAgIG1pc3NfZ2VyYT1zdW0oaXMubmEodmFsX2dlcmFjYW8pKS9uKCksDQogICAgICAgICAgICBtaXNzX2dlcmFfc3ViPXN1bShpcy5uYShzdW0udmFsX2dlcmFjYW9fZGF5LikpL24oKSwNCiAgICAgICAgICAgICNtaXNzX2VuYT1zdW0oaXMubmEoZW5hX2JydXRhX3Jlc19td21lZCwpKS9uKCksDQogICAgICAgICAgICAjbWlzc19lYXI9c3VtKGlzLm5hKGVhcl9yZXNlcnZhdG9yaW9fc3Vic2lzdGVtYV9wcm9wcmlvX213bWVzKSkvbigpDQogICAgICAgICAgICApDQpgYA0KYGBgDQoNCmBgYHtyfQ0KZGYxPC1kZiAlPiUgbXV0YXRlKHllYT15ZWFyKGVhcl9kYXRhKSkgJT4lDQogIGRyb3BfbmEocHJlY2lwdGF0aW9uLHN1bS52YWxfZ2VyYWNhb19kYXkuLGVuYV9icnV0YV9yZXNfbXdtZWQsZWFyX3Jlc2VydmF0b3Jpb19zdWJzaXN0ZW1hX3Byb3ByaW9fbXdtZXMpICMgc2VsZWN0KHllYSklPiUgIHVuaXF1ZSgpDQogIA0KZGYxICU+JSBnZ3Bsb3QoYWVzKHZhbF9nZXJhY2FvLHN1bS52YWxfZ2VyYWNhb19kYXkuLGNvbD1ub21fc3Vic2lzdGVtYS54KSkrZ2VvbV9wb2ludCgpIA0KYGBgDQpgYGB7cn0NCmRmMSAlPiUgZ2dwbG90KGFlcyh2YWxfZ2VyYWNhbyxlbmFfYnJ1dGFfcmVzX213bWVkLGNvbD1ub21fc3Vic2lzdGVtYS54KSkrZ2VvbV9qaXR0ZXIoKSANCg0KYGBgDQoNCg0KYGBge3J9DQpkZjEgJT4lIGdncGxvdChhZXModmFsX2dlcmFjYW8sZWFyX3Jlc2VydmF0b3Jpb19zdWJzaXN0ZW1hX3Byb3ByaW9fbXdtZXMsY29sPW5vbV9zdWJzaXN0ZW1hLngpKStnZW9tX2ppdHRlcigpIA0KDQpgYGANCg0KYGBge3J9DQpkZjEgJT4lIGdncGxvdChhZXModmFsX2dlcmFjYW8sZWFyX2RhdGEsY29sPW5vbV9zdWJzaXN0ZW1hLngpKStnZW9tX2ppdHRlcigpIA0KYGBgDQoNCg0KYGBge3J9DQpkZjEgJT4lIGdncGxvdChhZXMoeWVhLGVuYV9icnV0YV9yZXNfbXdtZWQsY29sPW5vbV9zdWJzaXN0ZW1hLngpKStnZW9tX2ppdHRlcigpIA0KYGBgDQoNCmBgYHtyfQ0KZGYxICU+JSBnZ3Bsb3QoYWVzKHllYSxlYXJfcmVzZXJ2YXRvcmlvX3N1YnNpc3RlbWFfcHJvcHJpb19td21lcyxjb2w9bm9tX3N1YnNpc3RlbWEueCkpK2dlb21faml0dGVyKCkgDQpgYGANCg0KYGBge3J9DQpkZjEgJT4lIGdncGxvdChhZXMoeWVhLHZhbF9nZXJhY2FvLGNvbD1ub21fc3Vic2lzdGVtYS54KSkrZ2VvbV9qaXR0ZXIoKSANCmBgYA0KDQojIyBBbmFsaXNlIEluZmVyZW5jaWFsDQoNCmBgYHtyfQ0KDQpyZXN1bHRzPC1kYXRhLmZyYW1lKCkNCnJlc3VsdHMudGVtcDwtZGF0YS5mcmFtZSgpDQojIyMjIE1vZGVsbyBBanVzdGFkbyBlbmFfYnJ1dGFfcmVzX213bWVkIyMjIyMjIw0KI2RmMSRzdW0udmFsX2dlcmFjYW9fZGF5Lg0KZml0LmFqdXN0ZWQgPC0gZ2FtKGVuYV9icnV0YV9yZXNfbXdtZWR+IHZhbF9nZXJhY2FvK3N1bS52YWxfZ2VyYWNhb19kYXkuICsNCiAgICAgICAgICAgICAgICAgICAgICAgeWVhcihlYXJfZGF0YSkgKyBhcy5mYWN0b3IobW9udGgoZWFyX2RhdGEpKSthcy5mYWN0b3Iod2Vla2RheXMoZWFyX2RhdGEpKSsNCiAgICAgICAgICAgICAgICAgICAgICAgcyh0ZW1wZXJhdHVyZSkgKyBzKHByZWNpcHRhdGlvbikgKyBzKHdpbmRfc3BlZWQpICsNCiAgICAgICAgICAgICAgICAgICAgICAgcyhjb19wcGIpLCBkYXRhPWRmMSkgICAgICMjIyMgQWx0ZXJlIG8gUG9sdWVudGUgYW5hbGlzYWRvDQoNCiMjU0UNClZjb3YgPC0gdmNvdihmaXQuYWp1c3RlZCwgdXNlU2NhbGUgPSBGQUxTRSkNClN0ZF9FcnJvcnMgPC0gc3FydChkaWFnKFZjb3YpKQ0Kc2UgPC0gU3RkX0Vycm9yc1s0XQ0Kc3VtbWFyeShmaXQuYWp1c3RlZCkNCmZpdC5hanVzdGVkJGNvZWZmaWNpZW50c1s0XSMtMy4zMTZlKzAwDQpyZXN1bHRzLnRlbXBbMSwxXTwtIkZ1bGxfYmFzZSINCnJlc3VsdHMudGVtcFsxLDJdPC1maXQuYWp1c3RlZCRjb2VmZmljaWVudHNbNF0NCnJlc3VsdHMudGVtcFsxLDNdPC0iQURKVVNURUQiDQpyZXN1bHRzLnRlbXBbMSw0XTwtImVuYV9icnV0YV9yZXNfbXdtZWQiDQpyZXN1bHRzLnRlbXBbMSw1XSA8LSBzZQ0KcmVzdWx0cy50ZW1wWzEsNl0gPC0gbGVuZ3RoKGRmMSRub21fcmVzZXJ2YXRvcmlvKQ0KDQojTW9kZWxvIE7Do28gQWp1c3RhZG8gZW5hX2JydXRhX3Jlc19td21lZCMjIyMjIw0KZml0LnVuYWp1c3RlZCA8LSBnYW0oZW5hX2JydXRhX3Jlc19td21lZH4gdmFsX2dlcmFjYW8rc3VtLnZhbF9nZXJhY2FvX2RheS4gKw0KICAgICAgICAgICAgICAgICAgICAgICB5ZWFyKGVhcl9kYXRhKSArIGFzLmZhY3Rvcihtb250aChlYXJfZGF0YSkpK2FzLmZhY3Rvcih3ZWVrZGF5cyhlYXJfZGF0YSkpLA0KICAgICAgICAgICAgICAgICAgICAgZGF0YT1kZjEpICAgICAjIyMjIEFsdGVyZSBvIFBvbHVlbnRlIGFuYWxpc2Fkbw0KDQpWY292IDwtIHZjb3YoZml0LnVuYWp1c3RlZCwgdXNlU2NhbGUgPSBGQUxTRSkNClN0ZF9FcnJvcnMgPC0gc3FydChkaWFnKFZjb3YpKQ0Kc2UgPC0gU3RkX0Vycm9yc1s0XQ0KDQpyZXN1bHRzLnRlbXBbMiwxXTwtIkZ1bGxfYmFzZSINCnJlc3VsdHMudGVtcFsyLDJdPC1maXQudW5hanVzdGVkJGNvZWZmaWNpZW50c1s0XQ0KcmVzdWx0cy50ZW1wWzIsM108LSJVTkFESlVTVEVEIg0KcmVzdWx0cy50ZW1wWzIsNF08LSJlbmFfYnJ1dGFfcmVzX213bWVkIg0KcmVzdWx0cy50ZW1wWzIsNV0gPC0gc2UNCnJlc3VsdHMudGVtcFsyLDZdIDwtIGxlbmd0aChkZjEkbm9tX3Jlc2VydmF0b3JpbykNCg0KDQoNCiMjIyMjIyBDaGFuZ2UgaGVyZSB0aGUgbmFtZQ0KDQpjb2xuYW1lcyhyZXN1bHRzLnRlbXApPC1jKCJzdWJzZXQiLCAiR2VuZXJhdGlvbl9UcmVuZCIsIm1vZGVsIiwiVmFyaWF2ZWwgUmVzcG90YSIsIlNFIiwibiIpDQpyZXN1bHRzPC1yYmluZChyZXN1bHRzLCByZXN1bHRzLnRlbXApDQpyZXN1bHRzLnRlbXA8LWRhdGEuZnJhbWUoKQ0KDQoNCiNkZjEkZWFyX2RhdGEgJT4lIGFzX2RhdGUoKS0+ZGYxJGVhcl9kYXRhDQojZGYxJGVhcl9yZXNlcnZhdG9yaW9fc3Vic2lzdGVtYV9wcm9wcmlvX213bWVzICU+JSBzdHINCg0KDQoNCiMjIyMgTW9kZWxvIEFqdXN0YWRvIGVhcl9yZXNlcnZhdG9yaW9fc3Vic2lzdGVtYV9wcm9wcmlvX213bWVzICMjIyMjDQpkZjEkZWFyX3Jlc2VydmF0b3Jpb19zdWJzaXN0ZW1hX3Byb3ByaW9fbXdtZXMgJT4lIGFzLm51bWVyaWMoKS0+ZGYxJGVhcl9yZXNlcnZhdG9yaW9fc3Vic2lzdGVtYV9wcm9wcmlvX213bWVzDQpmaXQuYWp1c3RlZCA8LSBnYW0oZWFyX3Jlc2VydmF0b3Jpb19zdWJzaXN0ZW1hX3Byb3ByaW9fbXdtZXN+IHZhbF9nZXJhY2FvK3N1bS52YWxfZ2VyYWNhb19kYXkuICsNCiAgICAgICAgICAgICAgICAgICAgIHllYXIoZWFyX2RhdGEpICsgYXMuZmFjdG9yKG1vbnRoKGVhcl9kYXRhKSkrYXMuZmFjdG9yKHdlZWtkYXlzKGVhcl9kYXRhKSkrDQogICAgICAgICAgICAgICAgICAgICBzKHRlbXBlcmF0dXJlKSArIHMocHJlY2lwdGF0aW9uKSArIHMod2luZF9zcGVlZCkgKw0KICAgICAgICAgICAgICAgICAgICAgcyhjb19wcGIpLCBkYXRhPWRmMSkgICAgICMjIyMgQWx0ZXJlIG8gUG9sdWVudGUgYW5hbGlzYWRvDQoNCiMjU0UNClZjb3YgPC0gdmNvdihmaXQuYWp1c3RlZCwgdXNlU2NhbGUgPSBGQUxTRSkNClN0ZF9FcnJvcnMgPC0gc3FydChkaWFnKFZjb3YpKQ0Kc2UgPC0gU3RkX0Vycm9yc1s0XQ0Kc3VtbWFyeShmaXQuYWp1c3RlZCkNCnJlc3VsdHMudGVtcDwtZGF0YS5mcmFtZSgpDQpmaXQuYWp1c3RlZCRjb2VmZmljaWVudHNbNF0jLTMuMzE2ZSswMA0KcmVzdWx0cy50ZW1wWzEsMV08LSJGdWxsX2Jhc2UiDQpyZXN1bHRzLnRlbXBbMSwyXTwtZml0LmFqdXN0ZWQkY29lZmZpY2llbnRzWzRdDQpyZXN1bHRzLnRlbXBbMSwzXTwtIkFESlVTVEVEIg0KcmVzdWx0cy50ZW1wWzEsNF08LSJlYXJfcmVzZXJ2YXRvcmlvX3N1YnNpc3RlbWFfcHJvcHJpb19td21lcyINCnJlc3VsdHMudGVtcFsxLDVdIDwtIHNlDQpyZXN1bHRzLnRlbXBbMSw2XSA8LSBsZW5ndGgoZGYxJG5vbV9yZXNlcnZhdG9yaW8pDQoNCiNNb2RlbG8gTsOjbyBBanVzdGFkbyBlYXJfcmVzZXJ2YXRvcmlvX3N1YnNpc3RlbWFfcHJvcHJpb19td21lcyMjIyMjDQoNCmZpdC51bmFqdXN0ZWQgPC0gZ2FtKGVhcl9yZXNlcnZhdG9yaW9fc3Vic2lzdGVtYV9wcm9wcmlvX213bWVzfiB2YWxfZ2VyYWNhbytzdW0udmFsX2dlcmFjYW9fZGF5LiArDQogICAgICAgICAgICAgICAgICAgICAgIHllYXIoZWFyX2RhdGEpICsgYXMuZmFjdG9yKG1vbnRoKGVhcl9kYXRhKSkrYXMuZmFjdG9yKHdlZWtkYXlzKGVhcl9kYXRhKSksDQogICAgICAgICAgICAgICAgICAgICBkYXRhPWRmMSkgICAgICMjIyMgQWx0ZXJlIG8gUG9sdWVudGUgYW5hbGlzYWRvDQoNClZjb3YgPC0gdmNvdihmaXQudW5hanVzdGVkLCB1c2VTY2FsZSA9IEZBTFNFKQ0KU3RkX0Vycm9ycyA8LSBzcXJ0KGRpYWcoVmNvdikpDQpzZSA8LSBTdGRfRXJyb3JzWzRdDQoNCnJlc3VsdHMudGVtcFsyLDFdPC0iRnVsbF9iYXNlIg0KcmVzdWx0cy50ZW1wWzIsMl08LWZpdC51bmFqdXN0ZWQkY29lZmZpY2llbnRzWzRdDQpyZXN1bHRzLnRlbXBbMiwzXTwtIlVOQURKVVNURUQiDQpyZXN1bHRzLnRlbXBbMiw0XTwtImVhcl9yZXNlcnZhdG9yaW9fc3Vic2lzdGVtYV9wcm9wcmlvX213bWVzIg0KcmVzdWx0cy50ZW1wWzIsNV0gPC0gc2UNCnJlc3VsdHMudGVtcFsyLDZdIDwtIGxlbmd0aChkZjEkbm9tX3Jlc2VydmF0b3JpbykNCg0KY29sbmFtZXMocmVzdWx0cy50ZW1wKTwtYygic3Vic2V0IiwgIkdlbmVyYXRpb25fVHJlbmQiLCJtb2RlbCIsIlZhcmlhdmVsIFJlc3BvdGEiLCJTRSIsIm4iKQ0KcmVzdWx0czwtcmJpbmQocmVzdWx0cywgcmVzdWx0cy50ZW1wKQ0KcmVzdWx0cyAlPiUgZGlzdGluY3QoKQ0KYGBgDQoNCmBgYHtyfQ0Kc3Vic2lzdGVtYTwtZGYxJG5vbV9zdWJzaXN0ZW1hLnggJT4lIHVuaXF1ZSgpDQojZGYyPC1kZjEkDQojc3Vic2lzdGVtYVsyOjNdDQpmb3IgKGkgaW4gc3Vic2lzdGVtYSkgew0KICBwcmludChpKQ0KICBkZjI8LWRmMSAlPiUgZmlsdGVyKG5vbV9zdWJzaXN0ZW1hLng9PWkpDQogIHJlc3VsdHMudGVtcDwtZGF0YS5mcmFtZSgpDQogICMjIyMjIE1vZGVsbyBBanVzdGFkbyBlbmFfYnJ1dGFfcmVzX213bWVkIyMjIyMjIw0KICBmaXQuYWp1c3RlZCA8LSBnYW0oZW5hX2JydXRhX3Jlc19td21lZH4gdmFsX2dlcmFjYW8rc3VtLnZhbF9nZXJhY2FvX2RheS4gKw0KICAgICAgICAgICAgICAgICAgICAgICB5ZWFyKGVhcl9kYXRhKSArIGFzLmZhY3Rvcihtb250aChlYXJfZGF0YSkpK2FzLmZhY3Rvcih3ZWVrZGF5cyhlYXJfZGF0YSkpKw0KICAgICAgICAgICAgICAgICAgICAgICBzKHRlbXBlcmF0dXJlKSArIHMocHJlY2lwdGF0aW9uKSArIHMod2luZF9zcGVlZCkgKw0KICAgICAgICAgICAgICAgICAgICAgICBzKGNvX3BwYiksIGRhdGE9ZGYyKSAgICAgIyMjIyBBbHRlcmUgbyBQb2x1ZW50ZSBhbmFsaXNhZG8NCiAgDQogICMjU0UNCiAgVmNvdiA8LSB2Y292KGZpdC5hanVzdGVkLCB1c2VTY2FsZSA9IEZBTFNFKQ0KICBTdGRfRXJyb3JzIDwtIHNxcnQoZGlhZyhWY292KSkNCiAgc2UgPC0gU3RkX0Vycm9yc1s0XQ0KICAjc3VtbWFyeShmaXQuYWp1c3RlZCkNCiAgZml0LmFqdXN0ZWQkY29lZmZpY2llbnRzWzRdIy0zLjMxNmUrMDANCiAgcmVzdWx0cy50ZW1wWzEsMV08LWkNCiAgcmVzdWx0cy50ZW1wWzEsMl08LWZpdC5hanVzdGVkJGNvZWZmaWNpZW50c1s0XQ0KICByZXN1bHRzLnRlbXBbMSwzXTwtIkFESlVTVEVEIg0KICByZXN1bHRzLnRlbXBbMSw0XTwtImVuYV9icnV0YV9yZXNfbXdtZWQiDQogIHJlc3VsdHMudGVtcFsxLDVdIDwtIHNlDQogIHJlc3VsdHMudGVtcFsxLDZdIDwtIGxlbmd0aChkZjIkbm9tX3Jlc2VydmF0b3JpbykNCiAgDQogICNNb2RlbG8gTsOjbyBBanVzdGFkbyBlbmFfYnJ1dGFfcmVzX213bWVkIyMjIyMjDQogIGZpdC51bmFqdXN0ZWQgPC0gZ2FtKGVuYV9icnV0YV9yZXNfbXdtZWR+IHZhbF9nZXJhY2FvK3N1bS52YWxfZ2VyYWNhb19kYXkuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyKGVhcl9kYXRhKSArIGFzLmZhY3Rvcihtb250aChlYXJfZGF0YSkpK2FzLmZhY3Rvcih3ZWVrZGF5cyhlYXJfZGF0YSkpLA0KICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRmMikgICAgICMjIyMgQWx0ZXJlIG8gUG9sdWVudGUgYW5hbGlzYWRvDQogIA0KICBWY292IDwtIHZjb3YoZml0LnVuYWp1c3RlZCwgdXNlU2NhbGUgPSBGQUxTRSkNCiAgU3RkX0Vycm9ycyA8LSBzcXJ0KGRpYWcoVmNvdikpDQogIHNlIDwtIFN0ZF9FcnJvcnNbNF0NCiAgDQogIHJlc3VsdHMudGVtcFsyLDFdPC1pDQogIHJlc3VsdHMudGVtcFsyLDJdPC1maXQudW5hanVzdGVkJGNvZWZmaWNpZW50c1s0XQ0KICByZXN1bHRzLnRlbXBbMiwzXTwtIlVOQURKVVNURUQiDQogIHJlc3VsdHMudGVtcFsyLDRdPC0iZW5hX2JydXRhX3Jlc19td21lZCINCiAgcmVzdWx0cy50ZW1wWzIsNV0gPC0gc2UNCiAgcmVzdWx0cy50ZW1wWzIsNl0gPC0gbGVuZ3RoKGRmMiRub21fcmVzZXJ2YXRvcmlvKQ0KICANCiAgDQogIA0KICAjIyMjIyMgQ2hhbmdlIGhlcmUgdGhlIG5hbWUNCiAgDQogIGNvbG5hbWVzKHJlc3VsdHMudGVtcCk8LWMoInN1YnNldCIsICJHZW5lcmF0aW9uX1RyZW5kIiwibW9kZWwiLCJWYXJpYXZlbCBSZXNwb3RhIiwiU0UiLCJuIikNCiAgcmVzdWx0czwtcmJpbmQocmVzdWx0cywgcmVzdWx0cy50ZW1wKQ0KICByZXN1bHRzLnRlbXA8LWRhdGEuZnJhbWUoKQ0KICANCiAgDQogIA0KICANCiAgIyMjIyBNb2RlbG8gQWp1c3RhZG8gZWFyX3Jlc2VydmF0b3Jpb19zdWJzaXN0ZW1hX3Byb3ByaW9fbXdtZXMgIyMjIyMNCiAgZGYyJGVhcl9yZXNlcnZhdG9yaW9fc3Vic2lzdGVtYV9wcm9wcmlvX213bWVzICU+JSBhcy5udW1lcmljKCktPmRmMiRlYXJfcmVzZXJ2YXRvcmlvX3N1YnNpc3RlbWFfcHJvcHJpb19td21lcw0KICBmaXQuYWp1c3RlZCA8LSBnYW0oZWFyX3Jlc2VydmF0b3Jpb19zdWJzaXN0ZW1hX3Byb3ByaW9fbXdtZXN+IHZhbF9nZXJhY2FvK3N1bS52YWxfZ2VyYWNhb19kYXkuICsNCiAgICAgICAgICAgICAgICAgICAgICAgeWVhcihlYXJfZGF0YSkgKyBhcy5mYWN0b3IobW9udGgoZWFyX2RhdGEpKSthcy5mYWN0b3Iod2Vla2RheXMoZWFyX2RhdGEpKSsNCiAgICAgICAgICAgICAgICAgICAgICAgcyh0ZW1wZXJhdHVyZSkgKyBzKHByZWNpcHRhdGlvbikgKyBzKHdpbmRfc3BlZWQpICsNCiAgICAgICAgICAgICAgICAgICAgICAgcyhjb19wcGIpLCBkYXRhPWRmMikgICAgICMjIyMgQWx0ZXJlIG8gUG9sdWVudGUgYW5hbGlzYWRvDQogIA0KICAjI1NFDQogIFZjb3YgPC0gdmNvdihmaXQuYWp1c3RlZCwgdXNlU2NhbGUgPSBGQUxTRSkNCiAgU3RkX0Vycm9ycyA8LSBzcXJ0KGRpYWcoVmNvdikpDQogIHNlIDwtIFN0ZF9FcnJvcnNbNF0NCiAgc3VtbWFyeShmaXQuYWp1c3RlZCkNCiAgcmVzdWx0cy50ZW1wPC1kYXRhLmZyYW1lKCkNCiAgZml0LmFqdXN0ZWQkY29lZmZpY2llbnRzWzRdIy0zLjMxNmUrMDANCiAgcmVzdWx0cy50ZW1wWzEsMV08LWkNCiAgcmVzdWx0cy50ZW1wWzEsMl08LWZpdC5hanVzdGVkJGNvZWZmaWNpZW50c1s0XQ0KICByZXN1bHRzLnRlbXBbMSwzXTwtIkFESlVTVEVEIg0KICByZXN1bHRzLnRlbXBbMSw0XTwtImVhcl9yZXNlcnZhdG9yaW9fc3Vic2lzdGVtYV9wcm9wcmlvX213bWVzIg0KICByZXN1bHRzLnRlbXBbMSw1XSA8LSBzZQ0KICByZXN1bHRzLnRlbXBbMSw2XSA8LSBsZW5ndGgoZGYxJG5vbV9yZXNlcnZhdG9yaW8pDQogIA0KICAjTW9kZWxvIE7Do28gQWp1c3RhZG8gZWFyX3Jlc2VydmF0b3Jpb19zdWJzaXN0ZW1hX3Byb3ByaW9fbXdtZXMjIyMjIw0KICANCiAgZml0LnVuYWp1c3RlZCA8LSBnYW0oZWFyX3Jlc2VydmF0b3Jpb19zdWJzaXN0ZW1hX3Byb3ByaW9fbXdtZXN+IHZhbF9nZXJhY2FvK3N1bS52YWxfZ2VyYWNhb19kYXkuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyKGVhcl9kYXRhKSArIGFzLmZhY3Rvcihtb250aChlYXJfZGF0YSkpK2FzLmZhY3Rvcih3ZWVrZGF5cyhlYXJfZGF0YSkpLA0KICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRmMikgICAgICMjIyMgQWx0ZXJlIG8gUG9sdWVudGUgYW5hbGlzYWRvDQogIA0KICBWY292IDwtIHZjb3YoZml0LnVuYWp1c3RlZCwgdXNlU2NhbGUgPSBGQUxTRSkNCiAgU3RkX0Vycm9ycyA8LSBzcXJ0KGRpYWcoVmNvdikpDQogIHNlIDwtIFN0ZF9FcnJvcnNbNF0NCiAgDQogIHJlc3VsdHMudGVtcFsyLDFdPC1pDQogIHJlc3VsdHMudGVtcFsyLDJdPC1maXQudW5hanVzdGVkJGNvZWZmaWNpZW50c1s0XQ0KICByZXN1bHRzLnRlbXBbMiwzXTwtIlVOQURKVVNURUQiDQogIHJlc3VsdHMudGVtcFsyLDRdPC0iZWFyX3Jlc2VydmF0b3Jpb19zdWJzaXN0ZW1hX3Byb3ByaW9fbXdtZXMiDQogIHJlc3VsdHMudGVtcFsyLDVdIDwtIHNlDQogIHJlc3VsdHMudGVtcFsyLDZdIDwtIGxlbmd0aChkZjEkbm9tX3Jlc2VydmF0b3JpbykNCiAgDQogIGNvbG5hbWVzKHJlc3VsdHMudGVtcCk8LWMoInN1YnNldCIsICJHZW5lcmF0aW9uX1RyZW5kIiwibW9kZWwiLCJWYXJpYXZlbCBSZXNwb3RhIiwiU0UiLCJuIikNCiAgcmVzdWx0czwtcmJpbmQocmVzdWx0cywgcmVzdWx0cy50ZW1wKQ0KfQ0KcmVzdWx0cw0KYGBgDQoNCg0KDQpgYGB7cn0NCnJlc3VsdHMgJT4lIGdncGxvdChhZXMoeD1HZW5lcmF0aW9uX1RyZW5kLHk9c3Vic2V0LGNvbD1tb2RlbCwNCiAgICAgICAgICAgICAgICAgICAgICAgeG1heD1HZW5lcmF0aW9uX1RyZW5kK3NlKjEuOTYsDQogICAgICAgICAgICAgICAgICAgICAgIHhtaW49R2VuZXJhdGlvbl9UcmVuZC1zZSoxLjk2KSkrDQogICAgICAgICAgICAgICAgICAgICBnZW9tX3BvaW50KCkrDQogIGZhY2V0X3dyYXAofmBWYXJpYXZlbCBSZXNwb3RhYCxzY2FsZXM9ImZyZWUiKStnZW9tX2Vycm9yYmFyKCkrY29vcmRfZmxpcCgpDQpgYGANCg0KDQoNCg0KDQoNCg0KDQoNCg==