#?daisy()
#artigo base para criar cluster com variáveis quali e quanti - Gower, J. C. (1971) A general coefficient of similarity and some of its properties, Biometrics 27, 857–874.
rm(list=ls(all=TRUE))

dados_orig<- read_excel("dados.xlsx", col_types = c("text", 
    "text", "text", "text", "text", "text", 
    "text", "text", "text", "text", "text", 
    "text", "text", "text", "text","text", "numeric", 
    "text", "text", "text", "text", "numeric", 
    "text", "text", "text", "text", "text", 
    "text", "text", "text"))

dados_orig$q1 <-factor(dados_orig$q1, levels = c("1","2","3","4","5","6","7"), labels = c("1","2","3","4","5","6","7"))
dados_orig$q2 <-factor(dados_orig$q2, levels = c("1","2","3","4","5","6","7"), labels = c("1","2","3","4","5","6","7"))
dados_orig$q3 <-factor(dados_orig$q3, levels = c("1","2","3","4","5","6","7"), labels = c("1","2","3","4","5","6","7"))
dados_orig$q4 <-factor(dados_orig$q4, levels = c("1","2","3","4","5","6","7"), labels = c("1","2","3","4","5","6","7"))
dados_orig$q5 <-factor(dados_orig$q5, levels = c("1","2","3","4","5","6","7"), labels = c("1","2","3","4","5","6","7"))
dados_orig$q6 <-factor(dados_orig$q6, levels = c("1","2","3","4","5","6","7"), labels = c("1","2","3","4","5","6","7"))
dados_orig$q7 <-factor(dados_orig$q7, levels = c("1","2","3","4","5","6","7"), labels = c("1","2","3","4","5","6","7"))
dados_orig$q8 <-factor(dados_orig$q8, levels = c("1","2","3","4","5","6","7"), labels = c("1","2","3","4","5","6","7"))
dados_orig$q9 <-factor(dados_orig$q9, levels = c("1","2","3","4","5","6","7"), labels = c("1","2","3","4","5","6","7"))
dados_orig$q10 <-factor(dados_orig$q10, levels = c("1","2","3","4","5","6","7"), labels = c("1","2","3","4","5","6","7"))
dados_orig$q11 <-factor(dados_orig$q11, levels = c("1","2","3","4","5","6","7"), labels = c("1","2","3","4","5","6","7"))
dados_orig$q12 <-factor(dados_orig$q12, levels = c("1","2","3","4","5","6","7"), labels = c("1","2","3","4","5","6","7"))
#dados_orig$sexo <-factor(dados_orig$sexo, levels = c("Masculino","Feminino"), labels = c("1","2"))
dados_orig <-remove_missing(dados_orig[,c(1:30)])
#dados_orig$estado
dados = dados_orig[,c(1:12)]
rownames(dados) <- dados_orig$regiao_orig
#rownames(dados)

Descrição simples

Item low neutral high mean sd
q4 0,86 0,29 98,86 6,67 0,71
q7 3,86 0,86 95,28 6,35 1,12
q11 5,72 3,00 91,27 6,13 1,31
q1 8,15 1,86 89,99 5,89 1,34
q9 7,01 8,15 84,84 5,67 1,28
q10 18,31 6,15 75,54 5,28 1,69
q8 17,31 8,87 73,82 4,99 1,61
q6 24,61 1,72 73,68 5,08 1,94
q2 26,75 2,00 71,24 5,17 2,18
q5 51,22 1,43 47,35 3,86 2,12
q12 44,35 22,75 32,90 3,59 2,04
q3 94,13 1,14 4,72 1,51 1,12

Método

1. Cálculo da distância de Gower. Artigo base para criar cluster com variáveis quali e quanti - Gower, J. C. (1971) A general coefficient of similarity and some of its properties, Biometrics 27, 857–874.

2. Escolha do algoritmo para formar os cluters. Foi empregado o algoritmo não hierárquico partitioning around medoids (PAM).  

3. Selecionar o número de clusters. Usaremos a largura da silhueta, uma métrica de validação interna que é uma medida agregada de como a observação é semelhante ao seu próprio cluster em comparação com o cluster vizinho mais próximo.

Cálculo das distâncias

243951 dissimilarities, summarized :
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.0000  0.5833  0.6667  0.6823  0.8333  1.0000 
Metric :  mixed ;  Types = N, N, N, N, N, N, N, N, N, N, N, N 
Number of objects : 699
[1] 0.5833333 0.7500000 0.7500000 0.8333333 0.9166667 0.9166667

Verificar a mais similar e mais dissimilar

Algoritmo não hierárquico PAM

Gráfico custer plot e medoids

Descrição dos grupos pelo algoritmo PAM

[[1]]
 q1      q2      q3      q4      q5      q6      q7      q8      q9      q10     q11     q12    
 1: 13   1: 48   1:452   1:  3   1:126   1: 33   1: 10   1: 39   1:  9   1: 13   1: 13   1:164  
 2:  5   2: 16   2: 15   2:  2   2: 80   2: 19   2:  3   2: 21   2:  7   2: 37   2: 10   2: 73  
 3: 16   3: 25   3: 18   3:  1   3: 84   3: 38   3:  5   3: 30   3: 12   3: 21   3:  5   3: 33  
 4: 10   4:  6   4:  4   4:  2   4:  6   4:  4   4:  2   4: 46   4: 32   4: 24   4: 13   4:103  
 5: 68   5: 44   5:  8   5:  8   5: 92   5: 99   5: 27   5:128   5: 62   5: 81   5: 36   5: 48  
 6:138   6: 72   6:  2   6: 29   6: 31   6:115   6: 72   6:166   6:212   6:152   6:108   6: 30  
 7:254   7:293   7:  5   7:459   7: 85   7:196   7:385   7: 74   7:170   7:176   7:319   7: 53  
    cluster 
 Min.   :1  
 1st Qu.:1  
 Median :1  
 Mean   :1  
 3rd Qu.:1  
 Max.   :1  
            

[[2]]
 q1      q2     q3     q4      q5     q6     q7      q8     q9     q10    q11     q12   
 1:  2   1:36   1:62   1:  0   1: 3   1:25   1:  1   1: 2   1: 2   1: 3   1:  1   1: 6  
 2:  4   2:35   2:92   2:  0   2:31   2:32   2:  2   2:18   2: 7   2:31   2:  7   2:20  
 3: 17   3:27   3:19   3:  0   3:34   3:25   3:  6   3:11   3:12   3:23   3:  4   3:14  
 4:  3   4: 8   4: 4   4:  0   4: 4   4: 8   4:  4   4:16   4:25   4:19   4:  8   4:56  
 5: 44   5:24   5:10   5: 16   5:48   5:40   5: 33   5:54   5:48   5:38   5: 24   5:31  
 6:105   6:61   6: 6   6:114   6:53   6:61   6:109   6:85   6:96   6:73   6:110   6:45  
 7: 20   7: 4   7: 2   7: 65   7:22   7: 4   7: 40   7: 9   7: 5   7: 8   7: 41   7:23  
    cluster 
 Min.   :2  
 1st Qu.:2  
 Median :2  
 Mean   :2  
 3rd Qu.:2  
 Max.   :2  
            

Quantidade em cada grupo por região

1 2
CENTRO-OESTE 16 6
Não nasci no Brasil, porém morei grande parte da minha vida no Sudeste 0 1
NE 95 34
NORTE 12 2
SUDESTE 358 138
SUL 23 14

Resultados por Estado

[[1]]
 q1      q2      q3      q4      q5      q6      q7      q8      q9      q10     q11     q12    
 1: 13   1: 48   1:452   1:  3   1:126   1: 33   1: 10   1: 39   1:  9   1: 13   1: 13   1:164  
 2:  5   2: 16   2: 15   2:  2   2: 80   2: 19   2:  3   2: 21   2:  7   2: 37   2: 10   2: 73  
 3: 16   3: 25   3: 18   3:  1   3: 84   3: 38   3:  5   3: 30   3: 12   3: 21   3:  5   3: 33  
 4: 10   4:  6   4:  4   4:  2   4:  6   4:  4   4:  2   4: 46   4: 32   4: 24   4: 13   4:103  
 5: 68   5: 44   5:  8   5:  8   5: 92   5: 99   5: 27   5:128   5: 62   5: 81   5: 36   5: 48  
 6:138   6: 72   6:  2   6: 29   6: 31   6:115   6: 72   6:166   6:212   6:152   6:108   6: 30  
 7:254   7:293   7:  5   7:459   7: 85   7:196   7:385   7: 74   7:170   7:176   7:319   7: 53  
    cluster 
 Min.   :1  
 1st Qu.:1  
 Median :1  
 Mean   :1  
 3rd Qu.:1  
 Max.   :1  
            

[[2]]
 q1      q2     q3     q4      q5     q6     q7      q8     q9     q10    q11     q12   
 1:  2   1:36   1:62   1:  0   1: 3   1:25   1:  1   1: 2   1: 2   1: 3   1:  1   1: 6  
 2:  4   2:35   2:92   2:  0   2:31   2:32   2:  2   2:18   2: 7   2:31   2:  7   2:20  
 3: 17   3:27   3:19   3:  0   3:34   3:25   3:  6   3:11   3:12   3:23   3:  4   3:14  
 4:  3   4: 8   4: 4   4:  0   4: 4   4: 8   4:  4   4:16   4:25   4:19   4:  8   4:56  
 5: 44   5:24   5:10   5: 16   5:48   5:40   5: 33   5:54   5:48   5:38   5: 24   5:31  
 6:105   6:61   6: 6   6:114   6:53   6:61   6:109   6:85   6:96   6:73   6:110   6:45  
 7: 20   7: 4   7: 2   7: 65   7:22   7: 4   7: 40   7: 9   7: 5   7: 8   7: 41   7:23  
    cluster 
 Min.   :2  
 1st Qu.:2  
 Median :2  
 Mean   :2  
 3rd Qu.:2  
 Max.   :2  
            

1 2
Alagoas 2 0
Amapá 1 0
Amazonas 6 2
Aposentado 2 0
Bahia 55 12
Ceará 2 1
Desempregada 1 0
Distrito Federal 4 5
Espírito Santo 6 2
Goiás 3 1
Maranhão 5 1
Mato Grosso 1 2
Mato Grosso do Sul 2 0
Minas Gerais 14 10
Não Trabalho 14 7
Pará 3 2
Paraná 7 2
Pernambuco 2 1
Piauí 0 1
Rio de Janeiro 277 109
Rio Grande do Norte 2 0
Rio Grande do Sul 8 3
Rondônia 1 0
Roraima 3 0
Santa Catarina 4 1
São Paulo 65 25
Sergipe 1 6
Tocantins 13 2

LS0tDQp0aXRsZTogIk8gbcOqcyBxdWUgYSBUZXJyYSBwYXJvdSwgY29yb25hdsOtcnVzIGUgUHNpY29sb2dpYSBDb21wbGV4YS4iDQphdXRob3I6ICJQcm9mZXNzb3IgRHIuIExlb25pLCBSLkMuIChBTUFOKS4iDQpkYXRlOiAnUmVsYXTDs3JpbyBnZXJhZG8gZW06IGByIGZvcm1hdChTeXMudGltZSgpLCAiJWQgZGUgJUIgZGUgJVkiKWAnDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IA0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBoaWdobGlnaHQ6IGVzcHJlc3NvDQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB5ZXMNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KZW1haWw6IGxlb25pLnJvYmVydG9AYW1hbi5lYi5taWwuYnINCi0tLQ0KYGBge3Igc2V0dXAsIGVjaG89RkFMU0V9DQpybShsaXN0PWxzKGFsbD1UUlVFKSkNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShlc3F1aXNzZSkgIyBwYWNvdGUgZ2dwbG90DQpsaWJyYXJ5KGZhY3RvZXh0cmEpDQpsaWJyYXJ5KHBzeWNoKQ0KbGlicmFyeShjbHVzdGVyKQ0KbGlicmFyeShOYkNsdXN0KQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KHJvYnVzdFgpDQpsaWJyYXJ5KGRlbmRleHRlbmQpDQpsaWJyYXJ5KGNvcnJwbG90KQ0KbGlicmFyeShjbHVzdE1peFR5cGUpDQpsaWJyYXJ5KGRwbHlyKSAjIGZvciBkYXRhIGNsZWFuaW5nDQpsaWJyYXJ5KElTTFIpICMgZm9yIGNvbGxlZ2UgZGF0YXNldA0KbGlicmFyeShSdHNuZSkgIyBmb3IgdC1TTkUgcGxvdA0KbGlicmFyeShnZ3Bsb3QyKSAjIGZvciB2aXN1YWxpemF0aW9uDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeSh4dGFibGUpDQpsaWJyYXJ5KGxpa2VydCkNCiNsaWJyYXJ5KHJlYWR4bCkNCiNsaWJyYXJ5KHBseXIpDQojbGlicmFyeShDbHVNaXgpDQpgYGANCg0KDQogIA0KDQpgYGB7cn0NCiM/ZGFpc3koKQ0KI2FydGlnbyBiYXNlIHBhcmEgY3JpYXIgY2x1c3RlciBjb20gdmFyacOhdmVpcyBxdWFsaSBlIHF1YW50aSAtIEdvd2VyLCBKLiBDLiAoMTk3MSkgQSBnZW5lcmFsIGNvZWZmaWNpZW50IG9mIHNpbWlsYXJpdHkgYW5kIHNvbWUgb2YgaXRzIHByb3BlcnRpZXMsIEJpb21ldHJpY3MgMjcsIDg1N+KAkzg3NC4NCmBgYA0KDQoNCmBgYHtyIG1lc3NhZ2U9Riwgd2FybmluZz1GQUxTRX0NCnJtKGxpc3Q9bHMoYWxsPVRSVUUpKQ0KDQpkYWRvc19vcmlnPC0gcmVhZF9leGNlbCgiZGFkb3MueGxzeCIsIGNvbF90eXBlcyA9IGMoInRleHQiLCANCiAgICAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsIA0KICAgICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwidGV4dCIsICJudW1lcmljIiwgDQogICAgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAibnVtZXJpYyIsIA0KICAgICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCANCiAgICAidGV4dCIsICJ0ZXh0IiwgInRleHQiKSkNCg0KZGFkb3Nfb3JpZyRxMSA8LWZhY3RvcihkYWRvc19vcmlnJHExLCBsZXZlbHMgPSBjKCIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IiksIGxhYmVscyA9IGMoIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciKSkNCmRhZG9zX29yaWckcTIgPC1mYWN0b3IoZGFkb3Nfb3JpZyRxMiwgbGV2ZWxzID0gYygiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIpLCBsYWJlbHMgPSBjKCIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IikpDQpkYWRvc19vcmlnJHEzIDwtZmFjdG9yKGRhZG9zX29yaWckcTMsIGxldmVscyA9IGMoIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciKSwgbGFiZWxzID0gYygiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIpKQ0KZGFkb3Nfb3JpZyRxNCA8LWZhY3RvcihkYWRvc19vcmlnJHE0LCBsZXZlbHMgPSBjKCIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IiksIGxhYmVscyA9IGMoIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciKSkNCmRhZG9zX29yaWckcTUgPC1mYWN0b3IoZGFkb3Nfb3JpZyRxNSwgbGV2ZWxzID0gYygiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIpLCBsYWJlbHMgPSBjKCIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IikpDQpkYWRvc19vcmlnJHE2IDwtZmFjdG9yKGRhZG9zX29yaWckcTYsIGxldmVscyA9IGMoIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciKSwgbGFiZWxzID0gYygiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIpKQ0KZGFkb3Nfb3JpZyRxNyA8LWZhY3RvcihkYWRvc19vcmlnJHE3LCBsZXZlbHMgPSBjKCIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IiksIGxhYmVscyA9IGMoIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciKSkNCmRhZG9zX29yaWckcTggPC1mYWN0b3IoZGFkb3Nfb3JpZyRxOCwgbGV2ZWxzID0gYygiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIpLCBsYWJlbHMgPSBjKCIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IikpDQpkYWRvc19vcmlnJHE5IDwtZmFjdG9yKGRhZG9zX29yaWckcTksIGxldmVscyA9IGMoIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciKSwgbGFiZWxzID0gYygiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIpKQ0KZGFkb3Nfb3JpZyRxMTAgPC1mYWN0b3IoZGFkb3Nfb3JpZyRxMTAsIGxldmVscyA9IGMoIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciKSwgbGFiZWxzID0gYygiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIpKQ0KZGFkb3Nfb3JpZyRxMTEgPC1mYWN0b3IoZGFkb3Nfb3JpZyRxMTEsIGxldmVscyA9IGMoIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciKSwgbGFiZWxzID0gYygiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIpKQ0KZGFkb3Nfb3JpZyRxMTIgPC1mYWN0b3IoZGFkb3Nfb3JpZyRxMTIsIGxldmVscyA9IGMoIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciKSwgbGFiZWxzID0gYygiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIpKQ0KI2RhZG9zX29yaWckc2V4byA8LWZhY3RvcihkYWRvc19vcmlnJHNleG8sIGxldmVscyA9IGMoIk1hc2N1bGlubyIsIkZlbWluaW5vIiksIGxhYmVscyA9IGMoIjEiLCIyIikpDQpkYWRvc19vcmlnIDwtcmVtb3ZlX21pc3NpbmcoZGFkb3Nfb3JpZ1ssYygxOjMwKV0pDQojZGFkb3Nfb3JpZyRlc3RhZG8NCmRhZG9zID0gZGFkb3Nfb3JpZ1ssYygxOjEyKV0NCnJvd25hbWVzKGRhZG9zKSA8LSBkYWRvc19vcmlnJHJlZ2lhb19vcmlnDQojcm93bmFtZXMoZGFkb3MpDQpgYGANCg0KIyBEZXNjcmnDp8OjbyBzaW1wbGVzDQoNCmBgYHtyIG1lc3NhZ2U9Riwgd2FybmluZz1GQUxTRX0NCiNnbGltcHNlKGRhZG9zKQ0KIyBTdW1tYXJ5IA0KI3N0YXRzNDo6c3VtbWFyeShkYWRvcykNCiNmb3IgKGkgaW4gMToxMikgew0KI3Bsb3QoZGFkb3Nfb3JpZ1ssaV0sIG1haW49Y29sbmFtZXMoZGFkb3Nfb3JpZylbaV0sDQojeWxhYiA9ICJGcmVxdcOqbmNpYSIsIGNvbD0ic3RlZWxibHVlIiwgbGFzID0gMikNCiN9DQoNCmxpa2VydF9xMSA8LSBsaWtlcnQoYXMuZGF0YS5mcmFtZShkYWRvcyksIG5sZXZlbHMgPSA3KQ0KbGlrZXJ0LmJhci5wbG90KGxpa2VydF9xMSxwbG90LnBlcmNlbnRzPUYsbGVnZW5kID0gIkxlZ2VuZGEiLCBsb3cuY29sb3IgPSAicmVkIiwgdGV4dC5zaXplPTQpICsgZ2d0aXRsZSgiIikgKyBsYWJzKCB4ID0gIlF1ZXN0w7VlcyIsIHkgPSAiUG9yY2VudGFnZW0iKSArIHRoZW1lX21pbmltYWwoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQ0KDQprYWJsZShzdW1tYXJ5KGxpa2VydF9xMSlbLDE6Nl0sZGlnaXRzID0yLCByb3cubmFtZXMgPSBGLGxvbmd0YWJsZSA9IFRSVUUsIGFsaWduPWMoJ2MnLCAnYycsJ2MnLCdjJywnYycsICdjJywgJ2MnKSwgYm9va3RhYnMgPSBULCBmb3JtYXQuYXJncyA9IGxpc3QoZGVjaW1hbC5tYXJrID0gIiwiKSkNCmBgYA0KDQojIE3DqXRvZG8gIA0KICANCiAgICAxLiBDw6FsY3VsbyBkYSBkaXN0w6JuY2lhIGRlIEdvd2VyLiBBcnRpZ28gYmFzZSBwYXJhIGNyaWFyIGNsdXN0ZXIgY29tIHZhcmnDoXZlaXMgcXVhbGkgZSBxdWFudGkgLSBHb3dlciwgSi4gQy4gKDE5NzEpIEEgZ2VuZXJhbCBjb2VmZmljaWVudCBvZiBzaW1pbGFyaXR5IGFuZCBzb21lIG9mIGl0cyBwcm9wZXJ0aWVzLCBCaW9tZXRyaWNzIDI3LCA4NTfigJM4NzQuDQogICAgDQogICAgMi4gRXNjb2xoYSBkbyBhbGdvcml0bW8gcGFyYSBmb3JtYXIgb3MgY2x1dGVycy4gRm9pIGVtcHJlZ2FkbyBvIGFsZ29yaXRtbyBuw6NvIGhpZXLDoXJxdWljbyBwYXJ0aXRpb25pbmcgYXJvdW5kIG1lZG9pZHMgKFBBTSkuICANCiAgICANCiAgICAzLiBTZWxlY2lvbmFyIG8gbsO6bWVybyBkZSBjbHVzdGVycy4gVXNhcmVtb3MgYSBsYXJndXJhIGRhIHNpbGh1ZXRhLCB1bWEgbcOpdHJpY2EgZGUgdmFsaWRhw6fDo28gaW50ZXJuYSBxdWUgw6kgdW1hIG1lZGlkYSBhZ3JlZ2FkYSBkZSBjb21vIGEgb2JzZXJ2YcOnw6NvIMOpIHNlbWVsaGFudGUgYW8gc2V1IHByw7NwcmlvIGNsdXN0ZXIgZW0gY29tcGFyYcOnw6NvIGNvbSBvIGNsdXN0ZXIgdml6aW5obyBtYWlzIHByw7N4aW1vLg0KDQoNCiMgQ8OhbGN1bG8gZGFzIGRpc3TDom5jaWFzDQoNCmBgYHtyfQ0KIyBFc2NvbGhhIGEgbcOpdHJpY2ENCmdvd2VyX2Rpc3QgPC0gZGFpc3koZGFkb3MsIG1ldHJpYyA9ICJnb3dlciIpDQoNCiNnb3dlcl9kaXN0IDwtIGRpc3QoZGFkb3MsIG1ldGhvZCA9ICJtaW5rb3dza2kiLHA9MSkNCg0KI2dvd2VyDQojIENoZWNrIGF0dHJpYnV0ZXMgdG8gZW5zdXJlIHRoZSBjb3JyZWN0IG1ldGhvZHMgYXJlIGJlaW5nIHVzZWQNCiMgKEkgPSBpbnRlcnZhbCcsJyBOID0gbm9taW5hbCkNCiNnb3dlcl9kaXN0DQpzdW1tYXJ5KGdvd2VyX2Rpc3QpDQpoZWFkKGdvd2VyX2Rpc3QpDQoNCmBgYA0KDQojIFZlcmlmaWNhciBhIG1haXMgc2ltaWxhciBlIG1haXMgZGlzc2ltaWxhcg0KYGBge3J9DQpnb3dlcl9tYXQgPC0gYXMubWF0cml4KGdvd2VyX2Rpc3QpDQojIE91dHB1dCBtb3N0IHNpbWlsYXIgcGFpcg0KZGFkb3NbDQogIHdoaWNoKGdvd2VyX21hdCA9PSBtaW4oZ293ZXJfbWF0W2dvd2VyX21hdCAhPSBtaW4oZ293ZXJfbWF0KV0pLA0KICAgICAgICBhcnIuaW5kID0gVFJVRSlbMSwgXSwgXQ0KZGFkb3NbDQogIHdoaWNoKGdvd2VyX21hdCA9PSBtYXgoZ293ZXJfbWF0W2dvd2VyX21hdCAhPSBtYXgoZ293ZXJfbWF0KV0pLA0KICAgICAgICBhcnIuaW5kID0gVFJVRSlbMSwgXSwgXQ0KYGBgDQoNCiMgQWxnb3JpdG1vIG7Do28gaGllcsOhcnF1aWNvIFBBTQ0KDQojIyBDw6FsY3VsbyBkYSBzaWxodWV0YSAtICJQbG90IHNpaG91ZXR0ZSB3aWR0aCAoaGlnaGVyIGlzIGJldHRlcikiDQpgYGB7cn0NCiMgQ2FsY3VsYXRlIHNpbGhvdWV0dGUgd2lkdGggZm9yIG1hbnkgayB1c2luZyBQQU0NCiNnb3dlcl9kaXN0IC0gbWF0cml6IGNvbSBhcyBkaXN0w6JuY2lhcw0Kc2lsX3dpZHRoIDwtIGMoTkEpDQpmb3IoaSBpbiAyOjUpew0KICBwYW1fZml0IDwtIHBhbShnb3dlcl9kaXN0LA0KICAgICAgICAgICAgICAgICBkaXNzID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgayA9IGkpDQogIHNpbF93aWR0aFtpXSA8LSBwYW1fZml0JHNpbGluZm8kYXZnLndpZHRoDQp9DQojIFBsb3Qgc2lob3VldHRlIHdpZHRoIChoaWdoZXIgaXMgYmV0dGVyKQ0KI3Bsb3QoMTo1LCBzaWxfd2lkdGgsDQojICAgICB4bGFiID0gIk51bWJlciBvZiBjbHVzdGVycyIsDQojICAgICB5bGFiID0gIlNpbGhvdWV0dGUgV2lkdGgiKQ0KI2xpbmVzKDE6NSwgc2lsX3dpZHRoKQ0KDQojIE91dHJhIGZ1bsOnw6NvDQojIHBhcmEgbyBQQU0NCmZ2aXpfbmJjbHVzdChnb3dlcl9tYXQscGFtLG1ldGhvZCA9ICJzaWxob3VldHRlIikgKyB0aGVtZV9jbGFzc2ljKCkNCg0KIyBwYXJhIGstbWVhbnMNCiNmdml6X25iY2x1c3QoZ293ZXJfbWF0LGttZWFucyxtZXRob2QgPSAid3NzIikgKyB0aGVtZV9jbGFzc2ljKCkNCg0KYGBgDQoNCiMjIEdyw6FmaWNvIGN1c3RlciBwbG90IGUgbWVkb2lkcw0KYGBge3IgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTE4LCB3YXJuaW5nPUZ9DQprPTINCg0KcGFtX2ZpdCA8LSBwYW0oZ293ZXJfZGlzdCwgZGlzcyA9IFRSVUUsIGspDQojcGFtX2ZpdCRjbHVzdGVyaW5nDQojYXMubWF0cml4KGRhZG9zW3BhbV9maXQkbWVkb2lkcywgXSkNCiNwcmludChwYW1fZml0KQ0KbWVkb2lkcz1wYW1fZml0JG1lZG9pZHMNCg0KZGFkb3Nfb3JpZyAlPiUgZmlsdGVyKHJlZ2lhb19vcmlnPT1jKG1lZG9pZHMpKQ0KDQoNCmdycCA9IHBhbV9maXQkY2x1c3RlcmluZw0KIyAgY29tbyBmYXplciBjb20gYXMgZGlzdD8gIHPDsyBsYW7Dp2FyIGRhdGEgY29tbyBtYXRyaXogZGUgZGlzdMOibmNpYXMNCg0KZnZpel9jbHVzdGVyKGxpc3QoZGF0YSA9IGdvd2VyX2Rpc3QsIGNsdXN0ZXIgPSBncnApLA0KI3BhbGV0dGUgPSBjKCJvcmFuZ2UiLCAiZ3JlZW4iLCJyZWQiLCJicm93biIsICJibHVlIiksDQplbGxpcHNlLnR5cGUgPSAiZXVjbGlkIiwgIyBDb25jZW50cmF0aW9uIGVsbGlwc2UNCnJlcGVsID0gVFJVRSwgIyBBdm9pZCBsYWJlbCBvdmVycGxvdHRpbmcgKHNsb3cpDQpzaG93LmNsdXN0LmNlbnQgPSBULCBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpDQopDQpgYGANCg0KDQojIyBEZXNjcmnDp8OjbyBkb3MgZ3J1cG9zIHBlbG8gYWxnb3JpdG1vIFBBTQ0KYGBge3J9DQpwYW1fcmVzdWx0cyA8LSBkYWRvcyAlPiUNCiAgZHBseXI6Om11dGF0ZShjbHVzdGVyID0gcGFtX2ZpdCRjbHVzdGVyaW5nKSAlPiUNCiAgZ3JvdXBfYnkoY2x1c3RlcikgJT4lDQogIGRvKHRoZV9zdW1tYXJ5ID0gc3VtbWFyeSguKSkNCg0KcGFtX3Jlc3VsdHMkdGhlX3N1bW1hcnkNCg0KZGFkb3Nfb3JpZyA8LSBkYWRvc19vcmlnICU+JSBtdXRhdGUoZ3J1cG8gPSBwYW1fZml0JGNsdXN0ZXJpbmcgKSANCg0KDQpgYGANCg0KIyMgUXVhbnRpZGFkZSBlbSBjYWRhIGdydXBvIHBvciByZWdpw6NvDQoNCmBgYHtyfQ0Ka2FibGVFeHRyYTo6a2FibGUodGFibGUoZGFkb3Nfb3JpZyRyZWdpYW8sIGRhZG9zX29yaWckZ3J1cG8pKSU+JSBrYWJsZV9zdHlsaW5nKCkNCg0KYGBgDQoNCg0KIyMgUmVzdWx0YWRvcyBwb3IgRXN0YWRvDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQpyb3duYW1lcyhkYWRvcykgPC0gZGFkb3Nfb3JpZyRlc3RhZG9fdHJhYg0KIyMgRGVzY3Jpw6fDo28gZG9zIGdydXBvcyBwZWxvIGFsZ29yaXRtbyBQQU0NCnBhbV9yZXN1bHRzIDwtIGRhZG9zICU+JQ0KICBkcGx5cjo6bXV0YXRlKGNsdXN0ZXIgPSBwYW1fZml0JGNsdXN0ZXJpbmcpICU+JQ0KICBncm91cF9ieShjbHVzdGVyKSAlPiUNCiAgZG8odGhlX3N1bW1hcnkgPSBzdW1tYXJ5KC4pKQ0KDQpwYW1fcmVzdWx0cyR0aGVfc3VtbWFyeQ0KDQpkYWRvc19vcmlnIDwtIGRhZG9zX29yaWcgJT4lIG11dGF0ZShncnVwbyA9IHBhbV9maXQkY2x1c3RlcmluZyApIA0KdGFiIDwtIHRhYmxlKGRhZG9zX29yaWckZXN0YWRvLCBkYWRvc19vcmlnJGdydXBvKQ0Ka2FibGVFeHRyYTo6a2FibGUodGFiKSAlPiUga2FibGVfc3R5bGluZygpDQoNCg0KI0dyw6FmaWNvIGRlIENvbHVuYXMgb3UgYmFycmFzIHZlcnRpY2FpcyBwb3Igc2V4bw0KZ3JhZmljb19jb2x1bmE9Z2dwbG90KGRhZG9zX29yaWcsYWVzKGdydXBvLGZpbGw9ZXN0YWRvKSkgKyANCiAgICAgICAgICAgICAgIGdlb21fYmFyKCkgKw0KICAgICAgICAgICAgICAgZ2d0aXRsZSgiIikrDQogICAgICAgICAgICAgICB4bGFiKCJHcnVwb3MiKSArDQogICAgICAgICAgICAgICB5bGFiKCJGcmVxLiIpIA0KICAgICAgICAgICAgIA0KZ2dwbG90bHkoZ3JhZmljb19jb2x1bmEpDQoNCg0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=