setwd("F:/")
library(readr)
std <- read_delim("stud.txt", delim="\t",skip=1, col_names=c("StudentName","Math","English"))
Rows: 3 Columns: 3
── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: "\t"
chr (1): StudentName
dbl (2): Math, English
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
std
# A tibble: 3 × 3
StudentName Math English
<chr> <dbl> <dbl>
1 Anna 86 90
2 John 43 75
3 Catherine 80 82
library(tidyr)
stdL <- gather(std, Subject, Grade, Math:English)
stdL
# A tibble: 6 × 3
StudentName Subject Grade
<chr> <chr> <dbl>
1 Anna Math 86
2 John Math 43
3 Catherine Math 80
4 Anna English 90
5 John English 75
6 Catherine English 82
spread(stdL, Subject, Grade)
# A tibble: 3 × 3
StudentName English Math
<chr> <dbl> <dbl>
1 Anna 90 86
2 Catherine 82 80
3 John 75 43
std2 <- read_delim("stud2.txt", delim="\t",skip=1, col_names=c("StudentName","Math","English","Degree_Year"))
Rows: 2 Columns: 4
── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: "\t"
chr (2): StudentName, Degree_Year
dbl (2): Math, English
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
std2
# A tibble: 2 × 4
StudentName Math English Degree_Year
<chr> <dbl> <dbl> <chr>
1 John 43 75 Math_2013
2 Catherine 80 82 Bio_2012
std2L <- gather(std2, Subject, Grade, Math:English)
std2L <- separate(std2L, Degree_Year, c("Degree","Year"))
std2L
# A tibble: 4 × 5
StudentName Degree Year Subject Grade
<chr> <chr> <chr> <chr> <dbl>
1 John Math 2013 Math 43
2 Catherine Bio 2012 Math 80
3 John Math 2013 English 75
4 Catherine Bio 2012 English 82
Attaching package: ‘lubridate’
The following objects are masked from ‘package:base’:
date, intersect, setdiff, union
[1] "2015-10-21"
[1] "2015-11-30"
[1] "2012-11-03"
[1] "2013-12-02 14:05:01 UTC"
[1] "1986-12-01"
[1] "2012-05-21" "2010-12-12" "2007-01-05" "2015-02-04" "2014-12-06" "2013-07-25"
[1] "2015-08-23 18:00:05 +0430"
Attaching package: ‘dplyr’
The following objects are masked from ‘package:stats’:
filter, lag
The following objects are masked from ‘package:base’:
intersect, setdiff, setequal, union
Rows: 200 Columns: 71
── Column specification ───────────────────────────────────────────────────────────
Delimiter: ","
chr (11): X2, X4, X5, X6, X8, X59, X60, X64, X66, X70, X71
lgl (60): X1, X3, X7, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
[1] 200 71
[1] "WARNING: This database should be credited to the original owner whenever"
[2] " used for any publication whatsoever."
[3] ""
[1] 178
[1] " age_gt_60:\t\t f, t."
[2] " air():\t\t mild,moderate,severe,normal,profound."
[3] " airBoneGap:\t\t f, t."
[4] " ar_c():\t\t normal,elevated,absent."
[1] " age_gt_60" " air()" " airBoneGap"
[1] "age_gt_60" "air()" "airBoneGap"
[1] "age_gt_60" "air" "airBoneGap"
Rows: 4 Columns: 2
── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: "\t"
chr (2): X, Y
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
[1] "character"
[1] "integer"
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
Min. :-1.86378 Min. :-2.4258 Min. :-1.5623 Min. :-1.4422 setosa :50
1st Qu.:-0.89767 1st Qu.:-0.5904 1st Qu.:-1.2225 1st Qu.:-1.1799 versicolor:50
Median :-0.05233 Median :-0.1315 Median : 0.3354 Median : 0.1321 virginica :50
Mean : 0.00000 Mean : 0.0000 Mean : 0.0000 Mean : 0.0000
3rd Qu.: 0.67225 3rd Qu.: 0.5567 3rd Qu.: 0.7602 3rd Qu.: 0.7880
Max. : 2.48370 Max. : 3.0805 Max. : 1.7799 Max. : 1.7064
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
Min. :0.0000 Min. :0.0000 Min. :0.0000 Min. :0.00000 setosa :50
1st Qu.:0.2222 1st Qu.:0.3333 1st Qu.:0.1017 1st Qu.:0.08333 versicolor:50
Median :0.4167 Median :0.4167 Median :0.5678 Median :0.50000 virginica :50
Mean :0.4287 Mean :0.4406 Mean :0.4675 Mean :0.45806
3rd Qu.:0.5833 3rd Qu.:0.5417 3rd Qu.:0.6949 3rd Qu.:0.70833
Max. :1.0000 Max. :1.0000 Max. :1.0000 Max. :1.00000
Registered S3 method overwritten by 'htmlwidgets':
method from
print.htmlwidget tools:rstudio
Registered S3 method overwritten by 'data.table':
method from
print.data.table
Attaching package: ‘Hmisc’
The following objects are masked from ‘package:dplyr’:
src, summarize
The following objects are masked from ‘package:base’:
format.pval, units
Min. 1st Qu. Median Mean 3rd Qu. Max.
2.90 45.02 77.50 68.57 94.08 100.00
(2.8,22.3] (22.3,41.7] (41.7,61.2] (61.2,80.6] (80.6,100]
45 71 70 81 239
verynew new normal old veryold
45 71 70 81 239
[ 2.9, 38.1) [38.1, 66.1) [66.1, 86.1) [86.1, 95.7) [95.7,100.0]
102 101 101 101 101
verynew new normal old veryold
102 101 101 101 101
Loading required package: zoo
Attaching package: ‘zoo’
The following objects are masked from ‘package:base’:
as.Date, as.Date.numeric
######################### Warning from 'xts' package ##########################
# #
# The dplyr lag() function breaks how base R's lag() function is supposed to #
# work, which breaks lag(my_xts). Calls to lag(my_xts) that you type or #
# source() into this session won't work correctly. #
# #
# Use stats::lag() to make sure you're not using dplyr::lag(), or you can add #
# conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop #
# dplyr from breaking base R's lag() function. #
# #
# Code in packages is not affected. It's protected by R's namespace mechanism #
# Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning. #
# #
###############################################################################
Attaching package: ‘xts’
The following objects are masked from ‘package:dplyr’:
first, last
[,1]
2010-02-25 1102.94
2010-02-26 1104.49
2010-03-01 1115.71
2010-03-02 1118.31
[,1]
2010-03-02 1118.31
[,1]
2010-03-01 1115.71
2010-03-02 1118.31
[,1]
2010-03-01 1115.71
2010-03-02 1118.31
[,1]
2010-02-26 1104.49
2010-03-01 1115.71
m.c.seq.row..seq.n...seq.col..drop...FALSE.
Jan 1949 112
Feb 1949 118
Mar 1949 132
Apr 1949 129
May 1949 121
Jun 1949 135
Jul 1949 148
Aug 1949 148
Sep 1949 136
Oct 1949 119
...
Mar 1960 419
Apr 1960 461
May 1960 472
Jun 1960 535
Jul 1960 622
Aug 1960 606
Sep 1960 508
Oct 1960 461
Nov 1960 390
Dec 1960 432
e1
Jan 1949 NA
Feb 1949 0.05084746
Mar 1949 0.10606061
Apr 1949 -0.02325581
May 1949 -0.06611570
Jun 1949 0.10370370
Jul 1949 0.08783784
Aug 1949 0.00000000
Sep 1949 -0.08823529
Oct 1949 -0.14285714
...
Feb 1960 -0.06649616
Mar 1960 0.06682578
Apr 1960 0.09110629
May 1960 0.02330508
Jun 1960 0.11775701
Jul 1960 0.13987138
Aug 1960 -0.02640264
Sep 1960 -0.19291339
Oct 1960 -0.10195228
Nov 1960 -0.18205128
[,1]
Jan 1949 112
Feb 1949 118
Mar 1949 132
Apr 1949 129
May 1949 121
Jun 1949 135
[,1] [,2] [,3] [,4]
[1,] 129 132 118 112
[2,] 121 129 132 118
[3,] 135 121 129 132
[4,] 148 135 121 129
[5,] 148 148 135 121
[6,] 136 148 148 135
T T_1 T_2 T_3 T_4
May 1949 121 129 132 118 112
Jun 1949 135 121 129 132 118
Jul 1949 148 135 121 129 132
Aug 1949 148 148 135 121 129
Sep 1949 136 148 148 135 121
Oct 1949 119 136 148 148 135
Rows: 25000 Columns: 13
── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: ","
dbl (13): FID_CID, ano1991, ano1992, ano1993, ano1994, ano1995, ano1996, ano1997, ano1...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
min max
long -9.49174 -6.20743
lat 36.98050 42.14360
long lat
[1,] -7.31924 38.5406
[2,] -7.63557 40.5022
[3,] -7.90273 40.3418
Object of class SpatialPointsDataFrame
Coordinates:
min max
long -9.49174 -6.20743
lat 36.98050 42.14360
Is projected: FALSE
proj4string : [+proj=longlat +ellps=WGS84]
Number of points: 25000
Data attributes:
ano2000
Min. :0.00000
1st Qu.:0.00000
Median :0.00000
Mean :0.01612
3rd Qu.:0.00000
Max. :1.00000
Loading required package: ggplot2
ℹ Google's Terms of Service: <https://mapsplatform.google.com>
Stadia Maps' Terms of Service: <https://stadiamaps.com/terms-of-service/>
OpenStreetMap's Tile Usage Policy: <https://operations.osmfoundation.org/policies/tiles/>
ℹ Please cite ggmap if you use it! Use `citation("ggmap")` for details.
Error in `get_googlemap()`:
! Google now requires an API key; see `ggmap::register_google()`.
Backtrace:
1. ggmap::get_map("Portugal", zoom = 7)
2. ggmap::get_googlemap(...)
LS0tDQp0aXRsZTogIkRhdGEgTWluaW5nIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlDQotLS0NCg0KYGBge3IgVGlkeSBEdGF0LCBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQ0Kc2V0d2QoIkY6LyIpDQpsaWJyYXJ5KHJlYWRyKQ0Kc3RkIDwtIHJlYWRfZGVsaW0oInN0dWQudHh0IiwgZGVsaW09Ilx0Iixza2lwPTEsIGNvbF9uYW1lcz1jKCJTdHVkZW50TmFtZSIsIk1hdGgiLCJFbmdsaXNoIikpDQpzdGQNCg0KbGlicmFyeSh0aWR5cikNCnN0ZEwgPC0gZ2F0aGVyKHN0ZCwgU3ViamVjdCwgR3JhZGUsIE1hdGg6RW5nbGlzaCkNCnN0ZEwNCg0Kc3ByZWFkKHN0ZEwsIFN1YmplY3QsIEdyYWRlKQ0KDQpzdGQyIDwtIHJlYWRfZGVsaW0oInN0dWQyLnR4dCIsIGRlbGltPSJcdCIsc2tpcD0xLCBjb2xfbmFtZXM9YygiU3R1ZGVudE5hbWUiLCJNYXRoIiwiRW5nbGlzaCIsIkRlZ3JlZV9ZZWFyIikpDQpzdGQyDQoNCnN0ZDJMIDwtIGdhdGhlcihzdGQyLCBTdWJqZWN0LCBHcmFkZSwgTWF0aDpFbmdsaXNoKQ0Kc3RkMkwgPC0gc2VwYXJhdGUoc3RkMkwsIERlZ3JlZV9ZZWFyLCBjKCJEZWdyZWUiLCJZZWFyIikpDQpzdGQyTCANCg0KYGBgDQoNCmBgYHtyIEx1YnJpRGF0ZSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkobHVicmlkYXRlKQ0KeW1kKCIyMDE1MTAyMSIpDQp5bWQoIjIwMTUvMTEvMzAiKQ0KbXlkKCIxMS4yMDEyLjMiKQ0KZG15X2htcygiMi8xMi8yMDEzIDE0OjA1OjAxIikNCm1keSgiMTIwMTg2IikNCg0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpkYXRlcyA8LSBjKDIwMTIwNTIxLCAiMjAxMC0xMi0xMiIsICIyMDA3LzAxLzUiLCAiMjAxNS0yLTA0IiwiTWVhc3VyZWQgb24gMjAxNC0xMi02IiwgIjIwMTMtNy0yNSIpDQpkYXRlcyA8LSB5bWQoZGF0ZXMpDQpkYXRlcw0KDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmRhdGEuZnJhbWUoRGF0ZXM9ZGF0ZXMsV2Vla0RheT13ZGF5KGRhdGVzKSxuV2Vla0RheT13ZGF5KGRhdGVzLGxhYmVsPVRSVUUpLFllYXI9eWVhcihkYXRlcyksTW9udGg9bW9udGgoZGF0ZXMsbGFiZWw9VFJVRSkpDQpkYXRlIDwtIHltZF9obXMoIjIwMTUwODIzIDE4OjAwOjA1Iix0ej0iQXNpYS9UZWhyYW4iKQ0KZGF0ZQ0KDQpgYGANCg0KDQpgYGB7ciBTdHJpbmcgUHJvY2Vzc2luZywgZWNobz1GQUxTRX0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHN0cmluZ3IpDQpsaWJyYXJ5KHJlYWRyKQ0KdWNpLnJlcG8gPC0gImh0dHBzOi8vYXJjaGl2ZS5pY3MudWNpLmVkdS9tbC9tYWNoaW5lLWxlYXJuaW5nLWRhdGFiYXNlcy8iDQpkYXRhc2V0IDwtICJhdWRpb2xvZ3kvYXVkaW9sb2d5LnN0YW5kYXJkaXplZCINCmRhdGFGIDwtIHN0cl9jKHVjaS5yZXBvLGRhdGFzZXQsIi5kYXRhIikNCm5hbWVzRiA8LSBzdHJfYyh1Y2kucmVwbyxkYXRhc2V0LCIubmFtZXMiKQ0KIyMgUmVhZGluZyB0aGUgZGF0YSBmaWxlDQpkYXRhIDwtIHJlYWRfY3N2KHVybChkYXRhRiksIGNvbF9uYW1lcz1GQUxTRSwgbmE9Ij8iKQ0KZGF0YQ0KDQpkaW0oZGF0YSkNCnRleHQgPC0gcmVhZF9saW5lcyh1cmwobmFtZXNGKSkNCnRleHRbMTozXQ0KbGVuZ3RoKHRleHQpDQp0ZXh0WzY3OjcwXQ0Kbm1zIDwtIHN0cl9zcGxpdF9maXhlZCh0ZXh0WzY3OjEzNV0sIjoiLG49MilbLDFdICMgZ2V0IHRoZSBuYW1lcw0Kbm1zWzE6M10NCm5tcyA8LSBzdHJfdHJpbShubXMpICMgdHJpbSB3aGl0ZSBzcGFjZQ0Kbm1zWzE6M10NCm5tcyA8LSBzdHJfcmVwbGFjZV9hbGwobm1zLCJcXCh8XFwpIiwiIikgIyBkZWxldGUgaW52YWxpZCBjaGFycy4NCm5tc1sxOjNdDQpjb2xuYW1lcyhkYXRhKVsxOjY5XSA8LSBubXMNCmRhdGFbMTozLDE6MTBdDQpgYGANCg0KDQpgYGB7ciBEZWFsaW5nIHdpdGggVW5rbm93biBWYWx1ZXMsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzZXR3ZCgiRTovIikNCmxpYnJhcnkocmVhZHIpDQpkYXQgPC0gcmVhZF9kZWxpbSgiRTovZGF0LnR4dCIsZGVsaW0gPSAiXHQiLGNvbF9uYW1lcz1jKCJYIiwiWSIpKQ0KZGF0DQpjbGFzcyhkYXQkWSkNCg0KbGlicmFyeShyZWFkcikNCmRhdCRZIDwtIHBhcnNlX2ludGVnZXIoZGF0JFksIG5hPSI/IikNCmRhdA0KY2xhc3MoZGF0JFkpDQoNCg0KYGBgDQoNCg0KYGBge3IgSGFuZGxpbmcgRGlmZmVyZW50IFNjYWxlcyBvZiBWYXJpYWJsZXMsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KGRwbHlyKQ0KZGF0YShpcmlzKQ0KaXJpcy5zdGFuZCA8LSBjYmluZChzY2FsZShzZWxlY3QoaXJpcywtU3BlY2llcykpLHNlbGVjdChpcmlzLFNwZWNpZXMpKQ0Kc3VtbWFyeShpcmlzLnN0YW5kKQ0KbXhzIDwtIGFwcGx5KHNlbGVjdChpcmlzLC1TcGVjaWVzKSwgMiwgbWF4LCBuYS5ybT1UUlVFKQ0KbW5zIDwtIGFwcGx5KHNlbGVjdChpcmlzLC1TcGVjaWVzKSwgMiwgbWluLCBuYS5ybT1UUlVFKQ0KaXJpcy5ub3JtIDwtIGNiaW5kKHNjYWxlKHNlbGVjdChpcmlzLC1TcGVjaWVzKSwgY2VudGVyPW1ucywgc2NhbGU9bXhzLW1ucyksc2VsZWN0KGlyaXMsU3BlY2llcykpDQpzdW1tYXJ5KGlyaXMubm9ybSkNCmBgYA0KDQoNCmBgYHtyIERpc2NyZXRpemluZyBWYXJpYWJsZXMsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KEhtaXNjKSAjIGZvciBjdXQyKCkNCmRhdGEoQm9zdG9uLCBwYWNrYWdlPSJNQVNTIikgIyBsb2FkaW5nIHRoZSBkYXRhDQpzdW1tYXJ5KEJvc3RvbiRhZ2UpICMgdGhlIG51bWVyaWMgdmFyaWFibGUgd2UgYXJlIGdvaW5nIHRvIGRpc2NyZXRpemUNCg0KQm9zdG9uJG5ld0FnZSA8LSBjdXQoQm9zdG9uJGFnZSw1KQ0KdGFibGUoQm9zdG9uJG5ld0FnZSkNCg0KQm9zdG9uJG5ld0FnZSA8LSBjdXQoQm9zdG9uJGFnZSw1LGxhYmVscz1jKCJ2ZXJ5bmV3IiwibmV3Iiwibm9ybWFsIiwib2xkIiwidmVyeW9sZCIpKSAjIGFsdGVybmF0aXZlIHVzaW5nIG91ciBvd24gbGFiZWxzIGZvciB0aGUgYmlucw0KdGFibGUoQm9zdG9uJG5ld0FnZSkNCkJvc3RvbiRuZXdBZ2UgPC0gY3V0MihCb3N0b24kYWdlLCBnPTUpDQp0YWJsZShCb3N0b24kbmV3QWdlKQ0KDQpCb3N0b24kbmV3QWdlIDwtIGZhY3RvcihjdXQyKEJvc3RvbiRhZ2UsZz01KSxsYWJlbHM9YygidmVyeW5ldyIsIm5ldyIsIm5vcm1hbCIsIm9sZCIsInZlcnlvbGQiKSkNCnRhYmxlKEJvc3RvbiRuZXdBZ2UpDQoNCmBgYA0KDQoNCmBgYHtyIENyZWF0aW5nIFZhcmlhYmxlcywgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeSh4dHMpDQpzcDUwMCA8LSB4dHMoYygxMTAyLjk0LDExMDQuNDksMTExNS43MSwxMTE4LjMxKSx5bWQoYygiMjAxMC0wMi0yNSIsIjIwMTAtMDItMjYiLCIyMDEwLTAzLTAxIiwiMjAxMC0wMy0wMiIpKSx0ej1TeXMuZ2V0ZW52KCJUWiIpKQ0Kc3A1MDANCg0Kc3A1MDBbIjIwMTAtMDMtMDIiXQ0Kc3A1MDBbIjIwMTAtMDMiXQ0Kc3A1MDBbIjIwMTAtMDMtMDEvIl0NCnNwNTAwWyIyMDEwLTAyLTI2LzIwMTAtMDMtMDEiXQ0KDQoNCmBgYA0KDQpgYGB7ciBUaW1lIGRlcGVuZGVuY2llcywgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkoeHRzKQ0KZGF0YShBaXJQYXNzZW5nZXJzKQ0KYXAgPC0gYXMueHRzKEFpclBhc3NlbmdlcnMpO2FwDQphcFJlbCA8LSBkaWZmKGFwKS9hcFstbGVuZ3RoKGFwKV07YXBSZWwNCg0KaGVhZChhcCkNCmhlYWQoZW1iZWQoYXAsNCkpDQoNCmNyZWF0ZUVtYmVkRFMgPC0gZnVuY3Rpb24ocywgZW1iPTQpIHtkPC0gZGltKHMpDQppZiAoIWlzLm51bGwoZCkgJiYgZFsyXSA+IDEpIHN0b3AoIk9ubHkgYXBwbGljYWJsZSB0byB1bmktdmFyaWF0ZSB0aW1lIHNlcmllcyIpDQppZiAoZW1iIDwgMiB8fCBlbWIgPiBsZW5ndGgocykpIHN0b3AoIkludmFsaWQgZW1iZWQgc2l6ZSIpDQplIDwtIGVtYmVkKHMsZW1iKQ0KY29sbmFtZXMoZSkgPC0gYygiVCIscGFzdGUoIlQiLDE6KGVtYi0xKSxzZXA9Il8iKSkNCmlmIChpcy54dHMocykpIHJldHVybih4dHMoZSxpbmRleChzKVtlbWI6bGVuZ3RoKHMpXSkpIGVsc2UgcmV0dXJuKGUpDQp9DQpkYXRhU2V0IDwtIGNyZWF0ZUVtYmVkRFMoYXAsZW1iPTUpDQpoZWFkKGRhdGFTZXQpDQoNCg0KDQpgYGANCg0KYGBge3IgU3BhdGlhbCBkZXBlbmRlbmNpZXMsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHJlYWRyKQ0Kc2V0d2QoIkU6LyIpDQpmZiA8LSByZWFkX2NzdigiRTovZm9yZXN0RmlyZXMuY3N2IikNCmZmDQoNCmxpYnJhcnkoc3ApDQpsaWJyYXJ5KGRwbHlyKQ0Kc3BhdGlhbENvb3JkcyA8LSBzZWxlY3QoZmYsbG9uZz14LGxhdD15KSAjIHRoZSBjb250ZXh0dWFsIGRhdGENCmZpcmVzRGF0YSA8LSBzZWxlY3QoZmYsYW5vMjAwMCkgIyB0aGUgYmVoYXZpb3JhbCBkYXRhDQpjb29yZFJlZlN5cyA8LSBDUlMoIitwcm9qPWxvbmdsYXQgK2VsbHBzPVdHUzg0IikNCmZpcmVzMjAwMCA8LSBTcGF0aWFsUG9pbnRzRGF0YUZyYW1lKHNwYXRpYWxDb29yZHMsDQpmaXJlc0RhdGEsDQpwcm9qNHN0cmluZz1jb29yZFJlZlN5cykNCmZpcmVzMjAwMFsxOjMsXQ0KDQpiYm94KGZpcmVzMjAwMCkNCmNvb3JkaW5hdGVzKGZpcmVzMjAwMClbMTozLF0NCnN1bW1hcnkoZmlyZXMyMDAwKQ0KDQpsaWJyYXJ5KGdnbWFwKQ0KbGlicmFyeSh0aWJibGUpDQptYXBQVCA8LSBnZXRfbWFwKCJQb3J0dWdhbCIsem9vbT03KQ0KZDRwbG90IDwtIGFzX3RpYmJsZShjYmluZChjb29yZGluYXRlcyhmaXJlczIwMDApLGJ1cm50PWZpcmVzMjAwMCRhbm8yMDAwKSkNCmdnbWFwKG1hcFBUKSArIGdlb21fcG9pbnQoZGF0YT1maWx0ZXIoZDRwbG90LCBidXJudD09MSksYWVzKHg9bG9uZyx5PWxhdCksY29sPSJvcmFuZ2UiKQ0KDQpgYGANCg0KYGBge3IgSGFuZGxpbmcgVGV4dCBEYXRhc2V0cywgZXZhbD1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkodG0pDQpzZXR3ZCgiRTovIikNCmRvY3MgPC0gQ29ycHVzKERpclNvdXJjZSgiRG9jdW1lbnRzIikpDQpkb2NzDQoNCmRvY3NbWzJdXQ0KY29udGVudChkb2NzW1syXV0pWzE6M10NCg0KZG9jcyA8LSBkb2NzICU+JQ0KdG1fbWFwKHJlbW92ZVB1bmN0dWF0aW9uKSAlPiUNCnRtX21hcChjb250ZW50X3RyYW5zZm9ybWVyKHRvbG93ZXIpKSAlPiUNCnRtX21hcChyZW1vdmVOdW1iZXJzKSAlPiUNCnRtX21hcChyZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCJlbiIpKSAlPiUNCnRtX21hcChzdHJpcFdoaXRlc3BhY2UpICU+JQ0KdG1fbWFwKHN0ZW1Eb2N1bWVudCkNCmNvbnRlbnQoZG9jc1tbMl1dKVsxOjNdDQoNCmRhdGEgPC0gRG9jdW1lbnRUZXJtTWF0cml4KGRvY3MsIGNvbnRyb2w9bGlzdCh3ZWlnaHRpbmc9d2VpZ2h0VGZJZGYpKQ0KZGF0YQ0KDQppbnNwZWN0KGRhdGFbMToyLDE6NV0pDQoNCmZpbmRGcmVxVGVybXMoZGF0YSwwLjkpDQpmaW5kQXNzb2NzKGRhdGEsInJhY2UiLDAuNSkNCg0KbmV3RGF0YSA8LSByZW1vdmVTcGFyc2VUZXJtcyhkYXRhLDAuNykNCm5ld0RhdGENCg0KbGlicmFyeSh0aWJibGUpDQphc190aWJibGUoYXMubWF0cml4KG5ld0RhdGEpKQ0KYGBgDQoNCmBgYHtyIERpbWVuc2lvbmFsaXR5IFJlZHVjdGlvbiwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmRhdGEoaXJpcykNCnByb3Ayc2FtcGxlIDwtIDAuNQ0Kcm93SURzIDwtIHNhbXBsZSgxOm5yb3coaXJpcyksIGFzLmludGVnZXIocHJvcDJzYW1wbGUqbnJvdyhpcmlzKSksIHJlcGxhY2U9VFJVRSkNCmlyaXMuc2FtcGxlIDwtIGlyaXNbcm93SURzLF0NCg0KbnJMaW5lc0ZpbGUgPC0gZnVuY3Rpb24oZikgew0KaWYgKC5QbGF0Zm9ybSRPUy50eXBlID09ICJ1bml4IikNCmFzLmludGVnZXIoc3Ryc3BsaXQodHJpbXdzKHN5c3RlbShwYXN0ZSgid2MgLWwiLGYpLGludGVybj1UUlVFKSksDQoiICIpW1sxXV1bMV0pDQplbHNlDQpzdG9wKCJUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHVuaXgtYmFzZWQgc3lzdGVtcyIpDQp9DQoNCnNhbXBsZUNTViA8LSBmdW5jdGlvbihmaWxlLCBwZXJjT1JuLCBuckxpbmVzLCBoZWFkZXI9VFJVRSwgbXhQZXJjPTAuNSkgew0KaWYgKC5QbGF0Zm9ybSRPUy50eXBlICE9ICJ1bml4IikNCnN0b3AoIlRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgdW5peC1iYXNlZCBzeXN0ZW1zIikNCnJlcXVpcmUocmVhZHIsIHF1aWV0bHk9VFJVRSkNCmlmIChtaXNzaW5nKG5yTGluZXMpKSANCiAgbnJMaW5lcyA8LSBuckxpbmVzRmlsZShmaWxlKQ0KaWYgKHBlcmNPUm4gPCAxKQ0KaWYgKHBlcmNPUm4gPiBteFBlcmMpDQpzdG9wKCJUaGlzIGZ1bmN0aW9uIGlzIG5vdCBhZGVxdWF0ZSBmb3IgdGhhdCBiaWcgc2FtcGxlcy4iKQ0KZWxzZSBwZXJjT1JuIDwtIGFzLmludGVnZXIocGVyY09SbipuckxpbmVzKQ0KcGVyYyA8LSBtaW4oMipwZXJjT1JuL25yTGluZXMsIG14UGVyYykNCnN5c3RlbShwYXN0ZTAoInBlcmwgLW5lICdwcmludCBpZiAocmFuZCgpIDwgIixwZXJjLCIpJyAiLGZpbGUsDQoiICIsZmlsZSwiLnRtcC5jc3YiKSkNCmR0PC0gcmVhZF9jc3YocGFzdGUwKGZpbGUsIi50bXAuY3N2IiksY29sX25hbWVzPWhlYWRlciwgbl9tYXg9cGVyY09SbikNCmZpbGUucmVtb3ZlKHBhc3RlMChmaWxlLCIudG1wLmNzdiIpKQ0KaWYgKG5yb3coZHQpICE9IHBlcmNPUm4pDQp3YXJuaW5nKHBhc3RlKCJFeHBlY3RpbmciLHBlcmNPUm4sInJvd3MsIGJ1dCBnb3QiLG5yb3coZHQpKSkNCmR0DQp9DQoNCnQgPC0gU3lzLnRpbWUoKQ0Kc2V0d2QoIkU6LyIpDQpkIDwtIHNhbXBsZUNTVigiYWxsc2Vuc29ycy5jc3YiLCAwLjAxLCBoZWFkZXI9RkFMU0UpDQoNClN5cy50aW1lKCktdA0KDQpucm93KGQpDQoNCmxpYnJhcnkoREJJKQ0KbGlicmFyeShSTXlTUUwpDQpkcnYgPC0gZGJEcml2ZXIoIk15U1FMIikgIyBMb2FkaW5nIHRoZSBNeVNRTCBkcml2ZXINCmNvbiA8LSBkYkNvbm5lY3QoZHJ2LGRibmFtZT0idHJhbnNEQiIsDQp1c2VybmFtZT0ibXl1c2VyIixwYXNzd29yZD0ibXlwYXNzd29yZCIsDQpob3N0PSJsb2NhbGhvc3QiKQ0KDQoNCnNhbXBsZURCTVMgPC0gZnVuY3Rpb24oZGJDb25uLCB0YmwsIHBlcmNPUm4sIG14UGVyYz0wLjUpIHsNCm5yUmVjb3JkcyA8LSB1bmxpc3QoZGJHZXRRdWVyeShkYkNvbm4sIHBhc3RlKCJzZWxlY3QgY291bnQoKikgZnJvbSIsdGJsKSkpDQppZiAocGVyY09SbiA8IDEpDQppZiAocGVyY09SbiA+bXhQZXJjKQ0Kc3RvcCgiVGhpcyBmdW5jdGlvbiBpcyBub3QgYWRlcXVhdGUgZm9yIHRoYXQgYmlnIHNhbXBsZXMuIikNCmVsc2UgcGVyY09SbiA8LSBhcy5pbnRlZ2VyKHBlcmNPUm4qbnJSZWNvcmRzKQ0KcGVyYyA8LSBtaW4oMipwZXJjT1JuL25yUmVjb3JkcywgbXhQZXJjKQ0KZHQgPC0gZGJHZXRRdWVyeShkYkNvbm4scGFzdGUoInNlbGVjdCAqIGZyb20gKHNlbGVjdCAqIGZyb20iLHRibCwNCiJ3aGVyZSByYW5kKCkgPD0gIixwZXJjLCIpIGFzIHQgbGltaXQgIixwZXJjT1JuKSkNCmlmIChucm93KGR0KSAhPSBwZXJjT1JuKQ0Kd2FybmluZyhwYXN0ZSgiRXhwZWN0aW5nIixwZXJjT1JuLCJyb3dzLCBidXQgZ290Iixucm93KGR0KSkpDQpkdA0KfQ0KDQoNCnQxIDwtIFN5cy50aW1lKCkNCmQgPC0gc2FtcGxlREJNUyhjb24sInNlbnNvcl92YWx1ZXMiLDEwMDAwKQ0KU3lzLnRpbWUoKS10MQ0KDQpucm93KGQpDQoNCmRiRGlzY29ubmVjdChjb24pDQoNCmRiVW5sb2FkRHJpdmVyKGRydikNCg0KYGBgDQoNCmBgYHtyIFZhcmlhYmxlIFNlbGVjdGlvbiwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkoQ09SRWxlYXJuKQ0KZGF0YShpcmlzKQ0KYXR0ckV2YWwoU3BlY2llcyB+IC4sIGlyaXMsIGVzdGltYXRvcj0iR2FpblJhdGlvIikNCg0KYXR0ckV2YWwoU3BlY2llcyB+IC4sIGlyaXMsIGVzdGltYXRvcj0iSW5mR2FpbiIpDQoNCmF0dHJFdmFsKFNwZWNpZXMgfiAuLCBpcmlzLCBlc3RpbWF0b3I9IkdpbmkiKQ0KDQphdHRyRXZhbChTcGVjaWVzIH4gLiwgaXJpcywgZXN0aW1hdG9yPSJNREwiKQ0KDQppbmZvQ29yZSh3aGF0PSJhdHRyRXZhbCIpDQoNCmRhdGEoYWxnYWUsIHBhY2thZ2UgPSJETXdSMiIpDQphdHRyRXZhbChhMSB+IC4sIGFsZ2FlWywxOjEyXSwgZXN0aW1hdG9yPSJNU0VvZk1lYW4iKQ0KDQphdHRyRXZhbChhMSB+IC4sIGFsZ2FlWywxOjEyXSwgZXN0aW1hdG9yPSJSUmVsaWVmRmV4cFJhbmsiKQ0KDQppbmZvQ29yZSh3aGF0PSJhdHRyRXZhbFJlZyIpDQoNCmRhdGEoaXJpcykNCnBjYS5kYXRhIDwtIGlyaXNbLC01XSAjIGVhY2ggY2FzZSBpcyBkZXNjcmliZWQgYnkgdGhlIGZpcnN0IDQgdmFyaWFibGVzDQpwY2EgPC0gcHJpbmNvbXAocGNhLmRhdGEpDQpsb2FkaW5ncyhwY2EpDQoNCnBjYSRzY29yZXNbMTo1LF0NCg0KZGltKGlyaXMpDQoNCnJlZHVjZWQuaXJpcyA8LSBkYXRhLmZyYW1lKHBjYSRzY29yZXNbLDE6Ml0sU3BlY2llcz1pcmlzJFNwZWNpZXMpDQpkaW0ocmVkdWNlZC5pcmlzKQ0KDQpoZWFkKHJlZHVjZWQuaXJpcykNCmBgYA0KDQoNCg0K