-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrustgraz_talk_08.html
215 lines (202 loc) · 548 KB
/
rustgraz_talk_08.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="generator" content="pandoc">
<meta name="author" content="Lukas Prokop">
<title>Rust Graz – 08 traits</title>
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui">
<link href="data:text/css; charset=utf-8,%2F%2A%21%0A%20%2A%20reveal%2Ejs%0A%20%2A%20http%3A%2F%2Frevealjs%2Ecom%0A%20%2A%20MIT%20licensed%0A%20%2A%0A%20%2A%20Copyright%20%28C%29%202019%20Hakim%20El%20Hattab%2C%20http%3A%2F%2Fhakim%2Ese%0A%20%2A%2F%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20GLOBAL%20STYLES%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0Ahtml%20%7B%0A%20%20width%3A%20100%25%3B%0A%20%20height%3A%20100%25%3B%0A%20%20height%3A%20100vh%3B%0A%20%20height%3A%20calc%28%20var%28%2D%2Dvh%2C%201vh%29%20%2A%20100%29%3B%0A%20%20overflow%3A%20hidden%3B%20%7D%0A%0Abody%20%7B%0A%20%20height%3A%20100%25%3B%0A%20%20overflow%3A%20hidden%3B%0A%20%20position%3A%20relative%3B%0A%20%20line%2Dheight%3A%201%3B%0A%20%20margin%3A%200%3B%0A%20%20background%2Dcolor%3A%20%23fff%3B%0A%20%20color%3A%20%23000%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20VIEW%20FRAGMENTS%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%20%7B%0A%20%20opacity%3A%200%3B%0A%20%20visibility%3A%20hidden%3B%0A%20%20transition%3A%20all%20%2E2s%20ease%3B%20%7D%0A%20%20%2Ereveal%20%2Eslides%20section%20%2Efragment%2Evisible%20%7B%0A%20%20%20%20opacity%3A%201%3B%0A%20%20%20%20visibility%3A%20inherit%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%2Egrow%20%7B%0A%20%20opacity%3A%201%3B%0A%20%20visibility%3A%20inherit%3B%20%7D%0A%20%20%2Ereveal%20%2Eslides%20section%20%2Efragment%2Egrow%2Evisible%20%7B%0A%20%20%20%20%2Dwebkit%2Dtransform%3A%20scale%281%2E3%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20scale%281%2E3%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%2Eshrink%20%7B%0A%20%20opacity%3A%201%3B%0A%20%20visibility%3A%20inherit%3B%20%7D%0A%20%20%2Ereveal%20%2Eslides%20section%20%2Efragment%2Eshrink%2Evisible%20%7B%0A%20%20%20%20%2Dwebkit%2Dtransform%3A%20scale%280%2E7%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20scale%280%2E7%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%2Ezoom%2Din%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20scale%280%2E1%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20scale%280%2E1%29%3B%20%7D%0A%20%20%2Ereveal%20%2Eslides%20section%20%2Efragment%2Ezoom%2Din%2Evisible%20%7B%0A%20%20%20%20%2Dwebkit%2Dtransform%3A%20none%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20none%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%2Efade%2Dout%20%7B%0A%20%20opacity%3A%201%3B%0A%20%20visibility%3A%20inherit%3B%20%7D%0A%20%20%2Ereveal%20%2Eslides%20section%20%2Efragment%2Efade%2Dout%2Evisible%20%7B%0A%20%20%20%20opacity%3A%200%3B%0A%20%20%20%20visibility%3A%20hidden%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%2Esemi%2Dfade%2Dout%20%7B%0A%20%20opacity%3A%201%3B%0A%20%20visibility%3A%20inherit%3B%20%7D%0A%20%20%2Ereveal%20%2Eslides%20section%20%2Efragment%2Esemi%2Dfade%2Dout%2Evisible%20%7B%0A%20%20%20%20opacity%3A%200%2E5%3B%0A%20%20%20%20visibility%3A%20inherit%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%2Estrike%20%7B%0A%20%20opacity%3A%201%3B%0A%20%20visibility%3A%20inherit%3B%20%7D%0A%20%20%2Ereveal%20%2Eslides%20section%20%2Efragment%2Estrike%2Evisible%20%7B%0A%20%20%20%20text%2Ddecoration%3A%20line%2Dthrough%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%2Efade%2Dup%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate%280%2C%2020%25%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate%280%2C%2020%25%29%3B%20%7D%0A%20%20%2Ereveal%20%2Eslides%20section%20%2Efragment%2Efade%2Dup%2Evisible%20%7B%0A%20%20%20%20%2Dwebkit%2Dtransform%3A%20translate%280%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translate%280%2C%200%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%2Efade%2Ddown%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate%280%2C%20%2D20%25%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate%280%2C%20%2D20%25%29%3B%20%7D%0A%20%20%2Ereveal%20%2Eslides%20section%20%2Efragment%2Efade%2Ddown%2Evisible%20%7B%0A%20%20%20%20%2Dwebkit%2Dtransform%3A%20translate%280%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translate%280%2C%200%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%2Efade%2Dright%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate%28%2D20%25%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate%28%2D20%25%2C%200%29%3B%20%7D%0A%20%20%2Ereveal%20%2Eslides%20section%20%2Efragment%2Efade%2Dright%2Evisible%20%7B%0A%20%20%20%20%2Dwebkit%2Dtransform%3A%20translate%280%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translate%280%2C%200%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%2Efade%2Dleft%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate%2820%25%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate%2820%25%2C%200%29%3B%20%7D%0A%20%20%2Ereveal%20%2Eslides%20section%20%2Efragment%2Efade%2Dleft%2Evisible%20%7B%0A%20%20%20%20%2Dwebkit%2Dtransform%3A%20translate%280%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translate%280%2C%200%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%2Efade%2Din%2Dthen%2Dout%2C%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%2Ecurrent%2Dvisible%20%7B%0A%20%20opacity%3A%200%3B%0A%20%20visibility%3A%20hidden%3B%20%7D%0A%20%20%2Ereveal%20%2Eslides%20section%20%2Efragment%2Efade%2Din%2Dthen%2Dout%2Ecurrent%2Dfragment%2C%0A%20%20%2Ereveal%20%2Eslides%20section%20%2Efragment%2Ecurrent%2Dvisible%2Ecurrent%2Dfragment%20%7B%0A%20%20%20%20opacity%3A%201%3B%0A%20%20%20%20visibility%3A%20inherit%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%2Efade%2Din%2Dthen%2Dsemi%2Dout%20%7B%0A%20%20opacity%3A%200%3B%0A%20%20visibility%3A%20hidden%3B%20%7D%0A%20%20%2Ereveal%20%2Eslides%20section%20%2Efragment%2Efade%2Din%2Dthen%2Dsemi%2Dout%2Evisible%20%7B%0A%20%20%20%20opacity%3A%200%2E5%3B%0A%20%20%20%20visibility%3A%20inherit%3B%20%7D%0A%20%20%2Ereveal%20%2Eslides%20section%20%2Efragment%2Efade%2Din%2Dthen%2Dsemi%2Dout%2Ecurrent%2Dfragment%20%7B%0A%20%20%20%20opacity%3A%201%3B%0A%20%20%20%20visibility%3A%20inherit%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%2Ehighlight%2Dred%2C%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%2Ehighlight%2Dcurrent%2Dred%2C%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%2Ehighlight%2Dgreen%2C%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%2Ehighlight%2Dcurrent%2Dgreen%2C%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%2Ehighlight%2Dblue%2C%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%2Ehighlight%2Dcurrent%2Dblue%20%7B%0A%20%20opacity%3A%201%3B%0A%20%20visibility%3A%20inherit%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%2Ehighlight%2Dred%2Evisible%20%7B%0A%20%20color%3A%20%23ff2c2d%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%2Ehighlight%2Dgreen%2Evisible%20%7B%0A%20%20color%3A%20%2317ff2e%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%2Ehighlight%2Dblue%2Evisible%20%7B%0A%20%20color%3A%20%231b91ff%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%2Ehighlight%2Dcurrent%2Dred%2Ecurrent%2Dfragment%20%7B%0A%20%20color%3A%20%23ff2c2d%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%2Ehighlight%2Dcurrent%2Dgreen%2Ecurrent%2Dfragment%20%7B%0A%20%20color%3A%20%2317ff2e%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20section%20%2Efragment%2Ehighlight%2Dcurrent%2Dblue%2Ecurrent%2Dfragment%20%7B%0A%20%20color%3A%20%231b91ff%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20DEFAULT%20ELEMENT%20STYLES%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2F%2A%20Fixes%20issue%20in%20Chrome%20where%20italic%20fonts%20did%20not%20appear%20when%20printing%20to%20PDF%20%2A%2F%0A%2Ereveal%3Aafter%20%7B%0A%20%20content%3A%20%27%27%3B%0A%20%20font%2Dstyle%3A%20italic%3B%20%7D%0A%0A%2Ereveal%20iframe%20%7B%0A%20%20z%2Dindex%3A%201%3B%20%7D%0A%0A%2F%2A%2A%20Prevents%20layering%20issues%20in%20certain%20browser%2Ftransition%20combinations%20%2A%2F%0A%2Ereveal%20a%20%7B%0A%20%20position%3A%20relative%3B%20%7D%0A%0A%2Ereveal%20%2Estretch%20%7B%0A%20%20max%2Dwidth%3A%20none%3B%0A%20%20max%2Dheight%3A%20none%3B%20%7D%0A%0A%2Ereveal%20pre%2Estretch%20code%20%7B%0A%20%20height%3A%20100%25%3B%0A%20%20max%2Dheight%3A%20100%25%3B%0A%20%20box%2Dsizing%3A%20border%2Dbox%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20CONTROLS%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%40%2Dwebkit%2Dkeyframes%20bounce%2Dright%20%7B%0A%20%200%25%2C%2010%25%2C%2025%25%2C%2040%25%2C%2050%25%20%7B%0A%20%20%20%20%2Dwebkit%2Dtransform%3A%20translateX%280%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translateX%280%29%3B%20%7D%0A%20%2020%25%20%7B%0A%20%20%20%20%2Dwebkit%2Dtransform%3A%20translateX%2810px%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translateX%2810px%29%3B%20%7D%0A%20%2030%25%20%7B%0A%20%20%20%20%2Dwebkit%2Dtransform%3A%20translateX%28%2D5px%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translateX%28%2D5px%29%3B%20%7D%20%7D%0A%40keyframes%20bounce%2Dright%20%7B%0A%20%200%25%2C%2010%25%2C%2025%25%2C%2040%25%2C%2050%25%20%7B%0A%20%20%20%20%2Dwebkit%2Dtransform%3A%20translateX%280%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translateX%280%29%3B%20%7D%0A%20%2020%25%20%7B%0A%20%20%20%20%2Dwebkit%2Dtransform%3A%20translateX%2810px%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translateX%2810px%29%3B%20%7D%0A%20%2030%25%20%7B%0A%20%20%20%20%2Dwebkit%2Dtransform%3A%20translateX%28%2D5px%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translateX%28%2D5px%29%3B%20%7D%20%7D%0A%0A%40%2Dwebkit%2Dkeyframes%20bounce%2Ddown%20%7B%0A%20%200%25%2C%2010%25%2C%2025%25%2C%2040%25%2C%2050%25%20%7B%0A%20%20%20%20%2Dwebkit%2Dtransform%3A%20translateY%280%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translateY%280%29%3B%20%7D%0A%20%2020%25%20%7B%0A%20%20%20%20%2Dwebkit%2Dtransform%3A%20translateY%2810px%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translateY%2810px%29%3B%20%7D%0A%20%2030%25%20%7B%0A%20%20%20%20%2Dwebkit%2Dtransform%3A%20translateY%28%2D5px%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translateY%28%2D5px%29%3B%20%7D%20%7D%0A%0A%40keyframes%20bounce%2Ddown%20%7B%0A%20%200%25%2C%2010%25%2C%2025%25%2C%2040%25%2C%2050%25%20%7B%0A%20%20%20%20%2Dwebkit%2Dtransform%3A%20translateY%280%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translateY%280%29%3B%20%7D%0A%20%2020%25%20%7B%0A%20%20%20%20%2Dwebkit%2Dtransform%3A%20translateY%2810px%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translateY%2810px%29%3B%20%7D%0A%20%2030%25%20%7B%0A%20%20%20%20%2Dwebkit%2Dtransform%3A%20translateY%28%2D5px%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translateY%28%2D5px%29%3B%20%7D%20%7D%0A%0A%2Ereveal%20%2Econtrols%20%7B%0A%20%20display%3A%20none%3B%0A%20%20position%3A%20absolute%3B%0A%20%20top%3A%20auto%3B%0A%20%20bottom%3A%2012px%3B%0A%20%20right%3A%2012px%3B%0A%20%20left%3A%20auto%3B%0A%20%20z%2Dindex%3A%2011%3B%0A%20%20color%3A%20%23000%3B%0A%20%20pointer%2Devents%3A%20none%3B%0A%20%20font%2Dsize%3A%2010px%3B%20%7D%0A%20%20%2Ereveal%20%2Econtrols%20button%20%7B%0A%20%20%20%20position%3A%20absolute%3B%0A%20%20%20%20padding%3A%200%3B%0A%20%20%20%20background%2Dcolor%3A%20transparent%3B%0A%20%20%20%20border%3A%200%3B%0A%20%20%20%20outline%3A%200%3B%0A%20%20%20%20cursor%3A%20pointer%3B%0A%20%20%20%20color%3A%20currentColor%3B%0A%20%20%20%20%2Dwebkit%2Dtransform%3A%20scale%280%2E9999%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20scale%280%2E9999%29%3B%0A%20%20%20%20transition%3A%20color%200%2E2s%20ease%2C%20opacity%200%2E2s%20ease%2C%20%2Dwebkit%2Dtransform%200%2E2s%20ease%3B%0A%20%20%20%20transition%3A%20color%200%2E2s%20ease%2C%20opacity%200%2E2s%20ease%2C%20transform%200%2E2s%20ease%3B%0A%20%20%20%20z%2Dindex%3A%202%3B%0A%20%20%20%20pointer%2Devents%3A%20auto%3B%0A%20%20%20%20font%2Dsize%3A%20inherit%3B%0A%20%20%20%20visibility%3A%20hidden%3B%0A%20%20%20%20opacity%3A%200%3B%0A%20%20%20%20%2Dwebkit%2Dappearance%3A%20none%3B%0A%20%20%20%20%2Dwebkit%2Dtap%2Dhighlight%2Dcolor%3A%20rgba%280%2C%200%2C%200%2C%200%29%3B%20%7D%0A%20%20%2Ereveal%20%2Econtrols%20%2Econtrols%2Darrow%3Abefore%2C%0A%20%20%2Ereveal%20%2Econtrols%20%2Econtrols%2Darrow%3Aafter%20%7B%0A%20%20%20%20content%3A%20%27%27%3B%0A%20%20%20%20position%3A%20absolute%3B%0A%20%20%20%20top%3A%200%3B%0A%20%20%20%20left%3A%200%3B%0A%20%20%20%20width%3A%202%2E6em%3B%0A%20%20%20%20height%3A%200%2E5em%3B%0A%20%20%20%20border%2Dradius%3A%200%2E25em%3B%0A%20%20%20%20background%2Dcolor%3A%20currentColor%3B%0A%20%20%20%20transition%3A%20all%200%2E15s%20ease%2C%20background%2Dcolor%200%2E8s%20ease%3B%0A%20%20%20%20%2Dwebkit%2Dtransform%2Dorigin%3A%200%2E2em%2050%25%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%2Dorigin%3A%200%2E2em%2050%25%3B%0A%20%20%20%20will%2Dchange%3A%20transform%3B%20%7D%0A%20%20%2Ereveal%20%2Econtrols%20%2Econtrols%2Darrow%20%7B%0A%20%20%20%20position%3A%20relative%3B%0A%20%20%20%20width%3A%203%2E6em%3B%0A%20%20%20%20height%3A%203%2E6em%3B%20%7D%0A%20%20%20%20%2Ereveal%20%2Econtrols%20%2Econtrols%2Darrow%3Abefore%20%7B%0A%20%20%20%20%20%20%2Dwebkit%2Dtransform%3A%20translateX%280%2E5em%29%20translateY%281%2E55em%29%20rotate%2845deg%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translateX%280%2E5em%29%20translateY%281%2E55em%29%20rotate%2845deg%29%3B%20%7D%0A%20%20%20%20%2Ereveal%20%2Econtrols%20%2Econtrols%2Darrow%3Aafter%20%7B%0A%20%20%20%20%20%20%2Dwebkit%2Dtransform%3A%20translateX%280%2E5em%29%20translateY%281%2E55em%29%20rotate%28%2D45deg%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translateX%280%2E5em%29%20translateY%281%2E55em%29%20rotate%28%2D45deg%29%3B%20%7D%0A%20%20%20%20%2Ereveal%20%2Econtrols%20%2Econtrols%2Darrow%3Ahover%3Abefore%20%7B%0A%20%20%20%20%20%20%2Dwebkit%2Dtransform%3A%20translateX%280%2E5em%29%20translateY%281%2E55em%29%20rotate%2840deg%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translateX%280%2E5em%29%20translateY%281%2E55em%29%20rotate%2840deg%29%3B%20%7D%0A%20%20%20%20%2Ereveal%20%2Econtrols%20%2Econtrols%2Darrow%3Ahover%3Aafter%20%7B%0A%20%20%20%20%20%20%2Dwebkit%2Dtransform%3A%20translateX%280%2E5em%29%20translateY%281%2E55em%29%20rotate%28%2D40deg%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translateX%280%2E5em%29%20translateY%281%2E55em%29%20rotate%28%2D40deg%29%3B%20%7D%0A%20%20%20%20%2Ereveal%20%2Econtrols%20%2Econtrols%2Darrow%3Aactive%3Abefore%20%7B%0A%20%20%20%20%20%20%2Dwebkit%2Dtransform%3A%20translateX%280%2E5em%29%20translateY%281%2E55em%29%20rotate%2836deg%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translateX%280%2E5em%29%20translateY%281%2E55em%29%20rotate%2836deg%29%3B%20%7D%0A%20%20%20%20%2Ereveal%20%2Econtrols%20%2Econtrols%2Darrow%3Aactive%3Aafter%20%7B%0A%20%20%20%20%20%20%2Dwebkit%2Dtransform%3A%20translateX%280%2E5em%29%20translateY%281%2E55em%29%20rotate%28%2D36deg%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translateX%280%2E5em%29%20translateY%281%2E55em%29%20rotate%28%2D36deg%29%3B%20%7D%0A%20%20%2Ereveal%20%2Econtrols%20%2Enavigate%2Dleft%20%7B%0A%20%20%20%20right%3A%206%2E4em%3B%0A%20%20%20%20bottom%3A%203%2E2em%3B%0A%20%20%20%20%2Dwebkit%2Dtransform%3A%20translateX%28%2D10px%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translateX%28%2D10px%29%3B%20%7D%0A%20%20%2Ereveal%20%2Econtrols%20%2Enavigate%2Dright%20%7B%0A%20%20%20%20right%3A%200%3B%0A%20%20%20%20bottom%3A%203%2E2em%3B%0A%20%20%20%20%2Dwebkit%2Dtransform%3A%20translateX%2810px%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translateX%2810px%29%3B%20%7D%0A%20%20%20%20%2Ereveal%20%2Econtrols%20%2Enavigate%2Dright%20%2Econtrols%2Darrow%20%7B%0A%20%20%20%20%20%20%2Dwebkit%2Dtransform%3A%20rotate%28180deg%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20rotate%28180deg%29%3B%20%7D%0A%20%20%20%20%2Ereveal%20%2Econtrols%20%2Enavigate%2Dright%2Ehighlight%20%7B%0A%20%20%20%20%20%20%2Dwebkit%2Danimation%3A%20bounce%2Dright%202s%2050%20both%20ease%2Dout%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20animation%3A%20bounce%2Dright%202s%2050%20both%20ease%2Dout%3B%20%7D%0A%20%20%2Ereveal%20%2Econtrols%20%2Enavigate%2Dup%20%7B%0A%20%20%20%20right%3A%203%2E2em%3B%0A%20%20%20%20bottom%3A%206%2E4em%3B%0A%20%20%20%20%2Dwebkit%2Dtransform%3A%20translateY%28%2D10px%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translateY%28%2D10px%29%3B%20%7D%0A%20%20%20%20%2Ereveal%20%2Econtrols%20%2Enavigate%2Dup%20%2Econtrols%2Darrow%20%7B%0A%20%20%20%20%20%20%2Dwebkit%2Dtransform%3A%20rotate%2890deg%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20rotate%2890deg%29%3B%20%7D%0A%20%20%2Ereveal%20%2Econtrols%20%2Enavigate%2Ddown%20%7B%0A%20%20%20%20right%3A%203%2E2em%3B%0A%20%20%20%20bottom%3A%20%2D1%2E4em%3B%0A%20%20%20%20padding%2Dbottom%3A%201%2E4em%3B%0A%20%20%20%20%2Dwebkit%2Dtransform%3A%20translateY%2810px%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translateY%2810px%29%3B%20%7D%0A%20%20%20%20%2Ereveal%20%2Econtrols%20%2Enavigate%2Ddown%20%2Econtrols%2Darrow%20%7B%0A%20%20%20%20%20%20%2Dwebkit%2Dtransform%3A%20rotate%28%2D90deg%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20rotate%28%2D90deg%29%3B%20%7D%0A%20%20%20%20%2Ereveal%20%2Econtrols%20%2Enavigate%2Ddown%2Ehighlight%20%7B%0A%20%20%20%20%20%20%2Dwebkit%2Danimation%3A%20bounce%2Ddown%202s%2050%20both%20ease%2Dout%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20animation%3A%20bounce%2Ddown%202s%2050%20both%20ease%2Dout%3B%20%7D%0A%20%20%2Ereveal%20%2Econtrols%5Bdata%2Dcontrols%2Dback%2Darrows%3D%22faded%22%5D%20%2Enavigate%2Dleft%2Eenabled%2C%0A%20%20%2Ereveal%20%2Econtrols%5Bdata%2Dcontrols%2Dback%2Darrows%3D%22faded%22%5D%20%2Enavigate%2Dup%2Eenabled%20%7B%0A%20%20%20%20opacity%3A%200%2E3%3B%20%7D%0A%20%20%20%20%2Ereveal%20%2Econtrols%5Bdata%2Dcontrols%2Dback%2Darrows%3D%22faded%22%5D%20%2Enavigate%2Dleft%2Eenabled%3Ahover%2C%0A%20%20%20%20%2Ereveal%20%2Econtrols%5Bdata%2Dcontrols%2Dback%2Darrows%3D%22faded%22%5D%20%2Enavigate%2Dup%2Eenabled%3Ahover%20%7B%0A%20%20%20%20%20%20opacity%3A%201%3B%20%7D%0A%20%20%2Ereveal%20%2Econtrols%5Bdata%2Dcontrols%2Dback%2Darrows%3D%22hidden%22%5D%20%2Enavigate%2Dleft%2Eenabled%2C%0A%20%20%2Ereveal%20%2Econtrols%5Bdata%2Dcontrols%2Dback%2Darrows%3D%22hidden%22%5D%20%2Enavigate%2Dup%2Eenabled%20%7B%0A%20%20%20%20opacity%3A%200%3B%0A%20%20%20%20visibility%3A%20hidden%3B%20%7D%0A%20%20%2Ereveal%20%2Econtrols%20%2Eenabled%20%7B%0A%20%20%20%20visibility%3A%20visible%3B%0A%20%20%20%20opacity%3A%200%2E9%3B%0A%20%20%20%20cursor%3A%20pointer%3B%0A%20%20%20%20%2Dwebkit%2Dtransform%3A%20none%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20none%3B%20%7D%0A%20%20%2Ereveal%20%2Econtrols%20%2Eenabled%2Efragmented%20%7B%0A%20%20%20%20opacity%3A%200%2E5%3B%20%7D%0A%20%20%2Ereveal%20%2Econtrols%20%2Eenabled%3Ahover%2C%0A%20%20%2Ereveal%20%2Econtrols%20%2Eenabled%2Efragmented%3Ahover%20%7B%0A%20%20%20%20opacity%3A%201%3B%20%7D%0A%0A%2Ereveal%5Bdata%2Dnavigation%2Dmode%3D%22linear%22%5D%2Ehas%2Dhorizontal%2Dslides%20%2Enavigate%2Dup%2C%0A%2Ereveal%5Bdata%2Dnavigation%2Dmode%3D%22linear%22%5D%2Ehas%2Dhorizontal%2Dslides%20%2Enavigate%2Ddown%20%7B%0A%20%20display%3A%20none%3B%20%7D%0A%0A%2Ereveal%5Bdata%2Dnavigation%2Dmode%3D%22linear%22%5D%2Ehas%2Dhorizontal%2Dslides%20%2Enavigate%2Dleft%2C%0A%2Ereveal%3Anot%28%2Ehas%2Dvertical%2Dslides%29%20%2Econtrols%20%2Enavigate%2Dleft%20%7B%0A%20%20bottom%3A%201%2E4em%3B%0A%20%20right%3A%205%2E5em%3B%20%7D%0A%0A%2Ereveal%5Bdata%2Dnavigation%2Dmode%3D%22linear%22%5D%2Ehas%2Dhorizontal%2Dslides%20%2Enavigate%2Dright%2C%0A%2Ereveal%3Anot%28%2Ehas%2Dvertical%2Dslides%29%20%2Econtrols%20%2Enavigate%2Dright%20%7B%0A%20%20bottom%3A%201%2E4em%3B%0A%20%20right%3A%200%2E5em%3B%20%7D%0A%0A%2Ereveal%3Anot%28%2Ehas%2Dhorizontal%2Dslides%29%20%2Econtrols%20%2Enavigate%2Dup%20%7B%0A%20%20right%3A%201%2E4em%3B%0A%20%20bottom%3A%205em%3B%20%7D%0A%0A%2Ereveal%3Anot%28%2Ehas%2Dhorizontal%2Dslides%29%20%2Econtrols%20%2Enavigate%2Ddown%20%7B%0A%20%20right%3A%201%2E4em%3B%0A%20%20bottom%3A%200%2E5em%3B%20%7D%0A%0A%2Ereveal%2Ehas%2Ddark%2Dbackground%20%2Econtrols%20%7B%0A%20%20color%3A%20%23fff%3B%20%7D%0A%0A%2Ereveal%2Ehas%2Dlight%2Dbackground%20%2Econtrols%20%7B%0A%20%20color%3A%20%23000%3B%20%7D%0A%0A%2Ereveal%2Eno%2Dhover%20%2Econtrols%20%2Econtrols%2Darrow%3Ahover%3Abefore%2C%0A%2Ereveal%2Eno%2Dhover%20%2Econtrols%20%2Econtrols%2Darrow%3Aactive%3Abefore%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translateX%280%2E5em%29%20translateY%281%2E55em%29%20rotate%2845deg%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translateX%280%2E5em%29%20translateY%281%2E55em%29%20rotate%2845deg%29%3B%20%7D%0A%0A%2Ereveal%2Eno%2Dhover%20%2Econtrols%20%2Econtrols%2Darrow%3Ahover%3Aafter%2C%0A%2Ereveal%2Eno%2Dhover%20%2Econtrols%20%2Econtrols%2Darrow%3Aactive%3Aafter%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translateX%280%2E5em%29%20translateY%281%2E55em%29%20rotate%28%2D45deg%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translateX%280%2E5em%29%20translateY%281%2E55em%29%20rotate%28%2D45deg%29%3B%20%7D%0A%0A%40media%20screen%20and%20%28min%2Dwidth%3A%20500px%29%20%7B%0A%20%20%2Ereveal%20%2Econtrols%5Bdata%2Dcontrols%2Dlayout%3D%22edges%22%5D%20%7B%0A%20%20%20%20top%3A%200%3B%0A%20%20%20%20right%3A%200%3B%0A%20%20%20%20bottom%3A%200%3B%0A%20%20%20%20left%3A%200%3B%20%7D%0A%20%20%2Ereveal%20%2Econtrols%5Bdata%2Dcontrols%2Dlayout%3D%22edges%22%5D%20%2Enavigate%2Dleft%2C%0A%20%20%2Ereveal%20%2Econtrols%5Bdata%2Dcontrols%2Dlayout%3D%22edges%22%5D%20%2Enavigate%2Dright%2C%0A%20%20%2Ereveal%20%2Econtrols%5Bdata%2Dcontrols%2Dlayout%3D%22edges%22%5D%20%2Enavigate%2Dup%2C%0A%20%20%2Ereveal%20%2Econtrols%5Bdata%2Dcontrols%2Dlayout%3D%22edges%22%5D%20%2Enavigate%2Ddown%20%7B%0A%20%20%20%20bottom%3A%20auto%3B%0A%20%20%20%20right%3A%20auto%3B%20%7D%0A%20%20%2Ereveal%20%2Econtrols%5Bdata%2Dcontrols%2Dlayout%3D%22edges%22%5D%20%2Enavigate%2Dleft%20%7B%0A%20%20%20%20top%3A%2050%25%3B%0A%20%20%20%20left%3A%200%2E8em%3B%0A%20%20%20%20margin%2Dtop%3A%20%2D1%2E8em%3B%20%7D%0A%20%20%2Ereveal%20%2Econtrols%5Bdata%2Dcontrols%2Dlayout%3D%22edges%22%5D%20%2Enavigate%2Dright%20%7B%0A%20%20%20%20top%3A%2050%25%3B%0A%20%20%20%20right%3A%200%2E8em%3B%0A%20%20%20%20margin%2Dtop%3A%20%2D1%2E8em%3B%20%7D%0A%20%20%2Ereveal%20%2Econtrols%5Bdata%2Dcontrols%2Dlayout%3D%22edges%22%5D%20%2Enavigate%2Dup%20%7B%0A%20%20%20%20top%3A%200%2E8em%3B%0A%20%20%20%20left%3A%2050%25%3B%0A%20%20%20%20margin%2Dleft%3A%20%2D1%2E8em%3B%20%7D%0A%20%20%2Ereveal%20%2Econtrols%5Bdata%2Dcontrols%2Dlayout%3D%22edges%22%5D%20%2Enavigate%2Ddown%20%7B%0A%20%20%20%20bottom%3A%20%2D0%2E3em%3B%0A%20%20%20%20left%3A%2050%25%3B%0A%20%20%20%20margin%2Dleft%3A%20%2D1%2E8em%3B%20%7D%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20PROGRESS%20BAR%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%20%2Eprogress%20%7B%0A%20%20position%3A%20absolute%3B%0A%20%20display%3A%20none%3B%0A%20%20height%3A%203px%3B%0A%20%20width%3A%20100%25%3B%0A%20%20bottom%3A%200%3B%0A%20%20left%3A%200%3B%0A%20%20z%2Dindex%3A%2010%3B%0A%20%20background%2Dcolor%3A%20rgba%280%2C%200%2C%200%2C%200%2E2%29%3B%0A%20%20color%3A%20%23fff%3B%20%7D%0A%0A%2Ereveal%20%2Eprogress%3Aafter%20%7B%0A%20%20content%3A%20%27%27%3B%0A%20%20display%3A%20block%3B%0A%20%20position%3A%20absolute%3B%0A%20%20height%3A%2010px%3B%0A%20%20width%3A%20100%25%3B%0A%20%20top%3A%20%2D10px%3B%20%7D%0A%0A%2Ereveal%20%2Eprogress%20span%20%7B%0A%20%20display%3A%20block%3B%0A%20%20height%3A%20100%25%3B%0A%20%20width%3A%200px%3B%0A%20%20background%2Dcolor%3A%20currentColor%3B%0A%20%20transition%3A%20width%20800ms%20cubic%2Dbezier%280%2E26%2C%200%2E86%2C%200%2E44%2C%200%2E985%29%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20SLIDE%20NUMBER%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%20%2Eslide%2Dnumber%20%7B%0A%20%20position%3A%20absolute%3B%0A%20%20display%3A%20block%3B%0A%20%20right%3A%208px%3B%0A%20%20bottom%3A%208px%3B%0A%20%20z%2Dindex%3A%2031%3B%0A%20%20font%2Dfamily%3A%20Helvetica%2C%20sans%2Dserif%3B%0A%20%20font%2Dsize%3A%2012px%3B%0A%20%20line%2Dheight%3A%201%3B%0A%20%20color%3A%20%23fff%3B%0A%20%20background%2Dcolor%3A%20rgba%280%2C%200%2C%200%2C%200%2E4%29%3B%0A%20%20padding%3A%205px%3B%20%7D%0A%0A%2Ereveal%20%2Eslide%2Dnumber%20a%20%7B%0A%20%20color%3A%20currentColor%3B%20%7D%0A%0A%2Ereveal%20%2Eslide%2Dnumber%2Ddelimiter%20%7B%0A%20%20margin%3A%200%203px%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20SLIDES%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%20%7B%0A%20%20position%3A%20relative%3B%0A%20%20width%3A%20100%25%3B%0A%20%20height%3A%20100%25%3B%0A%20%20overflow%3A%20hidden%3B%0A%20%20%2Dms%2Dtouch%2Daction%3A%20pinch%2Dzoom%3B%0A%20%20%20%20%20%20touch%2Daction%3A%20pinch%2Dzoom%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%7B%0A%20%20position%3A%20absolute%3B%0A%20%20width%3A%20100%25%3B%0A%20%20height%3A%20100%25%3B%0A%20%20top%3A%200%3B%0A%20%20right%3A%200%3B%0A%20%20bottom%3A%200%3B%0A%20%20left%3A%200%3B%0A%20%20margin%3A%20auto%3B%0A%20%20pointer%2Devents%3A%20none%3B%0A%20%20overflow%3A%20visible%3B%0A%20%20z%2Dindex%3A%201%3B%0A%20%20text%2Dalign%3A%20center%3B%0A%20%20%2Dwebkit%2Dperspective%3A%20600px%3B%0A%20%20%20%20%20%20%20%20%20%20perspective%3A%20600px%3B%0A%20%20%2Dwebkit%2Dperspective%2Dorigin%3A%2050%25%2040%25%3B%0A%20%20%20%20%20%20%20%20%20%20perspective%2Dorigin%3A%2050%25%2040%25%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%20%7B%0A%20%20%2Dwebkit%2Dperspective%3A%20600px%3B%0A%20%20%20%20%20%20%20%20%20%20perspective%3A%20600px%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%20%7B%0A%20%20display%3A%20none%3B%0A%20%20position%3A%20absolute%3B%0A%20%20width%3A%20100%25%3B%0A%20%20padding%3A%2020px%200px%3B%0A%20%20pointer%2Devents%3A%20auto%3B%0A%20%20z%2Dindex%3A%2010%3B%0A%20%20%2Dwebkit%2Dtransform%2Dstyle%3A%20flat%3B%0A%20%20%20%20%20%20%20%20%20%20transform%2Dstyle%3A%20flat%3B%0A%20%20transition%3A%20%2Dwebkit%2Dtransform%2Dorigin%20800ms%20cubic%2Dbezier%280%2E26%2C%200%2E86%2C%200%2E44%2C%200%2E985%29%2C%20%2Dwebkit%2Dtransform%20800ms%20cubic%2Dbezier%280%2E26%2C%200%2E86%2C%200%2E44%2C%200%2E985%29%2C%20visibility%20800ms%20cubic%2Dbezier%280%2E26%2C%200%2E86%2C%200%2E44%2C%200%2E985%29%2C%20opacity%20800ms%20cubic%2Dbezier%280%2E26%2C%200%2E86%2C%200%2E44%2C%200%2E985%29%3B%0A%20%20transition%3A%20transform%2Dorigin%20800ms%20cubic%2Dbezier%280%2E26%2C%200%2E86%2C%200%2E44%2C%200%2E985%29%2C%20transform%20800ms%20cubic%2Dbezier%280%2E26%2C%200%2E86%2C%200%2E44%2C%200%2E985%29%2C%20visibility%20800ms%20cubic%2Dbezier%280%2E26%2C%200%2E86%2C%200%2E44%2C%200%2E985%29%2C%20opacity%20800ms%20cubic%2Dbezier%280%2E26%2C%200%2E86%2C%200%2E44%2C%200%2E985%29%3B%20%7D%0A%0A%2F%2A%20Global%20transition%20speed%20settings%20%2A%2F%0A%2Ereveal%5Bdata%2Dtransition%2Dspeed%3D%22fast%22%5D%20%2Eslides%20section%20%7B%0A%20%20transition%2Dduration%3A%20400ms%3B%20%7D%0A%0A%2Ereveal%5Bdata%2Dtransition%2Dspeed%3D%22slow%22%5D%20%2Eslides%20section%20%7B%0A%20%20transition%2Dduration%3A%201200ms%3B%20%7D%0A%0A%2F%2A%20Slide%2Dspecific%20transition%20speed%20overrides%20%2A%2F%0A%2Ereveal%20%2Eslides%20section%5Bdata%2Dtransition%2Dspeed%3D%22fast%22%5D%20%7B%0A%20%20transition%2Dduration%3A%20400ms%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20section%5Bdata%2Dtransition%2Dspeed%3D%22slow%22%5D%20%7B%0A%20%20transition%2Dduration%3A%201200ms%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%2Estack%20%7B%0A%20%20padding%2Dtop%3A%200%3B%0A%20%20padding%2Dbottom%3A%200%3B%0A%20%20pointer%2Devents%3A%20none%3B%0A%20%20height%3A%20100%25%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%2Epresent%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%2Epresent%20%7B%0A%20%20display%3A%20block%3B%0A%20%20z%2Dindex%3A%2011%3B%0A%20%20opacity%3A%201%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%3Aempty%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%3Aempty%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%5Bdata%2Dbackground%2Dinteractive%5D%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%5Bdata%2Dbackground%2Dinteractive%5D%20%7B%0A%20%20pointer%2Devents%3A%20none%3B%20%7D%0A%0A%2Ereveal%2Ecenter%2C%0A%2Ereveal%2Ecenter%20%2Eslides%2C%0A%2Ereveal%2Ecenter%20%2Eslides%20section%20%7B%0A%20%20min%2Dheight%3A%200%20%21important%3B%20%7D%0A%0A%2F%2A%20Don%27t%20allow%20interaction%20with%20invisible%20slides%20%2A%2F%0A%2Ereveal%20%2Eslides%20%3E%20section%2Efuture%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%2Efuture%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%2Epast%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%2Epast%20%7B%0A%20%20pointer%2Devents%3A%20none%3B%20%7D%0A%0A%2Ereveal%2Eoverview%20%2Eslides%20%3E%20section%2C%0A%2Ereveal%2Eoverview%20%2Eslides%20%3E%20section%20%3E%20section%20%7B%0A%20%20pointer%2Devents%3A%20auto%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%2Epast%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%2Efuture%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%2Epast%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%2Efuture%20%7B%0A%20%20opacity%3A%200%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20Mixins%20for%20readability%20of%20transitions%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20SLIDE%20TRANSITION%0A%20%2A%20Aliased%20%27linear%27%20for%20backwards%20compatibility%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%2Eslide%20section%20%7B%0A%20%20%2Dwebkit%2Dbackface%2Dvisibility%3A%20hidden%3B%0A%20%20%20%20%20%20%20%20%20%20backface%2Dvisibility%3A%20hidden%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%5Bdata%2Dtransition%3Dslide%5D%2Epast%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%5Bdata%2Dtransition%7E%3Dslide%2Dout%5D%2Epast%2C%0A%2Ereveal%2Eslide%20%2Eslides%20%3E%20section%3Anot%28%5Bdata%2Dtransition%5D%29%2Epast%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate%28%2D150%25%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate%28%2D150%25%2C%200%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%5Bdata%2Dtransition%3Dslide%5D%2Efuture%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%5Bdata%2Dtransition%7E%3Dslide%2Din%5D%2Efuture%2C%0A%2Ereveal%2Eslide%20%2Eslides%20%3E%20section%3Anot%28%5Bdata%2Dtransition%5D%29%2Efuture%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate%28150%25%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate%28150%25%2C%200%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%5Bdata%2Dtransition%3Dslide%5D%2Epast%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%5Bdata%2Dtransition%7E%3Dslide%2Dout%5D%2Epast%2C%0A%2Ereveal%2Eslide%20%2Eslides%20%3E%20section%20%3E%20section%3Anot%28%5Bdata%2Dtransition%5D%29%2Epast%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate%280%2C%20%2D150%25%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate%280%2C%20%2D150%25%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%5Bdata%2Dtransition%3Dslide%5D%2Efuture%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%5Bdata%2Dtransition%7E%3Dslide%2Din%5D%2Efuture%2C%0A%2Ereveal%2Eslide%20%2Eslides%20%3E%20section%20%3E%20section%3Anot%28%5Bdata%2Dtransition%5D%29%2Efuture%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate%280%2C%20150%25%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate%280%2C%20150%25%29%3B%20%7D%0A%0A%2Ereveal%2Elinear%20section%20%7B%0A%20%20%2Dwebkit%2Dbackface%2Dvisibility%3A%20hidden%3B%0A%20%20%20%20%20%20%20%20%20%20backface%2Dvisibility%3A%20hidden%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%5Bdata%2Dtransition%3Dlinear%5D%2Epast%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%5Bdata%2Dtransition%7E%3Dlinear%2Dout%5D%2Epast%2C%0A%2Ereveal%2Elinear%20%2Eslides%20%3E%20section%3Anot%28%5Bdata%2Dtransition%5D%29%2Epast%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate%28%2D150%25%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate%28%2D150%25%2C%200%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%5Bdata%2Dtransition%3Dlinear%5D%2Efuture%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%5Bdata%2Dtransition%7E%3Dlinear%2Din%5D%2Efuture%2C%0A%2Ereveal%2Elinear%20%2Eslides%20%3E%20section%3Anot%28%5Bdata%2Dtransition%5D%29%2Efuture%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate%28150%25%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate%28150%25%2C%200%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%5Bdata%2Dtransition%3Dlinear%5D%2Epast%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%5Bdata%2Dtransition%7E%3Dlinear%2Dout%5D%2Epast%2C%0A%2Ereveal%2Elinear%20%2Eslides%20%3E%20section%20%3E%20section%3Anot%28%5Bdata%2Dtransition%5D%29%2Epast%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate%280%2C%20%2D150%25%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate%280%2C%20%2D150%25%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%5Bdata%2Dtransition%3Dlinear%5D%2Efuture%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%5Bdata%2Dtransition%7E%3Dlinear%2Din%5D%2Efuture%2C%0A%2Ereveal%2Elinear%20%2Eslides%20%3E%20section%20%3E%20section%3Anot%28%5Bdata%2Dtransition%5D%29%2Efuture%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate%280%2C%20150%25%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate%280%2C%20150%25%29%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20CONVEX%20TRANSITION%0A%20%2A%20Aliased%20%27default%27%20for%20backwards%20compatibility%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%20%2Eslides%20section%5Bdata%2Dtransition%3Ddefault%5D%2Estack%2C%0A%2Ereveal%2Edefault%20%2Eslides%20section%2Estack%20%7B%0A%20%20%2Dwebkit%2Dtransform%2Dstyle%3A%20preserve%2D3d%3B%0A%20%20%20%20%20%20%20%20%20%20transform%2Dstyle%3A%20preserve%2D3d%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%5Bdata%2Dtransition%3Ddefault%5D%2Epast%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%5Bdata%2Dtransition%7E%3Ddefault%2Dout%5D%2Epast%2C%0A%2Ereveal%2Edefault%20%2Eslides%20%3E%20section%3Anot%28%5Bdata%2Dtransition%5D%29%2Epast%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%28%2D100%25%2C%200%2C%200%29%20rotateY%28%2D90deg%29%20translate3d%28%2D100%25%2C%200%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%28%2D100%25%2C%200%2C%200%29%20rotateY%28%2D90deg%29%20translate3d%28%2D100%25%2C%200%2C%200%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%5Bdata%2Dtransition%3Ddefault%5D%2Efuture%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%5Bdata%2Dtransition%7E%3Ddefault%2Din%5D%2Efuture%2C%0A%2Ereveal%2Edefault%20%2Eslides%20%3E%20section%3Anot%28%5Bdata%2Dtransition%5D%29%2Efuture%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%28100%25%2C%200%2C%200%29%20rotateY%2890deg%29%20translate3d%28100%25%2C%200%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%28100%25%2C%200%2C%200%29%20rotateY%2890deg%29%20translate3d%28100%25%2C%200%2C%200%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%5Bdata%2Dtransition%3Ddefault%5D%2Epast%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%5Bdata%2Dtransition%7E%3Ddefault%2Dout%5D%2Epast%2C%0A%2Ereveal%2Edefault%20%2Eslides%20%3E%20section%20%3E%20section%3Anot%28%5Bdata%2Dtransition%5D%29%2Epast%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%280%2C%20%2D300px%2C%200%29%20rotateX%2870deg%29%20translate3d%280%2C%20%2D300px%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%280%2C%20%2D300px%2C%200%29%20rotateX%2870deg%29%20translate3d%280%2C%20%2D300px%2C%200%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%5Bdata%2Dtransition%3Ddefault%5D%2Efuture%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%5Bdata%2Dtransition%7E%3Ddefault%2Din%5D%2Efuture%2C%0A%2Ereveal%2Edefault%20%2Eslides%20%3E%20section%20%3E%20section%3Anot%28%5Bdata%2Dtransition%5D%29%2Efuture%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%280%2C%20300px%2C%200%29%20rotateX%28%2D70deg%29%20translate3d%280%2C%20300px%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%280%2C%20300px%2C%200%29%20rotateX%28%2D70deg%29%20translate3d%280%2C%20300px%2C%200%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20section%5Bdata%2Dtransition%3Dconvex%5D%2Estack%2C%0A%2Ereveal%2Econvex%20%2Eslides%20section%2Estack%20%7B%0A%20%20%2Dwebkit%2Dtransform%2Dstyle%3A%20preserve%2D3d%3B%0A%20%20%20%20%20%20%20%20%20%20transform%2Dstyle%3A%20preserve%2D3d%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%5Bdata%2Dtransition%3Dconvex%5D%2Epast%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%5Bdata%2Dtransition%7E%3Dconvex%2Dout%5D%2Epast%2C%0A%2Ereveal%2Econvex%20%2Eslides%20%3E%20section%3Anot%28%5Bdata%2Dtransition%5D%29%2Epast%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%28%2D100%25%2C%200%2C%200%29%20rotateY%28%2D90deg%29%20translate3d%28%2D100%25%2C%200%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%28%2D100%25%2C%200%2C%200%29%20rotateY%28%2D90deg%29%20translate3d%28%2D100%25%2C%200%2C%200%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%5Bdata%2Dtransition%3Dconvex%5D%2Efuture%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%5Bdata%2Dtransition%7E%3Dconvex%2Din%5D%2Efuture%2C%0A%2Ereveal%2Econvex%20%2Eslides%20%3E%20section%3Anot%28%5Bdata%2Dtransition%5D%29%2Efuture%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%28100%25%2C%200%2C%200%29%20rotateY%2890deg%29%20translate3d%28100%25%2C%200%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%28100%25%2C%200%2C%200%29%20rotateY%2890deg%29%20translate3d%28100%25%2C%200%2C%200%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%5Bdata%2Dtransition%3Dconvex%5D%2Epast%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%5Bdata%2Dtransition%7E%3Dconvex%2Dout%5D%2Epast%2C%0A%2Ereveal%2Econvex%20%2Eslides%20%3E%20section%20%3E%20section%3Anot%28%5Bdata%2Dtransition%5D%29%2Epast%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%280%2C%20%2D300px%2C%200%29%20rotateX%2870deg%29%20translate3d%280%2C%20%2D300px%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%280%2C%20%2D300px%2C%200%29%20rotateX%2870deg%29%20translate3d%280%2C%20%2D300px%2C%200%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%5Bdata%2Dtransition%3Dconvex%5D%2Efuture%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%5Bdata%2Dtransition%7E%3Dconvex%2Din%5D%2Efuture%2C%0A%2Ereveal%2Econvex%20%2Eslides%20%3E%20section%20%3E%20section%3Anot%28%5Bdata%2Dtransition%5D%29%2Efuture%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%280%2C%20300px%2C%200%29%20rotateX%28%2D70deg%29%20translate3d%280%2C%20300px%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%280%2C%20300px%2C%200%29%20rotateX%28%2D70deg%29%20translate3d%280%2C%20300px%2C%200%29%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20CONCAVE%20TRANSITION%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%20%2Eslides%20section%5Bdata%2Dtransition%3Dconcave%5D%2Estack%2C%0A%2Ereveal%2Econcave%20%2Eslides%20section%2Estack%20%7B%0A%20%20%2Dwebkit%2Dtransform%2Dstyle%3A%20preserve%2D3d%3B%0A%20%20%20%20%20%20%20%20%20%20transform%2Dstyle%3A%20preserve%2D3d%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%5Bdata%2Dtransition%3Dconcave%5D%2Epast%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%5Bdata%2Dtransition%7E%3Dconcave%2Dout%5D%2Epast%2C%0A%2Ereveal%2Econcave%20%2Eslides%20%3E%20section%3Anot%28%5Bdata%2Dtransition%5D%29%2Epast%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%28%2D100%25%2C%200%2C%200%29%20rotateY%2890deg%29%20translate3d%28%2D100%25%2C%200%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%28%2D100%25%2C%200%2C%200%29%20rotateY%2890deg%29%20translate3d%28%2D100%25%2C%200%2C%200%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%5Bdata%2Dtransition%3Dconcave%5D%2Efuture%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%5Bdata%2Dtransition%7E%3Dconcave%2Din%5D%2Efuture%2C%0A%2Ereveal%2Econcave%20%2Eslides%20%3E%20section%3Anot%28%5Bdata%2Dtransition%5D%29%2Efuture%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%28100%25%2C%200%2C%200%29%20rotateY%28%2D90deg%29%20translate3d%28100%25%2C%200%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%28100%25%2C%200%2C%200%29%20rotateY%28%2D90deg%29%20translate3d%28100%25%2C%200%2C%200%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%5Bdata%2Dtransition%3Dconcave%5D%2Epast%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%5Bdata%2Dtransition%7E%3Dconcave%2Dout%5D%2Epast%2C%0A%2Ereveal%2Econcave%20%2Eslides%20%3E%20section%20%3E%20section%3Anot%28%5Bdata%2Dtransition%5D%29%2Epast%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%280%2C%20%2D80%25%2C%200%29%20rotateX%28%2D70deg%29%20translate3d%280%2C%20%2D80%25%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%280%2C%20%2D80%25%2C%200%29%20rotateX%28%2D70deg%29%20translate3d%280%2C%20%2D80%25%2C%200%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%5Bdata%2Dtransition%3Dconcave%5D%2Efuture%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%5Bdata%2Dtransition%7E%3Dconcave%2Din%5D%2Efuture%2C%0A%2Ereveal%2Econcave%20%2Eslides%20%3E%20section%20%3E%20section%3Anot%28%5Bdata%2Dtransition%5D%29%2Efuture%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%280%2C%2080%25%2C%200%29%20rotateX%2870deg%29%20translate3d%280%2C%2080%25%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%280%2C%2080%25%2C%200%29%20rotateX%2870deg%29%20translate3d%280%2C%2080%25%2C%200%29%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20ZOOM%20TRANSITION%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%20%2Eslides%20section%5Bdata%2Dtransition%3Dzoom%5D%2C%0A%2Ereveal%2Ezoom%20%2Eslides%20section%3Anot%28%5Bdata%2Dtransition%5D%29%20%7B%0A%20%20transition%2Dtiming%2Dfunction%3A%20ease%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%5Bdata%2Dtransition%3Dzoom%5D%2Epast%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%5Bdata%2Dtransition%7E%3Dzoom%2Dout%5D%2Epast%2C%0A%2Ereveal%2Ezoom%20%2Eslides%20%3E%20section%3Anot%28%5Bdata%2Dtransition%5D%29%2Epast%20%7B%0A%20%20visibility%3A%20hidden%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20scale%2816%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20scale%2816%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%5Bdata%2Dtransition%3Dzoom%5D%2Efuture%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%5Bdata%2Dtransition%7E%3Dzoom%2Din%5D%2Efuture%2C%0A%2Ereveal%2Ezoom%20%2Eslides%20%3E%20section%3Anot%28%5Bdata%2Dtransition%5D%29%2Efuture%20%7B%0A%20%20visibility%3A%20hidden%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20scale%280%2E2%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20scale%280%2E2%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%5Bdata%2Dtransition%3Dzoom%5D%2Epast%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%5Bdata%2Dtransition%7E%3Dzoom%2Dout%5D%2Epast%2C%0A%2Ereveal%2Ezoom%20%2Eslides%20%3E%20section%20%3E%20section%3Anot%28%5Bdata%2Dtransition%5D%29%2Epast%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20scale%2816%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20scale%2816%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%5Bdata%2Dtransition%3Dzoom%5D%2Efuture%2C%0A%2Ereveal%20%2Eslides%20%3E%20section%20%3E%20section%5Bdata%2Dtransition%7E%3Dzoom%2Din%5D%2Efuture%2C%0A%2Ereveal%2Ezoom%20%2Eslides%20%3E%20section%20%3E%20section%3Anot%28%5Bdata%2Dtransition%5D%29%2Efuture%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20scale%280%2E2%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20scale%280%2E2%29%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20CUBE%20TRANSITION%0A%20%2A%0A%20%2A%20WARNING%3A%0A%20%2A%20this%20is%20deprecated%20and%20will%20be%20removed%20in%20a%0A%20%2A%20future%20version%2E%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%2Ecube%20%2Eslides%20%7B%0A%20%20%2Dwebkit%2Dperspective%3A%201300px%3B%0A%20%20%20%20%20%20%20%20%20%20perspective%3A%201300px%3B%20%7D%0A%0A%2Ereveal%2Ecube%20%2Eslides%20section%20%7B%0A%20%20padding%3A%2030px%3B%0A%20%20min%2Dheight%3A%20700px%3B%0A%20%20%2Dwebkit%2Dbackface%2Dvisibility%3A%20hidden%3B%0A%20%20%20%20%20%20%20%20%20%20backface%2Dvisibility%3A%20hidden%3B%0A%20%20box%2Dsizing%3A%20border%2Dbox%3B%0A%20%20%2Dwebkit%2Dtransform%2Dstyle%3A%20preserve%2D3d%3B%0A%20%20%20%20%20%20%20%20%20%20transform%2Dstyle%3A%20preserve%2D3d%3B%20%7D%0A%0A%2Ereveal%2Ecenter%2Ecube%20%2Eslides%20section%20%7B%0A%20%20min%2Dheight%3A%200%3B%20%7D%0A%0A%2Ereveal%2Ecube%20%2Eslides%20section%3Anot%28%2Estack%29%3Abefore%20%7B%0A%20%20content%3A%20%27%27%3B%0A%20%20position%3A%20absolute%3B%0A%20%20display%3A%20block%3B%0A%20%20width%3A%20100%25%3B%0A%20%20height%3A%20100%25%3B%0A%20%20left%3A%200%3B%0A%20%20top%3A%200%3B%0A%20%20background%3A%20rgba%280%2C%200%2C%200%2C%200%2E1%29%3B%0A%20%20border%2Dradius%3A%204px%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20translateZ%28%2D20px%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translateZ%28%2D20px%29%3B%20%7D%0A%0A%2Ereveal%2Ecube%20%2Eslides%20section%3Anot%28%2Estack%29%3Aafter%20%7B%0A%20%20content%3A%20%27%27%3B%0A%20%20position%3A%20absolute%3B%0A%20%20display%3A%20block%3B%0A%20%20width%3A%2090%25%3B%0A%20%20height%3A%2030px%3B%0A%20%20left%3A%205%25%3B%0A%20%20bottom%3A%200%3B%0A%20%20background%3A%20none%3B%0A%20%20z%2Dindex%3A%201%3B%0A%20%20border%2Dradius%3A%204px%3B%0A%20%20box%2Dshadow%3A%200px%2095px%2025px%20rgba%280%2C%200%2C%200%2C%200%2E2%29%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20translateZ%28%2D90px%29%20rotateX%2865deg%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translateZ%28%2D90px%29%20rotateX%2865deg%29%3B%20%7D%0A%0A%2Ereveal%2Ecube%20%2Eslides%20%3E%20section%2Estack%20%7B%0A%20%20padding%3A%200%3B%0A%20%20background%3A%20none%3B%20%7D%0A%0A%2Ereveal%2Ecube%20%2Eslides%20%3E%20section%2Epast%20%7B%0A%20%20%2Dwebkit%2Dtransform%2Dorigin%3A%20100%25%200%25%3B%0A%20%20%20%20%20%20%20%20%20%20transform%2Dorigin%3A%20100%25%200%25%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%28%2D100%25%2C%200%2C%200%29%20rotateY%28%2D90deg%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%28%2D100%25%2C%200%2C%200%29%20rotateY%28%2D90deg%29%3B%20%7D%0A%0A%2Ereveal%2Ecube%20%2Eslides%20%3E%20section%2Efuture%20%7B%0A%20%20%2Dwebkit%2Dtransform%2Dorigin%3A%200%25%200%25%3B%0A%20%20%20%20%20%20%20%20%20%20transform%2Dorigin%3A%200%25%200%25%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%28100%25%2C%200%2C%200%29%20rotateY%2890deg%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%28100%25%2C%200%2C%200%29%20rotateY%2890deg%29%3B%20%7D%0A%0A%2Ereveal%2Ecube%20%2Eslides%20%3E%20section%20%3E%20section%2Epast%20%7B%0A%20%20%2Dwebkit%2Dtransform%2Dorigin%3A%200%25%20100%25%3B%0A%20%20%20%20%20%20%20%20%20%20transform%2Dorigin%3A%200%25%20100%25%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%280%2C%20%2D100%25%2C%200%29%20rotateX%2890deg%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%280%2C%20%2D100%25%2C%200%29%20rotateX%2890deg%29%3B%20%7D%0A%0A%2Ereveal%2Ecube%20%2Eslides%20%3E%20section%20%3E%20section%2Efuture%20%7B%0A%20%20%2Dwebkit%2Dtransform%2Dorigin%3A%200%25%200%25%3B%0A%20%20%20%20%20%20%20%20%20%20transform%2Dorigin%3A%200%25%200%25%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%280%2C%20100%25%2C%200%29%20rotateX%28%2D90deg%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%280%2C%20100%25%2C%200%29%20rotateX%28%2D90deg%29%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20PAGE%20TRANSITION%0A%20%2A%0A%20%2A%20WARNING%3A%0A%20%2A%20this%20is%20deprecated%20and%20will%20be%20removed%20in%20a%0A%20%2A%20future%20version%2E%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%2Epage%20%2Eslides%20%7B%0A%20%20%2Dwebkit%2Dperspective%2Dorigin%3A%200%25%2050%25%3B%0A%20%20%20%20%20%20%20%20%20%20perspective%2Dorigin%3A%200%25%2050%25%3B%0A%20%20%2Dwebkit%2Dperspective%3A%203000px%3B%0A%20%20%20%20%20%20%20%20%20%20perspective%3A%203000px%3B%20%7D%0A%0A%2Ereveal%2Epage%20%2Eslides%20section%20%7B%0A%20%20padding%3A%2030px%3B%0A%20%20min%2Dheight%3A%20700px%3B%0A%20%20box%2Dsizing%3A%20border%2Dbox%3B%0A%20%20%2Dwebkit%2Dtransform%2Dstyle%3A%20preserve%2D3d%3B%0A%20%20%20%20%20%20%20%20%20%20transform%2Dstyle%3A%20preserve%2D3d%3B%20%7D%0A%0A%2Ereveal%2Epage%20%2Eslides%20section%2Epast%20%7B%0A%20%20z%2Dindex%3A%2012%3B%20%7D%0A%0A%2Ereveal%2Epage%20%2Eslides%20section%3Anot%28%2Estack%29%3Abefore%20%7B%0A%20%20content%3A%20%27%27%3B%0A%20%20position%3A%20absolute%3B%0A%20%20display%3A%20block%3B%0A%20%20width%3A%20100%25%3B%0A%20%20height%3A%20100%25%3B%0A%20%20left%3A%200%3B%0A%20%20top%3A%200%3B%0A%20%20background%3A%20rgba%280%2C%200%2C%200%2C%200%2E1%29%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20translateZ%28%2D20px%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translateZ%28%2D20px%29%3B%20%7D%0A%0A%2Ereveal%2Epage%20%2Eslides%20section%3Anot%28%2Estack%29%3Aafter%20%7B%0A%20%20content%3A%20%27%27%3B%0A%20%20position%3A%20absolute%3B%0A%20%20display%3A%20block%3B%0A%20%20width%3A%2090%25%3B%0A%20%20height%3A%2030px%3B%0A%20%20left%3A%205%25%3B%0A%20%20bottom%3A%200%3B%0A%20%20background%3A%20none%3B%0A%20%20z%2Dindex%3A%201%3B%0A%20%20border%2Dradius%3A%204px%3B%0A%20%20box%2Dshadow%3A%200px%2095px%2025px%20rgba%280%2C%200%2C%200%2C%200%2E2%29%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20translateZ%28%2D90px%29%20rotateX%2865deg%29%3B%20%7D%0A%0A%2Ereveal%2Epage%20%2Eslides%20%3E%20section%2Estack%20%7B%0A%20%20padding%3A%200%3B%0A%20%20background%3A%20none%3B%20%7D%0A%0A%2Ereveal%2Epage%20%2Eslides%20%3E%20section%2Epast%20%7B%0A%20%20%2Dwebkit%2Dtransform%2Dorigin%3A%200%25%200%25%3B%0A%20%20%20%20%20%20%20%20%20%20transform%2Dorigin%3A%200%25%200%25%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%28%2D40%25%2C%200%2C%200%29%20rotateY%28%2D80deg%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%28%2D40%25%2C%200%2C%200%29%20rotateY%28%2D80deg%29%3B%20%7D%0A%0A%2Ereveal%2Epage%20%2Eslides%20%3E%20section%2Efuture%20%7B%0A%20%20%2Dwebkit%2Dtransform%2Dorigin%3A%20100%25%200%25%3B%0A%20%20%20%20%20%20%20%20%20%20transform%2Dorigin%3A%20100%25%200%25%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%280%2C%200%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%280%2C%200%2C%200%29%3B%20%7D%0A%0A%2Ereveal%2Epage%20%2Eslides%20%3E%20section%20%3E%20section%2Epast%20%7B%0A%20%20%2Dwebkit%2Dtransform%2Dorigin%3A%200%25%200%25%3B%0A%20%20%20%20%20%20%20%20%20%20transform%2Dorigin%3A%200%25%200%25%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%280%2C%20%2D40%25%2C%200%29%20rotateX%2880deg%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%280%2C%20%2D40%25%2C%200%29%20rotateX%2880deg%29%3B%20%7D%0A%0A%2Ereveal%2Epage%20%2Eslides%20%3E%20section%20%3E%20section%2Efuture%20%7B%0A%20%20%2Dwebkit%2Dtransform%2Dorigin%3A%200%25%20100%25%3B%0A%20%20%20%20%20%20%20%20%20%20transform%2Dorigin%3A%200%25%20100%25%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%280%2C%200%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%280%2C%200%2C%200%29%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20FADE%20TRANSITION%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%20%2Eslides%20section%5Bdata%2Dtransition%3Dfade%5D%2C%0A%2Ereveal%2Efade%20%2Eslides%20section%3Anot%28%5Bdata%2Dtransition%5D%29%2C%0A%2Ereveal%2Efade%20%2Eslides%20%3E%20section%20%3E%20section%3Anot%28%5Bdata%2Dtransition%5D%29%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20none%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20none%3B%0A%20%20transition%3A%20opacity%200%2E5s%3B%20%7D%0A%0A%2Ereveal%2Efade%2Eoverview%20%2Eslides%20section%2C%0A%2Ereveal%2Efade%2Eoverview%20%2Eslides%20%3E%20section%20%3E%20section%20%7B%0A%20%20transition%3A%20none%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20NO%20TRANSITION%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%20%2Eslides%20section%5Bdata%2Dtransition%3Dnone%5D%2C%0A%2Ereveal%2Enone%20%2Eslides%20section%3Anot%28%5Bdata%2Dtransition%5D%29%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20none%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20none%3B%0A%20%20transition%3A%20none%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20PAUSED%20MODE%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%20%2Epause%2Doverlay%20%7B%0A%20%20position%3A%20absolute%3B%0A%20%20top%3A%200%3B%0A%20%20left%3A%200%3B%0A%20%20width%3A%20100%25%3B%0A%20%20height%3A%20100%25%3B%0A%20%20background%3A%20black%3B%0A%20%20visibility%3A%20hidden%3B%0A%20%20opacity%3A%200%3B%0A%20%20z%2Dindex%3A%20100%3B%0A%20%20transition%3A%20all%201s%20ease%3B%20%7D%0A%0A%2Ereveal%20%2Epause%2Doverlay%20%2Eresume%2Dbutton%20%7B%0A%20%20position%3A%20absolute%3B%0A%20%20bottom%3A%2020px%3B%0A%20%20right%3A%2020px%3B%0A%20%20color%3A%20%23ccc%3B%0A%20%20border%2Dradius%3A%202px%3B%0A%20%20padding%3A%206px%2014px%3B%0A%20%20border%3A%202px%20solid%20%23ccc%3B%0A%20%20font%2Dsize%3A%2016px%3B%0A%20%20background%3A%20transparent%3B%0A%20%20cursor%3A%20pointer%3B%20%7D%0A%20%20%2Ereveal%20%2Epause%2Doverlay%20%2Eresume%2Dbutton%3Ahover%20%7B%0A%20%20%20%20color%3A%20%23fff%3B%0A%20%20%20%20border%2Dcolor%3A%20%23fff%3B%20%7D%0A%0A%2Ereveal%2Epaused%20%2Epause%2Doverlay%20%7B%0A%20%20visibility%3A%20visible%3B%0A%20%20opacity%3A%201%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20FALLBACK%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Eno%2Dtransforms%20%7B%0A%20%20overflow%2Dy%3A%20auto%3B%20%7D%0A%0A%2Eno%2Dtransforms%20%2Ereveal%20%7B%0A%20%20overflow%3A%20visible%3B%20%7D%0A%0A%2Eno%2Dtransforms%20%2Ereveal%20%2Eslides%20%7B%0A%20%20position%3A%20relative%3B%0A%20%20width%3A%2080%25%3B%0A%20%20max%2Dwidth%3A%201280px%3B%0A%20%20height%3A%20auto%3B%0A%20%20top%3A%200%3B%0A%20%20margin%3A%200%20auto%3B%0A%20%20text%2Dalign%3A%20center%3B%20%7D%0A%0A%2Eno%2Dtransforms%20%2Ereveal%20%2Econtrols%2C%0A%2Eno%2Dtransforms%20%2Ereveal%20%2Eprogress%20%7B%0A%20%20display%3A%20none%3B%20%7D%0A%0A%2Eno%2Dtransforms%20%2Ereveal%20%2Eslides%20section%20%7B%0A%20%20display%3A%20block%3B%0A%20%20opacity%3A%201%3B%0A%20%20position%3A%20relative%3B%0A%20%20height%3A%20auto%3B%0A%20%20min%2Dheight%3A%200%3B%0A%20%20top%3A%200%3B%0A%20%20left%3A%200%3B%0A%20%20margin%3A%2010vh%200%3B%0A%20%20margin%3A%2070px%200%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20none%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20none%3B%20%7D%0A%0A%2Ereveal%20%2Eno%2Dtransition%2C%0A%2Ereveal%20%2Eno%2Dtransition%20%2A%20%7B%0A%20%20transition%3A%20none%20%21important%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20PER%2DSLIDE%20BACKGROUNDS%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%20%2Ebackgrounds%20%7B%0A%20%20position%3A%20absolute%3B%0A%20%20width%3A%20100%25%3B%0A%20%20height%3A%20100%25%3B%0A%20%20top%3A%200%3B%0A%20%20left%3A%200%3B%0A%20%20%2Dwebkit%2Dperspective%3A%20600px%3B%0A%20%20%20%20%20%20%20%20%20%20perspective%3A%20600px%3B%20%7D%0A%0A%2Ereveal%20%2Eslide%2Dbackground%20%7B%0A%20%20display%3A%20none%3B%0A%20%20position%3A%20absolute%3B%0A%20%20width%3A%20100%25%3B%0A%20%20height%3A%20100%25%3B%0A%20%20opacity%3A%200%3B%0A%20%20visibility%3A%20hidden%3B%0A%20%20overflow%3A%20hidden%3B%0A%20%20background%2Dcolor%3A%20rgba%280%2C%200%2C%200%2C%200%29%3B%0A%20%20transition%3A%20all%20800ms%20cubic%2Dbezier%280%2E26%2C%200%2E86%2C%200%2E44%2C%200%2E985%29%3B%20%7D%0A%0A%2Ereveal%20%2Eslide%2Dbackground%2Dcontent%20%7B%0A%20%20position%3A%20absolute%3B%0A%20%20width%3A%20100%25%3B%0A%20%20height%3A%20100%25%3B%0A%20%20background%2Dposition%3A%2050%25%2050%25%3B%0A%20%20background%2Drepeat%3A%20no%2Drepeat%3B%0A%20%20background%2Dsize%3A%20cover%3B%20%7D%0A%0A%2Ereveal%20%2Eslide%2Dbackground%2Estack%20%7B%0A%20%20display%3A%20block%3B%20%7D%0A%0A%2Ereveal%20%2Eslide%2Dbackground%2Epresent%20%7B%0A%20%20opacity%3A%201%3B%0A%20%20visibility%3A%20visible%3B%0A%20%20z%2Dindex%3A%202%3B%20%7D%0A%0A%2Eprint%2Dpdf%20%2Ereveal%20%2Eslide%2Dbackground%20%7B%0A%20%20opacity%3A%201%20%21important%3B%0A%20%20visibility%3A%20visible%20%21important%3B%20%7D%0A%0A%2F%2A%20Video%20backgrounds%20%2A%2F%0A%2Ereveal%20%2Eslide%2Dbackground%20video%20%7B%0A%20%20position%3A%20absolute%3B%0A%20%20width%3A%20100%25%3B%0A%20%20height%3A%20100%25%3B%0A%20%20max%2Dwidth%3A%20none%3B%0A%20%20max%2Dheight%3A%20none%3B%0A%20%20top%3A%200%3B%0A%20%20left%3A%200%3B%0A%20%20%2Do%2Dobject%2Dfit%3A%20cover%3B%0A%20%20%20%20%20object%2Dfit%3A%20cover%3B%20%7D%0A%0A%2Ereveal%20%2Eslide%2Dbackground%5Bdata%2Dbackground%2Dsize%3D%22contain%22%5D%20video%20%7B%0A%20%20%2Do%2Dobject%2Dfit%3A%20contain%3B%0A%20%20%20%20%20object%2Dfit%3A%20contain%3B%20%7D%0A%0A%2F%2A%20Immediate%20transition%20style%20%2A%2F%0A%2Ereveal%5Bdata%2Dbackground%2Dtransition%3Dnone%5D%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%2C%0A%2Ereveal%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%5Bdata%2Dbackground%2Dtransition%3Dnone%5D%20%7B%0A%20%20transition%3A%20none%3B%20%7D%0A%0A%2F%2A%20Slide%20%2A%2F%0A%2Ereveal%5Bdata%2Dbackground%2Dtransition%3Dslide%5D%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%2C%0A%2Ereveal%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%5Bdata%2Dbackground%2Dtransition%3Dslide%5D%20%7B%0A%20%20opacity%3A%201%3B%0A%20%20%2Dwebkit%2Dbackface%2Dvisibility%3A%20hidden%3B%0A%20%20%20%20%20%20%20%20%20%20backface%2Dvisibility%3A%20hidden%3B%20%7D%0A%0A%2Ereveal%5Bdata%2Dbackground%2Dtransition%3Dslide%5D%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%2Epast%2C%0A%2Ereveal%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%2Epast%5Bdata%2Dbackground%2Dtransition%3Dslide%5D%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate%28%2D100%25%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate%28%2D100%25%2C%200%29%3B%20%7D%0A%0A%2Ereveal%5Bdata%2Dbackground%2Dtransition%3Dslide%5D%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%2Efuture%2C%0A%2Ereveal%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%2Efuture%5Bdata%2Dbackground%2Dtransition%3Dslide%5D%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate%28100%25%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate%28100%25%2C%200%29%3B%20%7D%0A%0A%2Ereveal%5Bdata%2Dbackground%2Dtransition%3Dslide%5D%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%20%3E%20%2Eslide%2Dbackground%2Epast%2C%0A%2Ereveal%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%20%3E%20%2Eslide%2Dbackground%2Epast%5Bdata%2Dbackground%2Dtransition%3Dslide%5D%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate%280%2C%20%2D100%25%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate%280%2C%20%2D100%25%29%3B%20%7D%0A%0A%2Ereveal%5Bdata%2Dbackground%2Dtransition%3Dslide%5D%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%20%3E%20%2Eslide%2Dbackground%2Efuture%2C%0A%2Ereveal%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%20%3E%20%2Eslide%2Dbackground%2Efuture%5Bdata%2Dbackground%2Dtransition%3Dslide%5D%20%7B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate%280%2C%20100%25%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate%280%2C%20100%25%29%3B%20%7D%0A%0A%2F%2A%20Convex%20%2A%2F%0A%2Ereveal%5Bdata%2Dbackground%2Dtransition%3Dconvex%5D%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%2Epast%2C%0A%2Ereveal%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%2Epast%5Bdata%2Dbackground%2Dtransition%3Dconvex%5D%20%7B%0A%20%20opacity%3A%200%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%28%2D100%25%2C%200%2C%200%29%20rotateY%28%2D90deg%29%20translate3d%28%2D100%25%2C%200%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%28%2D100%25%2C%200%2C%200%29%20rotateY%28%2D90deg%29%20translate3d%28%2D100%25%2C%200%2C%200%29%3B%20%7D%0A%0A%2Ereveal%5Bdata%2Dbackground%2Dtransition%3Dconvex%5D%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%2Efuture%2C%0A%2Ereveal%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%2Efuture%5Bdata%2Dbackground%2Dtransition%3Dconvex%5D%20%7B%0A%20%20opacity%3A%200%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%28100%25%2C%200%2C%200%29%20rotateY%2890deg%29%20translate3d%28100%25%2C%200%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%28100%25%2C%200%2C%200%29%20rotateY%2890deg%29%20translate3d%28100%25%2C%200%2C%200%29%3B%20%7D%0A%0A%2Ereveal%5Bdata%2Dbackground%2Dtransition%3Dconvex%5D%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%20%3E%20%2Eslide%2Dbackground%2Epast%2C%0A%2Ereveal%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%20%3E%20%2Eslide%2Dbackground%2Epast%5Bdata%2Dbackground%2Dtransition%3Dconvex%5D%20%7B%0A%20%20opacity%3A%200%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%280%2C%20%2D100%25%2C%200%29%20rotateX%2890deg%29%20translate3d%280%2C%20%2D100%25%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%280%2C%20%2D100%25%2C%200%29%20rotateX%2890deg%29%20translate3d%280%2C%20%2D100%25%2C%200%29%3B%20%7D%0A%0A%2Ereveal%5Bdata%2Dbackground%2Dtransition%3Dconvex%5D%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%20%3E%20%2Eslide%2Dbackground%2Efuture%2C%0A%2Ereveal%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%20%3E%20%2Eslide%2Dbackground%2Efuture%5Bdata%2Dbackground%2Dtransition%3Dconvex%5D%20%7B%0A%20%20opacity%3A%200%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%280%2C%20100%25%2C%200%29%20rotateX%28%2D90deg%29%20translate3d%280%2C%20100%25%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%280%2C%20100%25%2C%200%29%20rotateX%28%2D90deg%29%20translate3d%280%2C%20100%25%2C%200%29%3B%20%7D%0A%0A%2F%2A%20Concave%20%2A%2F%0A%2Ereveal%5Bdata%2Dbackground%2Dtransition%3Dconcave%5D%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%2Epast%2C%0A%2Ereveal%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%2Epast%5Bdata%2Dbackground%2Dtransition%3Dconcave%5D%20%7B%0A%20%20opacity%3A%200%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%28%2D100%25%2C%200%2C%200%29%20rotateY%2890deg%29%20translate3d%28%2D100%25%2C%200%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%28%2D100%25%2C%200%2C%200%29%20rotateY%2890deg%29%20translate3d%28%2D100%25%2C%200%2C%200%29%3B%20%7D%0A%0A%2Ereveal%5Bdata%2Dbackground%2Dtransition%3Dconcave%5D%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%2Efuture%2C%0A%2Ereveal%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%2Efuture%5Bdata%2Dbackground%2Dtransition%3Dconcave%5D%20%7B%0A%20%20opacity%3A%200%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%28100%25%2C%200%2C%200%29%20rotateY%28%2D90deg%29%20translate3d%28100%25%2C%200%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%28100%25%2C%200%2C%200%29%20rotateY%28%2D90deg%29%20translate3d%28100%25%2C%200%2C%200%29%3B%20%7D%0A%0A%2Ereveal%5Bdata%2Dbackground%2Dtransition%3Dconcave%5D%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%20%3E%20%2Eslide%2Dbackground%2Epast%2C%0A%2Ereveal%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%20%3E%20%2Eslide%2Dbackground%2Epast%5Bdata%2Dbackground%2Dtransition%3Dconcave%5D%20%7B%0A%20%20opacity%3A%200%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%280%2C%20%2D100%25%2C%200%29%20rotateX%28%2D90deg%29%20translate3d%280%2C%20%2D100%25%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%280%2C%20%2D100%25%2C%200%29%20rotateX%28%2D90deg%29%20translate3d%280%2C%20%2D100%25%2C%200%29%3B%20%7D%0A%0A%2Ereveal%5Bdata%2Dbackground%2Dtransition%3Dconcave%5D%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%20%3E%20%2Eslide%2Dbackground%2Efuture%2C%0A%2Ereveal%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%20%3E%20%2Eslide%2Dbackground%2Efuture%5Bdata%2Dbackground%2Dtransition%3Dconcave%5D%20%7B%0A%20%20opacity%3A%200%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%280%2C%20100%25%2C%200%29%20rotateX%2890deg%29%20translate3d%280%2C%20100%25%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%280%2C%20100%25%2C%200%29%20rotateX%2890deg%29%20translate3d%280%2C%20100%25%2C%200%29%3B%20%7D%0A%0A%2F%2A%20Zoom%20%2A%2F%0A%2Ereveal%5Bdata%2Dbackground%2Dtransition%3Dzoom%5D%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%2C%0A%2Ereveal%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%5Bdata%2Dbackground%2Dtransition%3Dzoom%5D%20%7B%0A%20%20transition%2Dtiming%2Dfunction%3A%20ease%3B%20%7D%0A%0A%2Ereveal%5Bdata%2Dbackground%2Dtransition%3Dzoom%5D%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%2Epast%2C%0A%2Ereveal%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%2Epast%5Bdata%2Dbackground%2Dtransition%3Dzoom%5D%20%7B%0A%20%20opacity%3A%200%3B%0A%20%20visibility%3A%20hidden%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20scale%2816%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20scale%2816%29%3B%20%7D%0A%0A%2Ereveal%5Bdata%2Dbackground%2Dtransition%3Dzoom%5D%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%2Efuture%2C%0A%2Ereveal%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%2Efuture%5Bdata%2Dbackground%2Dtransition%3Dzoom%5D%20%7B%0A%20%20opacity%3A%200%3B%0A%20%20visibility%3A%20hidden%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20scale%280%2E2%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20scale%280%2E2%29%3B%20%7D%0A%0A%2Ereveal%5Bdata%2Dbackground%2Dtransition%3Dzoom%5D%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%20%3E%20%2Eslide%2Dbackground%2Epast%2C%0A%2Ereveal%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%20%3E%20%2Eslide%2Dbackground%2Epast%5Bdata%2Dbackground%2Dtransition%3Dzoom%5D%20%7B%0A%20%20opacity%3A%200%3B%0A%20%20visibility%3A%20hidden%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20scale%2816%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20scale%2816%29%3B%20%7D%0A%0A%2Ereveal%5Bdata%2Dbackground%2Dtransition%3Dzoom%5D%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%20%3E%20%2Eslide%2Dbackground%2Efuture%2C%0A%2Ereveal%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%20%3E%20%2Eslide%2Dbackground%2Efuture%5Bdata%2Dbackground%2Dtransition%3Dzoom%5D%20%7B%0A%20%20opacity%3A%200%3B%0A%20%20visibility%3A%20hidden%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20scale%280%2E2%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20scale%280%2E2%29%3B%20%7D%0A%0A%2F%2A%20Global%20transition%20speed%20settings%20%2A%2F%0A%2Ereveal%5Bdata%2Dtransition%2Dspeed%3D%22fast%22%5D%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%20%7B%0A%20%20transition%2Dduration%3A%20400ms%3B%20%7D%0A%0A%2Ereveal%5Bdata%2Dtransition%2Dspeed%3D%22slow%22%5D%20%3E%20%2Ebackgrounds%20%2Eslide%2Dbackground%20%7B%0A%20%20transition%2Dduration%3A%201200ms%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20OVERVIEW%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%2Eoverview%20%7B%0A%20%20%2Dwebkit%2Dperspective%2Dorigin%3A%2050%25%2050%25%3B%0A%20%20%20%20%20%20%20%20%20%20perspective%2Dorigin%3A%2050%25%2050%25%3B%0A%20%20%2Dwebkit%2Dperspective%3A%20700px%3B%0A%20%20%20%20%20%20%20%20%20%20perspective%3A%20700px%3B%20%7D%0A%20%20%2Ereveal%2Eoverview%20%2Eslides%20%7B%0A%20%20%20%20%2Dmoz%2Dtransform%2Dstyle%3A%20preserve%2D3d%3B%20%7D%0A%20%20%2Ereveal%2Eoverview%20%2Eslides%20section%20%7B%0A%20%20%20%20height%3A%20100%25%3B%0A%20%20%20%20top%3A%200%20%21important%3B%0A%20%20%20%20opacity%3A%201%20%21important%3B%0A%20%20%20%20overflow%3A%20hidden%3B%0A%20%20%20%20visibility%3A%20visible%20%21important%3B%0A%20%20%20%20cursor%3A%20pointer%3B%0A%20%20%20%20box%2Dsizing%3A%20border%2Dbox%3B%20%7D%0A%20%20%2Ereveal%2Eoverview%20%2Eslides%20section%3Ahover%2C%0A%20%20%2Ereveal%2Eoverview%20%2Eslides%20section%2Epresent%20%7B%0A%20%20%20%20outline%3A%2010px%20solid%20rgba%28150%2C%20150%2C%20150%2C%200%2E4%29%3B%0A%20%20%20%20outline%2Doffset%3A%2010px%3B%20%7D%0A%20%20%2Ereveal%2Eoverview%20%2Eslides%20section%20%2Efragment%20%7B%0A%20%20%20%20opacity%3A%201%3B%0A%20%20%20%20transition%3A%20none%3B%20%7D%0A%20%20%2Ereveal%2Eoverview%20%2Eslides%20section%3Aafter%2C%0A%20%20%2Ereveal%2Eoverview%20%2Eslides%20section%3Abefore%20%7B%0A%20%20%20%20display%3A%20none%20%21important%3B%20%7D%0A%20%20%2Ereveal%2Eoverview%20%2Eslides%20%3E%20section%2Estack%20%7B%0A%20%20%20%20padding%3A%200%3B%0A%20%20%20%20top%3A%200%20%21important%3B%0A%20%20%20%20background%3A%20none%3B%0A%20%20%20%20outline%3A%20none%3B%0A%20%20%20%20overflow%3A%20visible%3B%20%7D%0A%20%20%2Ereveal%2Eoverview%20%2Ebackgrounds%20%7B%0A%20%20%20%20%2Dwebkit%2Dperspective%3A%20inherit%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20perspective%3A%20inherit%3B%0A%20%20%20%20%2Dmoz%2Dtransform%2Dstyle%3A%20preserve%2D3d%3B%20%7D%0A%20%20%2Ereveal%2Eoverview%20%2Ebackgrounds%20%2Eslide%2Dbackground%20%7B%0A%20%20%20%20opacity%3A%201%3B%0A%20%20%20%20visibility%3A%20visible%3B%0A%20%20%20%20outline%3A%2010px%20solid%20rgba%28150%2C%20150%2C%20150%2C%200%2E1%29%3B%0A%20%20%20%20outline%2Doffset%3A%2010px%3B%20%7D%0A%20%20%2Ereveal%2Eoverview%20%2Ebackgrounds%20%2Eslide%2Dbackground%2Estack%20%7B%0A%20%20%20%20overflow%3A%20visible%3B%20%7D%0A%0A%2Ereveal%2Eoverview%20%2Eslides%20section%2C%0A%2Ereveal%2Eoverview%2Ddeactivating%20%2Eslides%20section%20%7B%0A%20%20transition%3A%20none%3B%20%7D%0A%0A%2Ereveal%2Eoverview%20%2Ebackgrounds%20%2Eslide%2Dbackground%2C%0A%2Ereveal%2Eoverview%2Ddeactivating%20%2Ebackgrounds%20%2Eslide%2Dbackground%20%7B%0A%20%20transition%3A%20none%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20RTL%20SUPPORT%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%2Ertl%20%2Eslides%2C%0A%2Ereveal%2Ertl%20%2Eslides%20h1%2C%0A%2Ereveal%2Ertl%20%2Eslides%20h2%2C%0A%2Ereveal%2Ertl%20%2Eslides%20h3%2C%0A%2Ereveal%2Ertl%20%2Eslides%20h4%2C%0A%2Ereveal%2Ertl%20%2Eslides%20h5%2C%0A%2Ereveal%2Ertl%20%2Eslides%20h6%20%7B%0A%20%20direction%3A%20rtl%3B%0A%20%20font%2Dfamily%3A%20sans%2Dserif%3B%20%7D%0A%0A%2Ereveal%2Ertl%20pre%2C%0A%2Ereveal%2Ertl%20code%20%7B%0A%20%20direction%3A%20ltr%3B%20%7D%0A%0A%2Ereveal%2Ertl%20ol%2C%0A%2Ereveal%2Ertl%20ul%20%7B%0A%20%20text%2Dalign%3A%20right%3B%20%7D%0A%0A%2Ereveal%2Ertl%20%2Eprogress%20span%20%7B%0A%20%20float%3A%20right%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20PARALLAX%20BACKGROUND%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%2Ehas%2Dparallax%2Dbackground%20%2Ebackgrounds%20%7B%0A%20%20transition%3A%20all%200%2E8s%20ease%3B%20%7D%0A%0A%2F%2A%20Global%20transition%20speed%20settings%20%2A%2F%0A%2Ereveal%2Ehas%2Dparallax%2Dbackground%5Bdata%2Dtransition%2Dspeed%3D%22fast%22%5D%20%2Ebackgrounds%20%7B%0A%20%20transition%2Dduration%3A%20400ms%3B%20%7D%0A%0A%2Ereveal%2Ehas%2Dparallax%2Dbackground%5Bdata%2Dtransition%2Dspeed%3D%22slow%22%5D%20%2Ebackgrounds%20%7B%0A%20%20transition%2Dduration%3A%201200ms%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20OVERLAY%20FOR%20LINK%20PREVIEWS%20AND%20HELP%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%20%3E%20%2Eoverlay%20%7B%0A%20%20position%3A%20absolute%3B%0A%20%20top%3A%200%3B%0A%20%20left%3A%200%3B%0A%20%20width%3A%20100%25%3B%0A%20%20height%3A%20100%25%3B%0A%20%20z%2Dindex%3A%201000%3B%0A%20%20background%3A%20rgba%280%2C%200%2C%200%2C%200%2E9%29%3B%0A%20%20opacity%3A%200%3B%0A%20%20visibility%3A%20hidden%3B%0A%20%20transition%3A%20all%200%2E3s%20ease%3B%20%7D%0A%0A%2Ereveal%20%3E%20%2Eoverlay%2Evisible%20%7B%0A%20%20opacity%3A%201%3B%0A%20%20visibility%3A%20visible%3B%20%7D%0A%0A%2Ereveal%20%3E%20%2Eoverlay%20%2Espinner%20%7B%0A%20%20position%3A%20absolute%3B%0A%20%20display%3A%20block%3B%0A%20%20top%3A%2050%25%3B%0A%20%20left%3A%2050%25%3B%0A%20%20width%3A%2032px%3B%0A%20%20height%3A%2032px%3B%0A%20%20margin%3A%20%2D16px%200%200%20%2D16px%3B%0A%20%20z%2Dindex%3A%2010%3B%0A%20%20background%2Dimage%3A%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODlhIAAgAPMAAJmZmf%252F%252F%252F6%252Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%252FLy8vz8%252FAAAAAAAAAAAACH%252FC05FVFNDQVBFMi4wAwEAAAAh%252FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%252BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%252FV%252FnmOM82XiHRLYKhKP1oZmADdEAAAh%252BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%252FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%252BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%252BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%252BB6QDtuetcaBPnW6%252BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%252BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%252B%252BG%252Bw48edZPK%252BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%252BG%252BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%252BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%252BaV%252BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%252FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%252BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%252BE71SRQeyqUToLA7VxF0JDyIQh%252FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%252FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%252FjiuL04RGEBgwWhShRgQExHBAAh%252BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%252BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%252BE71SRQeyqUToLA7VxF0JDyIQh%252FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%252BE71SRQeyqUToLA7VxF0JDyIQh%252FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%252BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%252BMFCN6HAAIKgNggY0KtEBAAh%252BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%252BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%252BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%252BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%252Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%252BKr0SJ8MFihpNbx%252B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%252BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%253D%253D%29%3B%0A%20%20visibility%3A%20visible%3B%0A%20%20opacity%3A%200%2E6%3B%0A%20%20transition%3A%20all%200%2E3s%20ease%3B%20%7D%0A%0A%2Ereveal%20%3E%20%2Eoverlay%20header%20%7B%0A%20%20position%3A%20absolute%3B%0A%20%20left%3A%200%3B%0A%20%20top%3A%200%3B%0A%20%20width%3A%20100%25%3B%0A%20%20height%3A%2040px%3B%0A%20%20z%2Dindex%3A%202%3B%0A%20%20border%2Dbottom%3A%201px%20solid%20%23222%3B%20%7D%0A%0A%2Ereveal%20%3E%20%2Eoverlay%20header%20a%20%7B%0A%20%20display%3A%20inline%2Dblock%3B%0A%20%20width%3A%2040px%3B%0A%20%20height%3A%2040px%3B%0A%20%20line%2Dheight%3A%2036px%3B%0A%20%20padding%3A%200%2010px%3B%0A%20%20float%3A%20right%3B%0A%20%20opacity%3A%200%2E6%3B%0A%20%20box%2Dsizing%3A%20border%2Dbox%3B%20%7D%0A%0A%2Ereveal%20%3E%20%2Eoverlay%20header%20a%3Ahover%20%7B%0A%20%20opacity%3A%201%3B%20%7D%0A%0A%2Ereveal%20%3E%20%2Eoverlay%20header%20a%20%2Eicon%20%7B%0A%20%20display%3A%20inline%2Dblock%3B%0A%20%20width%3A%2020px%3B%0A%20%20height%3A%2020px%3B%0A%20%20background%2Dposition%3A%2050%25%2050%25%3B%0A%20%20background%2Dsize%3A%20100%25%3B%0A%20%20background%2Drepeat%3A%20no%2Drepeat%3B%20%7D%0A%0A%2Ereveal%20%3E%20%2Eoverlay%20header%20a%2Eclose%20%2Eicon%20%7B%0A%20%20background%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ%2F5wpM07QXuXc5X0opX2tEJcadjHuV80li%2FFgxTIEK%2F5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX%2BSfDjgx1wACQeJG1aChP9K%2FIMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA%2FSYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN%2B49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV%2BJCbntmvok7iTX4%2FUp9mgyTc%2FFJYDTcndgH%2FAA5A%2FCHsyEkVAAAAAElFTkSuQmCC%29%3B%20%7D%0A%0A%2Ereveal%20%3E%20%2Eoverlay%20header%20a%2Eexternal%20%2Eicon%20%7B%0A%20%20background%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR%2B2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9%2BengMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR%2BAAqod%2FB97TRpQAAAABJRU5ErkJggg%3D%3D%29%3B%20%7D%0A%0A%2Ereveal%20%3E%20%2Eoverlay%20%2Eviewport%20%7B%0A%20%20position%3A%20absolute%3B%0A%20%20display%3A%20%2Dwebkit%2Dbox%3B%0A%20%20display%3A%20%2Dms%2Dflexbox%3B%0A%20%20display%3A%20flex%3B%0A%20%20top%3A%2040px%3B%0A%20%20right%3A%200%3B%0A%20%20bottom%3A%200%3B%0A%20%20left%3A%200%3B%20%7D%0A%0A%2Ereveal%20%3E%20%2Eoverlay%2Eoverlay%2Dpreview%20%2Eviewport%20iframe%20%7B%0A%20%20width%3A%20100%25%3B%0A%20%20height%3A%20100%25%3B%0A%20%20max%2Dwidth%3A%20100%25%3B%0A%20%20max%2Dheight%3A%20100%25%3B%0A%20%20border%3A%200%3B%0A%20%20opacity%3A%200%3B%0A%20%20visibility%3A%20hidden%3B%0A%20%20transition%3A%20all%200%2E3s%20ease%3B%20%7D%0A%0A%2Ereveal%20%3E%20%2Eoverlay%2Eoverlay%2Dpreview%2Eloaded%20%2Eviewport%20iframe%20%7B%0A%20%20opacity%3A%201%3B%0A%20%20visibility%3A%20visible%3B%20%7D%0A%0A%2Ereveal%20%3E%20%2Eoverlay%2Eoverlay%2Dpreview%2Eloaded%20%2Eviewport%2Dinner%20%7B%0A%20%20position%3A%20absolute%3B%0A%20%20z%2Dindex%3A%20%2D1%3B%0A%20%20left%3A%200%3B%0A%20%20top%3A%2045%25%3B%0A%20%20width%3A%20100%25%3B%0A%20%20text%2Dalign%3A%20center%3B%0A%20%20letter%2Dspacing%3A%20normal%3B%20%7D%0A%0A%2Ereveal%20%3E%20%2Eoverlay%2Eoverlay%2Dpreview%20%2Ex%2Dframe%2Derror%20%7B%0A%20%20opacity%3A%200%3B%0A%20%20transition%3A%20opacity%200%2E3s%20ease%200%2E3s%3B%20%7D%0A%0A%2Ereveal%20%3E%20%2Eoverlay%2Eoverlay%2Dpreview%2Eloaded%20%2Ex%2Dframe%2Derror%20%7B%0A%20%20opacity%3A%201%3B%20%7D%0A%0A%2Ereveal%20%3E%20%2Eoverlay%2Eoverlay%2Dpreview%2Eloaded%20%2Espinner%20%7B%0A%20%20opacity%3A%200%3B%0A%20%20visibility%3A%20hidden%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20scale%280%2E2%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20scale%280%2E2%29%3B%20%7D%0A%0A%2Ereveal%20%3E%20%2Eoverlay%2Eoverlay%2Dhelp%20%2Eviewport%20%7B%0A%20%20overflow%3A%20auto%3B%0A%20%20color%3A%20%23fff%3B%20%7D%0A%0A%2Ereveal%20%3E%20%2Eoverlay%2Eoverlay%2Dhelp%20%2Eviewport%20%2Eviewport%2Dinner%20%7B%0A%20%20width%3A%20600px%3B%0A%20%20margin%3A%20auto%3B%0A%20%20padding%3A%2020px%2020px%2080px%2020px%3B%0A%20%20text%2Dalign%3A%20center%3B%0A%20%20letter%2Dspacing%3A%20normal%3B%20%7D%0A%0A%2Ereveal%20%3E%20%2Eoverlay%2Eoverlay%2Dhelp%20%2Eviewport%20%2Eviewport%2Dinner%20%2Etitle%20%7B%0A%20%20font%2Dsize%3A%2020px%3B%20%7D%0A%0A%2Ereveal%20%3E%20%2Eoverlay%2Eoverlay%2Dhelp%20%2Eviewport%20%2Eviewport%2Dinner%20table%20%7B%0A%20%20border%3A%201px%20solid%20%23fff%3B%0A%20%20border%2Dcollapse%3A%20collapse%3B%0A%20%20font%2Dsize%3A%2016px%3B%20%7D%0A%0A%2Ereveal%20%3E%20%2Eoverlay%2Eoverlay%2Dhelp%20%2Eviewport%20%2Eviewport%2Dinner%20table%20th%2C%0A%2Ereveal%20%3E%20%2Eoverlay%2Eoverlay%2Dhelp%20%2Eviewport%20%2Eviewport%2Dinner%20table%20td%20%7B%0A%20%20width%3A%20200px%3B%0A%20%20padding%3A%2014px%3B%0A%20%20border%3A%201px%20solid%20%23fff%3B%0A%20%20vertical%2Dalign%3A%20middle%3B%20%7D%0A%0A%2Ereveal%20%3E%20%2Eoverlay%2Eoverlay%2Dhelp%20%2Eviewport%20%2Eviewport%2Dinner%20table%20th%20%7B%0A%20%20padding%2Dtop%3A%2020px%3B%0A%20%20padding%2Dbottom%3A%2020px%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20PLAYBACK%20COMPONENT%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%20%2Eplayback%20%7B%0A%20%20position%3A%20absolute%3B%0A%20%20left%3A%2015px%3B%0A%20%20bottom%3A%2020px%3B%0A%20%20z%2Dindex%3A%2030%3B%0A%20%20cursor%3A%20pointer%3B%0A%20%20transition%3A%20all%20400ms%20ease%3B%0A%20%20%2Dwebkit%2Dtap%2Dhighlight%2Dcolor%3A%20rgba%280%2C%200%2C%200%2C%200%29%3B%20%7D%0A%0A%2Ereveal%2Eoverview%20%2Eplayback%20%7B%0A%20%20opacity%3A%200%3B%0A%20%20visibility%3A%20hidden%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20CODE%20HIGHLGIHTING%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%20%2Ehljs%20table%20%7B%0A%20%20margin%3A%20initial%3B%20%7D%0A%0A%2Ereveal%20%2Ehljs%2Dln%2Dcode%2C%0A%2Ereveal%20%2Ehljs%2Dln%2Dnumbers%20%7B%0A%20%20padding%3A%200%3B%0A%20%20border%3A%200%3B%20%7D%0A%0A%2Ereveal%20%2Ehljs%2Dln%2Dnumbers%20%7B%0A%20%20opacity%3A%200%2E6%3B%0A%20%20padding%2Dright%3A%200%2E75em%3B%0A%20%20text%2Dalign%3A%20right%3B%0A%20%20vertical%2Dalign%3A%20top%3B%20%7D%0A%0A%2Ereveal%20%2Ehljs%2Ehas%2Dhighlights%20tr%3Anot%28%2Ehighlight%2Dline%29%20%7B%0A%20%20opacity%3A%200%2E4%3B%20%7D%0A%0A%2Ereveal%20%2Ehljs%3Anot%28%3Afirst%2Dchild%29%2Efragment%20%7B%0A%20%20position%3A%20absolute%3B%0A%20%20top%3A%200%3B%0A%20%20left%3A%200%3B%0A%20%20width%3A%20100%25%3B%0A%20%20box%2Dsizing%3A%20border%2Dbox%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20ROLLING%20LINKS%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%20%2Eroll%20%7B%0A%20%20display%3A%20inline%2Dblock%3B%0A%20%20line%2Dheight%3A%201%2E2%3B%0A%20%20overflow%3A%20hidden%3B%0A%20%20vertical%2Dalign%3A%20top%3B%0A%20%20%2Dwebkit%2Dperspective%3A%20400px%3B%0A%20%20%20%20%20%20%20%20%20%20perspective%3A%20400px%3B%0A%20%20%2Dwebkit%2Dperspective%2Dorigin%3A%2050%25%2050%25%3B%0A%20%20%20%20%20%20%20%20%20%20perspective%2Dorigin%3A%2050%25%2050%25%3B%20%7D%0A%0A%2Ereveal%20%2Eroll%3Ahover%20%7B%0A%20%20background%3A%20none%3B%0A%20%20text%2Dshadow%3A%20none%3B%20%7D%0A%0A%2Ereveal%20%2Eroll%20span%20%7B%0A%20%20display%3A%20block%3B%0A%20%20position%3A%20relative%3B%0A%20%20padding%3A%200%202px%3B%0A%20%20pointer%2Devents%3A%20none%3B%0A%20%20transition%3A%20all%20400ms%20ease%3B%0A%20%20%2Dwebkit%2Dtransform%2Dorigin%3A%2050%25%200%25%3B%0A%20%20%20%20%20%20%20%20%20%20transform%2Dorigin%3A%2050%25%200%25%3B%0A%20%20%2Dwebkit%2Dtransform%2Dstyle%3A%20preserve%2D3d%3B%0A%20%20%20%20%20%20%20%20%20%20transform%2Dstyle%3A%20preserve%2D3d%3B%0A%20%20%2Dwebkit%2Dbackface%2Dvisibility%3A%20hidden%3B%0A%20%20%20%20%20%20%20%20%20%20backface%2Dvisibility%3A%20hidden%3B%20%7D%0A%0A%2Ereveal%20%2Eroll%3Ahover%20span%20%7B%0A%20%20background%3A%20rgba%280%2C%200%2C%200%2C%200%2E5%29%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%280px%2C%200px%2C%20%2D45px%29%20rotateX%2890deg%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%280px%2C%200px%2C%20%2D45px%29%20rotateX%2890deg%29%3B%20%7D%0A%0A%2Ereveal%20%2Eroll%20span%3Aafter%20%7B%0A%20%20content%3A%20attr%28data%2Dtitle%29%3B%0A%20%20display%3A%20block%3B%0A%20%20position%3A%20absolute%3B%0A%20%20left%3A%200%3B%0A%20%20top%3A%200%3B%0A%20%20padding%3A%200%202px%3B%0A%20%20%2Dwebkit%2Dbackface%2Dvisibility%3A%20hidden%3B%0A%20%20%20%20%20%20%20%20%20%20backface%2Dvisibility%3A%20hidden%3B%0A%20%20%2Dwebkit%2Dtransform%2Dorigin%3A%2050%25%200%25%3B%0A%20%20%20%20%20%20%20%20%20%20transform%2Dorigin%3A%2050%25%200%25%3B%0A%20%20%2Dwebkit%2Dtransform%3A%20translate3d%280px%2C%20110%25%2C%200px%29%20rotateX%28%2D90deg%29%3B%0A%20%20%20%20%20%20%20%20%20%20transform%3A%20translate3d%280px%2C%20110%25%2C%200px%29%20rotateX%28%2D90deg%29%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20SPEAKER%20NOTES%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%20aside%2Enotes%20%7B%0A%20%20display%3A%20none%3B%20%7D%0A%0A%2Ereveal%20%2Espeaker%2Dnotes%20%7B%0A%20%20display%3A%20none%3B%0A%20%20position%3A%20absolute%3B%0A%20%20width%3A%2033%2E3333333333%25%3B%0A%20%20height%3A%20100%25%3B%0A%20%20top%3A%200%3B%0A%20%20left%3A%20100%25%3B%0A%20%20padding%3A%2014px%2018px%2014px%2018px%3B%0A%20%20z%2Dindex%3A%201%3B%0A%20%20font%2Dsize%3A%2018px%3B%0A%20%20line%2Dheight%3A%201%2E4%3B%0A%20%20border%3A%201px%20solid%20rgba%280%2C%200%2C%200%2C%200%2E05%29%3B%0A%20%20color%3A%20%23222%3B%0A%20%20background%2Dcolor%3A%20%23f5f5f5%3B%0A%20%20overflow%3A%20auto%3B%0A%20%20box%2Dsizing%3A%20border%2Dbox%3B%0A%20%20text%2Dalign%3A%20left%3B%0A%20%20font%2Dfamily%3A%20Helvetica%2C%20sans%2Dserif%3B%0A%20%20%2Dwebkit%2Doverflow%2Dscrolling%3A%20touch%3B%20%7D%0A%20%20%2Ereveal%20%2Espeaker%2Dnotes%20%2Enotes%2Dplaceholder%20%7B%0A%20%20%20%20color%3A%20%23ccc%3B%0A%20%20%20%20font%2Dstyle%3A%20italic%3B%20%7D%0A%20%20%2Ereveal%20%2Espeaker%2Dnotes%3Afocus%20%7B%0A%20%20%20%20outline%3A%20none%3B%20%7D%0A%20%20%2Ereveal%20%2Espeaker%2Dnotes%3Abefore%20%7B%0A%20%20%20%20content%3A%20%27Speaker%20notes%27%3B%0A%20%20%20%20display%3A%20block%3B%0A%20%20%20%20margin%2Dbottom%3A%2010px%3B%0A%20%20%20%20opacity%3A%200%2E5%3B%20%7D%0A%0A%2Ereveal%2Eshow%2Dnotes%20%7B%0A%20%20max%2Dwidth%3A%2075%25%3B%0A%20%20overflow%3A%20visible%3B%20%7D%0A%0A%2Ereveal%2Eshow%2Dnotes%20%2Espeaker%2Dnotes%20%7B%0A%20%20display%3A%20block%3B%20%7D%0A%0A%40media%20screen%20and%20%28min%2Dwidth%3A%201600px%29%20%7B%0A%20%20%2Ereveal%20%2Espeaker%2Dnotes%20%7B%0A%20%20%20%20font%2Dsize%3A%2020px%3B%20%7D%20%7D%0A%0A%40media%20screen%20and%20%28max%2Dwidth%3A%201024px%29%20%7B%0A%20%20%2Ereveal%2Eshow%2Dnotes%20%7B%0A%20%20%20%20border%2Dleft%3A%200%3B%0A%20%20%20%20max%2Dwidth%3A%20none%3B%0A%20%20%20%20max%2Dheight%3A%2070%25%3B%0A%20%20%20%20max%2Dheight%3A%2070vh%3B%0A%20%20%20%20overflow%3A%20visible%3B%20%7D%0A%20%20%2Ereveal%2Eshow%2Dnotes%20%2Espeaker%2Dnotes%20%7B%0A%20%20%20%20top%3A%20100%25%3B%0A%20%20%20%20left%3A%200%3B%0A%20%20%20%20width%3A%20100%25%3B%0A%20%20%20%20height%3A%2042%2E8571428571%25%3B%0A%20%20%20%20height%3A%2030vh%3B%0A%20%20%20%20border%3A%200%3B%20%7D%20%7D%0A%0A%40media%20screen%20and%20%28max%2Dwidth%3A%20600px%29%20%7B%0A%20%20%2Ereveal%2Eshow%2Dnotes%20%7B%0A%20%20%20%20max%2Dheight%3A%2060%25%3B%0A%20%20%20%20max%2Dheight%3A%2060vh%3B%20%7D%0A%20%20%2Ereveal%2Eshow%2Dnotes%20%2Espeaker%2Dnotes%20%7B%0A%20%20%20%20top%3A%20100%25%3B%0A%20%20%20%20height%3A%2066%2E6666666667%25%3B%0A%20%20%20%20height%3A%2040vh%3B%20%7D%0A%20%20%2Ereveal%20%2Espeaker%2Dnotes%20%7B%0A%20%20%20%20font%2Dsize%3A%2014px%3B%20%7D%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20ZOOM%20PLUGIN%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ezoomed%20%2Ereveal%20%2A%2C%0A%2Ezoomed%20%2Ereveal%20%2A%3Abefore%2C%0A%2Ezoomed%20%2Ereveal%20%2A%3Aafter%20%7B%0A%20%20%2Dwebkit%2Dbackface%2Dvisibility%3A%20visible%20%21important%3B%0A%20%20%20%20%20%20%20%20%20%20backface%2Dvisibility%3A%20visible%20%21important%3B%20%7D%0A%0A%2Ezoomed%20%2Ereveal%20%2Eprogress%2C%0A%2Ezoomed%20%2Ereveal%20%2Econtrols%20%7B%0A%20%20opacity%3A%200%3B%20%7D%0A%0A%2Ezoomed%20%2Ereveal%20%2Eroll%20span%20%7B%0A%20%20background%3A%20none%3B%20%7D%0A%0A%2Ezoomed%20%2Ereveal%20%2Eroll%20span%3Aafter%20%7B%0A%20%20visibility%3A%20hidden%3B%20%7D%0A" rel="stylesheet">
<style type="text/css">code{white-space: pre;}</style>
<style type="text/css">
div.sourceCode { overflow-x: auto; }
table.sourceCode, tr.sourceCode, td.lineNumbers, td.sourceCode {
margin: 0; padding: 0; vertical-align: baseline; border: none; }
table.sourceCode { width: 100%; line-height: 100%; }
td.lineNumbers { text-align: right; padding-right: 4px; padding-left: 4px; color: #aaaaaa; border-right: 1px solid #aaaaaa; }
td.sourceCode { padding-left: 5px; }
code > span.kw { color: #007020; font-weight: bold; } /* Keyword */
code > span.dt { color: #902000; } /* DataType */
code > span.dv { color: #40a070; } /* DecVal */
code > span.bn { color: #40a070; } /* BaseN */
code > span.fl { color: #40a070; } /* Float */
code > span.ch { color: #4070a0; } /* Char */
code > span.st { color: #4070a0; } /* String */
code > span.co { color: #60a0b0; font-style: italic; } /* Comment */
code > span.ot { color: #007020; } /* Other */
code > span.al { color: #ff0000; font-weight: bold; } /* Alert */
code > span.fu { color: #06287e; } /* Function */
code > span.er { color: #ff0000; font-weight: bold; } /* Error */
code > span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
code > span.cn { color: #880000; } /* Constant */
code > span.sc { color: #4070a0; } /* SpecialChar */
code > span.vs { color: #4070a0; } /* VerbatimString */
code > span.ss { color: #bb6688; } /* SpecialString */
code > span.im { } /* Import */
code > span.va { color: #19177c; } /* Variable */
code > span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
code > span.op { color: #666666; } /* Operator */
code > span.bu { } /* BuiltIn */
code > span.ex { } /* Extension */
code > span.pp { color: #bc7a00; } /* Preprocessor */
code > span.at { color: #7d9029; } /* Attribute */
code > span.do { color: #ba2121; font-style: italic; } /* Documentation */
code > span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
code > span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
</style>
<link href="data:text/css; charset=utf-8,%2F%2A%2A%0A%20%2A%20White%20theme%20for%20reveal%2Ejs%2E%20This%20is%20the%20opposite%20of%20the%20%27black%27%20theme%2E%0A%20%2A%0A%20%2A%20By%20Hakim%20El%20Hattab%2C%20http%3A%2F%2Fhakim%2Ese%0A%20%2A%2F%0A%40import%20url%28%2E%2E%2F%2E%2E%2Flib%2Ffont%2Fsource%2Dsans%2Dpro%2Fsource%2Dsans%2Dpro%2Ecss%29%3B%0Asection%2Ehas%2Ddark%2Dbackground%2C%20section%2Ehas%2Ddark%2Dbackground%20h1%2C%20section%2Ehas%2Ddark%2Dbackground%20h2%2C%20section%2Ehas%2Ddark%2Dbackground%20h3%2C%20section%2Ehas%2Ddark%2Dbackground%20h4%2C%20section%2Ehas%2Ddark%2Dbackground%20h5%2C%20section%2Ehas%2Ddark%2Dbackground%20h6%20%7B%0A%20%20color%3A%20%23fff%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20GLOBAL%20STYLES%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0Abody%20%7B%0A%20%20background%3A%20%23fff%3B%0A%20%20background%2Dcolor%3A%20%23fff%3B%20%7D%0A%0A%2Ereveal%20%7B%0A%20%20font%2Dfamily%3A%20%22Source%20Sans%20Pro%22%2C%20Helvetica%2C%20sans%2Dserif%3B%0A%20%20font%2Dsize%3A%2042px%3B%0A%20%20font%2Dweight%3A%20normal%3B%0A%20%20color%3A%20%23222%3B%20%7D%0A%0A%3A%3Aselection%20%7B%0A%20%20color%3A%20%23fff%3B%0A%20%20background%3A%20%2398bdef%3B%0A%20%20text%2Dshadow%3A%20none%3B%20%7D%0A%0A%3A%3A%2Dmoz%2Dselection%20%7B%0A%20%20color%3A%20%23fff%3B%0A%20%20background%3A%20%2398bdef%3B%0A%20%20text%2Dshadow%3A%20none%3B%20%7D%0A%0A%2Ereveal%20%2Eslides%20section%2C%0A%2Ereveal%20%2Eslides%20section%20%3E%20section%20%7B%0A%20%20line%2Dheight%3A%201%2E3%3B%0A%20%20font%2Dweight%3A%20inherit%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20HEADERS%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%20h1%2C%0A%2Ereveal%20h2%2C%0A%2Ereveal%20h3%2C%0A%2Ereveal%20h4%2C%0A%2Ereveal%20h5%2C%0A%2Ereveal%20h6%20%7B%0A%20%20margin%3A%200%200%2020px%200%3B%0A%20%20color%3A%20%23222%3B%0A%20%20font%2Dfamily%3A%20%22Source%20Sans%20Pro%22%2C%20Helvetica%2C%20sans%2Dserif%3B%0A%20%20font%2Dweight%3A%20600%3B%0A%20%20line%2Dheight%3A%201%2E2%3B%0A%20%20letter%2Dspacing%3A%20normal%3B%0A%20%20text%2Dtransform%3A%20uppercase%3B%0A%20%20text%2Dshadow%3A%20none%3B%0A%20%20word%2Dwrap%3A%20break%2Dword%3B%20%7D%0A%0A%2Ereveal%20h1%20%7B%0A%20%20font%2Dsize%3A%202%2E5em%3B%20%7D%0A%0A%2Ereveal%20h2%20%7B%0A%20%20font%2Dsize%3A%201%2E6em%3B%20%7D%0A%0A%2Ereveal%20h3%20%7B%0A%20%20font%2Dsize%3A%201%2E3em%3B%20%7D%0A%0A%2Ereveal%20h4%20%7B%0A%20%20font%2Dsize%3A%201em%3B%20%7D%0A%0A%2Ereveal%20h1%20%7B%0A%20%20text%2Dshadow%3A%20none%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20OTHER%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%20p%20%7B%0A%20%20margin%3A%2020px%200%3B%0A%20%20line%2Dheight%3A%201%2E3%3B%20%7D%0A%0A%2F%2A%20Ensure%20certain%20elements%20are%20never%20larger%20than%20the%20slide%20itself%20%2A%2F%0A%2Ereveal%20img%2C%0A%2Ereveal%20video%2C%0A%2Ereveal%20iframe%20%7B%0A%20%20max%2Dwidth%3A%2095%25%3B%0A%20%20max%2Dheight%3A%2095%25%3B%20%7D%0A%0A%2Ereveal%20strong%2C%0A%2Ereveal%20b%20%7B%0A%20%20font%2Dweight%3A%20bold%3B%20%7D%0A%0A%2Ereveal%20em%20%7B%0A%20%20font%2Dstyle%3A%20italic%3B%20%7D%0A%0A%2Ereveal%20ol%2C%0A%2Ereveal%20dl%2C%0A%2Ereveal%20ul%20%7B%0A%20%20display%3A%20inline%2Dblock%3B%0A%20%20text%2Dalign%3A%20left%3B%0A%20%20margin%3A%200%200%200%201em%3B%20%7D%0A%0A%2Ereveal%20ol%20%7B%0A%20%20list%2Dstyle%2Dtype%3A%20decimal%3B%20%7D%0A%0A%2Ereveal%20ul%20%7B%0A%20%20list%2Dstyle%2Dtype%3A%20disc%3B%20%7D%0A%0A%2Ereveal%20ul%20ul%20%7B%0A%20%20list%2Dstyle%2Dtype%3A%20square%3B%20%7D%0A%0A%2Ereveal%20ul%20ul%20ul%20%7B%0A%20%20list%2Dstyle%2Dtype%3A%20circle%3B%20%7D%0A%0A%2Ereveal%20ul%20ul%2C%0A%2Ereveal%20ul%20ol%2C%0A%2Ereveal%20ol%20ol%2C%0A%2Ereveal%20ol%20ul%20%7B%0A%20%20display%3A%20block%3B%0A%20%20margin%2Dleft%3A%2040px%3B%20%7D%0A%0A%2Ereveal%20dt%20%7B%0A%20%20font%2Dweight%3A%20bold%3B%20%7D%0A%0A%2Ereveal%20dd%20%7B%0A%20%20margin%2Dleft%3A%2040px%3B%20%7D%0A%0A%2Ereveal%20blockquote%20%7B%0A%20%20display%3A%20block%3B%0A%20%20position%3A%20relative%3B%0A%20%20width%3A%2070%25%3B%0A%20%20margin%3A%2020px%20auto%3B%0A%20%20padding%3A%205px%3B%0A%20%20font%2Dstyle%3A%20italic%3B%0A%20%20background%3A%20rgba%28255%2C%20255%2C%20255%2C%200%2E05%29%3B%0A%20%20box%2Dshadow%3A%200px%200px%202px%20rgba%280%2C%200%2C%200%2C%200%2E2%29%3B%20%7D%0A%0A%2Ereveal%20blockquote%20p%3Afirst%2Dchild%2C%0A%2Ereveal%20blockquote%20p%3Alast%2Dchild%20%7B%0A%20%20display%3A%20inline%2Dblock%3B%20%7D%0A%0A%2Ereveal%20q%20%7B%0A%20%20font%2Dstyle%3A%20italic%3B%20%7D%0A%0A%2Ereveal%20pre%20%7B%0A%20%20display%3A%20block%3B%0A%20%20position%3A%20relative%3B%0A%20%20width%3A%2090%25%3B%0A%20%20margin%3A%2020px%20auto%3B%0A%20%20text%2Dalign%3A%20left%3B%0A%20%20font%2Dsize%3A%200%2E55em%3B%0A%20%20font%2Dfamily%3A%20monospace%3B%0A%20%20line%2Dheight%3A%201%2E2em%3B%0A%20%20word%2Dwrap%3A%20break%2Dword%3B%0A%20%20box%2Dshadow%3A%200px%205px%2015px%20rgba%280%2C%200%2C%200%2C%200%2E15%29%3B%20%7D%0A%0A%2Ereveal%20code%20%7B%0A%20%20font%2Dfamily%3A%20monospace%3B%0A%20%20text%2Dtransform%3A%20none%3B%20%7D%0A%0A%2Ereveal%20pre%20code%20%7B%0A%20%20display%3A%20block%3B%0A%20%20padding%3A%205px%3B%0A%20%20overflow%3A%20auto%3B%0A%20%20max%2Dheight%3A%20400px%3B%0A%20%20word%2Dwrap%3A%20normal%3B%20%7D%0A%0A%2Ereveal%20table%20%7B%0A%20%20margin%3A%20auto%3B%0A%20%20border%2Dcollapse%3A%20collapse%3B%0A%20%20border%2Dspacing%3A%200%3B%20%7D%0A%0A%2Ereveal%20table%20th%20%7B%0A%20%20font%2Dweight%3A%20bold%3B%20%7D%0A%0A%2Ereveal%20table%20th%2C%0A%2Ereveal%20table%20td%20%7B%0A%20%20text%2Dalign%3A%20left%3B%0A%20%20padding%3A%200%2E2em%200%2E5em%200%2E2em%200%2E5em%3B%0A%20%20border%2Dbottom%3A%201px%20solid%3B%20%7D%0A%0A%2Ereveal%20table%20th%5Balign%3D%22center%22%5D%2C%0A%2Ereveal%20table%20td%5Balign%3D%22center%22%5D%20%7B%0A%20%20text%2Dalign%3A%20center%3B%20%7D%0A%0A%2Ereveal%20table%20th%5Balign%3D%22right%22%5D%2C%0A%2Ereveal%20table%20td%5Balign%3D%22right%22%5D%20%7B%0A%20%20text%2Dalign%3A%20right%3B%20%7D%0A%0A%2Ereveal%20table%20tbody%20tr%3Alast%2Dchild%20th%2C%0A%2Ereveal%20table%20tbody%20tr%3Alast%2Dchild%20td%20%7B%0A%20%20border%2Dbottom%3A%20none%3B%20%7D%0A%0A%2Ereveal%20sup%20%7B%0A%20%20vertical%2Dalign%3A%20super%3B%0A%20%20font%2Dsize%3A%20smaller%3B%20%7D%0A%0A%2Ereveal%20sub%20%7B%0A%20%20vertical%2Dalign%3A%20sub%3B%0A%20%20font%2Dsize%3A%20smaller%3B%20%7D%0A%0A%2Ereveal%20small%20%7B%0A%20%20display%3A%20inline%2Dblock%3B%0A%20%20font%2Dsize%3A%200%2E6em%3B%0A%20%20line%2Dheight%3A%201%2E2em%3B%0A%20%20vertical%2Dalign%3A%20top%3B%20%7D%0A%0A%2Ereveal%20small%20%2A%20%7B%0A%20%20vertical%2Dalign%3A%20top%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20LINKS%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%20a%20%7B%0A%20%20color%3A%20%232a76dd%3B%0A%20%20text%2Ddecoration%3A%20none%3B%0A%20%20%2Dwebkit%2Dtransition%3A%20color%20%2E15s%20ease%3B%0A%20%20%2Dmoz%2Dtransition%3A%20color%20%2E15s%20ease%3B%0A%20%20transition%3A%20color%20%2E15s%20ease%3B%20%7D%0A%0A%2Ereveal%20a%3Ahover%20%7B%0A%20%20color%3A%20%236ca0e8%3B%0A%20%20text%2Dshadow%3A%20none%3B%0A%20%20border%3A%20none%3B%20%7D%0A%0A%2Ereveal%20%2Eroll%20span%3Aafter%20%7B%0A%20%20color%3A%20%23fff%3B%0A%20%20background%3A%20%231a53a1%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20IMAGES%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%20section%20img%20%7B%0A%20%20margin%3A%2015px%200px%3B%0A%20%20background%3A%20rgba%28255%2C%20255%2C%20255%2C%200%2E12%29%3B%0A%20%20border%3A%204px%20solid%20%23222%3B%0A%20%20box%2Dshadow%3A%200%200%2010px%20rgba%280%2C%200%2C%200%2C%200%2E15%29%3B%20%7D%0A%0A%2Ereveal%20section%20img%2Eplain%20%7B%0A%20%20border%3A%200%3B%0A%20%20box%2Dshadow%3A%20none%3B%20%7D%0A%0A%2Ereveal%20a%20img%20%7B%0A%20%20%2Dwebkit%2Dtransition%3A%20all%20%2E15s%20linear%3B%0A%20%20%2Dmoz%2Dtransition%3A%20all%20%2E15s%20linear%3B%0A%20%20transition%3A%20all%20%2E15s%20linear%3B%20%7D%0A%0A%2Ereveal%20a%3Ahover%20img%20%7B%0A%20%20background%3A%20rgba%28255%2C%20255%2C%20255%2C%200%2E2%29%3B%0A%20%20border%2Dcolor%3A%20%232a76dd%3B%0A%20%20box%2Dshadow%3A%200%200%2020px%20rgba%280%2C%200%2C%200%2C%200%2E55%29%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20NAVIGATION%20CONTROLS%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%20%2Econtrols%20%7B%0A%20%20color%3A%20%232a76dd%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20PROGRESS%20BAR%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%2Ereveal%20%2Eprogress%20%7B%0A%20%20background%3A%20rgba%280%2C%200%2C%200%2C%200%2E2%29%3B%0A%20%20color%3A%20%232a76dd%3B%20%7D%0A%0A%2Ereveal%20%2Eprogress%20span%20%7B%0A%20%20%2Dwebkit%2Dtransition%3A%20width%20800ms%20cubic%2Dbezier%280%2E26%2C%200%2E86%2C%200%2E44%2C%200%2E985%29%3B%0A%20%20%2Dmoz%2Dtransition%3A%20width%20800ms%20cubic%2Dbezier%280%2E26%2C%200%2E86%2C%200%2E44%2C%200%2E985%29%3B%0A%20%20transition%3A%20width%20800ms%20cubic%2Dbezier%280%2E26%2C%200%2E86%2C%200%2E44%2C%200%2E985%29%3B%20%7D%0A%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0A%20%2A%20PRINT%20BACKGROUND%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0A%40media%20print%20%7B%0A%20%20%2Ebackgrounds%20%7B%0A%20%20%20%20background%2Dcolor%3A%20%23fff%3B%20%7D%20%7D%0A" rel="stylesheet" id="theme">
<!-- Printing and PDF exports -->
<script>
var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = window.location.search.match( /print-pdf/gi ) ? 'https://revealjs.com/css/print/pdf.css' : 'https://revealjs.com/css/print/paper.css';
document.getElementsByTagName( 'head' )[0].appendChild( link );
</script>
<!--[if lt IE 9]>
<script src="https://revealjs.com/lib/js/html5shiv.js"></script>
<![endif]-->
</head>
<body>
<div class="reveal">
<div class="slides">
<section>
<h1 class="title">Rust Graz – 08 traits</h1>
<p class="author">Lukas Prokop</p>
<p class="date">29th of January, 2020</p>
</section>
<section class="slide level2">
<p><img src="data:image/png;base64,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" alt="unsafe & traits; 29th of January 2020 Rust Graz, lab10" /></p>
</section>
<section><section id="object-oriented-programming" class="titleslide slide level1"><h1>Object-oriented programming</h1></section><section id="one-definition-of-oop" class="slide level2">
<h2>One definition of OOP</h2>
<ol type="1">
<li>Inheritance</li>
<li>Polymorphism</li>
<li>Data encapsulation</li>
</ol>
</section><section id="popularized-by-simula-1960s" class="slide level2">
<h2>Popularized by Simula (1960s)</h2>
<p>via <a href="https://en.wikipedia.org/wiki/Simula#Classes,_subclasses_and_virtual_procedures">Wikipedia</a></p>
<pre class="simula"><code>Glyph Class Char (c);
Character c;
Begin
Procedure print;
OutChar(c);
End;</code></pre>
</section><section id="definition-by-gang-of-four" class="slide level2">
<h2>Definition by Gang of Four</h2>
<blockquote>
<p>Object-oriented programs are made up of objects. An object packages both data and the procedures that operate on that data. The procedures are typically called methods or operations.</p>
</blockquote>
</section><section id="is-rust-an-oop-language" class="slide level2">
<h2>Is rust an OOP language?</h2>
<p>Yes and no. Depends on definition.</p>
<p>(BTW, I would like to stress that OOP is not always class-based OOP. JavaScript and Lua, for example, use prototype-based OOP)</p>
</section></section>
<section><section id="traits" class="titleslide slide level1"><h1>Traits</h1></section><section id="definition" class="slide level2">
<h2>Definition</h2>
<blockquote>
<p>In computer programming, a trait is a concept used in object-oriented programming, which represents a set of methods that can be used to extend the functionality of a class</p>
</blockquote>
<p>Self ⇒ {PHP, rust, Scala, …}</p>
</section><section id="rust-traits" class="slide level2">
<h2>rust traits</h2>
<ul>
<li>Inheritance ⇒ no, but default implementations for code reuse</li>
<li>Polymorphism ⇒ generics and trait bounds</li>
<li>Data encapsulation ⇒ <code>pub</code> keyword</li>
</ul>
</section><section id="trait-example" class="slide level2">
<h2>Trait example</h2>
<p>via <a href="https://doc.rust-lang.org/stable/book/ch17-01-what-is-oo.html#objects-contain-data-and-behavior">rust book</a></p>
<div class="sourceCode"><pre class="sourceCode rust"><code class="sourceCode rust"><span class="kw">pub</span> <span class="kw">struct</span> AveragedCollection <span class="op">{</span>
list: <span class="dt">Vec</span><<span class="dt">i32</span>>,
average: <span class="dt">f64</span>,
<span class="op">}</span></code></pre></div>
</section><section id="trait-example-1" class="slide level2">
<h2>Trait example</h2>
<div class="sourceCode"><pre class="sourceCode rust"><code class="sourceCode rust"><span class="kw">impl</span> AveragedCollection <span class="op">{</span>
<span class="kw">pub</span> <span class="kw">fn</span> add(&<span class="kw">mut</span> <span class="kw">self</span>, value: <span class="dt">i32</span>) <span class="op">{</span>
<span class="kw">self</span>.list.push(value);
<span class="kw">self</span>.update_average();
<span class="op">}</span>
<span class="kw">pub</span> <span class="kw">fn</span> remove(&<span class="kw">mut</span> <span class="kw">self</span>) -> <span class="dt">Option</span><<span class="dt">i32</span>> <span class="op">{</span>
<span class="kw">let</span> result = <span class="kw">self</span>.list.pop();
<span class="kw">match</span> result <span class="op">{</span>
<span class="cn">Some</span>(value) => <span class="op">{</span>
<span class="kw">self</span>.update_average();
<span class="cn">Some</span>(value)
<span class="op">}</span>,
<span class="cn">None</span> => <span class="cn">None</span>,
<span class="op">}</span>
<span class="op">}</span>
<span class="kw">pub</span> <span class="kw">fn</span> average(&<span class="kw">self</span>) -> <span class="dt">f64</span> <span class="op">{</span>
<span class="kw">self</span>.average
<span class="op">}</span>
<span class="kw">fn</span> update_average(&<span class="kw">mut</span> <span class="kw">self</span>) <span class="op">{</span>
<span class="kw">let</span> total: <span class="dt">i32</span> = <span class="kw">self</span>.list.iter().sum();
<span class="kw">self</span>.average = total <span class="kw">as</span> <span class="dt">f64</span> / <span class="kw">self</span>.list.len() <span class="kw">as</span> <span class="dt">f64</span>;
<span class="op">}</span>
<span class="op">}</span></code></pre></div>
</section><section id="trait-example-2" class="slide level2">
<h2>Trait example</h2>
<ul>
<li><code>AveragedCollection</code> implements 4 methods</li>
<li>3 methods constitute the public API</li>
<li>We can define an interface, which must be implemented to satisfy a <code>trait</code></li>
</ul>
</section><section id="trait-syntax" class="slide level2">
<h2>Trait syntax</h2>
<div class="sourceCode"><pre class="sourceCode rust"><code class="sourceCode rust"><span class="kw">pub</span> <span class="kw">trait</span> Average <span class="op">{</span>
<span class="kw">fn</span> average(&<span class="kw">self</span>) -> <span class="dt">f64</span>;
<span class="op">}</span></code></pre></div>
<p>⇒ <code>AveragedCollection</code> must implement trait explicitly</p>
</section><section id="trait-example-3" class="slide level2">
<h2>Trait example</h2>
<div class="sourceCode"><pre class="sourceCode rust"><code class="sourceCode rust"><span class="kw">impl</span> Average <span class="kw">for</span> AveragedCollection <span class="op">{</span>
<span class="kw">fn</span> average(&<span class="kw">self</span>) -> <span class="dt">f64</span> <span class="op">{</span>
<span class="kw">self</span>.average
<span class="op">}</span>
<span class="op">}</span></code></pre></div>
<p>⇒ <code>AveragedCollection</code> implements <code>Average</code> explicitly</p>
</section></section>
<section><section id="epilogue" class="titleslide slide level1"><h1>Epilogue</h1></section><section class="slide level2">
<p><a href="https://twitter.com/mitsuhiko/status/1204523300468248577">mitsuhiko</a> on Twitter:</p>
<blockquote>
<p>I'm sorry but that floats/doubles are not Eq in rust is somewhere between hugely frustrating and bullshit. Not sure where. It makes the simplest things really complex for no real added benefit.</p>
</blockquote>
</section><section class="slide level2">
<p><a href="https://twitter.com/simnalamburt/status/1204553345794396160">simnalamburt</a> on Twitter:</p>
<blockquote>
<p>They can’t be “Eq” since ‘NaN == NaN’ should be evaluated as false due to IEEE 754</p>
<p>Trust me you’ll be much more angry and seriously more frustrated if they are “Eq” and disobey IEEE 754.</p>
</blockquote>
</section><section id="next-session" class="slide level2">
<h2>Next session</h2>
<p>Wed, 2019/02/26 19:00</p>
<p>Topic: Generics</p>
</section><section class="slide level2">
</section></section>
<section><section id="thanks" class="titleslide slide level1"><h1>Thanks!</h1></section></section>
</div>
</div>
<script src="data:text/html; charset=utf-8,%3C%21DOCTYPE%20html%3E%0A%3Chtml%3E%0A%20%20%3Chead%3E%0A%20%20%20%20%3Cmeta%20http%2Dequiv%3D%22Content%2Dtype%22%20content%3D%22text%2Fhtml%3B%20charset%3Dutf%2D8%22%3E%0A%20%20%20%20%3Cmeta%20http%2Dequiv%3D%22Content%2DSecurity%2DPolicy%22%20content%3D%22default%2Dsrc%20%27none%27%3B%20style%2Dsrc%20%27unsafe%2Dinline%27%3B%20img%2Dsrc%20data%3A%3B%20connect%2Dsrc%20%27self%27%22%3E%0A%20%20%20%20%3Ctitle%3EPage%20not%20found%20%26middot%3B%20GitHub%20Pages%3C%2Ftitle%3E%0A%20%20%20%20%3Cstyle%20type%3D%22text%2Fcss%22%20media%3D%22screen%22%3E%0A%20%20%20%20%20%20body%20%7B%0A%20%20%20%20%20%20%20%20background%2Dcolor%3A%20%23f1f1f1%3B%0A%20%20%20%20%20%20%20%20margin%3A%200%3B%0A%20%20%20%20%20%20%20%20font%2Dfamily%3A%20%22Helvetica%20Neue%22%2C%20Helvetica%2C%20Arial%2C%20sans%2Dserif%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%2Econtainer%20%7B%20margin%3A%2050px%20auto%2040px%20auto%3B%20width%3A%20600px%3B%20text%2Dalign%3A%20center%3B%20%7D%0A%0A%20%20%20%20%20%20a%20%7B%20color%3A%20%234183c4%3B%20text%2Ddecoration%3A%20none%3B%20%7D%0A%20%20%20%20%20%20a%3Ahover%20%7B%20text%2Ddecoration%3A%20underline%3B%20%7D%0A%0A%20%20%20%20%20%20h1%20%7B%20width%3A%20800px%3B%20position%3Arelative%3B%20left%3A%20%2D100px%3B%20letter%2Dspacing%3A%20%2D1px%3B%20line%2Dheight%3A%2060px%3B%20font%2Dsize%3A%2060px%3B%20font%2Dweight%3A%20100%3B%20margin%3A%200px%200%2050px%200%3B%20text%2Dshadow%3A%200%201px%200%20%23fff%3B%20%7D%0A%20%20%20%20%20%20p%20%7B%20color%3A%20rgba%280%2C%200%2C%200%2C%200%2E5%29%3B%20margin%3A%2020px%200%3B%20line%2Dheight%3A%201%2E6%3B%20%7D%0A%0A%20%20%20%20%20%20ul%20%7B%20list%2Dstyle%3A%20none%3B%20margin%3A%2025px%200%3B%20padding%3A%200%3B%20%7D%0A%20%20%20%20%20%20li%20%7B%20display%3A%20table%2Dcell%3B%20font%2Dweight%3A%20bold%3B%20width%3A%201%25%3B%20%7D%0A%0A%20%20%20%20%20%20%2Elogo%20%7B%20display%3A%20inline%2Dblock%3B%20margin%2Dtop%3A%2035px%3B%20%7D%0A%20%20%20%20%20%20%2Elogo%2Dimg%2D2x%20%7B%20display%3A%20none%3B%20%7D%0A%20%20%20%20%20%20%40media%0A%20%20%20%20%20%20only%20screen%20and%20%28%2Dwebkit%2Dmin%2Ddevice%2Dpixel%2Dratio%3A%202%29%2C%0A%20%20%20%20%20%20only%20screen%20and%20%28%20%20%20min%2D%2Dmoz%2Ddevice%2Dpixel%2Dratio%3A%202%29%2C%0A%20%20%20%20%20%20only%20screen%20and%20%28%20%20%20%20%20%2Do%2Dmin%2Ddevice%2Dpixel%2Dratio%3A%202%2F1%29%2C%0A%20%20%20%20%20%20only%20screen%20and%20%28%20%20%20%20%20%20%20%20min%2Ddevice%2Dpixel%2Dratio%3A%202%29%2C%0A%20%20%20%20%20%20only%20screen%20and%20%28%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20min%2Dresolution%3A%20192dpi%29%2C%0A%20%20%20%20%20%20only%20screen%20and%20%28%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20min%2Dresolution%3A%202dppx%29%20%7B%0A%20%20%20%20%20%20%20%20%2Elogo%2Dimg%2D1x%20%7B%20display%3A%20none%3B%20%7D%0A%20%20%20%20%20%20%20%20%2Elogo%2Dimg%2D2x%20%7B%20display%3A%20inline%2Dblock%3B%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%23suggestions%20%7B%0A%20%20%20%20%20%20%20%20margin%2Dtop%3A%2035px%3B%0A%20%20%20%20%20%20%20%20color%3A%20%23ccc%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%23suggestions%20a%20%7B%0A%20%20%20%20%20%20%20%20color%3A%20%23666666%3B%0A%20%20%20%20%20%20%20%20font%2Dweight%3A%20200%3B%0A%20%20%20%20%20%20%20%20font%2Dsize%3A%2014px%3B%0A%20%20%20%20%20%20%20%20margin%3A%200%2010px%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%3C%2Fstyle%3E%0A%20%20%3C%2Fhead%3E%0A%20%20%3Cbody%3E%0A%0A%20%20%20%20%3Cdiv%20class%3D%22container%22%3E%0A%0A%20%20%20%20%20%20%3Ch1%3E404%3C%2Fh1%3E%0A%20%20%20%20%20%20%3Cp%3E%3Cstrong%3EFile%20not%20found%3C%2Fstrong%3E%3C%2Fp%3E%0A%0A%20%20%20%20%20%20%3Cp%3E%0A%20%20%20%20%20%20%20%20The%20site%20configured%20at%20this%20address%20does%20not%0A%20%20%20%20%20%20%20%20contain%20the%20requested%20file%2E%0A%20%20%20%20%20%20%3C%2Fp%3E%0A%0A%20%20%20%20%20%20%3Cp%3E%0A%20%20%20%20%20%20%20%20If%20this%20is%20your%20site%2C%20make%20sure%20that%20the%20filename%20case%20matches%20the%20URL%2E%3Cbr%3E%0A%20%20%20%20%20%20%20%20For%20root%20URLs%20%28like%20%3Ccode%3Ehttp%3A%2F%2Fexample%2Ecom%2F%3C%2Fcode%3E%29%20you%20must%20provide%20an%0A%20%20%20%20%20%20%20%20%3Ccode%3Eindex%2Ehtml%3C%2Fcode%3E%20file%2E%0A%20%20%20%20%20%20%3C%2Fp%3E%0A%0A%20%20%20%20%20%20%3Cp%3E%0A%20%20%20%20%20%20%20%20%3Ca%20href%3D%22https%3A%2F%2Fhelp%2Egithub%2Ecom%2Fpages%2F%22%3ERead%20the%20full%20documentation%3C%2Fa%3E%0A%20%20%20%20%20%20%20%20for%20more%20information%20about%20using%20%3Cstrong%3EGitHub%20Pages%3C%2Fstrong%3E%2E%0A%20%20%20%20%20%20%3C%2Fp%3E%0A%0A%20%20%20%20%20%20%3Cdiv%20id%3D%22suggestions%22%3E%0A%20%20%20%20%20%20%20%20%3Ca%20href%3D%22https%3A%2F%2Fgithubstatus%2Ecom%22%3EGitHub%20Status%3C%2Fa%3E%20%26mdash%3B%0A%20%20%20%20%20%20%20%20%3Ca%20href%3D%22https%3A%2F%2Ftwitter%2Ecom%2Fgithubstatus%22%3E%40githubstatus%3C%2Fa%3E%0A%20%20%20%20%20%20%3C%2Fdiv%3E%0A%0A%20%20%20%20%20%20%3Ca%20href%3D%22%2F%22%20class%3D%22logo%20logo%2Dimg%2D1x%22%3E%0A%20%20%20%20%20%20%20%20%3Cimg%20width%3D%2232%22%20height%3D%2232%22%20title%3D%22%22%20alt%3D%22%22%20src%3D%22data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpFMTZCRDY3REIzRjAxMUUyQUQzREIxQzRENUFFNUM5NiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpFMTZCRDY3RUIzRjAxMUUyQUQzREIxQzRENUFFNUM5NiI%2BIDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkUxNkJENjdCQjNGMDExRTJBRDNEQjFDNEQ1QUU1Qzk2IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkUxNkJENjdDQjNGMDExRTJBRDNEQjFDNEQ1QUU1Qzk2Ii8%2BIDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY%2BIDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8%2BSM9MCAAAA%2B5JREFUeNrEV11Ik1EY3s4%2BddOp29Q5b0opCgKFsoKoi5Kg6CIhuwi6zLJLoYLopq4qsKKgi4i6CYIoU%2Fq5iDAKs6syoS76IRWtyJ%2Bp7cdt7sf1PGOD%2Be0c3dygAx%2F67ZzzPM95%2F877GYdHRg3ZjMXFxepQKNS6sLCwJxqNNuFpiMfjVs4ZjUa%2FpmmjeD6VlJS8NpvNT4QQ7mxwjSsJiEQim%2F1%2B%2F9lgMHgIr5ohuxG1WCw9Vqv1clFR0dCqBODElV6v90ogEDjGdYbVjXhpaendioqK07CIR7ZAqE49PT09BPL2PMgTByQGsYiZlQD4uMXtdr%2BJxWINhgINYhGT2MsKgMrm2dnZXgRXhaHAg5jEJodUAHxux4LudHJE9RdEdA%2Bi3Juz7bGHe4mhE9FNrgwBCLirMFV9Okh5eflFh8PR5nK5nDabrR2BNJlKO0T35%2BLi4n4%2B%2FJ%2B%2FJQCxhmu5h3uJoXNHPbmWZAHMshWB8l5%2FipqammaAf0zPDDx1ONV3vurdidqwAQL%2BpEc8sLcAe1CCvQ3YHxIW8Pl85xSWNC1hADDIv0rIE%2Fo4J0k3kww4xSlwIhcq3EFFOm7KN%2FhUGOQkt0CFa5WpNJlMvxBEz%2FIVQAxg%2FZRZl9wiHA63yDYieM7DnLP5CiAGsC7I5sgtYKJGWe2A8seFqgFJrJjEPY1Cn3pJ8%2F9W1e5VWsFDTEmFrBcoDhZJEQkXuhICMyKpjhahqN21hRYATKfUOlDmkygrR4o4C0VOLGJKrOITKB4jijzdXygBKixyC5TDQdnk%2FPz8qRw6oOWGlsTKGOQW6OH6FBWsyePxdOXLTgxiyebILZCjz%2BGLgMIKnXNzc49YMlcRdHXcSwxFVgTInQhC9G33UhNoJLuqq6t345p9y3eUy8OTk5PjAHuI9uo4b07FBaOhsu0A4Unc%2BT1TU1Nj3KsSSE5yJ65jqF2DDd8QqWYmAZrIM2VlZTdnZmb6AbpdV9V6ec9znf5Q7HjYumdRE0JOp3MjitO4SFa%2BcZz8Umqe3TCbSLvdfkR%2FkWDdNQl5InuTcysOcpFT35ZrbBxx4p3JAHlZVVW1D%2F634VRt%2BFvLBgK%2Fv5LV9WS%2B10xMTEwtRw7XvqOL%2Be2Q8V3AYIOIAXQ26%2FheWVnZCVfcyKHg2CBgTpmPmjYM8l24GyaUHyaIh7XwfR9ErE8qHoDfn2LTNAVC0HX6MFcBIP8Bi%2B6F6cdW%2FDICkANRfx99fEYFQ7Nph5i%2FuQiA214gno7K%2BguhaiKg9gC62%2BM8eR7XsBsYJ4ilam60Fb7r7uAj8wFyuwM1oIOWgfmDy6RXEEQzJMPe23DXrVS7rtyD3Df8z%2FFPgAEAzWU5Ku59ZAUAAAAASUVORK5CYII%3D%22%3E%0A%20%20%20%20%20%20%3C%2Fa%3E%0A%0A%20%20%20%20%20%20%3Ca%20href%3D%22%2F%22%20class%3D%22logo%20logo%2Dimg%2D2x%22%3E%0A%20%20%20%20%20%20%20%20%3Cimg%20width%3D%2232%22%20height%3D%2232%22%20title%3D%22%22%20alt%3D%22%22%20src%3D%22data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpEQUM1QkUxRUI0MUMxMUUyQUQzREIxQzRENUFFNUM5NiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpEQUM1QkUxRkI0MUMxMUUyQUQzREIxQzRENUFFNUM5NiI%2BIDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkUxNkJENjdGQjNGMDExRTJBRDNEQjFDNEQ1QUU1Qzk2IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkUxNkJENjgwQjNGMDExRTJBRDNEQjFDNEQ1QUU1Qzk2Ii8%2BIDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY%2BIDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8%2BhfPRaQAAB6lJREFUeNrsW2mME2UYbodtt%2B2222u35QheoCCYGBQligIJgkZJNPzgigoaTEj8AdFEMfADfyABkgWiiWcieK4S%2BQOiHAYUj2hMNKgYlEujpNttu9vttbvdw%2BchU1K6M535pt3ubHCSyezR%2Bb73eb73%2Bt7vrfXsufOW4bz6%2Bvom9%2Fb23ovnNNw34b5xYGAgODg46Mbt4mesVmsWd1qSpHhdXd2fuP%2FAfcput5%2FA88xwymcdBgLqenp6FuRyuWV4zu%2Fv759QyWBjxoz5t76%2B%2Fgun09mK5xFyakoCAPSaTCazNpvNPoYVbh6O1YKGRF0u13sNDQ27QMzfpiAAKj0lnU6%2FgBVfAZW2WWpwwVzy0IgP3G73FpjI6REhAGA9qVRqA1b9mVoBVyIC2tDi8Xg24%2BdUzQiAbS%2Fs7Ox8G2o%2F3mKCC%2BZw0efzPQEfcVjYrARX3dbV1bUtHo8fMgt42f%2BMp0yUTVQbdWsAHVsikdiHkHaPxcQXQufXgUBgMRxme9U0AAxfH4vFvjM7eF6UkbJS5qoQwEQGA57Ac5JllFyUVZZ5ckUEgMVxsK2jlSYzI%2BQXJsiyjzNEAJyJAzb%2FKQa41jJKL8pODMQiTEAymXw5n8%2FP0IjD3bh7Rgog59aanxiIRTVvV%2Foj0tnHca%2FWMrVwODwB3raTGxzkBg%2FgnZVapFV62Wy2n5AO70HM%2F5wbJ0QnXyQSaVPDIuNZzY0V3ntHMwxiwHA0Gj2Np7ecIBDgaDAYXKCQJM1DhrgJ3nhulcPbl8j4NmHe46X%2Fg60fwbz3aewjkqFQaAqebWU1AOqyQwt8Id6qEHMc97zu7u7FGGsn7HAiVuosVw7P35C1nccdgSCxop1dHeZswmfHMnxBo6ZTk%2BjN8dl%2FvF7vWofDsa%2BMLN9oEUBMxOb3%2B1eoEsBVw6Zmua49r8YmhAKDiEPcMwBsxMiqQ%2BixzPFxZyqRpXARG%2FYOr1ObFJ0gUskXBbamcR1OKmMUvDxHRAu8%2FLmY3jFLMUpFqz9HxG65smYJdyKyECOxDiEAe%2Fp1gjF2oonivZAsxVgl2daa4EQWCW6J55qFAFFZiJWYLxNQy2qOSUzGRsyXCUDIeliwAHEO4WSlWQBRFoZakXcKmCXmyXAKs0Ve9vl8q42WoIYpJU4hV3hKcNs8m9gl7p%2FxQ73eF5kB4j5mNrWmTJRNwAzqiV1CxjVTZCIkEq%2BZ1bZFZSN2CenmVAFVy4Plz8xKAGWjjAKFk6lCBMDR%2FMJjLLMSQNm43xAiQKTaA%2B9%2FwewhDjL%2BJVI1kkTSSOTcKbMTwPqESAot6dn6Fr1gHwVJju6IRuyiByPuUUBAg5DGkAgBmxlvdgIEK9gDkohdY%2FBJo4CAG0R8miRSsGABkgVQs4KXu098IgUXSSRsFAoKZiVAVDY2WUiiPTjYRi41KwGisrGsLtlsth8Fiwnz2fBkQvWfRtlE3iF2yW63%2FyCacXZ1dW02GwGyTFaRd4idJnCKHRaCxYRHoG5LTKT6SyiToP1fJHbmAYPYRR0UnZQtMnA6s0zg%2BGZBlt0Gdo7EPHgpE3Q6nZ8YyLhc8Xj8MJh%2FaKTAY%2B5FPAKHLE7RdwuYJZmNwzyCMkBCYyKROJBMJl9B%2FPXXCjjmCmDOVzH3fiPpObEWGqoKe4EBl8v1hlqsdLvd23mkxHM9pc9kMpmno9HoeTii7ewbHEZPPx1ztLS1tV3AnGuMjiNjvbQFuHw6zDo5By7dTPAQNBgMLrRarTkSls1mnwT7uwp9virx9QzbW%2FHuV%2Fj5d%2Fb%2B6jniKlllP8lkeONJDk%2Bdq9GsQTnC4fB1heO0K47Hwe7WdDr9nAKgXwOBwHI%2BC45Htj1d6sd429TUNEcmUdc%2BPRaLHcvn87dXW4ugzdsaGxufL94NFv9zi1J7GVbhlvb2dnaJ3SVrxfc%2Bn2%2BNTsZ7%2FH7%2FMr3g5XdSIHyJSH1PZ%2B7fToyl2%2BErqilgZ4NaLYB9goVGaHjR93Hv1ZrU4XDsFT20kH3PObzbWk0CgG1jacVIUnAQb9F%2BVexyLMzkpcLv0IJV7AHQIOCAUYHx7v5qgScmYHtTqSAyZLEJTK22Bie4iq3xsqpm4SAf9Hq9a2DnJ4uLK3SEULcdRvp3i3zHySqpficxEdsQc1NrlYXXvR%2BO7qASSezXB%2Bh1SuUomgg9LL8BUoV4749EIolKh%2BEiqWmqVEZlDgHks2pxHw7xTqUQw9J5NcAXOK10AGIoZ6Zli6JY6Z1Q461KoZ4NiKLHarW%2BKDsxlDUPHZ5zPQZqUVDPJsTqb5n9malbpAh8C2XXDLl62%2BWZIDFRUlNVOiwencnNU3aQEkL%2BcDMSoLvZo2fQB7AJssNAuFuvorlDVVkkg2I87%2Bjo2K2QAVphDrfyViK5VqtO34OkaxXCp%2B7drdDBCAdubm6eidX%2B2WwqT5komwh4YQLk%2BH4aE93h8Xg2gvHekQZOGSgLZTLyDTLJ4Lx9%2FKZWKBSainT4Iy3FqQBfnUZR42PKQFksBr9QKVXCPusD3OiA%2FRkQ5kP8qV%2FJl1WywAp%2F6%2BdcmPM2zL1UrUahe4JqfnWWKXIul3uUbfP8njAFLW1OFr3gdFtZ72cNH%2BPtQT7%2FbrW%2BNXqJAHh0y9V8%2FU%2FA1U7AfwIMAD7mS3pCbuWJAAAAAElFTkSuQmCC%22%3E%0A%20%20%20%20%20%20%3C%2Fa%3E%0A%20%20%20%20%3C%2Fdiv%3E%0A%20%20%3C%2Fbody%3E%0A%3C%2Fhtml%3E%0A"></script>
<script src="data:application/javascript; charset=utf-8;base64,LyohCiAqIHJldmVhbC5qcwogKiBodHRwOi8vcmV2ZWFsanMuY29tCiAqIE1JVCBsaWNlbnNlZAogKgogKiBDb3B5cmlnaHQgKEMpIDIwMTkgSGFraW0gRWwgSGF0dGFiLCBodHRwOi8vaGFraW0uc2UKICovCihmdW5jdGlvbiggcm9vdCwgZmFjdG9yeSApIHsKCWlmKCB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7CgkJLy8gQU1ELiBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgbW9kdWxlLgoJCWRlZmluZSggZnVuY3Rpb24oKSB7CgkJCXJvb3QuUmV2ZWFsID0gZmFjdG9yeSgpOwoJCQlyZXR1cm4gcm9vdC5SZXZlYWw7CgkJfSApOwoJfSBlbHNlIGlmKCB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgKSB7CgkJLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUy4KCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKCX0gZWxzZSB7CgkJLy8gQnJvd3NlciBnbG9iYWxzLgoJCXJvb3QuUmV2ZWFsID0gZmFjdG9yeSgpOwoJfQp9KCB0aGlzLCBmdW5jdGlvbigpIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIFJldmVhbDsKCgkvLyBUaGUgcmV2ZWFsLmpzIHZlcnNpb24KCXZhciBWRVJTSU9OID0gJzMuOC4wJzsKCgl2YXIgU0xJREVTX1NFTEVDVE9SID0gJy5zbGlkZXMgc2VjdGlvbicsCgkJSE9SSVpPTlRBTF9TTElERVNfU0VMRUNUT1IgPSAnLnNsaWRlcz5zZWN0aW9uJywKCQlWRVJUSUNBTF9TTElERVNfU0VMRUNUT1IgPSAnLnNsaWRlcz5zZWN0aW9uLnByZXNlbnQ+c2VjdGlvbicsCgkJSE9NRV9TTElERV9TRUxFQ1RPUiA9ICcuc2xpZGVzPnNlY3Rpb246Zmlyc3Qtb2YtdHlwZScsCgkJVUEgPSBuYXZpZ2F0b3IudXNlckFnZW50LAoKCQkvLyBDb25maWd1cmF0aW9uIGRlZmF1bHRzLCBjYW4gYmUgb3ZlcnJpZGRlbiBhdCBpbml0aWFsaXphdGlvbiB0aW1lCgkJY29uZmlnID0gewoKCQkJLy8gVGhlICJub3JtYWwiIHNpemUgb2YgdGhlIHByZXNlbnRhdGlvbiwgYXNwZWN0IHJhdGlvIHdpbGwgYmUgcHJlc2VydmVkCgkJCS8vIHdoZW4gdGhlIHByZXNlbnRhdGlvbiBpcyBzY2FsZWQgdG8gZml0IGRpZmZlcmVudCByZXNvbHV0aW9ucwoJCQl3aWR0aDogOTYwLAoJCQloZWlnaHQ6IDcwMCwKCgkJCS8vIEZhY3RvciBvZiB0aGUgZGlzcGxheSBzaXplIHRoYXQgc2hvdWxkIHJlbWFpbiBlbXB0eSBhcm91bmQgdGhlIGNvbnRlbnQKCQkJbWFyZ2luOiAwLjA0LAoKCQkJLy8gQm91bmRzIGZvciBzbWFsbGVzdC9sYXJnZXN0IHBvc3NpYmxlIHNjYWxlIHRvIGFwcGx5IHRvIGNvbnRlbnQKCQkJbWluU2NhbGU6IDAuMiwKCQkJbWF4U2NhbGU6IDIuMCwKCgkJCS8vIERpc3BsYXkgcHJlc2VudGF0aW9uIGNvbnRyb2wgYXJyb3dzCgkJCWNvbnRyb2xzOiB0cnVlLAoKCQkJLy8gSGVscCB0aGUgdXNlciBsZWFybiB0aGUgY29udHJvbHMgYnkgcHJvdmlkaW5nIGhpbnRzLCBmb3IgZXhhbXBsZSBieQoJCQkvLyBib3VuY2luZyB0aGUgZG93biBhcnJvdyB3aGVuIHRoZXkgZmlyc3QgZW5jb3VudGVyIGEgdmVydGljYWwgc2xpZGUKCQkJY29udHJvbHNUdXRvcmlhbDogdHJ1ZSwKCgkJCS8vIERldGVybWluZXMgd2hlcmUgY29udHJvbHMgYXBwZWFyLCAiZWRnZXMiIG9yICJib3R0b20tcmlnaHQiCgkJCWNvbnRyb2xzTGF5b3V0OiAnYm90dG9tLXJpZ2h0JywKCgkJCS8vIFZpc2liaWxpdHkgcnVsZSBmb3IgYmFja3dhcmRzIG5hdmlnYXRpb24gYXJyb3dzOyAiZmFkZWQiLCAiaGlkZGVuIgoJCQkvLyBvciAidmlzaWJsZSIKCQkJY29udHJvbHNCYWNrQXJyb3dzOiAnZmFkZWQnLAoKCQkJLy8gRGlzcGxheSBhIHByZXNlbnRhdGlvbiBwcm9ncmVzcyBiYXIKCQkJcHJvZ3Jlc3M6IHRydWUsCgoJCQkvLyBEaXNwbGF5IHRoZSBwYWdlIG51bWJlciBvZiB0aGUgY3VycmVudCBzbGlkZQoJCQkvLyAtIHRydWU6ICAgIFNob3cgc2xpZGUgbnVtYmVyCgkJCS8vIC0gZmFsc2U6ICAgSGlkZSBzbGlkZSBudW1iZXIKCQkJLy8KCQkJLy8gQ2FuIG9wdGlvbmFsbHkgYmUgc2V0IGFzIGEgc3RyaW5nIHRoYXQgc3BlY2lmaWVzIHRoZSBudW1iZXIgZm9ybWF0dGluZzoKCQkJLy8gLSAiaC52IjoJICBIb3Jpem9udGFsIC4gdmVydGljYWwgc2xpZGUgbnVtYmVyIChkZWZhdWx0KQoJCQkvLyAtICJoL3YiOgkgIEhvcml6b250YWwgLyB2ZXJ0aWNhbCBzbGlkZSBudW1iZXIKCQkJLy8gLSAiYyI6CSAgRmxhdHRlbmVkIHNsaWRlIG51bWJlcgoJCQkvLyAtICJjL3QiOgkgIEZsYXR0ZW5lZCBzbGlkZSBudW1iZXIgLyB0b3RhbCBzbGlkZXMKCQkJLy8KCQkJLy8gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBwcm92aWRlIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBzbGlkZQoJCQkvLyBudW1iZXIgZm9yIHRoZSBjdXJyZW50IHNsaWRlLiBUaGUgZnVuY3Rpb24gbmVlZHMgdG8gcmV0dXJuIGFuIGFycmF5CgkJCS8vIHdpdGggb25lIHN0cmluZyBbc2xpZGVOdW1iZXJdIG9yIHRocmVlIHN0cmluZ3MgW24xLGRlbGltaXRlcixuMl0uCgkJCS8vIFNlZSAjZm9ybWF0U2xpZGVOdW1iZXIoKS4KCQkJc2xpZGVOdW1iZXI6IGZhbHNlLAoKCQkJLy8gQ2FuIGJlIHVzZWQgdG8gbGltaXQgdGhlIGNvbnRleHRzIGluIHdoaWNoIHRoZSBzbGlkZSBudW1iZXIgYXBwZWFycwoJCQkvLyAtICJhbGwiOiAgICAgIEFsd2F5cyBzaG93IHRoZSBzbGlkZSBudW1iZXIKCQkJLy8gLSAicHJpbnQiOiAgICBPbmx5IHdoZW4gcHJpbnRpbmcgdG8gUERGCgkJCS8vIC0gInNwZWFrZXIiOiAgT25seSBpbiB0aGUgc3BlYWtlciB2aWV3CgkJCXNob3dTbGlkZU51bWJlcjogJ2FsbCcsCgoJCQkvLyBVc2UgMSBiYXNlZCBpbmRleGluZyBmb3IgIyBsaW5rcyB0byBtYXRjaCBzbGlkZSBudW1iZXIgKGRlZmF1bHQgaXMgemVybwoJCQkvLyBiYXNlZCkKCQkJaGFzaE9uZUJhc2VkSW5kZXg6IGZhbHNlLAoKCQkJLy8gQWRkIHRoZSBjdXJyZW50IHNsaWRlIG51bWJlciB0byB0aGUgVVJMIGhhc2ggc28gdGhhdCByZWxvYWRpbmcgdGhlCgkJCS8vIHBhZ2UvY29weWluZyB0aGUgVVJMIHdpbGwgcmV0dXJuIHlvdSB0byB0aGUgc2FtZSBzbGlkZQoJCQloYXNoOiBmYWxzZSwKCgkJCS8vIFB1c2ggZWFjaCBzbGlkZSBjaGFuZ2UgdG8gdGhlIGJyb3dzZXIgaGlzdG9yeS4gIEltcGxpZXMgYGhhc2g6IHRydWVgCgkJCWhpc3Rvcnk6IGZhbHNlLAoKCQkJLy8gRW5hYmxlIGtleWJvYXJkIHNob3J0Y3V0cyBmb3IgbmF2aWdhdGlvbgoJCQlrZXlib2FyZDogdHJ1ZSwKCgkJCS8vIE9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgYmxvY2tzIGtleWJvYXJkIGV2ZW50cyB3aGVuIHJldHVuaW5nIGZhbHNlCgkJCWtleWJvYXJkQ29uZGl0aW9uOiBudWxsLAoKCQkJLy8gRW5hYmxlIHRoZSBzbGlkZSBvdmVydmlldyBtb2RlCgkJCW92ZXJ2aWV3OiB0cnVlLAoKCQkJLy8gRGlzYWJsZXMgdGhlIGRlZmF1bHQgcmV2ZWFsLmpzIHNsaWRlIGxheW91dCBzbyB0aGF0IHlvdSBjYW4gdXNlCgkJCS8vIGN1c3RvbSBDU1MgbGF5b3V0CgkJCWRpc2FibGVMYXlvdXQ6IGZhbHNlLAoKCQkJLy8gVmVydGljYWwgY2VudGVyaW5nIG9mIHNsaWRlcwoJCQljZW50ZXI6IHRydWUsCgoJCQkvLyBFbmFibGVzIHRvdWNoIG5hdmlnYXRpb24gb24gZGV2aWNlcyB3aXRoIHRvdWNoIGlucHV0CgkJCXRvdWNoOiB0cnVlLAoKCQkJLy8gTG9vcCB0aGUgcHJlc2VudGF0aW9uCgkJCWxvb3A6IGZhbHNlLAoKCQkJLy8gQ2hhbmdlIHRoZSBwcmVzZW50YXRpb24gZGlyZWN0aW9uIHRvIGJlIFJUTAoJCQlydGw6IGZhbHNlLAoKCQkJLy8gQ2hhbmdlcyB0aGUgYmVoYXZpb3Igb2Ygb3VyIG5hdmlnYXRpb24gZGlyZWN0aW9ucy4KCQkJLy8KCQkJLy8gImRlZmF1bHQiCgkJCS8vIExlZnQvcmlnaHQgYXJyb3cga2V5cyBzdGVwIGJldHdlZW4gaG9yaXpvbnRhbCBzbGlkZXMsIHVwL2Rvd24KCQkJLy8gYXJyb3cga2V5cyBzdGVwIGJldHdlZW4gdmVydGljYWwgc2xpZGVzLiBTcGFjZSBrZXkgc3RlcHMgdGhyb3VnaAoJCQkvLyBhbGwgc2xpZGVzIChib3RoIGhvcml6b250YWwgYW5kIHZlcnRpY2FsKS4KCQkJLy8KCQkJLy8gImxpbmVhciIKCQkJLy8gUmVtb3ZlcyB0aGUgdXAvZG93biBhcnJvd3MuIExlZnQvcmlnaHQgYXJyb3dzIHN0ZXAgdGhyb3VnaCBhbGwKCQkJLy8gc2xpZGVzIChib3RoIGhvcml6b250YWwgYW5kIHZlcnRpY2FsKS4KCQkJLy8KCQkJLy8gImdyaWQiCgkJCS8vIFdoZW4gdGhpcyBpcyBlbmFibGVkLCBzdGVwcGluZyBsZWZ0L3JpZ2h0IGZyb20gYSB2ZXJ0aWNhbCBzdGFjawoJCQkvLyB0byBhbiBhZGphY2VudCB2ZXJ0aWNhbCBzdGFjayB3aWxsIGxhbmQgeW91IGF0IHRoZSBzYW1lIHZlcnRpY2FsCgkJCS8vIGluZGV4LgoJCQkvLwoJCQkvLyBDb25zaWRlciBhIGRlY2sgd2l0aCBzaXggc2xpZGVzIG9yZGVyZWQgaW4gdHdvIHZlcnRpY2FsIHN0YWNrczoKCQkJLy8gMS4xICAgIDIuMQoJCQkvLyAxLjIgICAgMi4yCgkJCS8vIDEuMyAgICAyLjMKCQkJLy8KCQkJLy8gSWYgeW91J3JlIG9uIHNsaWRlIDEuMyBhbmQgbmF2aWdhdGUgcmlnaHQsIHlvdSB3aWxsIG5vcm1hbGx5IG1vdmUKCQkJLy8gZnJvbSAxLjMgLT4gMi4xLiBJZiAiZ3JpZCIgaXMgdXNlZCwgdGhlIHNhbWUgbmF2aWdhdGlvbiB0YWtlcyB5b3UKCQkJLy8gZnJvbSAxLjMgLT4gMi4zLgoJCQluYXZpZ2F0aW9uTW9kZTogJ2RlZmF1bHQnLAoKCQkJLy8gUmFuZG9taXplcyB0aGUgb3JkZXIgb2Ygc2xpZGVzIGVhY2ggdGltZSB0aGUgcHJlc2VudGF0aW9uIGxvYWRzCgkJCXNodWZmbGU6IGZhbHNlLAoKCQkJLy8gVHVybnMgZnJhZ21lbnRzIG9uIGFuZCBvZmYgZ2xvYmFsbHkKCQkJZnJhZ21lbnRzOiB0cnVlLAoKCQkJLy8gRmxhZ3Mgd2hldGhlciB0byBpbmNsdWRlIHRoZSBjdXJyZW50IGZyYWdtZW50IGluIHRoZSBVUkwsCgkJCS8vIHNvIHRoYXQgcmVsb2FkaW5nIGJyaW5ncyB5b3UgdG8gdGhlIHNhbWUgZnJhZ21lbnQgcG9zaXRpb24KCQkJZnJhZ21lbnRJblVSTDogZmFsc2UsCgoJCQkvLyBGbGFncyBpZiB0aGUgcHJlc2VudGF0aW9uIGlzIHJ1bm5pbmcgaW4gYW4gZW1iZWRkZWQgbW9kZSwKCQkJLy8gaS5lLiBjb250YWluZWQgd2l0aGluIGEgbGltaXRlZCBwb3J0aW9uIG9mIHRoZSBzY3JlZW4KCQkJZW1iZWRkZWQ6IGZhbHNlLAoKCQkJLy8gRmxhZ3MgaWYgd2Ugc2hvdWxkIHNob3cgYSBoZWxwIG92ZXJsYXkgd2hlbiB0aGUgcXVlc3Rpb24tbWFyawoJCQkvLyBrZXkgaXMgcHJlc3NlZAoJCQloZWxwOiB0cnVlLAoKCQkJLy8gRmxhZ3MgaWYgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHBhdXNlIHRoZSBwcmVzZW50YXRpb24gKGJsYWNrb3V0KQoJCQlwYXVzZTogdHJ1ZSwKCgkJCS8vIEZsYWdzIGlmIHNwZWFrZXIgbm90ZXMgc2hvdWxkIGJlIHZpc2libGUgdG8gYWxsIHZpZXdlcnMKCQkJc2hvd05vdGVzOiBmYWxzZSwKCgkJCS8vIEdsb2JhbCBvdmVycmlkZSBmb3IgYXV0b2xheWluZyBlbWJlZGRlZCBtZWRpYSAodmlkZW8vYXVkaW8vaWZyYW1lKQoJCQkvLyAtIG51bGw6ICAgTWVkaWEgd2lsbCBvbmx5IGF1dG9wbGF5IGlmIGRhdGEtYXV0b3BsYXkgaXMgcHJlc2VudAoJCQkvLyAtIHRydWU6ICAgQWxsIG1lZGlhIHdpbGwgYXV0b3BsYXksIHJlZ2FyZGxlc3Mgb2YgaW5kaXZpZHVhbCBzZXR0aW5nCgkJCS8vIC0gZmFsc2U6ICBObyBtZWRpYSB3aWxsIGF1dG9wbGF5LCByZWdhcmRsZXNzIG9mIGluZGl2aWR1YWwgc2V0dGluZwoJCQlhdXRvUGxheU1lZGlhOiBudWxsLAoKCQkJLy8gR2xvYmFsIG92ZXJyaWRlIGZvciBwcmVsb2FkaW5nIGxhenktbG9hZGVkIGlmcmFtZXMKCQkJLy8gLSBudWxsOiAgIElmcmFtZXMgd2l0aCBkYXRhLXNyYyBBTkQgZGF0YS1wcmVsb2FkIHdpbGwgYmUgbG9hZGVkIHdoZW4gd2l0aGluCgkJCS8vICAgICAgICAgICB0aGUgdmlld0Rpc3RhbmNlLCBpZnJhbWVzIHdpdGggb25seSBkYXRhLXNyYyB3aWxsIGJlIGxvYWRlZCB3aGVuIHZpc2libGUKCQkJLy8gLSB0cnVlOiAgIEFsbCBpZnJhbWVzIHdpdGggZGF0YS1zcmMgd2lsbCBiZSBsb2FkZWQgd2hlbiB3aXRoaW4gdGhlIHZpZXdEaXN0YW5jZQoJCQkvLyAtIGZhbHNlOiAgQWxsIGlmcmFtZXMgd2l0aCBkYXRhLXNyYyB3aWxsIGJlIGxvYWRlZCBvbmx5IHdoZW4gdmlzaWJsZQoJCQlwcmVsb2FkSWZyYW1lczogbnVsbCwKCgkJCS8vIENvbnRyb2xzIGF1dG9tYXRpYyBwcm9ncmVzc2lvbiB0byB0aGUgbmV4dCBzbGlkZQoJCQkvLyAtIDA6ICAgICAgQXV0by1zbGlkaW5nIG9ubHkgaGFwcGVucyBpZiB0aGUgZGF0YS1hdXRvc2xpZGUgSFRNTCBhdHRyaWJ1dGUKCQkJLy8gICAgICAgICAgIGlzIHByZXNlbnQgb24gdGhlIGN1cnJlbnQgc2xpZGUgb3IgZnJhZ21lbnQKCQkJLy8gLSAxKzogICAgIEFsbCBzbGlkZXMgd2lsbCBwcm9ncmVzcyBhdXRvbWF0aWNhbGx5IGF0IHRoZSBnaXZlbiBpbnRlcnZhbAoJCQkvLyAtIGZhbHNlOiAgTm8gYXV0by1zbGlkaW5nLCBldmVuIGlmIGRhdGEtYXV0b3NsaWRlIGlzIHByZXNlbnQKCQkJYXV0b1NsaWRlOiAwLAoKCQkJLy8gU3RvcCBhdXRvLXNsaWRpbmcgYWZ0ZXIgdXNlciBpbnB1dAoJCQlhdXRvU2xpZGVTdG9wcGFibGU6IHRydWUsCgoJCQkvLyBVc2UgdGhpcyBtZXRob2QgZm9yIG5hdmlnYXRpb24gd2hlbiBhdXRvLXNsaWRpbmcgKGRlZmF1bHRzIHRvIG5hdmlnYXRlTmV4dCkKCQkJYXV0b1NsaWRlTWV0aG9kOiBudWxsLAoKCQkJLy8gU3BlY2lmeSB0aGUgYXZlcmFnZSB0aW1lIGluIHNlY29uZHMgdGhhdCB5b3UgdGhpbmsgeW91IHdpbGwgc3BlbmQKCQkJLy8gcHJlc2VudGluZyBlYWNoIHNsaWRlLiBUaGlzIGlzIHVzZWQgdG8gc2hvdyBhIHBhY2luZyB0aW1lciBpbiB0aGUKCQkJLy8gc3BlYWtlciB2aWV3CgkJCWRlZmF1bHRUaW1pbmc6IG51bGwsCgoJCQkvLyBFbmFibGUgc2xpZGUgbmF2aWdhdGlvbiB2aWEgbW91c2Ugd2hlZWwKCQkJbW91c2VXaGVlbDogZmFsc2UsCgoJCQkvLyBBcHBseSBhIDNEIHJvbGwgdG8gbGlua3Mgb24gaG92ZXIKCQkJcm9sbGluZ0xpbmtzOiBmYWxzZSwKCgkJCS8vIEhpZGVzIHRoZSBhZGRyZXNzIGJhciBvbiBtb2JpbGUgZGV2aWNlcwoJCQloaWRlQWRkcmVzc0JhcjogdHJ1ZSwKCgkJCS8vIE9wZW5zIGxpbmtzIGluIGFuIGlmcmFtZSBwcmV2aWV3IG92ZXJsYXkKCQkJLy8gQWRkIGBkYXRhLXByZXZpZXctbGlua2AgYW5kIGBkYXRhLXByZXZpZXctbGluaz0iZmFsc2UiYCB0byBjdXN0b21pc2UgZWFjaCBsaW5rCgkJCS8vIGluZGl2aWR1YWxseQoJCQlwcmV2aWV3TGlua3M6IGZhbHNlLAoKCQkJLy8gRXhwb3NlcyB0aGUgcmV2ZWFsLmpzIEFQSSB0aHJvdWdoIHdpbmRvdy5wb3N0TWVzc2FnZQoJCQlwb3N0TWVzc2FnZTogdHJ1ZSwKCgkJCS8vIERpc3BhdGNoZXMgYWxsIHJldmVhbC5qcyBldmVudHMgdG8gdGhlIHBhcmVudCB3aW5kb3cgdGhyb3VnaCBwb3N0TWVzc2FnZQoJCQlwb3N0TWVzc2FnZUV2ZW50czogZmFsc2UsCgoJCQkvLyBGb2N1c2VzIGJvZHkgd2hlbiBwYWdlIGNoYW5nZXMgdmlzaWJpbGl0eSB0byBlbnN1cmUga2V5Ym9hcmQgc2hvcnRjdXRzIHdvcmsKCQkJZm9jdXNCb2R5T25QYWdlVmlzaWJpbGl0eUNoYW5nZTogdHJ1ZSwKCgkJCS8vIFRyYW5zaXRpb24gc3R5bGUKCQkJdHJhbnNpdGlvbjogJ3NsaWRlJywgLy8gbm9uZS9mYWRlL3NsaWRlL2NvbnZleC9jb25jYXZlL3pvb20KCgkJCS8vIFRyYW5zaXRpb24gc3BlZWQKCQkJdHJhbnNpdGlvblNwZWVkOiAnZGVmYXVsdCcsIC8vIGRlZmF1bHQvZmFzdC9zbG93CgoJCQkvLyBUcmFuc2l0aW9uIHN0eWxlIGZvciBmdWxsIHBhZ2Ugc2xpZGUgYmFja2dyb3VuZHMKCQkJYmFja2dyb3VuZFRyYW5zaXRpb246ICdmYWRlJywgLy8gbm9uZS9mYWRlL3NsaWRlL2NvbnZleC9jb25jYXZlL3pvb20KCgkJCS8vIFBhcmFsbGF4IGJhY2tncm91bmQgaW1hZ2UKCQkJcGFyYWxsYXhCYWNrZ3JvdW5kSW1hZ2U6ICcnLCAvLyBDU1Mgc3ludGF4LCBlLmcuICJhLmpwZyIKCgkJCS8vIFBhcmFsbGF4IGJhY2tncm91bmQgc2l6ZQoJCQlwYXJhbGxheEJhY2tncm91bmRTaXplOiAnJywgLy8gQ1NTIHN5bnRheCwgZS5nLiAiMzAwMHB4IDIwMDBweCIKCgkJCS8vIFBhcmFsbGF4IGJhY2tncm91bmQgcmVwZWF0CgkJCXBhcmFsbGF4QmFja2dyb3VuZFJlcGVhdDogJycsIC8vIHJlcGVhdC9yZXBlYXQteC9yZXBlYXQteS9uby1yZXBlYXQvaW5pdGlhbC9pbmhlcml0CgoJCQkvLyBQYXJhbGxheCBiYWNrZ3JvdW5kIHBvc2l0aW9uCgkJCXBhcmFsbGF4QmFja2dyb3VuZFBvc2l0aW9uOiAnJywgLy8gQ1NTIHN5bnRheCwgZS5nLiAidG9wIGxlZnQiCgoJCQkvLyBBbW91bnQgb2YgcGl4ZWxzIHRvIG1vdmUgdGhlIHBhcmFsbGF4IGJhY2tncm91bmQgcGVyIHNsaWRlIHN0ZXAKCQkJcGFyYWxsYXhCYWNrZ3JvdW5kSG9yaXpvbnRhbDogbnVsbCwKCQkJcGFyYWxsYXhCYWNrZ3JvdW5kVmVydGljYWw6IG51bGwsCgoJCQkvLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgcGFnZXMgYSBzaW5nbGUgc2xpZGUgY2FuIGV4cGFuZCBvbnRvIHdoZW4gcHJpbnRpbmcKCQkJLy8gdG8gUERGLCB1bmxpbWl0ZWQgYnkgZGVmYXVsdAoJCQlwZGZNYXhQYWdlc1BlclNsaWRlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksCgoJCQkvLyBQcmludHMgZWFjaCBmcmFnbWVudCBvbiBhIHNlcGFyYXRlIHNsaWRlCgkJCXBkZlNlcGFyYXRlRnJhZ21lbnRzOiB0cnVlLAoKCQkJLy8gT2Zmc2V0IHVzZWQgdG8gcmVkdWNlIHRoZSBoZWlnaHQgb2YgY29udGVudCB3aXRoaW4gZXhwb3J0ZWQgUERGIHBhZ2VzLgoJCQkvLyBUaGlzIGV4aXN0cyB0byBhY2NvdW50IGZvciBlbnZpcm9ubWVudCBkaWZmZXJlbmNlcyBiYXNlZCBvbiBob3cgeW91CgkJCS8vIHByaW50IHRvIFBERi4gQ0xJIHByaW50aW5nIG9wdGlvbnMsIGxpa2UgcGhhbnRvbWpzIGFuZCB3a3BkZiwgY2FuIGVuZAoJCQkvLyBvbiBwcmVjaXNlbHkgdGhlIHRvdGFsIGhlaWdodCBvZiB0aGUgZG9jdW1lbnQgd2hlcmVhcyBpbi1icm93c2VyCgkJCS8vIHByaW50aW5nIGhhcyB0byBlbmQgb25lIHBpeGVsIGJlZm9yZS4KCQkJcGRmUGFnZUhlaWdodE9mZnNldDogLTEsCgoJCQkvLyBOdW1iZXIgb2Ygc2xpZGVzIGF3YXkgZnJvbSB0aGUgY3VycmVudCB0aGF0IGFyZSB2aXNpYmxlCgkJCXZpZXdEaXN0YW5jZTogMywKCgkJCS8vIFRoZSBkaXNwbGF5IG1vZGUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gc2hvdyBzbGlkZXMKCQkJZGlzcGxheTogJ2Jsb2NrJywKCgkJCS8vIEhpZGUgY3Vyc29yIGlmIGluYWN0aXZlCgkJCWhpZGVJbmFjdGl2ZUN1cnNvcjogdHJ1ZSwKCgkJCS8vIFRpbWUgYmVmb3JlIHRoZSBjdXJzb3IgaXMgaGlkZGVuIChpbiBtcykKCQkJaGlkZUN1cnNvclRpbWU6IDUwMDAsCgoJCQkvLyBTY3JpcHQgZGVwZW5kZW5jaWVzIHRvIGxvYWQKCQkJZGVwZW5kZW5jaWVzOiBbXQoKCQl9LAoKCQkvLyBGbGFncyBpZiBSZXZlYWwuaW5pdGlhbGl6ZSgpIGhhcyBiZWVuIGNhbGxlZAoJCWluaXRpYWxpemVkID0gZmFsc2UsCgoJCS8vIEZsYWdzIGlmIHJldmVhbC5qcyBpcyBsb2FkZWQgKGhhcyBkaXNwYXRjaGVkIHRoZSAncmVhZHknIGV2ZW50KQoJCWxvYWRlZCA9IGZhbHNlLAoKCQkvLyBGbGFncyBpZiB0aGUgb3ZlcnZpZXcgbW9kZSBpcyBjdXJyZW50bHkgYWN0aXZlCgkJb3ZlcnZpZXcgPSBmYWxzZSwKCgkJLy8gSG9sZHMgdGhlIGRpbWVuc2lvbnMgb2Ygb3VyIG92ZXJ2aWV3IHNsaWRlcywgaW5jbHVkaW5nIG1hcmdpbnMKCQlvdmVydmlld1NsaWRlV2lkdGggPSBudWxsLAoJCW92ZXJ2aWV3U2xpZGVIZWlnaHQgPSBudWxsLAoKCQkvLyBUaGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaW5kZXggb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgc2xpZGUKCQlpbmRleGgsCgkJaW5kZXh2LAoKCQkvLyBUaGUgcHJldmlvdXMgYW5kIGN1cnJlbnQgc2xpZGUgSFRNTCBlbGVtZW50cwoJCXByZXZpb3VzU2xpZGUsCgkJY3VycmVudFNsaWRlLAoKCQlwcmV2aW91c0JhY2tncm91bmQsCgoJCS8vIFJlbWVtYmVyIHdoaWNoIGRpcmVjdGlvbnMgdGhhdCB0aGUgdXNlciBoYXMgbmF2aWdhdGVkIHRvd2FyZHMKCQloYXNOYXZpZ2F0ZWRSaWdodCA9IGZhbHNlLAoJCWhhc05hdmlnYXRlZERvd24gPSBmYWxzZSwKCgkJLy8gU2xpZGVzIG1heSBob2xkIGEgZGF0YS1zdGF0ZSBhdHRyaWJ1dGUgd2hpY2ggd2UgcGljayB1cCBhbmQgYXBwbHkKCQkvLyBhcyBhIGNsYXNzIHRvIHRoZSBib2R5LiBUaGlzIGxpc3QgY29udGFpbnMgdGhlIGNvbWJpbmVkIHN0YXRlIG9mCgkJLy8gYWxsIGN1cnJlbnQgc2xpZGVzLgoJCXN0YXRlID0gW10sCgoJCS8vIFRoZSBjdXJyZW50IHNjYWxlIG9mIHRoZSBwcmVzZW50YXRpb24gKHNlZSB3aWR0aC9oZWlnaHQgY29uZmlnKQoJCXNjYWxlID0gMSwKCgkJLy8gQ1NTIHRyYW5zZm9ybSB0aGF0IGlzIGN1cnJlbnRseSBhcHBsaWVkIHRvIHRoZSBzbGlkZXMgY29udGFpbmVyLAoJCS8vIHNwbGl0IGludG8gdHdvIGdyb3VwcwoJCXNsaWRlc1RyYW5zZm9ybSA9IHsgbGF5b3V0OiAnJywgb3ZlcnZpZXc6ICcnIH0sCgoJCS8vIENhY2hlZCByZWZlcmVuY2VzIHRvIERPTSBlbGVtZW50cwoJCWRvbSA9IHt9LAoKCQkvLyBBIGxpc3Qgb2YgcmVnaXN0ZXJlZCByZXZlYWwuanMgcGx1Z2lucwoJCXBsdWdpbnMgPSB7fSwKCgkJLy8gTGlzdCBvZiBhc3luY2hyb25vdXNseSBsb2FkZWQgcmV2ZWFsLmpzIGRlcGVuZGVuY2llcwoJCWFzeW5jRGVwZW5kZW5jaWVzID0gW10sCgoJCS8vIEZlYXR1cmVzIHN1cHBvcnRlZCBieSB0aGUgYnJvd3Nlciwgc2VlICNjaGVja0NhcGFiaWxpdGllcygpCgkJZmVhdHVyZXMgPSB7fSwKCgkJLy8gQ2xpZW50IGlzIGEgbW9iaWxlIGRldmljZSwgc2VlICNjaGVja0NhcGFiaWxpdGllcygpCgkJaXNNb2JpbGVEZXZpY2UsCgoJCS8vIENsaWVudCBpcyBhIGRlc2t0b3AgQ2hyb21lLCBzZWUgI2NoZWNrQ2FwYWJpbGl0aWVzKCkKCQlpc0Nocm9tZSwKCgkJLy8gVGhyb3R0bGVzIG1vdXNlIHdoZWVsIG5hdmlnYXRpb24KCQlsYXN0TW91c2VXaGVlbFN0ZXAgPSAwLAoKCQkvLyBEZWxheXMgdXBkYXRlcyB0byB0aGUgVVJMIGR1ZSB0byBhIENocm9tZSB0aHVtYm5haWxlciBidWcKCQl3cml0ZVVSTFRpbWVvdXQgPSAwLAoKCQkvLyBJcyB0aGUgbW91c2UgcG9pbnRlciBjdXJyZW50bHkgaGlkZGVuIGZyb20gdmlldwoJCWN1cnNvckhpZGRlbiA9IGZhbHNlLAoKCQkvLyBUaW1lb3V0IHVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIGN1cnNvciBpcyBpbmFjdGl2ZQoJCWN1cnNvckluYWN0aXZlVGltZW91dCA9IDAsCgoJCS8vIEZsYWdzIGlmIHRoZSBpbnRlcmFjdGlvbiBldmVudCBsaXN0ZW5lcnMgYXJlIGJvdW5kCgkJZXZlbnRzQXJlQm91bmQgPSBmYWxzZSwKCgkJLy8gVGhlIGN1cnJlbnQgYXV0by1zbGlkZSBkdXJhdGlvbgoJCWF1dG9TbGlkZSA9IDAsCgoJCS8vIEF1dG8gc2xpZGUgcHJvcGVydGllcwoJCWF1dG9TbGlkZVBsYXllciwKCQlhdXRvU2xpZGVUaW1lb3V0ID0gMCwKCQlhdXRvU2xpZGVTdGFydFRpbWUgPSAtMSwKCQlhdXRvU2xpZGVQYXVzZWQgPSBmYWxzZSwKCgkJLy8gSG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnRseSBvbmdvaW5nIHRvdWNoIGlucHV0CgkJdG91Y2ggPSB7CgkJCXN0YXJ0WDogMCwKCQkJc3RhcnRZOiAwLAoJCQlzdGFydENvdW50OiAwLAoJCQljYXB0dXJlZDogZmFsc2UsCgkJCXRocmVzaG9sZDogNDAKCQl9LAoKCQkvLyBBIGtleTp2YWx1ZSBtYXAgb2Ygc2hvcnRjdXQga2V5Ym9hcmQga2V5cyBhbmQgZGVzY3JpcHRpb25zIG9mCgkJLy8gdGhlIGFjdGlvbnMgdGhleSB0cmlnZ2VyLCBnZW5lcmF0ZWQgaW4gI2NvbmZpZ3VyZSgpCgkJa2V5Ym9hcmRTaG9ydGN1dHMgPSB7fSwKCgkJLy8gSG9sZHMgY3VzdG9tIGtleSBjb2RlIG1hcHBpbmdzCgkJcmVnaXN0ZXJlZEtleUJpbmRpbmdzID0ge307CgoJLyoqCgkgKiBTdGFydHMgdXAgdGhlIHByZXNlbnRhdGlvbiBpZiB0aGUgY2xpZW50IGlzIGNhcGFibGUuCgkgKi8KCWZ1bmN0aW9uIGluaXRpYWxpemUoIG9wdGlvbnMgKSB7CgoJCS8vIE1ha2Ugc3VyZSB3ZSBvbmx5IGluaXRpYWxpemUgb25jZQoJCWlmKCBpbml0aWFsaXplZCA9PT0gdHJ1ZSApIHJldHVybjsKCgkJaW5pdGlhbGl6ZWQgPSB0cnVlOwoKCQljaGVja0NhcGFiaWxpdGllcygpOwoKCQlpZiggIWZlYXR1cmVzLnRyYW5zZm9ybXMyZCAmJiAhZmVhdHVyZXMudHJhbnNmb3JtczNkICkgewoJCQlkb2N1bWVudC5ib2R5LnNldEF0dHJpYnV0ZSggJ2NsYXNzJywgJ25vLXRyYW5zZm9ybXMnICk7CgoJCQkvLyBTaW5jZSBKUyB3b24ndCBiZSBydW5uaW5nIGFueSBmdXJ0aGVyLCB3ZSBsb2FkIGFsbCBsYXp5CgkJCS8vIGxvYWRpbmcgZWxlbWVudHMgdXBmcm9udAoJCQl2YXIgaW1hZ2VzID0gdG9BcnJheSggZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICdpbWcnICkgKSwKCQkJCWlmcmFtZXMgPSB0b0FycmF5KCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggJ2lmcmFtZScgKSApOwoKCQkJdmFyIGxhenlMb2FkYWJsZSA9IGltYWdlcy5jb25jYXQoIGlmcmFtZXMgKTsKCgkJCWZvciggdmFyIGkgPSAwLCBsZW4gPSBsYXp5TG9hZGFibGUubGVuZ3RoOyBpIDwgbGVuOyBpKysgKSB7CgkJCQl2YXIgZWxlbWVudCA9IGxhenlMb2FkYWJsZVtpXTsKCQkJCWlmKCBlbGVtZW50LmdldEF0dHJpYnV0ZSggJ2RhdGEtc3JjJyApICkgewoJCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCAnc3JjJywgZWxlbWVudC5nZXRBdHRyaWJ1dGUoICdkYXRhLXNyYycgKSApOwoJCQkJCWVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCAnZGF0YS1zcmMnICk7CgkJCQl9CgkJCX0KCgkJCS8vIElmIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBjb3JlIGZlYXR1cmVzIHdlIHdvbid0IGJlCgkJCS8vIHVzaW5nIEphdmFTY3JpcHQgdG8gY29udHJvbCB0aGUgcHJlc2VudGF0aW9uCgkJCXJldHVybjsKCQl9CgoJCS8vIENhY2hlIHJlZmVyZW5jZXMgdG8ga2V5IERPTSBlbGVtZW50cwoJCWRvbS53cmFwcGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJy5yZXZlYWwnICk7CgkJZG9tLnNsaWRlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoICcucmV2ZWFsIC5zbGlkZXMnICk7CgoJCS8vIEZvcmNlIGEgbGF5b3V0IHdoZW4gdGhlIHdob2xlIHBhZ2UsIGluY2wgZm9udHMsIGhhcyBsb2FkZWQKCQl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCBsYXlvdXQsIGZhbHNlICk7CgoJCXZhciBxdWVyeSA9IFJldmVhbC5nZXRRdWVyeUhhc2goKTsKCgkJLy8gRG8gbm90IGFjY2VwdCBuZXcgZGVwZW5kZW5jaWVzIHZpYSBxdWVyeSBjb25maWcgdG8gYXZvaWQKCQkvLyB0aGUgcG90ZW50aWFsIG9mIG1hbGljaW91cyBzY3JpcHQgaW5qZWN0aW9uCgkJaWYoIHR5cGVvZiBxdWVyeVsnZGVwZW5kZW5jaWVzJ10gIT09ICd1bmRlZmluZWQnICkgZGVsZXRlIHF1ZXJ5WydkZXBlbmRlbmNpZXMnXTsKCgkJLy8gQ29weSBvcHRpb25zIG92ZXIgdG8gb3VyIGNvbmZpZyBvYmplY3QKCQlleHRlbmQoIGNvbmZpZywgb3B0aW9ucyApOwoJCWV4dGVuZCggY29uZmlnLCBxdWVyeSApOwoKCQkvLyBIaWRlIHRoZSBhZGRyZXNzIGJhciBpbiBtb2JpbGUgYnJvd3NlcnMKCQloaWRlQWRkcmVzc0JhcigpOwoKCQkvLyBMb2FkcyBkZXBlbmRlbmNpZXMgYW5kIGNvbnRpbnVlcyB0byAjc3RhcnQoKSBvbmNlIGRvbmUKCQlsb2FkKCk7CgoJfQoKCS8qKgoJICogSW5zcGVjdCB0aGUgY2xpZW50IHRvIHNlZSB3aGF0IGl0J3MgY2FwYWJsZSBvZiwgdGhpcwoJICogc2hvdWxkIG9ubHkgaGFwcGVucyBvbmNlIHBlciBydW50aW1lLgoJICovCglmdW5jdGlvbiBjaGVja0NhcGFiaWxpdGllcygpIHsKCgkJaXNNb2JpbGVEZXZpY2UgPSAvKGlwaG9uZXxpcG9kfGlwYWR8YW5kcm9pZCkvZ2kudGVzdCggVUEgKTsKCQlpc0Nocm9tZSA9IC9jaHJvbWUvaS50ZXN0KCBVQSApICYmICEvZWRnZS9pLnRlc3QoIFVBICk7CgoJCXZhciB0ZXN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdkaXYnICk7CgoJCWZlYXR1cmVzLnRyYW5zZm9ybXMzZCA9ICdXZWJraXRQZXJzcGVjdGl2ZScgaW4gdGVzdEVsZW1lbnQuc3R5bGUgfHwKCQkJCQkJCQknTW96UGVyc3BlY3RpdmUnIGluIHRlc3RFbGVtZW50LnN0eWxlIHx8CgkJCQkJCQkJJ21zUGVyc3BlY3RpdmUnIGluIHRlc3RFbGVtZW50LnN0eWxlIHx8CgkJCQkJCQkJJ09QZXJzcGVjdGl2ZScgaW4gdGVzdEVsZW1lbnQuc3R5bGUgfHwKCQkJCQkJCQkncGVyc3BlY3RpdmUnIGluIHRlc3RFbGVtZW50LnN0eWxlOwoKCQlmZWF0dXJlcy50cmFuc2Zvcm1zMmQgPSAnV2Via2l0VHJhbnNmb3JtJyBpbiB0ZXN0RWxlbWVudC5zdHlsZSB8fAoJCQkJCQkJCSdNb3pUcmFuc2Zvcm0nIGluIHRlc3RFbGVtZW50LnN0eWxlIHx8CgkJCQkJCQkJJ21zVHJhbnNmb3JtJyBpbiB0ZXN0RWxlbWVudC5zdHlsZSB8fAoJCQkJCQkJCSdPVHJhbnNmb3JtJyBpbiB0ZXN0RWxlbWVudC5zdHlsZSB8fAoJCQkJCQkJCSd0cmFuc2Zvcm0nIGluIHRlc3RFbGVtZW50LnN0eWxlOwoKCQlmZWF0dXJlcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVNZXRob2QgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZTsKCQlmZWF0dXJlcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSB0eXBlb2YgZmVhdHVyZXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lTWV0aG9kID09PSAnZnVuY3Rpb24nOwoKCQlmZWF0dXJlcy5jYW52YXMgPSAhIWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdjYW52YXMnICkuZ2V0Q29udGV4dDsKCgkJLy8gVHJhbnNpdGlvbnMgaW4gdGhlIG92ZXJ2aWV3IGFyZSBkaXNhYmxlZCBpbiBkZXNrdG9wIGFuZAoJCS8vIFNhZmFyaSBkdWUgdG8gbGFnCgkJZmVhdHVyZXMub3ZlcnZpZXdUcmFuc2l0aW9ucyA9ICEvVmVyc2lvblwvW1xkXC5dKy4qU2FmYXJpLy50ZXN0KCBVQSApOwoKCQkvLyBGbGFncyBpZiB3ZSBzaG91bGQgdXNlIHpvb20gaW5zdGVhZCBvZiB0cmFuc2Zvcm0gdG8gc2NhbGUKCQkvLyB1cCBzbGlkZXMuIFpvb20gcHJvZHVjZXMgY3Jpc3BlciByZXN1bHRzIGJ1dCBoYXMgYSBsb3Qgb2YKCQkvLyB4YnJvd3NlciBxdWlya3Mgc28gd2Ugb25seSB1c2UgaXQgaW4gd2hpdGVsc2l0ZWQgYnJvd3NlcnMuCgkJZmVhdHVyZXMuem9vbSA9ICd6b29tJyBpbiB0ZXN0RWxlbWVudC5zdHlsZSAmJiAhaXNNb2JpbGVEZXZpY2UgJiYKCQkJCQkJKCBpc0Nocm9tZSB8fCAvVmVyc2lvblwvW1xkXC5dKy4qU2FmYXJpLy50ZXN0KCBVQSApICk7CgoJfQoKCS8qKgoJICogTG9hZHMgdGhlIGRlcGVuZGVuY2llcyBvZiByZXZlYWwuanMuIERlcGVuZGVuY2llcyBhcmUKCSAqIGRlZmluZWQgdmlhIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbiAnZGVwZW5kZW5jaWVzJwoJICogYW5kIHdpbGwgYmUgbG9hZGVkIHByaW9yIHRvIHN0YXJ0aW5nL2JpbmRpbmcgcmV2ZWFsLmpzLgoJICogU29tZSBkZXBlbmRlbmNpZXMgbWF5IGhhdmUgYW4gJ2FzeW5jJyBmbGFnLCBpZiBzbyB0aGV5CgkgKiB3aWxsIGxvYWQgYWZ0ZXIgcmV2ZWFsLmpzIGhhcyBiZWVuIHN0YXJ0ZWQgdXAuCgkgKi8KCWZ1bmN0aW9uIGxvYWQoKSB7CgoJCXZhciBzY3JpcHRzID0gW10sCgkJCXNjcmlwdHNUb0xvYWQgPSAwOwoKCQljb25maWcuZGVwZW5kZW5jaWVzLmZvckVhY2goIGZ1bmN0aW9uKCBzICkgewoJCQkvLyBMb2FkIGlmIHRoZXJlJ3Mgbm8gY29uZGl0aW9uIG9yIHRoZSBjb25kaXRpb24gaXMgdHJ1dGh5CgkJCWlmKCAhcy5jb25kaXRpb24gfHwgcy5jb25kaXRpb24oKSApIHsKCQkJCWlmKCBzLmFzeW5jICkgewoJCQkJCWFzeW5jRGVwZW5kZW5jaWVzLnB1c2goIHMgKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCXNjcmlwdHMucHVzaCggcyApOwoJCQkJfQoJCQl9CgkJfSApOwoKCQlpZiggc2NyaXB0cy5sZW5ndGggKSB7CgkJCXNjcmlwdHNUb0xvYWQgPSBzY3JpcHRzLmxlbmd0aDsKCgkJCS8vIExvYWQgc3luY2hyb25vdXMgc2NyaXB0cwoJCQlzY3JpcHRzLmZvckVhY2goIGZ1bmN0aW9uKCBzICkgewoJCQkJbG9hZFNjcmlwdCggcy5zcmMsIGZ1bmN0aW9uKCkgewoKCQkJCQlpZiggdHlwZW9mIHMuY2FsbGJhY2sgPT09ICdmdW5jdGlvbicgKSBzLmNhbGxiYWNrKCk7CgoJCQkJCWlmKCAtLXNjcmlwdHNUb0xvYWQgPT09IDAgKSB7CgkJCQkJCWluaXRQbHVnaW5zKCk7CgkJCQkJfQoKCQkJCX0gKTsKCQkJfSApOwoJCX0KCQllbHNlIHsKCQkJaW5pdFBsdWdpbnMoKTsKCQl9CgoJfQoKCS8qKgoJICogSW5pdGlhbGl6ZXMgb3VyIHBsdWdpbnMgYW5kIHdhaXRzIGZvciB0aGVtIHRvIGJlIHJlYWR5CgkgKiBiZWZvcmUgcHJvY2VlZGluZy4KCSAqLwoJZnVuY3Rpb24gaW5pdFBsdWdpbnMoKSB7CgoJCXZhciBwbHVnaW5zVG9Jbml0aWFsaXplID0gT2JqZWN0LmtleXMoIHBsdWdpbnMgKS5sZW5ndGg7CgoJCS8vIElmIHRoZXJlIGFyZSBubyBwbHVnaW5zLCBza2lwIHRoaXMgc3RlcAoJCWlmKCBwbHVnaW5zVG9Jbml0aWFsaXplID09PSAwICkgewoJCQlsb2FkQXN5bmNEZXBlbmRlbmNpZXMoKTsKCQl9CgkJLy8gLi4uIG90aGVyd2lzZSBpbml0aWFsaXplIHBsdWdpbnMKCQllbHNlIHsKCgkJCXZhciBhZnRlclBsdWdJbml0aWFsaXplZCA9IGZ1bmN0aW9uKCkgewoJCQkJaWYoIC0tcGx1Z2luc1RvSW5pdGlhbGl6ZSA9PT0gMCApIHsKCQkJCQlsb2FkQXN5bmNEZXBlbmRlbmNpZXMoKTsKCQkJCX0KCQkJfTsKCgkJCWZvciggdmFyIGkgaW4gcGx1Z2lucyApIHsKCgkJCQl2YXIgcGx1Z2luID0gcGx1Z2luc1tpXTsKCgkJCQkvLyBJZiB0aGUgcGx1Z2luIGhhcyBhbiAnaW5pdCcgbWV0aG9kLCBpbnZva2UgaXQKCQkJCWlmKCB0eXBlb2YgcGx1Z2luLmluaXQgPT09ICdmdW5jdGlvbicgKSB7CgkJCQkJdmFyIGNhbGxiYWNrID0gcGx1Z2luLmluaXQoKTsKCgkJCQkJLy8gSWYgdGhlIHBsdWdpbiByZXR1cm5lZCBhIFByb21pc2UsIHdhaXQgZm9yIGl0CgkJCQkJaWYoIGNhbGxiYWNrICYmIHR5cGVvZiBjYWxsYmFjay50aGVuID09PSAnZnVuY3Rpb24nICkgewoJCQkJCQljYWxsYmFjay50aGVuKCBhZnRlclBsdWdJbml0aWFsaXplZCApOwoJCQkJCX0KCQkJCQllbHNlIHsKCQkJCQkJYWZ0ZXJQbHVnSW5pdGlhbGl6ZWQoKTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlhZnRlclBsdWdJbml0aWFsaXplZCgpOwoJCQkJfQoKCQkJfQoKCQl9CgoJfQoKCS8qKgoJICogTG9hZHMgYWxsIGFzeW5jIHJldmVhbC5qcyBkZXBlbmRlbmNpZXMuCgkgKi8KCWZ1bmN0aW9uIGxvYWRBc3luY0RlcGVuZGVuY2llcygpIHsKCgkJaWYoIGFzeW5jRGVwZW5kZW5jaWVzLmxlbmd0aCApIHsKCQkJYXN5bmNEZXBlbmRlbmNpZXMuZm9yRWFjaCggZnVuY3Rpb24oIHMgKSB7CgkJCQlsb2FkU2NyaXB0KCBzLnNyYywgcy5jYWxsYmFjayApOwoJCQl9ICk7CgkJfQoKCQlzdGFydCgpOwoKCX0KCgkvKioKCSAqIExvYWRzIGEgSmF2YVNjcmlwdCBmaWxlIGZyb20gdGhlIGdpdmVuIFVSTCBhbmQgZXhlY3V0ZXMgaXQuCgkgKgoJICogQHBhcmFtIHtzdHJpbmd9IHVybCBBZGRyZXNzIG9mIHRoZSAuanMgZmlsZSB0byBsb2FkCgkgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayBNZXRob2QgdG8gaW52b2tlIHdoZW4gdGhlIHNjcmlwdAoJICogaGFzIGxvYWRlZCBhbmQgZXhlY3V0ZWQKCSAqLwoJZnVuY3Rpb24gbG9hZFNjcmlwdCggdXJsLCBjYWxsYmFjayApIHsKCgkJdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdzY3JpcHQnICk7CgkJc2NyaXB0LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsKCQlzY3JpcHQuYXN5bmMgPSBmYWxzZTsKCQlzY3JpcHQuZGVmZXIgPSBmYWxzZTsKCQlzY3JpcHQuc3JjID0gdXJsOwoKCQlpZiggY2FsbGJhY2sgKSB7CgoJCQkvLyBTdWNjZXNzIGNhbGxiYWNrCgkJCXNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJaWYoIGV2ZW50LnR5cGUgPT09ICJsb2FkIiB8fCAoL2xvYWRlZHxjb21wbGV0ZS8udGVzdCggc2NyaXB0LnJlYWR5U3RhdGUgKSApICkgewoKCQkJCQkvLyBLaWxsIGV2ZW50IGxpc3RlbmVycwoJCQkJCXNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gc2NyaXB0Lm9uZXJyb3IgPSBudWxsOwoKCQkJCQljYWxsYmFjaygpOwoKCQkJCX0KCQkJfTsKCgkJCS8vIEVycm9yIGNhbGxiYWNrCgkJCXNjcmlwdC5vbmVycm9yID0gZnVuY3Rpb24oIGVyciApIHsKCgkJCQkvLyBLaWxsIGV2ZW50IGxpc3RlbmVycwoJCQkJc2NyaXB0Lm9ubG9hZCA9IHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBzY3JpcHQub25lcnJvciA9IG51bGw7CgoJCQkJY2FsbGJhY2soIG5ldyBFcnJvciggJ0ZhaWxlZCBsb2FkaW5nIHNjcmlwdDogJyArIHNjcmlwdC5zcmMgKyAnXG4nICsgZXJyKSApOwoKCQkJfTsKCgkJfQoKCQkvLyBBcHBlbmQgdGhlIHNjcmlwdCBhdCB0aGUgZW5kIG9mIDxoZWFkPgoJCXZhciBoZWFkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJ2hlYWQnICk7CgkJaGVhZC5pbnNlcnRCZWZvcmUoIHNjcmlwdCwgaGVhZC5sYXN0Q2hpbGQgKTsKCgl9CgoJLyoqCgkgKiBTdGFydHMgdXAgcmV2ZWFsLmpzIGJ5IGJpbmRpbmcgaW5wdXQgZXZlbnRzIGFuZCBuYXZpZ2F0aW5nCgkgKiB0byB0aGUgY3VycmVudCBVUkwgZGVlcGxpbmsgaWYgdGhlcmUgaXMgb25lLgoJICovCglmdW5jdGlvbiBzdGFydCgpIHsKCgkJbG9hZGVkID0gdHJ1ZTsKCgkJLy8gTWFrZSBzdXJlIHdlJ3ZlIGdvdCBhbGwgdGhlIERPTSBlbGVtZW50cyB3ZSBuZWVkCgkJc2V0dXBET00oKTsKCgkJLy8gTGlzdGVuIHRvIG1lc3NhZ2VzIHBvc3RlZCB0byB0aGlzIHdpbmRvdwoJCXNldHVwUG9zdE1lc3NhZ2UoKTsKCgkJLy8gUHJldmVudCB0aGUgc2xpZGVzIGZyb20gYmVpbmcgc2Nyb2xsZWQgb3V0IG9mIHZpZXcKCQlzZXR1cFNjcm9sbFByZXZlbnRpb24oKTsKCgkJLy8gUmVzZXRzIGFsbCB2ZXJ0aWNhbCBzbGlkZXMgc28gdGhhdCBvbmx5IHRoZSBmaXJzdCBpcyB2aXNpYmxlCgkJcmVzZXRWZXJ0aWNhbFNsaWRlcygpOwoKCQkvLyBVcGRhdGVzIHRoZSBwcmVzZW50YXRpb24gdG8gbWF0Y2ggdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiB2YWx1ZXMKCQljb25maWd1cmUoKTsKCgkJLy8gUmVhZCB0aGUgaW5pdGlhbCBoYXNoCgkJcmVhZFVSTCgpOwoKCQkvLyBVcGRhdGUgYWxsIGJhY2tncm91bmRzCgkJdXBkYXRlQmFja2dyb3VuZCggdHJ1ZSApOwoKCQkvLyBOb3RpZnkgbGlzdGVuZXJzIHRoYXQgdGhlIHByZXNlbnRhdGlvbiBpcyByZWFkeSBidXQgdXNlIGEgMW1zCgkJLy8gdGltZW91dCB0byBlbnN1cmUgaXQncyBub3QgZmlyZWQgc3luY2hyb25vdXNseSBhZnRlciAjaW5pdGlhbGl6ZSgpCgkJc2V0VGltZW91dCggZnVuY3Rpb24oKSB7CgkJCS8vIEVuYWJsZSB0cmFuc2l0aW9ucyBub3cgdGhhdCB3ZSdyZSBsb2FkZWQKCQkJZG9tLnNsaWRlcy5jbGFzc0xpc3QucmVtb3ZlKCAnbm8tdHJhbnNpdGlvbicgKTsKCgkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5hZGQoICdyZWFkeScgKTsKCgkJCWRpc3BhdGNoRXZlbnQoICdyZWFkeScsIHsKCQkJCSdpbmRleGgnOiBpbmRleGgsCgkJCQknaW5kZXh2JzogaW5kZXh2LAoJCQkJJ2N1cnJlbnRTbGlkZSc6IGN1cnJlbnRTbGlkZQoJCQl9ICk7CgkJfSwgMSApOwoKCQkvLyBTcGVjaWFsIHNldHVwIGFuZCBjb25maWcgaXMgcmVxdWlyZWQgd2hlbiBwcmludGluZyB0byBQREYKCQlpZiggaXNQcmludGluZ1BERigpICkgewoJCQlyZW1vdmVFdmVudExpc3RlbmVycygpOwoKCQkJLy8gVGhlIGRvY3VtZW50IG5lZWRzIHRvIGhhdmUgbG9hZGVkIGZvciB0aGUgUERGIGxheW91dAoJCQkvLyBtZWFzdXJlbWVudHMgdG8gYmUgYWNjdXJhdGUKCQkJaWYoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScgKSB7CgkJCQlzZXR1cFBERigpOwoJCQl9CgkJCWVsc2UgewoJCQkJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICdsb2FkJywgc2V0dXBQREYgKTsKCQkJfQoJCX0KCgl9CgoJLyoqCgkgKiBGaW5kcyBhbmQgc3RvcmVzIHJlZmVyZW5jZXMgdG8gRE9NIGVsZW1lbnRzIHdoaWNoIGFyZQoJICogcmVxdWlyZWQgYnkgdGhlIHByZXNlbnRhdGlvbi4gSWYgYSByZXF1aXJlZCBlbGVtZW50IGlzCgkgKiBub3QgZm91bmQsIGl0IGlzIGNyZWF0ZWQuCgkgKi8KCWZ1bmN0aW9uIHNldHVwRE9NKCkgewoKCQkvLyBQcmV2ZW50IHRyYW5zaXRpb25zIHdoaWxlIHdlJ3JlIGxvYWRpbmcKCQlkb20uc2xpZGVzLmNsYXNzTGlzdC5hZGQoICduby10cmFuc2l0aW9uJyApOwoKCQlpZiggaXNNb2JpbGVEZXZpY2UgKSB7CgkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5hZGQoICduby1ob3ZlcicgKTsKCQl9CgkJZWxzZSB7CgkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoICduby1ob3ZlcicgKTsKCQl9CgoJCWlmKCAvaXBob25lL2dpLnRlc3QoIFVBICkgKSB7CgkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5hZGQoICd1YS1pcGhvbmUnICk7CgkJfQoJCWVsc2UgewoJCQlkb20ud3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCAndWEtaXBob25lJyApOwoJCX0KCgkJLy8gQmFja2dyb3VuZCBlbGVtZW50CgkJZG9tLmJhY2tncm91bmQgPSBjcmVhdGVTaW5nbGV0b25Ob2RlKCBkb20ud3JhcHBlciwgJ2RpdicsICdiYWNrZ3JvdW5kcycsIG51bGwgKTsKCgkJLy8gUHJvZ3Jlc3MgYmFyCgkJZG9tLnByb2dyZXNzID0gY3JlYXRlU2luZ2xldG9uTm9kZSggZG9tLndyYXBwZXIsICdkaXYnLCAncHJvZ3Jlc3MnLCAnPHNwYW4+PC9zcGFuPicgKTsKCQlkb20ucHJvZ3Jlc3NiYXIgPSBkb20ucHJvZ3Jlc3MucXVlcnlTZWxlY3RvciggJ3NwYW4nICk7CgoJCS8vIEFycm93IGNvbnRyb2xzCgkJZG9tLmNvbnRyb2xzID0gY3JlYXRlU2luZ2xldG9uTm9kZSggZG9tLndyYXBwZXIsICdhc2lkZScsICdjb250cm9scycsCgkJCSc8YnV0dG9uIGNsYXNzPSJuYXZpZ2F0ZS1sZWZ0IiBhcmlhLWxhYmVsPSJwcmV2aW91cyBzbGlkZSI+PGRpdiBjbGFzcz0iY29udHJvbHMtYXJyb3ciPjwvZGl2PjwvYnV0dG9uPicgKwoJCQknPGJ1dHRvbiBjbGFzcz0ibmF2aWdhdGUtcmlnaHQiIGFyaWEtbGFiZWw9Im5leHQgc2xpZGUiPjxkaXYgY2xhc3M9ImNvbnRyb2xzLWFycm93Ij48L2Rpdj48L2J1dHRvbj4nICsKCQkJJzxidXR0b24gY2xhc3M9Im5hdmlnYXRlLXVwIiBhcmlhLWxhYmVsPSJhYm92ZSBzbGlkZSI+PGRpdiBjbGFzcz0iY29udHJvbHMtYXJyb3ciPjwvZGl2PjwvYnV0dG9uPicgKwoJCQknPGJ1dHRvbiBjbGFzcz0ibmF2aWdhdGUtZG93biIgYXJpYS1sYWJlbD0iYmVsb3cgc2xpZGUiPjxkaXYgY2xhc3M9ImNvbnRyb2xzLWFycm93Ij48L2Rpdj48L2J1dHRvbj4nICk7CgoJCS8vIFNsaWRlIG51bWJlcgoJCWRvbS5zbGlkZU51bWJlciA9IGNyZWF0ZVNpbmdsZXRvbk5vZGUoIGRvbS53cmFwcGVyLCAnZGl2JywgJ3NsaWRlLW51bWJlcicsICcnICk7CgoJCS8vIEVsZW1lbnQgY29udGFpbmluZyBub3RlcyB0aGF0IGFyZSB2aXNpYmxlIHRvIHRoZSBhdWRpZW5jZQoJCWRvbS5zcGVha2VyTm90ZXMgPSBjcmVhdGVTaW5nbGV0b25Ob2RlKCBkb20ud3JhcHBlciwgJ2RpdicsICdzcGVha2VyLW5vdGVzJywgbnVsbCApOwoJCWRvbS5zcGVha2VyTm90ZXMuc2V0QXR0cmlidXRlKCAnZGF0YS1wcmV2ZW50LXN3aXBlJywgJycgKTsKCQlkb20uc3BlYWtlck5vdGVzLnNldEF0dHJpYnV0ZSggJ3RhYmluZGV4JywgJzAnICk7CgoJCS8vIE92ZXJsYXkgZ3JhcGhpYyB3aGljaCBpcyBkaXNwbGF5ZWQgZHVyaW5nIHRoZSBwYXVzZWQgbW9kZQoJCWRvbS5wYXVzZU92ZXJsYXkgPSBjcmVhdGVTaW5nbGV0b25Ob2RlKCBkb20ud3JhcHBlciwgJ2RpdicsICdwYXVzZS1vdmVybGF5JywgY29uZmlnLmNvbnRyb2xzID8gJzxidXR0b24gY2xhc3M9InJlc3VtZS1idXR0b24iPlJlc3VtZSBwcmVzZW50YXRpb248L2J1dHRvbj4nIDogbnVsbCApOwoKCQlkb20ud3JhcHBlci5zZXRBdHRyaWJ1dGUoICdyb2xlJywgJ2FwcGxpY2F0aW9uJyApOwoKCQkvLyBUaGVyZSBjYW4gYmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIGNvbnRyb2xzIHRocm91Z2hvdXQgdGhlIHBhZ2UKCQlkb20uY29udHJvbHNMZWZ0ID0gdG9BcnJheSggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJy5uYXZpZ2F0ZS1sZWZ0JyApICk7CgkJZG9tLmNvbnRyb2xzUmlnaHQgPSB0b0FycmF5KCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnLm5hdmlnYXRlLXJpZ2h0JyApICk7CgkJZG9tLmNvbnRyb2xzVXAgPSB0b0FycmF5KCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnLm5hdmlnYXRlLXVwJyApICk7CgkJZG9tLmNvbnRyb2xzRG93biA9IHRvQXJyYXkoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICcubmF2aWdhdGUtZG93bicgKSApOwoJCWRvbS5jb250cm9sc1ByZXYgPSB0b0FycmF5KCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnLm5hdmlnYXRlLXByZXYnICkgKTsKCQlkb20uY29udHJvbHNOZXh0ID0gdG9BcnJheSggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJy5uYXZpZ2F0ZS1uZXh0JyApICk7CgoJCS8vIFRoZSByaWdodCBhbmQgZG93biBhcnJvd3MgaW4gdGhlIHN0YW5kYXJkIHJldmVhbC5qcyBjb250cm9scwoJCWRvbS5jb250cm9sc1JpZ2h0QXJyb3cgPSBkb20uY29udHJvbHMucXVlcnlTZWxlY3RvciggJy5uYXZpZ2F0ZS1yaWdodCcgKTsKCQlkb20uY29udHJvbHNEb3duQXJyb3cgPSBkb20uY29udHJvbHMucXVlcnlTZWxlY3RvciggJy5uYXZpZ2F0ZS1kb3duJyApOwoKCQlkb20uc3RhdHVzRGl2ID0gY3JlYXRlU3RhdHVzRGl2KCk7Cgl9CgoJLyoqCgkgKiBDcmVhdGVzIGEgaGlkZGVuIGRpdiB3aXRoIHJvbGUgYXJpYS1saXZlIHRvIGFubm91bmNlIHRoZQoJICogY3VycmVudCBzbGlkZSBjb250ZW50LiBIaWRlIHRoZSBkaXYgb2ZmLXNjcmVlbiB0byBtYWtlIGl0CgkgKiBhdmFpbGFibGUgb25seSB0byBBc3Npc3RpdmUgVGVjaG5vbG9naWVzLgoJICoKCSAqIEByZXR1cm4ge0hUTUxFbGVtZW50fQoJICovCglmdW5jdGlvbiBjcmVhdGVTdGF0dXNEaXYoKSB7CgoJCXZhciBzdGF0dXNEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ2FyaWEtc3RhdHVzLWRpdicgKTsKCQlpZiggIXN0YXR1c0RpdiApIHsKCQkJc3RhdHVzRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicgKTsKCQkJc3RhdHVzRGl2LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKCQkJc3RhdHVzRGl2LnN0eWxlLmhlaWdodCA9ICcxcHgnOwoJCQlzdGF0dXNEaXYuc3R5bGUud2lkdGggPSAnMXB4JzsKCQkJc3RhdHVzRGl2LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7CgkJCXN0YXR1c0Rpdi5zdHlsZS5jbGlwID0gJ3JlY3QoIDFweCwgMXB4LCAxcHgsIDFweCApJzsKCQkJc3RhdHVzRGl2LnNldEF0dHJpYnV0ZSggJ2lkJywgJ2FyaWEtc3RhdHVzLWRpdicgKTsKCQkJc3RhdHVzRGl2LnNldEF0dHJpYnV0ZSggJ2FyaWEtbGl2ZScsICdwb2xpdGUnICk7CgkJCXN0YXR1c0Rpdi5zZXRBdHRyaWJ1dGUoICdhcmlhLWF0b21pYycsJ3RydWUnICk7CgkJCWRvbS53cmFwcGVyLmFwcGVuZENoaWxkKCBzdGF0dXNEaXYgKTsKCQl9CgkJcmV0dXJuIHN0YXR1c0RpdjsKCgl9CgoJLyoqCgkgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gSFRNTCBlbGVtZW50IGludG8gYSBzdHJpbmcgb2YgdGV4dAoJICogdGhhdCBjYW4gYmUgYW5ub3VuY2VkIHRvIGEgc2NyZWVuIHJlYWRlci4gSGlkZGVuCgkgKiBlbGVtZW50cyBhcmUgZXhjbHVkZWQuCgkgKi8KCWZ1bmN0aW9uIGdldFN0YXR1c1RleHQoIG5vZGUgKSB7CgoJCXZhciB0ZXh0ID0gJyc7CgoJCS8vIFRleHQgbm9kZQoJCWlmKCBub2RlLm5vZGVUeXBlID09PSAzICkgewoJCQl0ZXh0ICs9IG5vZGUudGV4dENvbnRlbnQ7CgkJfQoJCS8vIEVsZW1lbnQgbm9kZQoJCWVsc2UgaWYoIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7CgoJCQl2YXIgaXNBcmlhSGlkZGVuID0gbm9kZS5nZXRBdHRyaWJ1dGUoICdhcmlhLWhpZGRlbicgKTsKCQkJdmFyIGlzRGlzcGxheUhpZGRlbiA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBub2RlIClbJ2Rpc3BsYXknXSA9PT0gJ25vbmUnOwoJCQlpZiggaXNBcmlhSGlkZGVuICE9PSAndHJ1ZScgJiYgIWlzRGlzcGxheUhpZGRlbiApIHsKCgkJCQl0b0FycmF5KCBub2RlLmNoaWxkTm9kZXMgKS5mb3JFYWNoKCBmdW5jdGlvbiggY2hpbGQgKSB7CgkJCQkJdGV4dCArPSBnZXRTdGF0dXNUZXh0KCBjaGlsZCApOwoJCQkJfSApOwoKCQkJfQoKCQl9CgoJCXJldHVybiB0ZXh0OwoKCX0KCgkvKioKCSAqIENvbmZpZ3VyZXMgdGhlIHByZXNlbnRhdGlvbiBmb3IgcHJpbnRpbmcgdG8gYSBzdGF0aWMKCSAqIFBERi4KCSAqLwoJZnVuY3Rpb24gc2V0dXBQREYoKSB7CgoJCXZhciBzbGlkZVNpemUgPSBnZXRDb21wdXRlZFNsaWRlU2l6ZSggd2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodCApOwoKCQkvLyBEaW1lbnNpb25zIG9mIHRoZSBQREYgcGFnZXMKCQl2YXIgcGFnZVdpZHRoID0gTWF0aC5mbG9vciggc2xpZGVTaXplLndpZHRoICogKCAxICsgY29uZmlnLm1hcmdpbiApICksCgkJCXBhZ2VIZWlnaHQgPSBNYXRoLmZsb29yKCBzbGlkZVNpemUuaGVpZ2h0ICogKCAxICsgY29uZmlnLm1hcmdpbiApICk7CgoJCS8vIERpbWVuc2lvbnMgb2Ygc2xpZGVzIHdpdGhpbiB0aGUgcGFnZXMKCQl2YXIgc2xpZGVXaWR0aCA9IHNsaWRlU2l6ZS53aWR0aCwKCQkJc2xpZGVIZWlnaHQgPSBzbGlkZVNpemUuaGVpZ2h0OwoKCQkvLyBMZXQgdGhlIGJyb3dzZXIga25vdyB3aGF0IHBhZ2Ugc2l6ZSB3ZSB3YW50IHRvIHByaW50CgkJaW5qZWN0U3R5bGVTaGVldCggJ0BwYWdle3NpemU6JysgcGFnZVdpZHRoICsncHggJysgcGFnZUhlaWdodCArJ3B4OyBtYXJnaW46IDBweDt9JyApOwoKCQkvLyBMaW1pdCB0aGUgc2l6ZSBvZiBjZXJ0YWluIGVsZW1lbnRzIHRvIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBzbGlkZQoJCWluamVjdFN0eWxlU2hlZXQoICcucmV2ZWFsIHNlY3Rpb24+aW1nLCAucmV2ZWFsIHNlY3Rpb24+dmlkZW8sIC5yZXZlYWwgc2VjdGlvbj5pZnJhbWV7bWF4LXdpZHRoOiAnKyBzbGlkZVdpZHRoICsncHg7IG1heC1oZWlnaHQ6Jysgc2xpZGVIZWlnaHQgKydweH0nICk7CgoJCWRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCggJ3ByaW50LXBkZicgKTsKCQlkb2N1bWVudC5ib2R5LnN0eWxlLndpZHRoID0gcGFnZVdpZHRoICsgJ3B4JzsKCQlkb2N1bWVudC5ib2R5LnN0eWxlLmhlaWdodCA9IHBhZ2VIZWlnaHQgKyAncHgnOwoKCQkvLyBNYWtlIHN1cmUgc3RyZXRjaCBlbGVtZW50cyBmaXQgb24gc2xpZGUKCQlsYXlvdXRTbGlkZUNvbnRlbnRzKCBzbGlkZVdpZHRoLCBzbGlkZUhlaWdodCApOwoKCQkvLyBBZGQgZWFjaCBzbGlkZSdzIGluZGV4IGFzIGF0dHJpYnV0ZXMgb24gaXRzZWxmLCB3ZSBuZWVkIHRoZXNlCgkJLy8gaW5kaWNlcyB0byBnZW5lcmF0ZSBzbGlkZSBudW1iZXJzIGJlbG93CgkJdG9BcnJheSggZG9tLndyYXBwZXIucXVlcnlTZWxlY3RvckFsbCggSE9SSVpPTlRBTF9TTElERVNfU0VMRUNUT1IgKSApLmZvckVhY2goIGZ1bmN0aW9uKCBoc2xpZGUsIGggKSB7CgkJCWhzbGlkZS5zZXRBdHRyaWJ1dGUoICdkYXRhLWluZGV4LWgnLCBoICk7CgoJCQlpZiggaHNsaWRlLmNsYXNzTGlzdC5jb250YWlucyggJ3N0YWNrJyApICkgewoJCQkJdG9BcnJheSggaHNsaWRlLnF1ZXJ5U2VsZWN0b3JBbGwoICdzZWN0aW9uJyApICkuZm9yRWFjaCggZnVuY3Rpb24oIHZzbGlkZSwgdiApIHsKCQkJCQl2c2xpZGUuc2V0QXR0cmlidXRlKCAnZGF0YS1pbmRleC1oJywgaCApOwoJCQkJCXZzbGlkZS5zZXRBdHRyaWJ1dGUoICdkYXRhLWluZGV4LXYnLCB2ICk7CgkJCQl9ICk7CgkJCX0KCQl9ICk7CgoJCS8vIFNsaWRlIGFuZCBzbGlkZSBiYWNrZ3JvdW5kIGxheW91dAoJCXRvQXJyYXkoIGRvbS53cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoIFNMSURFU19TRUxFQ1RPUiApICkuZm9yRWFjaCggZnVuY3Rpb24oIHNsaWRlICkgewoKCQkJLy8gVmVydGljYWwgc3RhY2tzIGFyZSBub3QgY2VudHJlZCBzaW5jZSB0aGVpciBzZWN0aW9uCgkJCS8vIGNoaWxkcmVuIHdpbGwgYmUKCQkJaWYoIHNsaWRlLmNsYXNzTGlzdC5jb250YWlucyggJ3N0YWNrJyApID09PSBmYWxzZSApIHsKCQkJCS8vIENlbnRlciB0aGUgc2xpZGUgaW5zaWRlIG9mIHRoZSBwYWdlLCBnaXZpbmcgdGhlIHNsaWRlIHNvbWUgbWFyZ2luCgkJCQl2YXIgbGVmdCA9ICggcGFnZVdpZHRoIC0gc2xpZGVXaWR0aCApIC8gMiwKCQkJCQl0b3AgPSAoIHBhZ2VIZWlnaHQgLSBzbGlkZUhlaWdodCApIC8gMjsKCgkJCQl2YXIgY29udGVudEhlaWdodCA9IHNsaWRlLnNjcm9sbEhlaWdodDsKCQkJCXZhciBudW1iZXJPZlBhZ2VzID0gTWF0aC5tYXgoIE1hdGguY2VpbCggY29udGVudEhlaWdodCAvIHBhZ2VIZWlnaHQgKSwgMSApOwoKCQkJCS8vIEFkaGVyZSB0byBjb25maWd1cmVkIHBhZ2VzIHBlciBzbGlkZSBsaW1pdAoJCQkJbnVtYmVyT2ZQYWdlcyA9IE1hdGgubWluKCBudW1iZXJPZlBhZ2VzLCBjb25maWcucGRmTWF4UGFnZXNQZXJTbGlkZSApOwoKCQkJCS8vIENlbnRlciBzbGlkZXMgdmVydGljYWxseQoJCQkJaWYoIG51bWJlck9mUGFnZXMgPT09IDEgJiYgY29uZmlnLmNlbnRlciB8fCBzbGlkZS5jbGFzc0xpc3QuY29udGFpbnMoICdjZW50ZXInICkgKSB7CgkJCQkJdG9wID0gTWF0aC5tYXgoICggcGFnZUhlaWdodCAtIGNvbnRlbnRIZWlnaHQgKSAvIDIsIDAgKTsKCQkJCX0KCgkJCQkvLyBXcmFwIHRoZSBzbGlkZSBpbiBhIHBhZ2UgZWxlbWVudCBhbmQgaGlkZSBpdHMgb3ZlcmZsb3cKCQkJCS8vIHNvIHRoYXQgbm8gcGFnZSBldmVyIGZsb3dzIG9udG8gYW5vdGhlcgoJCQkJdmFyIHBhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnZGl2JyApOwoJCQkJcGFnZS5jbGFzc05hbWUgPSAncGRmLXBhZ2UnOwoJCQkJcGFnZS5zdHlsZS5oZWlnaHQgPSAoICggcGFnZUhlaWdodCArIGNvbmZpZy5wZGZQYWdlSGVpZ2h0T2Zmc2V0ICkgKiBudW1iZXJPZlBhZ2VzICkgKyAncHgnOwoJCQkJc2xpZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIHBhZ2UsIHNsaWRlICk7CgkJCQlwYWdlLmFwcGVuZENoaWxkKCBzbGlkZSApOwoKCQkJCS8vIFBvc2l0aW9uIHRoZSBzbGlkZSBpbnNpZGUgb2YgdGhlIHBhZ2UKCQkJCXNsaWRlLnN0eWxlLmxlZnQgPSBsZWZ0ICsgJ3B4JzsKCQkJCXNsaWRlLnN0eWxlLnRvcCA9IHRvcCArICdweCc7CgkJCQlzbGlkZS5zdHlsZS53aWR0aCA9IHNsaWRlV2lkdGggKyAncHgnOwoKCQkJCWlmKCBzbGlkZS5zbGlkZUJhY2tncm91bmRFbGVtZW50ICkgewoJCQkJCXBhZ2UuaW5zZXJ0QmVmb3JlKCBzbGlkZS5zbGlkZUJhY2tncm91bmRFbGVtZW50LCBzbGlkZSApOwoJCQkJfQoKCQkJCS8vIEluamVjdCBub3RlcyBpZiBgc2hvd05vdGVzYCBpcyBlbmFibGVkCgkJCQlpZiggY29uZmlnLnNob3dOb3RlcyApIHsKCgkJCQkJLy8gQXJlIHRoZXJlIG5vdGVzIGZvciB0aGlzIHNsaWRlPwoJCQkJCXZhciBub3RlcyA9IGdldFNsaWRlTm90ZXMoIHNsaWRlICk7CgkJCQkJaWYoIG5vdGVzICkgewoKCQkJCQkJdmFyIG5vdGVzU3BhY2luZyA9IDg7CgkJCQkJCXZhciBub3Rlc0xheW91dCA9IHR5cGVvZiBjb25maWcuc2hvd05vdGVzID09PSAnc3RyaW5nJyA/IGNvbmZpZy5zaG93Tm90ZXMgOiAnaW5saW5lJzsKCQkJCQkJdmFyIG5vdGVzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdkaXYnICk7CgkJCQkJCW5vdGVzRWxlbWVudC5jbGFzc0xpc3QuYWRkKCAnc3BlYWtlci1ub3RlcycgKTsKCQkJCQkJbm90ZXNFbGVtZW50LmNsYXNzTGlzdC5hZGQoICdzcGVha2VyLW5vdGVzLXBkZicgKTsKCQkJCQkJbm90ZXNFbGVtZW50LnNldEF0dHJpYnV0ZSggJ2RhdGEtbGF5b3V0Jywgbm90ZXNMYXlvdXQgKTsKCQkJCQkJbm90ZXNFbGVtZW50LmlubmVySFRNTCA9IG5vdGVzOwoKCQkJCQkJaWYoIG5vdGVzTGF5b3V0ID09PSAnc2VwYXJhdGUtcGFnZScgKSB7CgkJCQkJCQlwYWdlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBub3Rlc0VsZW1lbnQsIHBhZ2UubmV4dFNpYmxpbmcgKTsKCQkJCQkJfQoJCQkJCQllbHNlIHsKCQkJCQkJCW5vdGVzRWxlbWVudC5zdHlsZS5sZWZ0ID0gbm90ZXNTcGFjaW5nICsgJ3B4JzsKCQkJCQkJCW5vdGVzRWxlbWVudC5zdHlsZS5ib3R0b20gPSBub3Rlc1NwYWNpbmcgKyAncHgnOwoJCQkJCQkJbm90ZXNFbGVtZW50LnN0eWxlLndpZHRoID0gKCBwYWdlV2lkdGggLSBub3Rlc1NwYWNpbmcqMiApICsgJ3B4JzsKCQkJCQkJCXBhZ2UuYXBwZW5kQ2hpbGQoIG5vdGVzRWxlbWVudCApOwoJCQkJCQl9CgoJCQkJCX0KCgkJCQl9CgoJCQkJLy8gSW5qZWN0IHNsaWRlIG51bWJlcnMgaWYgYHNsaWRlTnVtYmVyc2AgYXJlIGVuYWJsZWQKCQkJCWlmKCBjb25maWcuc2xpZGVOdW1iZXIgJiYgL2FsbHxwcmludC9pLnRlc3QoIGNvbmZpZy5zaG93U2xpZGVOdW1iZXIgKSApIHsKCQkJCQl2YXIgc2xpZGVOdW1iZXJIID0gcGFyc2VJbnQoIHNsaWRlLmdldEF0dHJpYnV0ZSggJ2RhdGEtaW5kZXgtaCcgKSwgMTAgKSArIDEsCgkJCQkJCXNsaWRlTnVtYmVyViA9IHBhcnNlSW50KCBzbGlkZS5nZXRBdHRyaWJ1dGUoICdkYXRhLWluZGV4LXYnICksIDEwICkgKyAxOwoKCQkJCQl2YXIgbnVtYmVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdkaXYnICk7CgkJCQkJbnVtYmVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKCAnc2xpZGUtbnVtYmVyJyApOwoJCQkJCW51bWJlckVsZW1lbnQuY2xhc3NMaXN0LmFkZCggJ3NsaWRlLW51bWJlci1wZGYnICk7CgkJCQkJbnVtYmVyRWxlbWVudC5pbm5lckhUTUwgPSBmb3JtYXRTbGlkZU51bWJlciggc2xpZGVOdW1iZXJILCAnLicsIHNsaWRlTnVtYmVyViApOwoJCQkJCXBhZ2UuYXBwZW5kQ2hpbGQoIG51bWJlckVsZW1lbnQgKTsKCQkJCX0KCgkJCQkvLyBDb3B5IHBhZ2UgYW5kIHNob3cgZnJhZ21lbnRzIG9uZSBhZnRlciBhbm90aGVyCgkJCQlpZiggY29uZmlnLnBkZlNlcGFyYXRlRnJhZ21lbnRzICkgewoKCQkJCQkvLyBFYWNoIGZyYWdtZW50ICdncm91cCcgaXMgYW4gYXJyYXkgY29udGFpbmluZyBvbmUgb3IgbW9yZQoJCQkJCS8vIGZyYWdtZW50cy4gTXVsdGlwbGUgZnJhZ21lbnRzIHRoYXQgYXBwZWFyIGF0IHRoZSBzYW1lIHRpbWUKCQkJCQkvLyBhcmUgcGFydCBvZiB0aGUgc2FtZSBncm91cC4KCQkJCQl2YXIgZnJhZ21lbnRHcm91cHMgPSBzb3J0RnJhZ21lbnRzKCBwYWdlLnF1ZXJ5U2VsZWN0b3JBbGwoICcuZnJhZ21lbnQnICksIHRydWUgKTsKCgkJCQkJdmFyIHByZXZpb3VzRnJhZ21lbnRTdGVwOwoJCQkJCXZhciBwcmV2aW91c1BhZ2U7CgoJCQkJCWZyYWdtZW50R3JvdXBzLmZvckVhY2goIGZ1bmN0aW9uKCBmcmFnbWVudHMgKSB7CgoJCQkJCQkvLyBSZW1vdmUgJ2N1cnJlbnQtZnJhZ21lbnQnIGZyb20gdGhlIHByZXZpb3VzIGdyb3VwCgkJCQkJCWlmKCBwcmV2aW91c0ZyYWdtZW50U3RlcCApIHsKCQkJCQkJCXByZXZpb3VzRnJhZ21lbnRTdGVwLmZvckVhY2goIGZ1bmN0aW9uKCBmcmFnbWVudCApIHsKCQkJCQkJCQlmcmFnbWVudC5jbGFzc0xpc3QucmVtb3ZlKCAnY3VycmVudC1mcmFnbWVudCcgKTsKCQkJCQkJCX0gKTsKCQkJCQkJfQoKCQkJCQkJLy8gU2hvdyB0aGUgZnJhZ21lbnRzIGZvciB0aGUgY3VycmVudCBpbmRleAoJCQkJCQlmcmFnbWVudHMuZm9yRWFjaCggZnVuY3Rpb24oIGZyYWdtZW50ICkgewoJCQkJCQkJZnJhZ21lbnQuY2xhc3NMaXN0LmFkZCggJ3Zpc2libGUnLCAnY3VycmVudC1mcmFnbWVudCcgKTsKCQkJCQkJfSApOwoKCQkJCQkJLy8gQ3JlYXRlIGEgc2VwYXJhdGUgcGFnZSBmb3IgdGhlIGN1cnJlbnQgZnJhZ21lbnQgc3RhdGUKCQkJCQkJdmFyIGNsb25lZFBhZ2UgPSBwYWdlLmNsb25lTm9kZSggdHJ1ZSApOwoJCQkJCQlwYWdlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBjbG9uZWRQYWdlLCAoIHByZXZpb3VzUGFnZSB8fCBwYWdlICkubmV4dFNpYmxpbmcgKTsKCgkJCQkJCXByZXZpb3VzRnJhZ21lbnRTdGVwID0gZnJhZ21lbnRzOwoJCQkJCQlwcmV2aW91c1BhZ2UgPSBjbG9uZWRQYWdlOwoKCQkJCQl9ICk7CgoJCQkJCS8vIFJlc2V0IHRoZSBmaXJzdC9vcmlnaW5hbCBwYWdlIHNvIHRoYXQgYWxsIGZyYWdtZW50cyBhcmUgaGlkZGVuCgkJCQkJZnJhZ21lbnRHcm91cHMuZm9yRWFjaCggZnVuY3Rpb24oIGZyYWdtZW50cyApIHsKCQkJCQkJZnJhZ21lbnRzLmZvckVhY2goIGZ1bmN0aW9uKCBmcmFnbWVudCApIHsKCQkJCQkJCWZyYWdtZW50LmNsYXNzTGlzdC5yZW1vdmUoICd2aXNpYmxlJywgJ2N1cnJlbnQtZnJhZ21lbnQnICk7CgkJCQkJCX0gKTsKCQkJCQl9ICk7CgoJCQkJfQoJCQkJLy8gU2hvdyBhbGwgZnJhZ21lbnRzCgkJCQllbHNlIHsKCQkJCQl0b0FycmF5KCBwYWdlLnF1ZXJ5U2VsZWN0b3JBbGwoICcuZnJhZ21lbnQ6bm90KC5mYWRlLW91dCknICkgKS5mb3JFYWNoKCBmdW5jdGlvbiggZnJhZ21lbnQgKSB7CgkJCQkJCWZyYWdtZW50LmNsYXNzTGlzdC5hZGQoICd2aXNpYmxlJyApOwoJCQkJCX0gKTsKCQkJCX0KCgkJCX0KCgkJfSApOwoKCQkvLyBOb3RpZnkgc3Vic2NyaWJlcnMgdGhhdCB0aGUgUERGIGxheW91dCBpcyBnb29kIHRvIGdvCgkJZGlzcGF0Y2hFdmVudCggJ3BkZi1yZWFkeScgKTsKCgl9CgoJLyoqCgkgKiBUaGlzIGlzIGFuIHVuZm9ydHVuYXRlIG5lY2Vzc2l0eS4gU29tZSBhY3Rpb25zIOKAkyBzdWNoIGFzCgkgKiBhbiBpbnB1dCBmaWVsZCBiZWluZyBmb2N1c2VkIGluIGFuIGlmcmFtZSBvciB1c2luZyB0aGUKCSAqIGtleWJvYXJkIHRvIGV4cGFuZCB0ZXh0IHNlbGVjdGlvbiBiZXlvbmQgdGhlIGJvdW5kcyBvZgoJICogYSBzbGlkZSDigJMgY2FuIHRyaWdnZXIgb3VyIGNvbnRlbnQgdG8gYmUgcHVzaGVkIG91dCBvZiB2aWV3LgoJICogVGhpcyBzY3JvbGxpbmcgY2FuIG5vdCBiZSBwcmV2ZW50ZWQgYnkgaGlkaW5nIG92ZXJmbG93IGluCgkgKiBDU1MgKHdlIGFscmVhZHkgZG8pIHNvIHdlIGhhdmUgdG8gcmVzb3J0IHRvIHJlcGVhdGVkbHkKCSAqIGNoZWNraW5nIGlmIHRoZSBzbGlkZXMgaGF2ZSBiZWVuIG9mZnNldCA6KAoJICovCglmdW5jdGlvbiBzZXR1cFNjcm9sbFByZXZlbnRpb24oKSB7CgoJCXNldEludGVydmFsKCBmdW5jdGlvbigpIHsKCQkJaWYoIGRvbS53cmFwcGVyLnNjcm9sbFRvcCAhPT0gMCB8fCBkb20ud3JhcHBlci5zY3JvbGxMZWZ0ICE9PSAwICkgewoJCQkJZG9tLndyYXBwZXIuc2Nyb2xsVG9wID0gMDsKCQkJCWRvbS53cmFwcGVyLnNjcm9sbExlZnQgPSAwOwoJCQl9CgkJfSwgMTAwMCApOwoKCX0KCgkvKioKCSAqIENyZWF0ZXMgYW4gSFRNTCBlbGVtZW50IGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGl0LgoJICogSWYgdGhlIGVsZW1lbnQgYWxyZWFkeSBleGlzdHMgdGhlIGV4aXN0aW5nIGluc3RhbmNlIHdpbGwKCSAqIGJlIHJldHVybmVkLgoJICoKCSAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lcgoJICogQHBhcmFtIHtzdHJpbmd9IHRhZ25hbWUKCSAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc25hbWUKCSAqIEBwYXJhbSB7c3RyaW5nfSBpbm5lckhUTUwKCSAqCgkgKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0KCSAqLwoJZnVuY3Rpb24gY3JlYXRlU2luZ2xldG9uTm9kZSggY29udGFpbmVyLCB0YWduYW1lLCBjbGFzc25hbWUsIGlubmVySFRNTCApIHsKCgkJLy8gRmluZCBhbGwgbm9kZXMgbWF0Y2hpbmcgdGhlIGRlc2NyaXB0aW9uCgkJdmFyIG5vZGVzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoICcuJyArIGNsYXNzbmFtZSApOwoKCQkvLyBDaGVjayBhbGwgbWF0Y2hlcyB0byBmaW5kIG9uZSB3aGljaCBpcyBhIGRpcmVjdCBjaGlsZCBvZgoJCS8vIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyCgkJZm9yKCB2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKyApIHsKCQkJdmFyIHRlc3ROb2RlID0gbm9kZXNbaV07CgkJCWlmKCB0ZXN0Tm9kZS5wYXJlbnROb2RlID09PSBjb250YWluZXIgKSB7CgkJCQlyZXR1cm4gdGVzdE5vZGU7CgkJCX0KCQl9CgoJCS8vIElmIG5vIG5vZGUgd2FzIGZvdW5kLCBjcmVhdGUgaXQgbm93CgkJdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCB0YWduYW1lICk7CgkJbm9kZS5jbGFzc05hbWUgPSBjbGFzc25hbWU7CgkJaWYoIHR5cGVvZiBpbm5lckhUTUwgPT09ICdzdHJpbmcnICkgewoJCQlub2RlLmlubmVySFRNTCA9IGlubmVySFRNTDsKCQl9CgkJY29udGFpbmVyLmFwcGVuZENoaWxkKCBub2RlICk7CgoJCXJldHVybiBub2RlOwoKCX0KCgkvKioKCSAqIENyZWF0ZXMgdGhlIHNsaWRlIGJhY2tncm91bmQgZWxlbWVudHMgYW5kIGFwcGVuZHMgdGhlbQoJICogdG8gdGhlIGJhY2tncm91bmQgY29udGFpbmVyLiBPbmUgZWxlbWVudCBpcyBjcmVhdGVkIHBlcgoJICogc2xpZGUgbm8gbWF0dGVyIGlmIHRoZSBnaXZlbiBzbGlkZSBoYXMgdmlzaWJsZSBiYWNrZ3JvdW5kLgoJICovCglmdW5jdGlvbiBjcmVhdGVCYWNrZ3JvdW5kcygpIHsKCgkJdmFyIHByaW50TW9kZSA9IGlzUHJpbnRpbmdQREYoKTsKCgkJLy8gQ2xlYXIgcHJpb3IgYmFja2dyb3VuZHMKCQlkb20uYmFja2dyb3VuZC5pbm5lckhUTUwgPSAnJzsKCQlkb20uYmFja2dyb3VuZC5jbGFzc0xpc3QuYWRkKCAnbm8tdHJhbnNpdGlvbicgKTsKCgkJLy8gSXRlcmF0ZSBvdmVyIGFsbCBob3Jpem9udGFsIHNsaWRlcwoJCXRvQXJyYXkoIGRvbS53cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoIEhPUklaT05UQUxfU0xJREVTX1NFTEVDVE9SICkgKS5mb3JFYWNoKCBmdW5jdGlvbiggc2xpZGVoICkgewoKCQkJdmFyIGJhY2tncm91bmRTdGFjayA9IGNyZWF0ZUJhY2tncm91bmQoIHNsaWRlaCwgZG9tLmJhY2tncm91bmQgKTsKCgkJCS8vIEl0ZXJhdGUgb3ZlciBhbGwgdmVydGljYWwgc2xpZGVzCgkJCXRvQXJyYXkoIHNsaWRlaC5xdWVyeVNlbGVjdG9yQWxsKCAnc2VjdGlvbicgKSApLmZvckVhY2goIGZ1bmN0aW9uKCBzbGlkZXYgKSB7CgoJCQkJY3JlYXRlQmFja2dyb3VuZCggc2xpZGV2LCBiYWNrZ3JvdW5kU3RhY2sgKTsKCgkJCQliYWNrZ3JvdW5kU3RhY2suY2xhc3NMaXN0LmFkZCggJ3N0YWNrJyApOwoKCQkJfSApOwoKCQl9ICk7CgoJCS8vIEFkZCBwYXJhbGxheCBiYWNrZ3JvdW5kIGlmIHNwZWNpZmllZAoJCWlmKCBjb25maWcucGFyYWxsYXhCYWNrZ3JvdW5kSW1hZ2UgKSB7CgoJCQlkb20uYmFja2dyb3VuZC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAndXJsKCInICsgY29uZmlnLnBhcmFsbGF4QmFja2dyb3VuZEltYWdlICsgJyIpJzsKCQkJZG9tLmJhY2tncm91bmQuc3R5bGUuYmFja2dyb3VuZFNpemUgPSBjb25maWcucGFyYWxsYXhCYWNrZ3JvdW5kU2l6ZTsKCQkJZG9tLmJhY2tncm91bmQuc3R5bGUuYmFja2dyb3VuZFJlcGVhdCA9IGNvbmZpZy5wYXJhbGxheEJhY2tncm91bmRSZXBlYXQ7CgkJCWRvbS5iYWNrZ3JvdW5kLnN0eWxlLmJhY2tncm91bmRQb3NpdGlvbiA9IGNvbmZpZy5wYXJhbGxheEJhY2tncm91bmRQb3NpdGlvbjsKCgkJCS8vIE1ha2Ugc3VyZSB0aGUgYmVsb3cgcHJvcGVydGllcyBhcmUgc2V0IG9uIHRoZSBlbGVtZW50IC0gdGhlc2UgcHJvcGVydGllcyBhcmUKCQkJLy8gbmVlZGVkIGZvciBwcm9wZXIgdHJhbnNpdGlvbnMgdG8gYmUgc2V0IG9uIHRoZSBlbGVtZW50IHZpYSBDU1MuIFRvIHJlbW92ZQoJCQkvLyBhbm5veWluZyBiYWNrZ3JvdW5kIHNsaWRlLWluIGVmZmVjdCB3aGVuIHRoZSBwcmVzZW50YXRpb24gc3RhcnRzLCBhcHBseQoJCQkvLyB0aGVzZSBwcm9wZXJ0aWVzIGFmdGVyIHNob3J0IHRpbWUgZGVsYXkKCQkJc2V0VGltZW91dCggZnVuY3Rpb24oKSB7CgkJCQlkb20ud3JhcHBlci5jbGFzc0xpc3QuYWRkKCAnaGFzLXBhcmFsbGF4LWJhY2tncm91bmQnICk7CgkJCX0sIDEgKTsKCgkJfQoJCWVsc2UgewoKCQkJZG9tLmJhY2tncm91bmQuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gJyc7CgkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoICdoYXMtcGFyYWxsYXgtYmFja2dyb3VuZCcgKTsKCgkJfQoKCX0KCgkvKioKCSAqIENyZWF0ZXMgYSBiYWNrZ3JvdW5kIGZvciB0aGUgZ2l2ZW4gc2xpZGUuCgkgKgoJICogQHBhcmFtIHtIVE1MRWxlbWVudH0gc2xpZGUKCSAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lciBUaGUgZWxlbWVudCB0aGF0IHRoZSBiYWNrZ3JvdW5kCgkgKiBzaG91bGQgYmUgYXBwZW5kZWQgdG8KCSAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSBOZXcgYmFja2dyb3VuZCBkaXYKCSAqLwoJZnVuY3Rpb24gY3JlYXRlQmFja2dyb3VuZCggc2xpZGUsIGNvbnRhaW5lciApIHsKCgoJCS8vIE1haW4gc2xpZGUgYmFja2dyb3VuZCBlbGVtZW50CgkJdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnZGl2JyApOwoJCWVsZW1lbnQuY2xhc3NOYW1lID0gJ3NsaWRlLWJhY2tncm91bmQgJyArIHNsaWRlLmNsYXNzTmFtZS5yZXBsYWNlKCAvcHJlc2VudHxwYXN0fGZ1dHVyZS8sICcnICk7CgoJCS8vIElubmVyIGJhY2tncm91bmQgZWxlbWVudCB0aGF0IHdyYXBzIGltYWdlcy92aWRlb3MvaWZyYW1lcwoJCXZhciBjb250ZW50RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdkaXYnICk7CgkJY29udGVudEVsZW1lbnQuY2xhc3NOYW1lID0gJ3NsaWRlLWJhY2tncm91bmQtY29udGVudCc7CgoJCWVsZW1lbnQuYXBwZW5kQ2hpbGQoIGNvbnRlbnRFbGVtZW50ICk7CgkJY29udGFpbmVyLmFwcGVuZENoaWxkKCBlbGVtZW50ICk7CgoJCXNsaWRlLnNsaWRlQmFja2dyb3VuZEVsZW1lbnQgPSBlbGVtZW50OwoJCXNsaWRlLnNsaWRlQmFja2dyb3VuZENvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7CgoJCS8vIFN5bmNzIHRoZSBiYWNrZ3JvdW5kIHRvIHJlZmxlY3QgYWxsIGN1cnJlbnQgYmFja2dyb3VuZCBzZXR0aW5ncwoJCXN5bmNCYWNrZ3JvdW5kKCBzbGlkZSApOwoKCQlyZXR1cm4gZWxlbWVudDsKCgl9CgoJLyoqCgkgKiBSZW5kZXJzIGFsbCBvZiB0aGUgdmlzdWFsIHByb3BlcnRpZXMgb2YgYSBzbGlkZSBiYWNrZ3JvdW5kCgkgKiBiYXNlZCBvbiB0aGUgdmFyaW91cyBiYWNrZ3JvdW5kIGF0dHJpYnV0ZXMuCgkgKgoJICogQHBhcmFtIHtIVE1MRWxlbWVudH0gc2xpZGUKCSAqLwoJZnVuY3Rpb24gc3luY0JhY2tncm91bmQoIHNsaWRlICkgewoKCQl2YXIgZWxlbWVudCA9IHNsaWRlLnNsaWRlQmFja2dyb3VuZEVsZW1lbnQsCgkJCWNvbnRlbnRFbGVtZW50ID0gc2xpZGUuc2xpZGVCYWNrZ3JvdW5kQ29udGVudEVsZW1lbnQ7CgoJCS8vIFJlc2V0IHRoZSBwcmlvciBiYWNrZ3JvdW5kIHN0YXRlIGluIGNhc2UgdGhpcyBpcyBub3QgdGhlCgkJLy8gaW5pdGlhbCBzeW5jCgkJc2xpZGUuY2xhc3NMaXN0LnJlbW92ZSggJ2hhcy1kYXJrLWJhY2tncm91bmQnICk7CgkJc2xpZGUuY2xhc3NMaXN0LnJlbW92ZSggJ2hhcy1saWdodC1iYWNrZ3JvdW5kJyApOwoKCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSggJ2RhdGEtbG9hZGVkJyApOwoJCWVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCAnZGF0YS1iYWNrZ3JvdW5kLWhhc2gnICk7CgkJZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoICdkYXRhLWJhY2tncm91bmQtc2l6ZScgKTsKCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSggJ2RhdGEtYmFja2dyb3VuZC10cmFuc2l0aW9uJyApOwoJCWVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyc7CgoJCWNvbnRlbnRFbGVtZW50LnN0eWxlLmJhY2tncm91bmRTaXplID0gJyc7CgkJY29udGVudEVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZFJlcGVhdCA9ICcnOwoJCWNvbnRlbnRFbGVtZW50LnN0eWxlLmJhY2tncm91bmRQb3NpdGlvbiA9ICcnOwoJCWNvbnRlbnRFbGVtZW50LnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICcnOwoJCWNvbnRlbnRFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnJzsKCQljb250ZW50RWxlbWVudC5pbm5lckhUTUwgPSAnJzsKCgkJdmFyIGRhdGEgPSB7CgkJCWJhY2tncm91bmQ6IHNsaWRlLmdldEF0dHJpYnV0ZSggJ2RhdGEtYmFja2dyb3VuZCcgKSwKCQkJYmFja2dyb3VuZFNpemU6IHNsaWRlLmdldEF0dHJpYnV0ZSggJ2RhdGEtYmFja2dyb3VuZC1zaXplJyApLAoJCQliYWNrZ3JvdW5kSW1hZ2U6IHNsaWRlLmdldEF0dHJpYnV0ZSggJ2RhdGEtYmFja2dyb3VuZC1pbWFnZScgKSwKCQkJYmFja2dyb3VuZFZpZGVvOiBzbGlkZS5nZXRBdHRyaWJ1dGUoICdkYXRhLWJhY2tncm91bmQtdmlkZW8nICksCgkJCWJhY2tncm91bmRJZnJhbWU6IHNsaWRlLmdldEF0dHJpYnV0ZSggJ2RhdGEtYmFja2dyb3VuZC1pZnJhbWUnICksCgkJCWJhY2tncm91bmRDb2xvcjogc2xpZGUuZ2V0QXR0cmlidXRlKCAnZGF0YS1iYWNrZ3JvdW5kLWNvbG9yJyApLAoJCQliYWNrZ3JvdW5kUmVwZWF0OiBzbGlkZS5nZXRBdHRyaWJ1dGUoICdkYXRhLWJhY2tncm91bmQtcmVwZWF0JyApLAoJCQliYWNrZ3JvdW5kUG9zaXRpb246IHNsaWRlLmdldEF0dHJpYnV0ZSggJ2RhdGEtYmFja2dyb3VuZC1wb3NpdGlvbicgKSwKCQkJYmFja2dyb3VuZFRyYW5zaXRpb246IHNsaWRlLmdldEF0dHJpYnV0ZSggJ2RhdGEtYmFja2dyb3VuZC10cmFuc2l0aW9uJyApLAoJCQliYWNrZ3JvdW5kT3BhY2l0eTogc2xpZGUuZ2V0QXR0cmlidXRlKCAnZGF0YS1iYWNrZ3JvdW5kLW9wYWNpdHknICkKCQl9OwoKCQlpZiggZGF0YS5iYWNrZ3JvdW5kICkgewoJCQkvLyBBdXRvLXdyYXAgaW1hZ2UgdXJscyBpbiB1cmwoLi4uKQoJCQlpZiggL14oaHR0cHxmaWxlfFwvXC8pL2dpLnRlc3QoIGRhdGEuYmFja2dyb3VuZCApIHx8IC9cLihzdmd8cG5nfGpwZ3xqcGVnfGdpZnxibXApKFs/I1xzXXwkKS9naS50ZXN0KCBkYXRhLmJhY2tncm91bmQgKSApIHsKCQkJCXNsaWRlLnNldEF0dHJpYnV0ZSggJ2RhdGEtYmFja2dyb3VuZC1pbWFnZScsIGRhdGEuYmFja2dyb3VuZCApOwoJCQl9CgkJCWVsc2UgewoJCQkJZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kID0gZGF0YS5iYWNrZ3JvdW5kOwoJCQl9CgkJfQoKCQkvLyBDcmVhdGUgYSBoYXNoIGZvciB0aGlzIGNvbWJpbmF0aW9uIG9mIGJhY2tncm91bmQgc2V0dGluZ3MuCgkJLy8gVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSB3aGVuIHR3byBzbGlkZSBiYWNrZ3JvdW5kcyBhcmUKCQkvLyB0aGUgc2FtZS4KCQlpZiggZGF0YS5iYWNrZ3JvdW5kIHx8IGRhdGEuYmFja2dyb3VuZENvbG9yIHx8IGRhdGEuYmFja2dyb3VuZEltYWdlIHx8IGRhdGEuYmFja2dyb3VuZFZpZGVvIHx8IGRhdGEuYmFja2dyb3VuZElmcmFtZSApIHsKCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoICdkYXRhLWJhY2tncm91bmQtaGFzaCcsIGRhdGEuYmFja2dyb3VuZCArCgkJCQkJCQkJCQkJCQkJCWRhdGEuYmFja2dyb3VuZFNpemUgKwoJCQkJCQkJCQkJCQkJCQlkYXRhLmJhY2tncm91bmRJbWFnZSArCgkJCQkJCQkJCQkJCQkJCWRhdGEuYmFja2dyb3VuZFZpZGVvICsKCQkJCQkJCQkJCQkJCQkJZGF0YS5iYWNrZ3JvdW5kSWZyYW1lICsKCQkJCQkJCQkJCQkJCQkJZGF0YS5iYWNrZ3JvdW5kQ29sb3IgKwoJCQkJCQkJCQkJCQkJCQlkYXRhLmJhY2tncm91bmRSZXBlYXQgKwoJCQkJCQkJCQkJCQkJCQlkYXRhLmJhY2tncm91bmRQb3NpdGlvbiArCgkJCQkJCQkJCQkJCQkJCWRhdGEuYmFja2dyb3VuZFRyYW5zaXRpb24gKwoJCQkJCQkJCQkJCQkJCQlkYXRhLmJhY2tncm91bmRPcGFjaXR5ICk7CgkJfQoKCQkvLyBBZGRpdGlvbmFsIGFuZCBvcHRpb25hbCBiYWNrZ3JvdW5kIHByb3BlcnRpZXMKCQlpZiggZGF0YS5iYWNrZ3JvdW5kU2l6ZSApIGVsZW1lbnQuc2V0QXR0cmlidXRlKCAnZGF0YS1iYWNrZ3JvdW5kLXNpemUnLCBkYXRhLmJhY2tncm91bmRTaXplICk7CgkJaWYoIGRhdGEuYmFja2dyb3VuZENvbG9yICkgZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBkYXRhLmJhY2tncm91bmRDb2xvcjsKCQlpZiggZGF0YS5iYWNrZ3JvdW5kVHJhbnNpdGlvbiApIGVsZW1lbnQuc2V0QXR0cmlidXRlKCAnZGF0YS1iYWNrZ3JvdW5kLXRyYW5zaXRpb24nLCBkYXRhLmJhY2tncm91bmRUcmFuc2l0aW9uICk7CgoJCWlmKCBzbGlkZS5oYXNBdHRyaWJ1dGUoICdkYXRhLXByZWxvYWQnICkgKSBlbGVtZW50LnNldEF0dHJpYnV0ZSggJ2RhdGEtcHJlbG9hZCcsICcnICk7CgoJCS8vIEJhY2tncm91bmQgaW1hZ2Ugb3B0aW9ucyBhcmUgc2V0IG9uIHRoZSBjb250ZW50IHdyYXBwZXIKCQlpZiggZGF0YS5iYWNrZ3JvdW5kU2l6ZSApIGNvbnRlbnRFbGVtZW50LnN0eWxlLmJhY2tncm91bmRTaXplID0gZGF0YS5iYWNrZ3JvdW5kU2l6ZTsKCQlpZiggZGF0YS5iYWNrZ3JvdW5kUmVwZWF0ICkgY29udGVudEVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZFJlcGVhdCA9IGRhdGEuYmFja2dyb3VuZFJlcGVhdDsKCQlpZiggZGF0YS5iYWNrZ3JvdW5kUG9zaXRpb24gKSBjb250ZW50RWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kUG9zaXRpb24gPSBkYXRhLmJhY2tncm91bmRQb3NpdGlvbjsKCQlpZiggZGF0YS5iYWNrZ3JvdW5kT3BhY2l0eSApIGNvbnRlbnRFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSBkYXRhLmJhY2tncm91bmRPcGFjaXR5OwoKCQkvLyBJZiB0aGlzIHNsaWRlIGhhcyBhIGJhY2tncm91bmQgY29sb3IsIHdlIGFkZCBhIGNsYXNzIHRoYXQKCQkvLyBzaWduYWxzIGlmIGl0IGlzIGxpZ2h0IG9yIGRhcmsuIElmIHRoZSBzbGlkZSBoYXMgbm8gYmFja2dyb3VuZAoJCS8vIGNvbG9yLCBubyBjbGFzcyB3aWxsIGJlIGFkZGVkCgkJdmFyIGNvbnRyYXN0Q29sb3IgPSBkYXRhLmJhY2tncm91bmRDb2xvcjsKCgkJLy8gSWYgbm8gYmcgY29sb3Igd2FzIGZvdW5kLCBjaGVjayB0aGUgY29tcHV0ZWQgYmFja2dyb3VuZAoJCWlmKCAhY29udHJhc3RDb2xvciApIHsKCQkJdmFyIGNvbXB1dGVkQmFja2dyb3VuZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGVsZW1lbnQgKTsKCQkJaWYoIGNvbXB1dGVkQmFja2dyb3VuZFN0eWxlICYmIGNvbXB1dGVkQmFja2dyb3VuZFN0eWxlLmJhY2tncm91bmRDb2xvciApIHsKCQkJCWNvbnRyYXN0Q29sb3IgPSBjb21wdXRlZEJhY2tncm91bmRTdHlsZS5iYWNrZ3JvdW5kQ29sb3I7CgkJCX0KCQl9CgoJCWlmKCBjb250cmFzdENvbG9yICkgewoJCQl2YXIgcmdiID0gY29sb3JUb1JnYiggY29udHJhc3RDb2xvciApOwoKCQkJLy8gSWdub3JlIGZ1bGx5IHRyYW5zcGFyZW50IGJhY2tncm91bmRzLiBTb21lIGJyb3dzZXJzIHJldHVybgoJCQkvLyByZ2JhKDAsMCwwLDApIHdoZW4gcmVhZGluZyB0aGUgY29tcHV0ZWQgYmFja2dyb3VuZCBjb2xvciBvZgoJCQkvLyBhbiBlbGVtZW50IHdpdGggbm8gYmFja2dyb3VuZAoJCQlpZiggcmdiICYmIHJnYi5hICE9PSAwICkgewoJCQkJaWYoIGNvbG9yQnJpZ2h0bmVzcyggY29udHJhc3RDb2xvciApIDwgMTI4ICkgewoJCQkJCXNsaWRlLmNsYXNzTGlzdC5hZGQoICdoYXMtZGFyay1iYWNrZ3JvdW5kJyApOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJc2xpZGUuY2xhc3NMaXN0LmFkZCggJ2hhcy1saWdodC1iYWNrZ3JvdW5kJyApOwoJCQkJfQoJCQl9CgkJfQoKCX0KCgkvKioKCSAqIFJlZ2lzdGVycyBhIGxpc3RlbmVyIHRvIHBvc3RNZXNzYWdlIGV2ZW50cywgdGhpcyBtYWtlcyBpdAoJICogcG9zc2libGUgdG8gY2FsbCBhbGwgcmV2ZWFsLmpzIEFQSSBtZXRob2RzIGZyb20gYW5vdGhlcgoJICogd2luZG93LiBGb3IgZXhhbXBsZToKCSAqCgkgKiByZXZlYWxXaW5kb3cucG9zdE1lc3NhZ2UoIEpTT04uc3RyaW5naWZ5KHsKCSAqICAgbWV0aG9kOiAnc2xpZGUnLAoJICogICBhcmdzOiBbIDIgXQoJICogfSksICcqJyApOwoJICovCglmdW5jdGlvbiBzZXR1cFBvc3RNZXNzYWdlKCkgewoKCQlpZiggY29uZmlnLnBvc3RNZXNzYWdlICkgewoJCQl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ21lc3NhZ2UnLCBmdW5jdGlvbiAoIGV2ZW50ICkgewoJCQkJdmFyIGRhdGEgPSBldmVudC5kYXRhOwoKCQkJCS8vIE1ha2Ugc3VyZSB3ZSdyZSBkZWFsaW5nIHdpdGggSlNPTgoJCQkJaWYoIHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJyAmJiBkYXRhLmNoYXJBdCggMCApID09PSAneycgJiYgZGF0YS5jaGFyQXQoIGRhdGEubGVuZ3RoIC0gMSApID09PSAnfScgKSB7CgkJCQkJZGF0YSA9IEpTT04ucGFyc2UoIGRhdGEgKTsKCgkJCQkJLy8gQ2hlY2sgaWYgdGhlIHJlcXVlc3RlZCBtZXRob2QgY2FuIGJlIGZvdW5kCgkJCQkJaWYoIGRhdGEubWV0aG9kICYmIHR5cGVvZiBSZXZlYWxbZGF0YS5tZXRob2RdID09PSAnZnVuY3Rpb24nICkgewoJCQkJCQl2YXIgcmVzdWx0ID0gUmV2ZWFsW2RhdGEubWV0aG9kXS5hcHBseSggUmV2ZWFsLCBkYXRhLmFyZ3MgKTsKCgkJCQkJCS8vIERpc3BhdGNoIGEgcG9zdE1lc3NhZ2UgZXZlbnQgd2l0aCB0aGUgcmV0dXJuZWQgdmFsdWUgZnJvbQoJCQkJCQkvLyBvdXIgbWV0aG9kIGludm9jYXRpb24gZm9yIGdldHRlciBmdW5jdGlvbnMKCQkJCQkJZGlzcGF0Y2hQb3N0TWVzc2FnZSggJ2NhbGxiYWNrJywgeyBtZXRob2Q6IGRhdGEubWV0aG9kLCByZXN1bHQ6IHJlc3VsdCB9ICk7CgkJCQkJfQoJCQkJfQoJCQl9LCBmYWxzZSApOwoJCX0KCgl9CgoJLyoqCgkgKiBBcHBsaWVzIHRoZSBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZyb20gdGhlIGNvbmZpZwoJICogb2JqZWN0LiBNYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgoJICoKCSAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zCgkgKi8KCWZ1bmN0aW9uIGNvbmZpZ3VyZSggb3B0aW9ucyApIHsKCgkJdmFyIG9sZFRyYW5zaXRpb24gPSBjb25maWcudHJhbnNpdGlvbjsKCgkJLy8gTmV3IGNvbmZpZyBvcHRpb25zIG1heSBiZSBwYXNzZWQgd2hlbiB0aGlzIG1ldGhvZAoJCS8vIGlzIGludm9rZWQgdGhyb3VnaCB0aGUgQVBJIGFmdGVyIGluaXRpYWxpemF0aW9uCgkJaWYoIHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyApIGV4dGVuZCggY29uZmlnLCBvcHRpb25zICk7CgoJCS8vIEFib3J0IGlmIHJldmVhbC5qcyBoYXNuJ3QgZmluaXNoZWQgbG9hZGluZywgY29uZmlnCgkJLy8gY2hhbmdlcyB3aWxsIGJlIGFwcGxpZWQgYXV0b21hdGljYWxseSBvbmNlIGxvYWRpbmcKCQkvLyBmaW5pc2hlcwoJCWlmKCBsb2FkZWQgPT09IGZhbHNlICkgcmV0dXJuOwoKCQl2YXIgbnVtYmVyT2ZTbGlkZXMgPSBkb20ud3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCBTTElERVNfU0VMRUNUT1IgKS5sZW5ndGg7CgoJCS8vIFJlbW92ZSB0aGUgcHJldmlvdXNseSBjb25maWd1cmVkIHRyYW5zaXRpb24gY2xhc3MKCQlkb20ud3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCBvbGRUcmFuc2l0aW9uICk7CgoJCS8vIEZvcmNlIGxpbmVhciB0cmFuc2l0aW9uIGJhc2VkIG9uIGJyb3dzZXIgY2FwYWJpbGl0aWVzCgkJaWYoIGZlYXR1cmVzLnRyYW5zZm9ybXMzZCA9PT0gZmFsc2UgKSBjb25maWcudHJhbnNpdGlvbiA9ICdsaW5lYXInOwoKCQlkb20ud3JhcHBlci5jbGFzc0xpc3QuYWRkKCBjb25maWcudHJhbnNpdGlvbiApOwoKCQlkb20ud3JhcHBlci5zZXRBdHRyaWJ1dGUoICdkYXRhLXRyYW5zaXRpb24tc3BlZWQnLCBjb25maWcudHJhbnNpdGlvblNwZWVkICk7CgkJZG9tLndyYXBwZXIuc2V0QXR0cmlidXRlKCAnZGF0YS1iYWNrZ3JvdW5kLXRyYW5zaXRpb24nLCBjb25maWcuYmFja2dyb3VuZFRyYW5zaXRpb24gKTsKCgkJZG9tLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkgPSBjb25maWcuY29udHJvbHMgPyAnYmxvY2snIDogJ25vbmUnOwoJCWRvbS5wcm9ncmVzcy5zdHlsZS5kaXNwbGF5ID0gY29uZmlnLnByb2dyZXNzID8gJ2Jsb2NrJyA6ICdub25lJzsKCgkJZG9tLmNvbnRyb2xzLnNldEF0dHJpYnV0ZSggJ2RhdGEtY29udHJvbHMtbGF5b3V0JywgY29uZmlnLmNvbnRyb2xzTGF5b3V0ICk7CgkJZG9tLmNvbnRyb2xzLnNldEF0dHJpYnV0ZSggJ2RhdGEtY29udHJvbHMtYmFjay1hcnJvd3MnLCBjb25maWcuY29udHJvbHNCYWNrQXJyb3dzICk7CgoJCWlmKCBjb25maWcuc2h1ZmZsZSApIHsKCQkJc2h1ZmZsZSgpOwoJCX0KCgkJaWYoIGNvbmZpZy5ydGwgKSB7CgkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5hZGQoICdydGwnICk7CgkJfQoJCWVsc2UgewoJCQlkb20ud3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCAncnRsJyApOwoJCX0KCgkJaWYoIGNvbmZpZy5jZW50ZXIgKSB7CgkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5hZGQoICdjZW50ZXInICk7CgkJfQoJCWVsc2UgewoJCQlkb20ud3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCAnY2VudGVyJyApOwoJCX0KCgkJLy8gRXhpdCB0aGUgcGF1c2VkIG1vZGUgaWYgaXQgd2FzIGNvbmZpZ3VyZWQgb2ZmCgkJaWYoIGNvbmZpZy5wYXVzZSA9PT0gZmFsc2UgKSB7CgkJCXJlc3VtZSgpOwoJCX0KCgkJaWYoIGNvbmZpZy5zaG93Tm90ZXMgKSB7CgkJCWRvbS5zcGVha2VyTm90ZXMuc2V0QXR0cmlidXRlKCAnZGF0YS1sYXlvdXQnLCB0eXBlb2YgY29uZmlnLnNob3dOb3RlcyA9PT0gJ3N0cmluZycgPyBjb25maWcuc2hvd05vdGVzIDogJ2lubGluZScgKTsKCQl9CgoJCWlmKCBjb25maWcubW91c2VXaGVlbCApIHsKCQkJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ0RPTU1vdXNlU2Nyb2xsJywgb25Eb2N1bWVudE1vdXNlU2Nyb2xsLCBmYWxzZSApOyAvLyBGRgoJCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnbW91c2V3aGVlbCcsIG9uRG9jdW1lbnRNb3VzZVNjcm9sbCwgZmFsc2UgKTsKCQl9CgkJZWxzZSB7CgkJCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdET01Nb3VzZVNjcm9sbCcsIG9uRG9jdW1lbnRNb3VzZVNjcm9sbCwgZmFsc2UgKTsgLy8gRkYKCQkJZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ21vdXNld2hlZWwnLCBvbkRvY3VtZW50TW91c2VTY3JvbGwsIGZhbHNlICk7CgkJfQoKCQkvLyBSb2xsaW5nIDNEIGxpbmtzCgkJaWYoIGNvbmZpZy5yb2xsaW5nTGlua3MgKSB7CgkJCWVuYWJsZVJvbGxpbmdMaW5rcygpOwoJCX0KCQllbHNlIHsKCQkJZGlzYWJsZVJvbGxpbmdMaW5rcygpOwoJCX0KCgkJLy8gQXV0by1oaWRlIHRoZSBtb3VzZSBwb2ludGVyIHdoZW4gaXRzIGluYWN0aXZlCgkJaWYoIGNvbmZpZy5oaWRlSW5hY3RpdmVDdXJzb3IgKSB7CgkJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdtb3VzZW1vdmUnLCBvbkRvY3VtZW50Q3Vyc29yQWN0aXZlLCBmYWxzZSApOwoJCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnbW91c2Vkb3duJywgb25Eb2N1bWVudEN1cnNvckFjdGl2ZSwgZmFsc2UgKTsKCQl9CgkJZWxzZSB7CgkJCXNob3dDdXJzb3IoKTsKCgkJCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdtb3VzZW1vdmUnLCBvbkRvY3VtZW50Q3Vyc29yQWN0aXZlLCBmYWxzZSApOwoJCQlkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAnbW91c2Vkb3duJywgb25Eb2N1bWVudEN1cnNvckFjdGl2ZSwgZmFsc2UgKTsKCQl9CgoJCS8vIElmcmFtZSBsaW5rIHByZXZpZXdzCgkJaWYoIGNvbmZpZy5wcmV2aWV3TGlua3MgKSB7CgkJCWVuYWJsZVByZXZpZXdMaW5rcygpOwoJCQlkaXNhYmxlUHJldmlld0xpbmtzKCAnW2RhdGEtcHJldmlldy1saW5rPWZhbHNlXScgKTsKCQl9CgkJZWxzZSB7CgkJCWRpc2FibGVQcmV2aWV3TGlua3MoKTsKCQkJZW5hYmxlUHJldmlld0xpbmtzKCAnW2RhdGEtcHJldmlldy1saW5rXTpub3QoW2RhdGEtcHJldmlldy1saW5rPWZhbHNlXSknICk7CgkJfQoKCQkvLyBSZW1vdmUgZXhpc3RpbmcgYXV0by1zbGlkZSBjb250cm9scwoJCWlmKCBhdXRvU2xpZGVQbGF5ZXIgKSB7CgkJCWF1dG9TbGlkZVBsYXllci5kZXN0cm95KCk7CgkJCWF1dG9TbGlkZVBsYXllciA9IG51bGw7CgkJfQoKCQkvLyBHZW5lcmF0ZSBhdXRvLXNsaWRlIGNvbnRyb2xzIGlmIG5lZWRlZAoJCWlmKCBudW1iZXJPZlNsaWRlcyA+IDEgJiYgY29uZmlnLmF1dG9TbGlkZSAmJiBjb25maWcuYXV0b1NsaWRlU3RvcHBhYmxlICYmIGZlYXR1cmVzLmNhbnZhcyAmJiBmZWF0dXJlcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgKSB7CgkJCWF1dG9TbGlkZVBsYXllciA9IG5ldyBQbGF5YmFjayggZG9tLndyYXBwZXIsIGZ1bmN0aW9uKCkgewoJCQkJcmV0dXJuIE1hdGgubWluKCBNYXRoLm1heCggKCBEYXRlLm5vdygpIC0gYXV0b1NsaWRlU3RhcnRUaW1lICkgLyBhdXRvU2xpZGUsIDAgKSwgMSApOwoJCQl9ICk7CgoJCQlhdXRvU2xpZGVQbGF5ZXIub24oICdjbGljaycsIG9uQXV0b1NsaWRlUGxheWVyQ2xpY2sgKTsKCQkJYXV0b1NsaWRlUGF1c2VkID0gZmFsc2U7CgkJfQoKCQkvLyBXaGVuIGZyYWdtZW50cyBhcmUgdHVybmVkIG9mZiB0aGV5IHNob3VsZCBiZSB2aXNpYmxlCgkJaWYoIGNvbmZpZy5mcmFnbWVudHMgPT09IGZhbHNlICkgewoJCQl0b0FycmF5KCBkb20uc2xpZGVzLnF1ZXJ5U2VsZWN0b3JBbGwoICcuZnJhZ21lbnQnICkgKS5mb3JFYWNoKCBmdW5jdGlvbiggZWxlbWVudCApIHsKCQkJCWVsZW1lbnQuY2xhc3NMaXN0LmFkZCggJ3Zpc2libGUnICk7CgkJCQllbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoICdjdXJyZW50LWZyYWdtZW50JyApOwoJCQl9ICk7CgkJfQoKCQkvLyBTbGlkZSBudW1iZXJzCgkJdmFyIHNsaWRlTnVtYmVyRGlzcGxheSA9ICdub25lJzsKCQlpZiggY29uZmlnLnNsaWRlTnVtYmVyICYmICFpc1ByaW50aW5nUERGKCkgKSB7CgkJCWlmKCBjb25maWcuc2hvd1NsaWRlTnVtYmVyID09PSAnYWxsJyApIHsKCQkJCXNsaWRlTnVtYmVyRGlzcGxheSA9ICdibG9jayc7CgkJCX0KCQkJZWxzZSBpZiggY29uZmlnLnNob3dTbGlkZU51bWJlciA9PT0gJ3NwZWFrZXInICYmIGlzU3BlYWtlck5vdGVzKCkgKSB7CgkJCQlzbGlkZU51bWJlckRpc3BsYXkgPSAnYmxvY2snOwoJCQl9CgkJfQoKCQlkb20uc2xpZGVOdW1iZXIuc3R5bGUuZGlzcGxheSA9IHNsaWRlTnVtYmVyRGlzcGxheTsKCgkJLy8gQWRkIHRoZSBuYXZpZ2F0aW9uIG1vZGUgdG8gdGhlIERPTSBzbyB3ZSBjYW4gYWRqdXN0IHN0eWxpbmcKCQlpZiggY29uZmlnLm5hdmlnYXRpb25Nb2RlICE9PSAnZGVmYXVsdCcgKSB7CgkJCWRvbS53cmFwcGVyLnNldEF0dHJpYnV0ZSggJ2RhdGEtbmF2aWdhdGlvbi1tb2RlJywgY29uZmlnLm5hdmlnYXRpb25Nb2RlICk7CgkJfQoJCWVsc2UgewoJCQlkb20ud3JhcHBlci5yZW1vdmVBdHRyaWJ1dGUoICdkYXRhLW5hdmlnYXRpb24tbW9kZScgKTsKCQl9CgoJCS8vIERlZmluZSBvdXIgY29udGV4dHVhbCBsaXN0IG9mIGtleWJvYXJkIHNob3J0Y3V0cwoJCWlmKCBjb25maWcubmF2aWdhdGlvbk1vZGUgPT09ICdsaW5lYXInICkgewoJCQlrZXlib2FyZFNob3J0Y3V0c1snJiM4NTk0OyAgLCAgJiM4NTk1OyAgLCAgU1BBQ0UgICwgIE4gICwgIEwgICwgIEonXSA9ICdOZXh0IHNsaWRlJzsKCQkJa2V5Ym9hcmRTaG9ydGN1dHNbJyYjODU5MjsgICwgICYjODU5MzsgICwgIFAgICwgIEggICwgIEsnXSAgICAgICAgICAgPSAnUHJldmlvdXMgc2xpZGUnOwoJCX0KCQllbHNlIHsKCQkJa2V5Ym9hcmRTaG9ydGN1dHNbJ04gICwgIFNQQUNFJ10gICA9ICdOZXh0IHNsaWRlJzsKCQkJa2V5Ym9hcmRTaG9ydGN1dHNbJ1AnXSAgICAgICAgICAgICA9ICdQcmV2aW91cyBzbGlkZSc7CgkJCWtleWJvYXJkU2hvcnRjdXRzWycmIzg1OTI7ICAsICBIJ10gPSAnTmF2aWdhdGUgbGVmdCc7CgkJCWtleWJvYXJkU2hvcnRjdXRzWycmIzg1OTQ7ICAsICBMJ10gPSAnTmF2aWdhdGUgcmlnaHQnOwoJCQlrZXlib2FyZFNob3J0Y3V0c1snJiM4NTkzOyAgLCAgSyddID0gJ05hdmlnYXRlIHVwJzsKCQkJa2V5Ym9hcmRTaG9ydGN1dHNbJyYjODU5NTsgICwgIEonXSA9ICdOYXZpZ2F0ZSBkb3duJzsKCQl9CgoJCWtleWJvYXJkU2hvcnRjdXRzWydIb21lICAsICBTaGlmdCAmIzg1OTI7J10gICAgICAgID0gJ0ZpcnN0IHNsaWRlJzsKCQlrZXlib2FyZFNob3J0Y3V0c1snRW5kICAsICBTaGlmdCAmIzg1OTQ7J10gICAgICAgICA9ICdMYXN0IHNsaWRlJzsKCQlrZXlib2FyZFNob3J0Y3V0c1snQiAgLCAgLiddICAgICAgICAgICAgICAgICAgICAgICA9ICdQYXVzZSc7CgkJa2V5Ym9hcmRTaG9ydGN1dHNbJ0YnXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRnVsbHNjcmVlbic7CgkJa2V5Ym9hcmRTaG9ydGN1dHNbJ0VTQywgTyddICAgICAgICAgICAgICAgICAgICAgICAgPSAnU2xpZGUgb3ZlcnZpZXcnOwoKCQlzeW5jKCk7CgoJfQoKCS8qKgoJICogQmluZHMgYWxsIGV2ZW50IGxpc3RlbmVycy4KCSAqLwoJZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcnMoKSB7CgoJCWV2ZW50c0FyZUJvdW5kID0gdHJ1ZTsKCgkJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICdoYXNoY2hhbmdlJywgb25XaW5kb3dIYXNoQ2hhbmdlLCBmYWxzZSApOwoJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAncmVzaXplJywgb25XaW5kb3dSZXNpemUsIGZhbHNlICk7CgoJCWlmKCBjb25maWcudG91Y2ggKSB7CgkJCWlmKCAnb25wb2ludGVyZG93bicgaW4gd2luZG93ICkgewoJCQkJLy8gVXNlIFczQyBwb2ludGVyIGV2ZW50cwoJCQkJZG9tLndyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lciggJ3BvaW50ZXJkb3duJywgb25Qb2ludGVyRG93biwgZmFsc2UgKTsKCQkJCWRvbS53cmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoICdwb2ludGVybW92ZScsIG9uUG9pbnRlck1vdmUsIGZhbHNlICk7CgkJCQlkb20ud3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCAncG9pbnRlcnVwJywgb25Qb2ludGVyVXAsIGZhbHNlICk7CgkJCX0KCQkJZWxzZSBpZiggd2luZG93Lm5hdmlnYXRvci5tc1BvaW50ZXJFbmFibGVkICkgewoJCQkJLy8gSUUgMTAgdXNlcyBwcmVmaXhlZCB2ZXJzaW9uIG9mIHBvaW50ZXIgZXZlbnRzCgkJCQlkb20ud3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCAnTVNQb2ludGVyRG93bicsIG9uUG9pbnRlckRvd24sIGZhbHNlICk7CgkJCQlkb20ud3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCAnTVNQb2ludGVyTW92ZScsIG9uUG9pbnRlck1vdmUsIGZhbHNlICk7CgkJCQlkb20ud3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCAnTVNQb2ludGVyVXAnLCBvblBvaW50ZXJVcCwgZmFsc2UgKTsKCQkJfQoJCQllbHNlIHsKCQkJCS8vIEZhbGwgYmFjayB0byB0b3VjaCBldmVudHMKCQkJCWRvbS53cmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoICd0b3VjaHN0YXJ0Jywgb25Ub3VjaFN0YXJ0LCBmYWxzZSApOwoJCQkJZG9tLndyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lciggJ3RvdWNobW92ZScsIG9uVG91Y2hNb3ZlLCBmYWxzZSApOwoJCQkJZG9tLndyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lciggJ3RvdWNoZW5kJywgb25Ub3VjaEVuZCwgZmFsc2UgKTsKCQkJfQoJCX0KCgkJaWYoIGNvbmZpZy5rZXlib2FyZCApIHsKCQkJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ2tleWRvd24nLCBvbkRvY3VtZW50S2V5RG93biwgZmFsc2UgKTsKCQkJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ2tleXByZXNzJywgb25Eb2N1bWVudEtleVByZXNzLCBmYWxzZSApOwoJCX0KCgkJaWYoIGNvbmZpZy5wcm9ncmVzcyAmJiBkb20ucHJvZ3Jlc3MgKSB7CgkJCWRvbS5wcm9ncmVzcy5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCBvblByb2dyZXNzQ2xpY2tlZCwgZmFsc2UgKTsKCQl9CgoJCWRvbS5wYXVzZU92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgcmVzdW1lLCBmYWxzZSApOwoKCQlpZiggY29uZmlnLmZvY3VzQm9keU9uUGFnZVZpc2liaWxpdHlDaGFuZ2UgKSB7CgkJCXZhciB2aXNpYmlsaXR5Q2hhbmdlOwoKCQkJaWYoICdoaWRkZW4nIGluIGRvY3VtZW50ICkgewoJCQkJdmlzaWJpbGl0eUNoYW5nZSA9ICd2aXNpYmlsaXR5Y2hhbmdlJzsKCQkJfQoJCQllbHNlIGlmKCAnbXNIaWRkZW4nIGluIGRvY3VtZW50ICkgewoJCQkJdmlzaWJpbGl0eUNoYW5nZSA9ICdtc3Zpc2liaWxpdHljaGFuZ2UnOwoJCQl9CgkJCWVsc2UgaWYoICd3ZWJraXRIaWRkZW4nIGluIGRvY3VtZW50ICkgewoJCQkJdmlzaWJpbGl0eUNoYW5nZSA9ICd3ZWJraXR2aXNpYmlsaXR5Y2hhbmdlJzsKCQkJfQoKCQkJaWYoIHZpc2liaWxpdHlDaGFuZ2UgKSB7CgkJCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCB2aXNpYmlsaXR5Q2hhbmdlLCBvblBhZ2VWaXNpYmlsaXR5Q2hhbmdlLCBmYWxzZSApOwoJCQl9CgkJfQoKCQkvLyBMaXN0ZW4gdG8gYm90aCB0b3VjaCBhbmQgY2xpY2sgZXZlbnRzLCBpbiBjYXNlIHRoZSBkZXZpY2UKCQkvLyBzdXBwb3J0cyBib3RoCgkJdmFyIHBvaW50ZXJFdmVudHMgPSBbICd0b3VjaHN0YXJ0JywgJ2NsaWNrJyBdOwoKCQkvLyBPbmx5IHN1cHBvcnQgdG91Y2ggZm9yIEFuZHJvaWQsIGZpeGVzIGRvdWJsZSBuYXZpZ2F0aW9ucyBpbgoJCS8vIHN0b2NrIGJyb3dzZXIKCQlpZiggVUEubWF0Y2goIC9hbmRyb2lkL2dpICkgKSB7CgkJCXBvaW50ZXJFdmVudHMgPSBbICd0b3VjaHN0YXJ0JyBdOwoJCX0KCgkJcG9pbnRlckV2ZW50cy5mb3JFYWNoKCBmdW5jdGlvbiggZXZlbnROYW1lICkgewoJCQlkb20uY29udHJvbHNMZWZ0LmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsgZWwuYWRkRXZlbnRMaXN0ZW5lciggZXZlbnROYW1lLCBvbk5hdmlnYXRlTGVmdENsaWNrZWQsIGZhbHNlICk7IH0gKTsKCQkJZG9tLmNvbnRyb2xzUmlnaHQuZm9yRWFjaCggZnVuY3Rpb24oIGVsICkgeyBlbC5hZGRFdmVudExpc3RlbmVyKCBldmVudE5hbWUsIG9uTmF2aWdhdGVSaWdodENsaWNrZWQsIGZhbHNlICk7IH0gKTsKCQkJZG9tLmNvbnRyb2xzVXAuZm9yRWFjaCggZnVuY3Rpb24oIGVsICkgeyBlbC5hZGRFdmVudExpc3RlbmVyKCBldmVudE5hbWUsIG9uTmF2aWdhdGVVcENsaWNrZWQsIGZhbHNlICk7IH0gKTsKCQkJZG9tLmNvbnRyb2xzRG93bi5mb3JFYWNoKCBmdW5jdGlvbiggZWwgKSB7IGVsLmFkZEV2ZW50TGlzdGVuZXIoIGV2ZW50TmFtZSwgb25OYXZpZ2F0ZURvd25DbGlja2VkLCBmYWxzZSApOyB9ICk7CgkJCWRvbS5jb250cm9sc1ByZXYuZm9yRWFjaCggZnVuY3Rpb24oIGVsICkgeyBlbC5hZGRFdmVudExpc3RlbmVyKCBldmVudE5hbWUsIG9uTmF2aWdhdGVQcmV2Q2xpY2tlZCwgZmFsc2UgKTsgfSApOwoJCQlkb20uY29udHJvbHNOZXh0LmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsgZWwuYWRkRXZlbnRMaXN0ZW5lciggZXZlbnROYW1lLCBvbk5hdmlnYXRlTmV4dENsaWNrZWQsIGZhbHNlICk7IH0gKTsKCQl9ICk7CgoJfQoKCS8qKgoJICogVW5iaW5kcyBhbGwgZXZlbnQgbGlzdGVuZXJzLgoJICovCglmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVycygpIHsKCgkJZXZlbnRzQXJlQm91bmQgPSBmYWxzZTsKCgkJZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2tleWRvd24nLCBvbkRvY3VtZW50S2V5RG93biwgZmFsc2UgKTsKCQlkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAna2V5cHJlc3MnLCBvbkRvY3VtZW50S2V5UHJlc3MsIGZhbHNlICk7CgkJd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdoYXNoY2hhbmdlJywgb25XaW5kb3dIYXNoQ2hhbmdlLCBmYWxzZSApOwoJCXdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCAncmVzaXplJywgb25XaW5kb3dSZXNpemUsIGZhbHNlICk7CgoJCWRvbS53cmFwcGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdwb2ludGVyZG93bicsIG9uUG9pbnRlckRvd24sIGZhbHNlICk7CgkJZG9tLndyYXBwZXIucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3BvaW50ZXJtb3ZlJywgb25Qb2ludGVyTW92ZSwgZmFsc2UgKTsKCQlkb20ud3JhcHBlci5yZW1vdmVFdmVudExpc3RlbmVyKCAncG9pbnRlcnVwJywgb25Qb2ludGVyVXAsIGZhbHNlICk7CgoJCWRvbS53cmFwcGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdNU1BvaW50ZXJEb3duJywgb25Qb2ludGVyRG93biwgZmFsc2UgKTsKCQlkb20ud3JhcHBlci5yZW1vdmVFdmVudExpc3RlbmVyKCAnTVNQb2ludGVyTW92ZScsIG9uUG9pbnRlck1vdmUsIGZhbHNlICk7CgkJZG9tLndyYXBwZXIucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ01TUG9pbnRlclVwJywgb25Qb2ludGVyVXAsIGZhbHNlICk7CgoJCWRvbS53cmFwcGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoICd0b3VjaHN0YXJ0Jywgb25Ub3VjaFN0YXJ0LCBmYWxzZSApOwoJCWRvbS53cmFwcGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoICd0b3VjaG1vdmUnLCBvblRvdWNoTW92ZSwgZmFsc2UgKTsKCQlkb20ud3JhcHBlci5yZW1vdmVFdmVudExpc3RlbmVyKCAndG91Y2hlbmQnLCBvblRvdWNoRW5kLCBmYWxzZSApOwoKCQlkb20ucGF1c2VPdmVybGF5LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdjbGljaycsIHJlc3VtZSwgZmFsc2UgKTsKCgkJaWYgKCBjb25maWcucHJvZ3Jlc3MgJiYgZG9tLnByb2dyZXNzICkgewoJCQlkb20ucHJvZ3Jlc3MucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgb25Qcm9ncmVzc0NsaWNrZWQsIGZhbHNlICk7CgkJfQoKCQlbICd0b3VjaHN0YXJ0JywgJ2NsaWNrJyBdLmZvckVhY2goIGZ1bmN0aW9uKCBldmVudE5hbWUgKSB7CgkJCWRvbS5jb250cm9sc0xlZnQuZm9yRWFjaCggZnVuY3Rpb24oIGVsICkgeyBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCBldmVudE5hbWUsIG9uTmF2aWdhdGVMZWZ0Q2xpY2tlZCwgZmFsc2UgKTsgfSApOwoJCQlkb20uY29udHJvbHNSaWdodC5mb3JFYWNoKCBmdW5jdGlvbiggZWwgKSB7IGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoIGV2ZW50TmFtZSwgb25OYXZpZ2F0ZVJpZ2h0Q2xpY2tlZCwgZmFsc2UgKTsgfSApOwoJCQlkb20uY29udHJvbHNVcC5mb3JFYWNoKCBmdW5jdGlvbiggZWwgKSB7IGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoIGV2ZW50TmFtZSwgb25OYXZpZ2F0ZVVwQ2xpY2tlZCwgZmFsc2UgKTsgfSApOwoJCQlkb20uY29udHJvbHNEb3duLmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lciggZXZlbnROYW1lLCBvbk5hdmlnYXRlRG93bkNsaWNrZWQsIGZhbHNlICk7IH0gKTsKCQkJZG9tLmNvbnRyb2xzUHJldi5mb3JFYWNoKCBmdW5jdGlvbiggZWwgKSB7IGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoIGV2ZW50TmFtZSwgb25OYXZpZ2F0ZVByZXZDbGlja2VkLCBmYWxzZSApOyB9ICk7CgkJCWRvbS5jb250cm9sc05leHQuZm9yRWFjaCggZnVuY3Rpb24oIGVsICkgeyBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCBldmVudE5hbWUsIG9uTmF2aWdhdGVOZXh0Q2xpY2tlZCwgZmFsc2UgKTsgfSApOwoJCX0gKTsKCgl9CgoJLyoqCgkgKiBSZWdpc3RlcnMgYSBuZXcgcGx1Z2luIHdpdGggdGhpcyByZXZlYWwuanMgaW5zdGFuY2UuCgkgKgoJICogcmV2ZWFsLmpzIHdhaXRzIGZvciBhbGwgcmVnaXNlcmVkIHBsdWdpbnMgdG8gaW5pdGlhbGl6ZQoJICogYmVmb3JlIGNvbnNpZGVyaW5nIGl0c2VsZiByZWFkeSwgYXMgbG9uZyBhcyB0aGUgcGx1Z2luCgkgKiBpcyByZWdpc3RlcmVkIGJlZm9yZSBjYWxsaW5nIGBSZXZlYWwuaW5pdGlhbGl6ZSgpYC4KCSAqLwoJZnVuY3Rpb24gcmVnaXN0ZXJQbHVnaW4oIGlkLCBwbHVnaW4gKSB7CgoJCWlmKCBwbHVnaW5zW2lkXSA9PT0gdW5kZWZpbmVkICkgewoJCQlwbHVnaW5zW2lkXSA9IHBsdWdpbjsKCgkJCS8vIElmIGEgcGx1Z2luIGlzIHJlZ2lzdGVyZWQgYWZ0ZXIgcmV2ZWFsLmpzIGlzIGxvYWRlZCwKCQkJLy8gaW5pdGlhbGl6ZSBpdCByaWdodCBhd2F5CgkJCWlmKCBsb2FkZWQgJiYgdHlwZW9mIHBsdWdpbi5pbml0ID09PSAnZnVuY3Rpb24nICkgewoJCQkJcGx1Z2luLmluaXQoKTsKCQkJfQoJCX0KCQllbHNlIHsKCQkJY29uc29sZS53YXJuKCAncmV2ZWFsLmpzOiAiJysgaWQgKyciIHBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQnICk7CgkJfQoKCX0KCgkvKioKCSAqIENoZWNrcyBpZiBhIHNwZWNpZmljIHBsdWdpbiBoYXMgYmVlbiByZWdpc3RlcmVkLgoJICoKCSAqIEBwYXJhbSB7U3RyaW5nfSBpZCBVbmlxdWUgcGx1Z2luIGlkZW50aWZpZXIKCSAqLwoJZnVuY3Rpb24gaGFzUGx1Z2luKCBpZCApIHsKCgkJcmV0dXJuICEhcGx1Z2luc1tpZF07CgoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgc3BlY2lmaWMgcGx1Z2luIGluc3RhbmNlLCBpZiBhIHBsdWdpbgoJICogd2l0aCB0aGUgZ2l2ZW4gSUQgaGFzIGJlZW4gcmVnaXN0ZXJlZC4KCSAqCgkgKiBAcGFyYW0ge1N0cmluZ30gaWQgVW5pcXVlIHBsdWdpbiBpZGVudGlmaWVyCgkgKi8KCWZ1bmN0aW9uIGdldFBsdWdpbiggaWQgKSB7CgoJCXJldHVybiBwbHVnaW5zW2lkXTsKCgl9CgoJLyoqCgkgKiBBZGQgYSBjdXN0b20ga2V5IGJpbmRpbmcgd2l0aCBvcHRpb25hbCBkZXNjcmlwdGlvbiB0bwoJICogYmUgYWRkZWQgdG8gdGhlIGhlbHAgc2NyZWVuLgoJICovCglmdW5jdGlvbiBhZGRLZXlCaW5kaW5nKCBiaW5kaW5nLCBjYWxsYmFjayApIHsKCgkJaWYoIHR5cGVvZiBiaW5kaW5nID09PSAnb2JqZWN0JyAmJiBiaW5kaW5nLmtleUNvZGUgKSB7CgkJCXJlZ2lzdGVyZWRLZXlCaW5kaW5nc1tiaW5kaW5nLmtleUNvZGVdID0gewoJCQkJY2FsbGJhY2s6IGNhbGxiYWNrLAoJCQkJa2V5OiBiaW5kaW5nLmtleSwKCQkJCWRlc2NyaXB0aW9uOiBiaW5kaW5nLmRlc2NyaXB0aW9uCgkJCX07CgkJfQoJCWVsc2UgewoJCQlyZWdpc3RlcmVkS2V5QmluZGluZ3NbYmluZGluZ10gPSB7CgkJCQljYWxsYmFjazogY2FsbGJhY2ssCgkJCQlrZXk6IG51bGwsCgkJCQlkZXNjcmlwdGlvbjogbnVsbAoJCQl9OwoJCX0KCgl9CgoJLyoqCgkgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgY3VzdG9tIGtleSBiaW5kaW5nLgoJICovCglmdW5jdGlvbiByZW1vdmVLZXlCaW5kaW5nKCBrZXlDb2RlICkgewoKCQlkZWxldGUgcmVnaXN0ZXJlZEtleUJpbmRpbmdzW2tleUNvZGVdOwoKCX0KCgkvKioKCSAqIEV4dGVuZCBvYmplY3QgYSB3aXRoIHRoZSBwcm9wZXJ0aWVzIG9mIG9iamVjdCBiLgoJICogSWYgdGhlcmUncyBhIGNvbmZsaWN0LCBvYmplY3QgYiB0YWtlcyBwcmVjZWRlbmNlLgoJICoKCSAqIEBwYXJhbSB7b2JqZWN0fSBhCgkgKiBAcGFyYW0ge29iamVjdH0gYgoJICovCglmdW5jdGlvbiBleHRlbmQoIGEsIGIgKSB7CgoJCWZvciggdmFyIGkgaW4gYiApIHsKCQkJYVsgaSBdID0gYlsgaSBdOwoJCX0KCgkJcmV0dXJuIGE7CgoJfQoKCS8qKgoJICogQ29udmVydHMgdGhlIHRhcmdldCBvYmplY3QgdG8gYW4gYXJyYXkuCgkgKgoJICogQHBhcmFtIHtvYmplY3R9IG8KCSAqIEByZXR1cm4ge29iamVjdFtdfQoJICovCglmdW5jdGlvbiB0b0FycmF5KCBvICkgewoKCQlyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIG8gKTsKCgl9CgoJLyoqCgkgKiBVdGlsaXR5IGZvciBkZXNlcmlhbGl6aW5nIGEgdmFsdWUuCgkgKgoJICogQHBhcmFtIHsqfSB2YWx1ZQoJICogQHJldHVybiB7Kn0KCSAqLwoJZnVuY3Rpb24gZGVzZXJpYWxpemUoIHZhbHVlICkgewoKCQlpZiggdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyApIHsKCQkJaWYoIHZhbHVlID09PSAnbnVsbCcgKSByZXR1cm4gbnVsbDsKCQkJZWxzZSBpZiggdmFsdWUgPT09ICd0cnVlJyApIHJldHVybiB0cnVlOwoJCQllbHNlIGlmKCB2YWx1ZSA9PT0gJ2ZhbHNlJyApIHJldHVybiBmYWxzZTsKCQkJZWxzZSBpZiggdmFsdWUubWF0Y2goIC9eLT9bXGRcLl0rJC8gKSApIHJldHVybiBwYXJzZUZsb2F0KCB2YWx1ZSApOwoJCX0KCgkJcmV0dXJuIHZhbHVlOwoKCX0KCgkvKioKCSAqIE1lYXN1cmVzIHRoZSBkaXN0YW5jZSBpbiBwaXhlbHMgYmV0d2VlbiBwb2ludCBhCgkgKiBhbmQgcG9pbnQgYi4KCSAqCgkgKiBAcGFyYW0ge29iamVjdH0gYSBwb2ludCB3aXRoIHgveSBwcm9wZXJ0aWVzCgkgKiBAcGFyYW0ge29iamVjdH0gYiBwb2ludCB3aXRoIHgveSBwcm9wZXJ0aWVzCgkgKgoJICogQHJldHVybiB7bnVtYmVyfQoJICovCglmdW5jdGlvbiBkaXN0YW5jZUJldHdlZW4oIGEsIGIgKSB7CgoJCXZhciBkeCA9IGEueCAtIGIueCwKCQkJZHkgPSBhLnkgLSBiLnk7CgoJCXJldHVybiBNYXRoLnNxcnQoIGR4KmR4ICsgZHkqZHkgKTsKCgl9CgoJLyoqCgkgKiBBcHBsaWVzIGEgQ1NTIHRyYW5zZm9ybSB0byB0aGUgdGFyZ2V0IGVsZW1lbnQuCgkgKgoJICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudAoJICogQHBhcmFtIHtzdHJpbmd9IHRyYW5zZm9ybQoJICovCglmdW5jdGlvbiB0cmFuc2Zvcm1FbGVtZW50KCBlbGVtZW50LCB0cmFuc2Zvcm0gKSB7CgoJCWVsZW1lbnQuc3R5bGUuV2Via2l0VHJhbnNmb3JtID0gdHJhbnNmb3JtOwoJCWVsZW1lbnQuc3R5bGUuTW96VHJhbnNmb3JtID0gdHJhbnNmb3JtOwoJCWVsZW1lbnQuc3R5bGUubXNUcmFuc2Zvcm0gPSB0cmFuc2Zvcm07CgkJZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07CgoJfQoKCS8qKgoJICogQXBwbGllcyBDU1MgdHJhbnNmb3JtcyB0byB0aGUgc2xpZGVzIGNvbnRhaW5lci4gVGhlIGNvbnRhaW5lcgoJICogaXMgdHJhbnNmb3JtZWQgZnJvbSB0d28gc2VwYXJhdGUgc291cmNlczogbGF5b3V0IGFuZCB0aGUgb3ZlcnZpZXcKCSAqIG1vZGUuCgkgKgoJICogQHBhcmFtIHtvYmplY3R9IHRyYW5zZm9ybXMKCSAqLwoJZnVuY3Rpb24gdHJhbnNmb3JtU2xpZGVzKCB0cmFuc2Zvcm1zICkgewoKCQkvLyBQaWNrIHVwIG5ldyB0cmFuc2Zvcm1zIGZyb20gYXJndW1lbnRzCgkJaWYoIHR5cGVvZiB0cmFuc2Zvcm1zLmxheW91dCA9PT0gJ3N0cmluZycgKSBzbGlkZXNUcmFuc2Zvcm0ubGF5b3V0ID0gdHJhbnNmb3Jtcy5sYXlvdXQ7CgkJaWYoIHR5cGVvZiB0cmFuc2Zvcm1zLm92ZXJ2aWV3ID09PSAnc3RyaW5nJyApIHNsaWRlc1RyYW5zZm9ybS5vdmVydmlldyA9IHRyYW5zZm9ybXMub3ZlcnZpZXc7CgoJCS8vIEFwcGx5IHRoZSB0cmFuc2Zvcm1zIHRvIHRoZSBzbGlkZXMgY29udGFpbmVyCgkJaWYoIHNsaWRlc1RyYW5zZm9ybS5sYXlvdXQgKSB7CgkJCXRyYW5zZm9ybUVsZW1lbnQoIGRvbS5zbGlkZXMsIHNsaWRlc1RyYW5zZm9ybS5sYXlvdXQgKyAnICcgKyBzbGlkZXNUcmFuc2Zvcm0ub3ZlcnZpZXcgKTsKCQl9CgkJZWxzZSB7CgkJCXRyYW5zZm9ybUVsZW1lbnQoIGRvbS5zbGlkZXMsIHNsaWRlc1RyYW5zZm9ybS5vdmVydmlldyApOwoJCX0KCgl9CgoJLyoqCgkgKiBJbmplY3RzIHRoZSBnaXZlbiBDU1Mgc3R5bGVzIGludG8gdGhlIERPTS4KCSAqCgkgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUKCSAqLwoJZnVuY3Rpb24gaW5qZWN0U3R5bGVTaGVldCggdmFsdWUgKSB7CgoJCXZhciB0YWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnc3R5bGUnICk7CgkJdGFnLnR5cGUgPSAndGV4dC9jc3MnOwoJCWlmKCB0YWcuc3R5bGVTaGVldCApIHsKCQkJdGFnLnN0eWxlU2hlZXQuY3NzVGV4dCA9IHZhbHVlOwoJCX0KCQllbHNlIHsKCQkJdGFnLmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSggdmFsdWUgKSApOwoJCX0KCQlkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggJ2hlYWQnIClbMF0uYXBwZW5kQ2hpbGQoIHRhZyApOwoKCX0KCgkvKioKCSAqIEZpbmQgdGhlIGNsb3Nlc3QgcGFyZW50IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4KCSAqIHNlbGVjdG9yLgoJICoKCSAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRhcmdldCBUaGUgY2hpbGQgZWxlbWVudAoJICogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yIFRoZSBDU1Mgc2VsZWN0b3IgdG8gbWF0Y2gKCSAqIHRoZSBwYXJlbnRzIGFnYWluc3QKCSAqCgkgKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0gVGhlIG1hdGNoZWQgcGFyZW50IG9yIG51bGwKCSAqIGlmIG5vIG1hdGNoaW5nIHBhcmVudCB3YXMgZm91bmQKCSAqLwoJZnVuY3Rpb24gY2xvc2VzdFBhcmVudCggdGFyZ2V0LCBzZWxlY3RvciApIHsKCgkJdmFyIHBhcmVudCA9IHRhcmdldC5wYXJlbnROb2RlOwoKCQl3aGlsZSggcGFyZW50ICkgewoKCQkJLy8gVGhlcmUncyBzb21lIG92ZXJoZWFkIGRvaW5nIHRoaXMgZWFjaCB0aW1lLCB3ZSBkb24ndAoJCQkvLyB3YW50IHRvIHJld3JpdGUgdGhlIGVsZW1lbnQgcHJvdG90eXBlIGJ1dCBzaG91bGQgc3RpbGwKCQkJLy8gYmUgZW5vdWdoIHRvIGZlYXR1cmUgZGV0ZWN0IG9uY2UgYXQgc3RhcnR1cC4uLgoJCQl2YXIgbWF0Y2hlc01ldGhvZCA9IHBhcmVudC5tYXRjaGVzIHx8IHBhcmVudC5tYXRjaGVzU2VsZWN0b3IgfHwgcGFyZW50Lm1zTWF0Y2hlc1NlbGVjdG9yOwoKCQkJLy8gSWYgd2UgZmluZCBhIG1hdGNoLCB3ZSdyZSBhbGwgc2V0CgkJCWlmKCBtYXRjaGVzTWV0aG9kICYmIG1hdGNoZXNNZXRob2QuY2FsbCggcGFyZW50LCBzZWxlY3RvciApICkgewoJCQkJcmV0dXJuIHBhcmVudDsKCQkJfQoKCQkJLy8gS2VlcCBzZWFyY2hpbmcKCQkJcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7CgoJCX0KCgkJcmV0dXJuIG51bGw7CgoJfQoKCS8qKgoJICogQ29udmVydHMgdmFyaW91cyBjb2xvciBpbnB1dCBmb3JtYXRzIHRvIGFuIHtyOjAsZzowLGI6MH0gb2JqZWN0LgoJICoKCSAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvciBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgY29sb3IKCSAqIEBleGFtcGxlCgkgKiBjb2xvclRvUmdiKCcjMDAwJyk7CgkgKiBAZXhhbXBsZQoJICogY29sb3JUb1JnYignIzAwMDAwMCcpOwoJICogQGV4YW1wbGUKCSAqIGNvbG9yVG9SZ2IoJ3JnYigwLDAsMCknKTsKCSAqIEBleGFtcGxlCgkgKiBjb2xvclRvUmdiKCdyZ2JhKDAsMCwwKScpOwoJICoKCSAqIEByZXR1cm4ge3tyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBbYV06IG51bWJlcn18bnVsbH0KCSAqLwoJZnVuY3Rpb24gY29sb3JUb1JnYiggY29sb3IgKSB7CgoJCXZhciBoZXgzID0gY29sb3IubWF0Y2goIC9eIyhbMC05YS1mXXszfSkkL2kgKTsKCQlpZiggaGV4MyAmJiBoZXgzWzFdICkgewoJCQloZXgzID0gaGV4M1sxXTsKCQkJcmV0dXJuIHsKCQkJCXI6IHBhcnNlSW50KCBoZXgzLmNoYXJBdCggMCApLCAxNiApICogMHgxMSwKCQkJCWc6IHBhcnNlSW50KCBoZXgzLmNoYXJBdCggMSApLCAxNiApICogMHgxMSwKCQkJCWI6IHBhcnNlSW50KCBoZXgzLmNoYXJBdCggMiApLCAxNiApICogMHgxMQoJCQl9OwoJCX0KCgkJdmFyIGhleDYgPSBjb2xvci5tYXRjaCggL14jKFswLTlhLWZdezZ9KSQvaSApOwoJCWlmKCBoZXg2ICYmIGhleDZbMV0gKSB7CgkJCWhleDYgPSBoZXg2WzFdOwoJCQlyZXR1cm4gewoJCQkJcjogcGFyc2VJbnQoIGhleDYuc3Vic3RyKCAwLCAyICksIDE2ICksCgkJCQlnOiBwYXJzZUludCggaGV4Ni5zdWJzdHIoIDIsIDIgKSwgMTYgKSwKCQkJCWI6IHBhcnNlSW50KCBoZXg2LnN1YnN0ciggNCwgMiApLCAxNiApCgkJCX07CgkJfQoKCQl2YXIgcmdiID0gY29sb3IubWF0Y2goIC9ecmdiXHMqXChccyooXGQrKVxzKixccyooXGQrKVxzKixccyooXGQrKVxzKlwpJC9pICk7CgkJaWYoIHJnYiApIHsKCQkJcmV0dXJuIHsKCQkJCXI6IHBhcnNlSW50KCByZ2JbMV0sIDEwICksCgkJCQlnOiBwYXJzZUludCggcmdiWzJdLCAxMCApLAoJCQkJYjogcGFyc2VJbnQoIHJnYlszXSwgMTAgKQoJCQl9OwoJCX0KCgkJdmFyIHJnYmEgPSBjb2xvci5tYXRjaCggL15yZ2JhXHMqXChccyooXGQrKVxzKixccyooXGQrKVxzKixccyooXGQrKVxzKlwsXHMqKFtcZF0rfFtcZF0qLltcZF0rKVxzKlwpJC9pICk7CgkJaWYoIHJnYmEgKSB7CgkJCXJldHVybiB7CgkJCQlyOiBwYXJzZUludCggcmdiYVsxXSwgMTAgKSwKCQkJCWc6IHBhcnNlSW50KCByZ2JhWzJdLCAxMCApLAoJCQkJYjogcGFyc2VJbnQoIHJnYmFbM10sIDEwICksCgkJCQlhOiBwYXJzZUZsb2F0KCByZ2JhWzRdICkKCQkJfTsKCQl9CgoJCXJldHVybiBudWxsOwoKCX0KCgkvKioKCSAqIENhbGN1bGF0ZXMgYnJpZ2h0bmVzcyBvbiBhIHNjYWxlIG9mIDAtMjU1LgoJICoKCSAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvciBTZWUgY29sb3JUb1JnYiBmb3Igc3VwcG9ydGVkIGZvcm1hdHMuCgkgKiBAc2VlIHtAbGluayBjb2xvclRvUmdifQoJICovCglmdW5jdGlvbiBjb2xvckJyaWdodG5lc3MoIGNvbG9yICkgewoKCQlpZiggdHlwZW9mIGNvbG9yID09PSAnc3RyaW5nJyApIGNvbG9yID0gY29sb3JUb1JnYiggY29sb3IgKTsKCgkJaWYoIGNvbG9yICkgewoJCQlyZXR1cm4gKCBjb2xvci5yICogMjk5ICsgY29sb3IuZyAqIDU4NyArIGNvbG9yLmIgKiAxMTQgKSAvIDEwMDA7CgkJfQoKCQlyZXR1cm4gbnVsbDsKCgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSByZW1haW5pbmcgaGVpZ2h0IHdpdGhpbiB0aGUgcGFyZW50IG9mIHRoZQoJICogdGFyZ2V0IGVsZW1lbnQuCgkgKgoJICogcmVtYWluaW5nIGhlaWdodCA9IFsgY29uZmlndXJlZCBwYXJlbnQgaGVpZ2h0IF0gLSBbIGN1cnJlbnQgcGFyZW50IGhlaWdodCBdCgkgKgoJICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudAoJICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHRdCgkgKi8KCWZ1bmN0aW9uIGdldFJlbWFpbmluZ0hlaWdodCggZWxlbWVudCwgaGVpZ2h0ICkgewoKCQloZWlnaHQgPSBoZWlnaHQgfHwgMDsKCgkJaWYoIGVsZW1lbnQgKSB7CgkJCXZhciBuZXdIZWlnaHQsIG9sZEhlaWdodCA9IGVsZW1lbnQuc3R5bGUuaGVpZ2h0OwoKCQkJLy8gQ2hhbmdlIHRoZSAuc3RyZXRjaCBlbGVtZW50IGhlaWdodCB0byAwIGluIG9yZGVyIGZpbmQgdGhlIGhlaWdodCBvZiBhbGwKCQkJLy8gdGhlIG90aGVyIGVsZW1lbnRzCgkJCWVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzBweCc7CgoJCQkvLyBJbiBPdmVydmlldyBtb2RlLCB0aGUgcGFyZW50ICguc2xpZGUpIGhlaWdodCBpcyBzZXQgb2YgNzAwcHguCgkJCS8vIFJlc3RvcmUgaXQgdGVtcG9yYXJpbHkgdG8gaXRzIG5hdHVyYWwgaGVpZ2h0LgoJCQllbGVtZW50LnBhcmVudE5vZGUuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nOwoKCQkJbmV3SGVpZ2h0ID0gaGVpZ2h0IC0gZWxlbWVudC5wYXJlbnROb2RlLm9mZnNldEhlaWdodDsKCgkJCS8vIFJlc3RvcmUgdGhlIG9sZCBoZWlnaHQsIGp1c3QgaW4gY2FzZQoJCQllbGVtZW50LnN0eWxlLmhlaWdodCA9IG9sZEhlaWdodCArICdweCc7CgoJCQkvLyBDbGVhciB0aGUgcGFyZW50ICguc2xpZGUpIGhlaWdodC4gLnJlbW92ZVByb3BlcnR5IHdvcmtzIGluIElFOSsKCQkJZWxlbWVudC5wYXJlbnROb2RlLnN0eWxlLnJlbW92ZVByb3BlcnR5KCdoZWlnaHQnKTsKCgkJCXJldHVybiBuZXdIZWlnaHQ7CgkJfQoKCQlyZXR1cm4gaGVpZ2h0OwoKCX0KCgkvKioKCSAqIENoZWNrcyBpZiB0aGlzIGluc3RhbmNlIGlzIGJlaW5nIHVzZWQgdG8gcHJpbnQgYSBQREYuCgkgKi8KCWZ1bmN0aW9uIGlzUHJpbnRpbmdQREYoKSB7CgoJCXJldHVybiAoIC9wcmludC1wZGYvZ2kgKS50ZXN0KCB3aW5kb3cubG9jYXRpb24uc2VhcmNoICk7CgoJfQoKCS8qKgoJICogSGlkZXMgdGhlIGFkZHJlc3MgYmFyIGlmIHdlJ3JlIG9uIGEgbW9iaWxlIGRldmljZS4KCSAqLwoJZnVuY3Rpb24gaGlkZUFkZHJlc3NCYXIoKSB7CgoJCWlmKCBjb25maWcuaGlkZUFkZHJlc3NCYXIgJiYgaXNNb2JpbGVEZXZpY2UgKSB7CgkJCS8vIEV2ZW50cyB0aGF0IHNob3VsZCB0cmlnZ2VyIHRoZSBhZGRyZXNzIGJhciB0byBoaWRlCgkJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAnbG9hZCcsIHJlbW92ZUFkZHJlc3NCYXIsIGZhbHNlICk7CgkJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAnb3JpZW50YXRpb25jaGFuZ2UnLCByZW1vdmVBZGRyZXNzQmFyLCBmYWxzZSApOwoJCX0KCgl9CgoJLyoqCgkgKiBDYXVzZXMgdGhlIGFkZHJlc3MgYmFyIHRvIGhpZGUgb24gbW9iaWxlIGRldmljZXMsCgkgKiBtb3JlIHZlcnRpY2FsIHNwYWNlIGZ0dy4KCSAqLwoJZnVuY3Rpb24gcmVtb3ZlQWRkcmVzc0JhcigpIHsKCgkJc2V0VGltZW91dCggZnVuY3Rpb24oKSB7CgkJCXdpbmRvdy5zY3JvbGxUbyggMCwgMSApOwoJCX0sIDEwICk7CgoJfQoKCS8qKgoJICogRGlzcGF0Y2hlcyBhbiBldmVudCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgZnJvbSB0aGUKCSAqIHJldmVhbCBET00gZWxlbWVudC4KCSAqLwoJZnVuY3Rpb24gZGlzcGF0Y2hFdmVudCggdHlwZSwgYXJncyApIHsKCgkJdmFyIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoICdIVE1MRXZlbnRzJywgMSwgMiApOwoJCWV2ZW50LmluaXRFdmVudCggdHlwZSwgdHJ1ZSwgdHJ1ZSApOwoJCWV4dGVuZCggZXZlbnQsIGFyZ3MgKTsKCQlkb20ud3JhcHBlci5kaXNwYXRjaEV2ZW50KCBldmVudCApOwoKCQkvLyBJZiB3ZSdyZSBpbiBhbiBpZnJhbWUsIHBvc3QgZWFjaCByZXZlYWwuanMgZXZlbnQgdG8gdGhlCgkJLy8gcGFyZW50IHdpbmRvdy4gVXNlZCBieSB0aGUgbm90ZXMgcGx1Z2luCgkJZGlzcGF0Y2hQb3N0TWVzc2FnZSggdHlwZSApOwoKCX0KCgkvKioKCSAqIERpc3BhdGNoZWQgYSBwb3N0TWVzc2FnZSBvZiB0aGUgZ2l2ZW4gdHlwZSBmcm9tIG91ciB3aW5kb3cuCgkgKi8KCWZ1bmN0aW9uIGRpc3BhdGNoUG9zdE1lc3NhZ2UoIHR5cGUsIGRhdGEgKSB7CgoJCWlmKCBjb25maWcucG9zdE1lc3NhZ2VFdmVudHMgJiYgd2luZG93LnBhcmVudCAhPT0gd2luZG93LnNlbGYgKSB7CgkJCXZhciBtZXNzYWdlID0gewoJCQkJbmFtZXNwYWNlOiAncmV2ZWFsJywKCQkJCWV2ZW50TmFtZTogdHlwZSwKCQkJCXN0YXRlOiBnZXRTdGF0ZSgpCgkJCX07CgoJCQlleHRlbmQoIG1lc3NhZ2UsIGRhdGEgKTsKCgkJCXdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoIEpTT04uc3RyaW5naWZ5KCBtZXNzYWdlICksICcqJyApOwoJCX0KCgl9CgoJLyoqCgkgKiBXcmFwIGFsbCBsaW5rcyBpbiAzRCBnb29kbmVzcy4KCSAqLwoJZnVuY3Rpb24gZW5hYmxlUm9sbGluZ0xpbmtzKCkgewoKCQlpZiggZmVhdHVyZXMudHJhbnNmb3JtczNkICYmICEoICdtc1BlcnNwZWN0aXZlJyBpbiBkb2N1bWVudC5ib2R5LnN0eWxlICkgKSB7CgkJCXZhciBhbmNob3JzID0gZG9tLndyYXBwZXIucXVlcnlTZWxlY3RvckFsbCggU0xJREVTX1NFTEVDVE9SICsgJyBhJyApOwoKCQkJZm9yKCB2YXIgaSA9IDAsIGxlbiA9IGFuY2hvcnMubGVuZ3RoOyBpIDwgbGVuOyBpKysgKSB7CgkJCQl2YXIgYW5jaG9yID0gYW5jaG9yc1tpXTsKCgkJCQlpZiggYW5jaG9yLnRleHRDb250ZW50ICYmICFhbmNob3IucXVlcnlTZWxlY3RvciggJyonICkgJiYgKCAhYW5jaG9yLmNsYXNzTmFtZSB8fCAhYW5jaG9yLmNsYXNzTGlzdC5jb250YWlucyggYW5jaG9yLCAncm9sbCcgKSApICkgewoJCQkJCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwoJCQkJCXNwYW4uc2V0QXR0cmlidXRlKCdkYXRhLXRpdGxlJywgYW5jaG9yLnRleHQpOwoJCQkJCXNwYW4uaW5uZXJIVE1MID0gYW5jaG9yLmlubmVySFRNTDsKCgkJCQkJYW5jaG9yLmNsYXNzTGlzdC5hZGQoICdyb2xsJyApOwoJCQkJCWFuY2hvci5pbm5lckhUTUwgPSAnJzsKCQkJCQlhbmNob3IuYXBwZW5kQ2hpbGQoc3Bhbik7CgkJCQl9CgkJCX0KCQl9CgoJfQoKCS8qKgoJICogVW53cmFwIGFsbCAzRCBsaW5rcy4KCSAqLwoJZnVuY3Rpb24gZGlzYWJsZVJvbGxpbmdMaW5rcygpIHsKCgkJdmFyIGFuY2hvcnMgPSBkb20ud3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCBTTElERVNfU0VMRUNUT1IgKyAnIGEucm9sbCcgKTsKCgkJZm9yKCB2YXIgaSA9IDAsIGxlbiA9IGFuY2hvcnMubGVuZ3RoOyBpIDwgbGVuOyBpKysgKSB7CgkJCXZhciBhbmNob3IgPSBhbmNob3JzW2ldOwoJCQl2YXIgc3BhbiA9IGFuY2hvci5xdWVyeVNlbGVjdG9yKCAnc3BhbicgKTsKCgkJCWlmKCBzcGFuICkgewoJCQkJYW5jaG9yLmNsYXNzTGlzdC5yZW1vdmUoICdyb2xsJyApOwoJCQkJYW5jaG9yLmlubmVySFRNTCA9IHNwYW4uaW5uZXJIVE1MOwoJCQl9CgkJfQoKCX0KCgkvKioKCSAqIEJpbmQgcHJldmlldyBmcmFtZSBsaW5rcy4KCSAqCgkgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPWFdIC0gc2VsZWN0b3IgZm9yIGFuY2hvcnMKCSAqLwoJZnVuY3Rpb24gZW5hYmxlUHJldmlld0xpbmtzKCBzZWxlY3RvciApIHsKCgkJdmFyIGFuY2hvcnMgPSB0b0FycmF5KCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCBzZWxlY3RvciA/IHNlbGVjdG9yIDogJ2EnICkgKTsKCgkJYW5jaG9ycy5mb3JFYWNoKCBmdW5jdGlvbiggZWxlbWVudCApIHsKCQkJaWYoIC9eKGh0dHB8d3d3KS9naS50ZXN0KCBlbGVtZW50LmdldEF0dHJpYnV0ZSggJ2hyZWYnICkgKSApIHsKCQkJCWVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgb25QcmV2aWV3TGlua0NsaWNrZWQsIGZhbHNlICk7CgkJCX0KCQl9ICk7CgoJfQoKCS8qKgoJICogVW5iaW5kIHByZXZpZXcgZnJhbWUgbGlua3MuCgkgKi8KCWZ1bmN0aW9uIGRpc2FibGVQcmV2aWV3TGlua3MoIHNlbGVjdG9yICkgewoKCQl2YXIgYW5jaG9ycyA9IHRvQXJyYXkoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIHNlbGVjdG9yID8gc2VsZWN0b3IgOiAnYScgKSApOwoKCQlhbmNob3JzLmZvckVhY2goIGZ1bmN0aW9uKCBlbGVtZW50ICkgewoJCQlpZiggL14oaHR0cHx3d3cpL2dpLnRlc3QoIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCAnaHJlZicgKSApICkgewoJCQkJZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAnY2xpY2snLCBvblByZXZpZXdMaW5rQ2xpY2tlZCwgZmFsc2UgKTsKCQkJfQoJCX0gKTsKCgl9CgoJLyoqCgkgKiBPcGVucyBhIHByZXZpZXcgd2luZG93IGZvciB0aGUgdGFyZ2V0IFVSTC4KCSAqCgkgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gdXJsIGZvciBwcmV2aWV3IGlmcmFtZSBzcmMKCSAqLwoJZnVuY3Rpb24gc2hvd1ByZXZpZXcoIHVybCApIHsKCgkJY2xvc2VPdmVybGF5KCk7CgoJCWRvbS5vdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicgKTsKCQlkb20ub3ZlcmxheS5jbGFzc0xpc3QuYWRkKCAnb3ZlcmxheScgKTsKCQlkb20ub3ZlcmxheS5jbGFzc0xpc3QuYWRkKCAnb3ZlcmxheS1wcmV2aWV3JyApOwoJCWRvbS53cmFwcGVyLmFwcGVuZENoaWxkKCBkb20ub3ZlcmxheSApOwoKCQlkb20ub3ZlcmxheS5pbm5lckhUTUwgPSBbCgkJCSc8aGVhZGVyPicsCgkJCQknPGEgY2xhc3M9ImNsb3NlIiBocmVmPSIjIj48c3BhbiBjbGFzcz0iaWNvbiI+PC9zcGFuPjwvYT4nLAoJCQkJJzxhIGNsYXNzPSJleHRlcm5hbCIgaHJlZj0iJysgdXJsICsnIiB0YXJnZXQ9Il9ibGFuayI+PHNwYW4gY2xhc3M9Imljb24iPjwvc3Bhbj48L2E+JywKCQkJJzwvaGVhZGVyPicsCgkJCSc8ZGl2IGNsYXNzPSJzcGlubmVyIj48L2Rpdj4nLAoJCQknPGRpdiBjbGFzcz0idmlld3BvcnQiPicsCgkJCQknPGlmcmFtZSBzcmM9IicrIHVybCArJyI+PC9pZnJhbWU+JywKCQkJCSc8c21hbGwgY2xhc3M9InZpZXdwb3J0LWlubmVyIj4nLAoJCQkJCSc8c3BhbiBjbGFzcz0ieC1mcmFtZS1lcnJvciI+VW5hYmxlIHRvIGxvYWQgaWZyYW1lLiBUaGlzIGlzIGxpa2VseSBkdWUgdG8gdGhlIHNpdGVcJ3MgcG9saWN5ICh4LWZyYW1lLW9wdGlvbnMpLjwvc3Bhbj4nLAoJCQkJJzwvc21hbGw+JywKCQkJJzwvZGl2PicKCQldLmpvaW4oJycpOwoKCQlkb20ub3ZlcmxheS5xdWVyeVNlbGVjdG9yKCAnaWZyYW1lJyApLmFkZEV2ZW50TGlzdGVuZXIoICdsb2FkJywgZnVuY3Rpb24oIGV2ZW50ICkgewoJCQlkb20ub3ZlcmxheS5jbGFzc0xpc3QuYWRkKCAnbG9hZGVkJyApOwoJCX0sIGZhbHNlICk7CgoJCWRvbS5vdmVybGF5LnF1ZXJ5U2VsZWN0b3IoICcuY2xvc2UnICkuYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgZnVuY3Rpb24oIGV2ZW50ICkgewoJCQljbG9zZU92ZXJsYXkoKTsKCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQl9LCBmYWxzZSApOwoKCQlkb20ub3ZlcmxheS5xdWVyeVNlbGVjdG9yKCAnLmV4dGVybmFsJyApLmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsIGZ1bmN0aW9uKCBldmVudCApIHsKCQkJY2xvc2VPdmVybGF5KCk7CgkJfSwgZmFsc2UgKTsKCgkJc2V0VGltZW91dCggZnVuY3Rpb24oKSB7CgkJCWRvbS5vdmVybGF5LmNsYXNzTGlzdC5hZGQoICd2aXNpYmxlJyApOwoJCX0sIDEgKTsKCgl9CgoJLyoqCgkgKiBPcGVuIG9yIGNsb3NlIGhlbHAgb3ZlcmxheSB3aW5kb3cuCgkgKgoJICogQHBhcmFtIHtCb29sZWFufSBbb3ZlcnJpZGVdIEZsYWcgd2hpY2ggb3ZlcnJpZGVzIHRoZQoJICogdG9nZ2xlIGxvZ2ljIGFuZCBmb3JjaWJseSBzZXRzIHRoZSBkZXNpcmVkIHN0YXRlLiBUcnVlIG1lYW5zCgkgKiBoZWxwIGlzIG9wZW4sIGZhbHNlIG1lYW5zIGl0J3MgY2xvc2VkLgoJICovCglmdW5jdGlvbiB0b2dnbGVIZWxwKCBvdmVycmlkZSApewoKCQlpZiggdHlwZW9mIG92ZXJyaWRlID09PSAnYm9vbGVhbicgKSB7CgkJCW92ZXJyaWRlID8gc2hvd0hlbHAoKSA6IGNsb3NlT3ZlcmxheSgpOwoJCX0KCQllbHNlIHsKCQkJaWYoIGRvbS5vdmVybGF5ICkgewoJCQkJY2xvc2VPdmVybGF5KCk7CgkJCX0KCQkJZWxzZSB7CgkJCQlzaG93SGVscCgpOwoJCQl9CgkJfQoJfQoKCS8qKgoJICogT3BlbnMgYW4gb3ZlcmxheSB3aW5kb3cgd2l0aCBoZWxwIG1hdGVyaWFsLgoJICovCglmdW5jdGlvbiBzaG93SGVscCgpIHsKCgkJaWYoIGNvbmZpZy5oZWxwICkgewoKCQkJY2xvc2VPdmVybGF5KCk7CgoJCQlkb20ub3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdkaXYnICk7CgkJCWRvbS5vdmVybGF5LmNsYXNzTGlzdC5hZGQoICdvdmVybGF5JyApOwoJCQlkb20ub3ZlcmxheS5jbGFzc0xpc3QuYWRkKCAnb3ZlcmxheS1oZWxwJyApOwoJCQlkb20ud3JhcHBlci5hcHBlbmRDaGlsZCggZG9tLm92ZXJsYXkgKTsKCgkJCXZhciBodG1sID0gJzxwIGNsYXNzPSJ0aXRsZSI+S2V5Ym9hcmQgU2hvcnRjdXRzPC9wPjxici8+JzsKCgkJCWh0bWwgKz0gJzx0YWJsZT48dGg+S0VZPC90aD48dGg+QUNUSU9OPC90aD4nOwoJCQlmb3IoIHZhciBrZXkgaW4ga2V5Ym9hcmRTaG9ydGN1dHMgKSB7CgkJCQlodG1sICs9ICc8dHI+PHRkPicgKyBrZXkgKyAnPC90ZD48dGQ+JyArIGtleWJvYXJkU2hvcnRjdXRzWyBrZXkgXSArICc8L3RkPjwvdHI+JzsKCQkJfQoKCQkJLy8gQWRkIGN1c3RvbSBrZXkgYmluZGluZ3MgdGhhdCBoYXZlIGFzc29jaWF0ZWQgZGVzY3JpcHRpb25zCgkJCWZvciggdmFyIGJpbmRpbmcgaW4gcmVnaXN0ZXJlZEtleUJpbmRpbmdzICkgewoJCQkJaWYoIHJlZ2lzdGVyZWRLZXlCaW5kaW5nc1tiaW5kaW5nXS5rZXkgJiYgcmVnaXN0ZXJlZEtleUJpbmRpbmdzW2JpbmRpbmddLmRlc2NyaXB0aW9uICkgewoJCQkJCWh0bWwgKz0gJzx0cj48dGQ+JyArIHJlZ2lzdGVyZWRLZXlCaW5kaW5nc1tiaW5kaW5nXS5rZXkgKyAnPC90ZD48dGQ+JyArIHJlZ2lzdGVyZWRLZXlCaW5kaW5nc1tiaW5kaW5nXS5kZXNjcmlwdGlvbiArICc8L3RkPjwvdHI+JzsKCQkJCX0KCQkJfQoKCQkJaHRtbCArPSAnPC90YWJsZT4nOwoKCQkJZG9tLm92ZXJsYXkuaW5uZXJIVE1MID0gWwoJCQkJJzxoZWFkZXI+JywKCQkJCQknPGEgY2xhc3M9ImNsb3NlIiBocmVmPSIjIj48c3BhbiBjbGFzcz0iaWNvbiI+PC9zcGFuPjwvYT4nLAoJCQkJJzwvaGVhZGVyPicsCgkJCQknPGRpdiBjbGFzcz0idmlld3BvcnQiPicsCgkJCQkJJzxkaXYgY2xhc3M9InZpZXdwb3J0LWlubmVyIj4nKyBodG1sICsnPC9kaXY+JywKCQkJCSc8L2Rpdj4nCgkJCV0uam9pbignJyk7CgoJCQlkb20ub3ZlcmxheS5xdWVyeVNlbGVjdG9yKCAnLmNsb3NlJyApLmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsIGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCWNsb3NlT3ZlcmxheSgpOwoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJfSwgZmFsc2UgKTsKCgkJCXNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQkJZG9tLm92ZXJsYXkuY2xhc3NMaXN0LmFkZCggJ3Zpc2libGUnICk7CgkJCX0sIDEgKTsKCgkJfQoKCX0KCgkvKioKCSAqIENsb3NlcyBhbnkgY3VycmVudGx5IG9wZW4gb3ZlcmxheS4KCSAqLwoJZnVuY3Rpb24gY2xvc2VPdmVybGF5KCkgewoKCQlpZiggZG9tLm92ZXJsYXkgKSB7CgkJCWRvbS5vdmVybGF5LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGRvbS5vdmVybGF5ICk7CgkJCWRvbS5vdmVybGF5ID0gbnVsbDsKCQl9CgoJfQoKCS8qKgoJICogQXBwbGllcyBKYXZhU2NyaXB0LWNvbnRyb2xsZWQgbGF5b3V0IHJ1bGVzIHRvIHRoZQoJICogcHJlc2VudGF0aW9uLgoJICovCglmdW5jdGlvbiBsYXlvdXQoKSB7CgoJCWlmKCBkb20ud3JhcHBlciAmJiAhaXNQcmludGluZ1BERigpICkgewoKCQkJaWYoICFjb25maWcuZGlzYWJsZUxheW91dCApIHsKCgkJCQkvLyBPbiBzb21lIG1vYmlsZSBkZXZpY2VzICcxMDB2aCcgaXMgdGFsbGVyIHRoYW4gdGhlIHZpc2libGUKCQkJCS8vIHZpZXdwb3J0IHdoaWNoIGxlYWRzIHRvIHBhcnQgb2YgdGhlIHByZXNlbnRhdGlvbiBiZWluZwoJCQkJLy8gY3V0IG9mZi4gVG8gd29yayBhcm91bmQgdGhpcyB3ZSBkZWZpbmUgb3VyIG93biAnLS12aCcgY3VzdG9tCgkJCQkvLyBwcm9wZXJ0eSB3aGVyZSAxMDB4IGFkZHMgdXAgdG8gdGhlIGNvcnJlY3QgaGVpZ2h0LgoJCQkJLy8KCQkJCS8vIGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vdGhlLXRyaWNrLXRvLXZpZXdwb3J0LXVuaXRzLW9uLW1vYmlsZS8KCQkJCWlmKCBpc01vYmlsZURldmljZSApIHsKCQkJCQlkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoICctLXZoJywgKCB3aW5kb3cuaW5uZXJIZWlnaHQgKiAwLjAxICkgKyAncHgnICk7CgkJCQl9CgoJCQkJdmFyIHNpemUgPSBnZXRDb21wdXRlZFNsaWRlU2l6ZSgpOwoKCQkJCXZhciBvbGRTY2FsZSA9IHNjYWxlOwoKCQkJCS8vIExheW91dCB0aGUgY29udGVudHMgb2YgdGhlIHNsaWRlcwoJCQkJbGF5b3V0U2xpZGVDb250ZW50cyggY29uZmlnLndpZHRoLCBjb25maWcuaGVpZ2h0ICk7CgoJCQkJZG9tLnNsaWRlcy5zdHlsZS53aWR0aCA9IHNpemUud2lkdGggKyAncHgnOwoJCQkJZG9tLnNsaWRlcy5zdHlsZS5oZWlnaHQgPSBzaXplLmhlaWdodCArICdweCc7CgoJCQkJLy8gRGV0ZXJtaW5lIHNjYWxlIG9mIGNvbnRlbnQgdG8gZml0IHdpdGhpbiBhdmFpbGFibGUgc3BhY2UKCQkJCXNjYWxlID0gTWF0aC5taW4oIHNpemUucHJlc2VudGF0aW9uV2lkdGggLyBzaXplLndpZHRoLCBzaXplLnByZXNlbnRhdGlvbkhlaWdodCAvIHNpemUuaGVpZ2h0ICk7CgoJCQkJLy8gUmVzcGVjdCBtYXgvbWluIHNjYWxlIHNldHRpbmdzCgkJCQlzY2FsZSA9IE1hdGgubWF4KCBzY2FsZSwgY29uZmlnLm1pblNjYWxlICk7CgkJCQlzY2FsZSA9IE1hdGgubWluKCBzY2FsZSwgY29uZmlnLm1heFNjYWxlICk7CgoJCQkJLy8gRG9uJ3QgYXBwbHkgYW55IHNjYWxpbmcgc3R5bGVzIGlmIHNjYWxlIGlzIDEKCQkJCWlmKCBzY2FsZSA9PT0gMSApIHsKCQkJCQlkb20uc2xpZGVzLnN0eWxlLnpvb20gPSAnJzsKCQkJCQlkb20uc2xpZGVzLnN0eWxlLmxlZnQgPSAnJzsKCQkJCQlkb20uc2xpZGVzLnN0eWxlLnRvcCA9ICcnOwoJCQkJCWRvbS5zbGlkZXMuc3R5bGUuYm90dG9tID0gJyc7CgkJCQkJZG9tLnNsaWRlcy5zdHlsZS5yaWdodCA9ICcnOwoJCQkJCXRyYW5zZm9ybVNsaWRlcyggeyBsYXlvdXQ6ICcnIH0gKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCS8vIFpvb20gU2NhbGluZwoJCQkJCS8vIENvbnRlbnQgcmVtYWlucyBjcmlzcCBubyBtYXR0ZXIgaG93IG11Y2ggd2Ugc2NhbGUuIFNpZGUKCQkJCQkvLyBlZmZlY3RzIGFyZSBtaW5vciBkaWZmZXJlbmNlcyBpbiB0ZXh0IGxheW91dCBhbmQgaWZyYW1lCgkJCQkJLy8gdmlld3BvcnRzIGNoYW5naW5nIHNpemUuIEEgMjAweDIwMCBpZnJhbWUgdmlld3BvcnQgaW4gYQoJCQkJCS8vIDJ4IHpvb21lZCBwcmVzZW50YXRpb24gZW5kcyB1cCBoYXZpbmcgYSA0MDB4NDAwIHZpZXdwb3J0LgoJCQkJCWlmKCBzY2FsZSA+IDEgJiYgZmVhdHVyZXMuem9vbSAmJiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyA8IDIgKSB7CgkJCQkJCWRvbS5zbGlkZXMuc3R5bGUuem9vbSA9IHNjYWxlOwoJCQkJCQlkb20uc2xpZGVzLnN0eWxlLmxlZnQgPSAnJzsKCQkJCQkJZG9tLnNsaWRlcy5zdHlsZS50b3AgPSAnJzsKCQkJCQkJZG9tLnNsaWRlcy5zdHlsZS5ib3R0b20gPSAnJzsKCQkJCQkJZG9tLnNsaWRlcy5zdHlsZS5yaWdodCA9ICcnOwoJCQkJCQl0cmFuc2Zvcm1TbGlkZXMoIHsgbGF5b3V0OiAnJyB9ICk7CgkJCQkJfQoJCQkJCS8vIFRyYW5zZm9ybSBTY2FsaW5nCgkJCQkJLy8gQ29udGVudCBsYXlvdXQgcmVtYWlucyB0aGUgZXhhY3Qgc2FtZSB3aGVuIHNjYWxlZCB1cC4KCQkJCQkvLyBTaWRlIGVmZmVjdCBpcyBjb250ZW50IGJlY29taW5nIGJsdXJyZWQsIGVzcGVjaWFsbHkgd2l0aAoJCQkJCS8vIGhpZ2ggc2NhbGUgdmFsdWVzIG9uIGxkcGkgc2NyZWVucy4KCQkJCQllbHNlIHsKCQkJCQkJZG9tLnNsaWRlcy5zdHlsZS56b29tID0gJyc7CgkJCQkJCWRvbS5zbGlkZXMuc3R5bGUubGVmdCA9ICc1MCUnOwoJCQkJCQlkb20uc2xpZGVzLnN0eWxlLnRvcCA9ICc1MCUnOwoJCQkJCQlkb20uc2xpZGVzLnN0eWxlLmJvdHRvbSA9ICdhdXRvJzsKCQkJCQkJZG9tLnNsaWRlcy5zdHlsZS5yaWdodCA9ICdhdXRvJzsKCQkJCQkJdHJhbnNmb3JtU2xpZGVzKCB7IGxheW91dDogJ3RyYW5zbGF0ZSgtNTAlLCAtNTAlKSBzY2FsZSgnKyBzY2FsZSArJyknIH0gKTsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gU2VsZWN0IGFsbCBzbGlkZXMsIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsCgkJCQl2YXIgc2xpZGVzID0gdG9BcnJheSggZG9tLndyYXBwZXIucXVlcnlTZWxlY3RvckFsbCggU0xJREVTX1NFTEVDVE9SICkgKTsKCgkJCQlmb3IoIHZhciBpID0gMCwgbGVuID0gc2xpZGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrICkgewoJCQkJCXZhciBzbGlkZSA9IHNsaWRlc1sgaSBdOwoKCQkJCQkvLyBEb24ndCBib3RoZXIgdXBkYXRpbmcgaW52aXNpYmxlIHNsaWRlcwoJCQkJCWlmKCBzbGlkZS5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgKSB7CgkJCQkJCWNvbnRpbnVlOwoJCQkJCX0KCgkJCQkJaWYoIGNvbmZpZy5jZW50ZXIgfHwgc2xpZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCAnY2VudGVyJyApICkgewoJCQkJCQkvLyBWZXJ0aWNhbCBzdGFja3MgYXJlIG5vdCBjZW50cmVkIHNpbmNlIHRoZWlyIHNlY3Rpb24KCQkJCQkJLy8gY2hpbGRyZW4gd2lsbCBiZQoJCQkJCQlpZiggc2xpZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCAnc3RhY2snICkgKSB7CgkJCQkJCQlzbGlkZS5zdHlsZS50b3AgPSAwOwoJCQkJCQl9CgkJCQkJCWVsc2UgewoJCQkJCQkJc2xpZGUuc3R5bGUudG9wID0gTWF0aC5tYXgoICggc2l6ZS5oZWlnaHQgLSBzbGlkZS5zY3JvbGxIZWlnaHQgKSAvIDIsIDAgKSArICdweCc7CgkJCQkJCX0KCQkJCQl9CgkJCQkJZWxzZSB7CgkJCQkJCXNsaWRlLnN0eWxlLnRvcCA9ICcnOwoJCQkJCX0KCgkJCQl9CgoJCQkJaWYoIG9sZFNjYWxlICE9PSBzY2FsZSApIHsKCQkJCQlkaXNwYXRjaEV2ZW50KCAncmVzaXplJywgewoJCQkJCQknb2xkU2NhbGUnOiBvbGRTY2FsZSwKCQkJCQkJJ3NjYWxlJzogc2NhbGUsCgkJCQkJCSdzaXplJzogc2l6ZQoJCQkJCX0gKTsKCQkJCX0KCQkJfQoKCQkJdXBkYXRlUHJvZ3Jlc3MoKTsKCQkJdXBkYXRlUGFyYWxsYXgoKTsKCgkJCWlmKCBpc092ZXJ2aWV3KCkgKSB7CgkJCQl1cGRhdGVPdmVydmlldygpOwoJCQl9CgoJCX0KCgl9CgoJLyoqCgkgKiBBcHBsaWVzIGxheW91dCBsb2dpYyB0byB0aGUgY29udGVudHMgb2YgYWxsIHNsaWRlcyBpbgoJICogdGhlIHByZXNlbnRhdGlvbi4KCSAqCgkgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHdpZHRoCgkgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGhlaWdodAoJICovCglmdW5jdGlvbiBsYXlvdXRTbGlkZUNvbnRlbnRzKCB3aWR0aCwgaGVpZ2h0ICkgewoKCQkvLyBIYW5kbGUgc2l6aW5nIG9mIGVsZW1lbnRzIHdpdGggdGhlICdzdHJldGNoJyBjbGFzcwoJCXRvQXJyYXkoIGRvbS5zbGlkZXMucXVlcnlTZWxlY3RvckFsbCggJ3NlY3Rpb24gPiAuc3RyZXRjaCcgKSApLmZvckVhY2goIGZ1bmN0aW9uKCBlbGVtZW50ICkgewoKCQkJLy8gRGV0ZXJtaW5lIGhvdyBtdWNoIHZlcnRpY2FsIHNwYWNlIHdlIGNhbiB1c2UKCQkJdmFyIHJlbWFpbmluZ0hlaWdodCA9IGdldFJlbWFpbmluZ0hlaWdodCggZWxlbWVudCwgaGVpZ2h0ICk7CgoJCQkvLyBDb25zaWRlciB0aGUgYXNwZWN0IHJhdGlvIG9mIG1lZGlhIGVsZW1lbnRzCgkJCWlmKCAvKGltZ3x2aWRlbykvZ2kudGVzdCggZWxlbWVudC5ub2RlTmFtZSApICkgewoJCQkJdmFyIG53ID0gZWxlbWVudC5uYXR1cmFsV2lkdGggfHwgZWxlbWVudC52aWRlb1dpZHRoLAoJCQkJCW5oID0gZWxlbWVudC5uYXR1cmFsSGVpZ2h0IHx8IGVsZW1lbnQudmlkZW9IZWlnaHQ7CgoJCQkJdmFyIGVzID0gTWF0aC5taW4oIHdpZHRoIC8gbncsIHJlbWFpbmluZ0hlaWdodCAvIG5oICk7CgoJCQkJZWxlbWVudC5zdHlsZS53aWR0aCA9ICggbncgKiBlcyApICsgJ3B4JzsKCQkJCWVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gKCBuaCAqIGVzICkgKyAncHgnOwoKCQkJfQoJCQllbHNlIHsKCQkJCWVsZW1lbnQuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7CgkJCQllbGVtZW50LnN0eWxlLmhlaWdodCA9IHJlbWFpbmluZ0hlaWdodCArICdweCc7CgkJCX0KCgkJfSApOwoKCX0KCgkvKioKCSAqIENhbGN1bGF0ZXMgdGhlIGNvbXB1dGVkIHBpeGVsIHNpemUgb2Ygb3VyIHNsaWRlcy4gVGhlc2UKCSAqIHZhbHVlcyBhcmUgYmFzZWQgb24gdGhlIHdpZHRoIGFuZCBoZWlnaHQgY29uZmlndXJhdGlvbgoJICogb3B0aW9ucy4KCSAqCgkgKiBAcGFyYW0ge251bWJlcn0gW3ByZXNlbnRhdGlvbldpZHRoPWRvbS53cmFwcGVyLm9mZnNldFdpZHRoXQoJICogQHBhcmFtIHtudW1iZXJ9IFtwcmVzZW50YXRpb25IZWlnaHQ9ZG9tLndyYXBwZXIub2Zmc2V0SGVpZ2h0XQoJICovCglmdW5jdGlvbiBnZXRDb21wdXRlZFNsaWRlU2l6ZSggcHJlc2VudGF0aW9uV2lkdGgsIHByZXNlbnRhdGlvbkhlaWdodCApIHsKCgkJdmFyIHNpemUgPSB7CgkJCS8vIFNsaWRlIHNpemUKCQkJd2lkdGg6IGNvbmZpZy53aWR0aCwKCQkJaGVpZ2h0OiBjb25maWcuaGVpZ2h0LAoKCQkJLy8gUHJlc2VudGF0aW9uIHNpemUKCQkJcHJlc2VudGF0aW9uV2lkdGg6IHByZXNlbnRhdGlvbldpZHRoIHx8IGRvbS53cmFwcGVyLm9mZnNldFdpZHRoLAoJCQlwcmVzZW50YXRpb25IZWlnaHQ6IHByZXNlbnRhdGlvbkhlaWdodCB8fCBkb20ud3JhcHBlci5vZmZzZXRIZWlnaHQKCQl9OwoKCQkvLyBSZWR1Y2UgYXZhaWxhYmxlIHNwYWNlIGJ5IG1hcmdpbgoJCXNpemUucHJlc2VudGF0aW9uV2lkdGggLT0gKCBzaXplLnByZXNlbnRhdGlvbldpZHRoICogY29uZmlnLm1hcmdpbiApOwoJCXNpemUucHJlc2VudGF0aW9uSGVpZ2h0IC09ICggc2l6ZS5wcmVzZW50YXRpb25IZWlnaHQgKiBjb25maWcubWFyZ2luICk7CgoJCS8vIFNsaWRlIHdpZHRoIG1heSBiZSBhIHBlcmNlbnRhZ2Ugb2YgYXZhaWxhYmxlIHdpZHRoCgkJaWYoIHR5cGVvZiBzaXplLndpZHRoID09PSAnc3RyaW5nJyAmJiAvJSQvLnRlc3QoIHNpemUud2lkdGggKSApIHsKCQkJc2l6ZS53aWR0aCA9IHBhcnNlSW50KCBzaXplLndpZHRoLCAxMCApIC8gMTAwICogc2l6ZS5wcmVzZW50YXRpb25XaWR0aDsKCQl9CgoJCS8vIFNsaWRlIGhlaWdodCBtYXkgYmUgYSBwZXJjZW50YWdlIG9mIGF2YWlsYWJsZSBoZWlnaHQKCQlpZiggdHlwZW9mIHNpemUuaGVpZ2h0ID09PSAnc3RyaW5nJyAmJiAvJSQvLnRlc3QoIHNpemUuaGVpZ2h0ICkgKSB7CgkJCXNpemUuaGVpZ2h0ID0gcGFyc2VJbnQoIHNpemUuaGVpZ2h0LCAxMCApIC8gMTAwICogc2l6ZS5wcmVzZW50YXRpb25IZWlnaHQ7CgkJfQoKCQlyZXR1cm4gc2l6ZTsKCgl9CgoJLyoqCgkgKiBTdG9yZXMgdGhlIHZlcnRpY2FsIGluZGV4IG9mIGEgc3RhY2sgc28gdGhhdCB0aGUgc2FtZQoJICogdmVydGljYWwgc2xpZGUgY2FuIGJlIHNlbGVjdGVkIHdoZW4gbmF2aWdhdGluZyB0byBhbmQKCSAqIGZyb20gdGhlIHN0YWNrLgoJICoKCSAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHN0YWNrIFRoZSB2ZXJ0aWNhbCBzdGFjayBlbGVtZW50CgkgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFt2PTBdIEluZGV4IHRvIG1lbW9yaXplCgkgKi8KCWZ1bmN0aW9uIHNldFByZXZpb3VzVmVydGljYWxJbmRleCggc3RhY2ssIHYgKSB7CgoJCWlmKCB0eXBlb2Ygc3RhY2sgPT09ICdvYmplY3QnICYmIHR5cGVvZiBzdGFjay5zZXRBdHRyaWJ1dGUgPT09ICdmdW5jdGlvbicgKSB7CgkJCXN0YWNrLnNldEF0dHJpYnV0ZSggJ2RhdGEtcHJldmlvdXMtaW5kZXh2JywgdiB8fCAwICk7CgkJfQoKCX0KCgkvKioKCSAqIFJldHJpZXZlcyB0aGUgdmVydGljYWwgaW5kZXggd2hpY2ggd2FzIHN0b3JlZCB1c2luZwoJICogI3NldFByZXZpb3VzVmVydGljYWxJbmRleCgpIG9yIDAgaWYgbm8gcHJldmlvdXMgaW5kZXgKCSAqIGV4aXN0cy4KCSAqCgkgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBzdGFjayBUaGUgdmVydGljYWwgc3RhY2sgZWxlbWVudAoJICovCglmdW5jdGlvbiBnZXRQcmV2aW91c1ZlcnRpY2FsSW5kZXgoIHN0YWNrICkgewoKCQlpZiggdHlwZW9mIHN0YWNrID09PSAnb2JqZWN0JyAmJiB0eXBlb2Ygc3RhY2suc2V0QXR0cmlidXRlID09PSAnZnVuY3Rpb24nICYmIHN0YWNrLmNsYXNzTGlzdC5jb250YWlucyggJ3N0YWNrJyApICkgewoJCQkvLyBQcmVmZXIgbWFudWFsbHkgZGVmaW5lZCBzdGFydC1pbmRleHYKCQkJdmFyIGF0dHJpYnV0ZU5hbWUgPSBzdGFjay5oYXNBdHRyaWJ1dGUoICdkYXRhLXN0YXJ0LWluZGV4dicgKSA/ICdkYXRhLXN0YXJ0LWluZGV4dicgOiAnZGF0YS1wcmV2aW91cy1pbmRleHYnOwoKCQkJcmV0dXJuIHBhcnNlSW50KCBzdGFjay5nZXRBdHRyaWJ1dGUoIGF0dHJpYnV0ZU5hbWUgKSB8fCAwLCAxMCApOwoJCX0KCgkJcmV0dXJuIDA7CgoJfQoKCS8qKgoJICogRGlzcGxheXMgdGhlIG92ZXJ2aWV3IG9mIHNsaWRlcyAocXVpY2sgbmF2KSBieSBzY2FsaW5nCgkgKiBkb3duIGFuZCBhcnJhbmdpbmcgYWxsIHNsaWRlIGVsZW1lbnRzLgoJICovCglmdW5jdGlvbiBhY3RpdmF0ZU92ZXJ2aWV3KCkgewoKCQkvLyBPbmx5IHByb2NlZWQgaWYgZW5hYmxlZCBpbiBjb25maWcKCQlpZiggY29uZmlnLm92ZXJ2aWV3ICYmICFpc092ZXJ2aWV3KCkgKSB7CgoJCQlvdmVydmlldyA9IHRydWU7CgoJCQlkb20ud3JhcHBlci5jbGFzc0xpc3QuYWRkKCAnb3ZlcnZpZXcnICk7CgkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoICdvdmVydmlldy1kZWFjdGl2YXRpbmcnICk7CgoJCQlpZiggZmVhdHVyZXMub3ZlcnZpZXdUcmFuc2l0aW9ucyApIHsKCQkJCXNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5hZGQoICdvdmVydmlldy1hbmltYXRlZCcgKTsKCQkJCX0sIDEgKTsKCQkJfQoKCQkJLy8gRG9uJ3QgYXV0by1zbGlkZSB3aGlsZSBpbiBvdmVydmlldyBtb2RlCgkJCWNhbmNlbEF1dG9TbGlkZSgpOwoKCQkJLy8gTW92ZSB0aGUgYmFja2dyb3VuZHMgZWxlbWVudCBpbnRvIHRoZSBzbGlkZSBjb250YWluZXIgdG8KCQkJLy8gdGhhdCB0aGUgc2FtZSBzY2FsaW5nIGlzIGFwcGxpZWQKCQkJZG9tLnNsaWRlcy5hcHBlbmRDaGlsZCggZG9tLmJhY2tncm91bmQgKTsKCgkJCS8vIENsaWNraW5nIG9uIGFuIG92ZXJ2aWV3IHNsaWRlIG5hdmlnYXRlcyB0byBpdAoJCQl0b0FycmF5KCBkb20ud3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCBTTElERVNfU0VMRUNUT1IgKSApLmZvckVhY2goIGZ1bmN0aW9uKCBzbGlkZSApIHsKCQkJCWlmKCAhc2xpZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCAnc3RhY2snICkgKSB7CgkJCQkJc2xpZGUuYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgb25PdmVydmlld1NsaWRlQ2xpY2tlZCwgdHJ1ZSApOwoJCQkJfQoJCQl9ICk7CgoJCQkvLyBDYWxjdWxhdGUgc2xpZGUgc2l6ZXMKCQkJdmFyIG1hcmdpbiA9IDcwOwoJCQl2YXIgc2xpZGVTaXplID0gZ2V0Q29tcHV0ZWRTbGlkZVNpemUoKTsKCQkJb3ZlcnZpZXdTbGlkZVdpZHRoID0gc2xpZGVTaXplLndpZHRoICsgbWFyZ2luOwoJCQlvdmVydmlld1NsaWRlSGVpZ2h0ID0gc2xpZGVTaXplLmhlaWdodCArIG1hcmdpbjsKCgkJCS8vIFJldmVyc2UgaW4gUlRMIG1vZGUKCQkJaWYoIGNvbmZpZy5ydGwgKSB7CgkJCQlvdmVydmlld1NsaWRlV2lkdGggPSAtb3ZlcnZpZXdTbGlkZVdpZHRoOwoJCQl9CgoJCQl1cGRhdGVTbGlkZXNWaXNpYmlsaXR5KCk7CgkJCWxheW91dE92ZXJ2aWV3KCk7CgkJCXVwZGF0ZU92ZXJ2aWV3KCk7CgoJCQlsYXlvdXQoKTsKCgkJCS8vIE5vdGlmeSBvYnNlcnZlcnMgb2YgdGhlIG92ZXJ2aWV3IHNob3dpbmcKCQkJZGlzcGF0Y2hFdmVudCggJ292ZXJ2aWV3c2hvd24nLCB7CgkJCQknaW5kZXhoJzogaW5kZXhoLAoJCQkJJ2luZGV4dic6IGluZGV4diwKCQkJCSdjdXJyZW50U2xpZGUnOiBjdXJyZW50U2xpZGUKCQkJfSApOwoKCQl9CgoJfQoKCS8qKgoJICogVXNlcyBDU1MgdHJhbnNmb3JtcyB0byBwb3NpdGlvbiBhbGwgc2xpZGVzIGluIGEgZ3JpZCBmb3IKCSAqIGRpc3BsYXkgaW5zaWRlIG9mIHRoZSBvdmVydmlldyBtb2RlLgoJICovCglmdW5jdGlvbiBsYXlvdXRPdmVydmlldygpIHsKCgkJLy8gTGF5b3V0IHNsaWRlcwoJCXRvQXJyYXkoIGRvbS53cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoIEhPUklaT05UQUxfU0xJREVTX1NFTEVDVE9SICkgKS5mb3JFYWNoKCBmdW5jdGlvbiggaHNsaWRlLCBoICkgewoJCQloc2xpZGUuc2V0QXR0cmlidXRlKCAnZGF0YS1pbmRleC1oJywgaCApOwoJCQl0cmFuc2Zvcm1FbGVtZW50KCBoc2xpZGUsICd0cmFuc2xhdGUzZCgnICsgKCBoICogb3ZlcnZpZXdTbGlkZVdpZHRoICkgKyAncHgsIDAsIDApJyApOwoKCQkJaWYoIGhzbGlkZS5jbGFzc0xpc3QuY29udGFpbnMoICdzdGFjaycgKSApIHsKCgkJCQl0b0FycmF5KCBoc2xpZGUucXVlcnlTZWxlY3RvckFsbCggJ3NlY3Rpb24nICkgKS5mb3JFYWNoKCBmdW5jdGlvbiggdnNsaWRlLCB2ICkgewoJCQkJCXZzbGlkZS5zZXRBdHRyaWJ1dGUoICdkYXRhLWluZGV4LWgnLCBoICk7CgkJCQkJdnNsaWRlLnNldEF0dHJpYnV0ZSggJ2RhdGEtaW5kZXgtdicsIHYgKTsKCgkJCQkJdHJhbnNmb3JtRWxlbWVudCggdnNsaWRlLCAndHJhbnNsYXRlM2QoMCwgJyArICggdiAqIG92ZXJ2aWV3U2xpZGVIZWlnaHQgKSArICdweCwgMCknICk7CgkJCQl9ICk7CgoJCQl9CgkJfSApOwoKCQkvLyBMYXlvdXQgc2xpZGUgYmFja2dyb3VuZHMKCQl0b0FycmF5KCBkb20uYmFja2dyb3VuZC5jaGlsZE5vZGVzICkuZm9yRWFjaCggZnVuY3Rpb24oIGhiYWNrZ3JvdW5kLCBoICkgewoJCQl0cmFuc2Zvcm1FbGVtZW50KCBoYmFja2dyb3VuZCwgJ3RyYW5zbGF0ZTNkKCcgKyAoIGggKiBvdmVydmlld1NsaWRlV2lkdGggKSArICdweCwgMCwgMCknICk7CgoJCQl0b0FycmF5KCBoYmFja2dyb3VuZC5xdWVyeVNlbGVjdG9yQWxsKCAnLnNsaWRlLWJhY2tncm91bmQnICkgKS5mb3JFYWNoKCBmdW5jdGlvbiggdmJhY2tncm91bmQsIHYgKSB7CgkJCQl0cmFuc2Zvcm1FbGVtZW50KCB2YmFja2dyb3VuZCwgJ3RyYW5zbGF0ZTNkKDAsICcgKyAoIHYgKiBvdmVydmlld1NsaWRlSGVpZ2h0ICkgKyAncHgsIDApJyApOwoJCQl9ICk7CgkJfSApOwoKCX0KCgkvKioKCSAqIE1vdmVzIHRoZSBvdmVydmlldyB2aWV3cG9ydCB0byB0aGUgY3VycmVudCBzbGlkZXMuCgkgKiBDYWxsZWQgZWFjaCB0aW1lIHRoZSBjdXJyZW50IHNsaWRlIGNoYW5nZXMuCgkgKi8KCWZ1bmN0aW9uIHVwZGF0ZU92ZXJ2aWV3KCkgewoKCQl2YXIgdm1pbiA9IE1hdGgubWluKCB3aW5kb3cuaW5uZXJXaWR0aCwgd2luZG93LmlubmVySGVpZ2h0ICk7CgkJdmFyIHNjYWxlID0gTWF0aC5tYXgoIHZtaW4gLyA1LCAxNTAgKSAvIHZtaW47CgoJCXRyYW5zZm9ybVNsaWRlcyggewoJCQlvdmVydmlldzogWwoJCQkJJ3NjYWxlKCcrIHNjYWxlICsnKScsCgkJCQkndHJhbnNsYXRlWCgnKyAoIC1pbmRleGggKiBvdmVydmlld1NsaWRlV2lkdGggKSArJ3B4KScsCgkJCQkndHJhbnNsYXRlWSgnKyAoIC1pbmRleHYgKiBvdmVydmlld1NsaWRlSGVpZ2h0ICkgKydweCknCgkJCV0uam9pbiggJyAnICkKCQl9ICk7CgoJfQoKCS8qKgoJICogRXhpdHMgdGhlIHNsaWRlIG92ZXJ2aWV3IGFuZCBlbnRlcnMgdGhlIGN1cnJlbnRseQoJICogYWN0aXZlIHNsaWRlLgoJICovCglmdW5jdGlvbiBkZWFjdGl2YXRlT3ZlcnZpZXcoKSB7CgoJCS8vIE9ubHkgcHJvY2VlZCBpZiBlbmFibGVkIGluIGNvbmZpZwoJCWlmKCBjb25maWcub3ZlcnZpZXcgKSB7CgoJCQlvdmVydmlldyA9IGZhbHNlOwoKCQkJZG9tLndyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSggJ292ZXJ2aWV3JyApOwoJCQlkb20ud3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCAnb3ZlcnZpZXctYW5pbWF0ZWQnICk7CgoJCQkvLyBUZW1wb3JhcmlseSBhZGQgYSBjbGFzcyBzbyB0aGF0IHRyYW5zaXRpb25zIGNhbiBkbyBkaWZmZXJlbnQgdGhpbmdzCgkJCS8vIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZXkgYXJlIGV4aXRpbmcvZW50ZXJpbmcgb3ZlcnZpZXcsIG9yIGp1c3QKCQkJLy8gbW92aW5nIGZyb20gc2xpZGUgdG8gc2xpZGUKCQkJZG9tLndyYXBwZXIuY2xhc3NMaXN0LmFkZCggJ292ZXJ2aWV3LWRlYWN0aXZhdGluZycgKTsKCgkJCXNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHsKCQkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoICdvdmVydmlldy1kZWFjdGl2YXRpbmcnICk7CgkJCX0sIDEgKTsKCgkJCS8vIE1vdmUgdGhlIGJhY2tncm91bmQgZWxlbWVudCBiYWNrIG91dAoJCQlkb20ud3JhcHBlci5hcHBlbmRDaGlsZCggZG9tLmJhY2tncm91bmQgKTsKCgkJCS8vIENsZWFuIHVwIGNoYW5nZXMgbWFkZSB0byBzbGlkZXMKCQkJdG9BcnJheSggZG9tLndyYXBwZXIucXVlcnlTZWxlY3RvckFsbCggU0xJREVTX1NFTEVDVE9SICkgKS5mb3JFYWNoKCBmdW5jdGlvbiggc2xpZGUgKSB7CgkJCQl0cmFuc2Zvcm1FbGVtZW50KCBzbGlkZSwgJycgKTsKCgkJCQlzbGlkZS5yZW1vdmVFdmVudExpc3RlbmVyKCAnY2xpY2snLCBvbk92ZXJ2aWV3U2xpZGVDbGlja2VkLCB0cnVlICk7CgkJCX0gKTsKCgkJCS8vIENsZWFuIHVwIGNoYW5nZXMgbWFkZSB0byBiYWNrZ3JvdW5kcwoJCQl0b0FycmF5KCBkb20uYmFja2dyb3VuZC5xdWVyeVNlbGVjdG9yQWxsKCAnLnNsaWRlLWJhY2tncm91bmQnICkgKS5mb3JFYWNoKCBmdW5jdGlvbiggYmFja2dyb3VuZCApIHsKCQkJCXRyYW5zZm9ybUVsZW1lbnQoIGJhY2tncm91bmQsICcnICk7CgkJCX0gKTsKCgkJCXRyYW5zZm9ybVNsaWRlcyggeyBvdmVydmlldzogJycgfSApOwoKCQkJc2xpZGUoIGluZGV4aCwgaW5kZXh2ICk7CgoJCQlsYXlvdXQoKTsKCgkJCWN1ZUF1dG9TbGlkZSgpOwoKCQkJLy8gTm90aWZ5IG9ic2VydmVycyBvZiB0aGUgb3ZlcnZpZXcgaGlkaW5nCgkJCWRpc3BhdGNoRXZlbnQoICdvdmVydmlld2hpZGRlbicsIHsKCQkJCSdpbmRleGgnOiBpbmRleGgsCgkJCQknaW5kZXh2JzogaW5kZXh2LAoJCQkJJ2N1cnJlbnRTbGlkZSc6IGN1cnJlbnRTbGlkZQoJCQl9ICk7CgoJCX0KCX0KCgkvKioKCSAqIFRvZ2dsZXMgdGhlIHNsaWRlIG92ZXJ2aWV3IG1vZGUgb24gYW5kIG9mZi4KCSAqCgkgKiBAcGFyYW0ge0Jvb2xlYW59IFtvdmVycmlkZV0gRmxhZyB3aGljaCBvdmVycmlkZXMgdGhlCgkgKiB0b2dnbGUgbG9naWMgYW5kIGZvcmNpYmx5IHNldHMgdGhlIGRlc2lyZWQgc3RhdGUuIFRydWUgbWVhbnMKCSAqIG92ZXJ2aWV3IGlzIG9wZW4sIGZhbHNlIG1lYW5zIGl0J3MgY2xvc2VkLgoJICovCglmdW5jdGlvbiB0b2dnbGVPdmVydmlldyggb3ZlcnJpZGUgKSB7CgoJCWlmKCB0eXBlb2Ygb3ZlcnJpZGUgPT09ICdib29sZWFuJyApIHsKCQkJb3ZlcnJpZGUgPyBhY3RpdmF0ZU92ZXJ2aWV3KCkgOiBkZWFjdGl2YXRlT3ZlcnZpZXcoKTsKCQl9CgkJZWxzZSB7CgkJCWlzT3ZlcnZpZXcoKSA/IGRlYWN0aXZhdGVPdmVydmlldygpIDogYWN0aXZhdGVPdmVydmlldygpOwoJCX0KCgl9CgoJLyoqCgkgKiBDaGVja3MgaWYgdGhlIG92ZXJ2aWV3IGlzIGN1cnJlbnRseSBhY3RpdmUuCgkgKgoJICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgb3ZlcnZpZXcgaXMgYWN0aXZlLAoJICogZmFsc2Ugb3RoZXJ3aXNlCgkgKi8KCWZ1bmN0aW9uIGlzT3ZlcnZpZXcoKSB7CgoJCXJldHVybiBvdmVydmlldzsKCgl9CgoJLyoqCgkgKiBSZXR1cm4gYSBoYXNoIFVSTCB0aGF0IHdpbGwgcmVzb2x2ZSB0byB0aGUgY3VycmVudCBzbGlkZSBsb2NhdGlvbi4KCSAqLwoJZnVuY3Rpb24gbG9jYXRpb25IYXNoKCkgewoKCQl2YXIgdXJsID0gJy8nOwoKCQkvLyBBdHRlbXB0IHRvIGNyZWF0ZSBhIG5hbWVkIGxpbmsgYmFzZWQgb24gdGhlIHNsaWRlJ3MgSUQKCQl2YXIgaWQgPSBjdXJyZW50U2xpZGUgPyBjdXJyZW50U2xpZGUuZ2V0QXR0cmlidXRlKCAnaWQnICkgOiBudWxsOwoJCWlmKCBpZCApIHsKCQkJaWQgPSBlbmNvZGVVUklDb21wb25lbnQoIGlkICk7CgkJfQoKCQl2YXIgaW5kZXhmOwoJCWlmKCBjb25maWcuZnJhZ21lbnRJblVSTCApIHsKCQkJaW5kZXhmID0gZ2V0SW5kaWNlcygpLmY7CgkJfQoKCQkvLyBJZiB0aGUgY3VycmVudCBzbGlkZSBoYXMgYW4gSUQsIHVzZSB0aGF0IGFzIGEgbmFtZWQgbGluaywKCQkvLyBidXQgd2UgZG9uJ3Qgc3VwcG9ydCBuYW1lZCBsaW5rcyB3aXRoIGEgZnJhZ21lbnQgaW5kZXgKCQlpZiggdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiBpZC5sZW5ndGggJiYgaW5kZXhmID09PSB1bmRlZmluZWQgKSB7CgkJCXVybCA9ICcvJyArIGlkOwoJCX0KCQkvLyBPdGhlcndpc2UgdXNlIHRoZSAvaC92IGluZGV4CgkJZWxzZSB7CgkJCXZhciBoYXNoSW5kZXhCYXNlID0gY29uZmlnLmhhc2hPbmVCYXNlZEluZGV4ID8gMSA6IDA7CgkJCWlmKCBpbmRleGggPiAwIHx8IGluZGV4diA+IDAgfHwgaW5kZXhmICE9PSB1bmRlZmluZWQgKSB1cmwgKz0gaW5kZXhoICsgaGFzaEluZGV4QmFzZTsKCQkJaWYoIGluZGV4diA+IDAgfHwgaW5kZXhmICE9PSB1bmRlZmluZWQgKSB1cmwgKz0gJy8nICsgKGluZGV4diArIGhhc2hJbmRleEJhc2UgKTsKCQkJaWYoIGluZGV4ZiAhPT0gdW5kZWZpbmVkICkgdXJsICs9ICcvJyArIGluZGV4ZjsKCQl9CgoJCXJldHVybiB1cmw7CgoJfQoKCS8qKgoJICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IG9yIHNwZWNpZmllZCBzbGlkZSBpcyB2ZXJ0aWNhbAoJICogKG5lc3RlZCB3aXRoaW4gYW5vdGhlciBzbGlkZSkuCgkgKgoJICogQHBhcmFtIHtIVE1MRWxlbWVudH0gW3NsaWRlPWN1cnJlbnRTbGlkZV0gVGhlIHNsaWRlIHRvIGNoZWNrCgkgKiBvcmllbnRhdGlvbiBvZgoJICogQHJldHVybiB7Qm9vbGVhbn0KCSAqLwoJZnVuY3Rpb24gaXNWZXJ0aWNhbFNsaWRlKCBzbGlkZSApIHsKCgkJLy8gUHJlZmVyIHNsaWRlIGFyZ3VtZW50LCBvdGhlcndpc2UgdXNlIGN1cnJlbnQgc2xpZGUKCQlzbGlkZSA9IHNsaWRlID8gc2xpZGUgOiBjdXJyZW50U2xpZGU7CgoJCXJldHVybiBzbGlkZSAmJiBzbGlkZS5wYXJlbnROb2RlICYmICEhc2xpZGUucGFyZW50Tm9kZS5ub2RlTmFtZS5tYXRjaCggL3NlY3Rpb24vaSApOwoKCX0KCgkvKioKCSAqIEhhbmRsaW5nIHRoZSBmdWxsc2NyZWVuIGZ1bmN0aW9uYWxpdHkgdmlhIHRoZSBmdWxsc2NyZWVuIEFQSQoJICoKCSAqIEBzZWUgaHR0cDovL2Z1bGxzY3JlZW4uc3BlYy53aGF0d2cub3JnLwoJICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0RPTS9Vc2luZ19mdWxsc2NyZWVuX21vZGUKCSAqLwoJZnVuY3Rpb24gZW50ZXJGdWxsc2NyZWVuKCkgewoKCQl2YXIgZWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCgkJLy8gQ2hlY2sgd2hpY2ggaW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlCgkJdmFyIHJlcXVlc3RNZXRob2QgPSBlbGVtZW50LnJlcXVlc3RGdWxsc2NyZWVuIHx8CgkJCQkJCQllbGVtZW50LndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuIHx8CgkJCQkJCQllbGVtZW50LndlYmtpdFJlcXVlc3RGdWxsU2NyZWVuIHx8CgkJCQkJCQllbGVtZW50Lm1velJlcXVlc3RGdWxsU2NyZWVuIHx8CgkJCQkJCQllbGVtZW50Lm1zUmVxdWVzdEZ1bGxzY3JlZW47CgoJCWlmKCByZXF1ZXN0TWV0aG9kICkgewoJCQlyZXF1ZXN0TWV0aG9kLmFwcGx5KCBlbGVtZW50ICk7CgkJfQoKCX0KCgkvKioKCSAqIFNob3dzIHRoZSBtb3VzZSBwb2ludGVyIGFmdGVyIGl0IGhhcyBiZWVuIGhpZGRlbiB3aXRoCgkgKiAjaGlkZUN1cnNvci4KCSAqLwoJZnVuY3Rpb24gc2hvd0N1cnNvcigpIHsKCgkJaWYoIGN1cnNvckhpZGRlbiApIHsKCQkJY3Vyc29ySGlkZGVuID0gZmFsc2U7CgkJCWRvbS53cmFwcGVyLnN0eWxlLmN1cnNvciA9ICcnOwoJCX0KCgl9CgoJLyoqCgkgKiBIaWRlcyB0aGUgbW91c2UgcG9pbnRlciB3aGVuIGl0J3Mgb24gdG9wIG9mIHRoZSAucmV2ZWFsCgkgKiBjb250YWluZXIuCgkgKi8KCWZ1bmN0aW9uIGhpZGVDdXJzb3IoKSB7CgoJCWlmKCBjdXJzb3JIaWRkZW4gPT09IGZhbHNlICkgewoJCQljdXJzb3JIaWRkZW4gPSB0cnVlOwoJCQlkb20ud3JhcHBlci5zdHlsZS5jdXJzb3IgPSAnbm9uZSc7CgkJfQoKCX0KCgkvKioKCSAqIEVudGVycyB0aGUgcGF1c2VkIG1vZGUgd2hpY2ggZmFkZXMgZXZlcnl0aGluZyBvbiBzY3JlZW4gdG8KCSAqIGJsYWNrLgoJICovCglmdW5jdGlvbiBwYXVzZSgpIHsKCgkJaWYoIGNvbmZpZy5wYXVzZSApIHsKCQkJdmFyIHdhc1BhdXNlZCA9IGRvbS53cmFwcGVyLmNsYXNzTGlzdC5jb250YWlucyggJ3BhdXNlZCcgKTsKCgkJCWNhbmNlbEF1dG9TbGlkZSgpOwoJCQlkb20ud3JhcHBlci5jbGFzc0xpc3QuYWRkKCAncGF1c2VkJyApOwoKCQkJaWYoIHdhc1BhdXNlZCA9PT0gZmFsc2UgKSB7CgkJCQlkaXNwYXRjaEV2ZW50KCAncGF1c2VkJyApOwoJCQl9CgkJfQoKCX0KCgkvKioKCSAqIEV4aXRzIGZyb20gdGhlIHBhdXNlZCBtb2RlLgoJICovCglmdW5jdGlvbiByZXN1bWUoKSB7CgoJCXZhciB3YXNQYXVzZWQgPSBkb20ud3JhcHBlci5jbGFzc0xpc3QuY29udGFpbnMoICdwYXVzZWQnICk7CgkJZG9tLndyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSggJ3BhdXNlZCcgKTsKCgkJY3VlQXV0b1NsaWRlKCk7CgoJCWlmKCB3YXNQYXVzZWQgKSB7CgkJCWRpc3BhdGNoRXZlbnQoICdyZXN1bWVkJyApOwoJCX0KCgl9CgoJLyoqCgkgKiBUb2dnbGVzIHRoZSBwYXVzZWQgbW9kZSBvbiBhbmQgb2ZmLgoJICovCglmdW5jdGlvbiB0b2dnbGVQYXVzZSggb3ZlcnJpZGUgKSB7CgoJCWlmKCB0eXBlb2Ygb3ZlcnJpZGUgPT09ICdib29sZWFuJyApIHsKCQkJb3ZlcnJpZGUgPyBwYXVzZSgpIDogcmVzdW1lKCk7CgkJfQoJCWVsc2UgewoJCQlpc1BhdXNlZCgpID8gcmVzdW1lKCkgOiBwYXVzZSgpOwoJCX0KCgl9CgoJLyoqCgkgKiBDaGVja3MgaWYgd2UgYXJlIGN1cnJlbnRseSBpbiB0aGUgcGF1c2VkIG1vZGUuCgkgKgoJICogQHJldHVybiB7Qm9vbGVhbn0KCSAqLwoJZnVuY3Rpb24gaXNQYXVzZWQoKSB7CgoJCXJldHVybiBkb20ud3JhcHBlci5jbGFzc0xpc3QuY29udGFpbnMoICdwYXVzZWQnICk7CgoJfQoKCS8qKgoJICogVG9nZ2xlcyB0aGUgYXV0byBzbGlkZSBtb2RlIG9uIGFuZCBvZmYuCgkgKgoJICogQHBhcmFtIHtCb29sZWFufSBbb3ZlcnJpZGVdIEZsYWcgd2hpY2ggc2V0cyB0aGUgZGVzaXJlZCBzdGF0ZS4KCSAqIFRydWUgbWVhbnMgYXV0b3BsYXkgc3RhcnRzLCBmYWxzZSBtZWFucyBpdCBzdG9wcy4KCSAqLwoKCWZ1bmN0aW9uIHRvZ2dsZUF1dG9TbGlkZSggb3ZlcnJpZGUgKSB7CgoJCWlmKCB0eXBlb2Ygb3ZlcnJpZGUgPT09ICdib29sZWFuJyApIHsKCQkJb3ZlcnJpZGUgPyByZXN1bWVBdXRvU2xpZGUoKSA6IHBhdXNlQXV0b1NsaWRlKCk7CgkJfQoKCQllbHNlIHsKCQkJYXV0b1NsaWRlUGF1c2VkID8gcmVzdW1lQXV0b1NsaWRlKCkgOiBwYXVzZUF1dG9TbGlkZSgpOwoJCX0KCgl9CgoJLyoqCgkgKiBDaGVja3MgaWYgdGhlIGF1dG8gc2xpZGUgbW9kZSBpcyBjdXJyZW50bHkgb24uCgkgKgoJICogQHJldHVybiB7Qm9vbGVhbn0KCSAqLwoJZnVuY3Rpb24gaXNBdXRvU2xpZGluZygpIHsKCgkJcmV0dXJuICEhKCBhdXRvU2xpZGUgJiYgIWF1dG9TbGlkZVBhdXNlZCApOwoKCX0KCgkvKioKCSAqIFN0ZXBzIGZyb20gdGhlIGN1cnJlbnQgcG9pbnQgaW4gdGhlIHByZXNlbnRhdGlvbiB0byB0aGUKCSAqIHNsaWRlIHdoaWNoIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbAoJICogaW5kaWNlcy4KCSAqCgkgKiBAcGFyYW0ge251bWJlcn0gW2g9aW5kZXhoXSBIb3Jpem9udGFsIGluZGV4IG9mIHRoZSB0YXJnZXQgc2xpZGUKCSAqIEBwYXJhbSB7bnVtYmVyfSBbdj1pbmRleHZdIFZlcnRpY2FsIGluZGV4IG9mIHRoZSB0YXJnZXQgc2xpZGUKCSAqIEBwYXJhbSB7bnVtYmVyfSBbZl0gSW5kZXggb2YgYSBmcmFnbWVudCB3aXRoaW4gdGhlCgkgKiB0YXJnZXQgc2xpZGUgdG8gYWN0aXZhdGUKCSAqIEBwYXJhbSB7bnVtYmVyfSBbb10gT3JpZ2luIGZvciB1c2UgaW4gbXVsdGltYXN0ZXIgZW52aXJvbm1lbnRzCgkgKi8KCWZ1bmN0aW9uIHNsaWRlKCBoLCB2LCBmLCBvICkgewoKCQkvLyBSZW1lbWJlciB3aGVyZSB3ZSB3ZXJlIGF0IGJlZm9yZQoJCXByZXZpb3VzU2xpZGUgPSBjdXJyZW50U2xpZGU7CgoJCS8vIFF1ZXJ5IGFsbCBob3Jpem9udGFsIHNsaWRlcyBpbiB0aGUgZGVjawoJCXZhciBob3Jpem9udGFsU2xpZGVzID0gZG9tLndyYXBwZXIucXVlcnlTZWxlY3RvckFsbCggSE9SSVpPTlRBTF9TTElERVNfU0VMRUNUT1IgKTsKCgkJLy8gQWJvcnQgaWYgdGhlcmUgYXJlIG5vIHNsaWRlcwoJCWlmKCBob3Jpem9udGFsU2xpZGVzLmxlbmd0aCA9PT0gMCApIHJldHVybjsKCgkJLy8gSWYgbm8gdmVydGljYWwgaW5kZXggaXMgc3BlY2lmaWVkIGFuZCB0aGUgdXBjb21pbmcgc2xpZGUgaXMgYQoJCS8vIHN0YWNrLCByZXN1bWUgYXQgaXRzIHByZXZpb3VzIHZlcnRpY2FsIGluZGV4CgkJaWYoIHYgPT09IHVuZGVmaW5lZCAmJiAhaXNPdmVydmlldygpICkgewoJCQl2ID0gZ2V0UHJldmlvdXNWZXJ0aWNhbEluZGV4KCBob3Jpem9udGFsU2xpZGVzWyBoIF0gKTsKCQl9CgoJCS8vIElmIHdlIHdlcmUgb24gYSB2ZXJ0aWNhbCBzdGFjaywgcmVtZW1iZXIgd2hhdCB2ZXJ0aWNhbCBpbmRleAoJCS8vIGl0IHdhcyBvbiBzbyB3ZSBjYW4gcmVzdW1lIGF0IHRoZSBzYW1lIHBvc2l0aW9uIHdoZW4gcmV0dXJuaW5nCgkJaWYoIHByZXZpb3VzU2xpZGUgJiYgcHJldmlvdXNTbGlkZS5wYXJlbnROb2RlICYmIHByZXZpb3VzU2xpZGUucGFyZW50Tm9kZS5jbGFzc0xpc3QuY29udGFpbnMoICdzdGFjaycgKSApIHsKCQkJc2V0UHJldmlvdXNWZXJ0aWNhbEluZGV4KCBwcmV2aW91c1NsaWRlLnBhcmVudE5vZGUsIGluZGV4diApOwoJCX0KCgkJLy8gUmVtZW1iZXIgdGhlIHN0YXRlIGJlZm9yZSB0aGlzIHNsaWRlCgkJdmFyIHN0YXRlQmVmb3JlID0gc3RhdGUuY29uY2F0KCk7CgoJCS8vIFJlc2V0IHRoZSBzdGF0ZSBhcnJheQoJCXN0YXRlLmxlbmd0aCA9IDA7CgoJCXZhciBpbmRleGhCZWZvcmUgPSBpbmRleGggfHwgMCwKCQkJaW5kZXh2QmVmb3JlID0gaW5kZXh2IHx8IDA7CgoJCS8vIEFjdGl2YXRlIGFuZCB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgc2xpZGUKCQlpbmRleGggPSB1cGRhdGVTbGlkZXMoIEhPUklaT05UQUxfU0xJREVTX1NFTEVDVE9SLCBoID09PSB1bmRlZmluZWQgPyBpbmRleGggOiBoICk7CgkJaW5kZXh2ID0gdXBkYXRlU2xpZGVzKCBWRVJUSUNBTF9TTElERVNfU0VMRUNUT1IsIHYgPT09IHVuZGVmaW5lZCA/IGluZGV4diA6IHYgKTsKCgkJLy8gVXBkYXRlIHRoZSB2aXNpYmlsaXR5IG9mIHNsaWRlcyBub3cgdGhhdCB0aGUgaW5kaWNlcyBoYXZlIGNoYW5nZWQKCQl1cGRhdGVTbGlkZXNWaXNpYmlsaXR5KCk7CgoJCWxheW91dCgpOwoKCQkvLyBVcGRhdGUgdGhlIG92ZXJ2aWV3IGlmIGl0J3MgY3VycmVudGx5IGFjdGl2ZQoJCWlmKCBpc092ZXJ2aWV3KCkgKSB7CgkJCXVwZGF0ZU92ZXJ2aWV3KCk7CgkJfQoKCQkvLyBGaW5kIHRoZSBjdXJyZW50IGhvcml6b250YWwgc2xpZGUgYW5kIGFueSBwb3NzaWJsZSB2ZXJ0aWNhbCBzbGlkZXMKCQkvLyB3aXRoaW4gaXQKCQl2YXIgY3VycmVudEhvcml6b250YWxTbGlkZSA9IGhvcml6b250YWxTbGlkZXNbIGluZGV4aCBdLAoJCQljdXJyZW50VmVydGljYWxTbGlkZXMgPSBjdXJyZW50SG9yaXpvbnRhbFNsaWRlLnF1ZXJ5U2VsZWN0b3JBbGwoICdzZWN0aW9uJyApOwoKCQkvLyBTdG9yZSByZWZlcmVuY2VzIHRvIHRoZSBwcmV2aW91cyBhbmQgY3VycmVudCBzbGlkZXMKCQljdXJyZW50U2xpZGUgPSBjdXJyZW50VmVydGljYWxTbGlkZXNbIGluZGV4diBdIHx8IGN1cnJlbnRIb3Jpem9udGFsU2xpZGU7CgoJCS8vIFNob3cgZnJhZ21lbnQsIGlmIHNwZWNpZmllZAoJCWlmKCB0eXBlb2YgZiAhPT0gJ3VuZGVmaW5lZCcgKSB7CgkJCW5hdmlnYXRlRnJhZ21lbnQoIGYgKTsKCQl9CgoJCS8vIERpc3BhdGNoIGFuIGV2ZW50IGlmIHRoZSBzbGlkZSBjaGFuZ2VkCgkJdmFyIHNsaWRlQ2hhbmdlZCA9ICggaW5kZXhoICE9PSBpbmRleGhCZWZvcmUgfHwgaW5kZXh2ICE9PSBpbmRleHZCZWZvcmUgKTsKCQlpZiAoIXNsaWRlQ2hhbmdlZCkgewoJCQkvLyBFbnN1cmUgdGhhdCB0aGUgcHJldmlvdXMgc2xpZGUgaXMgbmV2ZXIgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQKCQkJcHJldmlvdXNTbGlkZSA9IG51bGw7CgkJfQoKCQkvLyBTb2x2ZXMgYW4gZWRnZSBjYXNlIHdoZXJlIHRoZSBwcmV2aW91cyBzbGlkZSBtYWludGFpbnMgdGhlCgkJLy8gJ3ByZXNlbnQnIGNsYXNzIHdoZW4gbmF2aWdhdGluZyBiZXR3ZWVuIGFkamFjZW50IHZlcnRpY2FsCgkJLy8gc3RhY2tzCgkJaWYoIHByZXZpb3VzU2xpZGUgJiYgcHJldmlvdXNTbGlkZSAhPT0gY3VycmVudFNsaWRlICkgewoJCQlwcmV2aW91c1NsaWRlLmNsYXNzTGlzdC5yZW1vdmUoICdwcmVzZW50JyApOwoJCQlwcmV2aW91c1NsaWRlLnNldEF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJywgJ3RydWUnICk7CgoJCQkvLyBSZXNldCBhbGwgc2xpZGVzIHVwb24gbmF2aWdhdGUgdG8gaG9tZQoJCQkvLyBJc3N1ZTogIzI4NQoJCQlpZiAoIGRvbS53cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoIEhPTUVfU0xJREVfU0VMRUNUT1IgKS5jbGFzc0xpc3QuY29udGFpbnMoICdwcmVzZW50JyApICkgewoJCQkJLy8gTGF1bmNoIGFzeW5jIHRhc2sKCQkJCXNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHsKCQkJCQl2YXIgc2xpZGVzID0gdG9BcnJheSggZG9tLndyYXBwZXIucXVlcnlTZWxlY3RvckFsbCggSE9SSVpPTlRBTF9TTElERVNfU0VMRUNUT1IgKyAnLnN0YWNrJykgKSwgaTsKCQkJCQlmb3IoIGkgaW4gc2xpZGVzICkgewoJCQkJCQlpZiggc2xpZGVzW2ldICkgewoJCQkJCQkJLy8gUmVzZXQgc3RhY2sKCQkJCQkJCXNldFByZXZpb3VzVmVydGljYWxJbmRleCggc2xpZGVzW2ldLCAwICk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9LCAwICk7CgkJCX0KCQl9CgoJCS8vIEFwcGx5IHRoZSBuZXcgc3RhdGUKCQlzdGF0ZUxvb3A6IGZvciggdmFyIGkgPSAwLCBsZW4gPSBzdGF0ZS5sZW5ndGg7IGkgPCBsZW47IGkrKyApIHsKCQkJLy8gQ2hlY2sgaWYgdGhpcyBzdGF0ZSBleGlzdGVkIG9uIHRoZSBwcmV2aW91cyBzbGlkZS4gSWYgaXQKCQkJLy8gZGlkLCB3ZSB3aWxsIGF2b2lkIGFkZGluZyBpdCByZXBlYXRlZGx5CgkJCWZvciggdmFyIGogPSAwOyBqIDwgc3RhdGVCZWZvcmUubGVuZ3RoOyBqKysgKSB7CgkJCQlpZiggc3RhdGVCZWZvcmVbal0gPT09IHN0YXRlW2ldICkgewoJCQkJCXN0YXRlQmVmb3JlLnNwbGljZSggaiwgMSApOwoJCQkJCWNvbnRpbnVlIHN0YXRlTG9vcDsKCQkJCX0KCQkJfQoKCQkJZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoIHN0YXRlW2ldICk7CgoJCQkvLyBEaXNwYXRjaCBjdXN0b20gZXZlbnQgbWF0Y2hpbmcgdGhlIHN0YXRlJ3MgbmFtZQoJCQlkaXNwYXRjaEV2ZW50KCBzdGF0ZVtpXSApOwoJCX0KCgkJLy8gQ2xlYW4gdXAgdGhlIHJlbWFpbnMgb2YgdGhlIHByZXZpb3VzIHN0YXRlCgkJd2hpbGUoIHN0YXRlQmVmb3JlLmxlbmd0aCApIHsKCQkJZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoIHN0YXRlQmVmb3JlLnBvcCgpICk7CgkJfQoKCQlpZiggc2xpZGVDaGFuZ2VkICkgewoJCQlkaXNwYXRjaEV2ZW50KCAnc2xpZGVjaGFuZ2VkJywgewoJCQkJJ2luZGV4aCc6IGluZGV4aCwKCQkJCSdpbmRleHYnOiBpbmRleHYsCgkJCQkncHJldmlvdXNTbGlkZSc6IHByZXZpb3VzU2xpZGUsCgkJCQknY3VycmVudFNsaWRlJzogY3VycmVudFNsaWRlLAoJCQkJJ29yaWdpbic6IG8KCQkJfSApOwoJCX0KCgkJLy8gSGFuZGxlIGVtYmVkZGVkIGNvbnRlbnQKCQlpZiggc2xpZGVDaGFuZ2VkIHx8ICFwcmV2aW91c1NsaWRlICkgewoJCQlzdG9wRW1iZWRkZWRDb250ZW50KCBwcmV2aW91c1NsaWRlICk7CgkJCXN0YXJ0RW1iZWRkZWRDb250ZW50KCBjdXJyZW50U2xpZGUgKTsKCQl9CgoJCS8vIEFubm91bmNlIHRoZSBjdXJyZW50IHNsaWRlIGNvbnRlbnRzLCBmb3Igc2NyZWVuIHJlYWRlcnMKCQlkb20uc3RhdHVzRGl2LnRleHRDb250ZW50ID0gZ2V0U3RhdHVzVGV4dCggY3VycmVudFNsaWRlICk7CgoJCXVwZGF0ZUNvbnRyb2xzKCk7CgkJdXBkYXRlUHJvZ3Jlc3MoKTsKCQl1cGRhdGVCYWNrZ3JvdW5kKCk7CgkJdXBkYXRlUGFyYWxsYXgoKTsKCQl1cGRhdGVTbGlkZU51bWJlcigpOwoJCXVwZGF0ZU5vdGVzKCk7CgkJdXBkYXRlRnJhZ21lbnRzKCk7CgoJCS8vIFVwZGF0ZSB0aGUgVVJMIGhhc2gKCQl3cml0ZVVSTCgpOwoKCQljdWVBdXRvU2xpZGUoKTsKCgl9CgoJLyoqCgkgKiBTeW5jcyB0aGUgcHJlc2VudGF0aW9uIHdpdGggdGhlIGN1cnJlbnQgRE9NLiBVc2VmdWwKCSAqIHdoZW4gbmV3IHNsaWRlcyBvciBjb250cm9sIGVsZW1lbnRzIGFyZSBhZGRlZCBvciB3aGVuCgkgKiB0aGUgY29uZmlndXJhdGlvbiBoYXMgY2hhbmdlZC4KCSAqLwoJZnVuY3Rpb24gc3luYygpIHsKCgkJLy8gU3Vic2NyaWJlIHRvIGlucHV0CgkJcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTsKCQlhZGRFdmVudExpc3RlbmVycygpOwoKCQkvLyBGb3JjZSBhIGxheW91dCB0byBtYWtlIHN1cmUgdGhlIGN1cnJlbnQgY29uZmlnIGlzIGFjY291bnRlZCBmb3IKCQlsYXlvdXQoKTsKCgkJLy8gUmVmbGVjdCB0aGUgY3VycmVudCBhdXRvU2xpZGUgdmFsdWUKCQlhdXRvU2xpZGUgPSBjb25maWcuYXV0b1NsaWRlOwoKCQkvLyBTdGFydCBhdXRvLXNsaWRpbmcgaWYgaXQncyBlbmFibGVkCgkJY3VlQXV0b1NsaWRlKCk7CgoJCS8vIFJlLWNyZWF0ZSB0aGUgc2xpZGUgYmFja2dyb3VuZHMKCQljcmVhdGVCYWNrZ3JvdW5kcygpOwoKCQkvLyBXcml0ZSB0aGUgY3VycmVudCBoYXNoIHRvIHRoZSBVUkwKCQl3cml0ZVVSTCgpOwoKCQlzb3J0QWxsRnJhZ21lbnRzKCk7CgoJCXVwZGF0ZUNvbnRyb2xzKCk7CgkJdXBkYXRlUHJvZ3Jlc3MoKTsKCQl1cGRhdGVTbGlkZU51bWJlcigpOwoJCXVwZGF0ZVNsaWRlc1Zpc2liaWxpdHkoKTsKCQl1cGRhdGVCYWNrZ3JvdW5kKCB0cnVlICk7CgkJdXBkYXRlTm90ZXNWaXNpYmlsaXR5KCk7CgkJdXBkYXRlTm90ZXMoKTsKCgkJZm9ybWF0RW1iZWRkZWRDb250ZW50KCk7CgoJCS8vIFN0YXJ0IG9yIHN0b3AgZW1iZWRkZWQgY29udGVudCBkZXBlbmRpbmcgb24gZ2xvYmFsIGNvbmZpZwoJCWlmKCBjb25maWcuYXV0b1BsYXlNZWRpYSA9PT0gZmFsc2UgKSB7CgkJCXN0b3BFbWJlZGRlZENvbnRlbnQoIGN1cnJlbnRTbGlkZSwgeyB1bmxvYWRJZnJhbWVzOiBmYWxzZSB9ICk7CgkJfQoJCWVsc2UgewoJCQlzdGFydEVtYmVkZGVkQ29udGVudCggY3VycmVudFNsaWRlICk7CgkJfQoKCQlpZiggaXNPdmVydmlldygpICkgewoJCQlsYXlvdXRPdmVydmlldygpOwoJCX0KCgl9CgoJLyoqCgkgKiBVcGRhdGVzIHJldmVhbC5qcyB0byBrZWVwIGluIHN5bmMgd2l0aCBuZXcgc2xpZGUgYXR0cmlidXRlcy4gRm9yCgkgKiBleGFtcGxlLCBpZiB5b3UgYWRkIGEgbmV3IGBkYXRhLWJhY2tncm91bmQtaW1hZ2VgIHlvdSBjYW4gY2FsbAoJICogdGhpcyB0byBoYXZlIHJldmVhbC5qcyByZW5kZXIgdGhlIG5ldyBiYWNrZ3JvdW5kIGltYWdlLgoJICoKCSAqIFNpbWlsYXIgdG8gI3N5bmMoKSBidXQgbW9yZSBlZmZpY2llbnQgd2hlbiB5b3Ugb25seSBuZWVkIHRvCgkgKiByZWZyZXNoIGEgc3BlY2lmaWMgc2xpZGUuCgkgKgoJICogQHBhcmFtIHtIVE1MRWxlbWVudH0gc2xpZGUKCSAqLwoJZnVuY3Rpb24gc3luY1NsaWRlKCBzbGlkZSApIHsKCgkJLy8gRGVmYXVsdCB0byB0aGUgY3VycmVudCBzbGlkZQoJCXNsaWRlID0gc2xpZGUgfHwgY3VycmVudFNsaWRlOwoKCQlzeW5jQmFja2dyb3VuZCggc2xpZGUgKTsKCQlzeW5jRnJhZ21lbnRzKCBzbGlkZSApOwoKCQlsb2FkU2xpZGUoIHNsaWRlICk7CgoJCXVwZGF0ZUJhY2tncm91bmQoKTsKCQl1cGRhdGVOb3RlcygpOwoKCX0KCgkvKioKCSAqIEZvcm1hdHMgdGhlIGZyYWdtZW50cyBvbiB0aGUgZ2l2ZW4gc2xpZGUgc28gdGhhdCB0aGV5IGhhdmUKCSAqIHZhbGlkIGluZGljZXMuIENhbGwgdGhpcyBpZiBmcmFnbWVudHMgYXJlIGNoYW5nZWQgaW4gdGhlIERPTQoJICogYWZ0ZXIgcmV2ZWFsLmpzIGhhcyBhbHJlYWR5IGluaXRpYWxpemVkLgoJICoKCSAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHNsaWRlCgkgKiBAcmV0dXJuIHtBcnJheX0gYSBsaXN0IG9mIHRoZSBIVE1MIGZyYWdtZW50cyB0aGF0IHdlcmUgc3luY2VkCgkgKi8KCWZ1bmN0aW9uIHN5bmNGcmFnbWVudHMoIHNsaWRlICkgewoKCQkvLyBEZWZhdWx0IHRvIHRoZSBjdXJyZW50IHNsaWRlCgkJc2xpZGUgPSBzbGlkZSB8fCBjdXJyZW50U2xpZGU7CgoJCXJldHVybiBzb3J0RnJhZ21lbnRzKCBzbGlkZS5xdWVyeVNlbGVjdG9yQWxsKCAnLmZyYWdtZW50JyApICk7CgoJfQoKCS8qKgoJICogUmVzZXRzIGFsbCB2ZXJ0aWNhbCBzbGlkZXMgc28gdGhhdCBvbmx5IHRoZSBmaXJzdAoJICogaXMgdmlzaWJsZS4KCSAqLwoJZnVuY3Rpb24gcmVzZXRWZXJ0aWNhbFNsaWRlcygpIHsKCgkJdmFyIGhvcml6b250YWxTbGlkZXMgPSB0b0FycmF5KCBkb20ud3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCBIT1JJWk9OVEFMX1NMSURFU19TRUxFQ1RPUiApICk7CgkJaG9yaXpvbnRhbFNsaWRlcy5mb3JFYWNoKCBmdW5jdGlvbiggaG9yaXpvbnRhbFNsaWRlICkgewoKCQkJdmFyIHZlcnRpY2FsU2xpZGVzID0gdG9BcnJheSggaG9yaXpvbnRhbFNsaWRlLnF1ZXJ5U2VsZWN0b3JBbGwoICdzZWN0aW9uJyApICk7CgkJCXZlcnRpY2FsU2xpZGVzLmZvckVhY2goIGZ1bmN0aW9uKCB2ZXJ0aWNhbFNsaWRlLCB5ICkgewoKCQkJCWlmKCB5ID4gMCApIHsKCQkJCQl2ZXJ0aWNhbFNsaWRlLmNsYXNzTGlzdC5yZW1vdmUoICdwcmVzZW50JyApOwoJCQkJCXZlcnRpY2FsU2xpZGUuY2xhc3NMaXN0LnJlbW92ZSggJ3Bhc3QnICk7CgkJCQkJdmVydGljYWxTbGlkZS5jbGFzc0xpc3QuYWRkKCAnZnV0dXJlJyApOwoJCQkJCXZlcnRpY2FsU2xpZGUuc2V0QXR0cmlidXRlKCAnYXJpYS1oaWRkZW4nLCAndHJ1ZScgKTsKCQkJCX0KCgkJCX0gKTsKCgkJfSApOwoKCX0KCgkvKioKCSAqIFNvcnRzIGFuZCBmb3JtYXRzIGFsbCBvZiBmcmFnbWVudHMgaW4gdGhlCgkgKiBwcmVzZW50YXRpb24uCgkgKi8KCWZ1bmN0aW9uIHNvcnRBbGxGcmFnbWVudHMoKSB7CgoJCXZhciBob3Jpem9udGFsU2xpZGVzID0gdG9BcnJheSggZG9tLndyYXBwZXIucXVlcnlTZWxlY3RvckFsbCggSE9SSVpPTlRBTF9TTElERVNfU0VMRUNUT1IgKSApOwoJCWhvcml6b250YWxTbGlkZXMuZm9yRWFjaCggZnVuY3Rpb24oIGhvcml6b250YWxTbGlkZSApIHsKCgkJCXZhciB2ZXJ0aWNhbFNsaWRlcyA9IHRvQXJyYXkoIGhvcml6b250YWxTbGlkZS5xdWVyeVNlbGVjdG9yQWxsKCAnc2VjdGlvbicgKSApOwoJCQl2ZXJ0aWNhbFNsaWRlcy5mb3JFYWNoKCBmdW5jdGlvbiggdmVydGljYWxTbGlkZSwgeSApIHsKCgkJCQlzb3J0RnJhZ21lbnRzKCB2ZXJ0aWNhbFNsaWRlLnF1ZXJ5U2VsZWN0b3JBbGwoICcuZnJhZ21lbnQnICkgKTsKCgkJCX0gKTsKCgkJCWlmKCB2ZXJ0aWNhbFNsaWRlcy5sZW5ndGggPT09IDAgKSBzb3J0RnJhZ21lbnRzKCBob3Jpem9udGFsU2xpZGUucXVlcnlTZWxlY3RvckFsbCggJy5mcmFnbWVudCcgKSApOwoKCQl9ICk7CgoJfQoKCS8qKgoJICogUmFuZG9tbHkgc2h1ZmZsZXMgYWxsIHNsaWRlcyBpbiB0aGUgZGVjay4KCSAqLwoJZnVuY3Rpb24gc2h1ZmZsZSgpIHsKCgkJdmFyIHNsaWRlcyA9IHRvQXJyYXkoIGRvbS53cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoIEhPUklaT05UQUxfU0xJREVTX1NFTEVDVE9SICkgKTsKCgkJc2xpZGVzLmZvckVhY2goIGZ1bmN0aW9uKCBzbGlkZSApIHsKCgkJCS8vIEluc2VydCB0aGlzIHNsaWRlIG5leHQgdG8gYW5vdGhlciByYW5kb20gc2xpZGUuIFRoaXMgbWF5CgkJCS8vIGNhdXNlIHRoZSBzbGlkZSB0byBpbnNlcnQgYmVmb3JlIGl0c2VsZiBidXQgdGhhdCdzIGZpbmUuCgkJCWRvbS5zbGlkZXMuaW5zZXJ0QmVmb3JlKCBzbGlkZSwgc2xpZGVzWyBNYXRoLmZsb29yKCBNYXRoLnJhbmRvbSgpICogc2xpZGVzLmxlbmd0aCApIF0gKTsKCgkJfSApOwoKCX0KCgkvKioKCSAqIFVwZGF0ZXMgb25lIGRpbWVuc2lvbiBvZiBzbGlkZXMgYnkgc2hvd2luZyB0aGUgc2xpZGUKCSAqIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleC4KCSAqCgkgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgQSBDU1Mgc2VsZWN0b3IgdGhhdCB3aWxsIGZldGNoCgkgKiB0aGUgZ3JvdXAgb2Ygc2xpZGVzIHdlIGFyZSB3b3JraW5nIHdpdGgKCSAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHNsaWRlIHRoYXQgc2hvdWxkIGJlCgkgKiBzaG93bgoJICoKCSAqIEByZXR1cm4ge251bWJlcn0gVGhlIGluZGV4IG9mIHRoZSBzbGlkZSB0aGF0IGlzIG5vdyBzaG93biwKCSAqIG1pZ2h0IGRpZmZlciBmcm9tIHRoZSBwYXNzZWQgaW4gaW5kZXggaWYgaXQgd2FzIG91dCBvZgoJICogYm91bmRzLgoJICovCglmdW5jdGlvbiB1cGRhdGVTbGlkZXMoIHNlbGVjdG9yLCBpbmRleCApIHsKCgkJLy8gU2VsZWN0IGFsbCBzbGlkZXMgYW5kIGNvbnZlcnQgdGhlIE5vZGVMaXN0IHJlc3VsdCB0bwoJCS8vIGFuIGFycmF5CgkJdmFyIHNsaWRlcyA9IHRvQXJyYXkoIGRvbS53cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoIHNlbGVjdG9yICkgKSwKCQkJc2xpZGVzTGVuZ3RoID0gc2xpZGVzLmxlbmd0aDsKCgkJdmFyIHByaW50TW9kZSA9IGlzUHJpbnRpbmdQREYoKTsKCgkJaWYoIHNsaWRlc0xlbmd0aCApIHsKCgkJCS8vIFNob3VsZCB0aGUgaW5kZXggbG9vcD8KCQkJaWYoIGNvbmZpZy5sb29wICkgewoJCQkJaW5kZXggJT0gc2xpZGVzTGVuZ3RoOwoKCQkJCWlmKCBpbmRleCA8IDAgKSB7CgkJCQkJaW5kZXggPSBzbGlkZXNMZW5ndGggKyBpbmRleDsKCQkJCX0KCQkJfQoKCQkJLy8gRW5mb3JjZSBtYXggYW5kIG1pbmltdW0gaW5kZXggYm91bmRzCgkJCWluZGV4ID0gTWF0aC5tYXgoIE1hdGgubWluKCBpbmRleCwgc2xpZGVzTGVuZ3RoIC0gMSApLCAwICk7CgoJCQlmb3IoIHZhciBpID0gMDsgaSA8IHNsaWRlc0xlbmd0aDsgaSsrICkgewoJCQkJdmFyIGVsZW1lbnQgPSBzbGlkZXNbaV07CgoJCQkJdmFyIHJldmVyc2UgPSBjb25maWcucnRsICYmICFpc1ZlcnRpY2FsU2xpZGUoIGVsZW1lbnQgKTsKCgkJCQllbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoICdwYXN0JyApOwoJCQkJZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCAncHJlc2VudCcgKTsKCQkJCWVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSggJ2Z1dHVyZScgKTsKCgkJCQkvLyBodHRwOi8vd3d3LnczLm9yZy9odG1sL3dnL2RyYWZ0cy9odG1sL21hc3Rlci9lZGl0aW5nLmh0bWwjdGhlLWhpZGRlbi1hdHRyaWJ1dGUKCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCAnaGlkZGVuJywgJycgKTsKCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCAnYXJpYS1oaWRkZW4nLCAndHJ1ZScgKTsKCgkJCQkvLyBJZiB0aGlzIGVsZW1lbnQgY29udGFpbnMgdmVydGljYWwgc2xpZGVzCgkJCQlpZiggZWxlbWVudC5xdWVyeVNlbGVjdG9yKCAnc2VjdGlvbicgKSApIHsKCQkJCQllbGVtZW50LmNsYXNzTGlzdC5hZGQoICdzdGFjaycgKTsKCQkJCX0KCgkJCQkvLyBJZiB3ZSdyZSBwcmludGluZyBzdGF0aWMgc2xpZGVzLCBhbGwgc2xpZGVzIGFyZSAicHJlc2VudCIKCQkJCWlmKCBwcmludE1vZGUgKSB7CgkJCQkJZWxlbWVudC5jbGFzc0xpc3QuYWRkKCAncHJlc2VudCcgKTsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQlpZiggaSA8IGluZGV4ICkgewoJCQkJCS8vIEFueSBlbGVtZW50IHByZXZpb3VzIHRvIGluZGV4IGlzIGdpdmVuIHRoZSAncGFzdCcgY2xhc3MKCQkJCQllbGVtZW50LmNsYXNzTGlzdC5hZGQoIHJldmVyc2UgPyAnZnV0dXJlJyA6ICdwYXN0JyApOwoKCQkJCQlpZiggY29uZmlnLmZyYWdtZW50cyApIHsKCQkJCQkJLy8gU2hvdyBhbGwgZnJhZ21lbnRzIGluIHByaW9yIHNsaWRlcwoJCQkJCQl0b0FycmF5KCBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICcuZnJhZ21lbnQnICkgKS5mb3JFYWNoKCBmdW5jdGlvbiggZnJhZ21lbnQgKSB7CgkJCQkJCQlmcmFnbWVudC5jbGFzc0xpc3QuYWRkKCAndmlzaWJsZScgKTsKCQkJCQkJCWZyYWdtZW50LmNsYXNzTGlzdC5yZW1vdmUoICdjdXJyZW50LWZyYWdtZW50JyApOwoJCQkJCQl9ICk7CgkJCQkJfQoJCQkJfQoJCQkJZWxzZSBpZiggaSA+IGluZGV4ICkgewoJCQkJCS8vIEFueSBlbGVtZW50IHN1YnNlcXVlbnQgdG8gaW5kZXggaXMgZ2l2ZW4gdGhlICdmdXR1cmUnIGNsYXNzCgkJCQkJZWxlbWVudC5jbGFzc0xpc3QuYWRkKCByZXZlcnNlID8gJ3Bhc3QnIDogJ2Z1dHVyZScgKTsKCgkJCQkJaWYoIGNvbmZpZy5mcmFnbWVudHMgKSB7CgkJCQkJCS8vIEhpZGUgYWxsIGZyYWdtZW50cyBpbiBmdXR1cmUgc2xpZGVzCgkJCQkJCXRvQXJyYXkoIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCggJy5mcmFnbWVudC52aXNpYmxlJyApICkuZm9yRWFjaCggZnVuY3Rpb24oIGZyYWdtZW50ICkgewoJCQkJCQkJZnJhZ21lbnQuY2xhc3NMaXN0LnJlbW92ZSggJ3Zpc2libGUnICk7CgkJCQkJCQlmcmFnbWVudC5jbGFzc0xpc3QucmVtb3ZlKCAnY3VycmVudC1mcmFnbWVudCcgKTsKCQkJCQkJfSApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gTWFyayB0aGUgY3VycmVudCBzbGlkZSBhcyBwcmVzZW50CgkJCXNsaWRlc1tpbmRleF0uY2xhc3NMaXN0LmFkZCggJ3ByZXNlbnQnICk7CgkJCXNsaWRlc1tpbmRleF0ucmVtb3ZlQXR0cmlidXRlKCAnaGlkZGVuJyApOwoJCQlzbGlkZXNbaW5kZXhdLnJlbW92ZUF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJyApOwoKCQkJLy8gSWYgdGhpcyBzbGlkZSBoYXMgYSBzdGF0ZSBhc3NvY2lhdGVkIHdpdGggaXQsIGFkZCBpdAoJCQkvLyBvbnRvIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBkZWNrCgkJCXZhciBzbGlkZVN0YXRlID0gc2xpZGVzW2luZGV4XS5nZXRBdHRyaWJ1dGUoICdkYXRhLXN0YXRlJyApOwoJCQlpZiggc2xpZGVTdGF0ZSApIHsKCQkJCXN0YXRlID0gc3RhdGUuY29uY2F0KCBzbGlkZVN0YXRlLnNwbGl0KCAnICcgKSApOwoJCQl9CgoJCX0KCQllbHNlIHsKCQkJLy8gU2luY2UgdGhlcmUgYXJlIG5vIHNsaWRlcyB3ZSBjYW4ndCBiZSBhbnl3aGVyZSBiZXlvbmQgdGhlCgkJCS8vIHplcm90aCBpbmRleAoJCQlpbmRleCA9IDA7CgkJfQoKCQlyZXR1cm4gaW5kZXg7CgoJfQoKCS8qKgoJICogT3B0aW1pemF0aW9uIG1ldGhvZDsgaGlkZSBhbGwgc2xpZGVzIHRoYXQgYXJlIGZhciBhd2F5CgkgKiBmcm9tIHRoZSBwcmVzZW50IHNsaWRlLgoJICovCglmdW5jdGlvbiB1cGRhdGVTbGlkZXNWaXNpYmlsaXR5KCkgewoKCQkvLyBTZWxlY3QgYWxsIHNsaWRlcyBhbmQgY29udmVydCB0aGUgTm9kZUxpc3QgcmVzdWx0IHRvCgkJLy8gYW4gYXJyYXkKCQl2YXIgaG9yaXpvbnRhbFNsaWRlcyA9IHRvQXJyYXkoIGRvbS53cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoIEhPUklaT05UQUxfU0xJREVTX1NFTEVDVE9SICkgKSwKCQkJaG9yaXpvbnRhbFNsaWRlc0xlbmd0aCA9IGhvcml6b250YWxTbGlkZXMubGVuZ3RoLAoJCQlkaXN0YW5jZVgsCgkJCWRpc3RhbmNlWTsKCgkJaWYoIGhvcml6b250YWxTbGlkZXNMZW5ndGggJiYgdHlwZW9mIGluZGV4aCAhPT0gJ3VuZGVmaW5lZCcgKSB7CgoJCQkvLyBUaGUgbnVtYmVyIG9mIHN0ZXBzIGF3YXkgZnJvbSB0aGUgcHJlc2VudCBzbGlkZSB0aGF0IHdpbGwKCQkJLy8gYmUgdmlzaWJsZQoJCQl2YXIgdmlld0Rpc3RhbmNlID0gaXNPdmVydmlldygpID8gMTAgOiBjb25maWcudmlld0Rpc3RhbmNlOwoKCQkJLy8gTGltaXQgdmlldyBkaXN0YW5jZSBvbiB3ZWFrZXIgZGV2aWNlcwoJCQlpZiggaXNNb2JpbGVEZXZpY2UgKSB7CgkJCQl2aWV3RGlzdGFuY2UgPSBpc092ZXJ2aWV3KCkgPyA2IDogMjsKCQkJfQoKCQkJLy8gQWxsIHNsaWRlcyBuZWVkIHRvIGJlIHZpc2libGUgd2hlbiBleHBvcnRpbmcgdG8gUERGCgkJCWlmKCBpc1ByaW50aW5nUERGKCkgKSB7CgkJCQl2aWV3RGlzdGFuY2UgPSBOdW1iZXIuTUFYX1ZBTFVFOwoJCQl9CgoJCQlmb3IoIHZhciB4ID0gMDsgeCA8IGhvcml6b250YWxTbGlkZXNMZW5ndGg7IHgrKyApIHsKCQkJCXZhciBob3Jpem9udGFsU2xpZGUgPSBob3Jpem9udGFsU2xpZGVzW3hdOwoKCQkJCXZhciB2ZXJ0aWNhbFNsaWRlcyA9IHRvQXJyYXkoIGhvcml6b250YWxTbGlkZS5xdWVyeVNlbGVjdG9yQWxsKCAnc2VjdGlvbicgKSApLAoJCQkJCXZlcnRpY2FsU2xpZGVzTGVuZ3RoID0gdmVydGljYWxTbGlkZXMubGVuZ3RoOwoKCQkJCS8vIERldGVybWluZSBob3cgZmFyIGF3YXkgdGhpcyBzbGlkZSBpcyBmcm9tIHRoZSBwcmVzZW50CgkJCQlkaXN0YW5jZVggPSBNYXRoLmFicyggKCBpbmRleGggfHwgMCApIC0geCApIHx8IDA7CgoJCQkJLy8gSWYgdGhlIHByZXNlbnRhdGlvbiBpcyBsb29wZWQsIGRpc3RhbmNlIHNob3VsZCBtZWFzdXJlCgkJCQkvLyAxIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBsYXN0IHNsaWRlcwoJCQkJaWYoIGNvbmZpZy5sb29wICkgewoJCQkJCWRpc3RhbmNlWCA9IE1hdGguYWJzKCAoICggaW5kZXhoIHx8IDAgKSAtIHggKSAlICggaG9yaXpvbnRhbFNsaWRlc0xlbmd0aCAtIHZpZXdEaXN0YW5jZSApICkgfHwgMDsKCQkJCX0KCgkJCQkvLyBTaG93IHRoZSBob3Jpem9udGFsIHNsaWRlIGlmIGl0J3Mgd2l0aGluIHRoZSB2aWV3IGRpc3RhbmNlCgkJCQlpZiggZGlzdGFuY2VYIDwgdmlld0Rpc3RhbmNlICkgewoJCQkJCWxvYWRTbGlkZSggaG9yaXpvbnRhbFNsaWRlICk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQl1bmxvYWRTbGlkZSggaG9yaXpvbnRhbFNsaWRlICk7CgkJCQl9CgoJCQkJaWYoIHZlcnRpY2FsU2xpZGVzTGVuZ3RoICkgewoKCQkJCQl2YXIgb3kgPSBnZXRQcmV2aW91c1ZlcnRpY2FsSW5kZXgoIGhvcml6b250YWxTbGlkZSApOwoKCQkJCQlmb3IoIHZhciB5ID0gMDsgeSA8IHZlcnRpY2FsU2xpZGVzTGVuZ3RoOyB5KysgKSB7CgkJCQkJCXZhciB2ZXJ0aWNhbFNsaWRlID0gdmVydGljYWxTbGlkZXNbeV07CgoJCQkJCQlkaXN0YW5jZVkgPSB4ID09PSAoIGluZGV4aCB8fCAwICkgPyBNYXRoLmFicyggKCBpbmRleHYgfHwgMCApIC0geSApIDogTWF0aC5hYnMoIHkgLSBveSApOwoKCQkJCQkJaWYoIGRpc3RhbmNlWCArIGRpc3RhbmNlWSA8IHZpZXdEaXN0YW5jZSApIHsKCQkJCQkJCWxvYWRTbGlkZSggdmVydGljYWxTbGlkZSApOwoJCQkJCQl9CgkJCQkJCWVsc2UgewoJCQkJCQkJdW5sb2FkU2xpZGUoIHZlcnRpY2FsU2xpZGUgKTsKCQkJCQkJfQoJCQkJCX0KCgkJCQl9CgkJCX0KCgkJCS8vIEZsYWcgaWYgdGhlcmUgYXJlIEFOWSB2ZXJ0aWNhbCBzbGlkZXMsIGFueXdoZXJlIGluIHRoZSBkZWNrCgkJCWlmKCBoYXNWZXJ0aWNhbFNsaWRlcygpICkgewoJCQkJZG9tLndyYXBwZXIuY2xhc3NMaXN0LmFkZCggJ2hhcy12ZXJ0aWNhbC1zbGlkZXMnICk7CgkJCX0KCQkJZWxzZSB7CgkJCQlkb20ud3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCAnaGFzLXZlcnRpY2FsLXNsaWRlcycgKTsKCQkJfQoKCQkJLy8gRmxhZyBpZiB0aGVyZSBhcmUgQU5ZIGhvcml6b250YWwgc2xpZGVzLCBhbnl3aGVyZSBpbiB0aGUgZGVjawoJCQlpZiggaGFzSG9yaXpvbnRhbFNsaWRlcygpICkgewoJCQkJZG9tLndyYXBwZXIuY2xhc3NMaXN0LmFkZCggJ2hhcy1ob3Jpem9udGFsLXNsaWRlcycgKTsKCQkJfQoJCQllbHNlIHsKCQkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoICdoYXMtaG9yaXpvbnRhbC1zbGlkZXMnICk7CgkJCX0KCgkJfQoKCX0KCgkvKioKCSAqIFBpY2sgdXAgbm90ZXMgZnJvbSB0aGUgY3VycmVudCBzbGlkZSBhbmQgZGlzcGxheSB0aGVtCgkgKiB0byB0aGUgdmlld2VyLgoJICoKCSAqIEBzZWUge0BsaW5rIGNvbmZpZy5zaG93Tm90ZXN9CgkgKi8KCWZ1bmN0aW9uIHVwZGF0ZU5vdGVzKCkgewoKCQlpZiggY29uZmlnLnNob3dOb3RlcyAmJiBkb20uc3BlYWtlck5vdGVzICYmIGN1cnJlbnRTbGlkZSAmJiAhaXNQcmludGluZ1BERigpICkgewoKCQkJZG9tLnNwZWFrZXJOb3Rlcy5pbm5lckhUTUwgPSBnZXRTbGlkZU5vdGVzKCkgfHwgJzxzcGFuIGNsYXNzPSJub3Rlcy1wbGFjZWhvbGRlciI+Tm8gbm90ZXMgb24gdGhpcyBzbGlkZS48L3NwYW4+JzsKCgkJfQoKCX0KCgkvKioKCSAqIFVwZGF0ZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIHNwZWFrZXIgbm90ZXMgc2lkZWJhciB0aGF0CgkgKiBpcyB1c2VkIHRvIHNoYXJlIGFubm90YXRlZCBzbGlkZXMuIFRoZSBub3RlcyBzaWRlYmFyIGlzCgkgKiBvbmx5IHZpc2libGUgaWYgc2hvd05vdGVzIGlzIHRydWUgYW5kIHRoZXJlIGFyZSBub3RlcyBvbgoJICogb25lIG9yIG1vcmUgc2xpZGVzIGluIHRoZSBkZWNrLgoJICovCglmdW5jdGlvbiB1cGRhdGVOb3Rlc1Zpc2liaWxpdHkoKSB7CgoJCWlmKCBjb25maWcuc2hvd05vdGVzICYmIGhhc05vdGVzKCkgKSB7CgkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5hZGQoICdzaG93LW5vdGVzJyApOwoJCX0KCQllbHNlIHsKCQkJZG9tLndyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSggJ3Nob3ctbm90ZXMnICk7CgkJfQoKCX0KCgkvKioKCSAqIENoZWNrcyBpZiB0aGVyZSBhcmUgc3BlYWtlciBub3RlcyBmb3IgQU5ZIHNsaWRlIGluIHRoZQoJICogcHJlc2VudGF0aW9uLgoJICovCglmdW5jdGlvbiBoYXNOb3RlcygpIHsKCgkJcmV0dXJuIGRvbS5zbGlkZXMucXVlcnlTZWxlY3RvckFsbCggJ1tkYXRhLW5vdGVzXSwgYXNpZGUubm90ZXMnICkubGVuZ3RoID4gMDsKCgl9CgoJLyoqCgkgKiBVcGRhdGVzIHRoZSBwcm9ncmVzcyBiYXIgdG8gcmVmbGVjdCB0aGUgY3VycmVudCBzbGlkZS4KCSAqLwoJZnVuY3Rpb24gdXBkYXRlUHJvZ3Jlc3MoKSB7CgoJCS8vIFVwZGF0ZSBwcm9ncmVzcyBpZiBlbmFibGVkCgkJaWYoIGNvbmZpZy5wcm9ncmVzcyAmJiBkb20ucHJvZ3Jlc3NiYXIgKSB7CgoJCQlkb20ucHJvZ3Jlc3NiYXIuc3R5bGUud2lkdGggPSBnZXRQcm9ncmVzcygpICogZG9tLndyYXBwZXIub2Zmc2V0V2lkdGggKyAncHgnOwoKCQl9CgoJfQoKCgkvKioKCSAqIFVwZGF0ZXMgdGhlIHNsaWRlIG51bWJlciB0byBtYXRjaCB0aGUgY3VycmVudCBzbGlkZS4KCSAqLwoJZnVuY3Rpb24gdXBkYXRlU2xpZGVOdW1iZXIoKSB7CgoJCS8vIFVwZGF0ZSBzbGlkZSBudW1iZXIgaWYgZW5hYmxlZAoJCWlmKCBjb25maWcuc2xpZGVOdW1iZXIgJiYgZG9tLnNsaWRlTnVtYmVyICkgewoKCQkJdmFyIHZhbHVlOwoJCQl2YXIgZm9ybWF0ID0gJ2gudic7CgoJCQlpZiggdHlwZW9mIGNvbmZpZy5zbGlkZU51bWJlciA9PT0gJ2Z1bmN0aW9uJyApIHsKCQkJCXZhbHVlID0gY29uZmlnLnNsaWRlTnVtYmVyKCk7CgkJCX0KCQkJZWxzZSB7CgkJCQkvLyBDaGVjayBpZiBhIGN1c3RvbSBudW1iZXIgZm9ybWF0IGlzIGF2YWlsYWJsZQoJCQkJaWYoIHR5cGVvZiBjb25maWcuc2xpZGVOdW1iZXIgPT09ICdzdHJpbmcnICkgewoJCQkJCWZvcm1hdCA9IGNvbmZpZy5zbGlkZU51bWJlcjsKCQkJCX0KCgkJCQkvLyBJZiB0aGVyZSBhcmUgT05MWSB2ZXJ0aWNhbCBzbGlkZXMgaW4gdGhpcyBkZWNrLCBhbHdheXMgdXNlCgkJCQkvLyBhIGZsYXR0ZW5lZCBzbGlkZSBudW1iZXIKCQkJCWlmKCAhL2MvLnRlc3QoIGZvcm1hdCApICYmIGRvbS53cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoIEhPUklaT05UQUxfU0xJREVTX1NFTEVDVE9SICkubGVuZ3RoID09PSAxICkgewoJCQkJCWZvcm1hdCA9ICdjJzsKCQkJCX0KCgkJCQl2YWx1ZSA9IFtdOwoJCQkJc3dpdGNoKCBmb3JtYXQgKSB7CgkJCQkJY2FzZSAnYyc6CgkJCQkJCXZhbHVlLnB1c2goIGdldFNsaWRlUGFzdENvdW50KCkgKyAxICk7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ2MvdCc6CgkJCQkJCXZhbHVlLnB1c2goIGdldFNsaWRlUGFzdENvdW50KCkgKyAxLCAnLycsIGdldFRvdGFsU2xpZGVzKCkgKTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnaC92JzoKCQkJCQkJdmFsdWUucHVzaCggaW5kZXhoICsgMSApOwoJCQkJCQlpZiggaXNWZXJ0aWNhbFNsaWRlKCkgKSB2YWx1ZS5wdXNoKCAnLycsIGluZGV4diArIDEgKTsKCQkJCQkJYnJlYWs7CgkJCQkJZGVmYXVsdDoKCQkJCQkJdmFsdWUucHVzaCggaW5kZXhoICsgMSApOwoJCQkJCQlpZiggaXNWZXJ0aWNhbFNsaWRlKCkgKSB2YWx1ZS5wdXNoKCAnLicsIGluZGV4diArIDEgKTsKCQkJCX0KCQkJfQoKCQkJZG9tLnNsaWRlTnVtYmVyLmlubmVySFRNTCA9IGZvcm1hdFNsaWRlTnVtYmVyKCB2YWx1ZVswXSwgdmFsdWVbMV0sIHZhbHVlWzJdICk7CgkJfQoKCX0KCgkvKioKCSAqIEFwcGxpZXMgSFRNTCBmb3JtYXR0aW5nIHRvIGEgc2xpZGUgbnVtYmVyIGJlZm9yZSBpdCdzCgkgKiB3cml0dGVuIHRvIHRoZSBET00uCgkgKgoJICogQHBhcmFtIHtudW1iZXJ9IGEgQ3VycmVudCBzbGlkZQoJICogQHBhcmFtIHtzdHJpbmd9IGRlbGltaXRlciBDaGFyYWN0ZXIgdG8gc2VwYXJhdGUgc2xpZGUgbnVtYmVycwoJICogQHBhcmFtIHsobnVtYmVyfCopfSBiIFRvdGFsIHNsaWRlcwoJICogQHJldHVybiB7c3RyaW5nfSBIVE1MIHN0cmluZyBmcmFnbWVudAoJICovCglmdW5jdGlvbiBmb3JtYXRTbGlkZU51bWJlciggYSwgZGVsaW1pdGVyLCBiICkgewoKCQl2YXIgdXJsID0gJyMnICsgbG9jYXRpb25IYXNoKCk7CgkJaWYoIHR5cGVvZiBiID09PSAnbnVtYmVyJyAmJiAhaXNOYU4oIGIgKSApIHsKCQkJcmV0dXJuICAnPGEgaHJlZj0iJyArIHVybCArICciPicgKwoJCQkJCSc8c3BhbiBjbGFzcz0ic2xpZGUtbnVtYmVyLWEiPicrIGEgKyc8L3NwYW4+JyArCgkJCQkJJzxzcGFuIGNsYXNzPSJzbGlkZS1udW1iZXItZGVsaW1pdGVyIj4nKyBkZWxpbWl0ZXIgKyc8L3NwYW4+JyArCgkJCQkJJzxzcGFuIGNsYXNzPSJzbGlkZS1udW1iZXItYiI+JysgYiArJzwvc3Bhbj4nICsKCQkJCQknPC9hPic7CgkJfQoJCWVsc2UgewoJCQlyZXR1cm4gJzxhIGhyZWY9IicgKyB1cmwgKyAnIj4nICsKCQkJICAgICAgICc8c3BhbiBjbGFzcz0ic2xpZGUtbnVtYmVyLWEiPicrIGEgKyc8L3NwYW4+JyArCgkJCSAgICAgICAnPC9hPic7CgkJfQoKCX0KCgkvKioKCSAqIFVwZGF0ZXMgdGhlIHN0YXRlIG9mIGFsbCBjb250cm9sL25hdmlnYXRpb24gYXJyb3dzLgoJICovCglmdW5jdGlvbiB1cGRhdGVDb250cm9scygpIHsKCgkJdmFyIHJvdXRlcyA9IGF2YWlsYWJsZVJvdXRlcygpOwoJCXZhciBmcmFnbWVudHMgPSBhdmFpbGFibGVGcmFnbWVudHMoKTsKCgkJLy8gUmVtb3ZlIHRoZSAnZW5hYmxlZCcgY2xhc3MgZnJvbSBhbGwgZGlyZWN0aW9ucwoJCWRvbS5jb250cm9sc0xlZnQuY29uY2F0KCBkb20uY29udHJvbHNSaWdodCApCgkJCQkJCS5jb25jYXQoIGRvbS5jb250cm9sc1VwICkKCQkJCQkJLmNvbmNhdCggZG9tLmNvbnRyb2xzRG93biApCgkJCQkJCS5jb25jYXQoIGRvbS5jb250cm9sc1ByZXYgKQoJCQkJCQkuY29uY2F0KCBkb20uY29udHJvbHNOZXh0ICkuZm9yRWFjaCggZnVuY3Rpb24oIG5vZGUgKSB7CgkJCW5vZGUuY2xhc3NMaXN0LnJlbW92ZSggJ2VuYWJsZWQnICk7CgkJCW5vZGUuY2xhc3NMaXN0LnJlbW92ZSggJ2ZyYWdtZW50ZWQnICk7CgoJCQkvLyBTZXQgJ2Rpc2FibGVkJyBhdHRyaWJ1dGUgb24gYWxsIGRpcmVjdGlvbnMKCQkJbm9kZS5zZXRBdHRyaWJ1dGUoICdkaXNhYmxlZCcsICdkaXNhYmxlZCcgKTsKCQl9ICk7CgoJCS8vIEFkZCB0aGUgJ2VuYWJsZWQnIGNsYXNzIHRvIHRoZSBhdmFpbGFibGUgcm91dGVzOyByZW1vdmUgJ2Rpc2FibGVkJyBhdHRyaWJ1dGUgdG8gZW5hYmxlIGJ1dHRvbnMKCQlpZiggcm91dGVzLmxlZnQgKSBkb20uY29udHJvbHNMZWZ0LmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsgZWwuY2xhc3NMaXN0LmFkZCggJ2VuYWJsZWQnICk7IGVsLnJlbW92ZUF0dHJpYnV0ZSggJ2Rpc2FibGVkJyApOyB9ICk7CgkJaWYoIHJvdXRlcy5yaWdodCApIGRvbS5jb250cm9sc1JpZ2h0LmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsgZWwuY2xhc3NMaXN0LmFkZCggJ2VuYWJsZWQnICk7IGVsLnJlbW92ZUF0dHJpYnV0ZSggJ2Rpc2FibGVkJyApOyB9ICk7CgkJaWYoIHJvdXRlcy51cCApIGRvbS5jb250cm9sc1VwLmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsgZWwuY2xhc3NMaXN0LmFkZCggJ2VuYWJsZWQnICk7IGVsLnJlbW92ZUF0dHJpYnV0ZSggJ2Rpc2FibGVkJyApOyB9ICk7CgkJaWYoIHJvdXRlcy5kb3duICkgZG9tLmNvbnRyb2xzRG93bi5mb3JFYWNoKCBmdW5jdGlvbiggZWwgKSB7IGVsLmNsYXNzTGlzdC5hZGQoICdlbmFibGVkJyApOyBlbC5yZW1vdmVBdHRyaWJ1dGUoICdkaXNhYmxlZCcgKTsgfSApOwoKCQkvLyBQcmV2L25leHQgYnV0dG9ucwoJCWlmKCByb3V0ZXMubGVmdCB8fCByb3V0ZXMudXAgKSBkb20uY29udHJvbHNQcmV2LmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsgZWwuY2xhc3NMaXN0LmFkZCggJ2VuYWJsZWQnICk7IGVsLnJlbW92ZUF0dHJpYnV0ZSggJ2Rpc2FibGVkJyApOyB9ICk7CgkJaWYoIHJvdXRlcy5yaWdodCB8fCByb3V0ZXMuZG93biApIGRvbS5jb250cm9sc05leHQuZm9yRWFjaCggZnVuY3Rpb24oIGVsICkgeyBlbC5jbGFzc0xpc3QuYWRkKCAnZW5hYmxlZCcgKTsgZWwucmVtb3ZlQXR0cmlidXRlKCAnZGlzYWJsZWQnICk7IH0gKTsKCgkJLy8gSGlnaGxpZ2h0IGZyYWdtZW50IGRpcmVjdGlvbnMKCQlpZiggY3VycmVudFNsaWRlICkgewoKCQkJLy8gQWx3YXlzIGFwcGx5IGZyYWdtZW50IGRlY29yYXRvciB0byBwcmV2L25leHQgYnV0dG9ucwoJCQlpZiggZnJhZ21lbnRzLnByZXYgKSBkb20uY29udHJvbHNQcmV2LmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsgZWwuY2xhc3NMaXN0LmFkZCggJ2ZyYWdtZW50ZWQnLCAnZW5hYmxlZCcgKTsgZWwucmVtb3ZlQXR0cmlidXRlKCAnZGlzYWJsZWQnICk7IH0gKTsKCQkJaWYoIGZyYWdtZW50cy5uZXh0ICkgZG9tLmNvbnRyb2xzTmV4dC5mb3JFYWNoKCBmdW5jdGlvbiggZWwgKSB7IGVsLmNsYXNzTGlzdC5hZGQoICdmcmFnbWVudGVkJywgJ2VuYWJsZWQnICk7IGVsLnJlbW92ZUF0dHJpYnV0ZSggJ2Rpc2FibGVkJyApOyB9ICk7CgoJCQkvLyBBcHBseSBmcmFnbWVudCBkZWNvcmF0b3JzIHRvIGRpcmVjdGlvbmFsIGJ1dHRvbnMgYmFzZWQgb24KCQkJLy8gd2hhdCBzbGlkZSBheGlzIHRoZXkgYXJlIGluCgkJCWlmKCBpc1ZlcnRpY2FsU2xpZGUoIGN1cnJlbnRTbGlkZSApICkgewoJCQkJaWYoIGZyYWdtZW50cy5wcmV2ICkgZG9tLmNvbnRyb2xzVXAuZm9yRWFjaCggZnVuY3Rpb24oIGVsICkgeyBlbC5jbGFzc0xpc3QuYWRkKCAnZnJhZ21lbnRlZCcsICdlbmFibGVkJyApOyBlbC5yZW1vdmVBdHRyaWJ1dGUoICdkaXNhYmxlZCcgKTsgfSApOwoJCQkJaWYoIGZyYWdtZW50cy5uZXh0ICkgZG9tLmNvbnRyb2xzRG93bi5mb3JFYWNoKCBmdW5jdGlvbiggZWwgKSB7IGVsLmNsYXNzTGlzdC5hZGQoICdmcmFnbWVudGVkJywgJ2VuYWJsZWQnICk7IGVsLnJlbW92ZUF0dHJpYnV0ZSggJ2Rpc2FibGVkJyApOyB9ICk7CgkJCX0KCQkJZWxzZSB7CgkJCQlpZiggZnJhZ21lbnRzLnByZXYgKSBkb20uY29udHJvbHNMZWZ0LmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsgZWwuY2xhc3NMaXN0LmFkZCggJ2ZyYWdtZW50ZWQnLCAnZW5hYmxlZCcgKTsgZWwucmVtb3ZlQXR0cmlidXRlKCAnZGlzYWJsZWQnICk7IH0gKTsKCQkJCWlmKCBmcmFnbWVudHMubmV4dCApIGRvbS5jb250cm9sc1JpZ2h0LmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsgZWwuY2xhc3NMaXN0LmFkZCggJ2ZyYWdtZW50ZWQnLCAnZW5hYmxlZCcgKTsgZWwucmVtb3ZlQXR0cmlidXRlKCAnZGlzYWJsZWQnICk7IH0gKTsKCQkJfQoKCQl9CgoJCWlmKCBjb25maWcuY29udHJvbHNUdXRvcmlhbCApIHsKCgkJCS8vIEhpZ2hsaWdodCBjb250cm9sIGFycm93cyB3aXRoIGFuIGFuaW1hdGlvbiB0byBlbnN1cmUKCQkJLy8gdGhhdCB0aGUgdmlld2VyIGtub3dzIGhvdyB0byBuYXZpZ2F0ZQoJCQlpZiggIWhhc05hdmlnYXRlZERvd24gJiYgcm91dGVzLmRvd24gKSB7CgkJCQlkb20uY29udHJvbHNEb3duQXJyb3cuY2xhc3NMaXN0LmFkZCggJ2hpZ2hsaWdodCcgKTsKCQkJfQoJCQllbHNlIHsKCQkJCWRvbS5jb250cm9sc0Rvd25BcnJvdy5jbGFzc0xpc3QucmVtb3ZlKCAnaGlnaGxpZ2h0JyApOwoKCQkJCWlmKCAhaGFzTmF2aWdhdGVkUmlnaHQgJiYgcm91dGVzLnJpZ2h0ICYmIGluZGV4diA9PT0gMCApIHsKCQkJCQlkb20uY29udHJvbHNSaWdodEFycm93LmNsYXNzTGlzdC5hZGQoICdoaWdobGlnaHQnICk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlkb20uY29udHJvbHNSaWdodEFycm93LmNsYXNzTGlzdC5yZW1vdmUoICdoaWdobGlnaHQnICk7CgkJCQl9CgkJCX0KCgkJfQoKCX0KCgkvKioKCSAqIFVwZGF0ZXMgdGhlIGJhY2tncm91bmQgZWxlbWVudHMgdG8gcmVmbGVjdCB0aGUgY3VycmVudAoJICogc2xpZGUuCgkgKgoJICogQHBhcmFtIHtib29sZWFufSBpbmNsdWRlQWxsIElmIHRydWUsIHRoZSBiYWNrZ3JvdW5kcyBvZgoJICogYWxsIHZlcnRpY2FsIHNsaWRlcyAobm90IGp1c3QgdGhlIHByZXNlbnQpIHdpbGwgYmUgdXBkYXRlZC4KCSAqLwoJZnVuY3Rpb24gdXBkYXRlQmFja2dyb3VuZCggaW5jbHVkZUFsbCApIHsKCgkJdmFyIGN1cnJlbnRCYWNrZ3JvdW5kID0gbnVsbDsKCgkJLy8gUmV2ZXJzZSBwYXN0L2Z1dHVyZSBjbGFzc2VzIHdoZW4gaW4gUlRMIG1vZGUKCQl2YXIgaG9yaXpvbnRhbFBhc3QgPSBjb25maWcucnRsID8gJ2Z1dHVyZScgOiAncGFzdCcsCgkJCWhvcml6b250YWxGdXR1cmUgPSBjb25maWcucnRsID8gJ3Bhc3QnIDogJ2Z1dHVyZSc7CgoJCS8vIFVwZGF0ZSB0aGUgY2xhc3NlcyBvZiBhbGwgYmFja2dyb3VuZHMgdG8gbWF0Y2ggdGhlCgkJLy8gc3RhdGVzIG9mIHRoZWlyIHNsaWRlcyAocGFzdC9wcmVzZW50L2Z1dHVyZSkKCQl0b0FycmF5KCBkb20uYmFja2dyb3VuZC5jaGlsZE5vZGVzICkuZm9yRWFjaCggZnVuY3Rpb24oIGJhY2tncm91bmRoLCBoICkgewoKCQkJYmFja2dyb3VuZGguY2xhc3NMaXN0LnJlbW92ZSggJ3Bhc3QnICk7CgkJCWJhY2tncm91bmRoLmNsYXNzTGlzdC5yZW1vdmUoICdwcmVzZW50JyApOwoJCQliYWNrZ3JvdW5kaC5jbGFzc0xpc3QucmVtb3ZlKCAnZnV0dXJlJyApOwoKCQkJaWYoIGggPCBpbmRleGggKSB7CgkJCQliYWNrZ3JvdW5kaC5jbGFzc0xpc3QuYWRkKCBob3Jpem9udGFsUGFzdCApOwoJCQl9CgkJCWVsc2UgaWYgKCBoID4gaW5kZXhoICkgewoJCQkJYmFja2dyb3VuZGguY2xhc3NMaXN0LmFkZCggaG9yaXpvbnRhbEZ1dHVyZSApOwoJCQl9CgkJCWVsc2UgewoJCQkJYmFja2dyb3VuZGguY2xhc3NMaXN0LmFkZCggJ3ByZXNlbnQnICk7CgoJCQkJLy8gU3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYmFja2dyb3VuZCBlbGVtZW50CgkJCQljdXJyZW50QmFja2dyb3VuZCA9IGJhY2tncm91bmRoOwoJCQl9CgoJCQlpZiggaW5jbHVkZUFsbCB8fCBoID09PSBpbmRleGggKSB7CgkJCQl0b0FycmF5KCBiYWNrZ3JvdW5kaC5xdWVyeVNlbGVjdG9yQWxsKCAnLnNsaWRlLWJhY2tncm91bmQnICkgKS5mb3JFYWNoKCBmdW5jdGlvbiggYmFja2dyb3VuZHYsIHYgKSB7CgoJCQkJCWJhY2tncm91bmR2LmNsYXNzTGlzdC5yZW1vdmUoICdwYXN0JyApOwoJCQkJCWJhY2tncm91bmR2LmNsYXNzTGlzdC5yZW1vdmUoICdwcmVzZW50JyApOwoJCQkJCWJhY2tncm91bmR2LmNsYXNzTGlzdC5yZW1vdmUoICdmdXR1cmUnICk7CgoJCQkJCWlmKCB2IDwgaW5kZXh2ICkgewoJCQkJCQliYWNrZ3JvdW5kdi5jbGFzc0xpc3QuYWRkKCAncGFzdCcgKTsKCQkJCQl9CgkJCQkJZWxzZSBpZiAoIHYgPiBpbmRleHYgKSB7CgkJCQkJCWJhY2tncm91bmR2LmNsYXNzTGlzdC5hZGQoICdmdXR1cmUnICk7CgkJCQkJfQoJCQkJCWVsc2UgewoJCQkJCQliYWNrZ3JvdW5kdi5jbGFzc0xpc3QuYWRkKCAncHJlc2VudCcgKTsKCgkJCQkJCS8vIE9ubHkgaWYgdGhpcyBpcyB0aGUgcHJlc2VudCBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBzbGlkZQoJCQkJCQlpZiggaCA9PT0gaW5kZXhoICkgY3VycmVudEJhY2tncm91bmQgPSBiYWNrZ3JvdW5kdjsKCQkJCQl9CgoJCQkJfSApOwoJCQl9CgoJCX0gKTsKCgkJLy8gU3RvcCBjb250ZW50IGluc2lkZSBvZiBwcmV2aW91cyBiYWNrZ3JvdW5kcwoJCWlmKCBwcmV2aW91c0JhY2tncm91bmQgKSB7CgoJCQlzdG9wRW1iZWRkZWRDb250ZW50KCBwcmV2aW91c0JhY2tncm91bmQsIHsgdW5sb2FkSWZyYW1lczogIXNob3VsZFByZWxvYWQoIHByZXZpb3VzQmFja2dyb3VuZCApIH0gKTsKCgkJfQoKCQkvLyBTdGFydCBjb250ZW50IGluIHRoZSBjdXJyZW50IGJhY2tncm91bmQKCQlpZiggY3VycmVudEJhY2tncm91bmQgKSB7CgoJCQlzdGFydEVtYmVkZGVkQ29udGVudCggY3VycmVudEJhY2tncm91bmQgKTsKCgkJCXZhciBjdXJyZW50QmFja2dyb3VuZENvbnRlbnQgPSBjdXJyZW50QmFja2dyb3VuZC5xdWVyeVNlbGVjdG9yKCAnLnNsaWRlLWJhY2tncm91bmQtY29udGVudCcgKTsKCQkJaWYoIGN1cnJlbnRCYWNrZ3JvdW5kQ29udGVudCApIHsKCgkJCQl2YXIgYmFja2dyb3VuZEltYWdlVVJMID0gY3VycmVudEJhY2tncm91bmRDb250ZW50LnN0eWxlLmJhY2tncm91bmRJbWFnZSB8fCAnJzsKCgkJCQkvLyBSZXN0YXJ0IEdJRnMgKGRvZXNuJ3Qgd29yayBpbiBGaXJlZm94KQoJCQkJaWYoIC9cLmdpZi9pLnRlc3QoIGJhY2tncm91bmRJbWFnZVVSTCApICkgewoJCQkJCWN1cnJlbnRCYWNrZ3JvdW5kQ29udGVudC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAnJzsKCQkJCQl3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggY3VycmVudEJhY2tncm91bmRDb250ZW50ICkub3BhY2l0eTsKCQkJCQljdXJyZW50QmFja2dyb3VuZENvbnRlbnQuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYmFja2dyb3VuZEltYWdlVVJMOwoJCQkJfQoKCQkJfQoKCQkJLy8gRG9uJ3QgdHJhbnNpdGlvbiBiZXR3ZWVuIGlkZW50aWNhbCBiYWNrZ3JvdW5kcy4gVGhpcwoJCQkvLyBwcmV2ZW50cyB1bndhbnRlZCBmbGlja2VyLgoJCQl2YXIgcHJldmlvdXNCYWNrZ3JvdW5kSGFzaCA9IHByZXZpb3VzQmFja2dyb3VuZCA/IHByZXZpb3VzQmFja2dyb3VuZC5nZXRBdHRyaWJ1dGUoICdkYXRhLWJhY2tncm91bmQtaGFzaCcgKSA6IG51bGw7CgkJCXZhciBjdXJyZW50QmFja2dyb3VuZEhhc2ggPSBjdXJyZW50QmFja2dyb3VuZC5nZXRBdHRyaWJ1dGUoICdkYXRhLWJhY2tncm91bmQtaGFzaCcgKTsKCQkJaWYoIGN1cnJlbnRCYWNrZ3JvdW5kSGFzaCAmJiBjdXJyZW50QmFja2dyb3VuZEhhc2ggPT09IHByZXZpb3VzQmFja2dyb3VuZEhhc2ggJiYgY3VycmVudEJhY2tncm91bmQgIT09IHByZXZpb3VzQmFja2dyb3VuZCApIHsKCQkJCWRvbS5iYWNrZ3JvdW5kLmNsYXNzTGlzdC5hZGQoICduby10cmFuc2l0aW9uJyApOwoJCQl9CgoJCQlwcmV2aW91c0JhY2tncm91bmQgPSBjdXJyZW50QmFja2dyb3VuZDsKCgkJfQoKCQkvLyBJZiB0aGVyZSdzIGEgYmFja2dyb3VuZCBicmlnaHRuZXNzIGZsYWcgZm9yIHRoaXMgc2xpZGUsCgkJLy8gYnViYmxlIGl0IHRvIHRoZSAucmV2ZWFsIGNvbnRhaW5lcgoJCWlmKCBjdXJyZW50U2xpZGUgKSB7CgkJCVsgJ2hhcy1saWdodC1iYWNrZ3JvdW5kJywgJ2hhcy1kYXJrLWJhY2tncm91bmQnIF0uZm9yRWFjaCggZnVuY3Rpb24oIGNsYXNzVG9CdWJibGUgKSB7CgkJCQlpZiggY3VycmVudFNsaWRlLmNsYXNzTGlzdC5jb250YWlucyggY2xhc3NUb0J1YmJsZSApICkgewoJCQkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5hZGQoIGNsYXNzVG9CdWJibGUgKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoIGNsYXNzVG9CdWJibGUgKTsKCQkJCX0KCQkJfSApOwoJCX0KCgkJLy8gQWxsb3cgdGhlIGZpcnN0IGJhY2tncm91bmQgdG8gYXBwbHkgd2l0aG91dCB0cmFuc2l0aW9uCgkJc2V0VGltZW91dCggZnVuY3Rpb24oKSB7CgkJCWRvbS5iYWNrZ3JvdW5kLmNsYXNzTGlzdC5yZW1vdmUoICduby10cmFuc2l0aW9uJyApOwoJCX0sIDEgKTsKCgl9CgoJLyoqCgkgKiBVcGRhdGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgcGFyYWxsYXggYmFja2dyb3VuZCBiYXNlZAoJICogb24gdGhlIGN1cnJlbnQgc2xpZGUgaW5kZXguCgkgKi8KCWZ1bmN0aW9uIHVwZGF0ZVBhcmFsbGF4KCkgewoKCQlpZiggY29uZmlnLnBhcmFsbGF4QmFja2dyb3VuZEltYWdlICkgewoKCQkJdmFyIGhvcml6b250YWxTbGlkZXMgPSBkb20ud3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCBIT1JJWk9OVEFMX1NMSURFU19TRUxFQ1RPUiApLAoJCQkJdmVydGljYWxTbGlkZXMgPSBkb20ud3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCBWRVJUSUNBTF9TTElERVNfU0VMRUNUT1IgKTsKCgkJCXZhciBiYWNrZ3JvdW5kU2l6ZSA9IGRvbS5iYWNrZ3JvdW5kLnN0eWxlLmJhY2tncm91bmRTaXplLnNwbGl0KCAnICcgKSwKCQkJCWJhY2tncm91bmRXaWR0aCwgYmFja2dyb3VuZEhlaWdodDsKCgkJCWlmKCBiYWNrZ3JvdW5kU2l6ZS5sZW5ndGggPT09IDEgKSB7CgkJCQliYWNrZ3JvdW5kV2lkdGggPSBiYWNrZ3JvdW5kSGVpZ2h0ID0gcGFyc2VJbnQoIGJhY2tncm91bmRTaXplWzBdLCAxMCApOwoJCQl9CgkJCWVsc2UgewoJCQkJYmFja2dyb3VuZFdpZHRoID0gcGFyc2VJbnQoIGJhY2tncm91bmRTaXplWzBdLCAxMCApOwoJCQkJYmFja2dyb3VuZEhlaWdodCA9IHBhcnNlSW50KCBiYWNrZ3JvdW5kU2l6ZVsxXSwgMTAgKTsKCQkJfQoKCQkJdmFyIHNsaWRlV2lkdGggPSBkb20uYmFja2dyb3VuZC5vZmZzZXRXaWR0aCwKCQkJCWhvcml6b250YWxTbGlkZUNvdW50ID0gaG9yaXpvbnRhbFNsaWRlcy5sZW5ndGgsCgkJCQlob3Jpem9udGFsT2Zmc2V0TXVsdGlwbGllciwKCQkJCWhvcml6b250YWxPZmZzZXQ7CgoJCQlpZiggdHlwZW9mIGNvbmZpZy5wYXJhbGxheEJhY2tncm91bmRIb3Jpem9udGFsID09PSAnbnVtYmVyJyApIHsKCQkJCWhvcml6b250YWxPZmZzZXRNdWx0aXBsaWVyID0gY29uZmlnLnBhcmFsbGF4QmFja2dyb3VuZEhvcml6b250YWw7CgkJCX0KCQkJZWxzZSB7CgkJCQlob3Jpem9udGFsT2Zmc2V0TXVsdGlwbGllciA9IGhvcml6b250YWxTbGlkZUNvdW50ID4gMSA/ICggYmFja2dyb3VuZFdpZHRoIC0gc2xpZGVXaWR0aCApIC8gKCBob3Jpem9udGFsU2xpZGVDb3VudC0xICkgOiAwOwoJCQl9CgoJCQlob3Jpem9udGFsT2Zmc2V0ID0gaG9yaXpvbnRhbE9mZnNldE11bHRpcGxpZXIgKiBpbmRleGggKiAtMTsKCgkJCXZhciBzbGlkZUhlaWdodCA9IGRvbS5iYWNrZ3JvdW5kLm9mZnNldEhlaWdodCwKCQkJCXZlcnRpY2FsU2xpZGVDb3VudCA9IHZlcnRpY2FsU2xpZGVzLmxlbmd0aCwKCQkJCXZlcnRpY2FsT2Zmc2V0TXVsdGlwbGllciwKCQkJCXZlcnRpY2FsT2Zmc2V0OwoKCQkJaWYoIHR5cGVvZiBjb25maWcucGFyYWxsYXhCYWNrZ3JvdW5kVmVydGljYWwgPT09ICdudW1iZXInICkgewoJCQkJdmVydGljYWxPZmZzZXRNdWx0aXBsaWVyID0gY29uZmlnLnBhcmFsbGF4QmFja2dyb3VuZFZlcnRpY2FsOwoJCQl9CgkJCWVsc2UgewoJCQkJdmVydGljYWxPZmZzZXRNdWx0aXBsaWVyID0gKCBiYWNrZ3JvdW5kSGVpZ2h0IC0gc2xpZGVIZWlnaHQgKSAvICggdmVydGljYWxTbGlkZUNvdW50LTEgKTsKCQkJfQoKCQkJdmVydGljYWxPZmZzZXQgPSB2ZXJ0aWNhbFNsaWRlQ291bnQgPiAwID8gIHZlcnRpY2FsT2Zmc2V0TXVsdGlwbGllciAqIGluZGV4diA6IDA7CgoJCQlkb20uYmFja2dyb3VuZC5zdHlsZS5iYWNrZ3JvdW5kUG9zaXRpb24gPSBob3Jpem9udGFsT2Zmc2V0ICsgJ3B4ICcgKyAtdmVydGljYWxPZmZzZXQgKyAncHgnOwoKCQl9CgoJfQoKCS8qKgoJICogU2hvdWxkIHRoZSBnaXZlbiBlbGVtZW50IGJlIHByZWxvYWRlZD8KCSAqIERlY2lkZXMgYmFzZWQgb24gbG9jYWwgZWxlbWVudCBhdHRyaWJ1dGVzIGFuZCBnbG9iYWwgY29uZmlnLgoJICoKCSAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQKCSAqLwoJZnVuY3Rpb24gc2hvdWxkUHJlbG9hZCggZWxlbWVudCApIHsKCgkJLy8gUHJlZmVyIGFuIGV4cGxpY2l0IGdsb2JhbCBwcmVsb2FkIHNldHRpbmcKCQl2YXIgcHJlbG9hZCA9IGNvbmZpZy5wcmVsb2FkSWZyYW1lczsKCgkJLy8gSWYgbm8gZ2xvYmFsIHNldHRpbmcgaXMgYXZhaWxhYmxlLCBmYWxsIGJhY2sgb24gdGhlIGVsZW1lbnQncwoJCS8vIG93biBwcmVsb2FkIHNldHRpbmcKCQlpZiggdHlwZW9mIHByZWxvYWQgIT09ICdib29sZWFuJyApIHsKCQkJcHJlbG9hZCA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKCAnZGF0YS1wcmVsb2FkJyApOwoJCX0KCgkJcmV0dXJuIHByZWxvYWQ7Cgl9CgoJLyoqCgkgKiBDYWxsZWQgd2hlbiB0aGUgZ2l2ZW4gc2xpZGUgaXMgd2l0aGluIHRoZSBjb25maWd1cmVkIHZpZXcKCSAqIGRpc3RhbmNlLiBTaG93cyB0aGUgc2xpZGUgZWxlbWVudCBhbmQgbG9hZHMgYW55IGNvbnRlbnQKCSAqIHRoYXQgaXMgc2V0IHRvIGxvYWQgbGF6aWx5IChkYXRhLXNyYykuCgkgKgoJICogQHBhcmFtIHtIVE1MRWxlbWVudH0gc2xpZGUgU2xpZGUgdG8gc2hvdwoJICovCglmdW5jdGlvbiBsb2FkU2xpZGUoIHNsaWRlLCBvcHRpb25zICkgewoKCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCgkJLy8gU2hvdyB0aGUgc2xpZGUgZWxlbWVudAoJCXNsaWRlLnN0eWxlLmRpc3BsYXkgPSBjb25maWcuZGlzcGxheTsKCgkJLy8gTWVkaWEgZWxlbWVudHMgd2l0aCBkYXRhLXNyYyBhdHRyaWJ1dGVzCgkJdG9BcnJheSggc2xpZGUucXVlcnlTZWxlY3RvckFsbCggJ2ltZ1tkYXRhLXNyY10sIHZpZGVvW2RhdGEtc3JjXSwgYXVkaW9bZGF0YS1zcmNdLCBpZnJhbWVbZGF0YS1zcmNdJyApICkuZm9yRWFjaCggZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJCWlmKCBlbGVtZW50LnRhZ05hbWUgIT09ICdJRlJBTUUnIHx8IHNob3VsZFByZWxvYWQoIGVsZW1lbnQgKSApIHsKCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCAnc3JjJywgZWxlbWVudC5nZXRBdHRyaWJ1dGUoICdkYXRhLXNyYycgKSApOwoJCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoICdkYXRhLWxhenktbG9hZGVkJywgJycgKTsKCQkJCWVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCAnZGF0YS1zcmMnICk7CgkJCX0KCQl9ICk7CgoJCS8vIE1lZGlhIGVsZW1lbnRzIHdpdGggPHNvdXJjZT4gY2hpbGRyZW4KCQl0b0FycmF5KCBzbGlkZS5xdWVyeVNlbGVjdG9yQWxsKCAndmlkZW8sIGF1ZGlvJyApICkuZm9yRWFjaCggZnVuY3Rpb24oIG1lZGlhICkgewoJCQl2YXIgc291cmNlcyA9IDA7CgoJCQl0b0FycmF5KCBtZWRpYS5xdWVyeVNlbGVjdG9yQWxsKCAnc291cmNlW2RhdGEtc3JjXScgKSApLmZvckVhY2goIGZ1bmN0aW9uKCBzb3VyY2UgKSB7CgkJCQlzb3VyY2Uuc2V0QXR0cmlidXRlKCAnc3JjJywgc291cmNlLmdldEF0dHJpYnV0ZSggJ2RhdGEtc3JjJyApICk7CgkJCQlzb3VyY2UucmVtb3ZlQXR0cmlidXRlKCAnZGF0YS1zcmMnICk7CgkJCQlzb3VyY2Uuc2V0QXR0cmlidXRlKCAnZGF0YS1sYXp5LWxvYWRlZCcsICcnICk7CgkJCQlzb3VyY2VzICs9IDE7CgkJCX0gKTsKCgkJCS8vIElmIHdlIHJld3JvdGUgc291cmNlcyBmb3IgdGhpcyB2aWRlby9hdWRpbyBlbGVtZW50LCB3ZSBuZWVkCgkJCS8vIHRvIG1hbnVhbGx5IHRlbGwgaXQgdG8gbG9hZCBmcm9tIGl0cyBuZXcgb3JpZ2luCgkJCWlmKCBzb3VyY2VzID4gMCApIHsKCQkJCW1lZGlhLmxvYWQoKTsKCQkJfQoJCX0gKTsKCgoJCS8vIFNob3cgdGhlIGNvcnJlc3BvbmRpbmcgYmFja2dyb3VuZCBlbGVtZW50CgkJdmFyIGJhY2tncm91bmQgPSBzbGlkZS5zbGlkZUJhY2tncm91bmRFbGVtZW50OwoJCWlmKCBiYWNrZ3JvdW5kICkgewoJCQliYWNrZ3JvdW5kLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwoKCQkJdmFyIGJhY2tncm91bmRDb250ZW50ID0gc2xpZGUuc2xpZGVCYWNrZ3JvdW5kQ29udGVudEVsZW1lbnQ7CgkJCXZhciBiYWNrZ3JvdW5kSWZyYW1lID0gc2xpZGUuZ2V0QXR0cmlidXRlKCAnZGF0YS1iYWNrZ3JvdW5kLWlmcmFtZScgKTsKCgkJCS8vIElmIHRoZSBiYWNrZ3JvdW5kIGNvbnRhaW5zIG1lZGlhLCBsb2FkIGl0CgkJCWlmKCBiYWNrZ3JvdW5kLmhhc0F0dHJpYnV0ZSggJ2RhdGEtbG9hZGVkJyApID09PSBmYWxzZSApIHsKCQkJCWJhY2tncm91bmQuc2V0QXR0cmlidXRlKCAnZGF0YS1sb2FkZWQnLCAndHJ1ZScgKTsKCgkJCQl2YXIgYmFja2dyb3VuZEltYWdlID0gc2xpZGUuZ2V0QXR0cmlidXRlKCAnZGF0YS1iYWNrZ3JvdW5kLWltYWdlJyApLAoJCQkJCWJhY2tncm91bmRWaWRlbyA9IHNsaWRlLmdldEF0dHJpYnV0ZSggJ2RhdGEtYmFja2dyb3VuZC12aWRlbycgKSwKCQkJCQliYWNrZ3JvdW5kVmlkZW9Mb29wID0gc2xpZGUuaGFzQXR0cmlidXRlKCAnZGF0YS1iYWNrZ3JvdW5kLXZpZGVvLWxvb3AnICksCgkJCQkJYmFja2dyb3VuZFZpZGVvTXV0ZWQgPSBzbGlkZS5oYXNBdHRyaWJ1dGUoICdkYXRhLWJhY2tncm91bmQtdmlkZW8tbXV0ZWQnICk7CgoJCQkJLy8gSW1hZ2VzCgkJCQlpZiggYmFja2dyb3VuZEltYWdlICkgewoJCQkJCWJhY2tncm91bmRDb250ZW50LnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICd1cmwoJysgZW5jb2RlVVJJKCBiYWNrZ3JvdW5kSW1hZ2UgKSArJyknOwoJCQkJfQoJCQkJLy8gVmlkZW9zCgkJCQllbHNlIGlmICggYmFja2dyb3VuZFZpZGVvICYmICFpc1NwZWFrZXJOb3RlcygpICkgewoJCQkJCXZhciB2aWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICd2aWRlbycgKTsKCgkJCQkJaWYoIGJhY2tncm91bmRWaWRlb0xvb3AgKSB7CgkJCQkJCXZpZGVvLnNldEF0dHJpYnV0ZSggJ2xvb3AnLCAnJyApOwoJCQkJCX0KCgkJCQkJaWYoIGJhY2tncm91bmRWaWRlb011dGVkICkgewoJCQkJCQl2aWRlby5tdXRlZCA9IHRydWU7CgkJCQkJfQoKCQkJCQkvLyBJbmxpbmUgdmlkZW8gcGxheWJhY2sgd29ya3MgKGF0IGxlYXN0IGluIE1vYmlsZSBTYWZhcmkpIGFzCgkJCQkJLy8gbG9uZyBhcyB0aGUgdmlkZW8gaXMgbXV0ZWQgYW5kIHRoZSBgcGxheXNpbmxpbmVgIGF0dHJpYnV0ZSBpcwoJCQkJCS8vIHByZXNlbnQKCQkJCQlpZiggaXNNb2JpbGVEZXZpY2UgKSB7CgkJCQkJCXZpZGVvLm11dGVkID0gdHJ1ZTsKCQkJCQkJdmlkZW8uYXV0b3BsYXkgPSB0cnVlOwoJCQkJCQl2aWRlby5zZXRBdHRyaWJ1dGUoICdwbGF5c2lubGluZScsICcnICk7CgkJCQkJfQoKCQkJCQkvLyBTdXBwb3J0IGNvbW1hIHNlcGFyYXRlZCBsaXN0cyBvZiB2aWRlbyBzb3VyY2VzCgkJCQkJYmFja2dyb3VuZFZpZGVvLnNwbGl0KCAnLCcgKS5mb3JFYWNoKCBmdW5jdGlvbiggc291cmNlICkgewoJCQkJCQl2aWRlby5pbm5lckhUTUwgKz0gJzxzb3VyY2Ugc3JjPSInKyBzb3VyY2UgKyciPic7CgkJCQkJfSApOwoKCQkJCQliYWNrZ3JvdW5kQ29udGVudC5hcHBlbmRDaGlsZCggdmlkZW8gKTsKCQkJCX0KCQkJCS8vIElmcmFtZXMKCQkJCWVsc2UgaWYoIGJhY2tncm91bmRJZnJhbWUgJiYgb3B0aW9ucy5leGNsdWRlSWZyYW1lcyAhPT0gdHJ1ZSApIHsKCQkJCQl2YXIgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2lmcmFtZScgKTsKCQkJCQlpZnJhbWUuc2V0QXR0cmlidXRlKCAnYWxsb3dmdWxsc2NyZWVuJywgJycgKTsKCQkJCQlpZnJhbWUuc2V0QXR0cmlidXRlKCAnbW96YWxsb3dmdWxsc2NyZWVuJywgJycgKTsKCQkJCQlpZnJhbWUuc2V0QXR0cmlidXRlKCAnd2Via2l0YWxsb3dmdWxsc2NyZWVuJywgJycgKTsKCgkJCQkJaWZyYW1lLnNldEF0dHJpYnV0ZSggJ2RhdGEtc3JjJywgYmFja2dyb3VuZElmcmFtZSApOwoKCQkJCQlpZnJhbWUuc3R5bGUud2lkdGggID0gJzEwMCUnOwoJCQkJCWlmcmFtZS5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7CgkJCQkJaWZyYW1lLnN0eWxlLm1heEhlaWdodCA9ICcxMDAlJzsKCQkJCQlpZnJhbWUuc3R5bGUubWF4V2lkdGggPSAnMTAwJSc7CgoJCQkJCWJhY2tncm91bmRDb250ZW50LmFwcGVuZENoaWxkKCBpZnJhbWUgKTsKCQkJCX0KCQkJfQoKCQkJLy8gU3RhcnQgbG9hZGluZyBwcmVsb2FkYWJsZSBpZnJhbWVzCgkJCXZhciBiYWNrZ3JvdW5kSWZyYW1lRWxlbWVudCA9IGJhY2tncm91bmRDb250ZW50LnF1ZXJ5U2VsZWN0b3IoICdpZnJhbWVbZGF0YS1zcmNdJyApOwoJCQlpZiggYmFja2dyb3VuZElmcmFtZUVsZW1lbnQgKSB7CgoJCQkJLy8gQ2hlY2sgaWYgdGhpcyBpZnJhbWUgaXMgZWxpZ2libGUgdG8gYmUgcHJlbG9hZGVkCgkJCQlpZiggc2hvdWxkUHJlbG9hZCggYmFja2dyb3VuZCApICYmICEvYXV0b3BsYXk9KDF8dHJ1ZXx5ZXMpL2dpLnRlc3QoIGJhY2tncm91bmRJZnJhbWUgKSApIHsKCQkJCQlpZiggYmFja2dyb3VuZElmcmFtZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCAnc3JjJyApICE9PSBiYWNrZ3JvdW5kSWZyYW1lICkgewoJCQkJCQliYWNrZ3JvdW5kSWZyYW1lRWxlbWVudC5zZXRBdHRyaWJ1dGUoICdzcmMnLCBiYWNrZ3JvdW5kSWZyYW1lICk7CgkJCQkJfQoJCQkJfQoKCQkJfQoKCQl9CgoJfQoKCS8qKgoJICogVW5sb2FkcyBhbmQgaGlkZXMgdGhlIGdpdmVuIHNsaWRlLiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZQoJICogc2xpZGUgaXMgbW92ZWQgb3V0c2lkZSBvZiB0aGUgY29uZmlndXJlZCB2aWV3IGRpc3RhbmNlLgoJICoKCSAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHNsaWRlCgkgKi8KCWZ1bmN0aW9uIHVubG9hZFNsaWRlKCBzbGlkZSApIHsKCgkJLy8gSGlkZSB0aGUgc2xpZGUgZWxlbWVudAoJCXNsaWRlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CgoJCS8vIEhpZGUgdGhlIGNvcnJlc3BvbmRpbmcgYmFja2dyb3VuZCBlbGVtZW50CgkJdmFyIGJhY2tncm91bmQgPSBnZXRTbGlkZUJhY2tncm91bmQoIHNsaWRlICk7CgkJaWYoIGJhY2tncm91bmQgKSB7CgkJCWJhY2tncm91bmQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKCgkJCS8vIFVubG9hZCBhbnkgYmFja2dyb3VuZCBpZnJhbWVzCgkJCXRvQXJyYXkoIGJhY2tncm91bmQucXVlcnlTZWxlY3RvckFsbCggJ2lmcmFtZVtzcmNdJyApICkuZm9yRWFjaCggZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSggJ3NyYycgKTsKCQkJfSApOwoJCX0KCgkJLy8gUmVzZXQgbGF6eS1sb2FkZWQgbWVkaWEgZWxlbWVudHMgd2l0aCBzcmMgYXR0cmlidXRlcwoJCXRvQXJyYXkoIHNsaWRlLnF1ZXJ5U2VsZWN0b3JBbGwoICd2aWRlb1tkYXRhLWxhenktbG9hZGVkXVtzcmNdLCBhdWRpb1tkYXRhLWxhenktbG9hZGVkXVtzcmNdLCBpZnJhbWVbZGF0YS1sYXp5LWxvYWRlZF1bc3JjXScgKSApLmZvckVhY2goIGZ1bmN0aW9uKCBlbGVtZW50ICkgewoJCQllbGVtZW50LnNldEF0dHJpYnV0ZSggJ2RhdGEtc3JjJywgZWxlbWVudC5nZXRBdHRyaWJ1dGUoICdzcmMnICkgKTsKCQkJZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoICdzcmMnICk7CgkJfSApOwoKCQkvLyBSZXNldCBsYXp5LWxvYWRlZCBtZWRpYSBlbGVtZW50cyB3aXRoIDxzb3VyY2U+IGNoaWxkcmVuCgkJdG9BcnJheSggc2xpZGUucXVlcnlTZWxlY3RvckFsbCggJ3ZpZGVvW2RhdGEtbGF6eS1sb2FkZWRdIHNvdXJjZVtzcmNdLCBhdWRpbyBzb3VyY2Vbc3JjXScgKSApLmZvckVhY2goIGZ1bmN0aW9uKCBzb3VyY2UgKSB7CgkJCXNvdXJjZS5zZXRBdHRyaWJ1dGUoICdkYXRhLXNyYycsIHNvdXJjZS5nZXRBdHRyaWJ1dGUoICdzcmMnICkgKTsKCQkJc291cmNlLnJlbW92ZUF0dHJpYnV0ZSggJ3NyYycgKTsKCQl9ICk7CgoJfQoKCS8qKgoJICogRGV0ZXJtaW5lIHdoYXQgYXZhaWxhYmxlIHJvdXRlcyB0aGVyZSBhcmUgZm9yIG5hdmlnYXRpb24uCgkgKgoJICogQHJldHVybiB7e2xlZnQ6IGJvb2xlYW4sIHJpZ2h0OiBib29sZWFuLCB1cDogYm9vbGVhbiwgZG93bjogYm9vbGVhbn19CgkgKi8KCWZ1bmN0aW9uIGF2YWlsYWJsZVJvdXRlcygpIHsKCgkJdmFyIGhvcml6b250YWxTbGlkZXMgPSBkb20ud3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCBIT1JJWk9OVEFMX1NMSURFU19TRUxFQ1RPUiApLAoJCQl2ZXJ0aWNhbFNsaWRlcyA9IGRvbS53cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoIFZFUlRJQ0FMX1NMSURFU19TRUxFQ1RPUiApOwoKCQl2YXIgcm91dGVzID0gewoJCQlsZWZ0OiBpbmRleGggPiAwLAoJCQlyaWdodDogaW5kZXhoIDwgaG9yaXpvbnRhbFNsaWRlcy5sZW5ndGggLSAxLAoJCQl1cDogaW5kZXh2ID4gMCwKCQkJZG93bjogaW5kZXh2IDwgdmVydGljYWxTbGlkZXMubGVuZ3RoIC0gMQoJCX07CgoJCS8vIExvb3BlZCBwcmVzZW50YXRpb25zIGNhbiBhbHdheXMgYmUgbmF2aWdhdGVkIGFzIGxvbmcgYXMKCQkvLyB0aGVyZSBhcmUgc2xpZGVzIGF2YWlsYWJsZQoJCWlmKCBjb25maWcubG9vcCApIHsKCQkJaWYoIGhvcml6b250YWxTbGlkZXMubGVuZ3RoID4gMSApIHsKCQkJCXJvdXRlcy5sZWZ0ID0gdHJ1ZTsKCQkJCXJvdXRlcy5yaWdodCA9IHRydWU7CgkJCX0KCgkJCWlmKCB2ZXJ0aWNhbFNsaWRlcy5sZW5ndGggPiAxICkgewoJCQkJcm91dGVzLnVwID0gdHJ1ZTsKCQkJCXJvdXRlcy5kb3duID0gdHJ1ZTsKCQkJfQoJCX0KCgkJLy8gUmV2ZXJzZSBob3Jpem9udGFsIGNvbnRyb2xzIGZvciBydGwKCQlpZiggY29uZmlnLnJ0bCApIHsKCQkJdmFyIGxlZnQgPSByb3V0ZXMubGVmdDsKCQkJcm91dGVzLmxlZnQgPSByb3V0ZXMucmlnaHQ7CgkJCXJvdXRlcy5yaWdodCA9IGxlZnQ7CgkJfQoKCQlyZXR1cm4gcm91dGVzOwoKCX0KCgkvKioKCSAqIFJldHVybnMgYW4gb2JqZWN0IGRlc2NyaWJpbmcgdGhlIGF2YWlsYWJsZSBmcmFnbWVudAoJICogZGlyZWN0aW9ucy4KCSAqCgkgKiBAcmV0dXJuIHt7cHJldjogYm9vbGVhbiwgbmV4dDogYm9vbGVhbn19CgkgKi8KCWZ1bmN0aW9uIGF2YWlsYWJsZUZyYWdtZW50cygpIHsKCgkJaWYoIGN1cnJlbnRTbGlkZSAmJiBjb25maWcuZnJhZ21lbnRzICkgewoJCQl2YXIgZnJhZ21lbnRzID0gY3VycmVudFNsaWRlLnF1ZXJ5U2VsZWN0b3JBbGwoICcuZnJhZ21lbnQnICk7CgkJCXZhciBoaWRkZW5GcmFnbWVudHMgPSBjdXJyZW50U2xpZGUucXVlcnlTZWxlY3RvckFsbCggJy5mcmFnbWVudDpub3QoLnZpc2libGUpJyApOwoKCQkJcmV0dXJuIHsKCQkJCXByZXY6IGZyYWdtZW50cy5sZW5ndGggLSBoaWRkZW5GcmFnbWVudHMubGVuZ3RoID4gMCwKCQkJCW5leHQ6ICEhaGlkZGVuRnJhZ21lbnRzLmxlbmd0aAoJCQl9OwoJCX0KCQllbHNlIHsKCQkJcmV0dXJuIHsgcHJldjogZmFsc2UsIG5leHQ6IGZhbHNlIH07CgkJfQoKCX0KCgkvKioKCSAqIEVuZm9yY2VzIG9yaWdpbi1zcGVjaWZpYyBmb3JtYXQgcnVsZXMgZm9yIGVtYmVkZGVkIG1lZGlhLgoJICovCglmdW5jdGlvbiBmb3JtYXRFbWJlZGRlZENvbnRlbnQoKSB7CgoJCXZhciBfYXBwZW5kUGFyYW1Ub0lmcmFtZVNvdXJjZSA9IGZ1bmN0aW9uKCBzb3VyY2VBdHRyaWJ1dGUsIHNvdXJjZVVSTCwgcGFyYW0gKSB7CgkJCXRvQXJyYXkoIGRvbS5zbGlkZXMucXVlcnlTZWxlY3RvckFsbCggJ2lmcmFtZVsnKyBzb3VyY2VBdHRyaWJ1dGUgKycqPSInKyBzb3VyY2VVUkwgKyciXScgKSApLmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsKCQkJCXZhciBzcmMgPSBlbC5nZXRBdHRyaWJ1dGUoIHNvdXJjZUF0dHJpYnV0ZSApOwoJCQkJaWYoIHNyYyAmJiBzcmMuaW5kZXhPZiggcGFyYW0gKSA9PT0gLTEgKSB7CgkJCQkJZWwuc2V0QXR0cmlidXRlKCBzb3VyY2VBdHRyaWJ1dGUsIHNyYyArICggIS9cPy8udGVzdCggc3JjICkgPyAnPycgOiAnJicgKSArIHBhcmFtICk7CgkJCQl9CgkJCX0pOwoJCX07CgoJCS8vIFlvdVR1YmUgZnJhbWVzIG11c3QgaW5jbHVkZSAiP2VuYWJsZWpzYXBpPTEiCgkJX2FwcGVuZFBhcmFtVG9JZnJhbWVTb3VyY2UoICdzcmMnLCAneW91dHViZS5jb20vZW1iZWQvJywgJ2VuYWJsZWpzYXBpPTEnICk7CgkJX2FwcGVuZFBhcmFtVG9JZnJhbWVTb3VyY2UoICdkYXRhLXNyYycsICd5b3V0dWJlLmNvbS9lbWJlZC8nLCAnZW5hYmxlanNhcGk9MScgKTsKCgkJLy8gVmltZW8gZnJhbWVzIG11c3QgaW5jbHVkZSAiP2FwaT0xIgoJCV9hcHBlbmRQYXJhbVRvSWZyYW1lU291cmNlKCAnc3JjJywgJ3BsYXllci52aW1lby5jb20vJywgJ2FwaT0xJyApOwoJCV9hcHBlbmRQYXJhbVRvSWZyYW1lU291cmNlKCAnZGF0YS1zcmMnLCAncGxheWVyLnZpbWVvLmNvbS8nLCAnYXBpPTEnICk7CgoJfQoKCS8qKgoJICogU3RhcnQgcGxheWJhY2sgb2YgYW55IGVtYmVkZGVkIGNvbnRlbnQgaW5zaWRlIG9mCgkgKiB0aGUgZ2l2ZW4gZWxlbWVudC4KCSAqCgkgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50CgkgKi8KCWZ1bmN0aW9uIHN0YXJ0RW1iZWRkZWRDb250ZW50KCBlbGVtZW50ICkgewoKCQlpZiggZWxlbWVudCAmJiAhaXNTcGVha2VyTm90ZXMoKSApIHsKCgkJCS8vIFJlc3RhcnQgR0lGcwoJCQl0b0FycmF5KCBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICdpbWdbc3JjJD0iLmdpZiJdJyApICkuZm9yRWFjaCggZnVuY3Rpb24oIGVsICkgewoJCQkJLy8gU2V0dGluZyB0aGUgc2FtZSB1bmNoYW5nZWQgc291cmNlIGxpa2UgdGhpcyB3YXMgY29uZmlybWVkCgkJCQkvLyB0byB3b3JrIGluIENocm9tZSwgRkYgJiBTYWZhcmkKCQkJCWVsLnNldEF0dHJpYnV0ZSggJ3NyYycsIGVsLmdldEF0dHJpYnV0ZSggJ3NyYycgKSApOwoJCQl9ICk7CgoJCQkvLyBIVE1MNSBtZWRpYSBlbGVtZW50cwoJCQl0b0FycmF5KCBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICd2aWRlbywgYXVkaW8nICkgKS5mb3JFYWNoKCBmdW5jdGlvbiggZWwgKSB7CgkJCQlpZiggY2xvc2VzdFBhcmVudCggZWwsICcuZnJhZ21lbnQnICkgJiYgIWNsb3Nlc3RQYXJlbnQoIGVsLCAnLmZyYWdtZW50LnZpc2libGUnICkgKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoKCQkJCS8vIFByZWZlciBhbiBleHBsaWNpdCBnbG9iYWwgYXV0b3BsYXkgc2V0dGluZwoJCQkJdmFyIGF1dG9wbGF5ID0gY29uZmlnLmF1dG9QbGF5TWVkaWE7CgoJCQkJLy8gSWYgbm8gZ2xvYmFsIHNldHRpbmcgaXMgYXZhaWxhYmxlLCBmYWxsIGJhY2sgb24gdGhlIGVsZW1lbnQncwoJCQkJLy8gb3duIGF1dG9wbGF5IHNldHRpbmcKCQkJCWlmKCB0eXBlb2YgYXV0b3BsYXkgIT09ICdib29sZWFuJyApIHsKCQkJCQlhdXRvcGxheSA9IGVsLmhhc0F0dHJpYnV0ZSggJ2RhdGEtYXV0b3BsYXknICkgfHwgISFjbG9zZXN0UGFyZW50KCBlbCwgJy5zbGlkZS1iYWNrZ3JvdW5kJyApOwoJCQkJfQoKCQkJCWlmKCBhdXRvcGxheSAmJiB0eXBlb2YgZWwucGxheSA9PT0gJ2Z1bmN0aW9uJyApIHsKCgkJCQkJLy8gSWYgdGhlIG1lZGlhIGlzIHJlYWR5LCBzdGFydCBwbGF5YmFjawoJCQkJCWlmKCBlbC5yZWFkeVN0YXRlID4gMSApIHsKCQkJCQkJc3RhcnRFbWJlZGRlZE1lZGlhKCB7IHRhcmdldDogZWwgfSApOwoJCQkJCX0KCQkJCQkvLyBNb2JpbGUgZGV2aWNlcyBuZXZlciBmaXJlIGEgbG9hZGVkIGV2ZW50IHNvIGluc3RlYWQKCQkJCQkvLyBvZiB3YWl0aW5nLCB3ZSBpbml0aWF0ZSBwbGF5YmFjawoJCQkJCWVsc2UgaWYoIGlzTW9iaWxlRGV2aWNlICkgewoJCQkJCQl2YXIgcHJvbWlzZSA9IGVsLnBsYXkoKTsKCgkJCQkJCS8vIElmIGF1dG9wbGF5IGRvZXMgbm90IHdvcmssIGVuc3VyZSB0aGF0IHRoZSBjb250cm9scyBhcmUgdmlzaWJsZSBzbwoJCQkJCQkvLyB0aGF0IHRoZSB2aWV3ZXIgY2FuIHN0YXJ0IHRoZSBtZWRpYSBvbiB0aGVpciBvd24KCQkJCQkJaWYoIHByb21pc2UgJiYgdHlwZW9mIHByb21pc2UuY2F0Y2ggPT09ICdmdW5jdGlvbicgJiYgZWwuY29udHJvbHMgPT09IGZhbHNlICkgewoJCQkJCQkJcHJvbWlzZS5jYXRjaCggZnVuY3Rpb24oKSB7CgkJCQkJCQkJZWwuY29udHJvbHMgPSB0cnVlOwoKCQkJCQkJCQkvLyBPbmNlIHRoZSB2aWRlbyBkb2VzIHN0YXJ0IHBsYXlpbmcsIGhpZGUgdGhlIGNvbnRyb2xzIGFnYWluCgkJCQkJCQkJZWwuYWRkRXZlbnRMaXN0ZW5lciggJ3BsYXknLCBmdW5jdGlvbigpIHsKCQkJCQkJCQkJZWwuY29udHJvbHMgPSBmYWxzZTsKCQkJCQkJCQl9ICk7CgkJCQkJCQl9ICk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJLy8gSWYgdGhlIG1lZGlhIGlzbid0IGxvYWRlZCwgd2FpdCBiZWZvcmUgcGxheWluZwoJCQkJCWVsc2UgewoJCQkJCQllbC5yZW1vdmVFdmVudExpc3RlbmVyKCAnbG9hZGVkZGF0YScsIHN0YXJ0RW1iZWRkZWRNZWRpYSApOyAvLyByZW1vdmUgZmlyc3QgdG8gYXZvaWQgZHVwZXMKCQkJCQkJZWwuYWRkRXZlbnRMaXN0ZW5lciggJ2xvYWRlZGRhdGEnLCBzdGFydEVtYmVkZGVkTWVkaWEgKTsKCQkJCQl9CgoJCQkJfQoJCQl9ICk7CgoJCQkvLyBOb3JtYWwgaWZyYW1lcwoJCQl0b0FycmF5KCBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICdpZnJhbWVbc3JjXScgKSApLmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsKCQkJCWlmKCBjbG9zZXN0UGFyZW50KCBlbCwgJy5mcmFnbWVudCcgKSAmJiAhY2xvc2VzdFBhcmVudCggZWwsICcuZnJhZ21lbnQudmlzaWJsZScgKSApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgoJCQkJc3RhcnRFbWJlZGRlZElmcmFtZSggeyB0YXJnZXQ6IGVsIH0gKTsKCQkJfSApOwoKCQkJLy8gTGF6eSBsb2FkaW5nIGlmcmFtZXMKCQkJdG9BcnJheSggZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnaWZyYW1lW2RhdGEtc3JjXScgKSApLmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsKCQkJCWlmKCBjbG9zZXN0UGFyZW50KCBlbCwgJy5mcmFnbWVudCcgKSAmJiAhY2xvc2VzdFBhcmVudCggZWwsICcuZnJhZ21lbnQudmlzaWJsZScgKSApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgoJCQkJaWYoIGVsLmdldEF0dHJpYnV0ZSggJ3NyYycgKSAhPT0gZWwuZ2V0QXR0cmlidXRlKCAnZGF0YS1zcmMnICkgKSB7CgkJCQkJZWwucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCBzdGFydEVtYmVkZGVkSWZyYW1lICk7IC8vIHJlbW92ZSBmaXJzdCB0byBhdm9pZCBkdXBlcwoJCQkJCWVsLmFkZEV2ZW50TGlzdGVuZXIoICdsb2FkJywgc3RhcnRFbWJlZGRlZElmcmFtZSApOwoJCQkJCWVsLnNldEF0dHJpYnV0ZSggJ3NyYycsIGVsLmdldEF0dHJpYnV0ZSggJ2RhdGEtc3JjJyApICk7CgkJCQl9CgkJCX0gKTsKCgkJfQoKCX0KCgkvKioKCSAqIFN0YXJ0cyBwbGF5aW5nIGFuIGVtYmVkZGVkIHZpZGVvL2F1ZGlvIGVsZW1lbnQgYWZ0ZXIKCSAqIGl0IGhhcyBmaW5pc2hlZCBsb2FkaW5nLgoJICoKCSAqIEBwYXJhbSB7b2JqZWN0fSBldmVudAoJICovCglmdW5jdGlvbiBzdGFydEVtYmVkZGVkTWVkaWEoIGV2ZW50ICkgewoKCQl2YXIgaXNBdHRhY2hlZFRvRE9NID0gISFjbG9zZXN0UGFyZW50KCBldmVudC50YXJnZXQsICdodG1sJyApLAoJCQlpc1Zpc2libGUgIAkJPSAhIWNsb3Nlc3RQYXJlbnQoIGV2ZW50LnRhcmdldCwgJy5wcmVzZW50JyApOwoKCQlpZiggaXNBdHRhY2hlZFRvRE9NICYmIGlzVmlzaWJsZSApIHsKCQkJZXZlbnQudGFyZ2V0LmN1cnJlbnRUaW1lID0gMDsKCQkJZXZlbnQudGFyZ2V0LnBsYXkoKTsKCQl9CgoJCWV2ZW50LnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCAnbG9hZGVkZGF0YScsIHN0YXJ0RW1iZWRkZWRNZWRpYSApOwoKCX0KCgkvKioKCSAqICJTdGFydHMiIHRoZSBjb250ZW50IG9mIGFuIGVtYmVkZGVkIGlmcmFtZSB1c2luZyB0aGUKCSAqIHBvc3RNZXNzYWdlIEFQSS4KCSAqCgkgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQKCSAqLwoJZnVuY3Rpb24gc3RhcnRFbWJlZGRlZElmcmFtZSggZXZlbnQgKSB7CgoJCXZhciBpZnJhbWUgPSBldmVudC50YXJnZXQ7CgoJCWlmKCBpZnJhbWUgJiYgaWZyYW1lLmNvbnRlbnRXaW5kb3cgKSB7CgoJCQl2YXIgaXNBdHRhY2hlZFRvRE9NID0gISFjbG9zZXN0UGFyZW50KCBldmVudC50YXJnZXQsICdodG1sJyApLAoJCQkJaXNWaXNpYmxlICAJCT0gISFjbG9zZXN0UGFyZW50KCBldmVudC50YXJnZXQsICcucHJlc2VudCcgKTsKCgkJCWlmKCBpc0F0dGFjaGVkVG9ET00gJiYgaXNWaXNpYmxlICkgewoKCQkJCS8vIFByZWZlciBhbiBleHBsaWNpdCBnbG9iYWwgYXV0b3BsYXkgc2V0dGluZwoJCQkJdmFyIGF1dG9wbGF5ID0gY29uZmlnLmF1dG9QbGF5TWVkaWE7CgoJCQkJLy8gSWYgbm8gZ2xvYmFsIHNldHRpbmcgaXMgYXZhaWxhYmxlLCBmYWxsIGJhY2sgb24gdGhlIGVsZW1lbnQncwoJCQkJLy8gb3duIGF1dG9wbGF5IHNldHRpbmcKCQkJCWlmKCB0eXBlb2YgYXV0b3BsYXkgIT09ICdib29sZWFuJyApIHsKCQkJCQlhdXRvcGxheSA9IGlmcmFtZS5oYXNBdHRyaWJ1dGUoICdkYXRhLWF1dG9wbGF5JyApIHx8ICEhY2xvc2VzdFBhcmVudCggaWZyYW1lLCAnLnNsaWRlLWJhY2tncm91bmQnICk7CgkJCQl9CgoJCQkJLy8gWW91VHViZSBwb3N0TWVzc2FnZSBBUEkKCQkJCWlmKCAveW91dHViZVwuY29tXC9lbWJlZFwvLy50ZXN0KCBpZnJhbWUuZ2V0QXR0cmlidXRlKCAnc3JjJyApICkgJiYgYXV0b3BsYXkgKSB7CgkJCQkJaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoICd7ImV2ZW50IjoiY29tbWFuZCIsImZ1bmMiOiJwbGF5VmlkZW8iLCJhcmdzIjoiIn0nLCAnKicgKTsKCQkJCX0KCQkJCS8vIFZpbWVvIHBvc3RNZXNzYWdlIEFQSQoJCQkJZWxzZSBpZiggL3BsYXllclwudmltZW9cLmNvbVwvLy50ZXN0KCBpZnJhbWUuZ2V0QXR0cmlidXRlKCAnc3JjJyApICkgJiYgYXV0b3BsYXkgKSB7CgkJCQkJaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoICd7Im1ldGhvZCI6InBsYXkifScsICcqJyApOwoJCQkJfQoJCQkJLy8gR2VuZXJpYyBwb3N0TWVzc2FnZSBBUEkKCQkJCWVsc2UgewoJCQkJCWlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCAnc2xpZGU6c3RhcnQnLCAnKicgKTsKCQkJCX0KCgkJCX0KCgkJfQoKCX0KCgkvKioKCSAqIFN0b3AgcGxheWJhY2sgb2YgYW55IGVtYmVkZGVkIGNvbnRlbnQgaW5zaWRlIG9mCgkgKiB0aGUgdGFyZ2V0ZWQgc2xpZGUuCgkgKgoJICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudAoJICovCglmdW5jdGlvbiBzdG9wRW1iZWRkZWRDb250ZW50KCBlbGVtZW50LCBvcHRpb25zICkgewoKCQlvcHRpb25zID0gZXh0ZW5kKCB7CgkJCS8vIERlZmF1bHRzCgkJCXVubG9hZElmcmFtZXM6IHRydWUKCQl9LCBvcHRpb25zIHx8IHt9ICk7CgoJCWlmKCBlbGVtZW50ICYmIGVsZW1lbnQucGFyZW50Tm9kZSApIHsKCQkJLy8gSFRNTDUgbWVkaWEgZWxlbWVudHMKCQkJdG9BcnJheSggZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCAndmlkZW8sIGF1ZGlvJyApICkuZm9yRWFjaCggZnVuY3Rpb24oIGVsICkgewoJCQkJaWYoICFlbC5oYXNBdHRyaWJ1dGUoICdkYXRhLWlnbm9yZScgKSAmJiB0eXBlb2YgZWwucGF1c2UgPT09ICdmdW5jdGlvbicgKSB7CgkJCQkJZWwuc2V0QXR0cmlidXRlKCdkYXRhLXBhdXNlZC1ieS1yZXZlYWwnLCAnJyk7CgkJCQkJZWwucGF1c2UoKTsKCQkJCX0KCQkJfSApOwoKCQkJLy8gR2VuZXJpYyBwb3N0TWVzc2FnZSBBUEkgZm9yIG5vbi1sYXp5IGxvYWRlZCBpZnJhbWVzCgkJCXRvQXJyYXkoIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ2lmcmFtZScgKSApLmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsKCQkJCWlmKCBlbC5jb250ZW50V2luZG93ICkgZWwuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSggJ3NsaWRlOnN0b3AnLCAnKicgKTsKCQkJCWVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdsb2FkJywgc3RhcnRFbWJlZGRlZElmcmFtZSApOwoJCQl9KTsKCgkJCS8vIFlvdVR1YmUgcG9zdE1lc3NhZ2UgQVBJCgkJCXRvQXJyYXkoIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ2lmcmFtZVtzcmMqPSJ5b3V0dWJlLmNvbS9lbWJlZC8iXScgKSApLmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsKCQkJCWlmKCAhZWwuaGFzQXR0cmlidXRlKCAnZGF0YS1pZ25vcmUnICkgJiYgZWwuY29udGVudFdpbmRvdyAmJiB0eXBlb2YgZWwuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJyApIHsKCQkJCQllbC5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCAneyJldmVudCI6ImNvbW1hbmQiLCJmdW5jIjoicGF1c2VWaWRlbyIsImFyZ3MiOiIifScsICcqJyApOwoJCQkJfQoJCQl9KTsKCgkJCS8vIFZpbWVvIHBvc3RNZXNzYWdlIEFQSQoJCQl0b0FycmF5KCBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICdpZnJhbWVbc3JjKj0icGxheWVyLnZpbWVvLmNvbS8iXScgKSApLmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsKCQkJCWlmKCAhZWwuaGFzQXR0cmlidXRlKCAnZGF0YS1pZ25vcmUnICkgJiYgZWwuY29udGVudFdpbmRvdyAmJiB0eXBlb2YgZWwuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJyApIHsKCQkJCQllbC5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCAneyJtZXRob2QiOiJwYXVzZSJ9JywgJyonICk7CgkJCQl9CgkJCX0pOwoKCQkJaWYoIG9wdGlvbnMudW5sb2FkSWZyYW1lcyA9PT0gdHJ1ZSApIHsKCQkJCS8vIFVubG9hZCBsYXp5LWxvYWRlZCBpZnJhbWVzCgkJCQl0b0FycmF5KCBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICdpZnJhbWVbZGF0YS1zcmNdJyApICkuZm9yRWFjaCggZnVuY3Rpb24oIGVsICkgewoJCQkJCS8vIE9ubHkgcmVtb3ZpbmcgdGhlIHNyYyBkb2Vzbid0IGFjdHVhbGx5IHVubG9hZCB0aGUgZnJhbWUKCQkJCQkvLyBpbiBhbGwgYnJvd3NlcnMgKEZpcmVmb3gpIHNvIHdlIHNldCBpdCB0byBibGFuayBmaXJzdAoJCQkJCWVsLnNldEF0dHJpYnV0ZSggJ3NyYycsICdhYm91dDpibGFuaycgKTsKCQkJCQllbC5yZW1vdmVBdHRyaWJ1dGUoICdzcmMnICk7CgkJCQl9ICk7CgkJCX0KCQl9CgoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhc3Qgc2xpZGVzLiBUaGlzIGNhbiBiZSB1c2VkIGFzIGEgZ2xvYmFsCgkgKiBmbGF0dGVuZWQgaW5kZXggZm9yIHNsaWRlcy4KCSAqCgkgKiBAcmV0dXJuIHtudW1iZXJ9IFBhc3Qgc2xpZGUgY291bnQKCSAqLwoJZnVuY3Rpb24gZ2V0U2xpZGVQYXN0Q291bnQoKSB7CgoJCXZhciBob3Jpem9udGFsU2xpZGVzID0gdG9BcnJheSggZG9tLndyYXBwZXIucXVlcnlTZWxlY3RvckFsbCggSE9SSVpPTlRBTF9TTElERVNfU0VMRUNUT1IgKSApOwoKCQkvLyBUaGUgbnVtYmVyIG9mIHBhc3Qgc2xpZGVzCgkJdmFyIHBhc3RDb3VudCA9IDA7CgoJCS8vIFN0ZXAgdGhyb3VnaCBhbGwgc2xpZGVzIGFuZCBjb3VudCB0aGUgcGFzdCBvbmVzCgkJbWFpbkxvb3A6IGZvciggdmFyIGkgPSAwOyBpIDwgaG9yaXpvbnRhbFNsaWRlcy5sZW5ndGg7IGkrKyApIHsKCgkJCXZhciBob3Jpem9udGFsU2xpZGUgPSBob3Jpem9udGFsU2xpZGVzW2ldOwoJCQl2YXIgdmVydGljYWxTbGlkZXMgPSB0b0FycmF5KCBob3Jpem9udGFsU2xpZGUucXVlcnlTZWxlY3RvckFsbCggJ3NlY3Rpb24nICkgKTsKCgkJCWZvciggdmFyIGogPSAwOyBqIDwgdmVydGljYWxTbGlkZXMubGVuZ3RoOyBqKysgKSB7CgoJCQkJLy8gU3RvcCBhcyBzb29uIGFzIHdlIGFycml2ZSBhdCB0aGUgcHJlc2VudAoJCQkJaWYoIHZlcnRpY2FsU2xpZGVzW2pdLmNsYXNzTGlzdC5jb250YWlucyggJ3ByZXNlbnQnICkgKSB7CgkJCQkJYnJlYWsgbWFpbkxvb3A7CgkJCQl9CgoJCQkJcGFzdENvdW50Kys7CgoJCQl9CgoJCQkvLyBTdG9wIGFzIHNvb24gYXMgd2UgYXJyaXZlIGF0IHRoZSBwcmVzZW50CgkJCWlmKCBob3Jpem9udGFsU2xpZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCAncHJlc2VudCcgKSApIHsKCQkJCWJyZWFrOwoJCQl9CgoJCQkvLyBEb24ndCBjb3VudCB0aGUgd3JhcHBpbmcgc2VjdGlvbiBmb3IgdmVydGljYWwgc2xpZGVzCgkJCWlmKCBob3Jpem9udGFsU2xpZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCAnc3RhY2snICkgPT09IGZhbHNlICkgewoJCQkJcGFzdENvdW50Kys7CgkJCX0KCgkJfQoKCQlyZXR1cm4gcGFzdENvdW50OwoKCX0KCgkvKioKCSAqIFJldHVybnMgYSB2YWx1ZSByYW5naW5nIGZyb20gMC0xIHRoYXQgcmVwcmVzZW50cwoJICogaG93IGZhciBpbnRvIHRoZSBwcmVzZW50YXRpb24gd2UgaGF2ZSBuYXZpZ2F0ZWQuCgkgKgoJICogQHJldHVybiB7bnVtYmVyfQoJICovCglmdW5jdGlvbiBnZXRQcm9ncmVzcygpIHsKCgkJLy8gVGhlIG51bWJlciBvZiBwYXN0IGFuZCB0b3RhbCBzbGlkZXMKCQl2YXIgdG90YWxDb3VudCA9IGdldFRvdGFsU2xpZGVzKCk7CgkJdmFyIHBhc3RDb3VudCA9IGdldFNsaWRlUGFzdENvdW50KCk7CgoJCWlmKCBjdXJyZW50U2xpZGUgKSB7CgoJCQl2YXIgYWxsRnJhZ21lbnRzID0gY3VycmVudFNsaWRlLnF1ZXJ5U2VsZWN0b3JBbGwoICcuZnJhZ21lbnQnICk7CgoJCQkvLyBJZiB0aGVyZSBhcmUgZnJhZ21lbnRzIGluIHRoZSBjdXJyZW50IHNsaWRlIHRob3NlIHNob3VsZCBiZQoJCQkvLyBhY2NvdW50ZWQgZm9yIGluIHRoZSBwcm9ncmVzcy4KCQkJaWYoIGFsbEZyYWdtZW50cy5sZW5ndGggPiAwICkgewoJCQkJdmFyIHZpc2libGVGcmFnbWVudHMgPSBjdXJyZW50U2xpZGUucXVlcnlTZWxlY3RvckFsbCggJy5mcmFnbWVudC52aXNpYmxlJyApOwoKCQkJCS8vIFRoaXMgdmFsdWUgcmVwcmVzZW50cyBob3cgYmlnIGEgcG9ydGlvbiBvZiB0aGUgc2xpZGUgcHJvZ3Jlc3MKCQkJCS8vIHRoYXQgaXMgbWFkZSB1cCBieSBpdHMgZnJhZ21lbnRzICgwLTEpCgkJCQl2YXIgZnJhZ21lbnRXZWlnaHQgPSAwLjk7CgoJCQkJLy8gQWRkIGZyYWdtZW50IHByb2dyZXNzIHRvIHRoZSBwYXN0IHNsaWRlIGNvdW50CgkJCQlwYXN0Q291bnQgKz0gKCB2aXNpYmxlRnJhZ21lbnRzLmxlbmd0aCAvIGFsbEZyYWdtZW50cy5sZW5ndGggKSAqIGZyYWdtZW50V2VpZ2h0OwoJCQl9CgoJCX0KCgkJcmV0dXJuIE1hdGgubWluKCBwYXN0Q291bnQgLyAoIHRvdGFsQ291bnQgLSAxICksIDEgKTsKCgl9CgoJLyoqCgkgKiBDaGVja3MgaWYgdGhpcyBwcmVzZW50YXRpb24gaXMgcnVubmluZyBpbnNpZGUgb2YgdGhlCgkgKiBzcGVha2VyIG5vdGVzIHdpbmRvdy4KCSAqCgkgKiBAcmV0dXJuIHtib29sZWFufQoJICovCglmdW5jdGlvbiBpc1NwZWFrZXJOb3RlcygpIHsKCgkJcmV0dXJuICEhd2luZG93LmxvY2F0aW9uLnNlYXJjaC5tYXRjaCggL3JlY2VpdmVyL2dpICk7CgoJfQoKCS8qKgoJICogUmVhZHMgdGhlIGN1cnJlbnQgVVJMIChoYXNoKSBhbmQgbmF2aWdhdGVzIGFjY29yZGluZ2x5LgoJICovCglmdW5jdGlvbiByZWFkVVJMKCkgewoKCQl2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbi5oYXNoOwoKCQkvLyBBdHRlbXB0IHRvIHBhcnNlIHRoZSBoYXNoIGFzIGVpdGhlciBhbiBpbmRleCBvciBuYW1lCgkJdmFyIGJpdHMgPSBoYXNoLnNsaWNlKCAyICkuc3BsaXQoICcvJyApLAoJCQluYW1lID0gaGFzaC5yZXBsYWNlKCAvI3xcLy9naSwgJycgKTsKCgkJLy8gSWYgdGhlIGZpcnN0IGJpdCBpcyBub3QgZnVsbHkgbnVtZXJpYyBhbmQgdGhlcmUgaXMgYSBuYW1lIHdlCgkJLy8gY2FuIGFzc3VtZSB0aGF0IHRoaXMgaXMgYSBuYW1lZCBsaW5rCgkJaWYoICEvXlswLTldKiQvLnRlc3QoIGJpdHNbMF0gKSAmJiBuYW1lLmxlbmd0aCApIHsKCQkJdmFyIGVsZW1lbnQ7CgoJCQkvLyBFbnN1cmUgdGhlIG5hbWVkIGxpbmsgaXMgYSB2YWxpZCBIVE1MIElEIGF0dHJpYnV0ZQoJCQl0cnkgewoJCQkJZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBkZWNvZGVVUklDb21wb25lbnQoIG5hbWUgKSApOwoJCQl9CgkJCWNhdGNoICggZXJyb3IgKSB7IH0KCgkJCS8vIEVuc3VyZSB0aGF0IHdlJ3JlIG5vdCBhbHJlYWR5IG9uIGEgc2xpZGUgd2l0aCB0aGUgc2FtZSBuYW1lCgkJCXZhciBpc1NhbWVOYW1lQXNDdXJyZW50U2xpZGUgPSBjdXJyZW50U2xpZGUgPyBjdXJyZW50U2xpZGUuZ2V0QXR0cmlidXRlKCAnaWQnICkgPT09IG5hbWUgOiBmYWxzZTsKCgkJCWlmKCBlbGVtZW50ICkgewoJCQkJLy8gSWYgdGhlIHNsaWRlIGV4aXN0cyBhbmQgaXMgbm90IHRoZSBjdXJyZW50IHNsaWRlLi4uCgkJCQlpZiAoICFpc1NhbWVOYW1lQXNDdXJyZW50U2xpZGUgKSB7CgkJCQkJLy8gLi4uZmluZCB0aGUgcG9zaXRpb24gb2YgdGhlIG5hbWVkIHNsaWRlIGFuZCBuYXZpZ2F0ZSB0byBpdAoJCQkJCXZhciBpbmRpY2VzID0gUmV2ZWFsLmdldEluZGljZXMoZWxlbWVudCk7CgkJCQkJc2xpZGUoaW5kaWNlcy5oLCBpbmRpY2VzLnYpOwoJCQkJfQoJCQl9CgkJCS8vIElmIHRoZSBzbGlkZSBkb2Vzbid0IGV4aXN0LCBuYXZpZ2F0ZSB0byB0aGUgY3VycmVudCBzbGlkZQoJCQllbHNlIHsKCQkJCXNsaWRlKCBpbmRleGggfHwgMCwgaW5kZXh2IHx8IDAgKTsKCQkJfQoJCX0KCQllbHNlIHsKCQkJdmFyIGhhc2hJbmRleEJhc2UgPSBjb25maWcuaGFzaE9uZUJhc2VkSW5kZXggPyAxIDogMDsKCgkJCS8vIFJlYWQgdGhlIGluZGV4IGNvbXBvbmVudHMgb2YgdGhlIGhhc2gKCQkJdmFyIGggPSAoIHBhcnNlSW50KCBiaXRzWzBdLCAxMCApIC0gaGFzaEluZGV4QmFzZSApIHx8IDAsCgkJCQl2ID0gKCBwYXJzZUludCggYml0c1sxXSwgMTAgKSAtIGhhc2hJbmRleEJhc2UgKSB8fCAwLAoJCQkJZjsKCgkJCWlmKCBjb25maWcuZnJhZ21lbnRJblVSTCApIHsKCQkJCWYgPSBwYXJzZUludCggYml0c1syXSwgMTAgKTsKCQkJCWlmKCBpc05hTiggZiApICkgewoJCQkJCWYgPSB1bmRlZmluZWQ7CgkJCQl9CgkJCX0KCgkJCWlmKCBoICE9PSBpbmRleGggfHwgdiAhPT0gaW5kZXh2IHx8IGYgIT09IHVuZGVmaW5lZCApIHsKCQkJCXNsaWRlKCBoLCB2LCBmICk7CgkJCX0KCQl9CgoJfQoKCS8qKgoJICogVXBkYXRlcyB0aGUgcGFnZSBVUkwgKGhhc2gpIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQKCSAqIHN0YXRlLgoJICoKCSAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheSBUaGUgdGltZSBpbiBtcyB0byB3YWl0IGJlZm9yZQoJICogd3JpdGluZyB0aGUgaGFzaAoJICovCglmdW5jdGlvbiB3cml0ZVVSTCggZGVsYXkgKSB7CgoJCS8vIE1ha2Ugc3VyZSB0aGVyZSdzIG5ldmVyIG1vcmUgdGhhbiBvbmUgdGltZW91dCBydW5uaW5nCgkJY2xlYXJUaW1lb3V0KCB3cml0ZVVSTFRpbWVvdXQgKTsKCgkJLy8gSWYgYSBkZWxheSBpcyBzcGVjaWZpZWQsIHRpbWVvdXQgdGhpcyBjYWxsCgkJaWYoIHR5cGVvZiBkZWxheSA9PT0gJ251bWJlcicgKSB7CgkJCXdyaXRlVVJMVGltZW91dCA9IHNldFRpbWVvdXQoIHdyaXRlVVJMLCBkZWxheSApOwoJCX0KCQllbHNlIGlmKCBjdXJyZW50U2xpZGUgKSB7CgkJCS8vIElmIHdlJ3JlIGNvbmZpZ3VyZWQgdG8gcHVzaCB0byBoaXN0b3J5IE9SIHRoZSBoaXN0b3J5CgkJCS8vIEFQSSBpcyBub3QgYXZhaWFsYmxlLgoJCQlpZiggY29uZmlnLmhpc3RvcnkgfHwgIXdpbmRvdy5oaXN0b3J5ICkgewoJCQkJd2luZG93LmxvY2F0aW9uLmhhc2ggPSBsb2NhdGlvbkhhc2goKTsKCQkJfQoJCQkvLyBJZiB3ZSdyZSBjb25maWd1cmVkIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQgc2xpZGUgaW4gdGhlCgkJCS8vIFVSTCB3aXRob3V0IHB1c2hpbmcgdG8gaGlzdG9yeS4KCQkJZWxzZSBpZiggY29uZmlnLmhhc2ggKSB7CgkJCQl3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoIG51bGwsIG51bGwsICcjJyArIGxvY2F0aW9uSGFzaCgpICk7CgkJCX0KCQkJLy8gSWYgaGlzdG9yeSBhbmQgaGFzaCBhcmUgYm90aCBkaXNhYmxlZCwgYSBoYXNoIG1heSBzdGlsbAoJCQkvLyBiZSBhZGRlZCB0byB0aGUgVVJMIGJ5IGNsaWNraW5nIG9uIGEgaHJlZiB3aXRoIGEgaGFzaAoJCQkvLyB0YXJnZXQuIENvdW50ZXIgdGhpcyBieSBhbHdheXMgcmVtb3ZpbmcgdGhlIGhhc2guCgkJCWVsc2UgewoJCQkJd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCBudWxsLCBudWxsLCB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoICk7CgkJCX0KCQl9CgoJfQoJLyoqCgkgKiBSZXRyaWV2ZXMgdGhlIGgvdiBsb2NhdGlvbiBhbmQgZnJhZ21lbnQgb2YgdGhlIGN1cnJlbnQsCgkgKiBvciBzcGVjaWZpZWQsIHNsaWRlLgoJICoKCSAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IFtzbGlkZV0gSWYgc3BlY2lmaWVkLCB0aGUgcmV0dXJuZWQKCSAqIGluZGV4IHdpbGwgYmUgZm9yIHRoaXMgc2xpZGUgcmF0aGVyIHRoYW4gdGhlIGN1cnJlbnRseQoJICogYWN0aXZlIG9uZQoJICoKCSAqIEByZXR1cm4ge3toOiBudW1iZXIsIHY6IG51bWJlciwgZjogbnVtYmVyfX0KCSAqLwoJZnVuY3Rpb24gZ2V0SW5kaWNlcyggc2xpZGUgKSB7CgoJCS8vIEJ5IGRlZmF1bHQsIHJldHVybiB0aGUgY3VycmVudCBpbmRpY2VzCgkJdmFyIGggPSBpbmRleGgsCgkJCXYgPSBpbmRleHYsCgkJCWY7CgoJCS8vIElmIGEgc2xpZGUgaXMgc3BlY2lmaWVkLCByZXR1cm4gdGhlIGluZGljZXMgb2YgdGhhdCBzbGlkZQoJCWlmKCBzbGlkZSApIHsKCQkJdmFyIGlzVmVydGljYWwgPSBpc1ZlcnRpY2FsU2xpZGUoIHNsaWRlICk7CgkJCXZhciBzbGlkZWggPSBpc1ZlcnRpY2FsID8gc2xpZGUucGFyZW50Tm9kZSA6IHNsaWRlOwoKCQkJLy8gU2VsZWN0IGFsbCBob3Jpem9udGFsIHNsaWRlcwoJCQl2YXIgaG9yaXpvbnRhbFNsaWRlcyA9IHRvQXJyYXkoIGRvbS53cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoIEhPUklaT05UQUxfU0xJREVTX1NFTEVDVE9SICkgKTsKCgkJCS8vIE5vdyB0aGF0IHdlIGtub3cgd2hpY2ggdGhlIGhvcml6b250YWwgc2xpZGUgaXMsIGdldCBpdHMgaW5kZXgKCQkJaCA9IE1hdGgubWF4KCBob3Jpem9udGFsU2xpZGVzLmluZGV4T2YoIHNsaWRlaCApLCAwICk7CgoJCQkvLyBBc3N1bWUgd2UncmUgbm90IHZlcnRpY2FsCgkJCXYgPSB1bmRlZmluZWQ7CgoJCQkvLyBJZiB0aGlzIGlzIGEgdmVydGljYWwgc2xpZGUsIGdyYWIgdGhlIHZlcnRpY2FsIGluZGV4CgkJCWlmKCBpc1ZlcnRpY2FsICkgewoJCQkJdiA9IE1hdGgubWF4KCB0b0FycmF5KCBzbGlkZS5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoICdzZWN0aW9uJyApICkuaW5kZXhPZiggc2xpZGUgKSwgMCApOwoJCQl9CgkJfQoKCQlpZiggIXNsaWRlICYmIGN1cnJlbnRTbGlkZSApIHsKCQkJdmFyIGhhc0ZyYWdtZW50cyA9IGN1cnJlbnRTbGlkZS5xdWVyeVNlbGVjdG9yQWxsKCAnLmZyYWdtZW50JyApLmxlbmd0aCA+IDA7CgkJCWlmKCBoYXNGcmFnbWVudHMgKSB7CgkJCQl2YXIgY3VycmVudEZyYWdtZW50ID0gY3VycmVudFNsaWRlLnF1ZXJ5U2VsZWN0b3IoICcuY3VycmVudC1mcmFnbWVudCcgKTsKCQkJCWlmKCBjdXJyZW50RnJhZ21lbnQgJiYgY3VycmVudEZyYWdtZW50Lmhhc0F0dHJpYnV0ZSggJ2RhdGEtZnJhZ21lbnQtaW5kZXgnICkgKSB7CgkJCQkJZiA9IHBhcnNlSW50KCBjdXJyZW50RnJhZ21lbnQuZ2V0QXR0cmlidXRlKCAnZGF0YS1mcmFnbWVudC1pbmRleCcgKSwgMTAgKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCWYgPSBjdXJyZW50U2xpZGUucXVlcnlTZWxlY3RvckFsbCggJy5mcmFnbWVudC52aXNpYmxlJyApLmxlbmd0aCAtIDE7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiB7IGg6IGgsIHY6IHYsIGY6IGYgfTsKCgl9CgoJLyoqCgkgKiBSZXRyaWV2ZXMgYWxsIHNsaWRlcyBpbiB0aGlzIHByZXNlbnRhdGlvbi4KCSAqLwoJZnVuY3Rpb24gZ2V0U2xpZGVzKCkgewoKCQlyZXR1cm4gdG9BcnJheSggZG9tLndyYXBwZXIucXVlcnlTZWxlY3RvckFsbCggU0xJREVTX1NFTEVDVE9SICsgJzpub3QoLnN0YWNrKScgKSApOwoKCX0KCgkvKioKCSAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBob3Jpem9udGFsIHNsaWRlcyBpbiB0aGUgZGVjay4gRWFjaAoJICogdmVydGljYWwgc3RhY2sgaXMgaW5jbHVkZWQgYXMgb25lIGhvcml6b250YWwgc2xpZGUgaW4gdGhlCgkgKiByZXN1bHRpbmcgYXJyYXkuCgkgKi8KCWZ1bmN0aW9uIGdldEhvcml6b250YWxTbGlkZXMoKSB7CgoJCXJldHVybiB0b0FycmF5KCBkb20ud3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCBIT1JJWk9OVEFMX1NMSURFU19TRUxFQ1RPUiApICk7CgoJfQoKCS8qKgoJICogUmV0dXJucyBhbGwgdmVydGljYWwgc2xpZGVzIHRoYXQgZXhpc3Qgd2l0aGluIHRoaXMgZGVjay4KCSAqLwoJZnVuY3Rpb24gZ2V0VmVydGljYWxTbGlkZXMoKSB7CgoJCXJldHVybiB0b0FycmF5KCBkb20ud3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCAnLnNsaWRlcz5zZWN0aW9uPnNlY3Rpb24nICkgKTsKCgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byBob3Jpem9udGFsIHNsaWRlcy4KCSAqLwoJZnVuY3Rpb24gaGFzSG9yaXpvbnRhbFNsaWRlcygpIHsKCgkJcmV0dXJuIGdldEhvcml6b250YWxTbGlkZXMoKS5sZW5ndGggPiAxOwoJfQoKCS8qKgoJICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gdmVydGljYWwgc2xpZGVzLgoJICovCglmdW5jdGlvbiBoYXNWZXJ0aWNhbFNsaWRlcygpIHsKCgkJcmV0dXJuIGdldFZlcnRpY2FsU2xpZGVzKCkubGVuZ3RoID4gMTsKCgl9CgoJLyoqCgkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG9iamVjdHMgd2hlcmUgZWFjaCBvYmplY3QgcmVwcmVzZW50cyB0aGUKCSAqIGF0dHJpYnV0ZXMgb24gaXRzIHJlc3BlY3RpdmUgc2xpZGUuCgkgKi8KCWZ1bmN0aW9uIGdldFNsaWRlc0F0dHJpYnV0ZXMoKSB7CgoJCXJldHVybiBnZXRTbGlkZXMoKS5tYXAoIGZ1bmN0aW9uKCBzbGlkZSApIHsKCgkJCXZhciBhdHRyaWJ1dGVzID0ge307CgkJCWZvciggdmFyIGkgPSAwOyBpIDwgc2xpZGUuYXR0cmlidXRlcy5sZW5ndGg7IGkrKyApIHsKCQkJCXZhciBhdHRyaWJ1dGUgPSBzbGlkZS5hdHRyaWJ1dGVzWyBpIF07CgkJCQlhdHRyaWJ1dGVzWyBhdHRyaWJ1dGUubmFtZSBdID0gYXR0cmlidXRlLnZhbHVlOwoJCQl9CgkJCXJldHVybiBhdHRyaWJ1dGVzOwoKCQl9ICk7CgoJfQoKCS8qKgoJICogUmV0cmlldmVzIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2xpZGVzIGluIHRoaXMgcHJlc2VudGF0aW9uLgoJICoKCSAqIEByZXR1cm4ge251bWJlcn0KCSAqLwoJZnVuY3Rpb24gZ2V0VG90YWxTbGlkZXMoKSB7CgoJCXJldHVybiBnZXRTbGlkZXMoKS5sZW5ndGg7CgoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgc2xpZGUgZWxlbWVudCBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIGluZGV4LgoJICoKCSAqIEByZXR1cm4ge0hUTUxFbGVtZW50fQoJICovCglmdW5jdGlvbiBnZXRTbGlkZSggeCwgeSApIHsKCgkJdmFyIGhvcml6b250YWxTbGlkZSA9IGRvbS53cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoIEhPUklaT05UQUxfU0xJREVTX1NFTEVDVE9SIClbIHggXTsKCQl2YXIgdmVydGljYWxTbGlkZXMgPSBob3Jpem9udGFsU2xpZGUgJiYgaG9yaXpvbnRhbFNsaWRlLnF1ZXJ5U2VsZWN0b3JBbGwoICdzZWN0aW9uJyApOwoKCQlpZiggdmVydGljYWxTbGlkZXMgJiYgdmVydGljYWxTbGlkZXMubGVuZ3RoICYmIHR5cGVvZiB5ID09PSAnbnVtYmVyJyApIHsKCQkJcmV0dXJuIHZlcnRpY2FsU2xpZGVzID8gdmVydGljYWxTbGlkZXNbIHkgXSA6IHVuZGVmaW5lZDsKCQl9CgoJCXJldHVybiBob3Jpem9udGFsU2xpZGU7CgoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgYmFja2dyb3VuZCBlbGVtZW50IGZvciB0aGUgZ2l2ZW4gc2xpZGUuCgkgKiBBbGwgc2xpZGVzLCBldmVuIHRoZSBvbmVzIHdpdGggbm8gYmFja2dyb3VuZCBwcm9wZXJ0aWVzCgkgKiBkZWZpbmVkLCBoYXZlIGEgYmFja2dyb3VuZCBlbGVtZW50IHNvIGFzIGxvbmcgYXMgdGhlCgkgKiBpbmRleCBpcyB2YWxpZCBhbiBlbGVtZW50IHdpbGwgYmUgcmV0dXJuZWQuCgkgKgoJICogQHBhcmFtIHttaXhlZH0geCBIb3Jpem9udGFsIGJhY2tncm91bmQgaW5kZXggT1IgYSBzbGlkZQoJICogSFRNTCBlbGVtZW50CgkgKiBAcGFyYW0ge251bWJlcn0geSBWZXJ0aWNhbCBiYWNrZ3JvdW5kIGluZGV4CgkgKiBAcmV0dXJuIHsoSFRNTEVsZW1lbnRbXXwqKX0KCSAqLwoJZnVuY3Rpb24gZ2V0U2xpZGVCYWNrZ3JvdW5kKCB4LCB5ICkgewoKCQl2YXIgc2xpZGUgPSB0eXBlb2YgeCA9PT0gJ251bWJlcicgPyBnZXRTbGlkZSggeCwgeSApIDogeDsKCQlpZiggc2xpZGUgKSB7CgkJCXJldHVybiBzbGlkZS5zbGlkZUJhY2tncm91bmRFbGVtZW50OwoJCX0KCgkJcmV0dXJuIHVuZGVmaW5lZDsKCgl9CgoJLyoqCgkgKiBSZXRyaWV2ZXMgdGhlIHNwZWFrZXIgbm90ZXMgZnJvbSBhIHNsaWRlLiBOb3RlcyBjYW4gYmUKCSAqIGRlZmluZWQgaW4gdHdvIHdheXM6CgkgKiAxLiBBcyBhIGRhdGEtbm90ZXMgYXR0cmlidXRlIG9uIHRoZSBzbGlkZSA8c2VjdGlvbj4KCSAqIDIuIEFzIGFuIDxhc2lkZSBjbGFzcz0ibm90ZXMiPiBpbnNpZGUgb2YgdGhlIHNsaWRlCgkgKgoJICogQHBhcmFtIHtIVE1MRWxlbWVudH0gW3NsaWRlPWN1cnJlbnRTbGlkZV0KCSAqIEByZXR1cm4geyhzdHJpbmd8bnVsbCl9CgkgKi8KCWZ1bmN0aW9uIGdldFNsaWRlTm90ZXMoIHNsaWRlICkgewoKCQkvLyBEZWZhdWx0IHRvIHRoZSBjdXJyZW50IHNsaWRlCgkJc2xpZGUgPSBzbGlkZSB8fCBjdXJyZW50U2xpZGU7CgoJCS8vIE5vdGVzIGNhbiBiZSBzcGVjaWZpZWQgdmlhIHRoZSBkYXRhLW5vdGVzIGF0dHJpYnV0ZS4uLgoJCWlmKCBzbGlkZS5oYXNBdHRyaWJ1dGUoICdkYXRhLW5vdGVzJyApICkgewoJCQlyZXR1cm4gc2xpZGUuZ2V0QXR0cmlidXRlKCAnZGF0YS1ub3RlcycgKTsKCQl9CgoJCS8vIC4uLiBvciB1c2luZyBhbiA8YXNpZGUgY2xhc3M9Im5vdGVzIj4gZWxlbWVudAoJCXZhciBub3Rlc0VsZW1lbnQgPSBzbGlkZS5xdWVyeVNlbGVjdG9yKCAnYXNpZGUubm90ZXMnICk7CgkJaWYoIG5vdGVzRWxlbWVudCApIHsKCQkJcmV0dXJuIG5vdGVzRWxlbWVudC5pbm5lckhUTUw7CgkJfQoKCQlyZXR1cm4gbnVsbDsKCgl9CgoJLyoqCgkgKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHByZXNlbnRhdGlvbiBhcwoJICogYW4gb2JqZWN0LiBUaGlzIHN0YXRlIGNhbiB0aGVuIGJlIHJlc3RvcmVkIGF0IGFueQoJICogdGltZS4KCSAqCgkgKiBAcmV0dXJuIHt7aW5kZXhoOiBudW1iZXIsIGluZGV4djogbnVtYmVyLCBpbmRleGY6IG51bWJlciwgcGF1c2VkOiBib29sZWFuLCBvdmVydmlldzogYm9vbGVhbn19CgkgKi8KCWZ1bmN0aW9uIGdldFN0YXRlKCkgewoKCQl2YXIgaW5kaWNlcyA9IGdldEluZGljZXMoKTsKCgkJcmV0dXJuIHsKCQkJaW5kZXhoOiBpbmRpY2VzLmgsCgkJCWluZGV4djogaW5kaWNlcy52LAoJCQlpbmRleGY6IGluZGljZXMuZiwKCQkJcGF1c2VkOiBpc1BhdXNlZCgpLAoJCQlvdmVydmlldzogaXNPdmVydmlldygpCgkJfTsKCgl9CgoJLyoqCgkgKiBSZXN0b3JlcyB0aGUgcHJlc2VudGF0aW9uIHRvIHRoZSBnaXZlbiBzdGF0ZS4KCSAqCgkgKiBAcGFyYW0ge29iamVjdH0gc3RhdGUgQXMgZ2VuZXJhdGVkIGJ5IGdldFN0YXRlKCkKCSAqIEBzZWUge0BsaW5rIGdldFN0YXRlfSBnZW5lcmF0ZXMgdGhlIHBhcmFtZXRlciBgc3RhdGVgCgkgKi8KCWZ1bmN0aW9uIHNldFN0YXRlKCBzdGF0ZSApIHsKCgkJaWYoIHR5cGVvZiBzdGF0ZSA9PT0gJ29iamVjdCcgKSB7CgkJCXNsaWRlKCBkZXNlcmlhbGl6ZSggc3RhdGUuaW5kZXhoICksIGRlc2VyaWFsaXplKCBzdGF0ZS5pbmRleHYgKSwgZGVzZXJpYWxpemUoIHN0YXRlLmluZGV4ZiApICk7CgoJCQl2YXIgcGF1c2VkRmxhZyA9IGRlc2VyaWFsaXplKCBzdGF0ZS5wYXVzZWQgKSwKCQkJCW92ZXJ2aWV3RmxhZyA9IGRlc2VyaWFsaXplKCBzdGF0ZS5vdmVydmlldyApOwoKCQkJaWYoIHR5cGVvZiBwYXVzZWRGbGFnID09PSAnYm9vbGVhbicgJiYgcGF1c2VkRmxhZyAhPT0gaXNQYXVzZWQoKSApIHsKCQkJCXRvZ2dsZVBhdXNlKCBwYXVzZWRGbGFnICk7CgkJCX0KCgkJCWlmKCB0eXBlb2Ygb3ZlcnZpZXdGbGFnID09PSAnYm9vbGVhbicgJiYgb3ZlcnZpZXdGbGFnICE9PSBpc092ZXJ2aWV3KCkgKSB7CgkJCQl0b2dnbGVPdmVydmlldyggb3ZlcnZpZXdGbGFnICk7CgkJCX0KCQl9CgoJfQoKCS8qKgoJICogUmV0dXJuIGEgc29ydGVkIGZyYWdtZW50cyBsaXN0LCBvcmRlcmVkIGJ5IGFuIGluY3JlYXNpbmcKCSAqICJkYXRhLWZyYWdtZW50LWluZGV4IiBhdHRyaWJ1dGUuCgkgKgoJICogRnJhZ21lbnRzIHdpbGwgYmUgcmV2ZWFsZWQgaW4gdGhlIG9yZGVyIHRoYXQgdGhleSBhcmUgcmV0dXJuZWQgYnkKCSAqIHRoaXMgZnVuY3Rpb24sIHNvIHlvdSBjYW4gdXNlIHRoZSBpbmRleCBhdHRyaWJ1dGVzIHRvIGNvbnRyb2wgdGhlCgkgKiBvcmRlciBvZiBmcmFnbWVudCBhcHBlYXJhbmNlLgoJICoKCSAqIFRvIG1haW50YWluIGEgc2Vuc2libGUgZGVmYXVsdCBmcmFnbWVudCBvcmRlciwgZnJhZ21lbnRzIGFyZSBwcmVzdW1lZAoJICogdG8gYmUgcGFzc2VkIGluIGRvY3VtZW50IG9yZGVyLiBUaGlzIGZ1bmN0aW9uIGFkZHMgYSAiZnJhZ21lbnQtaW5kZXgiCgkgKiBhdHRyaWJ1dGUgdG8gZWFjaCBub2RlIGlmIHN1Y2ggYW4gYXR0cmlidXRlIGlzIG5vdCBhbHJlYWR5IHByZXNlbnQsCgkgKiBhbmQgc2V0cyB0aGF0IGF0dHJpYnV0ZSB0byBhbiBpbnRlZ2VyIHZhbHVlIHdoaWNoIGlzIHRoZSBwb3NpdGlvbiBvZgoJICogdGhlIGZyYWdtZW50IHdpdGhpbiB0aGUgZnJhZ21lbnRzIGxpc3QuCgkgKgoJICogQHBhcmFtIHtvYmplY3RbXXwqfSBmcmFnbWVudHMKCSAqIEBwYXJhbSB7Ym9vbGVhbn0gZ3JvdXBlZCBJZiB0cnVlIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGNvbnRhaW4KCSAqIG5lc3RlZCBhcnJheXMgZm9yIGFsbCBmcmFnbWVudHMgd2l0aCB0aGUgc2FtZSBpbmRleAoJICogQHJldHVybiB7b2JqZWN0W119IHNvcnRlZCBTb3J0ZWQgYXJyYXkgb2YgZnJhZ21lbnRzCgkgKi8KCWZ1bmN0aW9uIHNvcnRGcmFnbWVudHMoIGZyYWdtZW50cywgZ3JvdXBlZCApIHsKCgkJZnJhZ21lbnRzID0gdG9BcnJheSggZnJhZ21lbnRzICk7CgoJCXZhciBvcmRlcmVkID0gW10sCgkJCXVub3JkZXJlZCA9IFtdLAoJCQlzb3J0ZWQgPSBbXTsKCgkJLy8gR3JvdXAgb3JkZXJlZCBhbmQgdW5vcmRlcmVkIGVsZW1lbnRzCgkJZnJhZ21lbnRzLmZvckVhY2goIGZ1bmN0aW9uKCBmcmFnbWVudCwgaSApIHsKCQkJaWYoIGZyYWdtZW50Lmhhc0F0dHJpYnV0ZSggJ2RhdGEtZnJhZ21lbnQtaW5kZXgnICkgKSB7CgkJCQl2YXIgaW5kZXggPSBwYXJzZUludCggZnJhZ21lbnQuZ2V0QXR0cmlidXRlKCAnZGF0YS1mcmFnbWVudC1pbmRleCcgKSwgMTAgKTsKCgkJCQlpZiggIW9yZGVyZWRbaW5kZXhdICkgewoJCQkJCW9yZGVyZWRbaW5kZXhdID0gW107CgkJCQl9CgoJCQkJb3JkZXJlZFtpbmRleF0ucHVzaCggZnJhZ21lbnQgKTsKCQkJfQoJCQllbHNlIHsKCQkJCXVub3JkZXJlZC5wdXNoKCBbIGZyYWdtZW50IF0gKTsKCQkJfQoJCX0gKTsKCgkJLy8gQXBwZW5kIGZyYWdtZW50cyB3aXRob3V0IGV4cGxpY2l0IGluZGljZXMgaW4gdGhlaXIKCQkvLyBET00gb3JkZXIKCQlvcmRlcmVkID0gb3JkZXJlZC5jb25jYXQoIHVub3JkZXJlZCApOwoKCQkvLyBNYW51YWxseSBjb3VudCB0aGUgaW5kZXggdXAgcGVyIGdyb3VwIHRvIGVuc3VyZSB0aGVyZQoJCS8vIGFyZSBubyBnYXBzCgkJdmFyIGluZGV4ID0gMDsKCgkJLy8gUHVzaCBhbGwgZnJhZ21lbnRzIGluIHRoZWlyIHNvcnRlZCBvcmRlciB0byBhbiBhcnJheSwKCQkvLyB0aGlzIGZsYXR0ZW5zIHRoZSBncm91cHMKCQlvcmRlcmVkLmZvckVhY2goIGZ1bmN0aW9uKCBncm91cCApIHsKCQkJZ3JvdXAuZm9yRWFjaCggZnVuY3Rpb24oIGZyYWdtZW50ICkgewoJCQkJc29ydGVkLnB1c2goIGZyYWdtZW50ICk7CgkJCQlmcmFnbWVudC5zZXRBdHRyaWJ1dGUoICdkYXRhLWZyYWdtZW50LWluZGV4JywgaW5kZXggKTsKCQkJfSApOwoKCQkJaW5kZXggKys7CgkJfSApOwoKCQlyZXR1cm4gZ3JvdXBlZCA9PT0gdHJ1ZSA/IG9yZGVyZWQgOiBzb3J0ZWQ7CgoJfQoKCS8qKgoJICogUmVmcmVzaGVzIHRoZSBmcmFnbWVudHMgb24gdGhlIGN1cnJlbnQgc2xpZGUgc28gdGhhdCB0aGV5CgkgKiBoYXZlIHRoZSBhcHByb3ByaWF0ZSBjbGFzc2VzICgudmlzaWJsZSArIC5jdXJyZW50LWZyYWdtZW50KS4KCSAqCgkgKiBAcGFyYW0ge251bWJlcn0gW2luZGV4XSBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgZnJhZ21lbnQKCSAqIEBwYXJhbSB7YXJyYXl9IFtmcmFnbWVudHNdIEFycmF5IGNvbnRhaW5pbmcgYWxsIGZyYWdtZW50cwoJICogaW4gdGhlIGN1cnJlbnQgc2xpZGUKCSAqCgkgKiBAcmV0dXJuIHt7c2hvd246IGFycmF5LCBoaWRkZW46IGFycmF5fX0KCSAqLwoJZnVuY3Rpb24gdXBkYXRlRnJhZ21lbnRzKCBpbmRleCwgZnJhZ21lbnRzICkgewoKCQl2YXIgY2hhbmdlZEZyYWdtZW50cyA9IHsKCQkJc2hvd246IFtdLAoJCQloaWRkZW46IFtdCgkJfTsKCgkJaWYoIGN1cnJlbnRTbGlkZSAmJiBjb25maWcuZnJhZ21lbnRzICkgewoKCQkJZnJhZ21lbnRzID0gZnJhZ21lbnRzIHx8IHNvcnRGcmFnbWVudHMoIGN1cnJlbnRTbGlkZS5xdWVyeVNlbGVjdG9yQWxsKCAnLmZyYWdtZW50JyApICk7CgoJCQlpZiggZnJhZ21lbnRzLmxlbmd0aCApIHsKCgkJCQlpZiggdHlwZW9mIGluZGV4ICE9PSAnbnVtYmVyJyApIHsKCQkJCQl2YXIgY3VycmVudEZyYWdtZW50ID0gc29ydEZyYWdtZW50cyggY3VycmVudFNsaWRlLnF1ZXJ5U2VsZWN0b3JBbGwoICcuZnJhZ21lbnQudmlzaWJsZScgKSApLnBvcCgpOwoJCQkJCWlmKCBjdXJyZW50RnJhZ21lbnQgKSB7CgkJCQkJCWluZGV4ID0gcGFyc2VJbnQoIGN1cnJlbnRGcmFnbWVudC5nZXRBdHRyaWJ1dGUoICdkYXRhLWZyYWdtZW50LWluZGV4JyApIHx8IDAsIDEwICk7CgkJCQkJfQoJCQkJfQoKCQkJCXRvQXJyYXkoIGZyYWdtZW50cyApLmZvckVhY2goIGZ1bmN0aW9uKCBlbCwgaSApIHsKCgkJCQkJaWYoIGVsLmhhc0F0dHJpYnV0ZSggJ2RhdGEtZnJhZ21lbnQtaW5kZXgnICkgKSB7CgkJCQkJCWkgPSBwYXJzZUludCggZWwuZ2V0QXR0cmlidXRlKCAnZGF0YS1mcmFnbWVudC1pbmRleCcgKSwgMTAgKTsKCQkJCQl9CgoJCQkJCS8vIFZpc2libGUgZnJhZ21lbnRzCgkJCQkJaWYoIGkgPD0gaW5kZXggKSB7CgkJCQkJCWlmKCAhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAndmlzaWJsZScgKSApIGNoYW5nZWRGcmFnbWVudHMuc2hvd24ucHVzaCggZWwgKTsKCQkJCQkJZWwuY2xhc3NMaXN0LmFkZCggJ3Zpc2libGUnICk7CgkJCQkJCWVsLmNsYXNzTGlzdC5yZW1vdmUoICdjdXJyZW50LWZyYWdtZW50JyApOwoKCQkJCQkJLy8gQW5ub3VuY2UgdGhlIGZyYWdtZW50cyBvbmUgYnkgb25lIHRvIHRoZSBTY3JlZW4gUmVhZGVyCgkJCQkJCWRvbS5zdGF0dXNEaXYudGV4dENvbnRlbnQgPSBnZXRTdGF0dXNUZXh0KCBlbCApOwoKCQkJCQkJaWYoIGkgPT09IGluZGV4ICkgewoJCQkJCQkJZWwuY2xhc3NMaXN0LmFkZCggJ2N1cnJlbnQtZnJhZ21lbnQnICk7CgkJCQkJCQlzdGFydEVtYmVkZGVkQ29udGVudCggZWwgKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQkvLyBIaWRkZW4gZnJhZ21lbnRzCgkJCQkJZWxzZSB7CgkJCQkJCWlmKCBlbC5jbGFzc0xpc3QuY29udGFpbnMoICd2aXNpYmxlJyApICkgY2hhbmdlZEZyYWdtZW50cy5oaWRkZW4ucHVzaCggZWwgKTsKCQkJCQkJZWwuY2xhc3NMaXN0LnJlbW92ZSggJ3Zpc2libGUnICk7CgkJCQkJCWVsLmNsYXNzTGlzdC5yZW1vdmUoICdjdXJyZW50LWZyYWdtZW50JyApOwoJCQkJCX0KCgkJCQl9ICk7CgoJCQl9CgoJCX0KCgkJcmV0dXJuIGNoYW5nZWRGcmFnbWVudHM7CgoJfQoKCS8qKgoJICogTmF2aWdhdGUgdG8gdGhlIHNwZWNpZmllZCBzbGlkZSBmcmFnbWVudC4KCSAqCgkgKiBAcGFyYW0gez9udW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZnJhZ21lbnQgdGhhdAoJICogc2hvdWxkIGJlIHNob3duLCAtMSBtZWFucyBhbGwgYXJlIGludmlzaWJsZQoJICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldCBJbnRlZ2VyIG9mZnNldCB0byBhcHBseSB0byB0aGUKCSAqIGZyYWdtZW50IGluZGV4CgkgKgoJICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBhIGNoYW5nZSB3YXMgbWFkZSBpbiBhbnkKCSAqIGZyYWdtZW50cyB2aXNpYmlsaXR5IGFzIHBhcnQgb2YgdGhpcyBjYWxsCgkgKi8KCWZ1bmN0aW9uIG5hdmlnYXRlRnJhZ21lbnQoIGluZGV4LCBvZmZzZXQgKSB7CgoJCWlmKCBjdXJyZW50U2xpZGUgJiYgY29uZmlnLmZyYWdtZW50cyApIHsKCgkJCXZhciBmcmFnbWVudHMgPSBzb3J0RnJhZ21lbnRzKCBjdXJyZW50U2xpZGUucXVlcnlTZWxlY3RvckFsbCggJy5mcmFnbWVudCcgKSApOwoJCQlpZiggZnJhZ21lbnRzLmxlbmd0aCApIHsKCgkJCQkvLyBJZiBubyBpbmRleCBpcyBzcGVjaWZpZWQsIGZpbmQgdGhlIGN1cnJlbnQKCQkJCWlmKCB0eXBlb2YgaW5kZXggIT09ICdudW1iZXInICkgewoJCQkJCXZhciBsYXN0VmlzaWJsZUZyYWdtZW50ID0gc29ydEZyYWdtZW50cyggY3VycmVudFNsaWRlLnF1ZXJ5U2VsZWN0b3JBbGwoICcuZnJhZ21lbnQudmlzaWJsZScgKSApLnBvcCgpOwoKCQkJCQlpZiggbGFzdFZpc2libGVGcmFnbWVudCApIHsKCQkJCQkJaW5kZXggPSBwYXJzZUludCggbGFzdFZpc2libGVGcmFnbWVudC5nZXRBdHRyaWJ1dGUoICdkYXRhLWZyYWdtZW50LWluZGV4JyApIHx8IDAsIDEwICk7CgkJCQkJfQoJCQkJCWVsc2UgewoJCQkJCQlpbmRleCA9IC0xOwoJCQkJCX0KCQkJCX0KCgkJCQkvLyBJZiBhbiBvZmZzZXQgaXMgc3BlY2lmaWVkLCBhcHBseSBpdCB0byB0aGUgaW5kZXgKCQkJCWlmKCB0eXBlb2Ygb2Zmc2V0ID09PSAnbnVtYmVyJyApIHsKCQkJCQlpbmRleCArPSBvZmZzZXQ7CgkJCQl9CgoJCQkJdmFyIGNoYW5nZWRGcmFnbWVudHMgPSB1cGRhdGVGcmFnbWVudHMoIGluZGV4LCBmcmFnbWVudHMgKTsKCgkJCQlpZiggY2hhbmdlZEZyYWdtZW50cy5oaWRkZW4ubGVuZ3RoICkgewoJCQkJCWRpc3BhdGNoRXZlbnQoICdmcmFnbWVudGhpZGRlbicsIHsgZnJhZ21lbnQ6IGNoYW5nZWRGcmFnbWVudHMuaGlkZGVuWzBdLCBmcmFnbWVudHM6IGNoYW5nZWRGcmFnbWVudHMuaGlkZGVuIH0gKTsKCQkJCX0KCgkJCQlpZiggY2hhbmdlZEZyYWdtZW50cy5zaG93bi5sZW5ndGggKSB7CgkJCQkJZGlzcGF0Y2hFdmVudCggJ2ZyYWdtZW50c2hvd24nLCB7IGZyYWdtZW50OiBjaGFuZ2VkRnJhZ21lbnRzLnNob3duWzBdLCBmcmFnbWVudHM6IGNoYW5nZWRGcmFnbWVudHMuc2hvd24gfSApOwoJCQkJfQoKCQkJCXVwZGF0ZUNvbnRyb2xzKCk7CgkJCQl1cGRhdGVQcm9ncmVzcygpOwoKCQkJCWlmKCBjb25maWcuZnJhZ21lbnRJblVSTCApIHsKCQkJCQl3cml0ZVVSTCgpOwoJCQkJfQoKCQkJCXJldHVybiAhISggY2hhbmdlZEZyYWdtZW50cy5zaG93bi5sZW5ndGggfHwgY2hhbmdlZEZyYWdtZW50cy5oaWRkZW4ubGVuZ3RoICk7CgoJCQl9CgoJCX0KCgkJcmV0dXJuIGZhbHNlOwoKCX0KCgkvKioKCSAqIE5hdmlnYXRlIHRvIHRoZSBuZXh0IHNsaWRlIGZyYWdtZW50LgoJICoKCSAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlcmUgd2FzIGEgbmV4dCBmcmFnbWVudCwKCSAqIGZhbHNlIG90aGVyd2lzZQoJICovCglmdW5jdGlvbiBuZXh0RnJhZ21lbnQoKSB7CgoJCXJldHVybiBuYXZpZ2F0ZUZyYWdtZW50KCBudWxsLCAxICk7CgoJfQoKCS8qKgoJICogTmF2aWdhdGUgdG8gdGhlIHByZXZpb3VzIHNsaWRlIGZyYWdtZW50LgoJICoKCSAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlcmUgd2FzIGEgcHJldmlvdXMgZnJhZ21lbnQsCgkgKiBmYWxzZSBvdGhlcndpc2UKCSAqLwoJZnVuY3Rpb24gcHJldmlvdXNGcmFnbWVudCgpIHsKCgkJcmV0dXJuIG5hdmlnYXRlRnJhZ21lbnQoIG51bGwsIC0xICk7CgoJfQoKCS8qKgoJICogQ3VlcyBhIG5ldyBhdXRvbWF0ZWQgc2xpZGUgaWYgZW5hYmxlZCBpbiB0aGUgY29uZmlnLgoJICovCglmdW5jdGlvbiBjdWVBdXRvU2xpZGUoKSB7CgoJCWNhbmNlbEF1dG9TbGlkZSgpOwoKCQlpZiggY3VycmVudFNsaWRlICYmIGNvbmZpZy5hdXRvU2xpZGUgIT09IGZhbHNlICkgewoKCQkJdmFyIGZyYWdtZW50ID0gY3VycmVudFNsaWRlLnF1ZXJ5U2VsZWN0b3IoICcuY3VycmVudC1mcmFnbWVudCcgKTsKCgkJCS8vIFdoZW4gdGhlIHNsaWRlIGZpcnN0IGFwcGVhcnMgdGhlcmUgaXMgbm8gImN1cnJlbnQiIGZyYWdtZW50IHNvCgkJCS8vIHdlIGxvb2sgZm9yIGEgZGF0YS1hdXRvc2xpZGUgdGltaW5nIG9uIHRoZSBmaXJzdCBmcmFnbWVudAoJCQlpZiggIWZyYWdtZW50ICkgZnJhZ21lbnQgPSBjdXJyZW50U2xpZGUucXVlcnlTZWxlY3RvciggJy5mcmFnbWVudCcgKTsKCgkJCXZhciBmcmFnbWVudEF1dG9TbGlkZSA9IGZyYWdtZW50ID8gZnJhZ21lbnQuZ2V0QXR0cmlidXRlKCAnZGF0YS1hdXRvc2xpZGUnICkgOiBudWxsOwoJCQl2YXIgcGFyZW50QXV0b1NsaWRlID0gY3VycmVudFNsaWRlLnBhcmVudE5vZGUgPyBjdXJyZW50U2xpZGUucGFyZW50Tm9kZS5nZXRBdHRyaWJ1dGUoICdkYXRhLWF1dG9zbGlkZScgKSA6IG51bGw7CgkJCXZhciBzbGlkZUF1dG9TbGlkZSA9IGN1cnJlbnRTbGlkZS5nZXRBdHRyaWJ1dGUoICdkYXRhLWF1dG9zbGlkZScgKTsKCgkJCS8vIFBpY2sgdmFsdWUgaW4gdGhlIGZvbGxvd2luZyBwcmlvcml0eSBvcmRlcjoKCQkJLy8gMS4gQ3VycmVudCBmcmFnbWVudCdzIGRhdGEtYXV0b3NsaWRlCgkJCS8vIDIuIEN1cnJlbnQgc2xpZGUncyBkYXRhLWF1dG9zbGlkZQoJCQkvLyAzLiBQYXJlbnQgc2xpZGUncyBkYXRhLWF1dG9zbGlkZQoJCQkvLyA0LiBHbG9iYWwgYXV0b1NsaWRlIHNldHRpbmcKCQkJaWYoIGZyYWdtZW50QXV0b1NsaWRlICkgewoJCQkJYXV0b1NsaWRlID0gcGFyc2VJbnQoIGZyYWdtZW50QXV0b1NsaWRlLCAxMCApOwoJCQl9CgkJCWVsc2UgaWYoIHNsaWRlQXV0b1NsaWRlICkgewoJCQkJYXV0b1NsaWRlID0gcGFyc2VJbnQoIHNsaWRlQXV0b1NsaWRlLCAxMCApOwoJCQl9CgkJCWVsc2UgaWYoIHBhcmVudEF1dG9TbGlkZSApIHsKCQkJCWF1dG9TbGlkZSA9IHBhcnNlSW50KCBwYXJlbnRBdXRvU2xpZGUsIDEwICk7CgkJCX0KCQkJZWxzZSB7CgkJCQlhdXRvU2xpZGUgPSBjb25maWcuYXV0b1NsaWRlOwoJCQl9CgoJCQkvLyBJZiB0aGVyZSBhcmUgbWVkaWEgZWxlbWVudHMgd2l0aCBkYXRhLWF1dG9wbGF5LAoJCQkvLyBhdXRvbWF0aWNhbGx5IHNldCB0aGUgYXV0b1NsaWRlIGR1cmF0aW9uIHRvIHRoZQoJCQkvLyBsZW5ndGggb2YgdGhhdCBtZWRpYS4gTm90IGFwcGxpY2FibGUgaWYgdGhlIHNsaWRlCgkJCS8vIGlzIGRpdmlkZWQgdXAgaW50byBmcmFnbWVudHMuCgkJCS8vIHBsYXliYWNrUmF0ZSBpcyBhY2NvdW50ZWQgZm9yIGluIHRoZSBkdXJhdGlvbi4KCQkJaWYoIGN1cnJlbnRTbGlkZS5xdWVyeVNlbGVjdG9yQWxsKCAnLmZyYWdtZW50JyApLmxlbmd0aCA9PT0gMCApIHsKCQkJCXRvQXJyYXkoIGN1cnJlbnRTbGlkZS5xdWVyeVNlbGVjdG9yQWxsKCAndmlkZW8sIGF1ZGlvJyApICkuZm9yRWFjaCggZnVuY3Rpb24oIGVsICkgewoJCQkJCWlmKCBlbC5oYXNBdHRyaWJ1dGUoICdkYXRhLWF1dG9wbGF5JyApICkgewoJCQkJCQlpZiggYXV0b1NsaWRlICYmIChlbC5kdXJhdGlvbiAqIDEwMDAgLyBlbC5wbGF5YmFja1JhdGUgKSA+IGF1dG9TbGlkZSApIHsKCQkJCQkJCWF1dG9TbGlkZSA9ICggZWwuZHVyYXRpb24gKiAxMDAwIC8gZWwucGxheWJhY2tSYXRlICkgKyAxMDAwOwoJCQkJCQl9CgkJCQkJfQoJCQkJfSApOwoJCQl9CgoJCQkvLyBDdWUgdGhlIG5leHQgYXV0by1zbGlkZSBpZjoKCQkJLy8gLSBUaGVyZSBpcyBhbiBhdXRvU2xpZGUgdmFsdWUKCQkJLy8gLSBBdXRvLXNsaWRpbmcgaXNuJ3QgcGF1c2VkIGJ5IHRoZSB1c2VyCgkJCS8vIC0gVGhlIHByZXNlbnRhdGlvbiBpc24ndCBwYXVzZWQKCQkJLy8gLSBUaGUgb3ZlcnZpZXcgaXNuJ3QgYWN0aXZlCgkJCS8vIC0gVGhlIHByZXNlbnRhdGlvbiBpc24ndCBvdmVyCgkJCWlmKCBhdXRvU2xpZGUgJiYgIWF1dG9TbGlkZVBhdXNlZCAmJiAhaXNQYXVzZWQoKSAmJiAhaXNPdmVydmlldygpICYmICggIVJldmVhbC5pc0xhc3RTbGlkZSgpIHx8IGF2YWlsYWJsZUZyYWdtZW50cygpLm5leHQgfHwgY29uZmlnLmxvb3AgPT09IHRydWUgKSApIHsKCQkJCWF1dG9TbGlkZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQkJCQl0eXBlb2YgY29uZmlnLmF1dG9TbGlkZU1ldGhvZCA9PT0gJ2Z1bmN0aW9uJyA/IGNvbmZpZy5hdXRvU2xpZGVNZXRob2QoKSA6IG5hdmlnYXRlTmV4dCgpOwoJCQkJCWN1ZUF1dG9TbGlkZSgpOwoJCQkJfSwgYXV0b1NsaWRlICk7CgkJCQlhdXRvU2xpZGVTdGFydFRpbWUgPSBEYXRlLm5vdygpOwoJCQl9CgoJCQlpZiggYXV0b1NsaWRlUGxheWVyICkgewoJCQkJYXV0b1NsaWRlUGxheWVyLnNldFBsYXlpbmcoIGF1dG9TbGlkZVRpbWVvdXQgIT09IC0xICk7CgkJCX0KCgkJfQoKCX0KCgkvKioKCSAqIENhbmNlbHMgYW55IG9uZ29pbmcgcmVxdWVzdCB0byBhdXRvLXNsaWRlLgoJICovCglmdW5jdGlvbiBjYW5jZWxBdXRvU2xpZGUoKSB7CgoJCWNsZWFyVGltZW91dCggYXV0b1NsaWRlVGltZW91dCApOwoJCWF1dG9TbGlkZVRpbWVvdXQgPSAtMTsKCgl9CgoJZnVuY3Rpb24gcGF1c2VBdXRvU2xpZGUoKSB7CgoJCWlmKCBhdXRvU2xpZGUgJiYgIWF1dG9TbGlkZVBhdXNlZCApIHsKCQkJYXV0b1NsaWRlUGF1c2VkID0gdHJ1ZTsKCQkJZGlzcGF0Y2hFdmVudCggJ2F1dG9zbGlkZXBhdXNlZCcgKTsKCQkJY2xlYXJUaW1lb3V0KCBhdXRvU2xpZGVUaW1lb3V0ICk7CgoJCQlpZiggYXV0b1NsaWRlUGxheWVyICkgewoJCQkJYXV0b1NsaWRlUGxheWVyLnNldFBsYXlpbmcoIGZhbHNlICk7CgkJCX0KCQl9CgoJfQoKCWZ1bmN0aW9uIHJlc3VtZUF1dG9TbGlkZSgpIHsKCgkJaWYoIGF1dG9TbGlkZSAmJiBhdXRvU2xpZGVQYXVzZWQgKSB7CgkJCWF1dG9TbGlkZVBhdXNlZCA9IGZhbHNlOwoJCQlkaXNwYXRjaEV2ZW50KCAnYXV0b3NsaWRlcmVzdW1lZCcgKTsKCQkJY3VlQXV0b1NsaWRlKCk7CgkJfQoKCX0KCglmdW5jdGlvbiBuYXZpZ2F0ZUxlZnQoKSB7CgoJCS8vIFJldmVyc2UgZm9yIFJUTAoJCWlmKCBjb25maWcucnRsICkgewoJCQlpZiggKCBpc092ZXJ2aWV3KCkgfHwgbmV4dEZyYWdtZW50KCkgPT09IGZhbHNlICkgJiYgYXZhaWxhYmxlUm91dGVzKCkubGVmdCApIHsKCQkJCXNsaWRlKCBpbmRleGggKyAxLCBjb25maWcubmF2aWdhdGlvbk1vZGUgPT09ICdncmlkJyA/IGluZGV4diA6IHVuZGVmaW5lZCApOwoJCQl9CgkJfQoJCS8vIE5vcm1hbCBuYXZpZ2F0aW9uCgkJZWxzZSBpZiggKCBpc092ZXJ2aWV3KCkgfHwgcHJldmlvdXNGcmFnbWVudCgpID09PSBmYWxzZSApICYmIGF2YWlsYWJsZVJvdXRlcygpLmxlZnQgKSB7CgkJCXNsaWRlKCBpbmRleGggLSAxLCBjb25maWcubmF2aWdhdGlvbk1vZGUgPT09ICdncmlkJyA/IGluZGV4diA6IHVuZGVmaW5lZCApOwoJCX0KCgl9CgoJZnVuY3Rpb24gbmF2aWdhdGVSaWdodCgpIHsKCgkJaGFzTmF2aWdhdGVkUmlnaHQgPSB0cnVlOwoKCQkvLyBSZXZlcnNlIGZvciBSVEwKCQlpZiggY29uZmlnLnJ0bCApIHsKCQkJaWYoICggaXNPdmVydmlldygpIHx8IHByZXZpb3VzRnJhZ21lbnQoKSA9PT0gZmFsc2UgKSAmJiBhdmFpbGFibGVSb3V0ZXMoKS5yaWdodCApIHsKCQkJCXNsaWRlKCBpbmRleGggLSAxLCBjb25maWcubmF2aWdhdGlvbk1vZGUgPT09ICdncmlkJyA/IGluZGV4diA6IHVuZGVmaW5lZCApOwoJCQl9CgkJfQoJCS8vIE5vcm1hbCBuYXZpZ2F0aW9uCgkJZWxzZSBpZiggKCBpc092ZXJ2aWV3KCkgfHwgbmV4dEZyYWdtZW50KCkgPT09IGZhbHNlICkgJiYgYXZhaWxhYmxlUm91dGVzKCkucmlnaHQgKSB7CgkJCXNsaWRlKCBpbmRleGggKyAxLCBjb25maWcubmF2aWdhdGlvbk1vZGUgPT09ICdncmlkJyA/IGluZGV4diA6IHVuZGVmaW5lZCApOwoJCX0KCgl9CgoJZnVuY3Rpb24gbmF2aWdhdGVVcCgpIHsKCgkJLy8gUHJpb3JpdGl6ZSBoaWRpbmcgZnJhZ21lbnRzCgkJaWYoICggaXNPdmVydmlldygpIHx8IHByZXZpb3VzRnJhZ21lbnQoKSA9PT0gZmFsc2UgKSAmJiBhdmFpbGFibGVSb3V0ZXMoKS51cCApIHsKCQkJc2xpZGUoIGluZGV4aCwgaW5kZXh2IC0gMSApOwoJCX0KCgl9CgoJZnVuY3Rpb24gbmF2aWdhdGVEb3duKCkgewoKCQloYXNOYXZpZ2F0ZWREb3duID0gdHJ1ZTsKCgkJLy8gUHJpb3JpdGl6ZSByZXZlYWxpbmcgZnJhZ21lbnRzCgkJaWYoICggaXNPdmVydmlldygpIHx8IG5leHRGcmFnbWVudCgpID09PSBmYWxzZSApICYmIGF2YWlsYWJsZVJvdXRlcygpLmRvd24gKSB7CgkJCXNsaWRlKCBpbmRleGgsIGluZGV4diArIDEgKTsKCQl9CgoJfQoKCS8qKgoJICogTmF2aWdhdGVzIGJhY2t3YXJkcywgcHJpb3JpdGl6ZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKCSAqIDEpIFByZXZpb3VzIGZyYWdtZW50CgkgKiAyKSBQcmV2aW91cyB2ZXJ0aWNhbCBzbGlkZQoJICogMykgUHJldmlvdXMgaG9yaXpvbnRhbCBzbGlkZQoJICovCglmdW5jdGlvbiBuYXZpZ2F0ZVByZXYoKSB7CgoJCS8vIFByaW9yaXRpemUgcmV2ZWFsaW5nIGZyYWdtZW50cwoJCWlmKCBwcmV2aW91c0ZyYWdtZW50KCkgPT09IGZhbHNlICkgewoJCQlpZiggYXZhaWxhYmxlUm91dGVzKCkudXAgKSB7CgkJCQluYXZpZ2F0ZVVwKCk7CgkJCX0KCQkJZWxzZSB7CgkJCQkvLyBGZXRjaCB0aGUgcHJldmlvdXMgaG9yaXpvbnRhbCBzbGlkZSwgaWYgdGhlcmUgaXMgb25lCgkJCQl2YXIgcHJldmlvdXNTbGlkZTsKCgkJCQlpZiggY29uZmlnLnJ0bCApIHsKCQkJCQlwcmV2aW91c1NsaWRlID0gdG9BcnJheSggZG9tLndyYXBwZXIucXVlcnlTZWxlY3RvckFsbCggSE9SSVpPTlRBTF9TTElERVNfU0VMRUNUT1IgKyAnLmZ1dHVyZScgKSApLnBvcCgpOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJcHJldmlvdXNTbGlkZSA9IHRvQXJyYXkoIGRvbS53cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoIEhPUklaT05UQUxfU0xJREVTX1NFTEVDVE9SICsgJy5wYXN0JyApICkucG9wKCk7CgkJCQl9CgoJCQkJaWYoIHByZXZpb3VzU2xpZGUgKSB7CgkJCQkJdmFyIHYgPSAoIHByZXZpb3VzU2xpZGUucXVlcnlTZWxlY3RvckFsbCggJ3NlY3Rpb24nICkubGVuZ3RoIC0gMSApIHx8IHVuZGVmaW5lZDsKCQkJCQl2YXIgaCA9IGluZGV4aCAtIDE7CgkJCQkJc2xpZGUoIGgsIHYgKTsKCQkJCX0KCQkJfQoJCX0KCgl9CgoJLyoqCgkgKiBUaGUgcmV2ZXJzZSBvZiAjbmF2aWdhdGVQcmV2KCkuCgkgKi8KCWZ1bmN0aW9uIG5hdmlnYXRlTmV4dCgpIHsKCgkJaGFzTmF2aWdhdGVkUmlnaHQgPSB0cnVlOwoJCWhhc05hdmlnYXRlZERvd24gPSB0cnVlOwoKCQkvLyBQcmlvcml0aXplIHJldmVhbGluZyBmcmFnbWVudHMKCQlpZiggbmV4dEZyYWdtZW50KCkgPT09IGZhbHNlICkgewoKCQkJdmFyIHJvdXRlcyA9IGF2YWlsYWJsZVJvdXRlcygpOwoKCQkJLy8gV2hlbiBsb29waW5nIGlzIGVuYWJsZWQgYHJvdXRlcy5kb3duYCBpcyBhbHdheXMgYXZhaWxhYmxlCgkJCS8vIHNvIHdlIG5lZWQgYSBzZXBhcmF0ZSBjaGVjayBmb3Igd2hlbiB3ZSd2ZSByZWFjaGVkIHRoZQoJCQkvLyBlbmQgb2YgYSBzdGFjayBhbmQgc2hvdWxkIG1vdmUgaG9yaXpvbnRhbGx5CgkJCWlmKCByb3V0ZXMuZG93biAmJiByb3V0ZXMucmlnaHQgJiYgY29uZmlnLmxvb3AgJiYgUmV2ZWFsLmlzTGFzdFZlcnRpY2FsU2xpZGUoIGN1cnJlbnRTbGlkZSApICkgewoJCQkJcm91dGVzLmRvd24gPSBmYWxzZTsKCQkJfQoKCQkJaWYoIHJvdXRlcy5kb3duICkgewoJCQkJbmF2aWdhdGVEb3duKCk7CgkJCX0KCQkJZWxzZSBpZiggY29uZmlnLnJ0bCApIHsKCQkJCW5hdmlnYXRlTGVmdCgpOwoJCQl9CgkJCWVsc2UgewoJCQkJbmF2aWdhdGVSaWdodCgpOwoJCQl9CgkJfQoKCX0KCgkvKioKCSAqIENoZWNrcyBpZiB0aGUgdGFyZ2V0IGVsZW1lbnQgcHJldmVudHMgdGhlIHRyaWdnZXJpbmcgb2YKCSAqIHN3aXBlIG5hdmlnYXRpb24uCgkgKi8KCWZ1bmN0aW9uIGlzU3dpcGVQcmV2ZW50ZWQoIHRhcmdldCApIHsKCgkJd2hpbGUoIHRhcmdldCAmJiB0eXBlb2YgdGFyZ2V0Lmhhc0F0dHJpYnV0ZSA9PT0gJ2Z1bmN0aW9uJyApIHsKCQkJaWYoIHRhcmdldC5oYXNBdHRyaWJ1dGUoICdkYXRhLXByZXZlbnQtc3dpcGUnICkgKSByZXR1cm4gdHJ1ZTsKCQkJdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7CgkJfQoKCQlyZXR1cm4gZmFsc2U7CgoJfQoKCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFVkVOVFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCgoJLyoqCgkgKiBDYWxsZWQgYnkgYWxsIGV2ZW50IGhhbmRsZXJzIHRoYXQgYXJlIGJhc2VkIG9uIHVzZXIKCSAqIGlucHV0LgoJICoKCSAqIEBwYXJhbSB7b2JqZWN0fSBbZXZlbnRdCgkgKi8KCWZ1bmN0aW9uIG9uVXNlcklucHV0KCBldmVudCApIHsKCgkJaWYoIGNvbmZpZy5hdXRvU2xpZGVTdG9wcGFibGUgKSB7CgkJCXBhdXNlQXV0b1NsaWRlKCk7CgkJfQoKCX0KCgkvKioKCSAqIENhbGxlZCB3aGVuZXZlciB0aGVyZSBpcyBtb3VzZSBpbnB1dCBhdCB0aGUgZG9jdW1lbnQgbGV2ZWwKCSAqIHRvIGRldGVybWluZSBpZiB0aGUgY3Vyc29yIGlzIGFjdGl2ZSBvciBub3QuCgkgKgoJICogQHBhcmFtIHtvYmplY3R9IGV2ZW50CgkgKi8KCWZ1bmN0aW9uIG9uRG9jdW1lbnRDdXJzb3JBY3RpdmUoIGV2ZW50ICkgewoKCQlzaG93Q3Vyc29yKCk7CgoJCWNsZWFyVGltZW91dCggY3Vyc29ySW5hY3RpdmVUaW1lb3V0ICk7CgoJCWN1cnNvckluYWN0aXZlVGltZW91dCA9IHNldFRpbWVvdXQoIGhpZGVDdXJzb3IsIGNvbmZpZy5oaWRlQ3Vyc29yVGltZSApOwoKCX0KCgkvKioKCSAqIEhhbmRsZXIgZm9yIHRoZSBkb2N1bWVudCBsZXZlbCAna2V5cHJlc3MnIGV2ZW50LgoJICoKCSAqIEBwYXJhbSB7b2JqZWN0fSBldmVudAoJICovCglmdW5jdGlvbiBvbkRvY3VtZW50S2V5UHJlc3MoIGV2ZW50ICkgewoKCQkvLyBDaGVjayBpZiB0aGUgcHJlc3NlZCBrZXkgaXMgcXVlc3Rpb24gbWFyawoJCWlmKCBldmVudC5zaGlmdEtleSAmJiBldmVudC5jaGFyQ29kZSA9PT0gNjMgKSB7CgkJCXRvZ2dsZUhlbHAoKTsKCQl9CgoJfQoKCS8qKgoJICogSGFuZGxlciBmb3IgdGhlIGRvY3VtZW50IGxldmVsICdrZXlkb3duJyBldmVudC4KCSAqCgkgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQKCSAqLwoJZnVuY3Rpb24gb25Eb2N1bWVudEtleURvd24oIGV2ZW50ICkgewoKCQkvLyBJZiB0aGVyZSdzIGEgY29uZGl0aW9uIHNwZWNpZmllZCBhbmQgaXQgcmV0dXJucyBmYWxzZSwKCQkvLyBpZ25vcmUgdGhpcyBldmVudAoJCWlmKCB0eXBlb2YgY29uZmlnLmtleWJvYXJkQ29uZGl0aW9uID09PSAnZnVuY3Rpb24nICYmIGNvbmZpZy5rZXlib2FyZENvbmRpdGlvbihldmVudCkgPT09IGZhbHNlICkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJCS8vIFNob3J0aGFuZAoJCXZhciBrZXlDb2RlID0gZXZlbnQua2V5Q29kZTsKCgkJLy8gUmVtZW1iZXIgaWYgYXV0by1zbGlkaW5nIHdhcyBwYXVzZWQgc28gd2UgY2FuIHRvZ2dsZSBpdAoJCXZhciBhdXRvU2xpZGVXYXNQYXVzZWQgPSBhdXRvU2xpZGVQYXVzZWQ7CgoJCW9uVXNlcklucHV0KCBldmVudCApOwoKCQkvLyBJcyB0aGVyZSBhIGZvY3VzZWQgZWxlbWVudCB0aGF0IGNvdWxkIGJlIHVzaW5nIHRoZSBrZXlib2FyZD8KCQl2YXIgYWN0aXZlRWxlbWVudElzQ0UgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuY29udGVudEVkaXRhYmxlICE9PSAnaW5oZXJpdCc7CgkJdmFyIGFjdGl2ZUVsZW1lbnRJc0lucHV0ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50LnRhZ05hbWUgJiYgL2lucHV0fHRleHRhcmVhL2kudGVzdCggZG9jdW1lbnQuYWN0aXZlRWxlbWVudC50YWdOYW1lICk7CgkJdmFyIGFjdGl2ZUVsZW1lbnRJc05vdGVzID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmNsYXNzTmFtZSAmJiAvc3BlYWtlci1ub3Rlcy9pLnRlc3QoIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuY2xhc3NOYW1lKTsKCgkJLy8gV2hpdGVsaXN0IHNwZWNpZmljIG1vZGlmaWVkICsga2V5Y29kZSBjb21iaW5hdGlvbnMKCQl2YXIgcHJldlNsaWRlU2hvcnRjdXQgPSBldmVudC5zaGlmdEtleSAmJiBldmVudC5rZXlDb2RlID09PSAzMjsKCQl2YXIgZmlyc3RTbGlkZVNob3J0Y3V0ID0gZXZlbnQuc2hpZnRLZXkgJiYga2V5Q29kZSA9PT0gMzc7CgkJdmFyIGxhc3RTbGlkZVNob3J0Y3V0ID0gZXZlbnQuc2hpZnRLZXkgJiYga2V5Q29kZSA9PT0gMzk7CgoJCS8vIFByZXZlbnQgYWxsIG90aGVyIGV2ZW50cyB3aGVuIGEgbW9kaWZpZXIgaXMgcHJlc3NlZAoJCXZhciB1bnVzZWRNb2RpZmllciA9IAkhcHJldlNsaWRlU2hvcnRjdXQgJiYgIWZpcnN0U2xpZGVTaG9ydGN1dCAmJiAhbGFzdFNsaWRlU2hvcnRjdXQgJiYKCQkJCQkJCQkoIGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkgKTsKCgkJLy8gRGlzcmVnYXJkIHRoZSBldmVudCBpZiB0aGVyZSdzIGEgZm9jdXNlZCBlbGVtZW50IG9yIGEKCQkvLyBrZXlib2FyZCBtb2RpZmllciBrZXkgaXMgcHJlc2VudAoJCWlmKCBhY3RpdmVFbGVtZW50SXNDRSB8fCBhY3RpdmVFbGVtZW50SXNJbnB1dCB8fCBhY3RpdmVFbGVtZW50SXNOb3RlcyB8fCB1bnVzZWRNb2RpZmllciApIHJldHVybjsKCgkJLy8gV2hpbGUgcGF1c2VkIG9ubHkgYWxsb3cgcmVzdW1lIGtleWJvYXJkIGV2ZW50czsgJ2InLCAndicsICcuJwoJCXZhciByZXN1bWVLZXlDb2RlcyA9IFs2Niw4NiwxOTAsMTkxXTsKCQl2YXIga2V5OwoKCQkvLyBDdXN0b20ga2V5IGJpbmRpbmdzIGZvciB0b2dnbGVQYXVzZSBzaG91bGQgYmUgYWJsZSB0byByZXN1bWUKCQlpZiggdHlwZW9mIGNvbmZpZy5rZXlib2FyZCA9PT0gJ29iamVjdCcgKSB7CgkJCWZvcigga2V5IGluIGNvbmZpZy5rZXlib2FyZCApIHsKCQkJCWlmKCBjb25maWcua2V5Ym9hcmRba2V5XSA9PT0gJ3RvZ2dsZVBhdXNlJyApIHsKCQkJCQlyZXN1bWVLZXlDb2Rlcy5wdXNoKCBwYXJzZUludCgga2V5LCAxMCApICk7CgkJCQl9CgkJCX0KCQl9CgoJCWlmKCBpc1BhdXNlZCgpICYmIHJlc3VtZUtleUNvZGVzLmluZGV4T2YoIGtleUNvZGUgKSA9PT0gLTEgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIFVzZSBsaW5lYXIgbmF2aWdhdGlvbiBpZiB3ZSdyZSBjb25maWd1cmVkIHRvIE9SIGlmCgkJLy8gdGhlIHByZXNlbnRhdGlvbiBpcyBvbmUtZGltZW5zaW9uYWwKCQl2YXIgdXNlTGluZWFyTW9kZSA9IGNvbmZpZy5uYXZpZ2F0aW9uTW9kZSA9PT0gJ2xpbmVhcicgfHwgIWhhc0hvcml6b250YWxTbGlkZXMoKSB8fCAhaGFzVmVydGljYWxTbGlkZXMoKTsKCgkJdmFyIHRyaWdnZXJlZCA9IGZhbHNlOwoKCQkvLyAxLiBVc2VyIGRlZmluZWQga2V5IGJpbmRpbmdzCgkJaWYoIHR5cGVvZiBjb25maWcua2V5Ym9hcmQgPT09ICdvYmplY3QnICkgewoKCQkJZm9yKCBrZXkgaW4gY29uZmlnLmtleWJvYXJkICkgewoKCQkJCS8vIENoZWNrIGlmIHRoaXMgYmluZGluZyBtYXRjaGVzIHRoZSBwcmVzc2VkIGtleQoJCQkJaWYoIHBhcnNlSW50KCBrZXksIDEwICkgPT09IGtleUNvZGUgKSB7CgoJCQkJCXZhciB2YWx1ZSA9IGNvbmZpZy5rZXlib2FyZFsga2V5IF07CgoJCQkJCS8vIENhbGxiYWNrIGZ1bmN0aW9uCgkJCQkJaWYoIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyApIHsKCQkJCQkJdmFsdWUuYXBwbHkoIG51bGwsIFsgZXZlbnQgXSApOwoJCQkJCX0KCQkJCQkvLyBTdHJpbmcgc2hvcnRjdXRzIHRvIHJldmVhbC5qcyBBUEkKCQkJCQllbHNlIGlmKCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBSZXZlYWxbIHZhbHVlIF0gPT09ICdmdW5jdGlvbicgKSB7CgkJCQkJCVJldmVhbFsgdmFsdWUgXS5jYWxsKCk7CgkJCQkJfQoKCQkJCQl0cmlnZ2VyZWQgPSB0cnVlOwoKCQkJCX0KCgkJCX0KCgkJfQoKCQkvLyAyLiBSZWdpc3RlcmVkIGN1c3RvbSBrZXkgYmluZGluZ3MKCQlpZiggdHJpZ2dlcmVkID09PSBmYWxzZSApIHsKCgkJCWZvcigga2V5IGluIHJlZ2lzdGVyZWRLZXlCaW5kaW5ncyApIHsKCgkJCQkvLyBDaGVjayBpZiB0aGlzIGJpbmRpbmcgbWF0Y2hlcyB0aGUgcHJlc3NlZCBrZXkKCQkJCWlmKCBwYXJzZUludCgga2V5LCAxMCApID09PSBrZXlDb2RlICkgewoKCQkJCQl2YXIgYWN0aW9uID0gcmVnaXN0ZXJlZEtleUJpbmRpbmdzWyBrZXkgXS5jYWxsYmFjazsKCgkJCQkJLy8gQ2FsbGJhY2sgZnVuY3Rpb24KCQkJCQlpZiggdHlwZW9mIGFjdGlvbiA9PT0gJ2Z1bmN0aW9uJyApIHsKCQkJCQkJYWN0aW9uLmFwcGx5KCBudWxsLCBbIGV2ZW50IF0gKTsKCQkJCQl9CgkJCQkJLy8gU3RyaW5nIHNob3J0Y3V0cyB0byByZXZlYWwuanMgQVBJCgkJCQkJZWxzZSBpZiggdHlwZW9mIGFjdGlvbiA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIFJldmVhbFsgYWN0aW9uIF0gPT09ICdmdW5jdGlvbicgKSB7CgkJCQkJCVJldmVhbFsgYWN0aW9uIF0uY2FsbCgpOwoJCQkJCX0KCgkJCQkJdHJpZ2dlcmVkID0gdHJ1ZTsKCQkJCX0KCQkJfQoJCX0KCgkJLy8gMy4gU3lzdGVtIGRlZmluZWQga2V5IGJpbmRpbmdzCgkJaWYoIHRyaWdnZXJlZCA9PT0gZmFsc2UgKSB7CgoJCQkvLyBBc3N1bWUgdHJ1ZSBhbmQgdHJ5IHRvIHByb3ZlIGZhbHNlCgkJCXRyaWdnZXJlZCA9IHRydWU7CgoJCQkvLyBQLCBQQUdFIFVQCgkJCWlmKCBrZXlDb2RlID09PSA4MCB8fCBrZXlDb2RlID09PSAzMyApIHsKCQkJCW5hdmlnYXRlUHJldigpOwoJCQl9CgkJCS8vIE4sIFBBR0UgRE9XTgoJCQllbHNlIGlmKCBrZXlDb2RlID09PSA3OCB8fCBrZXlDb2RlID09PSAzNCApIHsKCQkJCW5hdmlnYXRlTmV4dCgpOwoJCQl9CgkJCS8vIEgsIExFRlQKCQkJZWxzZSBpZigga2V5Q29kZSA9PT0gNzIgfHwga2V5Q29kZSA9PT0gMzcgKSB7CgkJCQlpZiggZmlyc3RTbGlkZVNob3J0Y3V0ICkgewoJCQkJCXNsaWRlKCAwICk7CgkJCQl9CgkJCQllbHNlIGlmKCAhaXNPdmVydmlldygpICYmIHVzZUxpbmVhck1vZGUgKSB7CgkJCQkJbmF2aWdhdGVQcmV2KCk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQluYXZpZ2F0ZUxlZnQoKTsKCQkJCX0KCQkJfQoJCQkvLyBMLCBSSUdIVAoJCQllbHNlIGlmKCBrZXlDb2RlID09PSA3NiB8fCBrZXlDb2RlID09PSAzOSApIHsKCQkJCWlmKCBsYXN0U2xpZGVTaG9ydGN1dCApIHsKCQkJCQlzbGlkZSggTnVtYmVyLk1BWF9WQUxVRSApOwoJCQkJfQoJCQkJZWxzZSBpZiggIWlzT3ZlcnZpZXcoKSAmJiB1c2VMaW5lYXJNb2RlICkgewoJCQkJCW5hdmlnYXRlTmV4dCgpOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJbmF2aWdhdGVSaWdodCgpOwoJCQkJfQoJCQl9CgkJCS8vIEssIFVQCgkJCWVsc2UgaWYoIGtleUNvZGUgPT09IDc1IHx8IGtleUNvZGUgPT09IDM4ICkgewoJCQkJaWYoICFpc092ZXJ2aWV3KCkgJiYgdXNlTGluZWFyTW9kZSApIHsKCQkJCQluYXZpZ2F0ZVByZXYoKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCW5hdmlnYXRlVXAoKTsKCQkJCX0KCQkJfQoJCQkvLyBKLCBET1dOCgkJCWVsc2UgaWYoIGtleUNvZGUgPT09IDc0IHx8IGtleUNvZGUgPT09IDQwICkgewoJCQkJaWYoICFpc092ZXJ2aWV3KCkgJiYgdXNlTGluZWFyTW9kZSApIHsKCQkJCQluYXZpZ2F0ZU5leHQoKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCW5hdmlnYXRlRG93bigpOwoJCQkJfQoJCQl9CgkJCS8vIEhPTUUKCQkJZWxzZSBpZigga2V5Q29kZSA9PT0gMzYgKSB7CgkJCQlzbGlkZSggMCApOwoJCQl9CgkJCS8vIEVORAoJCQllbHNlIGlmKCBrZXlDb2RlID09PSAzNSApIHsKCQkJCXNsaWRlKCBOdW1iZXIuTUFYX1ZBTFVFICk7CgkJCX0KCQkJLy8gU1BBQ0UKCQkJZWxzZSBpZigga2V5Q29kZSA9PT0gMzIgKSB7CgkJCQlpZiggaXNPdmVydmlldygpICkgewoJCQkJCWRlYWN0aXZhdGVPdmVydmlldygpOwoJCQkJfQoJCQkJaWYoIGV2ZW50LnNoaWZ0S2V5ICkgewoJCQkJCW5hdmlnYXRlUHJldigpOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJbmF2aWdhdGVOZXh0KCk7CgkJCQl9CgkJCX0KCQkJLy8gVFdPLVNQT1QsIFNFTUlDT0xPTiwgQiwgViwgUEVSSU9ELCBMT0dJVEVDSCBQUkVTRU5URVIgVE9PTFMgIkJMQUNLIFNDUkVFTiIgQlVUVE9OCgkJCWVsc2UgaWYoIGtleUNvZGUgPT09IDU4IHx8IGtleUNvZGUgPT09IDU5IHx8IGtleUNvZGUgPT09IDY2IHx8IGtleUNvZGUgPT09IDg2IHx8IGtleUNvZGUgPT09IDE5MCB8fCBrZXlDb2RlID09PSAxOTEgKSB7CgkJCQl0b2dnbGVQYXVzZSgpOwoJCQl9CgkJCS8vIEYKCQkJZWxzZSBpZigga2V5Q29kZSA9PT0gNzAgKSB7CgkJCQllbnRlckZ1bGxzY3JlZW4oKTsKCQkJfQoJCQkvLyBBCgkJCWVsc2UgaWYoIGtleUNvZGUgPT09IDY1ICkgewoJCQkJaWYgKCBjb25maWcuYXV0b1NsaWRlU3RvcHBhYmxlICkgewoJCQkJCXRvZ2dsZUF1dG9TbGlkZSggYXV0b1NsaWRlV2FzUGF1c2VkICk7CgkJCQl9CgkJCX0KCQkJZWxzZSB7CgkJCQl0cmlnZ2VyZWQgPSBmYWxzZTsKCQkJfQoKCQl9CgoJCS8vIElmIHRoZSBpbnB1dCByZXN1bHRlZCBpbiBhIHRyaWdnZXJlZCBhY3Rpb24gd2Ugc2hvdWxkIHByZXZlbnQKCQkvLyB0aGUgYnJvd3NlcnMgZGVmYXVsdCBiZWhhdmlvcgoJCWlmKCB0cmlnZ2VyZWQgKSB7CgkJCWV2ZW50LnByZXZlbnREZWZhdWx0ICYmIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJfQoJCS8vIEVTQyBvciBPIGtleQoJCWVsc2UgaWYgKCAoIGtleUNvZGUgPT09IDI3IHx8IGtleUNvZGUgPT09IDc5ICkgJiYgZmVhdHVyZXMudHJhbnNmb3JtczNkICkgewoJCQlpZiggZG9tLm92ZXJsYXkgKSB7CgkJCQljbG9zZU92ZXJsYXkoKTsKCQkJfQoJCQllbHNlIHsKCQkJCXRvZ2dsZU92ZXJ2aWV3KCk7CgkJCX0KCgkJCWV2ZW50LnByZXZlbnREZWZhdWx0ICYmIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJfQoKCQkvLyBJZiBhdXRvLXNsaWRpbmcgaXMgZW5hYmxlZCB3ZSBuZWVkIHRvIGN1ZSB1cAoJCS8vIGFub3RoZXIgdGltZW91dAoJCWN1ZUF1dG9TbGlkZSgpOwoKCX0KCgkvKioKCSAqIEhhbmRsZXIgZm9yIHRoZSAndG91Y2hzdGFydCcgZXZlbnQsIGVuYWJsZXMgc3VwcG9ydCBmb3IKCSAqIHN3aXBlIGFuZCBwaW5jaCBnZXN0dXJlcy4KCSAqCgkgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQKCSAqLwoJZnVuY3Rpb24gb25Ub3VjaFN0YXJ0KCBldmVudCApIHsKCgkJaWYoIGlzU3dpcGVQcmV2ZW50ZWQoIGV2ZW50LnRhcmdldCApICkgcmV0dXJuIHRydWU7CgoJCXRvdWNoLnN0YXJ0WCA9IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WDsKCQl0b3VjaC5zdGFydFkgPSBldmVudC50b3VjaGVzWzBdLmNsaWVudFk7CgkJdG91Y2guc3RhcnRDb3VudCA9IGV2ZW50LnRvdWNoZXMubGVuZ3RoOwoKCX0KCgkvKioKCSAqIEhhbmRsZXIgZm9yIHRoZSAndG91Y2htb3ZlJyBldmVudC4KCSAqCgkgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQKCSAqLwoJZnVuY3Rpb24gb25Ub3VjaE1vdmUoIGV2ZW50ICkgewoKCQlpZiggaXNTd2lwZVByZXZlbnRlZCggZXZlbnQudGFyZ2V0ICkgKSByZXR1cm4gdHJ1ZTsKCgkJLy8gRWFjaCB0b3VjaCBzaG91bGQgb25seSB0cmlnZ2VyIG9uZSBhY3Rpb24KCQlpZiggIXRvdWNoLmNhcHR1cmVkICkgewoJCQlvblVzZXJJbnB1dCggZXZlbnQgKTsKCgkJCXZhciBjdXJyZW50WCA9IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WDsKCQkJdmFyIGN1cnJlbnRZID0gZXZlbnQudG91Y2hlc1swXS5jbGllbnRZOwoKCQkJLy8gVGhlcmUgd2FzIG9ubHkgb25lIHRvdWNoIHBvaW50LCBsb29rIGZvciBhIHN3aXBlCgkJCWlmKCBldmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMSAmJiB0b3VjaC5zdGFydENvdW50ICE9PSAyICkgewoKCQkJCXZhciBkZWx0YVggPSBjdXJyZW50WCAtIHRvdWNoLnN0YXJ0WCwKCQkJCQlkZWx0YVkgPSBjdXJyZW50WSAtIHRvdWNoLnN0YXJ0WTsKCgkJCQlpZiggZGVsdGFYID4gdG91Y2gudGhyZXNob2xkICYmIE1hdGguYWJzKCBkZWx0YVggKSA+IE1hdGguYWJzKCBkZWx0YVkgKSApIHsKCQkJCQl0b3VjaC5jYXB0dXJlZCA9IHRydWU7CgkJCQkJbmF2aWdhdGVMZWZ0KCk7CgkJCQl9CgkJCQllbHNlIGlmKCBkZWx0YVggPCAtdG91Y2gudGhyZXNob2xkICYmIE1hdGguYWJzKCBkZWx0YVggKSA+IE1hdGguYWJzKCBkZWx0YVkgKSApIHsKCQkJCQl0b3VjaC5jYXB0dXJlZCA9IHRydWU7CgkJCQkJbmF2aWdhdGVSaWdodCgpOwoJCQkJfQoJCQkJZWxzZSBpZiggZGVsdGFZID4gdG91Y2gudGhyZXNob2xkICkgewoJCQkJCXRvdWNoLmNhcHR1cmVkID0gdHJ1ZTsKCQkJCQluYXZpZ2F0ZVVwKCk7CgkJCQl9CgkJCQllbHNlIGlmKCBkZWx0YVkgPCAtdG91Y2gudGhyZXNob2xkICkgewoJCQkJCXRvdWNoLmNhcHR1cmVkID0gdHJ1ZTsKCQkJCQluYXZpZ2F0ZURvd24oKTsKCQkJCX0KCgkJCQkvLyBJZiB3ZSdyZSBlbWJlZGRlZCwgb25seSBibG9jayB0b3VjaCBldmVudHMgaWYgdGhleSBoYXZlCgkJCQkvLyB0cmlnZ2VyZWQgYW4gYWN0aW9uCgkJCQlpZiggY29uZmlnLmVtYmVkZGVkICkgewoJCQkJCWlmKCB0b3VjaC5jYXB0dXJlZCB8fCBpc1ZlcnRpY2FsU2xpZGUoIGN1cnJlbnRTbGlkZSApICkgewoJCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJCX0KCQkJCX0KCQkJCS8vIE5vdCBlbWJlZGRlZD8gQmxvY2sgdGhlbSBhbGwgdG8gYXZvaWQgbmVlZGxlc3MgdG9zc2luZwoJCQkJLy8gYXJvdW5kIG9mIHRoZSB2aWV3cG9ydCBpbiBpT1MKCQkJCWVsc2UgewoJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQl9CgoJCQl9CgkJfQoJCS8vIFRoZXJlJ3MgYSBidWcgd2l0aCBzd2lwaW5nIG9uIHNvbWUgQW5kcm9pZCBkZXZpY2VzIHVubGVzcwoJCS8vIHRoZSBkZWZhdWx0IGFjdGlvbiBpcyBhbHdheXMgcHJldmVudGVkCgkJZWxzZSBpZiggVUEubWF0Y2goIC9hbmRyb2lkL2dpICkgKSB7CgkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJfQoKCX0KCgkvKioKCSAqIEhhbmRsZXIgZm9yIHRoZSAndG91Y2hlbmQnIGV2ZW50LgoJICoKCSAqIEBwYXJhbSB7b2JqZWN0fSBldmVudAoJICovCglmdW5jdGlvbiBvblRvdWNoRW5kKCBldmVudCApIHsKCgkJdG91Y2guY2FwdHVyZWQgPSBmYWxzZTsKCgl9CgoJLyoqCgkgKiBDb252ZXJ0IHBvaW50ZXIgZG93biB0byB0b3VjaCBzdGFydC4KCSAqCgkgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQKCSAqLwoJZnVuY3Rpb24gb25Qb2ludGVyRG93biggZXZlbnQgKSB7CgoJCWlmKCBldmVudC5wb2ludGVyVHlwZSA9PT0gZXZlbnQuTVNQT0lOVEVSX1RZUEVfVE9VQ0ggfHwgZXZlbnQucG9pbnRlclR5cGUgPT09ICJ0b3VjaCIgKSB7CgkJCWV2ZW50LnRvdWNoZXMgPSBbeyBjbGllbnRYOiBldmVudC5jbGllbnRYLCBjbGllbnRZOiBldmVudC5jbGllbnRZIH1dOwoJCQlvblRvdWNoU3RhcnQoIGV2ZW50ICk7CgkJfQoKCX0KCgkvKioKCSAqIENvbnZlcnQgcG9pbnRlciBtb3ZlIHRvIHRvdWNoIG1vdmUuCgkgKgoJICogQHBhcmFtIHtvYmplY3R9IGV2ZW50CgkgKi8KCWZ1bmN0aW9uIG9uUG9pbnRlck1vdmUoIGV2ZW50ICkgewoKCQlpZiggZXZlbnQucG9pbnRlclR5cGUgPT09IGV2ZW50Lk1TUE9JTlRFUl9UWVBFX1RPVUNIIHx8IGV2ZW50LnBvaW50ZXJUeXBlID09PSAidG91Y2giICkgIHsKCQkJZXZlbnQudG91Y2hlcyA9IFt7IGNsaWVudFg6IGV2ZW50LmNsaWVudFgsIGNsaWVudFk6IGV2ZW50LmNsaWVudFkgfV07CgkJCW9uVG91Y2hNb3ZlKCBldmVudCApOwoJCX0KCgl9CgoJLyoqCgkgKiBDb252ZXJ0IHBvaW50ZXIgdXAgdG8gdG91Y2ggZW5kLgoJICoKCSAqIEBwYXJhbSB7b2JqZWN0fSBldmVudAoJICovCglmdW5jdGlvbiBvblBvaW50ZXJVcCggZXZlbnQgKSB7CgoJCWlmKCBldmVudC5wb2ludGVyVHlwZSA9PT0gZXZlbnQuTVNQT0lOVEVSX1RZUEVfVE9VQ0ggfHwgZXZlbnQucG9pbnRlclR5cGUgPT09ICJ0b3VjaCIgKSAgewoJCQlldmVudC50b3VjaGVzID0gW3sgY2xpZW50WDogZXZlbnQuY2xpZW50WCwgY2xpZW50WTogZXZlbnQuY2xpZW50WSB9XTsKCQkJb25Ub3VjaEVuZCggZXZlbnQgKTsKCQl9CgoJfQoKCS8qKgoJICogSGFuZGxlcyBtb3VzZSB3aGVlbCBzY3JvbGxpbmcsIHRocm90dGxlZCB0byBhdm9pZCBza2lwcGluZwoJICogbXVsdGlwbGUgc2xpZGVzLgoJICoKCSAqIEBwYXJhbSB7b2JqZWN0fSBldmVudAoJICovCglmdW5jdGlvbiBvbkRvY3VtZW50TW91c2VTY3JvbGwoIGV2ZW50ICkgewoKCQlpZiggRGF0ZS5ub3coKSAtIGxhc3RNb3VzZVdoZWVsU3RlcCA+IDYwMCApIHsKCgkJCWxhc3RNb3VzZVdoZWVsU3RlcCA9IERhdGUubm93KCk7CgoJCQl2YXIgZGVsdGEgPSBldmVudC5kZXRhaWwgfHwgLWV2ZW50LndoZWVsRGVsdGE7CgkJCWlmKCBkZWx0YSA+IDAgKSB7CgkJCQluYXZpZ2F0ZU5leHQoKTsKCQkJfQoJCQllbHNlIGlmKCBkZWx0YSA8IDAgKSB7CgkJCQluYXZpZ2F0ZVByZXYoKTsKCQkJfQoKCQl9CgoJfQoKCS8qKgoJICogQ2xpY2tpbmcgb24gdGhlIHByb2dyZXNzIGJhciByZXN1bHRzIGluIGEgbmF2aWdhdGlvbiB0byB0aGUKCSAqIGNsb3Nlc3QgYXBwcm94aW1hdGUgaG9yaXpvbnRhbCBzbGlkZSB1c2luZyB0aGlzIGVxdWF0aW9uOgoJICoKCSAqICggY2xpY2tYIC8gcHJlc2VudGF0aW9uV2lkdGggKSAqIG51bWJlck9mU2xpZGVzCgkgKgoJICogQHBhcmFtIHtvYmplY3R9IGV2ZW50CgkgKi8KCWZ1bmN0aW9uIG9uUHJvZ3Jlc3NDbGlja2VkKCBldmVudCApIHsKCgkJb25Vc2VySW5wdXQoIGV2ZW50ICk7CgoJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgoJCXZhciBzbGlkZXNUb3RhbCA9IHRvQXJyYXkoIGRvbS53cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoIEhPUklaT05UQUxfU0xJREVTX1NFTEVDVE9SICkgKS5sZW5ndGg7CgkJdmFyIHNsaWRlSW5kZXggPSBNYXRoLmZsb29yKCAoIGV2ZW50LmNsaWVudFggLyBkb20ud3JhcHBlci5vZmZzZXRXaWR0aCApICogc2xpZGVzVG90YWwgKTsKCgkJaWYoIGNvbmZpZy5ydGwgKSB7CgkJCXNsaWRlSW5kZXggPSBzbGlkZXNUb3RhbCAtIHNsaWRlSW5kZXg7CgkJfQoKCQlzbGlkZSggc2xpZGVJbmRleCApOwoKCX0KCgkvKioKCSAqIEV2ZW50IGhhbmRsZXIgZm9yIG5hdmlnYXRpb24gY29udHJvbCBidXR0b25zLgoJICovCglmdW5jdGlvbiBvbk5hdmlnYXRlTGVmdENsaWNrZWQoIGV2ZW50ICkgeyBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBvblVzZXJJbnB1dCgpOyBjb25maWcubmF2aWdhdGlvbk1vZGUgPT09ICdsaW5lYXInID8gbmF2aWdhdGVQcmV2KCkgOiBuYXZpZ2F0ZUxlZnQoKTsgfQoJZnVuY3Rpb24gb25OYXZpZ2F0ZVJpZ2h0Q2xpY2tlZCggZXZlbnQgKSB7IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IG9uVXNlcklucHV0KCk7IGNvbmZpZy5uYXZpZ2F0aW9uTW9kZSA9PT0gJ2xpbmVhcicgPyBuYXZpZ2F0ZU5leHQoKSA6IG5hdmlnYXRlUmlnaHQoKTsgfQoJZnVuY3Rpb24gb25OYXZpZ2F0ZVVwQ2xpY2tlZCggZXZlbnQgKSB7IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IG9uVXNlcklucHV0KCk7IG5hdmlnYXRlVXAoKTsgfQoJZnVuY3Rpb24gb25OYXZpZ2F0ZURvd25DbGlja2VkKCBldmVudCApIHsgZXZlbnQucHJldmVudERlZmF1bHQoKTsgb25Vc2VySW5wdXQoKTsgbmF2aWdhdGVEb3duKCk7IH0KCWZ1bmN0aW9uIG9uTmF2aWdhdGVQcmV2Q2xpY2tlZCggZXZlbnQgKSB7IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IG9uVXNlcklucHV0KCk7IG5hdmlnYXRlUHJldigpOyB9CglmdW5jdGlvbiBvbk5hdmlnYXRlTmV4dENsaWNrZWQoIGV2ZW50ICkgeyBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBvblVzZXJJbnB1dCgpOyBuYXZpZ2F0ZU5leHQoKTsgfQoKCS8qKgoJICogSGFuZGxlciBmb3IgdGhlIHdpbmRvdyBsZXZlbCAnaGFzaGNoYW5nZScgZXZlbnQuCgkgKgoJICogQHBhcmFtIHtvYmplY3R9IFtldmVudF0KCSAqLwoJZnVuY3Rpb24gb25XaW5kb3dIYXNoQ2hhbmdlKCBldmVudCApIHsKCgkJcmVhZFVSTCgpOwoKCX0KCgkvKioKCSAqIEhhbmRsZXIgZm9yIHRoZSB3aW5kb3cgbGV2ZWwgJ3Jlc2l6ZScgZXZlbnQuCgkgKgoJICogQHBhcmFtIHtvYmplY3R9IFtldmVudF0KCSAqLwoJZnVuY3Rpb24gb25XaW5kb3dSZXNpemUoIGV2ZW50ICkgewoKCQlsYXlvdXQoKTsKCgl9CgoJLyoqCgkgKiBIYW5kbGUgZm9yIHRoZSB3aW5kb3cgbGV2ZWwgJ3Zpc2liaWxpdHljaGFuZ2UnIGV2ZW50LgoJICoKCSAqIEBwYXJhbSB7b2JqZWN0fSBbZXZlbnRdCgkgKi8KCWZ1bmN0aW9uIG9uUGFnZVZpc2liaWxpdHlDaGFuZ2UoIGV2ZW50ICkgewoKCQl2YXIgaXNIaWRkZW4gPSAgZG9jdW1lbnQud2Via2l0SGlkZGVuIHx8CgkJCQkJCWRvY3VtZW50Lm1zSGlkZGVuIHx8CgkJCQkJCWRvY3VtZW50LmhpZGRlbjsKCgkJLy8gSWYsIGFmdGVyIGNsaWNraW5nIGEgbGluayBvciBzaW1pbGFyIGFuZCB3ZSdyZSBjb21pbmcgYmFjaywKCQkvLyBmb2N1cyB0aGUgZG9jdW1lbnQuYm9keSB0byBlbnN1cmUgd2UgY2FuIHVzZSBrZXlib2FyZCBzaG9ydGN1dHMKCQlpZiggaXNIaWRkZW4gPT09IGZhbHNlICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IGRvY3VtZW50LmJvZHkgKSB7CgkJCS8vIE5vdCBhbGwgZWxlbWVudHMgc3VwcG9ydCAuYmx1cigpIC0gU1ZHcyBhbW9uZyB0aGVtLgoJCQlpZiggdHlwZW9mIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1ciA9PT0gJ2Z1bmN0aW9uJyApIHsKCQkJCWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1cigpOwoJCQl9CgkJCWRvY3VtZW50LmJvZHkuZm9jdXMoKTsKCQl9CgoJfQoKCS8qKgoJICogSW52b2tlZCB3aGVuIGEgc2xpZGUgaXMgYW5kIHdlJ3JlIGluIHRoZSBvdmVydmlldy4KCSAqCgkgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQKCSAqLwoJZnVuY3Rpb24gb25PdmVydmlld1NsaWRlQ2xpY2tlZCggZXZlbnQgKSB7CgoJCS8vIFRPRE8gVGhlcmUncyBhIGJ1ZyBoZXJlIHdoZXJlIHRoZSBldmVudCBsaXN0ZW5lcnMgYXJlIG5vdAoJCS8vIHJlbW92ZWQgYWZ0ZXIgZGVhY3RpdmF0aW5nIHRoZSBvdmVydmlldy4KCQlpZiggZXZlbnRzQXJlQm91bmQgJiYgaXNPdmVydmlldygpICkgewoJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoKCQkJdmFyIGVsZW1lbnQgPSBldmVudC50YXJnZXQ7CgoJCQl3aGlsZSggZWxlbWVudCAmJiAhZWxlbWVudC5ub2RlTmFtZS5tYXRjaCggL3NlY3Rpb24vZ2kgKSApIHsKCQkJCWVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7CgkJCX0KCgkJCWlmKCBlbGVtZW50ICYmICFlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyggJ2Rpc2FibGVkJyApICkgewoKCQkJCWRlYWN0aXZhdGVPdmVydmlldygpOwoKCQkJCWlmKCBlbGVtZW50Lm5vZGVOYW1lLm1hdGNoKCAvc2VjdGlvbi9naSApICkgewoJCQkJCXZhciBoID0gcGFyc2VJbnQoIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCAnZGF0YS1pbmRleC1oJyApLCAxMCApLAoJCQkJCQl2ID0gcGFyc2VJbnQoIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCAnZGF0YS1pbmRleC12JyApLCAxMCApOwoKCQkJCQlzbGlkZSggaCwgdiApOwoJCQkJfQoKCQkJfQoJCX0KCgl9CgoJLyoqCgkgKiBIYW5kbGVzIGNsaWNrcyBvbiBsaW5rcyB0aGF0IGFyZSBzZXQgdG8gcHJldmlldyBpbiB0aGUKCSAqIGlmcmFtZSBvdmVybGF5LgoJICoKCSAqIEBwYXJhbSB7b2JqZWN0fSBldmVudAoJICovCglmdW5jdGlvbiBvblByZXZpZXdMaW5rQ2xpY2tlZCggZXZlbnQgKSB7CgoJCWlmKCBldmVudC5jdXJyZW50VGFyZ2V0ICYmIGV2ZW50LmN1cnJlbnRUYXJnZXQuaGFzQXR0cmlidXRlKCAnaHJlZicgKSApIHsKCQkJdmFyIHVybCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQuZ2V0QXR0cmlidXRlKCAnaHJlZicgKTsKCQkJaWYoIHVybCApIHsKCQkJCXNob3dQcmV2aWV3KCB1cmwgKTsKCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCX0KCQl9CgoJfQoKCS8qKgoJICogSGFuZGxlcyBjbGljayBvbiB0aGUgYXV0by1zbGlkaW5nIGNvbnRyb2xzIGVsZW1lbnQuCgkgKgoJICogQHBhcmFtIHtvYmplY3R9IFtldmVudF0KCSAqLwoJZnVuY3Rpb24gb25BdXRvU2xpZGVQbGF5ZXJDbGljayggZXZlbnQgKSB7CgoJCS8vIFJlcGxheQoJCWlmKCBSZXZlYWwuaXNMYXN0U2xpZGUoKSAmJiBjb25maWcubG9vcCA9PT0gZmFsc2UgKSB7CgkJCXNsaWRlKCAwLCAwICk7CgkJCXJlc3VtZUF1dG9TbGlkZSgpOwoJCX0KCQkvLyBSZXN1bWUKCQllbHNlIGlmKCBhdXRvU2xpZGVQYXVzZWQgKSB7CgkJCXJlc3VtZUF1dG9TbGlkZSgpOwoJCX0KCQkvLyBQYXVzZQoJCWVsc2UgewoJCQlwYXVzZUF1dG9TbGlkZSgpOwoJCX0KCgl9CgoKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQTEFZQkFDSyBDT01QT05FTlQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KCgoJLyoqCgkgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIHBsYXliYWNrIGNvbXBvbmVudCwgd2hpY2ggZGlzcGxheXMKCSAqIHBsYXkvcGF1c2UvcHJvZ3Jlc3MgY29udHJvbHMuCgkgKgoJICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyIFRoZSBjb21wb25lbnQgd2lsbCBhcHBlbmQKCSAqIGl0c2VsZiB0byB0aGlzCgkgKiBAcGFyYW0ge2Z1bmN0aW9ufSBwcm9ncmVzc0NoZWNrIEEgbWV0aG9kIHdoaWNoIHdpbGwgYmUKCSAqIGNhbGxlZCBmcmVxdWVudGx5IHRvIGdldCB0aGUgY3VycmVudCBwcm9ncmVzcyBvbiBhIHJhbmdlCgkgKiBvZiAwLTEKCSAqLwoJZnVuY3Rpb24gUGxheWJhY2soIGNvbnRhaW5lciwgcHJvZ3Jlc3NDaGVjayApIHsKCgkJLy8gQ29zbWV0aWNzCgkJdGhpcy5kaWFtZXRlciA9IDEwMDsKCQl0aGlzLmRpYW1ldGVyMiA9IHRoaXMuZGlhbWV0ZXIvMjsKCQl0aGlzLnRoaWNrbmVzcyA9IDY7CgoJCS8vIEZsYWdzIGlmIHdlIGFyZSBjdXJyZW50bHkgcGxheWluZwoJCXRoaXMucGxheWluZyA9IGZhbHNlOwoKCQkvLyBDdXJyZW50IHByb2dyZXNzIG9uIGEgMC0xIHJhbmdlCgkJdGhpcy5wcm9ncmVzcyA9IDA7CgoJCS8vIFVzZWQgdG8gbG9vcCB0aGUgYW5pbWF0aW9uIHNtb290aGx5CgkJdGhpcy5wcm9ncmVzc09mZnNldCA9IDE7CgoJCXRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOwoJCXRoaXMucHJvZ3Jlc3NDaGVjayA9IHByb2dyZXNzQ2hlY2s7CgoJCXRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2NhbnZhcycgKTsKCQl0aGlzLmNhbnZhcy5jbGFzc05hbWUgPSAncGxheWJhY2snOwoJCXRoaXMuY2FudmFzLndpZHRoID0gdGhpcy5kaWFtZXRlcjsKCQl0aGlzLmNhbnZhcy5oZWlnaHQgPSB0aGlzLmRpYW1ldGVyOwoJCXRoaXMuY2FudmFzLnN0eWxlLndpZHRoID0gdGhpcy5kaWFtZXRlcjIgKyAncHgnOwoJCXRoaXMuY2FudmFzLnN0eWxlLmhlaWdodCA9IHRoaXMuZGlhbWV0ZXIyICsgJ3B4JzsKCQl0aGlzLmNvbnRleHQgPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7CgoJCXRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKCB0aGlzLmNhbnZhcyApOwoKCQl0aGlzLnJlbmRlcigpOwoKCX0KCgkvKioKCSAqIEBwYXJhbSB2YWx1ZQoJICovCglQbGF5YmFjay5wcm90b3R5cGUuc2V0UGxheWluZyA9IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCgkJdmFyIHdhc1BsYXlpbmcgPSB0aGlzLnBsYXlpbmc7CgoJCXRoaXMucGxheWluZyA9IHZhbHVlOwoKCQkvLyBTdGFydCByZXBhaW50aW5nIGlmIHdlIHdlcmVuJ3QgYWxyZWFkeQoJCWlmKCAhd2FzUGxheWluZyAmJiB0aGlzLnBsYXlpbmcgKSB7CgkJCXRoaXMuYW5pbWF0ZSgpOwoJCX0KCQllbHNlIHsKCQkJdGhpcy5yZW5kZXIoKTsKCQl9CgoJfTsKCglQbGF5YmFjay5wcm90b3R5cGUuYW5pbWF0ZSA9IGZ1bmN0aW9uKCkgewoKCQl2YXIgcHJvZ3Jlc3NCZWZvcmUgPSB0aGlzLnByb2dyZXNzOwoKCQl0aGlzLnByb2dyZXNzID0gdGhpcy5wcm9ncmVzc0NoZWNrKCk7CgoJCS8vIFdoZW4gd2UgbG9vcCwgb2Zmc2V0IHRoZSBwcm9ncmVzcyBzbyB0aGF0IGl0IGVhc2VzCgkJLy8gc21vb3RobHkgcmF0aGVyIHRoYW4gaW1tZWRpYXRlbHkgcmVzZXR0aW5nCgkJaWYoIHByb2dyZXNzQmVmb3JlID4gMC44ICYmIHRoaXMucHJvZ3Jlc3MgPCAwLjIgKSB7CgkJCXRoaXMucHJvZ3Jlc3NPZmZzZXQgPSB0aGlzLnByb2dyZXNzOwoJCX0KCgkJdGhpcy5yZW5kZXIoKTsKCgkJaWYoIHRoaXMucGxheWluZyApIHsKCQkJZmVhdHVyZXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lTWV0aG9kLmNhbGwoIHdpbmRvdywgdGhpcy5hbmltYXRlLmJpbmQoIHRoaXMgKSApOwoJCX0KCgl9OwoKCS8qKgoJICogUmVuZGVycyB0aGUgY3VycmVudCBwcm9ncmVzcyBhbmQgcGxheWJhY2sgc3RhdGUuCgkgKi8KCVBsYXliYWNrLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbigpIHsKCgkJdmFyIHByb2dyZXNzID0gdGhpcy5wbGF5aW5nID8gdGhpcy5wcm9ncmVzcyA6IDAsCgkJCXJhZGl1cyA9ICggdGhpcy5kaWFtZXRlcjIgKSAtIHRoaXMudGhpY2tuZXNzLAoJCQl4ID0gdGhpcy5kaWFtZXRlcjIsCgkJCXkgPSB0aGlzLmRpYW1ldGVyMiwKCQkJaWNvblNpemUgPSAyODsKCgkJLy8gRWFzZSB0b3dhcmRzIDEKCQl0aGlzLnByb2dyZXNzT2Zmc2V0ICs9ICggMSAtIHRoaXMucHJvZ3Jlc3NPZmZzZXQgKSAqIDAuMTsKCgkJdmFyIGVuZEFuZ2xlID0gKCAtIE1hdGguUEkgLyAyICkgKyAoIHByb2dyZXNzICogKCBNYXRoLlBJICogMiApICk7CgkJdmFyIHN0YXJ0QW5nbGUgPSAoIC0gTWF0aC5QSSAvIDIgKSArICggdGhpcy5wcm9ncmVzc09mZnNldCAqICggTWF0aC5QSSAqIDIgKSApOwoKCQl0aGlzLmNvbnRleHQuc2F2ZSgpOwoJCXRoaXMuY29udGV4dC5jbGVhclJlY3QoIDAsIDAsIHRoaXMuZGlhbWV0ZXIsIHRoaXMuZGlhbWV0ZXIgKTsKCgkJLy8gU29saWQgYmFja2dyb3VuZCBjb2xvcgoJCXRoaXMuY29udGV4dC5iZWdpblBhdGgoKTsKCQl0aGlzLmNvbnRleHQuYXJjKCB4LCB5LCByYWRpdXMgKyA0LCAwLCBNYXRoLlBJICogMiwgZmFsc2UgKTsKCQl0aGlzLmNvbnRleHQuZmlsbFN0eWxlID0gJ3JnYmEoIDAsIDAsIDAsIDAuNCApJzsKCQl0aGlzLmNvbnRleHQuZmlsbCgpOwoKCQkvLyBEcmF3IHByb2dyZXNzIHRyYWNrCgkJdGhpcy5jb250ZXh0LmJlZ2luUGF0aCgpOwoJCXRoaXMuY29udGV4dC5hcmMoIHgsIHksIHJhZGl1cywgMCwgTWF0aC5QSSAqIDIsIGZhbHNlICk7CgkJdGhpcy5jb250ZXh0LmxpbmVXaWR0aCA9IHRoaXMudGhpY2tuZXNzOwoJCXRoaXMuY29udGV4dC5zdHJva2VTdHlsZSA9ICdyZ2JhKCAyNTUsIDI1NSwgMjU1LCAwLjIgKSc7CgkJdGhpcy5jb250ZXh0LnN0cm9rZSgpOwoKCQlpZiggdGhpcy5wbGF5aW5nICkgewoJCQkvLyBEcmF3IHByb2dyZXNzIG9uIHRvcCBvZiB0cmFjawoJCQl0aGlzLmNvbnRleHQuYmVnaW5QYXRoKCk7CgkJCXRoaXMuY29udGV4dC5hcmMoIHgsIHksIHJhZGl1cywgc3RhcnRBbmdsZSwgZW5kQW5nbGUsIGZhbHNlICk7CgkJCXRoaXMuY29udGV4dC5saW5lV2lkdGggPSB0aGlzLnRoaWNrbmVzczsKCQkJdGhpcy5jb250ZXh0LnN0cm9rZVN0eWxlID0gJyNmZmYnOwoJCQl0aGlzLmNvbnRleHQuc3Ryb2tlKCk7CgkJfQoKCQl0aGlzLmNvbnRleHQudHJhbnNsYXRlKCB4IC0gKCBpY29uU2l6ZSAvIDIgKSwgeSAtICggaWNvblNpemUgLyAyICkgKTsKCgkJLy8gRHJhdyBwbGF5L3BhdXNlIGljb25zCgkJaWYoIHRoaXMucGxheWluZyApIHsKCQkJdGhpcy5jb250ZXh0LmZpbGxTdHlsZSA9ICcjZmZmJzsKCQkJdGhpcy5jb250ZXh0LmZpbGxSZWN0KCAwLCAwLCBpY29uU2l6ZSAvIDIgLSA0LCBpY29uU2l6ZSApOwoJCQl0aGlzLmNvbnRleHQuZmlsbFJlY3QoIGljb25TaXplIC8gMiArIDQsIDAsIGljb25TaXplIC8gMiAtIDQsIGljb25TaXplICk7CgkJfQoJCWVsc2UgewoJCQl0aGlzLmNvbnRleHQuYmVnaW5QYXRoKCk7CgkJCXRoaXMuY29udGV4dC50cmFuc2xhdGUoIDQsIDAgKTsKCQkJdGhpcy5jb250ZXh0Lm1vdmVUbyggMCwgMCApOwoJCQl0aGlzLmNvbnRleHQubGluZVRvKCBpY29uU2l6ZSAtIDQsIGljb25TaXplIC8gMiApOwoJCQl0aGlzLmNvbnRleHQubGluZVRvKCAwLCBpY29uU2l6ZSApOwoJCQl0aGlzLmNvbnRleHQuZmlsbFN0eWxlID0gJyNmZmYnOwoJCQl0aGlzLmNvbnRleHQuZmlsbCgpOwoJCX0KCgkJdGhpcy5jb250ZXh0LnJlc3RvcmUoKTsKCgl9OwoKCVBsYXliYWNrLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKCB0eXBlLCBsaXN0ZW5lciApIHsKCQl0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBsaXN0ZW5lciwgZmFsc2UgKTsKCX07CgoJUGxheWJhY2sucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uKCB0eXBlLCBsaXN0ZW5lciApIHsKCQl0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBsaXN0ZW5lciwgZmFsc2UgKTsKCX07CgoJUGxheWJhY2sucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHsKCgkJdGhpcy5wbGF5aW5nID0gZmFsc2U7CgoJCWlmKCB0aGlzLmNhbnZhcy5wYXJlbnROb2RlICkgewoJCQl0aGlzLmNvbnRhaW5lci5yZW1vdmVDaGlsZCggdGhpcy5jYW52YXMgKTsKCQl9CgoJfTsKCgoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBUEkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwoKCglSZXZlYWwgPSB7CgkJVkVSU0lPTjogVkVSU0lPTiwKCgkJaW5pdGlhbGl6ZTogaW5pdGlhbGl6ZSwKCQljb25maWd1cmU6IGNvbmZpZ3VyZSwKCgkJc3luYzogc3luYywKCQlzeW5jU2xpZGU6IHN5bmNTbGlkZSwKCQlzeW5jRnJhZ21lbnRzOiBzeW5jRnJhZ21lbnRzLAoKCQkvLyBOYXZpZ2F0aW9uIG1ldGhvZHMKCQlzbGlkZTogc2xpZGUsCgkJbGVmdDogbmF2aWdhdGVMZWZ0LAoJCXJpZ2h0OiBuYXZpZ2F0ZVJpZ2h0LAoJCXVwOiBuYXZpZ2F0ZVVwLAoJCWRvd246IG5hdmlnYXRlRG93biwKCQlwcmV2OiBuYXZpZ2F0ZVByZXYsCgkJbmV4dDogbmF2aWdhdGVOZXh0LAoKCQkvLyBGcmFnbWVudCBtZXRob2RzCgkJbmF2aWdhdGVGcmFnbWVudDogbmF2aWdhdGVGcmFnbWVudCwKCQlwcmV2RnJhZ21lbnQ6IHByZXZpb3VzRnJhZ21lbnQsCgkJbmV4dEZyYWdtZW50OiBuZXh0RnJhZ21lbnQsCgoJCS8vIERlcHJlY2F0ZWQgYWxpYXNlcwoJCW5hdmlnYXRlVG86IHNsaWRlLAoJCW5hdmlnYXRlTGVmdDogbmF2aWdhdGVMZWZ0LAoJCW5hdmlnYXRlUmlnaHQ6IG5hdmlnYXRlUmlnaHQsCgkJbmF2aWdhdGVVcDogbmF2aWdhdGVVcCwKCQluYXZpZ2F0ZURvd246IG5hdmlnYXRlRG93biwKCQluYXZpZ2F0ZVByZXY6IG5hdmlnYXRlUHJldiwKCQluYXZpZ2F0ZU5leHQ6IG5hdmlnYXRlTmV4dCwKCgkJLy8gRm9yY2VzIGFuIHVwZGF0ZSBpbiBzbGlkZSBsYXlvdXQKCQlsYXlvdXQ6IGxheW91dCwKCgkJLy8gUmFuZG9taXplcyB0aGUgb3JkZXIgb2Ygc2xpZGVzCgkJc2h1ZmZsZTogc2h1ZmZsZSwKCgkJLy8gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCB0aGUgYXZhaWxhYmxlIHJvdXRlcyBhcyBib29sZWFucyAobGVmdC9yaWdodC90b3AvYm90dG9tKQoJCWF2YWlsYWJsZVJvdXRlczogYXZhaWxhYmxlUm91dGVzLAoKCQkvLyBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIHRoZSBhdmFpbGFibGUgZnJhZ21lbnRzIGFzIGJvb2xlYW5zIChwcmV2L25leHQpCgkJYXZhaWxhYmxlRnJhZ21lbnRzOiBhdmFpbGFibGVGcmFnbWVudHMsCgoJCS8vIFRvZ2dsZXMgYSBoZWxwIG92ZXJsYXkgd2l0aCBrZXlib2FyZCBzaG9ydGN1dHMKCQl0b2dnbGVIZWxwOiB0b2dnbGVIZWxwLAoKCQkvLyBUb2dnbGVzIHRoZSBvdmVydmlldyBtb2RlIG9uL29mZgoJCXRvZ2dsZU92ZXJ2aWV3OiB0b2dnbGVPdmVydmlldywKCgkJLy8gVG9nZ2xlcyB0aGUgImJsYWNrIHNjcmVlbiIgbW9kZSBvbi9vZmYKCQl0b2dnbGVQYXVzZTogdG9nZ2xlUGF1c2UsCgoJCS8vIFRvZ2dsZXMgdGhlIGF1dG8gc2xpZGUgbW9kZSBvbi9vZmYKCQl0b2dnbGVBdXRvU2xpZGU6IHRvZ2dsZUF1dG9TbGlkZSwKCgkJLy8gU3RhdGUgY2hlY2tzCgkJaXNPdmVydmlldzogaXNPdmVydmlldywKCQlpc1BhdXNlZDogaXNQYXVzZWQsCgkJaXNBdXRvU2xpZGluZzogaXNBdXRvU2xpZGluZywKCQlpc1NwZWFrZXJOb3RlczogaXNTcGVha2VyTm90ZXMsCgoJCS8vIFNsaWRlIHByZWxvYWRpbmcKCQlsb2FkU2xpZGU6IGxvYWRTbGlkZSwKCQl1bmxvYWRTbGlkZTogdW5sb2FkU2xpZGUsCgoJCS8vIEFkZHMgb3IgcmVtb3ZlcyBhbGwgaW50ZXJuYWwgZXZlbnQgbGlzdGVuZXJzIChzdWNoIGFzIGtleWJvYXJkKQoJCWFkZEV2ZW50TGlzdGVuZXJzOiBhZGRFdmVudExpc3RlbmVycywKCQlyZW1vdmVFdmVudExpc3RlbmVyczogcmVtb3ZlRXZlbnRMaXN0ZW5lcnMsCgoJCS8vIEZhY2lsaXR5IGZvciBwZXJzaXN0aW5nIGFuZCByZXN0b3JpbmcgdGhlIHByZXNlbnRhdGlvbiBzdGF0ZQoJCWdldFN0YXRlOiBnZXRTdGF0ZSwKCQlzZXRTdGF0ZTogc2V0U3RhdGUsCgoJCS8vIFByZXNlbnRhdGlvbiBwcm9ncmVzcwoJCWdldFNsaWRlUGFzdENvdW50OiBnZXRTbGlkZVBhc3RDb3VudCwKCgkJLy8gUHJlc2VudGF0aW9uIHByb2dyZXNzIG9uIHJhbmdlIG9mIDAtMQoJCWdldFByb2dyZXNzOiBnZXRQcm9ncmVzcywKCgkJLy8gUmV0dXJucyB0aGUgaW5kaWNlcyBvZiB0aGUgY3VycmVudCwgb3Igc3BlY2lmaWVkLCBzbGlkZQoJCWdldEluZGljZXM6IGdldEluZGljZXMsCgoJCS8vIFJldHVybnMgYW4gQXJyYXkgb2YgYWxsIHNsaWRlcwoJCWdldFNsaWRlczogZ2V0U2xpZGVzLAoKCQkvLyBSZXR1cm5zIGFuIEFycmF5IG9mIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSBhdHRyaWJ1dGVzIG9uCgkJLy8gdGhlIHNsaWRlcwoJCWdldFNsaWRlc0F0dHJpYnV0ZXM6IGdldFNsaWRlc0F0dHJpYnV0ZXMsCgoJCS8vIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBzbGlkZXMKCQlnZXRUb3RhbFNsaWRlczogZ2V0VG90YWxTbGlkZXMsCgoJCS8vIFJldHVybnMgdGhlIHNsaWRlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleAoJCWdldFNsaWRlOiBnZXRTbGlkZSwKCgkJLy8gUmV0dXJucyB0aGUgc2xpZGUgYmFja2dyb3VuZCBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgKCQlnZXRTbGlkZUJhY2tncm91bmQ6IGdldFNsaWRlQmFja2dyb3VuZCwKCgkJLy8gUmV0dXJucyB0aGUgc3BlYWtlciBub3RlcyBzdHJpbmcgZm9yIGEgc2xpZGUsIG9yIG51bGwKCQlnZXRTbGlkZU5vdGVzOiBnZXRTbGlkZU5vdGVzLAoKCQkvLyBSZXR1cm5zIGFuIGFycmF5IHdpdGggYWxsIGhvcml6b250YWwvdmVydGljYWwgc2xpZGVzIGluIHRoZSBkZWNrCgkJZ2V0SG9yaXpvbnRhbFNsaWRlczogZ2V0SG9yaXpvbnRhbFNsaWRlcywKCQlnZXRWZXJ0aWNhbFNsaWRlczogZ2V0VmVydGljYWxTbGlkZXMsCgoJCS8vIENoZWNrcyBpZiB0aGUgcHJlc2VudGF0aW9uIGNvbnRhaW5zIHR3byBvciBtb3JlCgkJLy8gaG9yaXpvbnRhbC92ZXJ0aWNhbCBzbGlkZXMKCQloYXNIb3Jpem9udGFsU2xpZGVzOiBoYXNIb3Jpem9udGFsU2xpZGVzLAoJCWhhc1ZlcnRpY2FsU2xpZGVzOiBoYXNWZXJ0aWNhbFNsaWRlcywKCgkJLy8gUmV0dXJucyB0aGUgcHJldmlvdXMgc2xpZGUgZWxlbWVudCwgbWF5IGJlIG51bGwKCQlnZXRQcmV2aW91c1NsaWRlOiBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIHByZXZpb3VzU2xpZGU7CgkJfSwKCgkJLy8gUmV0dXJucyB0aGUgY3VycmVudCBzbGlkZSBlbGVtZW50CgkJZ2V0Q3VycmVudFNsaWRlOiBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIGN1cnJlbnRTbGlkZTsKCQl9LAoKCQkvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHNjYWxlIG9mIHRoZSBwcmVzZW50YXRpb24gY29udGVudAoJCWdldFNjYWxlOiBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIHNjYWxlOwoJCX0sCgoJCS8vIFJldHVybnMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvYmplY3QKCQlnZXRDb25maWc6IGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gY29uZmlnOwoJCX0sCgoJCS8vIEhlbHBlciBtZXRob2QsIHJldHJpZXZlcyBxdWVyeSBzdHJpbmcgYXMgYSBrZXkvdmFsdWUgaGFzaAoJCWdldFF1ZXJ5SGFzaDogZnVuY3Rpb24oKSB7CgkJCXZhciBxdWVyeSA9IHt9OwoKCQkJbG9jYXRpb24uc2VhcmNoLnJlcGxhY2UoIC9bQS1aMC05XSs/PShbXHdcLiUtXSopL2dpLCBmdW5jdGlvbihhKSB7CgkJCQlxdWVyeVsgYS5zcGxpdCggJz0nICkuc2hpZnQoKSBdID0gYS5zcGxpdCggJz0nICkucG9wKCk7CgkJCX0gKTsKCgkJCS8vIEJhc2ljIGRlc2VyaWFsaXphdGlvbgoJCQlmb3IoIHZhciBpIGluIHF1ZXJ5ICkgewoJCQkJdmFyIHZhbHVlID0gcXVlcnlbIGkgXTsKCgkJCQlxdWVyeVsgaSBdID0gZGVzZXJpYWxpemUoIHVuZXNjYXBlKCB2YWx1ZSApICk7CgkJCX0KCgkJCXJldHVybiBxdWVyeTsKCQl9LAoKCQkvLyBSZXR1cm5zIHRoZSB0b3AtbGV2ZWwgRE9NIGVsZW1lbnQKCQlnZXRSZXZlYWxFbGVtZW50OiBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIGRvbS53cmFwcGVyIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoICcucmV2ZWFsJyApOwoJCX0sCgoJCS8vIFJldHVybnMgYSBoYXNoIHdpdGggYWxsIHJlZ2lzdGVyZWQgcGx1Z2lucwoJCWdldFBsdWdpbnM6IGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gcGx1Z2luczsKCQl9LAoKCQkvLyBSZXR1cm5zIHRydWUgaWYgd2UncmUgY3VycmVudGx5IG9uIHRoZSBmaXJzdCBzbGlkZQoJCWlzRmlyc3RTbGlkZTogZnVuY3Rpb24oKSB7CgkJCXJldHVybiAoIGluZGV4aCA9PT0gMCAmJiBpbmRleHYgPT09IDAgKTsKCQl9LAoKCQkvLyBSZXR1cm5zIHRydWUgaWYgd2UncmUgY3VycmVudGx5IG9uIHRoZSBsYXN0IHNsaWRlCgkJaXNMYXN0U2xpZGU6IGZ1bmN0aW9uKCkgewoJCQlpZiggY3VycmVudFNsaWRlICkgewoJCQkJLy8gRG9lcyB0aGlzIHNsaWRlIGhhdmUgYSBuZXh0IHNpYmxpbmc/CgkJCQlpZiggY3VycmVudFNsaWRlLm5leHRFbGVtZW50U2libGluZyApIHJldHVybiBmYWxzZTsKCgkJCQkvLyBJZiBpdCdzIHZlcnRpY2FsLCBkb2VzIGl0cyBwYXJlbnQgaGF2ZSBhIG5leHQgc2libGluZz8KCQkJCWlmKCBpc1ZlcnRpY2FsU2xpZGUoIGN1cnJlbnRTbGlkZSApICYmIGN1cnJlbnRTbGlkZS5wYXJlbnROb2RlLm5leHRFbGVtZW50U2libGluZyApIHJldHVybiBmYWxzZTsKCgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoKCQkJcmV0dXJuIGZhbHNlOwoJCX0sCgoJCS8vIFJldHVybnMgdHJ1ZSBpZiB3ZSdyZSBvbiB0aGUgbGFzdCBzbGlkZSBpbiB0aGUgY3VycmVudAoJCS8vIHZlcnRpY2FsIHN0YWNrCgkJaXNMYXN0VmVydGljYWxTbGlkZTogZnVuY3Rpb24oKSB7CgkJCWlmKCBjdXJyZW50U2xpZGUgJiYgaXNWZXJ0aWNhbFNsaWRlKCBjdXJyZW50U2xpZGUgKSApIHsKCQkJCS8vIERvZXMgdGhpcyBzbGlkZSBoYXZlIGEgbmV4dCBzaWJsaW5nPwoJCQkJaWYoIGN1cnJlbnRTbGlkZS5uZXh0RWxlbWVudFNpYmxpbmcgKSByZXR1cm4gZmFsc2U7CgoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCgkJCXJldHVybiBmYWxzZTsKCQl9LAoKCQkvLyBDaGVja3MgaWYgcmV2ZWFsLmpzIGhhcyBiZWVuIGxvYWRlZCBhbmQgaXMgcmVhZHkgZm9yIHVzZQoJCWlzUmVhZHk6IGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gbG9hZGVkOwoJCX0sCgoJCS8vIEZvcndhcmQgZXZlbnQgYmluZGluZyB0byB0aGUgcmV2ZWFsIERPTSBlbGVtZW50CgkJYWRkRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24oIHR5cGUsIGxpc3RlbmVyLCB1c2VDYXB0dXJlICkgewoJCQlpZiggJ2FkZEV2ZW50TGlzdGVuZXInIGluIHdpbmRvdyApIHsKCQkJCVJldmVhbC5nZXRSZXZlYWxFbGVtZW50KCkuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUgKTsKCQkJfQoJCX0sCgkJcmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24oIHR5cGUsIGxpc3RlbmVyLCB1c2VDYXB0dXJlICkgewoJCQlpZiggJ2FkZEV2ZW50TGlzdGVuZXInIGluIHdpbmRvdyApIHsKCQkJCVJldmVhbC5nZXRSZXZlYWxFbGVtZW50KCkucmVtb3ZlRXZlbnRMaXN0ZW5lciggdHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUgKTsKCQkJfQoJCX0sCgoJCS8vIEFkZHMvcmVtb3ZlcyBhIGN1c3RvbSBrZXkgYmluZGluZwoJCWFkZEtleUJpbmRpbmc6IGFkZEtleUJpbmRpbmcsCgkJcmVtb3ZlS2V5QmluZGluZzogcmVtb3ZlS2V5QmluZGluZywKCgkJLy8gQVBJIGZvciByZWdpc3RlcmluZyBhbmQgcmV0cmlldmluZyBwbHVnaW5zCgkJcmVnaXN0ZXJQbHVnaW46IHJlZ2lzdGVyUGx1Z2luLAoJCWhhc1BsdWdpbjogaGFzUGx1Z2luLAoJCWdldFBsdWdpbjogZ2V0UGx1Z2luLAoKCQkvLyBQcm9ncmFtbWF0aWNhbGx5IHRyaWdnZXJzIGEga2V5Ym9hcmQgZXZlbnQKCQl0cmlnZ2VyS2V5OiBmdW5jdGlvbigga2V5Q29kZSApIHsKCQkJb25Eb2N1bWVudEtleURvd24oIHsga2V5Q29kZToga2V5Q29kZSB9ICk7CgkJfSwKCgkJLy8gUmVnaXN0ZXJzIGEgbmV3IHNob3J0Y3V0IHRvIGluY2x1ZGUgaW4gdGhlIGhlbHAgb3ZlcmxheQoJCXJlZ2lzdGVyS2V5Ym9hcmRTaG9ydGN1dDogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJCWtleWJvYXJkU2hvcnRjdXRzW2tleV0gPSB2YWx1ZTsKCQl9Cgl9OwoKCXJldHVybiBSZXZlYWw7Cgp9KSk7Cg=="></script>
<script>
// Full list of configuration options available at:
// https://github.com/hakimel/reveal.js#configuration
Reveal.initialize({
// Optional reveal.js plugins
dependencies: [
{ src: 'https://revealjs.com/lib/js/classList.js', condition: function() { return !document.body.classList; } },
{ src: 'https://revealjs.com/plugin/zoom-js/zoom.js', async: true },
{ src: 'https://revealjs.com/plugin/notes/notes.js', async: true }
]
});
</script>
</body>
</html>