lil-mocky 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2405 @@
1
+ {
2
+ "auto_complete":
3
+ {
4
+ "selected_items":
5
+ [
6
+ [
7
+ "ac",
8
+ "actionButton"
9
+ ],
10
+ [
11
+ "wi",
12
+ "withMap"
13
+ ],
14
+ [
15
+ "on",
16
+ "onCardHoverIn"
17
+ ],
18
+ [
19
+ "map",
20
+ "mapElement"
21
+ ],
22
+ [
23
+ "fo",
24
+ "focusElementIds"
25
+ ],
26
+ [
27
+ "pre",
28
+ "_prrevNumHiddenElements"
29
+ ],
30
+ [
31
+ "la",
32
+ "labels"
33
+ ],
34
+ [
35
+ "map-",
36
+ "map-window"
37
+ ],
38
+ [
39
+ "_is",
40
+ "_isFilterNotifying"
41
+ ],
42
+ [
43
+ "isMap",
44
+ "isMapOpen"
45
+ ],
46
+ [
47
+ "isN",
48
+ "_isFilterNotifying"
49
+ ],
50
+ [
51
+ "fle",
52
+ "flex-direction"
53
+ ],
54
+ [
55
+ "fil",
56
+ "filterMessage"
57
+ ],
58
+ [
59
+ "element",
60
+ "elementIds"
61
+ ],
62
+ [
63
+ "margin",
64
+ "margin-left"
65
+ ],
66
+ [
67
+ "font",
68
+ "font-weight"
69
+ ],
70
+ [
71
+ "bor",
72
+ "border-radius"
73
+ ],
74
+ [
75
+ "card",
76
+ "cardGroupId"
77
+ ],
78
+ [
79
+ "cla",
80
+ "classList"
81
+ ],
82
+ [
83
+ "Map",
84
+ "MapWindow"
85
+ ],
86
+ [
87
+ "ne",
88
+ "nextSlideNode"
89
+ ],
90
+ [
91
+ "padd",
92
+ "padding-bottom"
93
+ ],
94
+ [
95
+ "car",
96
+ "cardGroupId"
97
+ ],
98
+ [
99
+ "_han",
100
+ "_handleMarkerPlaceOpen"
101
+ ],
102
+ [
103
+ "cl",
104
+ "className"
105
+ ],
106
+ [
107
+ "ele",
108
+ "element"
109
+ ],
110
+ [
111
+ "elem",
112
+ "elements"
113
+ ],
114
+ [
115
+ "card-slider__",
116
+ "card-slider__slide"
117
+ ],
118
+ [
119
+ "mapE",
120
+ "mapElement"
121
+ ],
122
+ [
123
+ "onC",
124
+ "onCardClick"
125
+ ],
126
+ [
127
+ "cate",
128
+ "categoryAll"
129
+ ],
130
+ [
131
+ "_c",
132
+ "_categoryFieldTemplate"
133
+ ],
134
+ [
135
+ "pa",
136
+ "padding-bottom"
137
+ ],
138
+ [
139
+ "mar",
140
+ "margin-right"
141
+ ],
142
+ [
143
+ "back",
144
+ "background-size"
145
+ ],
146
+ [
147
+ "_form",
148
+ "_formInnerTemplate"
149
+ ],
150
+ [
151
+ "su",
152
+ "submitButtonTemplate"
153
+ ],
154
+ [
155
+ "pla",
156
+ "placeWindow"
157
+ ],
158
+ [
159
+ "er",
160
+ "errorMessage"
161
+ ],
162
+ [
163
+ "err",
164
+ "errorMessage"
165
+ ],
166
+ [
167
+ "get",
168
+ "getBounds"
169
+ ],
170
+ [
171
+ "ca",
172
+ "cardType"
173
+ ],
174
+ [
175
+ "_cre",
176
+ "_createMessageCardMapElements"
177
+ ],
178
+ [
179
+ "check",
180
+ "checkbox"
181
+ ],
182
+ [
183
+ "min",
184
+ "min-width"
185
+ ],
186
+ [
187
+ "bus",
188
+ "businessType"
189
+ ],
190
+ [
191
+ "bu",
192
+ "businessType"
193
+ ],
194
+ [
195
+ "lo",
196
+ "lodging"
197
+ ],
198
+ [
199
+ "_",
200
+ "_handleExpandToggleClick"
201
+ ],
202
+ [
203
+ "im",
204
+ "imgCdnDomain"
205
+ ],
206
+ [
207
+ "_hand",
208
+ "_handleFilterClick"
209
+ ],
210
+ [
211
+ "st",
212
+ "static"
213
+ ],
214
+ [
215
+ "place",
216
+ "placeAddress"
217
+ ],
218
+ [
219
+ "mess",
220
+ "messageId"
221
+ ],
222
+ [
223
+ "sel",
224
+ "selectElementIds"
225
+ ],
226
+ [
227
+ "me",
228
+ "messageIndex"
229
+ ],
230
+ [
231
+ "is",
232
+ "isIntroClosed"
233
+ ],
234
+ [
235
+ "ma",
236
+ "matches"
237
+ ],
238
+ [
239
+ "in",
240
+ "innerText"
241
+ ],
242
+ [
243
+ "inlin",
244
+ "inlineLinkHtml"
245
+ ],
246
+ [
247
+ "grou",
248
+ "groupId"
249
+ ],
250
+ [
251
+ "_ha",
252
+ "_handleMapCancel"
253
+ ],
254
+ [
255
+ "_st",
256
+ "_storeHandler"
257
+ ],
258
+ [
259
+ "com",
260
+ "composeMessage"
261
+ ],
262
+ [
263
+ "_conn",
264
+ "_connectToParentElement"
265
+ ],
266
+ [
267
+ "Place",
268
+ "PlaceWindowContent"
269
+ ],
270
+ [
271
+ "room",
272
+ "roomText"
273
+ ],
274
+ [
275
+ "rol",
276
+ "rollupStream"
277
+ ],
278
+ [
279
+ "che",
280
+ "checkInDate"
281
+ ],
282
+ [
283
+ "_re",
284
+ "_request"
285
+ ],
286
+ [
287
+ "for",
288
+ "formActionOrResultTemplate"
289
+ ],
290
+ [
291
+ "le",
292
+ "length"
293
+ ],
294
+ [
295
+ "new",
296
+ "newElementIds"
297
+ ],
298
+ [
299
+ "_place",
300
+ "_placeLoadAction"
301
+ ],
302
+ [
303
+ "_pla",
304
+ "_placeLoadAction"
305
+ ],
306
+ [
307
+ "tot",
308
+ "totalChildren"
309
+ ],
310
+ [
311
+ "ro",
312
+ "roomControlValue"
313
+ ],
314
+ [
315
+ "date",
316
+ "dateRangeControlValue"
317
+ ],
318
+ [
319
+ "da",
320
+ "dateValues"
321
+ ],
322
+ [
323
+ "block",
324
+ "blockElements"
325
+ ],
326
+ [
327
+ "blo",
328
+ "blockGroupId"
329
+ ],
330
+ [
331
+ "re",
332
+ "request"
333
+ ],
334
+ [
335
+ "wide",
336
+ "wideNeoCardHtml"
337
+ ],
338
+ [
339
+ "t",
340
+ "template"
341
+ ],
342
+ [
343
+ "load",
344
+ "loadParams"
345
+ ],
346
+ [
347
+ "_card",
348
+ "_cardType"
349
+ ],
350
+ [
351
+ "_lo",
352
+ "_loadPlace"
353
+ ],
354
+ [
355
+ "text",
356
+ "text-decoration"
357
+ ],
358
+ [
359
+ "over",
360
+ "overflow"
361
+ ],
362
+ [
363
+ "con",
364
+ "content-form__field"
365
+ ],
366
+ [
367
+ "border",
368
+ "border-radius"
369
+ ],
370
+ [
371
+ "mo",
372
+ "modal-dialog"
373
+ ],
374
+ [
375
+ "cont",
376
+ "content-form"
377
+ ],
378
+ [
379
+ "num",
380
+ "numAdults"
381
+ ],
382
+ [
383
+ "child",
384
+ "childrenAges"
385
+ ],
386
+ [
387
+ "chi",
388
+ "childrenAges"
389
+ ],
390
+ [
391
+ "adu",
392
+ "adultsStepperNode"
393
+ ],
394
+ [
395
+ "_handle",
396
+ "_handleRemoveRoomClick"
397
+ ],
398
+ [
399
+ "roo",
400
+ "rooms"
401
+ ],
402
+ [
403
+ "max",
404
+ "maxChildAge"
405
+ ],
406
+ [
407
+ "high",
408
+ "highlightElementIds"
409
+ ],
410
+ [
411
+ "sho",
412
+ "showCard"
413
+ ],
414
+ [
415
+ "_ma",
416
+ "_mapElements"
417
+ ],
418
+ [
419
+ "mark",
420
+ "marker"
421
+ ],
422
+ [
423
+ "par",
424
+ "parentNode"
425
+ ],
426
+ [
427
+ "create",
428
+ "createChatApp"
429
+ ],
430
+ [
431
+ "_con",
432
+ "_connectToParentContext"
433
+ ],
434
+ [
435
+ "pro",
436
+ "provider"
437
+ ],
438
+ [
439
+ "up",
440
+ "updateMapMenu"
441
+ ],
442
+ [
443
+ "font-",
444
+ "font-weight"
445
+ ],
446
+ [
447
+ "spa",
448
+ "space-evenly"
449
+ ],
450
+ [
451
+ "book",
452
+ "bookUrl"
453
+ ],
454
+ [
455
+ "Pla",
456
+ "PlaceWindowContent"
457
+ ],
458
+ [
459
+ "review",
460
+ "reviewClass"
461
+ ],
462
+ [
463
+ "info",
464
+ "infoListTemplate"
465
+ ],
466
+ [
467
+ "adj",
468
+ "adjustedPosition"
469
+ ],
470
+ [
471
+ "zoo",
472
+ "zoom_changed"
473
+ ],
474
+ [
475
+ "iframe",
476
+ "iframeParams"
477
+ ],
478
+ [
479
+ "Pl",
480
+ "PlaceWindow"
481
+ ],
482
+ [
483
+ "dir",
484
+ "directionsUrl"
485
+ ],
486
+ [
487
+ "_map",
488
+ "_mapTemplate"
489
+ ],
490
+ [
491
+ "cur",
492
+ "curBounds"
493
+ ],
494
+ [
495
+ "elemen",
496
+ "elementIds"
497
+ ],
498
+ [
499
+ "_f",
500
+ "_fitBoundsToElements"
501
+ ],
502
+ [
503
+ "api",
504
+ "apiMessageId"
505
+ ],
506
+ [
507
+ "pl",
508
+ "placeData"
509
+ ],
510
+ [
511
+ "cen",
512
+ "centerLatLng"
513
+ ],
514
+ [
515
+ "trans",
516
+ "transition"
517
+ ]
518
+ ]
519
+ },
520
+ "buffers":
521
+ [
522
+ {
523
+ "file": "src/lil-mocky.js",
524
+ "settings":
525
+ {
526
+ "buffer_size": 6800,
527
+ "encoding": "UTF-8",
528
+ "line_ending": "Unix"
529
+ },
530
+ "undo_stack":
531
+ [
532
+ [
533
+ 96,
534
+ 1,
535
+ "revert",
536
+ null,
537
+ "AgAAAAAAAAAAAAAAAAAAAAAAAAAeGAAAZnVuY3Rpb24gbW9ja0J1aWxkZXIoYnVpbGRlcikgewoJcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKfQoKZnVuY3Rpb24gZnVuY3Rpb25CdWlsZGVyKGJvZHksIG9yaWdpbmFsKSB7Cgljb25zdCBvcHRpb25zID0gewoJCWFzeW5jOiBmYWxzZSwKCQlib2R5OiBib2R5LAoJCWFyZ3M6IFtdLAoJCXNlbGVjdDogW10sCgkJb3JpZ2luYWw6IG9yaWdpbmFsCgl9OwoKCXJldHVybiB7CgkJYXN5bmM6IGZ1bmN0aW9uKCkgewoJCQlvcHRpb25zLmFzeW5jID0gdHJ1ZTsKCQkJcmV0dXJuIHRoaXM7CgkJfSwKCQlhcmdzOiBmdW5jdGlvbiguLi5hcmdzKSB7CgkJCW9wdGlvbnMuYXJncyA9IGFyZ3M7CgkJCXJldHVybiB0aGlzOwoJCX0sCgkJYXJnU2VsZWN0OiBmdW5jdGlvbiguLi5pbmRleGVzKSB7CgkJCW9wdGlvbnMuc2VsZWN0ID0gaW5kZXhlczsKCQkJcmV0dXJuIHRoaXM7CgkJfSwKCQlidWlsZDogZnVuY3Rpb24ocGFyZW50LCBrZXkpIHsKCQkJY29uc3Qgc3RhdGUgPSB7fTsKCQkJY29uc3QgbW9jayA9IGNyZWF0ZUZ1bmN0aW9uKHN0YXRlLCBvcHRpb25zKTsKCgkJCWlmIChwYXJlbnQpCgkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkocGFyZW50LCBrZXksIHsgdmFsdWU6IG1vY2sgfSk7CgoJCQlyZXR1cm4gd2lyZUZ1bmN0aW9uKHBhcmVudCA/IHBhcmVudFtrZXldIDogbW9jaywgc3RhdGUpOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIHdpcmVGdW5jdGlvbihtb2NrLCBzdGF0ZSkgewoJbW9jay5yZXQgPSAodmFsdWUsIGNhbGwgPSAwKSA9PiB7CgkJc3RhdGUucmV0c1tjYWxsXSA9IHZhbHVlOwoJfTsKCW1vY2sub25SZXQgPSAoaGFuZGxlciwgY2FsbCA9IDApID0+IHsKCQlzdGF0ZS5yZXRIYW5kbGVyc1tjYWxsXSA9IGhhbmRsZXI7Cgl9OwoJbW9jay5jYWxscyA9IChjYWxsKSA9PiB7CgkJcmV0dXJuIGNhbGwgIT09IHVuZGVmaW5lZCA/IHN0YXRlLmNhbGxzW2NhbGxdIDogc3RhdGUuY2FsbHM7Cgl9Cgltb2NrLnJlc2V0ID0gKCkgPT4gewoJCXN0YXRlLnJldHMgPSBbXTsKCQlzdGF0ZS5yZXRIYW5kbGVycyA9IFtdOwoJCXN0YXRlLmNhbGxzID0gW107CgkJc3RhdGUuZGF0YSA9IHt9OwoJfTsKCW1vY2sucmVzZXQoKTsKCglyZXR1cm4gbW9jazsKfQoKZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb24oc3RhdGUsIG9wdGlvbnMpIHsKCWlmIChvcHRpb25zLmFzeW5jKSB7CgkJcmV0dXJuIGFzeW5jIGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gZ2V0RnVuY3Rpb25Cb2R5KHRoaXMsIHN0YXRlLCBvcHRpb25zLCBBcnJheS5mcm9tKGFyZ3VtZW50cykpOwoJCX07Cgl9IGVsc2UgewoJCXJldHVybiBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIGdldEZ1bmN0aW9uQm9keSh0aGlzLCBzdGF0ZSwgb3B0aW9ucywgQXJyYXkuZnJvbShhcmd1bWVudHMpKTsKCQl9OwoJfQp9CgpmdW5jdGlvbiBnZXRGdW5jdGlvbkJvZHkocGFyZW50LCBzdGF0ZSwgb3B0aW9ucywgcmF3QXJncykgewoJY29uc3QgYXJncyA9IGRlZXBDbG9uZShnZXRGdW5jdGlvbkFyZ3MocmF3QXJncywgb3B0aW9ucykpOwoJc3RhdGUuY2FsbHMucHVzaChhcmdzKTsKCWNvbnN0IGNhbGwgPSBzdGF0ZS5jYWxscy5sZW5ndGg7CgoJbGV0IHJldDsKCglpZiAoc3RhdGUucmV0c1tjYWxsXSkgewoJCXJldCA9IHN0YXRlLnJldHNbY2FsbF07Cgl9IGVsc2UgaWYgKHN0YXRlLnJldEhhbmRsZXJzW2NhbGxdKSB7CgkJcmV0ID0gc3RhdGUucmV0SGFuZGxlcnNbY2FsbF0oYXJncyk7Cgl9IGVsc2UgaWYgKHN0YXRlLnJldHNbMF0pIHsKCQlyZXQgPSBzdGF0ZS5yZXRzWzBdOwoJfSBlbHNlIGlmIChzdGF0ZS5yZXRIYW5kbGVyc1swXSkgewoJCXJldCA9IHN0YXRlLnJldEhhbmRsZXJzWzBdKGFyZ3MpOwoJfQoKCWlmIChyZXQgaW5zdGFuY2VvZiBFcnJvcikKCQl0aHJvdyByZXQ7CgoJaWYgKG9wdGlvbnMuYm9keSkgewoJCXJldHVybiBvcHRpb25zLmJvZHkoewoJCQlzZWxmOiBwYXJlbnQsCgkJCXN0YXRlOiBzdGF0ZSwKCQkJY2FsbDogY2FsbCwKCQkJYXJnczogYXJncywKCQkJcmF3QXJnczogcmF3QXJncywKCQkJb3JpZ2luYWw6IG9wdGlvbnMub3JpZ2luYWwsCgkJCXJldDogcmV0CgkJfSk7Cgl9IGVsc2UgewoJCXJldHVybiByZXQ7Cgl9Cn0KCmZ1bmN0aW9uIGdldEZ1bmN0aW9uQXJncyhjYWxsQXJncywgb3B0aW9ucykgewoJbGV0IGFyZ3MgPSBudWxsOwoKCWlmIChvcHRpb25zLnNlbGVjdC5sZW5ndGggPT0gMSkgewoJCWFyZ3MgPSBjYWxsQXJnc1tvcHRpb25zLnNlbGVjdFswXV07Cgl9IGVsc2UgaWYgKG9wdGlvbnMuYXJncy5sZW5ndGgpIHsKCQlhcmdzID0ge307CgoJCWZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9ucy5hcmdzLmxlbmd0aDsgaSsrKSB7CgkJCWlmIChvcHRpb25zLnNlbGVjdC5sZW5ndGggJiYgIW9wdGlvbnMuc2VsZWN0LmluY2x1ZGVzKGkpKQoJCQkJY29udGludWU7CgoJCQlsZXQgYXJnTmFtZSA9ICcnOwoJCQlsZXQgZGVmYXVsdFZhbHVlID0gdW5kZWZpbmVkOwoKCQkJaWYgKHR5cGVvZiBvcHRpb25zLmFyZ3NbaV0gPT0gJ3N0cmluZycpIHsKCQkJCWFyZ05hbWUgPSBvcHRpb25zLmFyZ3NbaV07CgkJCX0gZWxzZSB7CgkJCQlbYXJnTmFtZSwgZGVmYXVsdFZhbHVlXSA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuYXJnc1tpXSlbMF07CgkJCX0KCgkJCWFyZ3NbYXJnTmFtZV0gPSBjYWxsQXJnc1tpXSAhPT0gdW5kZWZpbmVkID8gY2FsbEFyZ3NbaV0gOiBkZWZhdWx0VmFsdWU7CgkJfQoJfQoKCXJldHVybiBhcmdzOwp9CgpmdW5jdGlvbiBvYmplY3RCdWlsZGVyKHByb3BzKSB7Cgljb25zdCBvcHRpb25zID0geyBwcm9wcyB9OwoKCXJldHVybiB7CgkJYnVpbGQ6IGZ1bmN0aW9uKHBhcmVudCwga2V5KSB7CgkJCWNvbnN0IG1vY2sgPSBjcmVhdGVPYmplY3RXaXRoUHJvcHMob3B0aW9ucy5wcm9wcyk7CgoJCQlpZiAocGFyZW50KQoJCQkJT2JqZWN0LmRlZmluZVByb3BlcnR5KHBhcmVudCwga2V5LCB7IHZhbHVlOiBtb2NrIH0pOwoJCQkKCQkJcmV0dXJuIHdpcmVPYmplY3QocGFyZW50ID8gcGFyZW50W2tleV0gOiBtb2NrKTsKCQl9Cgl9Owp9CgpmdW5jdGlvbiB3aXJlT2JqZWN0KG1vY2spIHsKCW1vY2sucmVzZXQgPSAoKSA9PiB7CgkJZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobW9jaykpIHsKCQkJaWYgKHR5cGVvZiBtb2NrW2tleV0ucmVzZXQgPT0gJ2Z1bmN0aW9uJykKCQkJCW1vY2tba2V5XS5yZXNldCgpOwoJCX0KCX07CgoJcmV0dXJuIG1vY2s7Cn0KCmZ1bmN0aW9uIGNyZWF0ZU9iamVjdFdpdGhQcm9wcyhwcm9wcykgewoJY29uc3Qgb2JqZWN0ID0ge307CgoJZm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHsKCQljb25zdCBwcm9wID0gcHJvcHNba2V5XTsKCgkJaWYgKHR5cGVvZiBwcm9wLmJ1aWxkID09ICdmdW5jdGlvbicpIHsKCQkJcHJvcC5idWlsZChvYmplY3QsIGtleSk7CgkJfSBlbHNlIHsKCQkJb2JqZWN0W2tleV0gPSBwcm9wOwoJCX0KCX0KCglyZXR1cm4gb2JqZWN0Owp9CgpmdW5jdGlvbiBjbGFzc0J1aWxkZXIobWVtYmVycykgewoJY29uc3Qgb3B0aW9ucyA9IHsgbWVtYmVycyB9OwoKCXJldHVybiB7CgkJYnVpbGQ6IGZ1bmN0aW9uKHBhcmVudCwga2V5KSB7CgkJCWNvbnN0IHN0YXRlID0ge307CgkJCWNvbnN0IE1vY2sgPSBjcmVhdGVDbGFzcyhzdGF0ZSwgb3B0aW9ucyk7CgoJCQlpZiAocGFyZW50KQoJCQkJT2JqZWN0LmRlZmluZVByb3BlcnR5KHBhcmVudCwga2V5LCB7IHZhbHVlOiBNb2NrIH0pOwoKCQkJcmV0dXJuIHdpcmVDbGFzcyhwYXJlbnQgPyBwYXJlbnRba2V5XSA6IE1vY2ssIHN0YXRlLCBvcHRpb25zKTsKCQl9Cgl9Owp9CgpmdW5jdGlvbiBjcmVhdGVDbGFzcyhzdGF0ZSwgb3B0aW9ucykgewoJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCWNvbnN0IGluZGV4ID0gc3RhdGUubnVtSW5zdGFuY2VzOwoKCQlpZiAoIXN0YXRlLmRlc2NyaXB0aW9uc1tpbmRleF0pCgkJCXN0YXRlLmRlc2NyaXB0aW9uc1tpbmRleF0gPSBjcmVhdGVPYmplY3RXaXRoUHJvcHMob3B0aW9ucy5tZW1iZXJzKTsKCgkJT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XSkpOwoKCQlpZiAodHlwZW9mIHN0YXRlLmRlc2NyaXB0aW9uc1tpbmRleF0uY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJykKCQkJc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIC4uLmFyZ3VtZW50cyk7CgoJCXN0YXRlLm51bUluc3RhbmNlcysrOwoJfTsKfQoKZnVuY3Rpb24gd2lyZUNsYXNzKE1vY2ssIHN0YXRlLCBvcHRpb25zKSB7CglNb2NrLmluc3QgPSAoaW5kZXggPSAwKSA9PiB7CgkJaWYgKCFzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdKQoJCQlzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdID0gY3JlYXRlT2JqZWN0V2l0aFByb3BzKG9wdGlvbnMubWVtYmVycyk7CgoJCXJldHVybiBzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdOwoJfTsKCU1vY2subnVtSW5zdHMgPSAoKSA9PiB7CgkJcmV0dXJuIHN0YXRlLm51bUluc3RhbmNlczsKCX07CglNb2NrLnJlc2V0ID0gKCkgPT4gewoJCXN0YXRlLmRlc2NyaXB0aW9ucyA9IFtdOwoJCXN0YXRlLm51bUluc3RhbmNlcyA9IDA7CgkJc3RhdGUuZGF0YSA9IHt9OwoJfTsKCU1vY2sucmVzZXQoKTsKCglyZXR1cm4gTW9jazsKfQoKZnVuY3Rpb24gcHJvcGVydHlCdWlsZGVyKCkgewoJcmV0dXJuIHsKCQlidWlsZDogZnVuY3Rpb24ocGFyZW50LCBrZXkpIHsKCQkJY29uc3Qgc3RhdGUgPSB7fTsKCgkJCWlmIChwYXJlbnQpIHsKCQkJCXBhcmVudFtrZXldID0ge307CgkJCQl3aXJlUHJvcGVydHkocGFyZW50W2tleV0sIHN0YXRlKTsKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXJlbnQsIGtleSwgewoJCQkJCWdldDogKCkgPT4gewoJCQkJCQlyZXR1cm4gc3RhdGUudmFsdWU7CgkJCQkJfSwKCQkJCQlzZXQ6ICh2YWx1ZSkgPT4gewoJCQkJCQlzdGF0ZS52YWx1ZSA9IHZhbHVlOwoJCQkJCX0KCQkJCX0pOwoJCQl9CgkJfQoJfTsKfQoKZnVuY3Rpb24gd2lyZVByb3BlcnR5KG1vY2ssIHN0YXRlKSB7Cgltb2NrLnJlc2V0ID0gKCkgPT4gewoJCXN0YXRlLnZhbHVlID0gdW5kZWZpbmVkOwoJfTsKCglyZXR1cm4gbW9jazsKfQoKZnVuY3Rpb24gZGVlcENsb25lKHRhcmdldCkgewoJaWYgKHR5cGVvZiB0YXJnZXQgPT0gJ29iamVjdCcpIHsKCQlpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpKSB7CgkJCXJldHVybiB0YXJnZXQubWFwKGRlZXBDbG9uZSk7CgkJfSBlbHNlIGlmICh0YXJnZXQ/LmNvbnN0cnVjdG9yID09IE9iamVjdCkgewoJCQljb25zdCBjbG9uZSA9IHt9OwoKCQkJZm9yIChjb25zdCBrZXkgaW4gdGFyZ2V0KSB7CgkJCQljbG9uZVtrZXldID0gZGVlcENsb25lKHRhcmdldFtrZXldKTsKCQkJfQoKCQkJcmV0dXJuIGNsb25lOwoJCX0KCX0KCglyZXR1cm4gdGFyZ2V0Owp9CgpmdW5jdGlvbiBzcHkob2JqZWN0LCBtZXRob2ROYW1lLCByZXBsYWNlbWVudCkgewoJY29uc3Qgb3JpZ2luYWwgPSBvYmplY3RbbWV0aG9kTmFtZV07CgoJbGV0IHNweUZuOwoJaWYgKHJlcGxhY2VtZW50KSB7CgkJLy8gVXNlIHByb3ZpZGVkIGJ1aWxkZXIKCQlzcHlGbiA9IHJlcGxhY2VtZW50LmJ1aWxkKCk7Cgl9IGVsc2UgewoJCS8vIE5vIHJlcGxhY2VtZW50LCBjcmVhdGUgY2FsbC10aHJvdWdoCgkJc3B5Rm4gPSBmdW5jdGlvbkJ1aWxkZXIoKGNvbnRleHQpID0+IHsKCQkJLy8gSWYgLnJldCgpIHdhcyBzZXQsIHVzZSBpdDsgb3RoZXJ3aXNlIGNhbGwgdGhyb3VnaAoJCQlpZiAoY29udGV4dC5yZXQgIT09IHVuZGVmaW5lZCkgewoJCQkJcmV0dXJuIGNvbnRleHQucmV0OwoJCQl9CgkJCXJldHVybiBjb250ZXh0Lm9yaWdpbmFsLmFwcGx5KGNvbnRleHQuc2VsZiwgY29udGV4dC5yYXdBcmdzKTsKCQl9LCBvcmlnaW5hbCkuYnVpbGQoKTsKCX0KCglzcHlGbi5yZXN0b3JlID0gKCkgPT4gewoJCW9iamVjdFttZXRob2ROYW1lXSA9IG9yaWdpbmFsOwoJfTsKCglvYmplY3RbbWV0aG9kTmFtZV0gPSBzcHlGbjsKCXJldHVybiBzcHlGbjsKfQoKbW9kdWxlLmV4cG9ydHMgPSB7CgljcmVhdGU6IG1vY2tCdWlsZGVyLAoJZnVuY3Rpb246IGZ1bmN0aW9uQnVpbGRlciwKCW9iamVjdDogb2JqZWN0QnVpbGRlciwKCWNsYXNzOiBjbGFzc0J1aWxkZXIsCglwcm9wZXJ0eTogcHJvcGVydHlCdWlsZGVyLAoJc3B5OiBzcHkKfTsKAAAAAAAAAACjGAAAAAAAAAAAAAA",
538
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABbAAAAAAAAAGMAAAAAAAAAAAAAAAAA8L8"
539
+ ],
540
+ [
541
+ 127,
542
+ 1,
543
+ "revert",
544
+ null,
545
+ "AgAAAAAAAAAAAAAAAAAAAAAAAACjGAAAZnVuY3Rpb24gbW9ja0J1aWxkZXIoYnVpbGRlcikgewoJcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKfQoKZnVuY3Rpb24gZnVuY3Rpb25CdWlsZGVyKGJvZHksIG9yaWdpbmFsKSB7Cgljb25zdCBvcHRpb25zID0gewoJCWFzeW5jOiBmYWxzZSwKCQlib2R5OiBib2R5LAoJCWFyZ3M6IFtdLAoJCXNlbGVjdDogW10sCgkJb3JpZ2luYWw6IG9yaWdpbmFsCgl9OwoKCXJldHVybiB7CgkJYXN5bmM6IGZ1bmN0aW9uKCkgewoJCQlvcHRpb25zLmFzeW5jID0gdHJ1ZTsKCQkJcmV0dXJuIHRoaXM7CgkJfSwKCQlhcmdzOiBmdW5jdGlvbiguLi5hcmdzKSB7CgkJCW9wdGlvbnMuYXJncyA9IGFyZ3M7CgkJCXJldHVybiB0aGlzOwoJCX0sCgkJYXJnU2VsZWN0OiBmdW5jdGlvbiguLi5pbmRleGVzKSB7CgkJCW9wdGlvbnMuc2VsZWN0ID0gaW5kZXhlczsKCQkJcmV0dXJuIHRoaXM7CgkJfSwKCQlidWlsZDogZnVuY3Rpb24ocGFyZW50LCBrZXkpIHsKCQkJY29uc3Qgc3RhdGUgPSB7fTsKCQkJY29uc3QgbW9jayA9IGNyZWF0ZUZ1bmN0aW9uKHN0YXRlLCBvcHRpb25zKTsKCgkJCWlmIChwYXJlbnQpCgkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkocGFyZW50LCBrZXksIHsgdmFsdWU6IG1vY2sgfSk7CgoJCQlyZXR1cm4gd2lyZUZ1bmN0aW9uKHBhcmVudCA/IHBhcmVudFtrZXldIDogbW9jaywgc3RhdGUpOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIHdpcmVGdW5jdGlvbihtb2NrLCBzdGF0ZSkgewoJbW9jay5yZXQgPSAodmFsdWUsIGNhbGwgPSAwKSA9PiB7CgkJc3RhdGUucmV0c1tjYWxsXSA9IHZhbHVlOwoJfTsKCW1vY2sub25SZXQgPSAoaGFuZGxlciwgY2FsbCA9IDApID0+IHsKCQlzdGF0ZS5yZXRIYW5kbGVyc1tjYWxsXSA9IGhhbmRsZXI7Cgl9OwoJbW9jay5jYWxscyA9IChjYWxsKSA9PiB7CgkJcmV0dXJuIGNhbGwgIT09IHVuZGVmaW5lZCA/IHN0YXRlLmNhbGxzW2NhbGxdIDogc3RhdGUuY2FsbHM7Cgl9Cgltb2NrLnJlc2V0ID0gKCkgPT4gewoJCXN0YXRlLnJldHMgPSBbXTsKCQlzdGF0ZS5yZXRIYW5kbGVycyA9IFtdOwoJCXN0YXRlLmNhbGxzID0gW107CgkJc3RhdGUuZGF0YSA9IHt9OwoJfTsKCW1vY2sucmVzZXQoKTsKCglyZXR1cm4gbW9jazsKfQoKZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb24oc3RhdGUsIG9wdGlvbnMpIHsKCWlmIChvcHRpb25zLmFzeW5jKSB7CgkJcmV0dXJuIGFzeW5jIGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gZ2V0RnVuY3Rpb25Cb2R5KHRoaXMsIHN0YXRlLCBvcHRpb25zLCBBcnJheS5mcm9tKGFyZ3VtZW50cykpOwoJCX07Cgl9IGVsc2UgewoJCXJldHVybiBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIGdldEZ1bmN0aW9uQm9keSh0aGlzLCBzdGF0ZSwgb3B0aW9ucywgQXJyYXkuZnJvbShhcmd1bWVudHMpKTsKCQl9OwoJfQp9CgpmdW5jdGlvbiBnZXRGdW5jdGlvbkJvZHkocGFyZW50LCBzdGF0ZSwgb3B0aW9ucywgcmF3QXJncykgewoJY29uc3QgYXJncyA9IGRlZXBDbG9uZShnZXRGdW5jdGlvbkFyZ3MocmF3QXJncywgb3B0aW9ucykpOwoJc3RhdGUuY2FsbHMucHVzaChhcmdzKTsKCWNvbnN0IGNhbGwgPSBzdGF0ZS5jYWxscy5sZW5ndGg7CgoJbGV0IHJldDsKCglpZiAoc3RhdGUucmV0c1tjYWxsXSkgewoJCXJldCA9IHN0YXRlLnJldHNbY2FsbF07Cgl9IGVsc2UgaWYgKHN0YXRlLnJldEhhbmRsZXJzW2NhbGxdKSB7CgkJcmV0ID0gc3RhdGUucmV0SGFuZGxlcnNbY2FsbF0oYXJncyk7Cgl9IGVsc2UgaWYgKHN0YXRlLnJldHNbMF0pIHsKCQlyZXQgPSBzdGF0ZS5yZXRzWzBdOwoJfSBlbHNlIGlmIChzdGF0ZS5yZXRIYW5kbGVyc1swXSkgewoJCXJldCA9IHN0YXRlLnJldEhhbmRsZXJzWzBdKGFyZ3MpOwoJfQoKCWlmIChyZXQgaW5zdGFuY2VvZiBFcnJvcikKCQl0aHJvdyByZXQ7CgoJaWYgKG9wdGlvbnMuYm9keSkgewoJCXJldHVybiBvcHRpb25zLmJvZHkoewoJCQlzZWxmOiBwYXJlbnQsCgkJCXN0YXRlOiBzdGF0ZSwKCQkJY2FsbDogY2FsbCwKCQkJYXJnczogYXJncywKCQkJcmF3QXJnczogcmF3QXJncywKCQkJb3JpZ2luYWw6IG9wdGlvbnMub3JpZ2luYWwsCgkJCXJldDogcmV0CgkJfSk7Cgl9IGVsc2UgewoJCXJldHVybiByZXQ7Cgl9Cn0KCmZ1bmN0aW9uIGdldEZ1bmN0aW9uQXJncyhjYWxsQXJncywgb3B0aW9ucykgewoJbGV0IGFyZ3MgPSBudWxsOwoKCWlmIChvcHRpb25zLnNlbGVjdC5sZW5ndGggPT0gMSkgewoJCWFyZ3MgPSBjYWxsQXJnc1tvcHRpb25zLnNlbGVjdFswXV07Cgl9IGVsc2UgaWYgKG9wdGlvbnMuYXJncy5sZW5ndGgpIHsKCQlhcmdzID0ge307CgoJCWZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9ucy5hcmdzLmxlbmd0aDsgaSsrKSB7CgkJCWlmIChvcHRpb25zLnNlbGVjdC5sZW5ndGggJiYgIW9wdGlvbnMuc2VsZWN0LmluY2x1ZGVzKGkpKQoJCQkJY29udGludWU7CgoJCQlsZXQgYXJnTmFtZSA9ICcnOwoJCQlsZXQgZGVmYXVsdFZhbHVlID0gdW5kZWZpbmVkOwoKCQkJaWYgKHR5cGVvZiBvcHRpb25zLmFyZ3NbaV0gPT0gJ3N0cmluZycpIHsKCQkJCWFyZ05hbWUgPSBvcHRpb25zLmFyZ3NbaV07CgkJCX0gZWxzZSB7CgkJCQlbYXJnTmFtZSwgZGVmYXVsdFZhbHVlXSA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuYXJnc1tpXSlbMF07CgkJCX0KCgkJCWFyZ3NbYXJnTmFtZV0gPSBjYWxsQXJnc1tpXSAhPT0gdW5kZWZpbmVkID8gY2FsbEFyZ3NbaV0gOiBkZWZhdWx0VmFsdWU7CgkJfQoJfSBlbHNlIHsKCQkvLyBOT1RFOiBQcmV2aW91c2x5IHJldHVybmVkIG51bGwuIE5vdyByZXR1cm5zIGFycmF5IChtYXkgYnJlYWsgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpLgoJCWFyZ3MgPSBBcnJheS5mcm9tKGNhbGxBcmdzKTsKCX0KCglyZXR1cm4gYXJnczsKfQoKZnVuY3Rpb24gb2JqZWN0QnVpbGRlcihwcm9wcykgewoJY29uc3Qgb3B0aW9ucyA9IHsgcHJvcHMgfTsKCglyZXR1cm4gewoJCWJ1aWxkOiBmdW5jdGlvbihwYXJlbnQsIGtleSkgewoJCQljb25zdCBtb2NrID0gY3JlYXRlT2JqZWN0V2l0aFByb3BzKG9wdGlvbnMucHJvcHMpOwoKCQkJaWYgKHBhcmVudCkKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXJlbnQsIGtleSwgeyB2YWx1ZTogbW9jayB9KTsKCQkJCgkJCXJldHVybiB3aXJlT2JqZWN0KHBhcmVudCA/IHBhcmVudFtrZXldIDogbW9jayk7CgkJfQoJfTsKfQoKZnVuY3Rpb24gd2lyZU9iamVjdChtb2NrKSB7Cgltb2NrLnJlc2V0ID0gKCkgPT4gewoJCWZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG1vY2spKSB7CgkJCWlmICh0eXBlb2YgbW9ja1trZXldLnJlc2V0ID09ICdmdW5jdGlvbicpCgkJCQltb2NrW2tleV0ucmVzZXQoKTsKCQl9Cgl9OwoKCXJldHVybiBtb2NrOwp9CgpmdW5jdGlvbiBjcmVhdGVPYmplY3RXaXRoUHJvcHMocHJvcHMpIHsKCWNvbnN0IG9iamVjdCA9IHt9OwoKCWZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7CgkJY29uc3QgcHJvcCA9IHByb3BzW2tleV07CgoJCWlmICh0eXBlb2YgcHJvcC5idWlsZCA9PSAnZnVuY3Rpb24nKSB7CgkJCXByb3AuYnVpbGQob2JqZWN0LCBrZXkpOwoJCX0gZWxzZSB7CgkJCW9iamVjdFtrZXldID0gcHJvcDsKCQl9Cgl9CgoJcmV0dXJuIG9iamVjdDsKfQoKZnVuY3Rpb24gY2xhc3NCdWlsZGVyKG1lbWJlcnMpIHsKCWNvbnN0IG9wdGlvbnMgPSB7IG1lbWJlcnMgfTsKCglyZXR1cm4gewoJCWJ1aWxkOiBmdW5jdGlvbihwYXJlbnQsIGtleSkgewoJCQljb25zdCBzdGF0ZSA9IHt9OwoJCQljb25zdCBNb2NrID0gY3JlYXRlQ2xhc3Moc3RhdGUsIG9wdGlvbnMpOwoKCQkJaWYgKHBhcmVudCkKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXJlbnQsIGtleSwgeyB2YWx1ZTogTW9jayB9KTsKCgkJCXJldHVybiB3aXJlQ2xhc3MocGFyZW50ID8gcGFyZW50W2tleV0gOiBNb2NrLCBzdGF0ZSwgb3B0aW9ucyk7CgkJfQoJfTsKfQoKZnVuY3Rpb24gY3JlYXRlQ2xhc3Moc3RhdGUsIG9wdGlvbnMpIHsKCXJldHVybiBmdW5jdGlvbigpIHsKCQljb25zdCBpbmRleCA9IHN0YXRlLm51bUluc3RhbmNlczsKCgkJaWYgKCFzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdKQoJCQlzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdID0gY3JlYXRlT2JqZWN0V2l0aFByb3BzKG9wdGlvbnMubWVtYmVycyk7CgoJCU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHN0YXRlLmRlc2NyaXB0aW9uc1tpbmRleF0pKTsKCgkJaWYgKHR5cGVvZiBzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicpCgkJCXN0YXRlLmRlc2NyaXB0aW9uc1tpbmRleF0uY29uc3RydWN0b3IuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpOwoKCQlzdGF0ZS5udW1JbnN0YW5jZXMrKzsKCX07Cn0KCmZ1bmN0aW9uIHdpcmVDbGFzcyhNb2NrLCBzdGF0ZSwgb3B0aW9ucykgewoJTW9jay5pbnN0ID0gKGluZGV4ID0gMCkgPT4gewoJCWlmICghc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XSkKCQkJc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XSA9IGNyZWF0ZU9iamVjdFdpdGhQcm9wcyhvcHRpb25zLm1lbWJlcnMpOwoKCQlyZXR1cm4gc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XTsKCX07CglNb2NrLm51bUluc3RzID0gKCkgPT4gewoJCXJldHVybiBzdGF0ZS5udW1JbnN0YW5jZXM7Cgl9OwoJTW9jay5yZXNldCA9ICgpID0+IHsKCQlzdGF0ZS5kZXNjcmlwdGlvbnMgPSBbXTsKCQlzdGF0ZS5udW1JbnN0YW5jZXMgPSAwOwoJCXN0YXRlLmRhdGEgPSB7fTsKCX07CglNb2NrLnJlc2V0KCk7CgoJcmV0dXJuIE1vY2s7Cn0KCmZ1bmN0aW9uIHByb3BlcnR5QnVpbGRlcigpIHsKCXJldHVybiB7CgkJYnVpbGQ6IGZ1bmN0aW9uKHBhcmVudCwga2V5KSB7CgkJCWNvbnN0IHN0YXRlID0ge307CgoJCQlpZiAocGFyZW50KSB7CgkJCQlwYXJlbnRba2V5XSA9IHt9OwoJCQkJd2lyZVByb3BlcnR5KHBhcmVudFtrZXldLCBzdGF0ZSk7CgkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkocGFyZW50LCBrZXksIHsKCQkJCQlnZXQ6ICgpID0+IHsKCQkJCQkJcmV0dXJuIHN0YXRlLnZhbHVlOwoJCQkJCX0sCgkJCQkJc2V0OiAodmFsdWUpID0+IHsKCQkJCQkJc3RhdGUudmFsdWUgPSB2YWx1ZTsKCQkJCQl9CgkJCQl9KTsKCQkJfQoJCX0KCX07Cn0KCmZ1bmN0aW9uIHdpcmVQcm9wZXJ0eShtb2NrLCBzdGF0ZSkgewoJbW9jay5yZXNldCA9ICgpID0+IHsKCQlzdGF0ZS52YWx1ZSA9IHVuZGVmaW5lZDsKCX07CgoJcmV0dXJuIG1vY2s7Cn0KCmZ1bmN0aW9uIGRlZXBDbG9uZSh0YXJnZXQpIHsKCWlmICh0eXBlb2YgdGFyZ2V0ID09ICdvYmplY3QnKSB7CgkJaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkgewoJCQlyZXR1cm4gdGFyZ2V0Lm1hcChkZWVwQ2xvbmUpOwoJCX0gZWxzZSBpZiAodGFyZ2V0Py5jb25zdHJ1Y3RvciA9PSBPYmplY3QpIHsKCQkJY29uc3QgY2xvbmUgPSB7fTsKCgkJCWZvciAoY29uc3Qga2V5IGluIHRhcmdldCkgewoJCQkJY2xvbmVba2V5XSA9IGRlZXBDbG9uZSh0YXJnZXRba2V5XSk7CgkJCX0KCgkJCXJldHVybiBjbG9uZTsKCQl9Cgl9CgoJcmV0dXJuIHRhcmdldDsKfQoKZnVuY3Rpb24gc3B5KG9iamVjdCwgbWV0aG9kTmFtZSwgcmVwbGFjZW1lbnQpIHsKCWNvbnN0IG9yaWdpbmFsID0gb2JqZWN0W21ldGhvZE5hbWVdOwoKCWxldCBzcHlGbjsKCWlmIChyZXBsYWNlbWVudCkgewoJCS8vIFVzZSBwcm92aWRlZCBidWlsZGVyCgkJc3B5Rm4gPSByZXBsYWNlbWVudC5idWlsZCgpOwoJfSBlbHNlIHsKCQkvLyBObyByZXBsYWNlbWVudCwgY3JlYXRlIGNhbGwtdGhyb3VnaAoJCXNweUZuID0gZnVuY3Rpb25CdWlsZGVyKChjb250ZXh0KSA9PiB7CgkJCS8vIElmIC5yZXQoKSB3YXMgc2V0LCB1c2UgaXQ7IG90aGVyd2lzZSBjYWxsIHRocm91Z2gKCQkJaWYgKGNvbnRleHQucmV0ICE9PSB1bmRlZmluZWQpIHsKCQkJCXJldHVybiBjb250ZXh0LnJldDsKCQkJfQoJCQlyZXR1cm4gY29udGV4dC5vcmlnaW5hbC5hcHBseShjb250ZXh0LnNlbGYsIGNvbnRleHQucmF3QXJncyk7CgkJfSwgb3JpZ2luYWwpLmJ1aWxkKCk7Cgl9CgoJc3B5Rm4ucmVzdG9yZSA9ICgpID0+IHsKCQlvYmplY3RbbWV0aG9kTmFtZV0gPSBvcmlnaW5hbDsKCX07CgoJb2JqZWN0W21ldGhvZE5hbWVdID0gc3B5Rm47CglyZXR1cm4gc3B5Rm47Cn0KCm1vZHVsZS5leHBvcnRzID0gewoJY3JlYXRlOiBtb2NrQnVpbGRlciwKCWZ1bmN0aW9uOiBmdW5jdGlvbkJ1aWxkZXIsCglvYmplY3Q6IG9iamVjdEJ1aWxkZXIsCgljbGFzczogY2xhc3NCdWlsZGVyLAoJcHJvcGVydHk6IHByb3BlcnR5QnVpbGRlciwKCXNweTogc3B5Cn07CgAAAAAAAAAAFxkAAAAAAAAAAAAA",
546
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAANFgAAAAAAAA0WAAAAAAAAAAAAAAAA8L8"
547
+ ],
548
+ [
549
+ 135,
550
+ 1,
551
+ "cut",
552
+ null,
553
+ "AQAAAG8WAAAAAAAAbxYAAAAAAAAxAAAACQkvLyBVc2UgcHJvdmlkZWQgYnVpbGRlciB3aXRoIG9yaWdpbmFsIGluamVjdGVkCg",
554
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACJFgAAAAAAAIkWAAAAAAAAAAAAAAAA8L8"
555
+ ],
556
+ [
557
+ 138,
558
+ 11,
559
+ "swap_line_down",
560
+ null,
561
+ "FgAAAKsWAAAAAAAA3RYAAAAAAAAAAAAAbxYAAAAAAABvFgAAAAAAADIAAAAJCXNweUZuID0gcmVwbGFjZW1lbnQub3JpZ2luYWwob3JpZ2luYWwpLmJ1aWxkKCk7CtQWAAAAAAAABhcAAAAAAAAAAAAAeRYAAAAAAAB5FgAAAAAAADIAAAAJCXNweUZuID0gcmVwbGFjZW1lbnQub3JpZ2luYWwob3JpZ2luYWwpLmJ1aWxkKCk7Cv0WAAAAAAAALxcAAAAAAAAAAAAAohYAAAAAAACiFgAAAAAAADIAAAAJCXNweUZuID0gcmVwbGFjZW1lbnQub3JpZ2luYWwob3JpZ2luYWwpLmJ1aWxkKCk7CjUXAAAAAAAAZxcAAAAAAAAAAAAAyxYAAAAAAADLFgAAAAAAADIAAAAJCXNweUZuID0gcmVwbGFjZW1lbnQub3JpZ2luYWwob3JpZ2luYWwpLmJ1aWxkKCk7ClkXAAAAAAAAixcAAAAAAAAAAAAAAxcAAAAAAAADFwAAAAAAADIAAAAJCXNweUZuID0gcmVwbGFjZW1lbnQub3JpZ2luYWwob3JpZ2luYWwpLmJ1aWxkKCk7CnEXAAAAAAAAoxcAAAAAAAAAAAAAJxcAAAAAAAAnFwAAAAAAADIAAAAJCXNweUZuID0gcmVwbGFjZW1lbnQub3JpZ2luYWwob3JpZ2luYWwpLmJ1aWxkKCk7CnYXAAAAAAAAqBcAAAAAAAAAAAAAPxcAAAAAAAA/FwAAAAAAADIAAAAJCXNweUZuID0gcmVwbGFjZW1lbnQub3JpZ2luYWwob3JpZ2luYWwpLmJ1aWxkKCk7CrcXAAAAAAAA6RcAAAAAAAAAAAAARBcAAAAAAABEFwAAAAAAADIAAAAJCXNweUZuID0gcmVwbGFjZW1lbnQub3JpZ2luYWwob3JpZ2luYWwpLmJ1aWxkKCk7CtgXAAAAAAAAChgAAAAAAAAAAAAAhRcAAAAAAACFFwAAAAAAADIAAAAJCXNweUZuID0gcmVwbGFjZW1lbnQub3JpZ2luYWwob3JpZ2luYWwpLmJ1aWxkKCk7CtsXAAAAAAAADRgAAAAAAAAAAAAAphcAAAAAAACmFwAAAAAAADIAAAAJCXNweUZuID0gcmVwbGFjZW1lbnQub3JpZ2luYWwob3JpZ2luYWwpLmJ1aWxkKCk7CtwXAAAAAAAADhgAAAAAAAAAAAAAqRcAAAAAAACpFwAAAAAAADIAAAAJCXNweUZuID0gcmVwbGFjZW1lbnQub3JpZ2luYWwob3JpZ2luYWwpLmJ1aWxkKCk7Cg",
562
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABvFgAAAAAAAG8WAAAAAAAAAAAAAAAAAAA"
563
+ ],
564
+ [
565
+ 140,
566
+ 1,
567
+ "left_delete",
568
+ null,
569
+ "AQAAAKsXAAAAAAAAqxcAAAAAAAABAAAACQ",
570
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACsFwAAAAAAAKwXAAAAAAAAAAAAAAAA8L8"
571
+ ],
572
+ [
573
+ 141,
574
+ 1,
575
+ "insert",
576
+ {
577
+ "characters": "cons"
578
+ },
579
+ "BAAAAKsXAAAAAAAArBcAAAAAAAAAAAAArBcAAAAAAACtFwAAAAAAAAAAAACtFwAAAAAAAK4XAAAAAAAAAAAAAK4XAAAAAAAArxcAAAAAAAAAAAAA",
580
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACrFwAAAAAAAKsXAAAAAAAAAAAAAAAA8L8"
581
+ ],
582
+ [
583
+ 142,
584
+ 1,
585
+ "insert",
586
+ {
587
+ "characters": " "
588
+ },
589
+ "AQAAAK8XAAAAAAAAsBcAAAAAAAAAAAAA",
590
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACvFwAAAAAAAK8XAAAAAAAAAAAAAAAA8L8"
591
+ ],
592
+ [
593
+ 143,
594
+ 5,
595
+ "left_delete",
596
+ null,
597
+ "BQAAAK8XAAAAAAAArxcAAAAAAAABAAAAIK4XAAAAAAAArhcAAAAAAAABAAAAc60XAAAAAAAArRcAAAAAAAABAAAAbqwXAAAAAAAArBcAAAAAAAABAAAAb6sXAAAAAAAAqxcAAAAAAAABAAAAYw",
598
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACwFwAAAAAAALAXAAAAAAAAAAAAAAAA8L8"
599
+ ],
600
+ [
601
+ 144,
602
+ 1,
603
+ "insert",
604
+ {
605
+ "characters": "const"
606
+ },
607
+ "BQAAAKsXAAAAAAAArBcAAAAAAAAAAAAArBcAAAAAAACtFwAAAAAAAAAAAACtFwAAAAAAAK4XAAAAAAAAAAAAAK4XAAAAAAAArxcAAAAAAAAAAAAArxcAAAAAAACwFwAAAAAAAAAAAAA",
608
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACrFwAAAAAAAKsXAAAAAAAAAAAAAAAA8L8"
609
+ ],
610
+ [
611
+ 145,
612
+ 1,
613
+ "insert",
614
+ {
615
+ "characters": " "
616
+ },
617
+ "AQAAALAXAAAAAAAAsRcAAAAAAAAAAAAA",
618
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACwFwAAAAAAALAXAAAAAAAAAAAAAAAA8L8"
619
+ ],
620
+ [
621
+ 151,
622
+ 1,
623
+ "cut",
624
+ null,
625
+ "AQAAAE8WAAAAAAAATxYAAAAAAAAMAAAACWxldCBzcHlGbjsK",
626
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABaFgAAAAAAAFoWAAAAAAAAAAAAAAAA8L8"
627
+ ],
628
+ [
629
+ 153,
630
+ 1,
631
+ "insert",
632
+ {
633
+ "characters": "!"
634
+ },
635
+ "AQAAAFQWAAAAAAAAVRYAAAAAAAAAAAAA",
636
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABUFgAAAAAAAFQWAAAAAAAAAAAAAAAA8L8"
637
+ ],
638
+ [
639
+ 155,
640
+ 2,
641
+ "cut",
642
+ null,
643
+ "AgAAAGQWAAAAAAAAZBYAAAAAAAAKAAAACX0gZWxzZSB7CmQWAAAAAAAAZBYAAAAAAAApAAAACQkvLyBObyByZXBsYWNlbWVudCwgY3JlYXRlIGNhbGwtdGhyb3VnaAo",
644
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABqFgAAAAAAAGoWAAAAAAAAAAAAAACAT0A"
645
+ ],
646
+ [
647
+ 167,
648
+ 1,
649
+ "paste",
650
+ null,
651
+ "AQAAAGYWAAAAAAAAcRYAAAAAAAAFAAAAc3B5Rm4",
652
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABmFgAAAAAAAGsWAAAAAAAAAAAAAAAA8L8"
653
+ ],
654
+ [
655
+ 168,
656
+ 2,
657
+ "right_delete",
658
+ null,
659
+ "AgAAAHEWAAAAAAAAcRYAAAAAAAABAAAAIHEWAAAAAAAAcRYAAAAAAAABAAAAPQ",
660
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABxFgAAAAAAAHEWAAAAAAAAAAAAAAAA8L8"
661
+ ],
662
+ [
663
+ 169,
664
+ 1,
665
+ "insert",
666
+ {
667
+ "characters": " ="
668
+ },
669
+ "AgAAAHEWAAAAAAAAchYAAAAAAAAAAAAAchYAAAAAAABzFgAAAAAAAAAAAAA",
670
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABxFgAAAAAAAHEWAAAAAAAAAAAAAAAA8L8"
671
+ ],
672
+ [
673
+ 173,
674
+ 1,
675
+ "left_delete",
676
+ null,
677
+ "AQAAAFEXAAAAAAAAURcAAAAAAAAcAAAALm9yaWdpbmFsKG9yaWdpbmFsKS5idWlsZCgpOw",
678
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABRFwAAAAAAAG0XAAAAAAAA////////738"
679
+ ],
680
+ [
681
+ 174,
682
+ 1,
683
+ "insert",
684
+ {
685
+ "characters": ";"
686
+ },
687
+ "AQAAAFEXAAAAAAAAUhcAAAAAAAAAAAAA",
688
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABRFwAAAAAAAFEXAAAAAAAAAAAAAAAA8L8"
689
+ ],
690
+ [
691
+ 176,
692
+ 1,
693
+ "cut",
694
+ null,
695
+ "AQAAAJMWAAAAAAAAkxYAAAAAAAA4AAAACQkJLy8gSWYgLnJldCgpIHdhcyBzZXQsIHVzZSBpdDsgb3RoZXJ3aXNlIGNhbGwgdGhyb3VnaAo",
696
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACWFgAAAAAAAJYWAAAAAAAAAAAAAABAU0A"
697
+ ],
698
+ [
699
+ 178,
700
+ 2,
701
+ "left_delete",
702
+ null,
703
+ "AgAAALUWAAAAAAAAtRYAAAAAAAABAAAAe7QWAAAAAAAAtBYAAAAAAAABAAAAIA",
704
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAC2FgAAAAAAALYWAAAAAAAA////////738"
705
+ ],
706
+ [
707
+ 180,
708
+ 1,
709
+ "cut",
710
+ null,
711
+ "AQAAAM0WAAAAAAAAzRYAAAAAAAAFAAAACQkJfQo",
712
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADRFgAAAAAAANEWAAAAAAAAAAAAAABgckA"
713
+ ],
714
+ [
715
+ 181,
716
+ 1,
717
+ "insert",
718
+ {
719
+ "characters": "\n"
720
+ },
721
+ "AQAAAM0WAAAAAAAAzhYAAAAAAAAAAAAA",
722
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADNFgAAAAAAAM0WAAAAAAAAAAAAAAAA8L8"
723
+ ],
724
+ [
725
+ 196,
726
+ 1,
727
+ "insert",
728
+ {
729
+ "characters": "ctx"
730
+ },
731
+ "EgAAAP0WAAAAAAAA/hYAAAAAAAAHAAAAY29udGV4dO8WAAAAAAAA8BYAAAAAAAAHAAAAY29udGV4dNgWAAAAAAAA2RYAAAAAAAAHAAAAY29udGV4dMAWAAAAAAAAwRYAAAAAAAAHAAAAY29udGV4dJoWAAAAAAAAmxYAAAAAAAAHAAAAY29udGV4dIUWAAAAAAAAhhYAAAAAAAAHAAAAY29udGV4dOAWAAAAAAAA4RYAAAAAAAAAAAAA2BYAAAAAAADZFgAAAAAAAAAAAADHFgAAAAAAAMgWAAAAAAAAAAAAALUWAAAAAAAAthYAAAAAAAAAAAAAlRYAAAAAAACWFgAAAAAAAAAAAACGFgAAAAAAAIcWAAAAAAAAAAAAAOYWAAAAAAAA5xYAAAAAAAAAAAAA3RYAAAAAAADeFgAAAAAAAAAAAADLFgAAAAAAAMwWAAAAAAAAAAAAALgWAAAAAAAAuRYAAAAAAAAAAAAAlxYAAAAAAACYFgAAAAAAAAAAAACHFgAAAAAAAIgWAAAAAAAAAAAAAA",
732
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAYAAACFFgAAAAAAAIwWAAAAAAAAAAAAAAAA8L+aFgAAAAAAAKEWAAAAAAAAAAAAAAAA8L/AFgAAAAAAAMcWAAAAAAAAAAAAAAAA8L/YFgAAAAAAAN8WAAAAAAAAAAAAAAAA8L/vFgAAAAAAAPYWAAAAAAAAAAAAAAAA8L/9FgAAAAAAAAQXAAAAAAAAAAAAAAAA8L8"
733
+ ],
734
+ [
735
+ 205,
736
+ 10,
737
+ "swap_line_down",
738
+ null,
739
+ "FAAAAE8WAAAAAAAAdRYAAAAAAAAAAAAAKBYAAAAAAAAoFgAAAAAAACYAAAAJY29uc3Qgb3JpZ2luYWwgPSBvYmplY3RbbWV0aG9kTmFtZV07CmQWAAAAAAAAihYAAAAAAAAAAAAAKRYAAAAAAAApFgAAAAAAACYAAAAJY29uc3Qgb3JpZ2luYWwgPSBvYmplY3RbbWV0aG9kTmFtZV07Co8WAAAAAAAAtRYAAAAAAAAAAAAAPhYAAAAAAAA+FgAAAAAAACYAAAAJY29uc3Qgb3JpZ2luYWwgPSBvYmplY3RbbWV0aG9kTmFtZV07Cq0WAAAAAAAA0xYAAAAAAAAAAAAAaRYAAAAAAABpFgAAAAAAACYAAAAJY29uc3Qgb3JpZ2luYWwgPSBvYmplY3RbbWV0aG9kTmFtZV07CsEWAAAAAAAA5xYAAAAAAAAAAAAAhxYAAAAAAACHFgAAAAAAACYAAAAJY29uc3Qgb3JpZ2luYWwgPSBvYmplY3RbbWV0aG9kTmFtZV07CsIWAAAAAAAA6BYAAAAAAAAAAAAAmxYAAAAAAACbFgAAAAAAACYAAAAJY29uc3Qgb3JpZ2luYWwgPSBvYmplY3RbbWV0aG9kTmFtZV07CvcWAAAAAAAAHRcAAAAAAAAAAAAAnBYAAAAAAACcFgAAAAAAACYAAAAJY29uc3Qgb3JpZ2luYWwgPSBvYmplY3RbbWV0aG9kTmFtZV07Cv0WAAAAAAAAIxcAAAAAAAAAAAAA0RYAAAAAAADRFgAAAAAAACYAAAAJY29uc3Qgb3JpZ2luYWwgPSBvYmplY3RbbWV0aG9kTmFtZV07CgAXAAAAAAAAJhcAAAAAAAAAAAAA1xYAAAAAAADXFgAAAAAAACYAAAAJY29uc3Qgb3JpZ2luYWwgPSBvYmplY3RbbWV0aG9kTmFtZV07CgEXAAAAAAAAJxcAAAAAAAAAAAAA2hYAAAAAAADaFgAAAAAAACYAAAAJY29uc3Qgb3JpZ2luYWwgPSBvYmplY3RbbWV0aG9kTmFtZV07Cg",
740
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAA0FgAAAAAAADQWAAAAAAAAAAAAAAAA8L8"
741
+ ],
742
+ [
743
+ 207,
744
+ 1,
745
+ "cut",
746
+ null,
747
+ "AQAAACgWAAAAAAAAKBYAAAAAAAABAAAACg",
748
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAoFgAAAAAAACgWAAAAAAAAAAAAAABAWkA"
749
+ ],
750
+ [
751
+ 212,
752
+ 1,
753
+ "cut",
754
+ null,
755
+ "AQAAAHUXAAAAAAAAdRcAAAAAAAABAAAACg",
756
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAB1FwAAAAAAAHUXAAAAAAAAAAAAAAAAAAA"
757
+ ],
758
+ [
759
+ 214,
760
+ 1,
761
+ "insert",
762
+ {
763
+ "characters": "\n"
764
+ },
765
+ "AQAAAJIXAAAAAAAAkxcAAAAAAAAAAAAA",
766
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACSFwAAAAAAAJIXAAAAAAAAAAAAAAAAAAA"
767
+ ],
768
+ [
769
+ 224,
770
+ 5,
771
+ "swap_line_up",
772
+ null,
773
+ "CgAAADQYAAAAAAAANBgAAAAAAAAKAAAACXNweTogc3B5ChgYAAAAAAAAIhgAAAAAAAAAAAAAGBgAAAAAAAAYGAAAAAAAAAoAAAAJc3B5OiBzcHkKAhgAAAAAAAAMGAAAAAAAAAAAAAACGAAAAAAAAAIYAAAAAAAACgAAAAlzcHk6IHNweQrqFwAAAAAAAPQXAAAAAAAAAAAAAOoXAAAAAAAA6hcAAAAAAAAKAAAACXNweTogc3B5Cs4XAAAAAAAA2BcAAAAAAAAAAAAAzhcAAAAAAADOFwAAAAAAAAoAAAAJc3B5OiBzcHkKuBcAAAAAAADCFwAAAAAAAAAAAAA",
774
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAA9GAAAAAAAAD0YAAAAAAAAAAAAAAAA8L8"
775
+ ],
776
+ [
777
+ 225,
778
+ 1,
779
+ "insert",
780
+ {
781
+ "characters": ","
782
+ },
783
+ "AQAAAMEXAAAAAAAAwhcAAAAAAAAAAAAA",
784
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADBFwAAAAAAAMEXAAAAAAAAAAAAAAAA8L8"
785
+ ],
786
+ [
787
+ 234,
788
+ 1,
789
+ "insert",
790
+ {
791
+ "characters": "s"
792
+ },
793
+ "AgAAAL4XAAAAAAAAvxcAAAAAAAADAAAAc3B5ARYAAAAAAAACFgAAAAAAAAMAAABzcHk",
794
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAIAAAABFgAAAAAAAAQWAAAAAAAAAAAAAAAA8L++FwAAAAAAAMEXAAAAAAAAAAAAAAAA8L8"
795
+ ],
796
+ [
797
+ 235,
798
+ 1,
799
+ "left_delete",
800
+ null,
801
+ "AgAAALwXAAAAAAAAvBcAAAAAAAABAAAAcwEWAAAAAAAAARYAAAAAAAABAAAAcw",
802
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAIAAAACFgAAAAAAAAIWAAAAAAAAAAAAAAAA8L+9FwAAAAAAAL0XAAAAAAAAAAAAAAAA8L8"
803
+ ],
804
+ [
805
+ 236,
806
+ 1,
807
+ "insert",
808
+ {
809
+ "characters": "createSpy"
810
+ },
811
+ "EgAAALsXAAAAAAAAvBcAAAAAAAAAAAAAARYAAAAAAAACFgAAAAAAAAAAAAC9FwAAAAAAAL4XAAAAAAAAAAAAAAIWAAAAAAAAAxYAAAAAAAAAAAAAvxcAAAAAAADAFwAAAAAAAAAAAAADFgAAAAAAAAQWAAAAAAAAAAAAAMEXAAAAAAAAwhcAAAAAAAAAAAAABBYAAAAAAAAFFgAAAAAAAAAAAADDFwAAAAAAAMQXAAAAAAAAAAAAAAUWAAAAAAAABhYAAAAAAAAAAAAAxRcAAAAAAADGFwAAAAAAAAAAAAAGFgAAAAAAAAcWAAAAAAAAAAAAAMcXAAAAAAAAyBcAAAAAAAAAAAAABxYAAAAAAAAIFgAAAAAAAAAAAADJFwAAAAAAAMoXAAAAAAAAAAAAAAgWAAAAAAAACRYAAAAAAAAAAAAAyxcAAAAAAADMFwAAAAAAAAAAAAAJFgAAAAAAAAoWAAAAAAAAAAAAAA",
812
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAIAAAABFgAAAAAAAAEWAAAAAAAAAAAAAAAA8L+7FwAAAAAAALsXAAAAAAAAAAAAAAAA8L8"
813
+ ],
814
+ [
815
+ 243,
816
+ 1,
817
+ "insert",
818
+ {
819
+ "characters": "key"
820
+ },
821
+ "DAAAAIMXAAAAAAAAhBcAAAAAAAAKAAAAbWV0aG9kTmFtZV8XAAAAAAAAYBcAAAAAAAAKAAAAbWV0aG9kTmFtZfkWAAAAAAAA+hYAAAAAAAAKAAAAbWV0aG9kTmFtZRMWAAAAAAAAFBYAAAAAAAAKAAAAbWV0aG9kTmFtZWkXAAAAAAAAahcAAAAAAAAAAAAAThcAAAAAAABPFwAAAAAAAAAAAADxFgAAAAAAAPIWAAAAAAAAAAAAABQWAAAAAAAAFRYAAAAAAAAAAAAAbRcAAAAAAABuFwAAAAAAAAAAAABRFwAAAAAAAFIXAAAAAAAAAAAAAPMWAAAAAAAA9BYAAAAAAAAAAAAAFRYAAAAAAAAWFgAAAAAAAAAAAAA",
822
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAQAAAATFgAAAAAAAB0WAAAAAAAAAAAAAAAA8L/5FgAAAAAAAAMXAAAAAAAAAAAAAAAA8L9fFwAAAAAAAGkXAAAAAAAAAAAAAAAA8L+DFwAAAAAAAI0XAAAAAAAAAAAAAAAA8L8"
823
+ ],
824
+ [
825
+ 257,
826
+ 1,
827
+ "insert",
828
+ {
829
+ "characters": "="
830
+ },
831
+ "AQAAAO0UAAAAAAAA7hQAAAAAAAAAAAAA",
832
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADtFAAAAAAAAO0UAAAAAAAAAAAAAAAA8L8"
833
+ ],
834
+ [
835
+ 260,
836
+ 1,
837
+ "insert",
838
+ {
839
+ "characters": "="
840
+ },
841
+ "AQAAAF4VAAAAAAAAXxUAAAAAAAAAAAAA",
842
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABeFQAAAAAAAF4VAAAAAAAAAAAAAAAA8L8"
843
+ ],
844
+ [
845
+ 264,
846
+ 1,
847
+ "insert",
848
+ {
849
+ "characters": "="
850
+ },
851
+ "AQAAAO4QAAAAAAAA7xAAAAAAAAAAAAAA",
852
+ "CwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADuEAAAAAAAAO4QAAAAAAAAAAAAAAAA8L8"
853
+ ],
854
+ [
855
+ 10,
856
+ 1,
857
+ "revert",
858
+ null,
859
+ "BwAAAAAAAAAAAAAAAAAAAAAAAAA1GAAAZnVuY3Rpb24gbW9ja0J1aWxkZXIoYnVpbGRlcikgewoJcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKfQoKZnVuY3Rpb24gZnVuY3Rpb25CdWlsZGVyKGJvZHkpIHsKCWNvbnN0IG9wdGlvbnMgPSB7CgkJYXN5bmM6IGZhbHNlLAoJCWJvZHk6IGJvZHksCgkJYXJnczogW10sCgkJc2VsZWN0OiBbXSwKCQlvcmlnaW5hbDogdW5kZWZpbmVkCgl9OwoKCXJldHVybiB7CgkJYXN5bmM6IGZ1bmN0aW9uKCkgewoJCQlvcHRpb25zLmFzeW5jID0gdHJ1ZTsKCQkJcmV0dXJuIHRoaXM7CgkJfSwKCQlhcmdzOiBmdW5jdGlvbiguLi5hcmdzKSB7CgkJCW9wdGlvbnMuYXJncyA9IGFyZ3M7CgkJCXJldHVybiB0aGlzOwoJCX0sCgkJYXJnU2VsZWN0OiBmdW5jdGlvbiguLi5pbmRleGVzKSB7CgkJCW9wdGlvbnMuc2VsZWN0ID0gaW5kZXhlczsKCQkJcmV0dXJuIHRoaXM7CgkJfSwKCQlvcmlnaW5hbDogZnVuY3Rpb24oZm4pIHsKCQkJb3B0aW9ucy5vcmlnaW5hbCA9IGZuOwoJCQlyZXR1cm4gdGhpczsKCQl9LAoJCWJ1aWxkOiBmdW5jdGlvbihwYXJlbnQsIGtleSkgewoJCQljb25zdCBzdGF0ZSA9IHt9OwoJCQljb25zdCBtb2NrID0gY3JlYXRlRnVuY3Rpb24oc3RhdGUsIG9wdGlvbnMpOwoKCQkJaWYgKHBhcmVudCkKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXJlbnQsIGtleSwgeyB2YWx1ZTogbW9jayB9KTsKCgkJCXJldHVybiB3aXJlRnVuY3Rpb24ocGFyZW50ID8gcGFyZW50W2tleV0gOiBtb2NrLCBzdGF0ZSk7CgkJfQoJfTsKfQoKZnVuY3Rpb24gd2lyZUZ1bmN0aW9uKG1vY2ssIHN0YXRlKSB7Cgltb2NrLnJldCA9ICh2YWx1ZSwgY2FsbCA9IDApID0+IHsKCQlzdGF0ZS5yZXRzW2NhbGxdID0gdmFsdWU7Cgl9OwoJbW9jay5vblJldCA9IChoYW5kbGVyLCBjYWxsID0gMCkgPT4gewoJCXN0YXRlLnJldEhhbmRsZXJzW2NhbGxdID0gaGFuZGxlcjsKCX07Cgltb2NrLmNhbGxzID0gKGNhbGwpID0+IHsKCQlyZXR1cm4gY2FsbCAhPT0gdW5kZWZpbmVkID8gc3RhdGUuY2FsbHNbY2FsbF0gOiBzdGF0ZS5jYWxsczsKCX0KCW1vY2sucmVzZXQgPSAoKSA9PiB7CgkJc3RhdGUucmV0cyA9IFtdOwoJCXN0YXRlLnJldEhhbmRsZXJzID0gW107CgkJc3RhdGUuY2FsbHMgPSBbXTsKCQlzdGF0ZS5kYXRhID0ge307Cgl9OwoJbW9jay5yZXNldCgpOwoKCXJldHVybiBtb2NrOwp9CgpmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbihzdGF0ZSwgb3B0aW9ucykgewoJaWYgKG9wdGlvbnMuYXN5bmMpIHsKCQlyZXR1cm4gYXN5bmMgZnVuY3Rpb24oKSB7CgkJCXJldHVybiBnZXRGdW5jdGlvbkJvZHkodGhpcywgc3RhdGUsIG9wdGlvbnMsIEFycmF5LmZyb20oYXJndW1lbnRzKSk7CgkJfTsKCX0gZWxzZSB7CgkJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gZ2V0RnVuY3Rpb25Cb2R5KHRoaXMsIHN0YXRlLCBvcHRpb25zLCBBcnJheS5mcm9tKGFyZ3VtZW50cykpOwoJCX07Cgl9Cn0KCmZ1bmN0aW9uIGdldEZ1bmN0aW9uQm9keShwYXJlbnQsIHN0YXRlLCBvcHRpb25zLCByYXdBcmdzKSB7Cgljb25zdCBhcmdzID0gZGVlcENsb25lKGdldEZ1bmN0aW9uQXJncyhyYXdBcmdzLCBvcHRpb25zKSk7CglzdGF0ZS5jYWxscy5wdXNoKGFyZ3MpOwoJY29uc3QgY2FsbCA9IHN0YXRlLmNhbGxzLmxlbmd0aDsKCglsZXQgcmV0OwoKCWlmIChzdGF0ZS5yZXRzW2NhbGxdKSB7CgkJcmV0ID0gc3RhdGUucmV0c1tjYWxsXTsKCX0gZWxzZSBpZiAoc3RhdGUucmV0SGFuZGxlcnNbY2FsbF0pIHsKCQlyZXQgPSBzdGF0ZS5yZXRIYW5kbGVyc1tjYWxsXShhcmdzKTsKCX0gZWxzZSBpZiAoc3RhdGUucmV0c1swXSkgewoJCXJldCA9IHN0YXRlLnJldHNbMF07Cgl9IGVsc2UgaWYgKHN0YXRlLnJldEhhbmRsZXJzWzBdKSB7CgkJcmV0ID0gc3RhdGUucmV0SGFuZGxlcnNbMF0oYXJncyk7Cgl9CgoJaWYgKHJldCBpbnN0YW5jZW9mIEVycm9yKQoJCXRocm93IHJldDsKCglpZiAob3B0aW9ucy5ib2R5KSB7CgkJcmV0dXJuIG9wdGlvbnMuYm9keSh7CgkJCXNlbGY6IHBhcmVudCwKCQkJc3RhdGU6IHN0YXRlLAoJCQljYWxsOiBjYWxsLAoJCQlhcmdzOiBhcmdzLAoJCQlyYXdBcmdzOiByYXdBcmdzLAoJCQlvcmlnaW5hbDogb3B0aW9ucy5vcmlnaW5hbCwKCQkJcmV0OiByZXQKCQl9KTsKCX0gZWxzZSB7CgkJcmV0dXJuIHJldDsKCX0KfQoKZnVuY3Rpb24gZ2V0RnVuY3Rpb25BcmdzKGNhbGxBcmdzLCBvcHRpb25zKSB7CglsZXQgYXJncyA9IG51bGw7CgoJaWYgKG9wdGlvbnMuc2VsZWN0Lmxlbmd0aCA9PSAxKSB7CgkJYXJncyA9IGNhbGxBcmdzW29wdGlvbnMuc2VsZWN0WzBdXTsKCX0gZWxzZSBpZiAob3B0aW9ucy5hcmdzLmxlbmd0aCkgewoJCWFyZ3MgPSB7fTsKCgkJZm9yIChsZXQgaSA9IDA7IGkgPCBvcHRpb25zLmFyZ3MubGVuZ3RoOyBpKyspIHsKCQkJaWYgKG9wdGlvbnMuc2VsZWN0Lmxlbmd0aCAmJiAhb3B0aW9ucy5zZWxlY3QuaW5jbHVkZXMoaSkpCgkJCQljb250aW51ZTsKCgkJCWxldCBhcmdOYW1lID0gJyc7CgkJCWxldCBkZWZhdWx0VmFsdWUgPSB1bmRlZmluZWQ7CgoJCQlpZiAodHlwZW9mIG9wdGlvbnMuYXJnc1tpXSA9PSAnc3RyaW5nJykgewoJCQkJYXJnTmFtZSA9IG9wdGlvbnMuYXJnc1tpXTsKCQkJfSBlbHNlIHsKCQkJCVthcmdOYW1lLCBkZWZhdWx0VmFsdWVdID0gT2JqZWN0LmVudHJpZXMob3B0aW9ucy5hcmdzW2ldKVswXTsKCQkJfQoKCQkJYXJnc1thcmdOYW1lXSA9IGNhbGxBcmdzW2ldICE9PSB1bmRlZmluZWQgPyBjYWxsQXJnc1tpXSA6IGRlZmF1bHRWYWx1ZTsKCQl9Cgl9IGVsc2UgewoJCS8vIE5PVEU6IFByZXZpb3VzbHkgcmV0dXJuZWQgbnVsbC4gTm93IHJldHVybnMgYXJyYXkgKG1heSBicmVhayBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSkuCgkJYXJncyA9IEFycmF5LmZyb20oY2FsbEFyZ3MpOwoJfQoKCXJldHVybiBhcmdzOwp9CgpmdW5jdGlvbiBvYmplY3RCdWlsZGVyKHByb3BzKSB7Cgljb25zdCBvcHRpb25zID0geyBwcm9wcyB9OwoKCXJldHVybiB7CgkJYnVpbGQ6IGZ1bmN0aW9uKHBhcmVudCwga2V5KSB7CgkJCWNvbnN0IG1vY2sgPSBjcmVhdGVPYmplY3RXaXRoUHJvcHMob3B0aW9ucy5wcm9wcyk7CgoJCQlpZiAocGFyZW50KQoJCQkJT2JqZWN0LmRlZmluZVByb3BlcnR5KHBhcmVudCwga2V5LCB7IHZhbHVlOiBtb2NrIH0pOwoJCQkKCQkJcmV0dXJuIHdpcmVPYmplY3QocGFyZW50ID8gcGFyZW50W2tleV0gOiBtb2NrKTsKCQl9Cgl9Owp9CgpmdW5jdGlvbiB3aXJlT2JqZWN0KG1vY2spIHsKCW1vY2sucmVzZXQgPSAoKSA9PiB7CgkJZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobW9jaykpIHsKCQkJaWYgKHR5cGVvZiBtb2NrW2tleV0ucmVzZXQgPT0gJ2Z1bmN0aW9uJykKCQkJCW1vY2tba2V5XS5yZXNldCgpOwoJCX0KCX07CgoJcmV0dXJuIG1vY2s7Cn0KCmZ1bmN0aW9uIGNyZWF0ZU9iamVjdFdpdGhQcm9wcyhwcm9wcykgewoJY29uc3Qgb2JqZWN0ID0ge307CgoJZm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHsKCQljb25zdCBwcm9wID0gcHJvcHNba2V5XTsKCgkJaWYgKHR5cGVvZiBwcm9wLmJ1aWxkID09ICdmdW5jdGlvbicpIHsKCQkJcHJvcC5idWlsZChvYmplY3QsIGtleSk7CgkJfSBlbHNlIHsKCQkJb2JqZWN0W2tleV0gPSBwcm9wOwoJCX0KCX0KCglyZXR1cm4gb2JqZWN0Owp9CgpmdW5jdGlvbiBjbGFzc0J1aWxkZXIobWVtYmVycykgewoJY29uc3Qgb3B0aW9ucyA9IHsgbWVtYmVycyB9OwoKCXJldHVybiB7CgkJYnVpbGQ6IGZ1bmN0aW9uKHBhcmVudCwga2V5KSB7CgkJCWNvbnN0IHN0YXRlID0ge307CgkJCWNvbnN0IE1vY2sgPSBjcmVhdGVDbGFzcyhzdGF0ZSwgb3B0aW9ucyk7CgoJCQlpZiAocGFyZW50KQoJCQkJT2JqZWN0LmRlZmluZVByb3BlcnR5KHBhcmVudCwga2V5LCB7IHZhbHVlOiBNb2NrIH0pOwoKCQkJcmV0dXJuIHdpcmVDbGFzcyhwYXJlbnQgPyBwYXJlbnRba2V5XSA6IE1vY2ssIHN0YXRlLCBvcHRpb25zKTsKCQl9Cgl9Owp9CgpmdW5jdGlvbiBjcmVhdGVDbGFzcyhzdGF0ZSwgb3B0aW9ucykgewoJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCWNvbnN0IGluZGV4ID0gc3RhdGUubnVtSW5zdGFuY2VzOwoKCQlpZiAoIXN0YXRlLmRlc2NyaXB0aW9uc1tpbmRleF0pCgkJCXN0YXRlLmRlc2NyaXB0aW9uc1tpbmRleF0gPSBjcmVhdGVPYmplY3RXaXRoUHJvcHMob3B0aW9ucy5tZW1iZXJzKTsKCgkJT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XSkpOwoKCQlpZiAodHlwZW9mIHN0YXRlLmRlc2NyaXB0aW9uc1tpbmRleF0uY29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicpCgkJCXN0YXRlLmRlc2NyaXB0aW9uc1tpbmRleF0uY29uc3RydWN0b3IuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpOwoKCQlzdGF0ZS5udW1JbnN0YW5jZXMrKzsKCX07Cn0KCmZ1bmN0aW9uIHdpcmVDbGFzcyhNb2NrLCBzdGF0ZSwgb3B0aW9ucykgewoJTW9jay5pbnN0ID0gKGluZGV4ID0gMCkgPT4gewoJCWlmICghc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XSkKCQkJc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XSA9IGNyZWF0ZU9iamVjdFdpdGhQcm9wcyhvcHRpb25zLm1lbWJlcnMpOwoKCQlyZXR1cm4gc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XTsKCX07CglNb2NrLm51bUluc3RzID0gKCkgPT4gewoJCXJldHVybiBzdGF0ZS5udW1JbnN0YW5jZXM7Cgl9OwoJTW9jay5yZXNldCA9ICgpID0+IHsKCQlzdGF0ZS5kZXNjcmlwdGlvbnMgPSBbXTsKCQlzdGF0ZS5udW1JbnN0YW5jZXMgPSAwOwoJCXN0YXRlLmRhdGEgPSB7fTsKCX07CglNb2NrLnJlc2V0KCk7CgoJcmV0dXJuIE1vY2s7Cn0KCmZ1bmN0aW9uIHByb3BlcnR5QnVpbGRlcigpIHsKCXJldHVybiB7CgkJYnVpbGQ6IGZ1bmN0aW9uKHBhcmVudCwga2V5KSB7CgkJCWNvbnN0IHN0YXRlID0ge307CgoJCQlpZiAocGFyZW50KSB7CgkJCQlwYXJlbnRba2V5XSA9IHt9OwoJCQkJd2lyZVByb3BlcnR5KHBhcmVudFtrZXldLCBzdGF0ZSk7CgkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkocGFyZW50LCBrZXksIHsKCQkJCQlnZXQ6ICgpID0+IHsKCQkJCQkJcmV0dXJuIHN0YXRlLnZhbHVlOwoJCQkJCX0sCgkJCQkJc2V0OiAodmFsdWUpID0+IHsKCQkJCQkJc3RhdGUudmFsdWUgPSB2YWx1ZTsKCQkJCQl9CgkJCQl9KTsKCQkJfQoJCX0KCX07Cn0KCmZ1bmN0aW9uIHdpcmVQcm9wZXJ0eShtb2NrLCBzdGF0ZSkgewoJbW9jay5yZXNldCA9ICgpID0+IHsKCQlzdGF0ZS52YWx1ZSA9IHVuZGVmaW5lZDsKCX07CgoJcmV0dXJuIG1vY2s7Cn0KCmZ1bmN0aW9uIGRlZXBDbG9uZSh0YXJnZXQpIHsKCWlmICh0eXBlb2YgdGFyZ2V0ID09PSAnb2JqZWN0JykgewoJCWlmIChBcnJheS5pc0FycmF5KHRhcmdldCkpIHsKCQkJcmV0dXJuIHRhcmdldC5tYXAoZGVlcENsb25lKTsKCQl9IGVsc2UgaWYgKHRhcmdldD8uY29uc3RydWN0b3IgPT09IE9iamVjdCkgewoJCQljb25zdCBjbG9uZSA9IHt9OwoKCQkJZm9yIChjb25zdCBrZXkgaW4gdGFyZ2V0KSB7CgkJCQljbG9uZVtrZXldID0gZGVlcENsb25lKHRhcmdldFtrZXldKTsKCQkJfQoKCQkJcmV0dXJuIGNsb25lOwoJCX0KCX0KCglyZXR1cm4gdGFyZ2V0Owp9CgpmdW5jdGlvbiBjcmVhdGVTcHkob2JqZWN0LCBrZXksIHJlcGxhY2VtZW50KSB7CglpZiAoIXJlcGxhY2VtZW50KSB7CgkJcmVwbGFjZW1lbnQgPSBmdW5jdGlvbkJ1aWxkZXIoKGN0eCkgPT4gewoJCQlpZiAoY3R4LnJldCAhPT0gdW5kZWZpbmVkKQoJCQkJcmV0dXJuIGN0eC5yZXQ7CgoJCQlyZXR1cm4gY3R4Lm9yaWdpbmFsLmFwcGx5KGN0eC5zZWxmLCBjdHgucmF3QXJncyk7CgkJfSk7Cgl9CgoJY29uc3Qgb3JpZ2luYWwgPSBvYmplY3Rba2V5XTsKCWNvbnN0IHNweUZuID0gcmVwbGFjZW1lbnQub3JpZ2luYWwob3JpZ2luYWwpLmJ1aWxkKCk7CglzcHlGbi5yZXN0b3JlID0gKCkgPT4gewoJCW9iamVjdFtrZXldID0gb3JpZ2luYWw7Cgl9OwoJb2JqZWN0W2tleV0gPSBzcHlGbjsKCglyZXR1cm4gc3B5Rm47Cn0KCm1vZHVsZS5leHBvcnRzID0gewoJc3B5OiBjcmVhdGVTcHksCgljcmVhdGU6IG1vY2tCdWlsZGVyLAoJZnVuY3Rpb246IGZ1bmN0aW9uQnVpbGRlciwKCW9iamVjdDogb2JqZWN0QnVpbGRlciwKCWNsYXNzOiBjbGFzc0J1aWxkZXIsCglwcm9wZXJ0eTogcHJvcGVydHlCdWlsZGVyLAp9OwoAAAAAAAAAAAYaAAAAAAAAAAAAAAAAAAAAAAAABhoAAAAAAAAAAAAAAAAAAAAAAAAGGgAAAAAAAAAAAAAAAAAAAAAAAAYaAAAAAAAAAAAAAAAAAAAAAAAAHxoAAAAAAAAAAAAAAAAAAAAAAACkGwAAAAAAAAAAAAA",
860
+ "CQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAIoLAAAAAAAAkQsAAAAAAAAAAAAAAADwvw"
861
+ ],
862
+ [
863
+ 6,
864
+ 1,
865
+ "cut",
866
+ null,
867
+ "AQAAAEoSAAAAAAAAShIAAAAAAAAsAAAACQkvLyBTdG9yZSBpbnN0YW5jZSBpbmRleCBmb3IgbWV0aG9kIGxvb2t1cAo",
868
+ "BAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAWRIAAAAAAABZEgAAAAAAAAAAAAAAAPC/"
869
+ ],
870
+ [
871
+ 8,
872
+ 1,
873
+ "cut",
874
+ null,
875
+ "AQAAAAoTAAAAAAAAChMAAAAAAABTAAAACS8vIFB1dCBtZXRob2QgYWNjZXNzb3JzIG9uIHByb3RvdHlwZSBzbyBjaGlsZCBjbGFzc2VzIGNhbiBvdmVycmlkZSBhbmQgY2FsbCBzdXBlcgo",
876
+ "BAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAChMAAAAAAAAKEwAAAAAAAAAAAAAAAAAA"
877
+ ],
878
+ [
879
+ 10,
880
+ 1,
881
+ "insert",
882
+ {
883
+ "characters": "\n"
884
+ },
885
+ "AQAAAGgTAAAAAAAAaRMAAAAAAAAAAAAA",
886
+ "BAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAaBMAAAAAAABoEwAAAAAAAAAAAAAAAAAA"
887
+ ],
888
+ [
889
+ 14,
890
+ 1,
891
+ "left_delete",
892
+ null,
893
+ "AQAAAF0TAAAAAAAAXRMAAAAAAAABAAAAIA",
894
+ "BAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAXhMAAAAAAABeEwAAAAAAAAAAAAAAAPC/"
895
+ ],
896
+ [
897
+ 15,
898
+ 1,
899
+ "insert",
900
+ {
901
+ "characters": "\n"
902
+ },
903
+ "AwAAAF0TAAAAAAAAYBMAAAAAAAAAAAAAXhMAAAAAAABeEwAAAAAAAAIAAAAJCV4TAAAAAAAAYRMAAAAAAAAAAAAA",
904
+ "BAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAXRMAAAAAAABdEwAAAAAAAAAAAAAAAPC/"
905
+ ],
906
+ [
907
+ 18,
908
+ 1,
909
+ "insert",
910
+ {
911
+ "characters": "\n"
912
+ },
913
+ "AQAAAJMTAAAAAAAAlBMAAAAAAAAAAAAA",
914
+ "BAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAkxMAAAAAAACTEwAAAAAAAAAAAAAAAAAA"
915
+ ],
916
+ [
917
+ 1,
918
+ 1,
919
+ "revert",
920
+ null,
921
+ "AgAAAAAAAAAAAAAAAAAAAAAAAAAEHQAAZnVuY3Rpb24gbW9ja0J1aWxkZXIoYnVpbGRlcikgewoJcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKfQoKZnVuY3Rpb24gZnVuY3Rpb25CdWlsZGVyKGJvZHkpIHsKCWNvbnN0IG9wdGlvbnMgPSB7CgkJYXN5bmM6IGZhbHNlLAoJCWJvZHk6IGJvZHksCgkJYXJnczogW10sCgkJc2VsZWN0OiBbXSwKCQlvcmlnaW5hbDogdW5kZWZpbmVkCgl9OwoKCXJldHVybiB7CgkJYXN5bmM6IGZ1bmN0aW9uKCkgewoJCQlvcHRpb25zLmFzeW5jID0gdHJ1ZTsKCQkJcmV0dXJuIHRoaXM7CgkJfSwKCQlhcmdzOiBmdW5jdGlvbiguLi5hcmdzKSB7CgkJCW9wdGlvbnMuYXJncyA9IGFyZ3M7CgkJCXJldHVybiB0aGlzOwoJCX0sCgkJYXJnU2VsZWN0OiBmdW5jdGlvbiguLi5pbmRleGVzKSB7CgkJCW9wdGlvbnMuc2VsZWN0ID0gaW5kZXhlczsKCQkJcmV0dXJuIHRoaXM7CgkJfSwKCQlvcmlnaW5hbDogZnVuY3Rpb24oZm4pIHsKCQkJb3B0aW9ucy5vcmlnaW5hbCA9IGZuOwoJCQlyZXR1cm4gdGhpczsKCQl9LAoJCWJ1aWxkOiBmdW5jdGlvbihwYXJlbnQsIGtleSkgewoJCQljb25zdCBzdGF0ZSA9IHt9OwoJCQljb25zdCBtb2NrID0gY3JlYXRlRnVuY3Rpb24oc3RhdGUsIG9wdGlvbnMpOwoKCQkJaWYgKHBhcmVudCkKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXJlbnQsIGtleSwgeyB2YWx1ZTogbW9jayB9KTsKCgkJCXJldHVybiB3aXJlRnVuY3Rpb24ocGFyZW50ID8gcGFyZW50W2tleV0gOiBtb2NrLCBzdGF0ZSk7CgkJfQoJfTsKfQoKZnVuY3Rpb24gd2lyZUZ1bmN0aW9uKG1vY2ssIHN0YXRlKSB7Cgltb2NrLnJldCA9ICh2YWx1ZSwgY2FsbCA9IDApID0+IHsKCQlzdGF0ZS5yZXRzW2NhbGxdID0gdmFsdWU7Cgl9OwoJbW9jay5vblJldCA9IChoYW5kbGVyLCBjYWxsID0gMCkgPT4gewoJCXN0YXRlLnJldEhhbmRsZXJzW2NhbGxdID0gaGFuZGxlcjsKCX07Cgltb2NrLmNhbGxzID0gKGNhbGwpID0+IHsKCQlyZXR1cm4gY2FsbCAhPT0gdW5kZWZpbmVkID8gc3RhdGUuY2FsbHNbY2FsbF0gOiBzdGF0ZS5jYWxsczsKCX07Cgltb2NrLmRhdGEgPSAoa2V5KSA9PiB7CgkJcmV0dXJuIGtleSAhPT0gdW5kZWZpbmVkID8gc3RhdGUuZGF0YVtrZXldIDogc3RhdGUuZGF0YTsKCX07Cgltb2NrLnJlc2V0ID0gKCkgPT4gewoJCXN0YXRlLnJldHMgPSBbXTsKCQlzdGF0ZS5yZXRIYW5kbGVycyA9IFtdOwoJCXN0YXRlLmNhbGxzID0gW107CgkJc3RhdGUuZGF0YSA9IHt9OwoJfTsKCW1vY2sucmVzZXQoKTsKCglyZXR1cm4gbW9jazsKfQoKZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb24oc3RhdGUsIG9wdGlvbnMpIHsKCWlmIChvcHRpb25zLmFzeW5jKSB7CgkJcmV0dXJuIGFzeW5jIGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gZ2V0RnVuY3Rpb25Cb2R5KHRoaXMsIHN0YXRlLCBvcHRpb25zLCBBcnJheS5mcm9tKGFyZ3VtZW50cykpOwoJCX07Cgl9IGVsc2UgewoJCXJldHVybiBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIGdldEZ1bmN0aW9uQm9keSh0aGlzLCBzdGF0ZSwgb3B0aW9ucywgQXJyYXkuZnJvbShhcmd1bWVudHMpKTsKCQl9OwoJfQp9CgpmdW5jdGlvbiBnZXRGdW5jdGlvbkJvZHkocGFyZW50LCBzdGF0ZSwgb3B0aW9ucywgcmF3QXJncykgewoJY29uc3QgYXJncyA9IGRlZXBDbG9uZShnZXRGdW5jdGlvbkFyZ3MocmF3QXJncywgb3B0aW9ucykpOwoJc3RhdGUuY2FsbHMucHVzaChhcmdzKTsKCWNvbnN0IGNhbGwgPSBzdGF0ZS5jYWxscy5sZW5ndGg7CgoJbGV0IHJldDsKCglpZiAoc3RhdGUucmV0c1tjYWxsXSkgewoJCXJldCA9IHN0YXRlLnJldHNbY2FsbF07Cgl9IGVsc2UgaWYgKHN0YXRlLnJldEhhbmRsZXJzW2NhbGxdKSB7CgkJcmV0ID0gc3RhdGUucmV0SGFuZGxlcnNbY2FsbF0oYXJncyk7Cgl9IGVsc2UgaWYgKHN0YXRlLnJldHNbMF0pIHsKCQlyZXQgPSBzdGF0ZS5yZXRzWzBdOwoJfSBlbHNlIGlmIChzdGF0ZS5yZXRIYW5kbGVyc1swXSkgewoJCXJldCA9IHN0YXRlLnJldEhhbmRsZXJzWzBdKGFyZ3MpOwoJfQoKCWlmIChyZXQgaW5zdGFuY2VvZiBFcnJvcikKCQl0aHJvdyByZXQ7CgoJaWYgKG9wdGlvbnMuYm9keSkgewoJCXJldHVybiBvcHRpb25zLmJvZHkoewoJCQlzZWxmOiBwYXJlbnQsCgkJCXN0YXRlOiBzdGF0ZSwKCQkJY2FsbDogY2FsbCwKCQkJYXJnczogYXJncywKCQkJcmF3QXJnczogcmF3QXJncywKCQkJb3JpZ2luYWw6IG9wdGlvbnMub3JpZ2luYWwsCgkJCXJldDogcmV0CgkJfSk7Cgl9IGVsc2UgewoJCXJldHVybiByZXQ7Cgl9Cn0KCmZ1bmN0aW9uIGdldEZ1bmN0aW9uQXJncyhjYWxsQXJncywgb3B0aW9ucykgewoJbGV0IGFyZ3MgPSBudWxsOwoKCWlmIChvcHRpb25zLnNlbGVjdC5sZW5ndGggPT0gMSkgewoJCWFyZ3MgPSBjYWxsQXJnc1tvcHRpb25zLnNlbGVjdFswXV07Cgl9IGVsc2UgaWYgKG9wdGlvbnMuYXJncy5sZW5ndGgpIHsKCQlhcmdzID0ge307CgoJCWZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9ucy5hcmdzLmxlbmd0aDsgaSsrKSB7CgkJCWlmIChvcHRpb25zLnNlbGVjdC5sZW5ndGggJiYgIW9wdGlvbnMuc2VsZWN0LmluY2x1ZGVzKGkpKQoJCQkJY29udGludWU7CgoJCQlsZXQgYXJnTmFtZSA9ICcnOwoJCQlsZXQgZGVmYXVsdFZhbHVlID0gdW5kZWZpbmVkOwoKCQkJaWYgKHR5cGVvZiBvcHRpb25zLmFyZ3NbaV0gPT0gJ3N0cmluZycpIHsKCQkJCWFyZ05hbWUgPSBvcHRpb25zLmFyZ3NbaV07CgkJCX0gZWxzZSB7CgkJCQlbYXJnTmFtZSwgZGVmYXVsdFZhbHVlXSA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuYXJnc1tpXSlbMF07CgkJCX0KCgkJCWFyZ3NbYXJnTmFtZV0gPSBjYWxsQXJnc1tpXSAhPT0gdW5kZWZpbmVkID8gY2FsbEFyZ3NbaV0gOiBkZWZhdWx0VmFsdWU7CgkJfQoJfSBlbHNlIHsKCQkvLyBOT1RFOiBQcmV2aW91c2x5IHJldHVybmVkIG51bGwuIE5vdyByZXR1cm5zIGFycmF5IChtYXkgYnJlYWsgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpLgoJCWFyZ3MgPSBBcnJheS5mcm9tKGNhbGxBcmdzKTsKCX0KCglyZXR1cm4gYXJnczsKfQoKZnVuY3Rpb24gb2JqZWN0QnVpbGRlcihwcm9wcykgewoJY29uc3Qgb3B0aW9ucyA9IHsgcHJvcHMgfTsKCglyZXR1cm4gewoJCWJ1aWxkOiBmdW5jdGlvbihwYXJlbnQsIGtleSkgewoJCQljb25zdCBtb2NrID0gY3JlYXRlT2JqZWN0V2l0aFByb3BzKG9wdGlvbnMucHJvcHMpOwoKCQkJaWYgKHBhcmVudCkKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXJlbnQsIGtleSwgeyB2YWx1ZTogbW9jayB9KTsKCgkJCXJldHVybiB3aXJlT2JqZWN0KHBhcmVudCA/IHBhcmVudFtrZXldIDogbW9jaywgcHJvcHMpOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIHdpcmVPYmplY3QobW9jaywgaW5pdGlhbFByb3BzKSB7Cgljb25zdCBpbml0aWFsTW9ja3MgPSBuZXcgU2V0KCk7Cgljb25zdCBpbml0aWFsVmFsdWVzID0gbmV3IE1hcCgpOwoKCWZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyhpbml0aWFsUHJvcHMpKSB7CgkJY29uc3QgcHJvcCA9IGluaXRpYWxQcm9wc1trZXldOwoJCWlmICh0eXBlb2YgcHJvcD8uYnVpbGQgPT09ICdmdW5jdGlvbicpIHsKCQkJaW5pdGlhbE1vY2tzLmFkZChrZXkpOwoJCX0gZWxzZSB7CgkJCWluaXRpYWxWYWx1ZXMuc2V0KGtleSwgcHJvcCk7CgkJfQoJfQoKCW1vY2sucmVzZXQgPSAoKSA9PiB7CgkJZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKG1vY2spKSB7CgkJCWlmIChrZXkgPT09ICdyZXNldCcpIGNvbnRpbnVlOwoKCQkJaWYgKGluaXRpYWxNb2Nrcy5oYXMoa2V5KSkgewoJCQkJaWYgKHR5cGVvZiBtb2NrW2tleV0/LnJlc2V0ID09PSAnZnVuY3Rpb24nKQoJCQkJCW1vY2tba2V5XS5yZXNldCgpOwoJCQl9IGVsc2UgaWYgKGluaXRpYWxWYWx1ZXMuaGFzKGtleSkpIHsKCQkJCW1vY2tba2V5XSA9IGluaXRpYWxWYWx1ZXMuZ2V0KGtleSk7CgkJCX0gZWxzZSB7CgkJCQlkZWxldGUgbW9ja1trZXldOwoJCQl9CgkJfQoJfTsKCglyZXR1cm4gbW9jazsKfQoKZnVuY3Rpb24gY3JlYXRlT2JqZWN0V2l0aFByb3BzKHByb3BzKSB7Cgljb25zdCBvYmplY3QgPSB7fTsKCglmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXMocHJvcHMpKSB7CgkJY29uc3QgcHJvcCA9IHByb3BzW2tleV07CgoJCWlmICh0eXBlb2YgcHJvcD8uYnVpbGQgPT0gJ2Z1bmN0aW9uJykgewoJCQlwcm9wLmJ1aWxkKG9iamVjdCwga2V5KTsKCQl9IGVsc2UgewoJCQlvYmplY3Rba2V5XSA9IHByb3A7CgkJfQoJfQoKCXJldHVybiBvYmplY3Q7Cn0KCmZ1bmN0aW9uIGNsYXNzQnVpbGRlcihtZW1iZXJzKSB7Cgljb25zdCBvcHRpb25zID0geyBtZW1iZXJzIH07CgoJcmV0dXJuIHsKCQlidWlsZDogZnVuY3Rpb24ocGFyZW50LCBrZXkpIHsKCQkJY29uc3Qgc3RhdGUgPSB7fTsKCQkJY29uc3QgTW9jayA9IGNyZWF0ZUNsYXNzKHN0YXRlLCBvcHRpb25zKTsKCgkJCWlmIChwYXJlbnQpCgkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkocGFyZW50LCBrZXksIHsgdmFsdWU6IE1vY2sgfSk7CgoJCQlyZXR1cm4gd2lyZUNsYXNzKHBhcmVudCA/IHBhcmVudFtrZXldIDogTW9jaywgc3RhdGUsIG9wdGlvbnMpOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIGNyZWF0ZUNsYXNzKHN0YXRlLCBvcHRpb25zKSB7Cgljb25zdCBNb2NrID0gZnVuY3Rpb24oKSB7CgkJY29uc3QgaW5kZXggPSBzdGF0ZS5udW1JbnN0YW5jZXM7CgoJCWlmICghc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XSkKCQkJc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XSA9IGNyZWF0ZU9iamVjdFdpdGhQcm9wcyhvcHRpb25zLm1lbWJlcnMpOwoKCQlPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ19tb2NrSW5kZXgnLCB7IHZhbHVlOiBpbmRleCB9KTsKCgkJaWYgKHR5cGVvZiBzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdLmNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nKQoJCQlzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKTsKCgkJc3RhdGUubnVtSW5zdGFuY2VzKys7Cgl9OwoKCWZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyhvcHRpb25zLm1lbWJlcnMpKSB7CgkJaWYgKGtleSA9PT0gJ2NvbnN0cnVjdG9yJykKCQkJY29udGludWU7CgoJCWNvbnN0IG1lbWJlciA9IG9wdGlvbnMubWVtYmVyc1trZXldOwoKCQlpZiAodHlwZW9mIG1lbWJlcj8uYnVpbGQgPT09ICdmdW5jdGlvbicpIHsKCQkJaWYgKG1lbWJlci5pc1Byb3BlcnR5KSB7CgkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoTW9jay5wcm90b3R5cGUsIGtleSwgewoJCQkJCWdldDogZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBzdGF0ZS5kZXNjcmlwdGlvbnNbdGhpcy5fbW9ja0luZGV4XVtrZXldOwoJCQkJCX0sCgkJCQkJc2V0OiBmdW5jdGlvbih2YWx1ZSkgewoJCQkJCQlzdGF0ZS5kZXNjcmlwdGlvbnNbdGhpcy5fbW9ja0luZGV4XVtrZXldID0gdmFsdWU7CgkJCQkJfSwKCQkJCQllbnVtZXJhYmxlOiB0cnVlLAoJCQkJCWNvbmZpZ3VyYWJsZTogdHJ1ZQoJCQkJfSk7CgkJCX0gZWxzZSB7CgkJCQlNb2NrLnByb3RvdHlwZVtrZXldID0gZnVuY3Rpb24oLi4uYXJncykgewoJCQkJCXJldHVybiBzdGF0ZS5kZXNjcmlwdGlvbnNbdGhpcy5fbW9ja0luZGV4XVtrZXldLmFwcGx5KHRoaXMsIGFyZ3MpOwoJCQkJfTsKCQkJfQoJCX0KCX0KCglyZXR1cm4gTW9jazsKfQoKZnVuY3Rpb24gd2lyZUNsYXNzKE1vY2ssIHN0YXRlLCBvcHRpb25zKSB7CglNb2NrLmluc3QgPSAoaW5kZXggPSAwKSA9PiB7CgkJaWYgKCFzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdKQoJCQlzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdID0gY3JlYXRlT2JqZWN0V2l0aFByb3BzKG9wdGlvbnMubWVtYmVycyk7CgoJCXJldHVybiBzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdOwoJfTsKCU1vY2subnVtSW5zdHMgPSAoKSA9PiB7CgkJcmV0dXJuIHN0YXRlLm51bUluc3RhbmNlczsKCX07CglNb2NrLnJlc2V0ID0gKCkgPT4gewoJCXN0YXRlLmRlc2NyaXB0aW9ucyA9IFtdOwoJCXN0YXRlLm51bUluc3RhbmNlcyA9IDA7CgkJc3RhdGUuZGF0YSA9IHt9OwoJfTsKCU1vY2sucmVzZXQoKTsKCglyZXR1cm4gTW9jazsKfQoKZnVuY3Rpb24gcHJvcGVydHlCdWlsZGVyKCkgewoJcmV0dXJuIHsKCQlpc1Byb3BlcnR5OiB0cnVlLAoJCWJ1aWxkOiBmdW5jdGlvbihwYXJlbnQsIGtleSkgewoJCQljb25zdCBzdGF0ZSA9IHt9OwoKCQkJaWYgKHBhcmVudCkgewoJCQkJcGFyZW50W2tleV0gPSB7fTsKCQkJCXdpcmVQcm9wZXJ0eShwYXJlbnRba2V5XSwgc3RhdGUpOwoJCQkJT2JqZWN0LmRlZmluZVByb3BlcnR5KHBhcmVudCwga2V5LCB7CgkJCQkJZ2V0OiAoKSA9PiB7CgkJCQkJCXJldHVybiBzdGF0ZS52YWx1ZTsKCQkJCQl9LAoJCQkJCXNldDogKHZhbHVlKSA9PiB7CgkJCQkJCXN0YXRlLnZhbHVlID0gdmFsdWU7CgkJCQkJfQoJCQkJfSk7CgkJCX0KCQl9Cgl9Owp9CgpmdW5jdGlvbiB3aXJlUHJvcGVydHkobW9jaywgc3RhdGUpIHsKCW1vY2sucmVzZXQgPSAoKSA9PiB7CgkJc3RhdGUudmFsdWUgPSB1bmRlZmluZWQ7Cgl9OwoKCXJldHVybiBtb2NrOwp9CgpmdW5jdGlvbiBkZWVwQ2xvbmUodGFyZ2V0KSB7CglpZiAodHlwZW9mIHRhcmdldCA9PT0gJ29iamVjdCcpIHsKCQlpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpKSB7CgkJCXJldHVybiB0YXJnZXQubWFwKGRlZXBDbG9uZSk7CgkJfSBlbHNlIGlmICh0YXJnZXQ/LmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHsKCQkJY29uc3QgY2xvbmUgPSB7fTsKCgkJCWZvciAoY29uc3Qga2V5IGluIHRhcmdldCkgewoJCQkJY2xvbmVba2V5XSA9IGRlZXBDbG9uZSh0YXJnZXRba2V5XSk7CgkJCX0KCgkJCXJldHVybiBjbG9uZTsKCQl9Cgl9CgoJcmV0dXJuIHRhcmdldDsKfQoKZnVuY3Rpb24gY3JlYXRlU3B5KG9iamVjdCwga2V5LCByZXBsYWNlbWVudCkgewoJaWYgKCFyZXBsYWNlbWVudCkgewoJCXJlcGxhY2VtZW50ID0gZnVuY3Rpb25CdWlsZGVyKChjdHgpID0+IHsKCQkJaWYgKGN0eC5yZXQgIT09IHVuZGVmaW5lZCkKCQkJCXJldHVybiBjdHgucmV0OwoKCQkJcmV0dXJuIGN0eC5vcmlnaW5hbC5hcHBseShjdHguc2VsZiwgY3R4LnJhd0FyZ3MpOwoJCX0pOwoJfQoKCWNvbnN0IG9yaWdpbmFsID0gb2JqZWN0W2tleV07Cgljb25zdCBzcHlGbiA9IHJlcGxhY2VtZW50Lm9yaWdpbmFsKG9yaWdpbmFsKS5idWlsZCgpOwoJc3B5Rm4ucmVzdG9yZSA9ICgpID0+IHsKCQlvYmplY3Rba2V5XSA9IG9yaWdpbmFsOwoJfTsKCW9iamVjdFtrZXldID0gc3B5Rm47CgoJcmV0dXJuIHNweUZuOwp9Cgptb2R1bGUuZXhwb3J0cyA9IHsKCXNweTogY3JlYXRlU3B5LAoJY3JlYXRlOiBtb2NrQnVpbGRlciwKCWZ1bmN0aW9uOiBmdW5jdGlvbkJ1aWxkZXIsCglvYmplY3Q6IG9iamVjdEJ1aWxkZXIsCgljbGFzczogY2xhc3NCdWlsZGVyLAoJcHJvcGVydHk6IHByb3BlcnR5QnVpbGRlciwKfTsKAAAAAAAAAAAfHgAAAAAAAAAAAAA",
922
+ "AwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvw"
923
+ ],
924
+ [
925
+ 12,
926
+ 1,
927
+ "revert",
928
+ null,
929
+ "AgAAAAAAAAAAAAAAAAAAAAAAAAAfHgAAZnVuY3Rpb24gbW9ja0J1aWxkZXIoYnVpbGRlcikgewoJcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKfQoKZnVuY3Rpb24gZnVuY3Rpb25CdWlsZGVyKGJvZHkpIHsKCWNvbnN0IG9wdGlvbnMgPSB7CgkJYXN5bmM6IGZhbHNlLAoJCWJvZHk6IGJvZHksCgkJYXJnczogW10sCgkJc2VsZWN0OiBbXSwKCQlvcmlnaW5hbDogdW5kZWZpbmVkCgl9OwoKCXJldHVybiB7CgkJYXN5bmM6IGZ1bmN0aW9uKCkgewoJCQlvcHRpb25zLmFzeW5jID0gdHJ1ZTsKCQkJcmV0dXJuIHRoaXM7CgkJfSwKCQlhcmdzOiBmdW5jdGlvbiguLi5hcmdzKSB7CgkJCW9wdGlvbnMuYXJncyA9IGFyZ3M7CgkJCXJldHVybiB0aGlzOwoJCX0sCgkJYXJnU2VsZWN0OiBmdW5jdGlvbiguLi5pbmRleGVzKSB7CgkJCW9wdGlvbnMuc2VsZWN0ID0gaW5kZXhlczsKCQkJcmV0dXJuIHRoaXM7CgkJfSwKCQlvcmlnaW5hbDogZnVuY3Rpb24oZm4pIHsKCQkJb3B0aW9ucy5vcmlnaW5hbCA9IGZuOwoJCQlyZXR1cm4gdGhpczsKCQl9LAoJCWJ1aWxkOiBmdW5jdGlvbihwYXJlbnQsIGtleSkgewoJCQljb25zdCBzdGF0ZSA9IHt9OwoJCQljb25zdCBtb2NrID0gY3JlYXRlRnVuY3Rpb24oc3RhdGUsIG9wdGlvbnMpOwoKCQkJaWYgKHBhcmVudCkKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXJlbnQsIGtleSwgeyB2YWx1ZTogbW9jayB9KTsKCgkJCXJldHVybiB3aXJlRnVuY3Rpb24ocGFyZW50ID8gcGFyZW50W2tleV0gOiBtb2NrLCBzdGF0ZSk7CgkJfQoJfTsKfQoKZnVuY3Rpb24gd2lyZUZ1bmN0aW9uKG1vY2ssIHN0YXRlKSB7Cgltb2NrLnJldCA9ICh2YWx1ZSwgY2FsbCA9IDApID0+IHsKCQlzdGF0ZS5yZXRzW2NhbGxdID0gdmFsdWU7Cgl9OwoJbW9jay5vblJldCA9IChoYW5kbGVyLCBjYWxsID0gMCkgPT4gewoJCXN0YXRlLnJldEhhbmRsZXJzW2NhbGxdID0gaGFuZGxlcjsKCX07Cgltb2NrLmNhbGxzID0gKGNhbGwpID0+IHsKCQlyZXR1cm4gY2FsbCAhPT0gdW5kZWZpbmVkID8gc3RhdGUuY2FsbHNbY2FsbF0gOiBzdGF0ZS5jYWxsczsKCX07Cgltb2NrLmRhdGEgPSAoa2V5KSA9PiB7CgkJcmV0dXJuIGtleSAhPT0gdW5kZWZpbmVkID8gc3RhdGUuZGF0YVtrZXldIDogc3RhdGUuZGF0YTsKCX07Cgltb2NrLnJlc2V0ID0gKCkgPT4gewoJCXN0YXRlLnJldHMgPSBbXTsKCQlzdGF0ZS5yZXRIYW5kbGVycyA9IFtdOwoJCXN0YXRlLmNhbGxzID0gW107CgkJc3RhdGUuZGF0YSA9IHt9OwoJfTsKCW1vY2sucmVzZXQoKTsKCglyZXR1cm4gbW9jazsKfQoKZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb24oc3RhdGUsIG9wdGlvbnMpIHsKCWlmIChvcHRpb25zLmFzeW5jKSB7CgkJcmV0dXJuIGFzeW5jIGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gZ2V0RnVuY3Rpb25Cb2R5KHRoaXMsIHN0YXRlLCBvcHRpb25zLCBBcnJheS5mcm9tKGFyZ3VtZW50cykpOwoJCX07Cgl9IGVsc2UgewoJCXJldHVybiBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIGdldEZ1bmN0aW9uQm9keSh0aGlzLCBzdGF0ZSwgb3B0aW9ucywgQXJyYXkuZnJvbShhcmd1bWVudHMpKTsKCQl9OwoJfQp9CgpmdW5jdGlvbiBnZXRGdW5jdGlvbkJvZHkocGFyZW50LCBzdGF0ZSwgb3B0aW9ucywgcmF3QXJncykgewoJY29uc3QgYXJncyA9IGRlZXBDbG9uZShnZXRGdW5jdGlvbkFyZ3MocmF3QXJncywgb3B0aW9ucykpOwoJc3RhdGUuY2FsbHMucHVzaChhcmdzKTsKCWNvbnN0IGNhbGwgPSBzdGF0ZS5jYWxscy5sZW5ndGg7CgoJbGV0IHJldDsKCglpZiAoc3RhdGUucmV0c1tjYWxsXSkgewoJCXJldCA9IHN0YXRlLnJldHNbY2FsbF07Cgl9IGVsc2UgaWYgKHN0YXRlLnJldEhhbmRsZXJzW2NhbGxdKSB7CgkJcmV0ID0gc3RhdGUucmV0SGFuZGxlcnNbY2FsbF0oYXJncyk7Cgl9IGVsc2UgaWYgKHN0YXRlLnJldHNbMF0pIHsKCQlyZXQgPSBzdGF0ZS5yZXRzWzBdOwoJfSBlbHNlIGlmIChzdGF0ZS5yZXRIYW5kbGVyc1swXSkgewoJCXJldCA9IHN0YXRlLnJldEhhbmRsZXJzWzBdKGFyZ3MpOwoJfQoKCWlmIChyZXQgaW5zdGFuY2VvZiBFcnJvcikKCQl0aHJvdyByZXQ7CgoJaWYgKG9wdGlvbnMuYm9keSkgewoJCXJldHVybiBvcHRpb25zLmJvZHkoewoJCQlzZWxmOiBwYXJlbnQsCgkJCXN0YXRlOiBzdGF0ZSwKCQkJY2FsbDogY2FsbCwKCQkJYXJnczogYXJncywKCQkJcmF3QXJnczogcmF3QXJncywKCQkJb3JpZ2luYWw6IG9wdGlvbnMub3JpZ2luYWwsCgkJCXJldDogcmV0CgkJfSk7Cgl9IGVsc2UgewoJCXJldHVybiByZXQ7Cgl9Cn0KCmZ1bmN0aW9uIGdldEZ1bmN0aW9uQXJncyhjYWxsQXJncywgb3B0aW9ucykgewoJbGV0IGFyZ3MgPSBudWxsOwoKCWlmIChvcHRpb25zLnNlbGVjdC5sZW5ndGggPT0gMSkgewoJCWFyZ3MgPSBjYWxsQXJnc1tvcHRpb25zLnNlbGVjdFswXV07Cgl9IGVsc2UgaWYgKG9wdGlvbnMuYXJncy5sZW5ndGgpIHsKCQlhcmdzID0ge307CgoJCWZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9ucy5hcmdzLmxlbmd0aDsgaSsrKSB7CgkJCWlmIChvcHRpb25zLnNlbGVjdC5sZW5ndGggJiYgIW9wdGlvbnMuc2VsZWN0LmluY2x1ZGVzKGkpKQoJCQkJY29udGludWU7CgoJCQlsZXQgYXJnTmFtZSA9ICcnOwoJCQlsZXQgZGVmYXVsdFZhbHVlID0gdW5kZWZpbmVkOwoKCQkJaWYgKHR5cGVvZiBvcHRpb25zLmFyZ3NbaV0gPT0gJ3N0cmluZycpIHsKCQkJCWFyZ05hbWUgPSBvcHRpb25zLmFyZ3NbaV07CgkJCX0gZWxzZSB7CgkJCQlbYXJnTmFtZSwgZGVmYXVsdFZhbHVlXSA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuYXJnc1tpXSlbMF07CgkJCX0KCgkJCWFyZ3NbYXJnTmFtZV0gPSBjYWxsQXJnc1tpXSAhPT0gdW5kZWZpbmVkID8gY2FsbEFyZ3NbaV0gOiBkZWZhdWx0VmFsdWU7CgkJfQoJfSBlbHNlIHsKCQkvLyBOT1RFOiBQcmV2aW91c2x5IHJldHVybmVkIG51bGwuIE5vdyByZXR1cm5zIGFycmF5IChtYXkgYnJlYWsgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpLgoJCWFyZ3MgPSBBcnJheS5mcm9tKGNhbGxBcmdzKTsKCX0KCglyZXR1cm4gYXJnczsKfQoKZnVuY3Rpb24gb2JqZWN0QnVpbGRlcihwcm9wcykgewoJY29uc3Qgb3B0aW9ucyA9IHsgcHJvcHMgfTsKCglyZXR1cm4gewoJCWJ1aWxkOiBmdW5jdGlvbihwYXJlbnQsIGtleSkgewoJCQljb25zdCBtb2NrID0gY3JlYXRlT2JqZWN0V2l0aFByb3BzKG9wdGlvbnMucHJvcHMpOwoKCQkJaWYgKHBhcmVudCkKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXJlbnQsIGtleSwgeyB2YWx1ZTogbW9jayB9KTsKCgkJCXJldHVybiB3aXJlT2JqZWN0KHBhcmVudCA/IHBhcmVudFtrZXldIDogbW9jaywgcHJvcHMpOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIHdpcmVPYmplY3QobW9jaywgaW5pdGlhbFByb3BzKSB7Cgljb25zdCBpbml0aWFsTW9ja3MgPSBuZXcgU2V0KCk7Cgljb25zdCBpbml0aWFsVmFsdWVzID0gbmV3IE1hcCgpOwoKCWZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyhpbml0aWFsUHJvcHMpKSB7CgkJY29uc3QgcHJvcCA9IGluaXRpYWxQcm9wc1trZXldOwoJCWlmICh0eXBlb2YgcHJvcD8uYnVpbGQgPT09ICdmdW5jdGlvbicpIHsKCQkJaW5pdGlhbE1vY2tzLmFkZChrZXkpOwoJCX0gZWxzZSB7CgkJCWluaXRpYWxWYWx1ZXMuc2V0KGtleSwgcHJvcCk7CgkJfQoJfQoKCW1vY2sucmVzZXQgPSAoKSA9PiB7CgkJZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKG1vY2spKSB7CgkJCWlmIChrZXkgPT09ICdyZXNldCcpIGNvbnRpbnVlOwoKCQkJaWYgKGluaXRpYWxNb2Nrcy5oYXMoa2V5KSkgewoJCQkJaWYgKHR5cGVvZiBtb2NrW2tleV0/LnJlc2V0ID09PSAnZnVuY3Rpb24nKQoJCQkJCW1vY2tba2V5XS5yZXNldCgpOwoJCQl9IGVsc2UgaWYgKGluaXRpYWxWYWx1ZXMuaGFzKGtleSkpIHsKCQkJCW1vY2tba2V5XSA9IGluaXRpYWxWYWx1ZXMuZ2V0KGtleSk7CgkJCX0gZWxzZSB7CgkJCQlkZWxldGUgbW9ja1trZXldOwoJCQl9CgkJfQoJfTsKCglyZXR1cm4gbW9jazsKfQoKZnVuY3Rpb24gY3JlYXRlT2JqZWN0V2l0aFByb3BzKHByb3BzKSB7Cgljb25zdCBvYmplY3QgPSB7fTsKCglmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXMocHJvcHMpKSB7CgkJY29uc3QgcHJvcCA9IHByb3BzW2tleV07CgoJCWlmICh0eXBlb2YgcHJvcD8uYnVpbGQgPT0gJ2Z1bmN0aW9uJykgewoJCQlwcm9wLmJ1aWxkKG9iamVjdCwga2V5KTsKCQl9IGVsc2UgewoJCQlvYmplY3Rba2V5XSA9IHByb3A7CgkJfQoJfQoKCXJldHVybiBvYmplY3Q7Cn0KCmZ1bmN0aW9uIGNsYXNzQnVpbGRlcihtZW1iZXJzKSB7Cgljb25zdCBvcHRpb25zID0geyBtZW1iZXJzIH07CgoJcmV0dXJuIHsKCQlidWlsZDogZnVuY3Rpb24ocGFyZW50LCBrZXkpIHsKCQkJY29uc3Qgc3RhdGUgPSB7fTsKCQkJY29uc3QgTW9jayA9IGNyZWF0ZUNsYXNzKHN0YXRlLCBvcHRpb25zKTsKCgkJCWlmIChwYXJlbnQpCgkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkocGFyZW50LCBrZXksIHsgdmFsdWU6IE1vY2sgfSk7CgoJCQlyZXR1cm4gd2lyZUNsYXNzKHBhcmVudCA/IHBhcmVudFtrZXldIDogTW9jaywgc3RhdGUsIG9wdGlvbnMpOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIGNyZWF0ZUNsYXNzKHN0YXRlLCBvcHRpb25zKSB7Cgljb25zdCBNb2NrID0gZnVuY3Rpb24oKSB7CgkJY29uc3QgaW5kZXggPSBzdGF0ZS5udW1JbnN0YW5jZXM7CgoJCWlmICghc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XSkKCQkJc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XSA9IGNyZWF0ZU9iamVjdFdpdGhQcm9wcyhvcHRpb25zLm1lbWJlcnMpOwoKCQlPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ19tb2NrSW5kZXgnLCB7IHZhbHVlOiBpbmRleCB9KTsKCgkJaWYgKHR5cGVvZiBzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdLmNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nKQoJCQlzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKTsKCgkJc3RhdGUubnVtSW5zdGFuY2VzKys7Cgl9OwoKCWZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyhvcHRpb25zLm1lbWJlcnMpKSB7CgkJaWYgKGtleSA9PT0gJ2NvbnN0cnVjdG9yJykKCQkJY29udGludWU7CgoJCWNvbnN0IG1lbWJlciA9IG9wdGlvbnMubWVtYmVyc1trZXldOwoKCQlpZiAodHlwZW9mIG1lbWJlcj8uYnVpbGQgPT09ICdmdW5jdGlvbicpIHsKCQkJaWYgKG1lbWJlci5pc1Byb3BlcnR5KSB7CgkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoTW9jay5wcm90b3R5cGUsIGtleSwgewoJCQkJCWdldDogZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBzdGF0ZS5kZXNjcmlwdGlvbnNbdGhpcy5fbW9ja0luZGV4XVtrZXldOwoJCQkJCX0sCgkJCQkJc2V0OiBmdW5jdGlvbih2YWx1ZSkgewoJCQkJCQlzdGF0ZS5kZXNjcmlwdGlvbnNbdGhpcy5fbW9ja0luZGV4XVtrZXldID0gdmFsdWU7CgkJCQkJfSwKCQkJCQllbnVtZXJhYmxlOiB0cnVlLAoJCQkJCWNvbmZpZ3VyYWJsZTogdHJ1ZQoJCQkJfSk7CgkJCX0gZWxzZSB7CgkJCQlNb2NrLnByb3RvdHlwZVtrZXldID0gZnVuY3Rpb24oLi4uYXJncykgewoJCQkJCXJldHVybiBzdGF0ZS5kZXNjcmlwdGlvbnNbdGhpcy5fbW9ja0luZGV4XVtrZXldLmFwcGx5KHRoaXMsIGFyZ3MpOwoJCQkJfTsKCQkJfQoJCX0gZWxzZSB7CgkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShNb2NrLnByb3RvdHlwZSwga2V5LCB7CgkJCQlnZXQ6IGZ1bmN0aW9uKCkgewoJCQkJCXJldHVybiBzdGF0ZS5kZXNjcmlwdGlvbnNbdGhpcy5fbW9ja0luZGV4XVtrZXldOwoJCQkJfSwKCQkJCXNldDogZnVuY3Rpb24odmFsdWUpIHsKCQkJCQlzdGF0ZS5kZXNjcmlwdGlvbnNbdGhpcy5fbW9ja0luZGV4XVtrZXldID0gdmFsdWU7CgkJCQl9LAoJCQkJZW51bWVyYWJsZTogdHJ1ZSwKCQkJCWNvbmZpZ3VyYWJsZTogdHJ1ZQoJCQl9KTsKCQl9Cgl9CgoJcmV0dXJuIE1vY2s7Cn0KCmZ1bmN0aW9uIHdpcmVDbGFzcyhNb2NrLCBzdGF0ZSwgb3B0aW9ucykgewoJTW9jay5pbnN0ID0gKGluZGV4ID0gMCkgPT4gewoJCWlmICghc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XSkKCQkJc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XSA9IGNyZWF0ZU9iamVjdFdpdGhQcm9wcyhvcHRpb25zLm1lbWJlcnMpOwoKCQlyZXR1cm4gc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XTsKCX07CglNb2NrLm51bUluc3RzID0gKCkgPT4gewoJCXJldHVybiBzdGF0ZS5udW1JbnN0YW5jZXM7Cgl9OwoJTW9jay5yZXNldCA9ICgpID0+IHsKCQlzdGF0ZS5kZXNjcmlwdGlvbnMgPSBbXTsKCQlzdGF0ZS5udW1JbnN0YW5jZXMgPSAwOwoJCXN0YXRlLmRhdGEgPSB7fTsKCX07CglNb2NrLnJlc2V0KCk7CgoJcmV0dXJuIE1vY2s7Cn0KCmZ1bmN0aW9uIHByb3BlcnR5QnVpbGRlcigpIHsKCXJldHVybiB7CgkJaXNQcm9wZXJ0eTogdHJ1ZSwKCQlidWlsZDogZnVuY3Rpb24ocGFyZW50LCBrZXkpIHsKCQkJY29uc3Qgc3RhdGUgPSB7fTsKCgkJCWlmIChwYXJlbnQpIHsKCQkJCXBhcmVudFtrZXldID0ge307CgkJCQl3aXJlUHJvcGVydHkocGFyZW50W2tleV0sIHN0YXRlKTsKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXJlbnQsIGtleSwgewoJCQkJCWdldDogKCkgPT4gewoJCQkJCQlyZXR1cm4gc3RhdGUudmFsdWU7CgkJCQkJfSwKCQkJCQlzZXQ6ICh2YWx1ZSkgPT4gewoJCQkJCQlzdGF0ZS52YWx1ZSA9IHZhbHVlOwoJCQkJCX0KCQkJCX0pOwoJCQl9CgkJfQoJfTsKfQoKZnVuY3Rpb24gd2lyZVByb3BlcnR5KG1vY2ssIHN0YXRlKSB7Cgltb2NrLnJlc2V0ID0gKCkgPT4gewoJCXN0YXRlLnZhbHVlID0gdW5kZWZpbmVkOwoJfTsKCglyZXR1cm4gbW9jazsKfQoKZnVuY3Rpb24gZGVlcENsb25lKHRhcmdldCkgewoJaWYgKHR5cGVvZiB0YXJnZXQgPT09ICdvYmplY3QnKSB7CgkJaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkgewoJCQlyZXR1cm4gdGFyZ2V0Lm1hcChkZWVwQ2xvbmUpOwoJCX0gZWxzZSBpZiAodGFyZ2V0Py5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7CgkJCWNvbnN0IGNsb25lID0ge307CgoJCQlmb3IgKGNvbnN0IGtleSBpbiB0YXJnZXQpIHsKCQkJCWNsb25lW2tleV0gPSBkZWVwQ2xvbmUodGFyZ2V0W2tleV0pOwoJCQl9CgoJCQlyZXR1cm4gY2xvbmU7CgkJfQoJfQoKCXJldHVybiB0YXJnZXQ7Cn0KCmZ1bmN0aW9uIGNyZWF0ZVNweShvYmplY3QsIGtleSwgcmVwbGFjZW1lbnQpIHsKCWlmICghcmVwbGFjZW1lbnQpIHsKCQlyZXBsYWNlbWVudCA9IGZ1bmN0aW9uQnVpbGRlcigoY3R4KSA9PiB7CgkJCWlmIChjdHgucmV0ICE9PSB1bmRlZmluZWQpCgkJCQlyZXR1cm4gY3R4LnJldDsKCgkJCXJldHVybiBjdHgub3JpZ2luYWwuYXBwbHkoY3R4LnNlbGYsIGN0eC5yYXdBcmdzKTsKCQl9KTsKCX0KCgljb25zdCBvcmlnaW5hbCA9IG9iamVjdFtrZXldOwoJY29uc3Qgc3B5Rm4gPSByZXBsYWNlbWVudC5vcmlnaW5hbChvcmlnaW5hbCkuYnVpbGQoKTsKCXNweUZuLnJlc3RvcmUgPSAoKSA9PiB7CgkJb2JqZWN0W2tleV0gPSBvcmlnaW5hbDsKCX07CglvYmplY3Rba2V5XSA9IHNweUZuOwoKCXJldHVybiBzcHlGbjsKfQoKbW9kdWxlLmV4cG9ydHMgPSB7CglzcHk6IGNyZWF0ZVNweSwKCWNyZWF0ZTogbW9ja0J1aWxkZXIsCglmdW5jdGlvbjogZnVuY3Rpb25CdWlsZGVyLAoJb2JqZWN0OiBvYmplY3RCdWlsZGVyLAoJY2xhc3M6IGNsYXNzQnVpbGRlciwKCXByb3BlcnR5OiBwcm9wZXJ0eUJ1aWxkZXIsCn07CgAAAAAAAAAA6xwAAAAAAAAAAAAA",
930
+ "AwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAEQUAAAAAAAAVRQAAAAAAAAAAAAAAADwvw"
931
+ ],
932
+ [
933
+ 27,
934
+ 1,
935
+ "revert",
936
+ null,
937
+ "AgAAAAAAAAAAAAAAAAAAAAAAAADrHAAAZnVuY3Rpb24gbW9ja0J1aWxkZXIoYnVpbGRlcikgewoJcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKfQoKZnVuY3Rpb24gZnVuY3Rpb25CdWlsZGVyKGJvZHkpIHsKCWNvbnN0IG9wdGlvbnMgPSB7CgkJYXN5bmM6IGZhbHNlLAoJCWJvZHk6IGJvZHksCgkJYXJnczogW10sCgkJc2VsZWN0OiBbXSwKCQlvcmlnaW5hbDogdW5kZWZpbmVkCgl9OwoKCXJldHVybiB7CgkJYXN5bmM6IGZ1bmN0aW9uKCkgewoJCQlvcHRpb25zLmFzeW5jID0gdHJ1ZTsKCQkJcmV0dXJuIHRoaXM7CgkJfSwKCQlhcmdzOiBmdW5jdGlvbiguLi5hcmdzKSB7CgkJCW9wdGlvbnMuYXJncyA9IGFyZ3M7CgkJCXJldHVybiB0aGlzOwoJCX0sCgkJYXJnU2VsZWN0OiBmdW5jdGlvbiguLi5pbmRleGVzKSB7CgkJCW9wdGlvbnMuc2VsZWN0ID0gaW5kZXhlczsKCQkJcmV0dXJuIHRoaXM7CgkJfSwKCQlvcmlnaW5hbDogZnVuY3Rpb24oZm4pIHsKCQkJb3B0aW9ucy5vcmlnaW5hbCA9IGZuOwoJCQlyZXR1cm4gdGhpczsKCQl9LAoJCWJ1aWxkOiBmdW5jdGlvbihwYXJlbnQsIGtleSkgewoJCQljb25zdCBzdGF0ZSA9IHt9OwoJCQljb25zdCBtb2NrID0gY3JlYXRlRnVuY3Rpb24oc3RhdGUsIG9wdGlvbnMpOwoKCQkJaWYgKHBhcmVudCkKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXJlbnQsIGtleSwgeyB2YWx1ZTogbW9jayB9KTsKCgkJCXJldHVybiB3aXJlRnVuY3Rpb24ocGFyZW50ID8gcGFyZW50W2tleV0gOiBtb2NrLCBzdGF0ZSk7CgkJfQoJfTsKfQoKZnVuY3Rpb24gd2lyZUZ1bmN0aW9uKG1vY2ssIHN0YXRlKSB7Cgltb2NrLnJldCA9ICh2YWx1ZSwgY2FsbCA9IDApID0+IHsKCQlzdGF0ZS5yZXRzW2NhbGxdID0gdmFsdWU7Cgl9OwoJbW9jay5vblJldCA9IChoYW5kbGVyLCBjYWxsID0gMCkgPT4gewoJCXN0YXRlLnJldEhhbmRsZXJzW2NhbGxdID0gaGFuZGxlcjsKCX07Cgltb2NrLmNhbGxzID0gKGNhbGwpID0+IHsKCQlyZXR1cm4gY2FsbCAhPT0gdW5kZWZpbmVkID8gc3RhdGUuY2FsbHNbY2FsbF0gOiBzdGF0ZS5jYWxsczsKCX07Cgltb2NrLmRhdGEgPSAoa2V5KSA9PiB7CgkJcmV0dXJuIGtleSAhPT0gdW5kZWZpbmVkID8gc3RhdGUuZGF0YVtrZXldIDogc3RhdGUuZGF0YTsKCX07Cgltb2NrLnJlc2V0ID0gKCkgPT4gewoJCXN0YXRlLnJldHMgPSBbXTsKCQlzdGF0ZS5yZXRIYW5kbGVycyA9IFtdOwoJCXN0YXRlLmNhbGxzID0gW107CgkJc3RhdGUuZGF0YSA9IHt9OwoJfTsKCW1vY2sucmVzZXQoKTsKCglyZXR1cm4gbW9jazsKfQoKZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb24oc3RhdGUsIG9wdGlvbnMpIHsKCWlmIChvcHRpb25zLmFzeW5jKSB7CgkJcmV0dXJuIGFzeW5jIGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gZ2V0RnVuY3Rpb25Cb2R5KHRoaXMsIHN0YXRlLCBvcHRpb25zLCBBcnJheS5mcm9tKGFyZ3VtZW50cykpOwoJCX07Cgl9IGVsc2UgewoJCXJldHVybiBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIGdldEZ1bmN0aW9uQm9keSh0aGlzLCBzdGF0ZSwgb3B0aW9ucywgQXJyYXkuZnJvbShhcmd1bWVudHMpKTsKCQl9OwoJfQp9CgpmdW5jdGlvbiBnZXRGdW5jdGlvbkJvZHkocGFyZW50LCBzdGF0ZSwgb3B0aW9ucywgcmF3QXJncykgewoJY29uc3QgYXJncyA9IGRlZXBDbG9uZShnZXRGdW5jdGlvbkFyZ3MocmF3QXJncywgb3B0aW9ucykpOwoJc3RhdGUuY2FsbHMucHVzaChhcmdzKTsKCWNvbnN0IGNhbGwgPSBzdGF0ZS5jYWxscy5sZW5ndGg7CgoJbGV0IHJldDsKCglpZiAoc3RhdGUucmV0c1tjYWxsXSkgewoJCXJldCA9IHN0YXRlLnJldHNbY2FsbF07Cgl9IGVsc2UgaWYgKHN0YXRlLnJldEhhbmRsZXJzW2NhbGxdKSB7CgkJcmV0ID0gc3RhdGUucmV0SGFuZGxlcnNbY2FsbF0oYXJncyk7Cgl9IGVsc2UgaWYgKHN0YXRlLnJldHNbMF0pIHsKCQlyZXQgPSBzdGF0ZS5yZXRzWzBdOwoJfSBlbHNlIGlmIChzdGF0ZS5yZXRIYW5kbGVyc1swXSkgewoJCXJldCA9IHN0YXRlLnJldEhhbmRsZXJzWzBdKGFyZ3MpOwoJfQoKCWlmIChyZXQgaW5zdGFuY2VvZiBFcnJvcikKCQl0aHJvdyByZXQ7CgoJaWYgKG9wdGlvbnMuYm9keSkgewoJCXJldHVybiBvcHRpb25zLmJvZHkoewoJCQlzZWxmOiBwYXJlbnQsCgkJCXN0YXRlOiBzdGF0ZSwKCQkJY2FsbDogY2FsbCwKCQkJYXJnczogYXJncywKCQkJcmF3QXJnczogcmF3QXJncywKCQkJb3JpZ2luYWw6IG9wdGlvbnMub3JpZ2luYWwsCgkJCXJldDogcmV0CgkJfSk7Cgl9IGVsc2UgewoJCXJldHVybiByZXQ7Cgl9Cn0KCmZ1bmN0aW9uIGdldEZ1bmN0aW9uQXJncyhjYWxsQXJncywgb3B0aW9ucykgewoJbGV0IGFyZ3MgPSBudWxsOwoKCWlmIChvcHRpb25zLnNlbGVjdC5sZW5ndGggPT0gMSkgewoJCWFyZ3MgPSBjYWxsQXJnc1tvcHRpb25zLnNlbGVjdFswXV07Cgl9IGVsc2UgaWYgKG9wdGlvbnMuYXJncy5sZW5ndGgpIHsKCQlhcmdzID0ge307CgoJCWZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9ucy5hcmdzLmxlbmd0aDsgaSsrKSB7CgkJCWlmIChvcHRpb25zLnNlbGVjdC5sZW5ndGggJiYgIW9wdGlvbnMuc2VsZWN0LmluY2x1ZGVzKGkpKQoJCQkJY29udGludWU7CgoJCQlsZXQgYXJnTmFtZSA9ICcnOwoJCQlsZXQgZGVmYXVsdFZhbHVlID0gdW5kZWZpbmVkOwoKCQkJaWYgKHR5cGVvZiBvcHRpb25zLmFyZ3NbaV0gPT0gJ3N0cmluZycpIHsKCQkJCWFyZ05hbWUgPSBvcHRpb25zLmFyZ3NbaV07CgkJCX0gZWxzZSB7CgkJCQlbYXJnTmFtZSwgZGVmYXVsdFZhbHVlXSA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuYXJnc1tpXSlbMF07CgkJCX0KCgkJCWFyZ3NbYXJnTmFtZV0gPSBjYWxsQXJnc1tpXSAhPT0gdW5kZWZpbmVkID8gY2FsbEFyZ3NbaV0gOiBkZWZhdWx0VmFsdWU7CgkJfQoJfSBlbHNlIHsKCQkvLyBOT1RFOiBQcmV2aW91c2x5IHJldHVybmVkIG51bGwuIE5vdyByZXR1cm5zIGFycmF5IChtYXkgYnJlYWsgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpLgoJCWFyZ3MgPSBBcnJheS5mcm9tKGNhbGxBcmdzKTsKCX0KCglyZXR1cm4gYXJnczsKfQoKZnVuY3Rpb24gb2JqZWN0QnVpbGRlcihwcm9wcykgewoJY29uc3Qgb3B0aW9ucyA9IHsgcHJvcHMgfTsKCglyZXR1cm4gewoJCWJ1aWxkOiBmdW5jdGlvbihwYXJlbnQsIGtleSkgewoJCQljb25zdCBtb2NrID0gY3JlYXRlT2JqZWN0V2l0aFByb3BzKG9wdGlvbnMucHJvcHMpOwoKCQkJaWYgKHBhcmVudCkKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXJlbnQsIGtleSwgeyB2YWx1ZTogbW9jayB9KTsKCgkJCXJldHVybiB3aXJlT2JqZWN0KHBhcmVudCA/IHBhcmVudFtrZXldIDogbW9jaywgcHJvcHMpOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIHdpcmVPYmplY3QobW9jaywgaW5pdGlhbFByb3BzKSB7Cgljb25zdCBpbml0aWFsTW9ja3MgPSBuZXcgU2V0KCk7Cgljb25zdCBpbml0aWFsVmFsdWVzID0gbmV3IE1hcCgpOwoKCWZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyhpbml0aWFsUHJvcHMpKSB7CgkJY29uc3QgcHJvcCA9IGluaXRpYWxQcm9wc1trZXldOwoJCWlmICh0eXBlb2YgcHJvcD8uYnVpbGQgPT09ICdmdW5jdGlvbicpIHsKCQkJaW5pdGlhbE1vY2tzLmFkZChrZXkpOwoJCX0gZWxzZSB7CgkJCWluaXRpYWxWYWx1ZXMuc2V0KGtleSwgcHJvcCk7CgkJfQoJfQoKCW1vY2sucmVzZXQgPSAoKSA9PiB7CgkJZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKG1vY2spKSB7CgkJCWlmIChrZXkgPT09ICdyZXNldCcpIGNvbnRpbnVlOwoKCQkJaWYgKGluaXRpYWxNb2Nrcy5oYXMoa2V5KSkgewoJCQkJaWYgKHR5cGVvZiBtb2NrW2tleV0/LnJlc2V0ID09PSAnZnVuY3Rpb24nKQoJCQkJCW1vY2tba2V5XS5yZXNldCgpOwoJCQl9IGVsc2UgaWYgKGluaXRpYWxWYWx1ZXMuaGFzKGtleSkpIHsKCQkJCW1vY2tba2V5XSA9IGluaXRpYWxWYWx1ZXMuZ2V0KGtleSk7CgkJCX0gZWxzZSB7CgkJCQlkZWxldGUgbW9ja1trZXldOwoJCQl9CgkJfQoJfTsKCglyZXR1cm4gbW9jazsKfQoKZnVuY3Rpb24gY3JlYXRlT2JqZWN0V2l0aFByb3BzKHByb3BzKSB7Cgljb25zdCBvYmplY3QgPSB7fTsKCglmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXMocHJvcHMpKSB7CgkJY29uc3QgcHJvcCA9IHByb3BzW2tleV07CgoJCWlmICh0eXBlb2YgcHJvcD8uYnVpbGQgPT0gJ2Z1bmN0aW9uJykgewoJCQlwcm9wLmJ1aWxkKG9iamVjdCwga2V5KTsKCQl9IGVsc2UgewoJCQlvYmplY3Rba2V5XSA9IHByb3A7CgkJfQoJfQoKCXJldHVybiBvYmplY3Q7Cn0KCmZ1bmN0aW9uIGNsYXNzQnVpbGRlcihtZW1iZXJzKSB7Cgljb25zdCBvcHRpb25zID0geyBtZW1iZXJzIH07CgoJcmV0dXJuIHsKCQlidWlsZDogZnVuY3Rpb24ocGFyZW50LCBrZXkpIHsKCQkJY29uc3Qgc3RhdGUgPSB7fTsKCQkJY29uc3QgTW9jayA9IGNyZWF0ZUNsYXNzKHN0YXRlLCBvcHRpb25zKTsKCgkJCWlmIChwYXJlbnQpCgkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkocGFyZW50LCBrZXksIHsgdmFsdWU6IE1vY2sgfSk7CgoJCQlyZXR1cm4gd2lyZUNsYXNzKHBhcmVudCA/IHBhcmVudFtrZXldIDogTW9jaywgc3RhdGUsIG9wdGlvbnMpOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIGNyZWF0ZUNsYXNzKHN0YXRlLCBvcHRpb25zKSB7Cgljb25zdCBNb2NrID0gZnVuY3Rpb24oKSB7CgkJY29uc3QgaW5kZXggPSBzdGF0ZS5udW1JbnN0YW5jZXM7CgoJCWlmICghc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XSkKCQkJc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XSA9IGNyZWF0ZU9iamVjdFdpdGhQcm9wcyhvcHRpb25zLm1lbWJlcnMpOwoKCQlPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ19tb2NrSW5kZXgnLCB7IHZhbHVlOiBpbmRleCB9KTsKCgkJaWYgKHR5cGVvZiBzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdLmNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nKQoJCQlzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKTsKCgkJc3RhdGUubnVtSW5zdGFuY2VzKys7Cgl9OwoKCWZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyhvcHRpb25zLm1lbWJlcnMpKSB7CgkJaWYgKGtleSA9PT0gJ2NvbnN0cnVjdG9yJykKCQkJY29udGludWU7CgoJCWNvbnN0IG1lbWJlciA9IG9wdGlvbnMubWVtYmVyc1trZXldOwoKCQlpZiAodHlwZW9mIG1lbWJlcj8uYnVpbGQgPT09ICdmdW5jdGlvbicgJiYgIW1lbWJlci5pc1Byb3BlcnR5KSB7CgkJCU1vY2sucHJvdG90eXBlW2tleV0gPSBmdW5jdGlvbiguLi5hcmdzKSB7CgkJCQlyZXR1cm4gc3RhdGUuZGVzY3JpcHRpb25zW3RoaXMuX21vY2tJbmRleF1ba2V5XS5hcHBseSh0aGlzLCBhcmdzKTsKCQkJfTsKCQl9IGVsc2UgewoJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoTW9jay5wcm90b3R5cGUsIGtleSwgewoJCQkJZ2V0OiBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gc3RhdGUuZGVzY3JpcHRpb25zW3RoaXMuX21vY2tJbmRleF1ba2V5XTsKCQkJCX0sCgkJCQlzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CgkJCQkJc3RhdGUuZGVzY3JpcHRpb25zW3RoaXMuX21vY2tJbmRleF1ba2V5XSA9IHZhbHVlOwoJCQkJfSwKCQkJCWVudW1lcmFibGU6IHRydWUsCgkJCQljb25maWd1cmFibGU6IHRydWUKCQkJfSk7CgkJfQoJfQoKCXJldHVybiBNb2NrOwp9CgpmdW5jdGlvbiB3aXJlQ2xhc3MoTW9jaywgc3RhdGUsIG9wdGlvbnMpIHsKCU1vY2suaW5zdCA9IChpbmRleCA9IDApID0+IHsKCQlpZiAoIXN0YXRlLmRlc2NyaXB0aW9uc1tpbmRleF0pCgkJCXN0YXRlLmRlc2NyaXB0aW9uc1tpbmRleF0gPSBjcmVhdGVPYmplY3RXaXRoUHJvcHMob3B0aW9ucy5tZW1iZXJzKTsKCgkJcmV0dXJuIHN0YXRlLmRlc2NyaXB0aW9uc1tpbmRleF07Cgl9OwoJTW9jay5udW1JbnN0cyA9ICgpID0+IHsKCQlyZXR1cm4gc3RhdGUubnVtSW5zdGFuY2VzOwoJfTsKCU1vY2sucmVzZXQgPSAoKSA9PiB7CgkJc3RhdGUuZGVzY3JpcHRpb25zID0gW107CgkJc3RhdGUubnVtSW5zdGFuY2VzID0gMDsKCQlzdGF0ZS5kYXRhID0ge307Cgl9OwoJTW9jay5yZXNldCgpOwoKCXJldHVybiBNb2NrOwp9CgpmdW5jdGlvbiBwcm9wZXJ0eUJ1aWxkZXIoKSB7CglyZXR1cm4gewoJCWlzUHJvcGVydHk6IHRydWUsCgkJYnVpbGQ6IGZ1bmN0aW9uKHBhcmVudCwga2V5KSB7CgkJCWNvbnN0IHN0YXRlID0ge307CgoJCQlpZiAocGFyZW50KSB7CgkJCQlwYXJlbnRba2V5XSA9IHt9OwoJCQkJd2lyZVByb3BlcnR5KHBhcmVudFtrZXldLCBzdGF0ZSk7CgkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkocGFyZW50LCBrZXksIHsKCQkJCQlnZXQ6ICgpID0+IHsKCQkJCQkJcmV0dXJuIHN0YXRlLnZhbHVlOwoJCQkJCX0sCgkJCQkJc2V0OiAodmFsdWUpID0+IHsKCQkJCQkJc3RhdGUudmFsdWUgPSB2YWx1ZTsKCQkJCQl9CgkJCQl9KTsKCQkJfQoJCX0KCX07Cn0KCmZ1bmN0aW9uIHdpcmVQcm9wZXJ0eShtb2NrLCBzdGF0ZSkgewoJbW9jay5yZXNldCA9ICgpID0+IHsKCQlzdGF0ZS52YWx1ZSA9IHVuZGVmaW5lZDsKCX07CgoJcmV0dXJuIG1vY2s7Cn0KCmZ1bmN0aW9uIGRlZXBDbG9uZSh0YXJnZXQpIHsKCWlmICh0eXBlb2YgdGFyZ2V0ID09PSAnb2JqZWN0JykgewoJCWlmIChBcnJheS5pc0FycmF5KHRhcmdldCkpIHsKCQkJcmV0dXJuIHRhcmdldC5tYXAoZGVlcENsb25lKTsKCQl9IGVsc2UgaWYgKHRhcmdldD8uY29uc3RydWN0b3IgPT09IE9iamVjdCkgewoJCQljb25zdCBjbG9uZSA9IHt9OwoKCQkJZm9yIChjb25zdCBrZXkgaW4gdGFyZ2V0KSB7CgkJCQljbG9uZVtrZXldID0gZGVlcENsb25lKHRhcmdldFtrZXldKTsKCQkJfQoKCQkJcmV0dXJuIGNsb25lOwoJCX0KCX0KCglyZXR1cm4gdGFyZ2V0Owp9CgpmdW5jdGlvbiBjcmVhdGVTcHkob2JqZWN0LCBrZXksIHJlcGxhY2VtZW50KSB7CglpZiAoIXJlcGxhY2VtZW50KSB7CgkJcmVwbGFjZW1lbnQgPSBmdW5jdGlvbkJ1aWxkZXIoKGN0eCkgPT4gewoJCQlpZiAoY3R4LnJldCAhPT0gdW5kZWZpbmVkKQoJCQkJcmV0dXJuIGN0eC5yZXQ7CgoJCQlyZXR1cm4gY3R4Lm9yaWdpbmFsLmFwcGx5KGN0eC5zZWxmLCBjdHgucmF3QXJncyk7CgkJfSk7Cgl9CgoJY29uc3Qgb3JpZ2luYWwgPSBvYmplY3Rba2V5XTsKCWNvbnN0IHNweUZuID0gcmVwbGFjZW1lbnQub3JpZ2luYWwob3JpZ2luYWwpLmJ1aWxkKCk7CglzcHlGbi5yZXN0b3JlID0gKCkgPT4gewoJCW9iamVjdFtrZXldID0gb3JpZ2luYWw7Cgl9OwoJb2JqZWN0W2tleV0gPSBzcHlGbjsKCglyZXR1cm4gc3B5Rm47Cn0KCm1vZHVsZS5leHBvcnRzID0gewoJc3B5OiBjcmVhdGVTcHksCgljcmVhdGU6IG1vY2tCdWlsZGVyLAoJZnVuY3Rpb246IGZ1bmN0aW9uQnVpbGRlciwKCW9iamVjdDogb2JqZWN0QnVpbGRlciwKCWNsYXNzOiBjbGFzc0J1aWxkZXIsCglwcm9wZXJ0eTogcHJvcGVydHlCdWlsZGVyLAp9OwoAAAAAAAAAAEUbAAAAAAAAAAAAAA",
938
+ "AwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAALEZAAAAAAAAsRkAAAAAAAAAAAAAAADwvw"
939
+ ],
940
+ [
941
+ 31,
942
+ 1,
943
+ "revert",
944
+ null,
945
+ "AgAAAAAAAAAAAAAAAAAAAAAAAABFGwAAZnVuY3Rpb24gbW9ja0J1aWxkZXIoYnVpbGRlcikgewoJcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKfQoKZnVuY3Rpb24gZnVuY3Rpb25CdWlsZGVyKGJvZHkpIHsKCWNvbnN0IG9wdGlvbnMgPSB7CgkJYXN5bmM6IGZhbHNlLAoJCWJvZHk6IGJvZHksCgkJYXJnczogW10sCgkJc2VsZWN0OiBbXSwKCQlvcmlnaW5hbDogdW5kZWZpbmVkCgl9OwoKCXJldHVybiB7CgkJYXN5bmM6IGZ1bmN0aW9uKCkgewoJCQlvcHRpb25zLmFzeW5jID0gdHJ1ZTsKCQkJcmV0dXJuIHRoaXM7CgkJfSwKCQlhcmdzOiBmdW5jdGlvbiguLi5hcmdzKSB7CgkJCW9wdGlvbnMuYXJncyA9IGFyZ3M7CgkJCXJldHVybiB0aGlzOwoJCX0sCgkJYXJnU2VsZWN0OiBmdW5jdGlvbiguLi5pbmRleGVzKSB7CgkJCW9wdGlvbnMuc2VsZWN0ID0gaW5kZXhlczsKCQkJcmV0dXJuIHRoaXM7CgkJfSwKCQlvcmlnaW5hbDogZnVuY3Rpb24oZm4pIHsKCQkJb3B0aW9ucy5vcmlnaW5hbCA9IGZuOwoJCQlyZXR1cm4gdGhpczsKCQl9LAoJCWJ1aWxkOiBmdW5jdGlvbihwYXJlbnQsIGtleSkgewoJCQljb25zdCBzdGF0ZSA9IHt9OwoJCQljb25zdCBtb2NrID0gY3JlYXRlRnVuY3Rpb24oc3RhdGUsIG9wdGlvbnMpOwoKCQkJaWYgKHBhcmVudCkKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXJlbnQsIGtleSwgeyB2YWx1ZTogbW9jayB9KTsKCgkJCXJldHVybiB3aXJlRnVuY3Rpb24ocGFyZW50ID8gcGFyZW50W2tleV0gOiBtb2NrLCBzdGF0ZSk7CgkJfQoJfTsKfQoKZnVuY3Rpb24gd2lyZUZ1bmN0aW9uKG1vY2ssIHN0YXRlKSB7Cgltb2NrLnJldCA9ICh2YWx1ZSwgY2FsbCA9IDApID0+IHsKCQlzdGF0ZS5yZXRzW2NhbGxdID0gdmFsdWU7Cgl9OwoJbW9jay5vblJldCA9IChoYW5kbGVyLCBjYWxsID0gMCkgPT4gewoJCXN0YXRlLnJldEhhbmRsZXJzW2NhbGxdID0gaGFuZGxlcjsKCX07Cgltb2NrLmNhbGxzID0gKGNhbGwpID0+IHsKCQlyZXR1cm4gY2FsbCAhPT0gdW5kZWZpbmVkID8gc3RhdGUuY2FsbHNbY2FsbF0gOiBzdGF0ZS5jYWxsczsKCX07Cgltb2NrLmRhdGEgPSAoa2V5KSA9PiB7CgkJcmV0dXJuIGtleSAhPT0gdW5kZWZpbmVkID8gc3RhdGUuZGF0YVtrZXldIDogc3RhdGUuZGF0YTsKCX07Cgltb2NrLnJlc2V0ID0gKCkgPT4gewoJCXN0YXRlLnJldHMgPSBbXTsKCQlzdGF0ZS5yZXRIYW5kbGVycyA9IFtdOwoJCXN0YXRlLmNhbGxzID0gW107CgkJc3RhdGUuZGF0YSA9IHt9OwoJfTsKCW1vY2sucmVzZXQoKTsKCglyZXR1cm4gbW9jazsKfQoKZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb24oc3RhdGUsIG9wdGlvbnMpIHsKCWlmIChvcHRpb25zLmFzeW5jKSB7CgkJcmV0dXJuIGFzeW5jIGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gZ2V0RnVuY3Rpb25Cb2R5KHRoaXMsIHN0YXRlLCBvcHRpb25zLCBBcnJheS5mcm9tKGFyZ3VtZW50cykpOwoJCX07Cgl9IGVsc2UgewoJCXJldHVybiBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIGdldEZ1bmN0aW9uQm9keSh0aGlzLCBzdGF0ZSwgb3B0aW9ucywgQXJyYXkuZnJvbShhcmd1bWVudHMpKTsKCQl9OwoJfQp9CgpmdW5jdGlvbiBnZXRGdW5jdGlvbkJvZHkocGFyZW50LCBzdGF0ZSwgb3B0aW9ucywgcmF3QXJncykgewoJY29uc3QgYXJncyA9IGRlZXBDbG9uZShnZXRGdW5jdGlvbkFyZ3MocmF3QXJncywgb3B0aW9ucykpOwoJc3RhdGUuY2FsbHMucHVzaChhcmdzKTsKCWNvbnN0IGNhbGwgPSBzdGF0ZS5jYWxscy5sZW5ndGg7CgoJbGV0IHJldDsKCglpZiAoc3RhdGUucmV0c1tjYWxsXSkgewoJCXJldCA9IHN0YXRlLnJldHNbY2FsbF07Cgl9IGVsc2UgaWYgKHN0YXRlLnJldEhhbmRsZXJzW2NhbGxdKSB7CgkJcmV0ID0gc3RhdGUucmV0SGFuZGxlcnNbY2FsbF0oYXJncyk7Cgl9IGVsc2UgaWYgKHN0YXRlLnJldHNbMF0pIHsKCQlyZXQgPSBzdGF0ZS5yZXRzWzBdOwoJfSBlbHNlIGlmIChzdGF0ZS5yZXRIYW5kbGVyc1swXSkgewoJCXJldCA9IHN0YXRlLnJldEhhbmRsZXJzWzBdKGFyZ3MpOwoJfQoKCWlmIChyZXQgaW5zdGFuY2VvZiBFcnJvcikKCQl0aHJvdyByZXQ7CgoJaWYgKG9wdGlvbnMuYm9keSkgewoJCXJldHVybiBvcHRpb25zLmJvZHkoewoJCQlzZWxmOiBwYXJlbnQsCgkJCXN0YXRlOiBzdGF0ZSwKCQkJY2FsbDogY2FsbCwKCQkJYXJnczogYXJncywKCQkJcmF3QXJnczogcmF3QXJncywKCQkJb3JpZ2luYWw6IG9wdGlvbnMub3JpZ2luYWwsCgkJCXJldDogcmV0CgkJfSk7Cgl9IGVsc2UgewoJCXJldHVybiByZXQ7Cgl9Cn0KCmZ1bmN0aW9uIGdldEZ1bmN0aW9uQXJncyhjYWxsQXJncywgb3B0aW9ucykgewoJbGV0IGFyZ3MgPSBudWxsOwoKCWlmIChvcHRpb25zLnNlbGVjdC5sZW5ndGggPT0gMSkgewoJCWFyZ3MgPSBjYWxsQXJnc1tvcHRpb25zLnNlbGVjdFswXV07Cgl9IGVsc2UgaWYgKG9wdGlvbnMuYXJncy5sZW5ndGgpIHsKCQlhcmdzID0ge307CgoJCWZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9ucy5hcmdzLmxlbmd0aDsgaSsrKSB7CgkJCWlmIChvcHRpb25zLnNlbGVjdC5sZW5ndGggJiYgIW9wdGlvbnMuc2VsZWN0LmluY2x1ZGVzKGkpKQoJCQkJY29udGludWU7CgoJCQlsZXQgYXJnTmFtZSA9ICcnOwoJCQlsZXQgZGVmYXVsdFZhbHVlID0gdW5kZWZpbmVkOwoKCQkJaWYgKHR5cGVvZiBvcHRpb25zLmFyZ3NbaV0gPT0gJ3N0cmluZycpIHsKCQkJCWFyZ05hbWUgPSBvcHRpb25zLmFyZ3NbaV07CgkJCX0gZWxzZSB7CgkJCQlbYXJnTmFtZSwgZGVmYXVsdFZhbHVlXSA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuYXJnc1tpXSlbMF07CgkJCX0KCgkJCWFyZ3NbYXJnTmFtZV0gPSBjYWxsQXJnc1tpXSAhPT0gdW5kZWZpbmVkID8gY2FsbEFyZ3NbaV0gOiBkZWZhdWx0VmFsdWU7CgkJfQoJfSBlbHNlIHsKCQkvLyBOT1RFOiBQcmV2aW91c2x5IHJldHVybmVkIG51bGwuIE5vdyByZXR1cm5zIGFycmF5IChtYXkgYnJlYWsgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpLgoJCWFyZ3MgPSBBcnJheS5mcm9tKGNhbGxBcmdzKTsKCX0KCglyZXR1cm4gYXJnczsKfQoKZnVuY3Rpb24gb2JqZWN0QnVpbGRlcihwcm9wcykgewoJY29uc3Qgb3B0aW9ucyA9IHsgcHJvcHMgfTsKCglyZXR1cm4gewoJCWJ1aWxkOiBmdW5jdGlvbihwYXJlbnQsIGtleSkgewoJCQljb25zdCBtb2NrID0gY3JlYXRlT2JqZWN0V2l0aFByb3BzKG9wdGlvbnMucHJvcHMpOwoKCQkJaWYgKHBhcmVudCkKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXJlbnQsIGtleSwgeyB2YWx1ZTogbW9jayB9KTsKCgkJCXJldHVybiB3aXJlT2JqZWN0KHBhcmVudCA/IHBhcmVudFtrZXldIDogbW9jaywgcHJvcHMpOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIHdpcmVPYmplY3QobW9jaywgaW5pdGlhbFByb3BzKSB7Cgljb25zdCBpbml0aWFsTW9ja3MgPSBuZXcgU2V0KCk7Cgljb25zdCBpbml0aWFsVmFsdWVzID0gbmV3IE1hcCgpOwoKCWZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyhpbml0aWFsUHJvcHMpKSB7CgkJY29uc3QgcHJvcCA9IGluaXRpYWxQcm9wc1trZXldOwoJCWlmICh0eXBlb2YgcHJvcD8uYnVpbGQgPT09ICdmdW5jdGlvbicpIHsKCQkJaW5pdGlhbE1vY2tzLmFkZChrZXkpOwoJCX0gZWxzZSB7CgkJCWluaXRpYWxWYWx1ZXMuc2V0KGtleSwgcHJvcCk7CgkJfQoJfQoKCW1vY2sucmVzZXQgPSAoKSA9PiB7CgkJZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKG1vY2spKSB7CgkJCWlmIChrZXkgPT09ICdyZXNldCcpIGNvbnRpbnVlOwoKCQkJaWYgKGluaXRpYWxNb2Nrcy5oYXMoa2V5KSkgewoJCQkJaWYgKHR5cGVvZiBtb2NrW2tleV0/LnJlc2V0ID09PSAnZnVuY3Rpb24nKQoJCQkJCW1vY2tba2V5XS5yZXNldCgpOwoJCQl9IGVsc2UgaWYgKGluaXRpYWxWYWx1ZXMuaGFzKGtleSkpIHsKCQkJCW1vY2tba2V5XSA9IGluaXRpYWxWYWx1ZXMuZ2V0KGtleSk7CgkJCX0gZWxzZSB7CgkJCQlkZWxldGUgbW9ja1trZXldOwoJCQl9CgkJfQoJfTsKCglyZXR1cm4gbW9jazsKfQoKZnVuY3Rpb24gY3JlYXRlT2JqZWN0V2l0aFByb3BzKHByb3BzKSB7Cgljb25zdCBvYmplY3QgPSB7fTsKCglmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXMocHJvcHMpKSB7CgkJY29uc3QgcHJvcCA9IHByb3BzW2tleV07CgoJCWlmICh0eXBlb2YgcHJvcD8uYnVpbGQgPT0gJ2Z1bmN0aW9uJykgewoJCQlwcm9wLmJ1aWxkKG9iamVjdCwga2V5KTsKCQl9IGVsc2UgewoJCQlvYmplY3Rba2V5XSA9IHByb3A7CgkJfQoJfQoKCXJldHVybiBvYmplY3Q7Cn0KCmZ1bmN0aW9uIGNsYXNzQnVpbGRlcihtZW1iZXJzKSB7Cgljb25zdCBvcHRpb25zID0geyBtZW1iZXJzIH07CgoJcmV0dXJuIHsKCQlidWlsZDogZnVuY3Rpb24ocGFyZW50LCBrZXkpIHsKCQkJY29uc3Qgc3RhdGUgPSB7fTsKCQkJY29uc3QgTW9jayA9IGNyZWF0ZUNsYXNzKHN0YXRlLCBvcHRpb25zKTsKCgkJCWlmIChwYXJlbnQpCgkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkocGFyZW50LCBrZXksIHsgdmFsdWU6IE1vY2sgfSk7CgoJCQlyZXR1cm4gd2lyZUNsYXNzKHBhcmVudCA/IHBhcmVudFtrZXldIDogTW9jaywgc3RhdGUsIG9wdGlvbnMpOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIGNyZWF0ZUNsYXNzKHN0YXRlLCBvcHRpb25zKSB7Cgljb25zdCBNb2NrID0gZnVuY3Rpb24oKSB7CgkJY29uc3QgaW5kZXggPSBzdGF0ZS5udW1JbnN0YW5jZXM7CgoJCWlmICghc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XSkKCQkJc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XSA9IGNyZWF0ZU9iamVjdFdpdGhQcm9wcyhvcHRpb25zLm1lbWJlcnMpOwoKCQlPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ19tb2NrSW5kZXgnLCB7IHZhbHVlOiBpbmRleCB9KTsKCgkJaWYgKHR5cGVvZiBzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdLmNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nKQoJCQlzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKTsKCgkJc3RhdGUubnVtSW5zdGFuY2VzKys7Cgl9OwoKCWZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyhvcHRpb25zLm1lbWJlcnMpKSB7CgkJaWYgKGtleSA9PT0gJ2NvbnN0cnVjdG9yJykKCQkJY29udGludWU7CgoJCWNvbnN0IG1lbWJlciA9IG9wdGlvbnMubWVtYmVyc1trZXldOwoKCQlpZiAodHlwZW9mIG1lbWJlcj8uYnVpbGQgPT09ICdmdW5jdGlvbicgJiYgIW1lbWJlci5pc1Byb3BlcnR5KSB7CgkJCU1vY2sucHJvdG90eXBlW2tleV0gPSBmdW5jdGlvbiguLi5hcmdzKSB7CgkJCQlyZXR1cm4gc3RhdGUuZGVzY3JpcHRpb25zW3RoaXMuX21vY2tJbmRleF1ba2V5XS5hcHBseSh0aGlzLCBhcmdzKTsKCQkJfTsKCQl9IGVsc2UgewoJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoTW9jay5wcm90b3R5cGUsIGtleSwgewoJCQkJZ2V0OiBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gc3RhdGUuZGVzY3JpcHRpb25zW3RoaXMuX21vY2tJbmRleF1ba2V5XTsKCQkJCX0sCgkJCQlzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CgkJCQkJc3RhdGUuZGVzY3JpcHRpb25zW3RoaXMuX21vY2tJbmRleF1ba2V5XSA9IHZhbHVlOwoJCQkJfSwKCQkJCWVudW1lcmFibGU6IHRydWUsCgkJCQljb25maWd1cmFibGU6IHRydWUKCQkJfSk7CgkJfQoJfQoKCXJldHVybiBNb2NrOwp9CgpmdW5jdGlvbiB3aXJlQ2xhc3MoTW9jaywgc3RhdGUsIG9wdGlvbnMpIHsKCU1vY2suaW5zdCA9IChpbmRleCA9IDApID0+IHsKCQlpZiAoIXN0YXRlLmRlc2NyaXB0aW9uc1tpbmRleF0pCgkJCXN0YXRlLmRlc2NyaXB0aW9uc1tpbmRleF0gPSBjcmVhdGVPYmplY3RXaXRoUHJvcHMob3B0aW9ucy5tZW1iZXJzKTsKCgkJcmV0dXJuIHN0YXRlLmRlc2NyaXB0aW9uc1tpbmRleF07Cgl9OwoJTW9jay5udW1JbnN0cyA9ICgpID0+IHsKCQlyZXR1cm4gc3RhdGUubnVtSW5zdGFuY2VzOwoJfTsKCU1vY2sucmVzZXQgPSAoKSA9PiB7CgkJc3RhdGUuZGVzY3JpcHRpb25zID0gW107CgkJc3RhdGUubnVtSW5zdGFuY2VzID0gMDsKCQlzdGF0ZS5kYXRhID0ge307Cgl9OwoJTW9jay5yZXNldCgpOwoKCXJldHVybiBNb2NrOwp9CgpmdW5jdGlvbiBwcm9wZXJ0eUJ1aWxkZXIoKSB7CglyZXR1cm4gdW5kZWZpbmVkOwp9CgpmdW5jdGlvbiBkZWVwQ2xvbmUodGFyZ2V0KSB7CglpZiAodHlwZW9mIHRhcmdldCA9PT0gJ29iamVjdCcpIHsKCQlpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpKSB7CgkJCXJldHVybiB0YXJnZXQubWFwKGRlZXBDbG9uZSk7CgkJfSBlbHNlIGlmICh0YXJnZXQ/LmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHsKCQkJY29uc3QgY2xvbmUgPSB7fTsKCgkJCWZvciAoY29uc3Qga2V5IGluIHRhcmdldCkgewoJCQkJY2xvbmVba2V5XSA9IGRlZXBDbG9uZSh0YXJnZXRba2V5XSk7CgkJCX0KCgkJCXJldHVybiBjbG9uZTsKCQl9Cgl9CgoJcmV0dXJuIHRhcmdldDsKfQoKZnVuY3Rpb24gY3JlYXRlU3B5KG9iamVjdCwga2V5LCByZXBsYWNlbWVudCkgewoJaWYgKCFyZXBsYWNlbWVudCkgewoJCXJlcGxhY2VtZW50ID0gZnVuY3Rpb25CdWlsZGVyKChjdHgpID0+IHsKCQkJaWYgKGN0eC5yZXQgIT09IHVuZGVmaW5lZCkKCQkJCXJldHVybiBjdHgucmV0OwoKCQkJcmV0dXJuIGN0eC5vcmlnaW5hbC5hcHBseShjdHguc2VsZiwgY3R4LnJhd0FyZ3MpOwoJCX0pOwoJfQoKCWNvbnN0IG9yaWdpbmFsID0gb2JqZWN0W2tleV07Cgljb25zdCBzcHlGbiA9IHJlcGxhY2VtZW50Lm9yaWdpbmFsKG9yaWdpbmFsKS5idWlsZCgpOwoJc3B5Rm4ucmVzdG9yZSA9ICgpID0+IHsKCQlvYmplY3Rba2V5XSA9IG9yaWdpbmFsOwoJfTsKCW9iamVjdFtrZXldID0gc3B5Rm47CgoJcmV0dXJuIHNweUZuOwp9Cgptb2R1bGUuZXhwb3J0cyA9IHsKCXNweTogY3JlYXRlU3B5LAoJY3JlYXRlOiBtb2NrQnVpbGRlciwKCWZ1bmN0aW9uOiBmdW5jdGlvbkJ1aWxkZXIsCglvYmplY3Q6IG9iamVjdEJ1aWxkZXIsCgljbGFzczogY2xhc3NCdWlsZGVyLAoJcHJvcGVydHk6IHByb3BlcnR5QnVpbGRlciwKfTsKAAAAAAAAAAAvGwAAAAAAAAAAAAA",
946
+ "AwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAD4UAAAAAAAATxQAAAAAAAAAAAAAAADwvw"
947
+ ],
948
+ [
949
+ 34,
950
+ 1,
951
+ "revert",
952
+ null,
953
+ "AgAAAAAAAAAAAAAAAAAAAAAAAAAvGwAAZnVuY3Rpb24gbW9ja0J1aWxkZXIoYnVpbGRlcikgewoJcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKfQoKZnVuY3Rpb24gZnVuY3Rpb25CdWlsZGVyKGJvZHkpIHsKCWNvbnN0IG9wdGlvbnMgPSB7CgkJYXN5bmM6IGZhbHNlLAoJCWJvZHk6IGJvZHksCgkJYXJnczogW10sCgkJc2VsZWN0OiBbXSwKCQlvcmlnaW5hbDogdW5kZWZpbmVkCgl9OwoKCXJldHVybiB7CgkJYXN5bmM6IGZ1bmN0aW9uKCkgewoJCQlvcHRpb25zLmFzeW5jID0gdHJ1ZTsKCQkJcmV0dXJuIHRoaXM7CgkJfSwKCQlhcmdzOiBmdW5jdGlvbiguLi5hcmdzKSB7CgkJCW9wdGlvbnMuYXJncyA9IGFyZ3M7CgkJCXJldHVybiB0aGlzOwoJCX0sCgkJYXJnU2VsZWN0OiBmdW5jdGlvbiguLi5pbmRleGVzKSB7CgkJCW9wdGlvbnMuc2VsZWN0ID0gaW5kZXhlczsKCQkJcmV0dXJuIHRoaXM7CgkJfSwKCQlvcmlnaW5hbDogZnVuY3Rpb24oZm4pIHsKCQkJb3B0aW9ucy5vcmlnaW5hbCA9IGZuOwoJCQlyZXR1cm4gdGhpczsKCQl9LAoJCWJ1aWxkOiBmdW5jdGlvbihwYXJlbnQsIGtleSkgewoJCQljb25zdCBzdGF0ZSA9IHt9OwoJCQljb25zdCBtb2NrID0gY3JlYXRlRnVuY3Rpb24oc3RhdGUsIG9wdGlvbnMpOwoKCQkJaWYgKHBhcmVudCkKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXJlbnQsIGtleSwgeyB2YWx1ZTogbW9jayB9KTsKCgkJCXJldHVybiB3aXJlRnVuY3Rpb24ocGFyZW50ID8gcGFyZW50W2tleV0gOiBtb2NrLCBzdGF0ZSk7CgkJfQoJfTsKfQoKZnVuY3Rpb24gd2lyZUZ1bmN0aW9uKG1vY2ssIHN0YXRlKSB7Cgltb2NrLnJldCA9ICh2YWx1ZSwgY2FsbCA9IDApID0+IHsKCQlzdGF0ZS5yZXRzW2NhbGxdID0gdmFsdWU7Cgl9OwoJbW9jay5vblJldCA9IChoYW5kbGVyLCBjYWxsID0gMCkgPT4gewoJCXN0YXRlLnJldEhhbmRsZXJzW2NhbGxdID0gaGFuZGxlcjsKCX07Cgltb2NrLmNhbGxzID0gKGNhbGwpID0+IHsKCQlyZXR1cm4gY2FsbCAhPT0gdW5kZWZpbmVkID8gc3RhdGUuY2FsbHNbY2FsbF0gOiBzdGF0ZS5jYWxsczsKCX07Cgltb2NrLmRhdGEgPSAoa2V5KSA9PiB7CgkJcmV0dXJuIGtleSAhPT0gdW5kZWZpbmVkID8gc3RhdGUuZGF0YVtrZXldIDogc3RhdGUuZGF0YTsKCX07Cgltb2NrLnJlc2V0ID0gKCkgPT4gewoJCXN0YXRlLnJldHMgPSBbXTsKCQlzdGF0ZS5yZXRIYW5kbGVycyA9IFtdOwoJCXN0YXRlLmNhbGxzID0gW107CgkJc3RhdGUuZGF0YSA9IHt9OwoJfTsKCW1vY2sucmVzZXQoKTsKCglyZXR1cm4gbW9jazsKfQoKZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb24oc3RhdGUsIG9wdGlvbnMpIHsKCWlmIChvcHRpb25zLmFzeW5jKSB7CgkJcmV0dXJuIGFzeW5jIGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gZ2V0RnVuY3Rpb25Cb2R5KHRoaXMsIHN0YXRlLCBvcHRpb25zLCBBcnJheS5mcm9tKGFyZ3VtZW50cykpOwoJCX07Cgl9IGVsc2UgewoJCXJldHVybiBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIGdldEZ1bmN0aW9uQm9keSh0aGlzLCBzdGF0ZSwgb3B0aW9ucywgQXJyYXkuZnJvbShhcmd1bWVudHMpKTsKCQl9OwoJfQp9CgpmdW5jdGlvbiBnZXRGdW5jdGlvbkJvZHkocGFyZW50LCBzdGF0ZSwgb3B0aW9ucywgcmF3QXJncykgewoJY29uc3QgYXJncyA9IGRlZXBDbG9uZShnZXRGdW5jdGlvbkFyZ3MocmF3QXJncywgb3B0aW9ucykpOwoJc3RhdGUuY2FsbHMucHVzaChhcmdzKTsKCWNvbnN0IGNhbGwgPSBzdGF0ZS5jYWxscy5sZW5ndGg7CgoJbGV0IHJldDsKCglpZiAoc3RhdGUucmV0c1tjYWxsXSkgewoJCXJldCA9IHN0YXRlLnJldHNbY2FsbF07Cgl9IGVsc2UgaWYgKHN0YXRlLnJldEhhbmRsZXJzW2NhbGxdKSB7CgkJcmV0ID0gc3RhdGUucmV0SGFuZGxlcnNbY2FsbF0oYXJncyk7Cgl9IGVsc2UgaWYgKHN0YXRlLnJldHNbMF0pIHsKCQlyZXQgPSBzdGF0ZS5yZXRzWzBdOwoJfSBlbHNlIGlmIChzdGF0ZS5yZXRIYW5kbGVyc1swXSkgewoJCXJldCA9IHN0YXRlLnJldEhhbmRsZXJzWzBdKGFyZ3MpOwoJfQoKCWlmIChyZXQgaW5zdGFuY2VvZiBFcnJvcikKCQl0aHJvdyByZXQ7CgoJaWYgKG9wdGlvbnMuYm9keSkgewoJCXJldHVybiBvcHRpb25zLmJvZHkoewoJCQlzZWxmOiBwYXJlbnQsCgkJCXN0YXRlOiBzdGF0ZSwKCQkJY2FsbDogY2FsbCwKCQkJYXJnczogYXJncywKCQkJcmF3QXJnczogcmF3QXJncywKCQkJb3JpZ2luYWw6IG9wdGlvbnMub3JpZ2luYWwsCgkJCXJldDogcmV0CgkJfSk7Cgl9IGVsc2UgewoJCXJldHVybiByZXQ7Cgl9Cn0KCmZ1bmN0aW9uIGdldEZ1bmN0aW9uQXJncyhjYWxsQXJncywgb3B0aW9ucykgewoJbGV0IGFyZ3MgPSBudWxsOwoKCWlmIChvcHRpb25zLnNlbGVjdC5sZW5ndGggPT0gMSkgewoJCWFyZ3MgPSBjYWxsQXJnc1tvcHRpb25zLnNlbGVjdFswXV07Cgl9IGVsc2UgaWYgKG9wdGlvbnMuYXJncy5sZW5ndGgpIHsKCQlhcmdzID0ge307CgoJCWZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9ucy5hcmdzLmxlbmd0aDsgaSsrKSB7CgkJCWlmIChvcHRpb25zLnNlbGVjdC5sZW5ndGggJiYgIW9wdGlvbnMuc2VsZWN0LmluY2x1ZGVzKGkpKQoJCQkJY29udGludWU7CgoJCQlsZXQgYXJnTmFtZSA9ICcnOwoJCQlsZXQgZGVmYXVsdFZhbHVlID0gdW5kZWZpbmVkOwoKCQkJaWYgKHR5cGVvZiBvcHRpb25zLmFyZ3NbaV0gPT0gJ3N0cmluZycpIHsKCQkJCWFyZ05hbWUgPSBvcHRpb25zLmFyZ3NbaV07CgkJCX0gZWxzZSB7CgkJCQlbYXJnTmFtZSwgZGVmYXVsdFZhbHVlXSA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuYXJnc1tpXSlbMF07CgkJCX0KCgkJCWFyZ3NbYXJnTmFtZV0gPSBjYWxsQXJnc1tpXSAhPT0gdW5kZWZpbmVkID8gY2FsbEFyZ3NbaV0gOiBkZWZhdWx0VmFsdWU7CgkJfQoJfSBlbHNlIHsKCQkvLyBOT1RFOiBQcmV2aW91c2x5IHJldHVybmVkIG51bGwuIE5vdyByZXR1cm5zIGFycmF5IChtYXkgYnJlYWsgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpLgoJCWFyZ3MgPSBBcnJheS5mcm9tKGNhbGxBcmdzKTsKCX0KCglyZXR1cm4gYXJnczsKfQoKZnVuY3Rpb24gb2JqZWN0QnVpbGRlcihwcm9wcykgewoJY29uc3Qgb3B0aW9ucyA9IHsgcHJvcHMgfTsKCglyZXR1cm4gewoJCWJ1aWxkOiBmdW5jdGlvbihwYXJlbnQsIGtleSkgewoJCQljb25zdCBtb2NrID0gY3JlYXRlT2JqZWN0V2l0aFByb3BzKG9wdGlvbnMucHJvcHMpOwoKCQkJaWYgKHBhcmVudCkKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXJlbnQsIGtleSwgeyB2YWx1ZTogbW9jayB9KTsKCgkJCXJldHVybiB3aXJlT2JqZWN0KHBhcmVudCA/IHBhcmVudFtrZXldIDogbW9jaywgcHJvcHMpOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIHdpcmVPYmplY3QobW9jaywgaW5pdGlhbFByb3BzKSB7Cgljb25zdCBpbml0aWFsTW9ja3MgPSBuZXcgU2V0KCk7Cgljb25zdCBpbml0aWFsVmFsdWVzID0gbmV3IE1hcCgpOwoKCWZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyhpbml0aWFsUHJvcHMpKSB7CgkJY29uc3QgcHJvcCA9IGluaXRpYWxQcm9wc1trZXldOwoJCWlmICh0eXBlb2YgcHJvcD8uYnVpbGQgPT09ICdmdW5jdGlvbicpIHsKCQkJaW5pdGlhbE1vY2tzLmFkZChrZXkpOwoJCX0gZWxzZSB7CgkJCWluaXRpYWxWYWx1ZXMuc2V0KGtleSwgcHJvcCk7CgkJfQoJfQoKCW1vY2sucmVzZXQgPSAoKSA9PiB7CgkJZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKG1vY2spKSB7CgkJCWlmIChrZXkgPT09ICdyZXNldCcpIGNvbnRpbnVlOwoKCQkJaWYgKGluaXRpYWxNb2Nrcy5oYXMoa2V5KSkgewoJCQkJaWYgKHR5cGVvZiBtb2NrW2tleV0/LnJlc2V0ID09PSAnZnVuY3Rpb24nKQoJCQkJCW1vY2tba2V5XS5yZXNldCgpOwoJCQl9IGVsc2UgaWYgKGluaXRpYWxWYWx1ZXMuaGFzKGtleSkpIHsKCQkJCW1vY2tba2V5XSA9IGluaXRpYWxWYWx1ZXMuZ2V0KGtleSk7CgkJCX0gZWxzZSB7CgkJCQlkZWxldGUgbW9ja1trZXldOwoJCQl9CgkJfQoJfTsKCglyZXR1cm4gbW9jazsKfQoKZnVuY3Rpb24gY3JlYXRlT2JqZWN0V2l0aFByb3BzKHByb3BzKSB7Cgljb25zdCBvYmplY3QgPSB7fTsKCglmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXMocHJvcHMpKSB7CgkJY29uc3QgcHJvcCA9IHByb3BzW2tleV07CgoJCWlmICh0eXBlb2YgcHJvcD8uYnVpbGQgPT0gJ2Z1bmN0aW9uJykgewoJCQlwcm9wLmJ1aWxkKG9iamVjdCwga2V5KTsKCQl9IGVsc2UgewoJCQlvYmplY3Rba2V5XSA9IHByb3A7CgkJfQoJfQoKCXJldHVybiBvYmplY3Q7Cn0KCmZ1bmN0aW9uIGNsYXNzQnVpbGRlcihtZW1iZXJzKSB7Cgljb25zdCBvcHRpb25zID0geyBtZW1iZXJzIH07CgoJcmV0dXJuIHsKCQlidWlsZDogZnVuY3Rpb24ocGFyZW50LCBrZXkpIHsKCQkJY29uc3Qgc3RhdGUgPSB7fTsKCQkJY29uc3QgTW9jayA9IGNyZWF0ZUNsYXNzKHN0YXRlLCBvcHRpb25zKTsKCgkJCWlmIChwYXJlbnQpCgkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkocGFyZW50LCBrZXksIHsgdmFsdWU6IE1vY2sgfSk7CgoJCQlyZXR1cm4gd2lyZUNsYXNzKHBhcmVudCA/IHBhcmVudFtrZXldIDogTW9jaywgc3RhdGUsIG9wdGlvbnMpOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIGNyZWF0ZUNsYXNzKHN0YXRlLCBvcHRpb25zKSB7Cgljb25zdCBNb2NrID0gZnVuY3Rpb24oKSB7CgkJY29uc3QgaW5kZXggPSBzdGF0ZS5udW1JbnN0YW5jZXM7CgoJCWlmICghc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XSkKCQkJc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XSA9IGNyZWF0ZU9iamVjdFdpdGhQcm9wcyhvcHRpb25zLm1lbWJlcnMpOwoKCQlPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ19tb2NrSW5kZXgnLCB7IHZhbHVlOiBpbmRleCB9KTsKCgkJaWYgKHR5cGVvZiBzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdLmNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nKQoJCQlzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKTsKCgkJc3RhdGUubnVtSW5zdGFuY2VzKys7Cgl9OwoKCWZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyhvcHRpb25zLm1lbWJlcnMpKSB7CgkJaWYgKGtleSA9PT0gJ2NvbnN0cnVjdG9yJykKCQkJY29udGludWU7CgoJCWNvbnN0IG1lbWJlciA9IG9wdGlvbnMubWVtYmVyc1trZXldOwoKCQlpZiAodHlwZW9mIG1lbWJlcj8uYnVpbGQgPT09ICdmdW5jdGlvbicpIHsKCQkJTW9jay5wcm90b3R5cGVba2V5XSA9IGZ1bmN0aW9uKC4uLmFyZ3MpIHsKCQkJCXJldHVybiBzdGF0ZS5kZXNjcmlwdGlvbnNbdGhpcy5fbW9ja0luZGV4XVtrZXldLmFwcGx5KHRoaXMsIGFyZ3MpOwoJCQl9OwoJCX0gZWxzZSB7CgkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShNb2NrLnByb3RvdHlwZSwga2V5LCB7CgkJCQlnZXQ6IGZ1bmN0aW9uKCkgewoJCQkJCXJldHVybiBzdGF0ZS5kZXNjcmlwdGlvbnNbdGhpcy5fbW9ja0luZGV4XVtrZXldOwoJCQkJfSwKCQkJCXNldDogZnVuY3Rpb24odmFsdWUpIHsKCQkJCQlzdGF0ZS5kZXNjcmlwdGlvbnNbdGhpcy5fbW9ja0luZGV4XVtrZXldID0gdmFsdWU7CgkJCQl9LAoJCQkJZW51bWVyYWJsZTogdHJ1ZSwKCQkJCWNvbmZpZ3VyYWJsZTogdHJ1ZQoJCQl9KTsKCQl9Cgl9CgoJcmV0dXJuIE1vY2s7Cn0KCmZ1bmN0aW9uIHdpcmVDbGFzcyhNb2NrLCBzdGF0ZSwgb3B0aW9ucykgewoJTW9jay5pbnN0ID0gKGluZGV4ID0gMCkgPT4gewoJCWlmICghc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XSkKCQkJc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XSA9IGNyZWF0ZU9iamVjdFdpdGhQcm9wcyhvcHRpb25zLm1lbWJlcnMpOwoKCQlyZXR1cm4gc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XTsKCX07CglNb2NrLm51bUluc3RzID0gKCkgPT4gewoJCXJldHVybiBzdGF0ZS5udW1JbnN0YW5jZXM7Cgl9OwoJTW9jay5yZXNldCA9ICgpID0+IHsKCQlzdGF0ZS5kZXNjcmlwdGlvbnMgPSBbXTsKCQlzdGF0ZS5udW1JbnN0YW5jZXMgPSAwOwoJCXN0YXRlLmRhdGEgPSB7fTsKCX07CglNb2NrLnJlc2V0KCk7CgoJcmV0dXJuIE1vY2s7Cn0KCmZ1bmN0aW9uIHByb3BlcnR5QnVpbGRlcigpIHsKCXJldHVybiB1bmRlZmluZWQ7Cn0KCmZ1bmN0aW9uIGRlZXBDbG9uZSh0YXJnZXQpIHsKCWlmICh0eXBlb2YgdGFyZ2V0ID09PSAnb2JqZWN0JykgewoJCWlmIChBcnJheS5pc0FycmF5KHRhcmdldCkpIHsKCQkJcmV0dXJuIHRhcmdldC5tYXAoZGVlcENsb25lKTsKCQl9IGVsc2UgaWYgKHRhcmdldD8uY29uc3RydWN0b3IgPT09IE9iamVjdCkgewoJCQljb25zdCBjbG9uZSA9IHt9OwoKCQkJZm9yIChjb25zdCBrZXkgaW4gdGFyZ2V0KSB7CgkJCQljbG9uZVtrZXldID0gZGVlcENsb25lKHRhcmdldFtrZXldKTsKCQkJfQoKCQkJcmV0dXJuIGNsb25lOwoJCX0KCX0KCglyZXR1cm4gdGFyZ2V0Owp9CgpmdW5jdGlvbiBjcmVhdGVTcHkob2JqZWN0LCBrZXksIHJlcGxhY2VtZW50KSB7CglpZiAoIXJlcGxhY2VtZW50KSB7CgkJcmVwbGFjZW1lbnQgPSBmdW5jdGlvbkJ1aWxkZXIoKGN0eCkgPT4gewoJCQlpZiAoY3R4LnJldCAhPT0gdW5kZWZpbmVkKQoJCQkJcmV0dXJuIGN0eC5yZXQ7CgoJCQlyZXR1cm4gY3R4Lm9yaWdpbmFsLmFwcGx5KGN0eC5zZWxmLCBjdHgucmF3QXJncyk7CgkJfSk7Cgl9CgoJY29uc3Qgb3JpZ2luYWwgPSBvYmplY3Rba2V5XTsKCWNvbnN0IHNweUZuID0gcmVwbGFjZW1lbnQub3JpZ2luYWwob3JpZ2luYWwpLmJ1aWxkKCk7CglzcHlGbi5yZXN0b3JlID0gKCkgPT4gewoJCW9iamVjdFtrZXldID0gb3JpZ2luYWw7Cgl9OwoJb2JqZWN0W2tleV0gPSBzcHlGbjsKCglyZXR1cm4gc3B5Rm47Cn0KCm1vZHVsZS5leHBvcnRzID0gewoJc3B5OiBjcmVhdGVTcHksCgljcmVhdGU6IG1vY2tCdWlsZGVyLAoJZnVuY3Rpb246IGZ1bmN0aW9uQnVpbGRlciwKCW9iamVjdDogb2JqZWN0QnVpbGRlciwKCWNsYXNzOiBjbGFzc0J1aWxkZXIsCglwcm9wZXJ0eTogcHJvcGVydHlCdWlsZGVyLAp9OwoAAAAAAAAAAFUbAAAAAAAAAAAAAA",
954
+ "AwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAIATAAAAAAAAgBMAAAAAAAAAAAAAAADwvw"
955
+ ],
956
+ [
957
+ 48,
958
+ 1,
959
+ "revert",
960
+ null,
961
+ "AgAAAAAAAAAAAAAAAAAAAAAAAABVGwAAZnVuY3Rpb24gbW9ja0J1aWxkZXIoYnVpbGRlcikgewoJcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKfQoKZnVuY3Rpb24gZnVuY3Rpb25CdWlsZGVyKGJvZHkpIHsKCWNvbnN0IG9wdGlvbnMgPSB7CgkJYXN5bmM6IGZhbHNlLAoJCWJvZHk6IGJvZHksCgkJYXJnczogW10sCgkJc2VsZWN0OiBbXSwKCQlvcmlnaW5hbDogdW5kZWZpbmVkCgl9OwoKCXJldHVybiB7CgkJYXN5bmM6IGZ1bmN0aW9uKCkgewoJCQlvcHRpb25zLmFzeW5jID0gdHJ1ZTsKCQkJcmV0dXJuIHRoaXM7CgkJfSwKCQlhcmdzOiBmdW5jdGlvbiguLi5hcmdzKSB7CgkJCW9wdGlvbnMuYXJncyA9IGFyZ3M7CgkJCXJldHVybiB0aGlzOwoJCX0sCgkJYXJnU2VsZWN0OiBmdW5jdGlvbiguLi5pbmRleGVzKSB7CgkJCW9wdGlvbnMuc2VsZWN0ID0gaW5kZXhlczsKCQkJcmV0dXJuIHRoaXM7CgkJfSwKCQlvcmlnaW5hbDogZnVuY3Rpb24oZm4pIHsKCQkJb3B0aW9ucy5vcmlnaW5hbCA9IGZuOwoJCQlyZXR1cm4gdGhpczsKCQl9LAoJCWJ1aWxkOiBmdW5jdGlvbihwYXJlbnQsIGtleSkgewoJCQljb25zdCBzdGF0ZSA9IHt9OwoJCQljb25zdCBtb2NrID0gY3JlYXRlRnVuY3Rpb24oc3RhdGUsIG9wdGlvbnMpOwoKCQkJaWYgKHBhcmVudCkKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXJlbnQsIGtleSwgeyB2YWx1ZTogbW9jayB9KTsKCgkJCXJldHVybiB3aXJlRnVuY3Rpb24ocGFyZW50ID8gcGFyZW50W2tleV0gOiBtb2NrLCBzdGF0ZSk7CgkJfQoJfTsKfQoKZnVuY3Rpb24gd2lyZUZ1bmN0aW9uKG1vY2ssIHN0YXRlKSB7Cgltb2NrLnJldCA9ICh2YWx1ZSwgY2FsbCA9IDApID0+IHsKCQlzdGF0ZS5yZXRzW2NhbGxdID0gdmFsdWU7Cgl9OwoJbW9jay5vblJldCA9IChoYW5kbGVyLCBjYWxsID0gMCkgPT4gewoJCXN0YXRlLnJldEhhbmRsZXJzW2NhbGxdID0gaGFuZGxlcjsKCX07Cgltb2NrLmNhbGxzID0gKGNhbGwpID0+IHsKCQlyZXR1cm4gY2FsbCAhPT0gdW5kZWZpbmVkID8gc3RhdGUuY2FsbHNbY2FsbF0gOiBzdGF0ZS5jYWxsczsKCX07Cgltb2NrLmRhdGEgPSAoa2V5KSA9PiB7CgkJcmV0dXJuIGtleSAhPT0gdW5kZWZpbmVkID8gc3RhdGUuZGF0YVtrZXldIDogc3RhdGUuZGF0YTsKCX07Cgltb2NrLnJlc2V0ID0gKCkgPT4gewoJCXN0YXRlLnJldHMgPSBbXTsKCQlzdGF0ZS5yZXRIYW5kbGVycyA9IFtdOwoJCXN0YXRlLmNhbGxzID0gW107CgkJc3RhdGUuZGF0YSA9IHt9OwoJfTsKCW1vY2sucmVzZXQoKTsKCglyZXR1cm4gbW9jazsKfQoKZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb24oc3RhdGUsIG9wdGlvbnMpIHsKCWlmIChvcHRpb25zLmFzeW5jKSB7CgkJcmV0dXJuIGFzeW5jIGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gZ2V0RnVuY3Rpb25Cb2R5KHRoaXMsIHN0YXRlLCBvcHRpb25zLCBBcnJheS5mcm9tKGFyZ3VtZW50cykpOwoJCX07Cgl9IGVsc2UgewoJCXJldHVybiBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIGdldEZ1bmN0aW9uQm9keSh0aGlzLCBzdGF0ZSwgb3B0aW9ucywgQXJyYXkuZnJvbShhcmd1bWVudHMpKTsKCQl9OwoJfQp9CgpmdW5jdGlvbiBnZXRGdW5jdGlvbkJvZHkocGFyZW50LCBzdGF0ZSwgb3B0aW9ucywgcmF3QXJncykgewoJY29uc3QgYXJncyA9IGRlZXBDbG9uZShnZXRGdW5jdGlvbkFyZ3MocmF3QXJncywgb3B0aW9ucykpOwoJc3RhdGUuY2FsbHMucHVzaChhcmdzKTsKCWNvbnN0IGNhbGwgPSBzdGF0ZS5jYWxscy5sZW5ndGg7CgoJbGV0IHJldDsKCglpZiAoc3RhdGUucmV0c1tjYWxsXSkgewoJCXJldCA9IHN0YXRlLnJldHNbY2FsbF07Cgl9IGVsc2UgaWYgKHN0YXRlLnJldEhhbmRsZXJzW2NhbGxdKSB7CgkJcmV0ID0gc3RhdGUucmV0SGFuZGxlcnNbY2FsbF0oYXJncyk7Cgl9IGVsc2UgaWYgKHN0YXRlLnJldHNbMF0pIHsKCQlyZXQgPSBzdGF0ZS5yZXRzWzBdOwoJfSBlbHNlIGlmIChzdGF0ZS5yZXRIYW5kbGVyc1swXSkgewoJCXJldCA9IHN0YXRlLnJldEhhbmRsZXJzWzBdKGFyZ3MpOwoJfQoKCWlmIChyZXQgaW5zdGFuY2VvZiBFcnJvcikKCQl0aHJvdyByZXQ7CgoJaWYgKG9wdGlvbnMuYm9keSkgewoJCXJldHVybiBvcHRpb25zLmJvZHkoewoJCQlzZWxmOiBwYXJlbnQsCgkJCXN0YXRlOiBzdGF0ZSwKCQkJY2FsbDogY2FsbCwKCQkJYXJnczogYXJncywKCQkJcmF3QXJnczogcmF3QXJncywKCQkJb3JpZ2luYWw6IG9wdGlvbnMub3JpZ2luYWwsCgkJCXJldDogcmV0CgkJfSk7Cgl9IGVsc2UgewoJCXJldHVybiByZXQ7Cgl9Cn0KCmZ1bmN0aW9uIGdldEZ1bmN0aW9uQXJncyhjYWxsQXJncywgb3B0aW9ucykgewoJbGV0IGFyZ3MgPSBudWxsOwoKCWlmIChvcHRpb25zLnNlbGVjdC5sZW5ndGggPT0gMSkgewoJCWFyZ3MgPSBjYWxsQXJnc1tvcHRpb25zLnNlbGVjdFswXV07Cgl9IGVsc2UgaWYgKG9wdGlvbnMuYXJncy5sZW5ndGgpIHsKCQlhcmdzID0ge307CgoJCWZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9ucy5hcmdzLmxlbmd0aDsgaSsrKSB7CgkJCWlmIChvcHRpb25zLnNlbGVjdC5sZW5ndGggJiYgIW9wdGlvbnMuc2VsZWN0LmluY2x1ZGVzKGkpKQoJCQkJY29udGludWU7CgoJCQlsZXQgYXJnTmFtZSA9ICcnOwoJCQlsZXQgZGVmYXVsdFZhbHVlID0gdW5kZWZpbmVkOwoKCQkJaWYgKHR5cGVvZiBvcHRpb25zLmFyZ3NbaV0gPT0gJ3N0cmluZycpIHsKCQkJCWFyZ05hbWUgPSBvcHRpb25zLmFyZ3NbaV07CgkJCX0gZWxzZSB7CgkJCQlbYXJnTmFtZSwgZGVmYXVsdFZhbHVlXSA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuYXJnc1tpXSlbMF07CgkJCX0KCgkJCWFyZ3NbYXJnTmFtZV0gPSBjYWxsQXJnc1tpXSAhPT0gdW5kZWZpbmVkID8gY2FsbEFyZ3NbaV0gOiBkZWZhdWx0VmFsdWU7CgkJfQoJfSBlbHNlIHsKCQkvLyBOT1RFOiBQcmV2aW91c2x5IHJldHVybmVkIG51bGwuIE5vdyByZXR1cm5zIGFycmF5IChtYXkgYnJlYWsgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpLgoJCWFyZ3MgPSBBcnJheS5mcm9tKGNhbGxBcmdzKTsKCX0KCglyZXR1cm4gYXJnczsKfQoKZnVuY3Rpb24gb2JqZWN0QnVpbGRlcihwcm9wcykgewoJY29uc3Qgb3B0aW9ucyA9IHsgcHJvcHMgfTsKCglyZXR1cm4gewoJCWlzT2JqZWN0OiB0cnVlLAoJCWJ1aWxkOiBmdW5jdGlvbihwYXJlbnQsIGtleSkgewoJCQljb25zdCBtb2NrID0gY3JlYXRlT2JqZWN0V2l0aFByb3BzKG9wdGlvbnMucHJvcHMpOwoKCQkJaWYgKHBhcmVudCkKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXJlbnQsIGtleSwgeyB2YWx1ZTogbW9jayB9KTsKCgkJCXJldHVybiB3aXJlT2JqZWN0KHBhcmVudCA/IHBhcmVudFtrZXldIDogbW9jaywgcHJvcHMpOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIHdpcmVPYmplY3QobW9jaywgaW5pdGlhbFByb3BzKSB7Cgljb25zdCBpbml0aWFsTW9ja3MgPSBuZXcgU2V0KCk7Cgljb25zdCBpbml0aWFsVmFsdWVzID0gbmV3IE1hcCgpOwoKCWZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyhpbml0aWFsUHJvcHMpKSB7CgkJY29uc3QgcHJvcCA9IGluaXRpYWxQcm9wc1trZXldOwoJCWlmICh0eXBlb2YgcHJvcD8uYnVpbGQgPT09ICdmdW5jdGlvbicpIHsKCQkJaW5pdGlhbE1vY2tzLmFkZChrZXkpOwoJCX0gZWxzZSB7CgkJCWluaXRpYWxWYWx1ZXMuc2V0KGtleSwgcHJvcCk7CgkJfQoJfQoKCW1vY2sucmVzZXQgPSAoKSA9PiB7CgkJZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKG1vY2spKSB7CgkJCWlmIChrZXkgPT09ICdyZXNldCcpIGNvbnRpbnVlOwoKCQkJaWYgKGluaXRpYWxNb2Nrcy5oYXMoa2V5KSkgewoJCQkJaWYgKHR5cGVvZiBtb2NrW2tleV0/LnJlc2V0ID09PSAnZnVuY3Rpb24nKQoJCQkJCW1vY2tba2V5XS5yZXNldCgpOwoJCQl9IGVsc2UgaWYgKGluaXRpYWxWYWx1ZXMuaGFzKGtleSkpIHsKCQkJCW1vY2tba2V5XSA9IGluaXRpYWxWYWx1ZXMuZ2V0KGtleSk7CgkJCX0gZWxzZSB7CgkJCQlkZWxldGUgbW9ja1trZXldOwoJCQl9CgkJfQoJfTsKCglyZXR1cm4gbW9jazsKfQoKZnVuY3Rpb24gY3JlYXRlT2JqZWN0V2l0aFByb3BzKHByb3BzKSB7Cgljb25zdCBvYmplY3QgPSB7fTsKCglmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXMocHJvcHMpKSB7CgkJY29uc3QgcHJvcCA9IHByb3BzW2tleV07CgoJCWlmICh0eXBlb2YgcHJvcD8uYnVpbGQgPT0gJ2Z1bmN0aW9uJykgewoJCQlwcm9wLmJ1aWxkKG9iamVjdCwga2V5KTsKCQl9IGVsc2UgewoJCQlvYmplY3Rba2V5XSA9IHByb3A7CgkJfQoJfQoKCXJldHVybiBvYmplY3Q7Cn0KCmZ1bmN0aW9uIGNsYXNzQnVpbGRlcihtZW1iZXJzKSB7Cgljb25zdCBvcHRpb25zID0geyBtZW1iZXJzIH07CgoJcmV0dXJuIHsKCQlidWlsZDogZnVuY3Rpb24ocGFyZW50LCBrZXkpIHsKCQkJY29uc3Qgc3RhdGUgPSB7fTsKCQkJY29uc3QgTW9jayA9IGNyZWF0ZUNsYXNzKHN0YXRlLCBvcHRpb25zKTsKCgkJCWlmIChwYXJlbnQpCgkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkocGFyZW50LCBrZXksIHsgdmFsdWU6IE1vY2sgfSk7CgoJCQlyZXR1cm4gd2lyZUNsYXNzKHBhcmVudCA/IHBhcmVudFtrZXldIDogTW9jaywgc3RhdGUsIG9wdGlvbnMpOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIGNyZWF0ZUNsYXNzKHN0YXRlLCBvcHRpb25zKSB7Cgljb25zdCBNb2NrID0gZnVuY3Rpb24oKSB7CgkJY29uc3QgaW5kZXggPSBzdGF0ZS5udW1JbnN0YW5jZXM7CgoJCWlmICghc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XSkKCQkJc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XSA9IGNyZWF0ZU9iamVjdFdpdGhQcm9wcyhvcHRpb25zLm1lbWJlcnMpOwoKCQlPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ19tb2NrSW5kZXgnLCB7IHZhbHVlOiBpbmRleCB9KTsKCgkJaWYgKHR5cGVvZiBzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdLmNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nKQoJCQlzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKTsKCgkJc3RhdGUubnVtSW5zdGFuY2VzKys7Cgl9OwoKCWZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyhvcHRpb25zLm1lbWJlcnMpKSB7CgkJaWYgKGtleSA9PT0gJ2NvbnN0cnVjdG9yJykKCQkJY29udGludWU7CgoJCWNvbnN0IG1lbWJlciA9IG9wdGlvbnMubWVtYmVyc1trZXldOwoKCQlpZiAodHlwZW9mIG1lbWJlcj8uYnVpbGQgPT09ICdmdW5jdGlvbicgJiYgIW1lbWJlci5pc09iamVjdCkgewoJCQlNb2NrLnByb3RvdHlwZVtrZXldID0gZnVuY3Rpb24oLi4uYXJncykgewoJCQkJcmV0dXJuIHN0YXRlLmRlc2NyaXB0aW9uc1t0aGlzLl9tb2NrSW5kZXhdW2tleV0uYXBwbHkodGhpcywgYXJncyk7CgkJCX07CgkJfSBlbHNlIHsKCQkJT2JqZWN0LmRlZmluZVByb3BlcnR5KE1vY2sucHJvdG90eXBlLCBrZXksIHsKCQkJCWdldDogZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuIHN0YXRlLmRlc2NyaXB0aW9uc1t0aGlzLl9tb2NrSW5kZXhdW2tleV07CgkJCQl9LAoJCQkJc2V0OiBmdW5jdGlvbih2YWx1ZSkgewoJCQkJCXN0YXRlLmRlc2NyaXB0aW9uc1t0aGlzLl9tb2NrSW5kZXhdW2tleV0gPSB2YWx1ZTsKCQkJCX0sCgkJCQllbnVtZXJhYmxlOiB0cnVlLAoJCQkJY29uZmlndXJhYmxlOiB0cnVlCgkJCX0pOwoJCX0KCX0KCglyZXR1cm4gTW9jazsKfQoKZnVuY3Rpb24gd2lyZUNsYXNzKE1vY2ssIHN0YXRlLCBvcHRpb25zKSB7CglNb2NrLmluc3QgPSAoaW5kZXggPSAwKSA9PiB7CgkJaWYgKCFzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdKQoJCQlzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdID0gY3JlYXRlT2JqZWN0V2l0aFByb3BzKG9wdGlvbnMubWVtYmVycyk7CgoJCXJldHVybiBzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdOwoJfTsKCU1vY2subnVtSW5zdHMgPSAoKSA9PiB7CgkJcmV0dXJuIHN0YXRlLm51bUluc3RhbmNlczsKCX07CglNb2NrLnJlc2V0ID0gKCkgPT4gewoJCXN0YXRlLmRlc2NyaXB0aW9ucyA9IFtdOwoJCXN0YXRlLm51bUluc3RhbmNlcyA9IDA7CgkJc3RhdGUuZGF0YSA9IHt9OwoJfTsKCU1vY2sucmVzZXQoKTsKCglyZXR1cm4gTW9jazsKfQoKZnVuY3Rpb24gcHJvcGVydHlCdWlsZGVyKCkgewoJcmV0dXJuIHVuZGVmaW5lZDsKfQoKZnVuY3Rpb24gZGVlcENsb25lKHRhcmdldCkgewoJaWYgKHR5cGVvZiB0YXJnZXQgPT09ICdvYmplY3QnKSB7CgkJaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkgewoJCQlyZXR1cm4gdGFyZ2V0Lm1hcChkZWVwQ2xvbmUpOwoJCX0gZWxzZSBpZiAodGFyZ2V0Py5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7CgkJCWNvbnN0IGNsb25lID0ge307CgoJCQlmb3IgKGNvbnN0IGtleSBpbiB0YXJnZXQpIHsKCQkJCWNsb25lW2tleV0gPSBkZWVwQ2xvbmUodGFyZ2V0W2tleV0pOwoJCQl9CgoJCQlyZXR1cm4gY2xvbmU7CgkJfQoJfQoKCXJldHVybiB0YXJnZXQ7Cn0KCmZ1bmN0aW9uIGNyZWF0ZVNweShvYmplY3QsIGtleSwgcmVwbGFjZW1lbnQpIHsKCWlmICghcmVwbGFjZW1lbnQpIHsKCQlyZXBsYWNlbWVudCA9IGZ1bmN0aW9uQnVpbGRlcigoY3R4KSA9PiB7CgkJCWlmIChjdHgucmV0ICE9PSB1bmRlZmluZWQpCgkJCQlyZXR1cm4gY3R4LnJldDsKCgkJCXJldHVybiBjdHgub3JpZ2luYWwuYXBwbHkoY3R4LnNlbGYsIGN0eC5yYXdBcmdzKTsKCQl9KTsKCX0KCgljb25zdCBvcmlnaW5hbCA9IG9iamVjdFtrZXldOwoJY29uc3Qgc3B5Rm4gPSByZXBsYWNlbWVudC5vcmlnaW5hbChvcmlnaW5hbCkuYnVpbGQoKTsKCXNweUZuLnJlc3RvcmUgPSAoKSA9PiB7CgkJb2JqZWN0W2tleV0gPSBvcmlnaW5hbDsKCX07CglvYmplY3Rba2V5XSA9IHNweUZuOwoKCXJldHVybiBzcHlGbjsKfQoKbW9kdWxlLmV4cG9ydHMgPSB7CglzcHk6IGNyZWF0ZVNweSwKCWNyZWF0ZTogbW9ja0J1aWxkZXIsCglmdW5jdGlvbjogZnVuY3Rpb25CdWlsZGVyLAoJb2JqZWN0OiBvYmplY3RCdWlsZGVyLAoJY2xhc3M6IGNsYXNzQnVpbGRlciwKCXByb3BlcnR5OiBwcm9wZXJ0eUJ1aWxkZXIsCn07CgAAAAAAAAAAaRsAAAAAAAAAAAAA",
962
+ "AwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAACQUAAAAAAAAYhQAAAAAAAAAAAAAAADwvw"
963
+ ],
964
+ [
965
+ 51,
966
+ 1,
967
+ "revert",
968
+ null,
969
+ "AgAAAAAAAAAAAAAAAAAAAAAAAABpGwAAZnVuY3Rpb24gbW9ja0J1aWxkZXIoYnVpbGRlcikgewoJcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKfQoKZnVuY3Rpb24gZnVuY3Rpb25CdWlsZGVyKGJvZHkpIHsKCWNvbnN0IG9wdGlvbnMgPSB7CgkJYXN5bmM6IGZhbHNlLAoJCWJvZHk6IGJvZHksCgkJYXJnczogW10sCgkJc2VsZWN0OiBbXSwKCQlvcmlnaW5hbDogdW5kZWZpbmVkCgl9OwoKCXJldHVybiB7CgkJX19tb2NreUZ1bmN0aW9uOiB0cnVlLAoJCWFzeW5jOiBmdW5jdGlvbigpIHsKCQkJb3B0aW9ucy5hc3luYyA9IHRydWU7CgkJCXJldHVybiB0aGlzOwoJCX0sCgkJYXJnczogZnVuY3Rpb24oLi4uYXJncykgewoJCQlvcHRpb25zLmFyZ3MgPSBhcmdzOwoJCQlyZXR1cm4gdGhpczsKCQl9LAoJCWFyZ1NlbGVjdDogZnVuY3Rpb24oLi4uaW5kZXhlcykgewoJCQlvcHRpb25zLnNlbGVjdCA9IGluZGV4ZXM7CgkJCXJldHVybiB0aGlzOwoJCX0sCgkJb3JpZ2luYWw6IGZ1bmN0aW9uKGZuKSB7CgkJCW9wdGlvbnMub3JpZ2luYWwgPSBmbjsKCQkJcmV0dXJuIHRoaXM7CgkJfSwKCQlidWlsZDogZnVuY3Rpb24ocGFyZW50LCBrZXkpIHsKCQkJY29uc3Qgc3RhdGUgPSB7fTsKCQkJY29uc3QgbW9jayA9IGNyZWF0ZUZ1bmN0aW9uKHN0YXRlLCBvcHRpb25zKTsKCgkJCWlmIChwYXJlbnQpCgkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkocGFyZW50LCBrZXksIHsgdmFsdWU6IG1vY2sgfSk7CgoJCQlyZXR1cm4gd2lyZUZ1bmN0aW9uKHBhcmVudCA/IHBhcmVudFtrZXldIDogbW9jaywgc3RhdGUpOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIHdpcmVGdW5jdGlvbihtb2NrLCBzdGF0ZSkgewoJbW9jay5yZXQgPSAodmFsdWUsIGNhbGwgPSAwKSA9PiB7CgkJc3RhdGUucmV0c1tjYWxsXSA9IHZhbHVlOwoJfTsKCW1vY2sub25SZXQgPSAoaGFuZGxlciwgY2FsbCA9IDApID0+IHsKCQlzdGF0ZS5yZXRIYW5kbGVyc1tjYWxsXSA9IGhhbmRsZXI7Cgl9OwoJbW9jay5jYWxscyA9IChjYWxsKSA9PiB7CgkJcmV0dXJuIGNhbGwgIT09IHVuZGVmaW5lZCA/IHN0YXRlLmNhbGxzW2NhbGxdIDogc3RhdGUuY2FsbHM7Cgl9OwoJbW9jay5kYXRhID0gKGtleSkgPT4gewoJCXJldHVybiBrZXkgIT09IHVuZGVmaW5lZCA/IHN0YXRlLmRhdGFba2V5XSA6IHN0YXRlLmRhdGE7Cgl9OwoJbW9jay5yZXNldCA9ICgpID0+IHsKCQlzdGF0ZS5yZXRzID0gW107CgkJc3RhdGUucmV0SGFuZGxlcnMgPSBbXTsKCQlzdGF0ZS5jYWxscyA9IFtdOwoJCXN0YXRlLmRhdGEgPSB7fTsKCX07Cgltb2NrLnJlc2V0KCk7CgoJcmV0dXJuIG1vY2s7Cn0KCmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uKHN0YXRlLCBvcHRpb25zKSB7CglpZiAob3B0aW9ucy5hc3luYykgewoJCXJldHVybiBhc3luYyBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIGdldEZ1bmN0aW9uQm9keSh0aGlzLCBzdGF0ZSwgb3B0aW9ucywgQXJyYXkuZnJvbShhcmd1bWVudHMpKTsKCQl9OwoJfSBlbHNlIHsKCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCXJldHVybiBnZXRGdW5jdGlvbkJvZHkodGhpcywgc3RhdGUsIG9wdGlvbnMsIEFycmF5LmZyb20oYXJndW1lbnRzKSk7CgkJfTsKCX0KfQoKZnVuY3Rpb24gZ2V0RnVuY3Rpb25Cb2R5KHBhcmVudCwgc3RhdGUsIG9wdGlvbnMsIHJhd0FyZ3MpIHsKCWNvbnN0IGFyZ3MgPSBkZWVwQ2xvbmUoZ2V0RnVuY3Rpb25BcmdzKHJhd0FyZ3MsIG9wdGlvbnMpKTsKCXN0YXRlLmNhbGxzLnB1c2goYXJncyk7Cgljb25zdCBjYWxsID0gc3RhdGUuY2FsbHMubGVuZ3RoOwoKCWxldCByZXQ7CgoJaWYgKHN0YXRlLnJldHNbY2FsbF0pIHsKCQlyZXQgPSBzdGF0ZS5yZXRzW2NhbGxdOwoJfSBlbHNlIGlmIChzdGF0ZS5yZXRIYW5kbGVyc1tjYWxsXSkgewoJCXJldCA9IHN0YXRlLnJldEhhbmRsZXJzW2NhbGxdKGFyZ3MpOwoJfSBlbHNlIGlmIChzdGF0ZS5yZXRzWzBdKSB7CgkJcmV0ID0gc3RhdGUucmV0c1swXTsKCX0gZWxzZSBpZiAoc3RhdGUucmV0SGFuZGxlcnNbMF0pIHsKCQlyZXQgPSBzdGF0ZS5yZXRIYW5kbGVyc1swXShhcmdzKTsKCX0KCglpZiAocmV0IGluc3RhbmNlb2YgRXJyb3IpCgkJdGhyb3cgcmV0OwoKCWlmIChvcHRpb25zLmJvZHkpIHsKCQlyZXR1cm4gb3B0aW9ucy5ib2R5KHsKCQkJc2VsZjogcGFyZW50LAoJCQlzdGF0ZTogc3RhdGUsCgkJCWNhbGw6IGNhbGwsCgkJCWFyZ3M6IGFyZ3MsCgkJCXJhd0FyZ3M6IHJhd0FyZ3MsCgkJCW9yaWdpbmFsOiBvcHRpb25zLm9yaWdpbmFsLAoJCQlyZXQ6IHJldAoJCX0pOwoJfSBlbHNlIHsKCQlyZXR1cm4gcmV0OwoJfQp9CgpmdW5jdGlvbiBnZXRGdW5jdGlvbkFyZ3MoY2FsbEFyZ3MsIG9wdGlvbnMpIHsKCWxldCBhcmdzID0gbnVsbDsKCglpZiAob3B0aW9ucy5zZWxlY3QubGVuZ3RoID09IDEpIHsKCQlhcmdzID0gY2FsbEFyZ3Nbb3B0aW9ucy5zZWxlY3RbMF1dOwoJfSBlbHNlIGlmIChvcHRpb25zLmFyZ3MubGVuZ3RoKSB7CgkJYXJncyA9IHt9OwoKCQlmb3IgKGxldCBpID0gMDsgaSA8IG9wdGlvbnMuYXJncy5sZW5ndGg7IGkrKykgewoJCQlpZiAob3B0aW9ucy5zZWxlY3QubGVuZ3RoICYmICFvcHRpb25zLnNlbGVjdC5pbmNsdWRlcyhpKSkKCQkJCWNvbnRpbnVlOwoKCQkJbGV0IGFyZ05hbWUgPSAnJzsKCQkJbGV0IGRlZmF1bHRWYWx1ZSA9IHVuZGVmaW5lZDsKCgkJCWlmICh0eXBlb2Ygb3B0aW9ucy5hcmdzW2ldID09ICdzdHJpbmcnKSB7CgkJCQlhcmdOYW1lID0gb3B0aW9ucy5hcmdzW2ldOwoJCQl9IGVsc2UgewoJCQkJW2FyZ05hbWUsIGRlZmF1bHRWYWx1ZV0gPSBPYmplY3QuZW50cmllcyhvcHRpb25zLmFyZ3NbaV0pWzBdOwoJCQl9CgoJCQlhcmdzW2FyZ05hbWVdID0gY2FsbEFyZ3NbaV0gIT09IHVuZGVmaW5lZCA/IGNhbGxBcmdzW2ldIDogZGVmYXVsdFZhbHVlOwoJCX0KCX0gZWxzZSB7CgkJLy8gTk9URTogUHJldmlvdXNseSByZXR1cm5lZCBudWxsLiBOb3cgcmV0dXJucyBhcnJheSAobWF5IGJyZWFrIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KS4KCQlhcmdzID0gQXJyYXkuZnJvbShjYWxsQXJncyk7Cgl9CgoJcmV0dXJuIGFyZ3M7Cn0KCmZ1bmN0aW9uIG9iamVjdEJ1aWxkZXIocHJvcHMpIHsKCWNvbnN0IG9wdGlvbnMgPSB7IHByb3BzIH07CgoJcmV0dXJuIHsKCQlfX21vY2t5T2JqZWN0OiB0cnVlLAoJCWJ1aWxkOiBmdW5jdGlvbihwYXJlbnQsIGtleSkgewoJCQljb25zdCBtb2NrID0gY3JlYXRlT2JqZWN0V2l0aFByb3BzKG9wdGlvbnMucHJvcHMpOwoKCQkJaWYgKHBhcmVudCkKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXJlbnQsIGtleSwgeyB2YWx1ZTogbW9jayB9KTsKCgkJCXJldHVybiB3aXJlT2JqZWN0KHBhcmVudCA/IHBhcmVudFtrZXldIDogbW9jaywgcHJvcHMpOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIHdpcmVPYmplY3QobW9jaywgaW5pdGlhbFByb3BzKSB7Cgljb25zdCBpbml0aWFsTW9ja3MgPSBuZXcgU2V0KCk7Cgljb25zdCBpbml0aWFsVmFsdWVzID0gbmV3IE1hcCgpOwoKCWZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyhpbml0aWFsUHJvcHMpKSB7CgkJY29uc3QgcHJvcCA9IGluaXRpYWxQcm9wc1trZXldOwoJCWlmICh0eXBlb2YgcHJvcD8uYnVpbGQgPT09ICdmdW5jdGlvbicpIHsKCQkJaW5pdGlhbE1vY2tzLmFkZChrZXkpOwoJCX0gZWxzZSB7CgkJCWluaXRpYWxWYWx1ZXMuc2V0KGtleSwgcHJvcCk7CgkJfQoJfQoKCW1vY2sucmVzZXQgPSAoKSA9PiB7CgkJZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKG1vY2spKSB7CgkJCWlmIChrZXkgPT09ICdyZXNldCcpIGNvbnRpbnVlOwoKCQkJaWYgKGluaXRpYWxNb2Nrcy5oYXMoa2V5KSkgewoJCQkJaWYgKHR5cGVvZiBtb2NrW2tleV0/LnJlc2V0ID09PSAnZnVuY3Rpb24nKQoJCQkJCW1vY2tba2V5XS5yZXNldCgpOwoJCQl9IGVsc2UgaWYgKGluaXRpYWxWYWx1ZXMuaGFzKGtleSkpIHsKCQkJCW1vY2tba2V5XSA9IGluaXRpYWxWYWx1ZXMuZ2V0KGtleSk7CgkJCX0gZWxzZSB7CgkJCQlkZWxldGUgbW9ja1trZXldOwoJCQl9CgkJfQoJfTsKCglyZXR1cm4gbW9jazsKfQoKZnVuY3Rpb24gY3JlYXRlT2JqZWN0V2l0aFByb3BzKHByb3BzKSB7Cgljb25zdCBvYmplY3QgPSB7fTsKCglmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXMocHJvcHMpKSB7CgkJY29uc3QgcHJvcCA9IHByb3BzW2tleV07CgoJCWlmICh0eXBlb2YgcHJvcD8uYnVpbGQgPT0gJ2Z1bmN0aW9uJykgewoJCQlwcm9wLmJ1aWxkKG9iamVjdCwga2V5KTsKCQl9IGVsc2UgewoJCQlvYmplY3Rba2V5XSA9IHByb3A7CgkJfQoJfQoKCXJldHVybiBvYmplY3Q7Cn0KCmZ1bmN0aW9uIGNsYXNzQnVpbGRlcihtZW1iZXJzKSB7Cgljb25zdCBvcHRpb25zID0geyBtZW1iZXJzIH07CgoJcmV0dXJuIHsKCQlfX21vY2t5Q2xhc3M6IHRydWUsCgkJYnVpbGQ6IGZ1bmN0aW9uKHBhcmVudCwga2V5KSB7CgkJCWNvbnN0IHN0YXRlID0ge307CgkJCWNvbnN0IE1vY2sgPSBjcmVhdGVDbGFzcyhzdGF0ZSwgb3B0aW9ucyk7CgoJCQlpZiAocGFyZW50KQoJCQkJT2JqZWN0LmRlZmluZVByb3BlcnR5KHBhcmVudCwga2V5LCB7IHZhbHVlOiBNb2NrIH0pOwoKCQkJcmV0dXJuIHdpcmVDbGFzcyhwYXJlbnQgPyBwYXJlbnRba2V5XSA6IE1vY2ssIHN0YXRlLCBvcHRpb25zKTsKCQl9Cgl9Owp9CgpmdW5jdGlvbiBjcmVhdGVDbGFzcyhzdGF0ZSwgb3B0aW9ucykgewoJY29uc3QgTW9jayA9IGZ1bmN0aW9uKCkgewoJCWNvbnN0IGluZGV4ID0gc3RhdGUubnVtSW5zdGFuY2VzOwoKCQlpZiAoIXN0YXRlLmRlc2NyaXB0aW9uc1tpbmRleF0pCgkJCXN0YXRlLmRlc2NyaXB0aW9uc1tpbmRleF0gPSBjcmVhdGVPYmplY3RXaXRoUHJvcHMob3B0aW9ucy5tZW1iZXJzKTsKCgkJT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdfbW9ja0luZGV4JywgeyB2YWx1ZTogaW5kZXggfSk7CgoJCWlmICh0eXBlb2Ygc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XS5jb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJykKCQkJc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIC4uLmFyZ3VtZW50cyk7CgoJCXN0YXRlLm51bUluc3RhbmNlcysrOwoJfTsKCglmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXMob3B0aW9ucy5tZW1iZXJzKSkgewoJCWlmIChrZXkgPT09ICdjb25zdHJ1Y3RvcicpCgkJCWNvbnRpbnVlOwoKCQljb25zdCBtZW1iZXIgPSBvcHRpb25zLm1lbWJlcnNba2V5XTsKCgkJaWYgKG1lbWJlcj8uX19tb2NreUZ1bmN0aW9uKSB7CgkJCU1vY2sucHJvdG90eXBlW2tleV0gPSBmdW5jdGlvbiguLi5hcmdzKSB7CgkJCQlyZXR1cm4gc3RhdGUuZGVzY3JpcHRpb25zW3RoaXMuX21vY2tJbmRleF1ba2V5XS5hcHBseSh0aGlzLCBhcmdzKTsKCQkJfTsKCQl9IGVsc2UgewoJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoTW9jay5wcm90b3R5cGUsIGtleSwgewoJCQkJZ2V0OiBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gc3RhdGUuZGVzY3JpcHRpb25zW3RoaXMuX21vY2tJbmRleF1ba2V5XTsKCQkJCX0sCgkJCQlzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CgkJCQkJc3RhdGUuZGVzY3JpcHRpb25zW3RoaXMuX21vY2tJbmRleF1ba2V5XSA9IHZhbHVlOwoJCQkJfSwKCQkJCWVudW1lcmFibGU6IHRydWUsCgkJCQljb25maWd1cmFibGU6IHRydWUKCQkJfSk7CgkJfQoJfQoKCXJldHVybiBNb2NrOwp9CgpmdW5jdGlvbiB3aXJlQ2xhc3MoTW9jaywgc3RhdGUsIG9wdGlvbnMpIHsKCU1vY2suaW5zdCA9IChpbmRleCA9IDApID0+IHsKCQlpZiAoIXN0YXRlLmRlc2NyaXB0aW9uc1tpbmRleF0pCgkJCXN0YXRlLmRlc2NyaXB0aW9uc1tpbmRleF0gPSBjcmVhdGVPYmplY3RXaXRoUHJvcHMob3B0aW9ucy5tZW1iZXJzKTsKCgkJcmV0dXJuIHN0YXRlLmRlc2NyaXB0aW9uc1tpbmRleF07Cgl9OwoJTW9jay5udW1JbnN0cyA9ICgpID0+IHsKCQlyZXR1cm4gc3RhdGUubnVtSW5zdGFuY2VzOwoJfTsKCU1vY2sucmVzZXQgPSAoKSA9PiB7CgkJc3RhdGUuZGVzY3JpcHRpb25zID0gW107CgkJc3RhdGUubnVtSW5zdGFuY2VzID0gMDsKCQlzdGF0ZS5kYXRhID0ge307Cgl9OwoJTW9jay5yZXNldCgpOwoKCXJldHVybiBNb2NrOwp9CgpmdW5jdGlvbiBwcm9wZXJ0eUJ1aWxkZXIoKSB7CglyZXR1cm4gdW5kZWZpbmVkOwp9CgpmdW5jdGlvbiBkZWVwQ2xvbmUodGFyZ2V0KSB7CglpZiAodHlwZW9mIHRhcmdldCA9PT0gJ29iamVjdCcpIHsKCQlpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpKSB7CgkJCXJldHVybiB0YXJnZXQubWFwKGRlZXBDbG9uZSk7CgkJfSBlbHNlIGlmICh0YXJnZXQ/LmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHsKCQkJY29uc3QgY2xvbmUgPSB7fTsKCgkJCWZvciAoY29uc3Qga2V5IGluIHRhcmdldCkgewoJCQkJY2xvbmVba2V5XSA9IGRlZXBDbG9uZSh0YXJnZXRba2V5XSk7CgkJCX0KCgkJCXJldHVybiBjbG9uZTsKCQl9Cgl9CgoJcmV0dXJuIHRhcmdldDsKfQoKZnVuY3Rpb24gY3JlYXRlU3B5KG9iamVjdCwga2V5LCByZXBsYWNlbWVudCkgewoJaWYgKCFyZXBsYWNlbWVudCkgewoJCXJlcGxhY2VtZW50ID0gZnVuY3Rpb25CdWlsZGVyKChjdHgpID0+IHsKCQkJaWYgKGN0eC5yZXQgIT09IHVuZGVmaW5lZCkKCQkJCXJldHVybiBjdHgucmV0OwoKCQkJcmV0dXJuIGN0eC5vcmlnaW5hbC5hcHBseShjdHguc2VsZiwgY3R4LnJhd0FyZ3MpOwoJCX0pOwoJfQoKCWNvbnN0IG9yaWdpbmFsID0gb2JqZWN0W2tleV07Cgljb25zdCBzcHlGbiA9IHJlcGxhY2VtZW50Lm9yaWdpbmFsKG9yaWdpbmFsKS5idWlsZCgpOwoJc3B5Rm4ucmVzdG9yZSA9ICgpID0+IHsKCQlvYmplY3Rba2V5XSA9IG9yaWdpbmFsOwoJfTsKCW9iamVjdFtrZXldID0gc3B5Rm47CgoJcmV0dXJuIHNweUZuOwp9Cgptb2R1bGUuZXhwb3J0cyA9IHsKCXNweTogY3JlYXRlU3B5LAoJY3JlYXRlOiBtb2NrQnVpbGRlciwKCWZ1bmN0aW9uOiBmdW5jdGlvbkJ1aWxkZXIsCglvYmplY3Q6IG9iamVjdEJ1aWxkZXIsCgljbGFzczogY2xhc3NCdWlsZGVyLAoJcHJvcGVydHk6IHByb3BlcnR5QnVpbGRlciwKfTsKAAAAAAAAAABxGwAAAAAAAAAAAAA",
970
+ "AwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAEEVAAAAAAAAQRUAAAAAAAAAAAAAAADwvw"
971
+ ],
972
+ [
973
+ 72,
974
+ 1,
975
+ "revert",
976
+ null,
977
+ "BAAAAAAAAAAAAAAAAAAAAAAAAABxGwAAZnVuY3Rpb24gbW9ja0J1aWxkZXIoYnVpbGRlcikgewoJcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKfQoKZnVuY3Rpb24gZnVuY3Rpb25CdWlsZGVyKGJvZHkpIHsKCWNvbnN0IG9wdGlvbnMgPSB7CgkJYXN5bmM6IGZhbHNlLAoJCWJvZHk6IGJvZHksCgkJYXJnczogW10sCgkJc2VsZWN0OiBbXSwKCQlvcmlnaW5hbDogdW5kZWZpbmVkCgl9OwoKCXJldHVybiB7CgkJX19tb2NreUZ1bmN0aW9uOiB0cnVlLAoJCWFzeW5jOiBmdW5jdGlvbigpIHsKCQkJb3B0aW9ucy5hc3luYyA9IHRydWU7CgkJCXJldHVybiB0aGlzOwoJCX0sCgkJYXJnczogZnVuY3Rpb24oLi4uYXJncykgewoJCQlvcHRpb25zLmFyZ3MgPSBhcmdzOwoJCQlyZXR1cm4gdGhpczsKCQl9LAoJCWFyZ1NlbGVjdDogZnVuY3Rpb24oLi4uaW5kZXhlcykgewoJCQlvcHRpb25zLnNlbGVjdCA9IGluZGV4ZXM7CgkJCXJldHVybiB0aGlzOwoJCX0sCgkJb3JpZ2luYWw6IGZ1bmN0aW9uKGZuKSB7CgkJCW9wdGlvbnMub3JpZ2luYWwgPSBmbjsKCQkJcmV0dXJuIHRoaXM7CgkJfSwKCQlidWlsZDogZnVuY3Rpb24ocGFyZW50LCBrZXkpIHsKCQkJY29uc3Qgc3RhdGUgPSB7fTsKCQkJY29uc3QgbW9jayA9IGNyZWF0ZUZ1bmN0aW9uKHN0YXRlLCBvcHRpb25zKTsKCgkJCWlmIChwYXJlbnQpCgkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkocGFyZW50LCBrZXksIHsgdmFsdWU6IG1vY2sgfSk7CgoJCQlyZXR1cm4gd2lyZUZ1bmN0aW9uKHBhcmVudCA/IHBhcmVudFtrZXldIDogbW9jaywgc3RhdGUpOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIHdpcmVGdW5jdGlvbihtb2NrLCBzdGF0ZSkgewoJbW9jay5yZXQgPSAodmFsdWUsIGNhbGwgPSAwKSA9PiB7CgkJc3RhdGUucmV0c1tjYWxsXSA9IHZhbHVlOwoJfTsKCW1vY2sub25SZXQgPSAoaGFuZGxlciwgY2FsbCA9IDApID0+IHsKCQlzdGF0ZS5yZXRIYW5kbGVyc1tjYWxsXSA9IGhhbmRsZXI7Cgl9OwoJbW9jay5jYWxscyA9IChjYWxsKSA9PiB7CgkJcmV0dXJuIGNhbGwgIT09IHVuZGVmaW5lZCA/IHN0YXRlLmNhbGxzW2NhbGxdIDogc3RhdGUuY2FsbHM7Cgl9OwoJbW9jay5kYXRhID0gKGtleSkgPT4gewoJCXJldHVybiBrZXkgIT09IHVuZGVmaW5lZCA/IHN0YXRlLmRhdGFba2V5XSA6IHN0YXRlLmRhdGE7Cgl9OwoJbW9jay5yZXNldCA9ICgpID0+IHsKCQlzdGF0ZS5yZXRzID0gW107CgkJc3RhdGUucmV0SGFuZGxlcnMgPSBbXTsKCQlzdGF0ZS5jYWxscyA9IFtdOwoJCXN0YXRlLmRhdGEgPSB7fTsKCX07Cgltb2NrLnJlc2V0KCk7CgoJcmV0dXJuIG1vY2s7Cn0KCmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uKHN0YXRlLCBvcHRpb25zKSB7CglpZiAob3B0aW9ucy5hc3luYykgewoJCXJldHVybiBhc3luYyBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIGdldEZ1bmN0aW9uQm9keSh0aGlzLCBzdGF0ZSwgb3B0aW9ucywgQXJyYXkuZnJvbShhcmd1bWVudHMpKTsKCQl9OwoJfSBlbHNlIHsKCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCXJldHVybiBnZXRGdW5jdGlvbkJvZHkodGhpcywgc3RhdGUsIG9wdGlvbnMsIEFycmF5LmZyb20oYXJndW1lbnRzKSk7CgkJfTsKCX0KfQoKZnVuY3Rpb24gZ2V0RnVuY3Rpb25Cb2R5KHBhcmVudCwgc3RhdGUsIG9wdGlvbnMsIHJhd0FyZ3MpIHsKCWNvbnN0IGFyZ3MgPSBkZWVwQ2xvbmUoZ2V0RnVuY3Rpb25BcmdzKHJhd0FyZ3MsIG9wdGlvbnMpKTsKCXN0YXRlLmNhbGxzLnB1c2goYXJncyk7Cgljb25zdCBjYWxsID0gc3RhdGUuY2FsbHMubGVuZ3RoOwoKCWxldCByZXQ7CgoJaWYgKHN0YXRlLnJldHNbY2FsbF0pIHsKCQlyZXQgPSBzdGF0ZS5yZXRzW2NhbGxdOwoJfSBlbHNlIGlmIChzdGF0ZS5yZXRIYW5kbGVyc1tjYWxsXSkgewoJCXJldCA9IHN0YXRlLnJldEhhbmRsZXJzW2NhbGxdKGFyZ3MpOwoJfSBlbHNlIGlmIChzdGF0ZS5yZXRzWzBdKSB7CgkJcmV0ID0gc3RhdGUucmV0c1swXTsKCX0gZWxzZSBpZiAoc3RhdGUucmV0SGFuZGxlcnNbMF0pIHsKCQlyZXQgPSBzdGF0ZS5yZXRIYW5kbGVyc1swXShhcmdzKTsKCX0KCglpZiAocmV0IGluc3RhbmNlb2YgRXJyb3IpCgkJdGhyb3cgcmV0OwoKCWlmIChvcHRpb25zLmJvZHkpIHsKCQlyZXR1cm4gb3B0aW9ucy5ib2R5KHsKCQkJc2VsZjogcGFyZW50LAoJCQlzdGF0ZTogc3RhdGUsCgkJCWNhbGw6IGNhbGwsCgkJCWFyZ3M6IGFyZ3MsCgkJCXJhd0FyZ3M6IHJhd0FyZ3MsCgkJCW9yaWdpbmFsOiBvcHRpb25zLm9yaWdpbmFsLAoJCQlyZXQ6IHJldAoJCX0pOwoJfSBlbHNlIHsKCQlyZXR1cm4gcmV0OwoJfQp9CgpmdW5jdGlvbiBnZXRGdW5jdGlvbkFyZ3MoY2FsbEFyZ3MsIG9wdGlvbnMpIHsKCWxldCBhcmdzID0gbnVsbDsKCglpZiAob3B0aW9ucy5zZWxlY3QubGVuZ3RoID09IDEpIHsKCQlhcmdzID0gY2FsbEFyZ3Nbb3B0aW9ucy5zZWxlY3RbMF1dOwoJfSBlbHNlIGlmIChvcHRpb25zLmFyZ3MubGVuZ3RoKSB7CgkJYXJncyA9IHt9OwoKCQlmb3IgKGxldCBpID0gMDsgaSA8IG9wdGlvbnMuYXJncy5sZW5ndGg7IGkrKykgewoJCQlpZiAob3B0aW9ucy5zZWxlY3QubGVuZ3RoICYmICFvcHRpb25zLnNlbGVjdC5pbmNsdWRlcyhpKSkKCQkJCWNvbnRpbnVlOwoKCQkJbGV0IGFyZ05hbWUgPSAnJzsKCQkJbGV0IGRlZmF1bHRWYWx1ZSA9IHVuZGVmaW5lZDsKCgkJCWlmICh0eXBlb2Ygb3B0aW9ucy5hcmdzW2ldID09ICdzdHJpbmcnKSB7CgkJCQlhcmdOYW1lID0gb3B0aW9ucy5hcmdzW2ldOwoJCQl9IGVsc2UgewoJCQkJW2FyZ05hbWUsIGRlZmF1bHRWYWx1ZV0gPSBPYmplY3QuZW50cmllcyhvcHRpb25zLmFyZ3NbaV0pWzBdOwoJCQl9CgoJCQlhcmdzW2FyZ05hbWVdID0gY2FsbEFyZ3NbaV0gIT09IHVuZGVmaW5lZCA/IGNhbGxBcmdzW2ldIDogZGVmYXVsdFZhbHVlOwoJCX0KCX0gZWxzZSB7CgkJLy8gTk9URTogUHJldmlvdXNseSByZXR1cm5lZCBudWxsLiBOb3cgcmV0dXJucyBhcnJheSAobWF5IGJyZWFrIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KS4KCQlhcmdzID0gQXJyYXkuZnJvbShjYWxsQXJncyk7Cgl9CgoJcmV0dXJuIGFyZ3M7Cn0KCmZ1bmN0aW9uIG9iamVjdEJ1aWxkZXIocHJvcHMpIHsKCWNvbnN0IG9wdGlvbnMgPSB7IHByb3BzIH07CgoJcmV0dXJuIHsKCQlfX21vY2t5T2JqZWN0OiB0cnVlLAoJCWJ1aWxkOiBmdW5jdGlvbihwYXJlbnQsIGtleSkgewoJCQljb25zdCBtb2NrID0gY3JlYXRlT2JqZWN0V2l0aFByb3BzKG9wdGlvbnMucHJvcHMpOwoKCQkJaWYgKHBhcmVudCkKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXJlbnQsIGtleSwgeyB2YWx1ZTogbW9jayB9KTsKCgkJCXJldHVybiB3aXJlT2JqZWN0KHBhcmVudCA/IHBhcmVudFtrZXldIDogbW9jaywgcHJvcHMpOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIHdpcmVPYmplY3QobW9jaywgaW5pdGlhbFByb3BzKSB7Cgljb25zdCBpbml0aWFsTW9ja3MgPSBuZXcgU2V0KCk7Cgljb25zdCBpbml0aWFsVmFsdWVzID0gbmV3IE1hcCgpOwoKCWZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyhpbml0aWFsUHJvcHMpKSB7CgkJY29uc3QgcHJvcCA9IGluaXRpYWxQcm9wc1trZXldOwoJCWlmICh0eXBlb2YgcHJvcD8uYnVpbGQgPT09ICdmdW5jdGlvbicpIHsKCQkJaW5pdGlhbE1vY2tzLmFkZChrZXkpOwoJCX0gZWxzZSB7CgkJCWluaXRpYWxWYWx1ZXMuc2V0KGtleSwgcHJvcCk7CgkJfQoJfQoKCW1vY2sucmVzZXQgPSAoKSA9PiB7CgkJZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKG1vY2spKSB7CgkJCWlmIChrZXkgPT09ICdyZXNldCcpIGNvbnRpbnVlOwoKCQkJaWYgKGluaXRpYWxNb2Nrcy5oYXMoa2V5KSkgewoJCQkJaWYgKHR5cGVvZiBtb2NrW2tleV0/LnJlc2V0ID09PSAnZnVuY3Rpb24nKQoJCQkJCW1vY2tba2V5XS5yZXNldCgpOwoJCQl9IGVsc2UgaWYgKGluaXRpYWxWYWx1ZXMuaGFzKGtleSkpIHsKCQkJCW1vY2tba2V5XSA9IGluaXRpYWxWYWx1ZXMuZ2V0KGtleSk7CgkJCX0gZWxzZSB7CgkJCQlkZWxldGUgbW9ja1trZXldOwoJCQl9CgkJfQoJfTsKCglyZXR1cm4gbW9jazsKfQoKZnVuY3Rpb24gY3JlYXRlT2JqZWN0V2l0aFByb3BzKHByb3BzKSB7Cgljb25zdCBvYmplY3QgPSB7fTsKCglmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXMocHJvcHMpKSB7CgkJY29uc3QgcHJvcCA9IHByb3BzW2tleV07CgoJCWlmICh0eXBlb2YgcHJvcD8uYnVpbGQgPT0gJ2Z1bmN0aW9uJykgewoJCQlwcm9wLmJ1aWxkKG9iamVjdCwga2V5KTsKCQl9IGVsc2UgewoJCQlvYmplY3Rba2V5XSA9IHByb3A7CgkJfQoJfQoKCXJldHVybiBvYmplY3Q7Cn0KCmZ1bmN0aW9uIGNsYXNzQnVpbGRlcihtZW1iZXJzKSB7Cgljb25zdCBvcHRpb25zID0geyBtZW1iZXJzIH07CgoJcmV0dXJuIHsKCQlfX21vY2t5Q2xhc3M6IHRydWUsCgkJYnVpbGQ6IGZ1bmN0aW9uKHBhcmVudCwga2V5KSB7CgkJCWNvbnN0IHN0YXRlID0ge307CgkJCWNvbnN0IE1vY2sgPSBjcmVhdGVDbGFzcyhzdGF0ZSwgb3B0aW9ucyk7CgoJCQlpZiAocGFyZW50KQoJCQkJT2JqZWN0LmRlZmluZVByb3BlcnR5KHBhcmVudCwga2V5LCB7IHZhbHVlOiBNb2NrIH0pOwoKCQkJcmV0dXJuIHdpcmVDbGFzcyhwYXJlbnQgPyBwYXJlbnRba2V5XSA6IE1vY2ssIHN0YXRlLCBvcHRpb25zKTsKCQl9Cgl9Owp9CgpmdW5jdGlvbiBjcmVhdGVDbGFzcyhzdGF0ZSwgb3B0aW9ucykgewoJY29uc3QgTW9jayA9IGZ1bmN0aW9uKCkgewoJCWNvbnN0IGluZGV4ID0gc3RhdGUubnVtSW5zdGFuY2VzOwoKCQlpZiAoIXN0YXRlLmRlc2NyaXB0aW9uc1tpbmRleF0pCgkJCXN0YXRlLmRlc2NyaXB0aW9uc1tpbmRleF0gPSBjcmVhdGVPYmplY3RXaXRoUHJvcHMob3B0aW9ucy5tZW1iZXJzKTsKCgkJT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdfX21vY2t5SW5kZXgnLCB7IHZhbHVlOiBpbmRleCB9KTsKCgkJaWYgKHR5cGVvZiBzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdLmNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nKQoJCQlzdGF0ZS5kZXNjcmlwdGlvbnNbaW5kZXhdLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKTsKCgkJc3RhdGUubnVtSW5zdGFuY2VzKys7Cgl9OwoKCWZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyhvcHRpb25zLm1lbWJlcnMpKSB7CgkJaWYgKGtleSA9PT0gJ2NvbnN0cnVjdG9yJykKCQkJY29udGludWU7CgoJCWNvbnN0IG1lbWJlciA9IG9wdGlvbnMubWVtYmVyc1trZXldOwoKCQlpZiAobWVtYmVyPy5fX21vY2t5RnVuY3Rpb24pIHsKCQkJTW9jay5wcm90b3R5cGVba2V5XSA9IGZ1bmN0aW9uKC4uLmFyZ3MpIHsKCQkJCXJldHVybiBzdGF0ZS5kZXNjcmlwdGlvbnNbdGhpcy5fX21vY2t5SW5kZXhdW2tleV0uYXBwbHkodGhpcywgYXJncyk7CgkJCX07CgkJfSBlbHNlIHsKCQkJT2JqZWN0LmRlZmluZVByb3BlcnR5KE1vY2sucHJvdG90eXBlLCBrZXksIHsKCQkJCWdldDogZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuIHN0YXRlLmRlc2NyaXB0aW9uc1t0aGlzLl9fbW9ja3lJbmRleF1ba2V5XTsKCQkJCX0sCgkJCQlzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CgkJCQkJc3RhdGUuZGVzY3JpcHRpb25zW3RoaXMuX19tb2NreUluZGV4XVtrZXldID0gdmFsdWU7CgkJCQl9LAoJCQkJZW51bWVyYWJsZTogdHJ1ZSwKCQkJCWNvbmZpZ3VyYWJsZTogdHJ1ZQoJCQl9KTsKCQl9Cgl9CgoJcmV0dXJuIE1vY2s7Cn0KCmZ1bmN0aW9uIHdpcmVDbGFzcyhNb2NrLCBzdGF0ZSwgb3B0aW9ucykgewoJTW9jay5pbnN0ID0gKGluZGV4ID0gMCkgPT4gewoJCWlmICghc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XSkKCQkJc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XSA9IGNyZWF0ZU9iamVjdFdpdGhQcm9wcyhvcHRpb25zLm1lbWJlcnMpOwoKCQlyZXR1cm4gc3RhdGUuZGVzY3JpcHRpb25zW2luZGV4XTsKCX07CglNb2NrLm51bUluc3RzID0gKCkgPT4gewoJCXJldHVybiBzdGF0ZS5udW1JbnN0YW5jZXM7Cgl9OwoJTW9jay5yZXNldCA9ICgpID0+IHsKCQlzdGF0ZS5kZXNjcmlwdGlvbnMgPSBbXTsKCQlzdGF0ZS5udW1JbnN0YW5jZXMgPSAwOwoJCXN0YXRlLmRhdGEgPSB7fTsKCX07CglNb2NrLnJlc2V0KCk7CgoJcmV0dXJuIE1vY2s7Cn0KCmZ1bmN0aW9uIHByb3BlcnR5QnVpbGRlcigpIHsKCXJldHVybiB1bmRlZmluZWQ7Cn0KCmZ1bmN0aW9uIGRlZXBDbG9uZSh0YXJnZXQpIHsKCWlmICh0eXBlb2YgdGFyZ2V0ID09PSAnb2JqZWN0JykgewoJCWlmIChBcnJheS5pc0FycmF5KHRhcmdldCkpIHsKCQkJcmV0dXJuIHRhcmdldC5tYXAoZGVlcENsb25lKTsKCQl9IGVsc2UgaWYgKHRhcmdldD8uY29uc3RydWN0b3IgPT09IE9iamVjdCkgewoJCQljb25zdCBjbG9uZSA9IHt9OwoKCQkJZm9yIChjb25zdCBrZXkgaW4gdGFyZ2V0KSB7CgkJCQljbG9uZVtrZXldID0gZGVlcENsb25lKHRhcmdldFtrZXldKTsKCQkJfQoKCQkJcmV0dXJuIGNsb25lOwoJCX0KCX0KCglyZXR1cm4gdGFyZ2V0Owp9CgpmdW5jdGlvbiBjcmVhdGVTcHkob2JqZWN0LCBrZXksIHJlcGxhY2VtZW50KSB7CglpZiAoIXJlcGxhY2VtZW50KSB7CgkJcmVwbGFjZW1lbnQgPSBmdW5jdGlvbkJ1aWxkZXIoKGN0eCkgPT4gewoJCQlpZiAoY3R4LnJldCAhPT0gdW5kZWZpbmVkKQoJCQkJcmV0dXJuIGN0eC5yZXQ7CgoJCQlyZXR1cm4gY3R4Lm9yaWdpbmFsLmFwcGx5KGN0eC5zZWxmLCBjdHgucmF3QXJncyk7CgkJfSk7Cgl9CgoJY29uc3Qgb3JpZ2luYWwgPSBvYmplY3Rba2V5XTsKCWNvbnN0IHNweUZuID0gcmVwbGFjZW1lbnQub3JpZ2luYWwob3JpZ2luYWwpLmJ1aWxkKCk7CglzcHlGbi5yZXN0b3JlID0gKCkgPT4gewoJCW9iamVjdFtrZXldID0gb3JpZ2luYWw7Cgl9OwoJb2JqZWN0W2tleV0gPSBzcHlGbjsKCglyZXR1cm4gc3B5Rm47Cn0KCm1vZHVsZS5leHBvcnRzID0gewoJc3B5OiBjcmVhdGVTcHksCgljcmVhdGU6IG1vY2tCdWlsZGVyLAoJZnVuY3Rpb246IGZ1bmN0aW9uQnVpbGRlciwKCW9iamVjdDogb2JqZWN0QnVpbGRlciwKCWNsYXNzOiBjbGFzc0J1aWxkZXIsCglwcm9wZXJ0eTogcHJvcGVydHlCdWlsZGVyLAp9OwoAAAAAAAAAAG0bAAAAAAAAAAAAAAAAAAAAAAAAkBoAAAAAAAAAAAAAAAAAAAAAAACQGgAAAAAAAAAAAAA",
978
+ "AwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAL0VAAAAAAAAyRUAAAAAAAAAAAAAAADwvw"
979
+ ]
980
+ ]
981
+ },
982
+ {
983
+ "file": "test/lilMockyTest.js",
984
+ "settings":
985
+ {
986
+ "buffer_size": 26009,
987
+ "line_ending": "Unix"
988
+ },
989
+ "undo_stack":
990
+ [
991
+ [
992
+ 2,
993
+ 1,
994
+ "revert",
995
+ null,
996
+ "AgAAAAAAAAAAAAAAAAAAAAAAAACtZAAAY29uc3QgeyBleHBlY3QgfSA9IHJlcXVpcmUoJ2NoYWknKTsKY29uc3QgbW9ja3kgPSByZXF1aXJlKCcuLi9zcmMvbGlsLW1vY2t5LmpzJyk7CgoKZGVzY3JpYmUoJ2xpbC1tb2NreScsICgpID0+IHsKCWRlc2NyaWJlKCdmdW5jdGlvbicsICgpID0+IHsKCQlpdCgnd2lsbCBidWlsZCBkaXJlY3RseSB3aXRob3V0IG1vY2t5LmNyZWF0ZScsIGFzeW5jICgpID0+IHsKCQkJY29uc3QgbW9jayA9IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygneCcsICd5JykuYnVpbGQoKTsKCQkJbW9jay5yZXQoJ3Jlc3VsdCcpOwoKCQkJZXhwZWN0KG1vY2soMSwgMikpLnRvLmVxdWFsKCdyZXN1bHQnKTsKCQkJZXhwZWN0KG1vY2suY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoeyB4OiAxLCB5OiAyIH0pOwoJCX0pOwoJCWl0KCd3aWxsIGJlIGEgZnVuY3Rpb24gd2l0aCBhcmdzJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBtb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnZmlyc3RBcmcnLCB7IHNlY29uZEFyZzogJ3Rlc3REZWZhdWx0JyB9KSk7CgkJCW1vY2sucmV0KCd0ZXN0UmV0Jyk7CgoJCQlleHBlY3QobW9jaygndGVzdEFyZycpKS50by5lcXVhbCgndGVzdFJldCcpOwoJCQlleHBlY3QobW9jay5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7CgkJCQlmaXJzdEFyZzogJ3Rlc3RBcmcnLAoJCQkJc2Vjb25kQXJnOiAndGVzdERlZmF1bHQnCgkJCX0pOwoJCQlleHBlY3QobW9jay5jYWxscygpLmxlbmd0aCkudG8uZXF1YWwoMSk7CgkJfSk7CgkJaXQoJ3dpbGwgYmUgYSBmdW5jdGlvbiB3aXRoIGN1c3RvbSByZXR1cm4nLCBhc3luYyAoKSA9PiB7CgkJCWNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKCQkJCXJldHVybiBjb250ZXh0LnJldDsKCQkJfSkuYXJncygnZmlyc3RBcmcnKSk7CgkJCW1vY2sucmV0KCd0ZXN0UmV0Jyk7CgoJCQlleHBlY3QobW9jaygndGVzdEFyZycpKS50by5lcXVhbCgndGVzdFJldCcpOwoJCQlleHBlY3QobW9jay5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7IGZpcnN0QXJnOiAndGVzdEFyZycgfSk7CgkJCWV4cGVjdChtb2NrLmNhbGxzKCkubGVuZ3RoKS50by5lcXVhbCgxKTsKCQl9KTsKCQlpdCgnd2lsbCB1c2UgYXJnU2VsZWN0IHdpdGggc2luZ2xlIGluZGV4IHRvIHJldHVybiByYXcgYXJndW1lbnQnLCBhc3luYyAoKSA9PiB7CgkJCWNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuZnVuY3Rpb24oKS5hcmdTZWxlY3QoMSkpOwoJCQltb2NrLnJldCgndGVzdFJldCcpOwoKCQkJY29uc3QgcmVzdWx0ID0gbW9jaygnZmlyc3QnLCB7IHRlc3Q6ICdkYXRhJyB9LCAndGhpcmQnKTsKCgkJCWV4cGVjdChyZXN1bHQpLnRvLmVxdWFsKCd0ZXN0UmV0Jyk7CgkJCS8vIFdoZW4gYXJnU2VsZWN0IGhhcyBzaW5nbGUgaW5kZXgsIGNhbGxzIHJldHVybnMgdGhlIHJhdyBhcmd1bWVudAoJCQlleHBlY3QobW9jay5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7IHRlc3Q6ICdkYXRhJyB9KTsKCQl9KTsKCQlpdCgnd2lsbCB1c2UgYXJnU2VsZWN0IHdpdGggbXVsdGlwbGUgaW5kZXhlcyB0byBmaWx0ZXIgbmFtZWQgYXJncycsIGFzeW5jICgpID0+IHsKCQkJY29uc3QgbW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ2ZpcnN0JywgJ3NlY29uZCcsICd0aGlyZCcpLmFyZ1NlbGVjdCgwLCAyKSk7CgoJCQltb2NrKCd2YWx1ZTEnLCAndmFsdWUyJywgJ3ZhbHVlMycpOwoKCQkJLy8gT25seSBmaXJzdCBhbmQgdGhpcmQgYXJlIGNhcHR1cmVkCgkJCWV4cGVjdChtb2NrLmNhbGxzKDApKS50by5kZWVwLmVxdWFsKHsKCQkJCWZpcnN0OiAndmFsdWUxJywKCQkJCXRoaXJkOiAndmFsdWUzJwoJCQl9KTsKCQl9KTsKCQlpdCgnd2lsbCBkZWVwIGNsb25lIGFyZ3VtZW50cyB0byBwcmV2ZW50IG11dGF0aW9uJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBtb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnZGF0YScpKTsKCgkJCWNvbnN0IG9iaiA9IHsgbmVzdGVkOiB7IHZhbHVlOiAnb3JpZ2luYWwnIH0gfTsKCQkJbW9jayhvYmopOwoKCQkJLy8gTXV0YXRlIHRoZSBvcmlnaW5hbAoJCQlvYmoubmVzdGVkLnZhbHVlID0gJ211dGF0ZWQnOwoKCQkJLy8gU3RvcmVkIGNhbGwgc2hvdWxkIGJlIHVuY2hhbmdlZAoJCQlleHBlY3QobW9jay5jYWxscygwKS5kYXRhLm5lc3RlZC52YWx1ZSkudG8uZXF1YWwoJ29yaWdpbmFsJyk7CgkJfSk7CgkJaXQoJ3dpbGwgcmVzZXQgZnVuY3Rpb24gc3RhdGUnLCBhc3luYyAoKSA9PiB7CgkJCWNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuZnVuY3Rpb24oKS5hcmdzKCdhcmcnKSk7CgkJCW1vY2sucmV0KCdmaXJzdC1yZXQnKTsKCgkJCW1vY2soJ2NhbGwxJyk7CgkJCW1vY2soJ2NhbGwyJyk7CgoJCQlleHBlY3QobW9jay5jYWxscygpLmxlbmd0aCkudG8uZXF1YWwoMik7CgoJCQltb2NrLnJlc2V0KCk7CgoJCQlleHBlY3QobW9jay5jYWxscygpLmxlbmd0aCkudG8uZXF1YWwoMCk7CgkJCWV4cGVjdChtb2NrKCdjYWxsMycpKS50by5lcXVhbCh1bmRlZmluZWQpOyAvLyBSZXR1cm4gdmFsdWVzIGNsZWFyZWQKCQl9KTsKCQlpdCgnd2lsbCBhY2Nlc3MgYWxsIGNvbnRleHQgcHJvcGVydGllcyBpbiBjdXN0b20gYm9keScsIGFzeW5jICgpID0+IHsKCQkJY29uc3QgbW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5mdW5jdGlvbigoY29udGV4dCkgPT4gewoJCQkJcmV0dXJuIHsKCQkJCQljYWxsOiBjb250ZXh0LmNhbGwsCgkJCQkJYXJnczogY29udGV4dC5hcmdzLAoJCQkJCXJldDogY29udGV4dC5yZXQsCgkJCQkJaGFzU3RhdGU6IHR5cGVvZiBjb250ZXh0LnN0YXRlID09PSAnb2JqZWN0JywKCQkJCQloYXNEYXRhOiB0eXBlb2YgY29udGV4dC5zdGF0ZS5kYXRhID09PSAnb2JqZWN0JwoJCQkJfTsKCQkJfSkuYXJncygndGVzdEFyZycpKTsKCQkJbW9jay5yZXQoJ2N1c3RvbS1yZXQnKTsKCgkJCWNvbnN0IHJlc3VsdCA9IG1vY2soJ3Rlc3QtdmFsdWUnKTsKCgkJCWV4cGVjdChyZXN1bHQuY2FsbCkudG8uZXF1YWwoMSk7IC8vIEZpcnN0IGNhbGwKCQkJZXhwZWN0KHJlc3VsdC5hcmdzKS50by5kZWVwLmVxdWFsKHsgdGVzdEFyZzogJ3Rlc3QtdmFsdWUnIH0pOwoJCQlleHBlY3QocmVzdWx0LnJldCkudG8uZXF1YWwoJ2N1c3RvbS1yZXQnKTsKCQkJZXhwZWN0KHJlc3VsdC5oYXNTdGF0ZSkudG8uZXF1YWwodHJ1ZSk7CgkJCWV4cGVjdChyZXN1bHQuaGFzRGF0YSkudG8uZXF1YWwodHJ1ZSk7CgkJfSk7CgkJaXQoJ3dpbGwgYWNjZXNzIGN1c3RvbSBkYXRhIHZpYSBtb2NrLmRhdGEoKScsIGFzeW5jICgpID0+IHsKCQkJY29uc3QgbW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5mdW5jdGlvbigoY29udGV4dCkgPT4gewoJCQkJY29udGV4dC5zdGF0ZS5kYXRhLmFsbEl0ZW1zID0gY29udGV4dC5zdGF0ZS5kYXRhLmFsbEl0ZW1zIHx8IFtdOwoJCQkJY29udGV4dC5zdGF0ZS5kYXRhLmFsbEl0ZW1zLnB1c2goLi4uY29udGV4dC5hcmdzLml0ZW1zKTsKCQkJfSkuYXJncygnaXRlbXMnKSk7CgoJCQltb2NrKFsnYScsICdiJ10pOwoJCQltb2NrKFsnYyddKTsKCQkJbW9jayhbJ2QnLCAnZScsICdmJ10pOwoKCQkJZXhwZWN0KG1vY2suZGF0YSgnYWxsSXRlbXMnKSkudG8uZGVlcC5lcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJ10pOwoJCQlleHBlY3QobW9jay5kYXRhKCkpLnRvLmRlZXAuZXF1YWwoeyBhbGxJdGVtczogWydhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZiddIH0pOwoJCX0pOwoJCWl0KCd3aWxsIGNsZWFyIGN1c3RvbSBkYXRhIG9uIHJlc2V0JywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBtb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmZ1bmN0aW9uKChjb250ZXh0KSA9PiB7CgkJCQljb250ZXh0LnN0YXRlLmRhdGEuY291bnRlciA9IChjb250ZXh0LnN0YXRlLmRhdGEuY291bnRlciB8fCAwKSArIDE7CgkJCX0pKTsKCgkJCW1vY2soKTsKCQkJbW9jaygpOwoJCQltb2NrKCk7CgoJCQlleHBlY3QobW9jay5kYXRhKCdjb3VudGVyJykpLnRvLmVxdWFsKDMpOwoKCQkJbW9jay5yZXNldCgpOwoKCQkJZXhwZWN0KG1vY2suZGF0YSgnY291bnRlcicpKS50by5lcXVhbCh1bmRlZmluZWQpOwoJCQlleHBlY3QobW9jay5kYXRhKCkpLnRvLmRlZXAuZXF1YWwoe30pOwoJCX0pOwoJfSk7CgoJZGVzY3JpYmUoJ29iamVjdCcsICgpID0+IHsKCQlpdCgnd2lsbCBiZSBvYmplY3Qgd2l0aCBmdW5jdGlvbicsIGFzeW5jICgpID0+IHsKCQkJY29uc3QgbW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5vYmplY3QoewoJCQkJcnVuOiBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ2ZpcnN0QXJnJykKCQkJfSkpOwoKCQkJbW9jay5ydW4ucmV0KCd0ZXN0UmV0Jyk7CgkJCWV4cGVjdChtb2NrLnJ1bigndGVzdEFyZycpKS50by5lcXVhbCgndGVzdFJldCcpOwoJCQlleHBlY3QobW9jay5ydW4uY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoeyBmaXJzdEFyZzogJ3Rlc3RBcmcnIH0pOwoJCQlleHBlY3QobW9jay5ydW4uY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDEpOwoJCX0pOwoJCWl0KCd3aWxsIGJlIG9iamVjdCB3aXRoIG5lc3RlZCBvYmplY3QgYW5kIGZ1bmN0aW9uJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBtb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5Lm9iamVjdCh7CgkJCQlzdWI6IG1vY2t5Lm9iamVjdCh7CgkJCQkJcnVuOiBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ2ZpcnN0QXJnJykKCQkJCX0pCgkJCX0pKTsKCQkJbW9jay5zdWIucnVuLnJldCgndGVzdFJldCcpOwoKCQkJZXhwZWN0KG1vY2suc3ViLnJ1bigndGVzdEFyZycpKS50by5lcXVhbCgndGVzdFJldCcpOwoJCQlleHBlY3QobW9jay5zdWIucnVuLmNhbGxzKDApKS50by5kZWVwLmVxdWFsKHsgZmlyc3RBcmc6ICd0ZXN0QXJnJyB9KTsKCQkJZXhwZWN0KG1vY2suc3ViLnJ1bi5jYWxscygpLmxlbmd0aCkudG8uZXF1YWwoMSk7CgkJfSk7CgkJaXQoJ3dpbGwgcmVzZXQgYWxsIG5lc3RlZCBtb2NrcyB3aGVuIG9iamVjdCBpcyByZXNldCcsIGFzeW5jICgpID0+IHsKCQkJY29uc3QgbW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5vYmplY3QoewoJCQkJbWV0aG9kMTogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCdhcmcnKSwKCQkJCW5lc3RlZDogbW9ja3kub2JqZWN0KHsKCQkJCQltZXRob2QyOiBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ2FyZycpCgkJCQl9KQoJCQl9KSk7CgoJCQltb2NrLm1ldGhvZDEucmV0KCdyZXQxJyk7CgkJCW1vY2submVzdGVkLm1ldGhvZDIucmV0KCdyZXQyJyk7CgoJCQltb2NrLm1ldGhvZDEoJ2NhbGwxJyk7CgkJCW1vY2submVzdGVkLm1ldGhvZDIoJ2NhbGwyJyk7CgoJCQlleHBlY3QobW9jay5tZXRob2QxLmNhbGxzKCkubGVuZ3RoKS50by5lcXVhbCgxKTsKCQkJZXhwZWN0KG1vY2submVzdGVkLm1ldGhvZDIuY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDEpOwoKCQkJLy8gUmVzZXQgc2hvdWxkIHByb3BhZ2F0ZSB0byBhbGwgbmVzdGVkIG1vY2tzCgkJCW1vY2sucmVzZXQoKTsKCgkJCWV4cGVjdChtb2NrLm1ldGhvZDEuY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDApOwoJCQlleHBlY3QobW9jay5uZXN0ZWQubWV0aG9kMi5jYWxscygpLmxlbmd0aCkudG8uZXF1YWwoMCk7CgkJCWV4cGVjdChtb2NrLm1ldGhvZDEoJ3Rlc3QnKSkudG8uZXF1YWwodW5kZWZpbmVkKTsKCQkJZXhwZWN0KG1vY2submVzdGVkLm1ldGhvZDIoJ3Rlc3QnKSkudG8uZXF1YWwodW5kZWZpbmVkKTsKCQl9KTsKCQlpdCgnd2lsbCBiZSBvYmplY3Qgd2l0aCBwcm9wZXJ0eSBnZXR0ZXIgYW5kIHNldHRlcicsIGFzeW5jICgpID0+IHsKCQkJY29uc3QgbW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5vYmplY3QoewoJCQkJYWNjZXNzb3I6IG1vY2t5LnByb3BlcnR5KCkKCQkJfSkpOwoKCQkJLy8gSW5pdGlhbCB2YWx1ZSBzaG91bGQgYmUgdW5kZWZpbmVkCgkJCWV4cGVjdChtb2NrLmFjY2Vzc29yKS50by5lcXVhbCh1bmRlZmluZWQpOwoKCQkJLy8gU2V0IGEgdmFsdWUKCQkJbW9jay5hY2Nlc3NvciA9ICd0ZXN0VmFsdWUnOwoJCQlleHBlY3QobW9jay5hY2Nlc3NvcikudG8uZXF1YWwoJ3Rlc3RWYWx1ZScpOwoKCQkJLy8gQ2hhbmdlIHRoZSB2YWx1ZQoJCQltb2NrLmFjY2Vzc29yID0gJ25ld1ZhbHVlJzsKCQkJZXhwZWN0KG1vY2suYWNjZXNzb3IpLnRvLmVxdWFsKCduZXdWYWx1ZScpOwoJCX0pOwoJCWl0KCd3aWxsIHJlc2V0IGFsbCBwcm9wZXJ0eSB0eXBlcyB0byBpbml0aWFsIHZhbHVlcycsIGFzeW5jICgpID0+IHsKCQkJY29uc3QgbW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5vYmplY3QoewoJCQkJY291bnRlcjogNDIsCgkJCQluYW1lOiAnQWxpY2UnLAoJCQkJbWV0aG9kOiBtb2NreS5mdW5jdGlvbigpLAoJCQkJYWNjZXNzb3I6IG1vY2t5LnByb3BlcnR5KCkKCQkJfSkpOwoKCQkJLy8gTW9kaWZ5IGFsbCBwcm9wZXJ0aWVzCgkJCW1vY2suY291bnRlciA9IDEwMDsKCQkJbW9jay5uYW1lID0gJ0JvYic7CgkJCW1vY2subWV0aG9kLnJldCgndGVzdCcpOwoJCQltb2NrLm1ldGhvZCgpOwoJCQltb2NrLmFjY2Vzc29yID0gJ3ZhbHVlJzsKCgkJCS8vIEFkZCBkeW5hbWljIHByb3BlcnR5CgkJCW1vY2suYWRkZWQgPSAnbmV3JzsKCgkJCW1vY2sucmVzZXQoKTsKCgkJCS8vIFBsYWluIHZhbHVlcyByZXNldAoJCQlleHBlY3QobW9jay5jb3VudGVyKS50by5lcXVhbCg0Mik7CgkJCWV4cGVjdChtb2NrLm5hbWUpLnRvLmVxdWFsKCdBbGljZScpOwoKCQkJLy8gTWV0aG9kcyByZXNldAoJCQlleHBlY3QobW9jay5tZXRob2QuY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDApOwoKCQkJLy8gbW9ja3kucHJvcGVydHkoKSByZXNldHMgdG8gdW5kZWZpbmVkCgkJCWV4cGVjdChtb2NrLmFjY2Vzc29yKS50by5lcXVhbCh1bmRlZmluZWQpOwoKCQkJLy8gRHluYW1pYyBwcm9wZXJ0aWVzIGRlbGV0ZWQKCQkJZXhwZWN0KG1vY2suYWRkZWQpLnRvLmVxdWFsKHVuZGVmaW5lZCk7CgkJCWV4cGVjdCgnYWRkZWQnIGluIG1vY2spLnRvLmVxdWFsKGZhbHNlKTsKCQl9KTsKCQlpdCgnd2lsbCBzdXBwb3J0IFN5bWJvbCBwcm9wZXJ0aWVzIGFuZCByZXNldCB0aGVtIGNvcnJlY3RseScsIGFzeW5jICgpID0+IHsKCQkJY29uc3QgY3VzdG9tU3ltYm9sID0gU3ltYm9sKCdjdXN0b20nKTsKCQkJY29uc3QgYWRkZWRTeW1ib2wgPSBTeW1ib2woJ2FkZGVkJyk7CgoJCQljb25zdCBtb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5Lm9iamVjdCh7CgkJCQlbU3ltYm9sLml0ZXJhdG9yXTogbW9ja3kuZnVuY3Rpb24oKSwKCQkJCVtjdXN0b21TeW1ib2xdOiAnaW5pdGlhbFZhbHVlJwoJCQl9KSk7CgoJCQkvLyBWZXJpZnkgU3ltYm9sIHByb3BlcnRpZXMgd29yawoJCQlleHBlY3QodHlwZW9mIG1vY2tbU3ltYm9sLml0ZXJhdG9yXSkudG8uZXF1YWwoJ2Z1bmN0aW9uJyk7CgkJCWV4cGVjdChtb2NrW2N1c3RvbVN5bWJvbF0pLnRvLmVxdWFsKCdpbml0aWFsVmFsdWUnKTsKCgkJCS8vIENvbmZpZ3VyZSBhbmQgdXNlIFN5bWJvbCBmdW5jdGlvbgoJCQltb2NrW1N5bWJvbC5pdGVyYXRvcl0ucmV0KCdpdGVyYXRvclJlc3VsdCcpOwoJCQlleHBlY3QobW9ja1tTeW1ib2wuaXRlcmF0b3JdKCkpLnRvLmVxdWFsKCdpdGVyYXRvclJlc3VsdCcpOwoJCQlleHBlY3QobW9ja1tTeW1ib2wuaXRlcmF0b3JdLmNhbGxzKCkubGVuZ3RoKS50by5lcXVhbCgxKTsKCgkJCS8vIE1vZGlmeSBTeW1ib2wgdmFsdWUgYW5kIGFkZCBkeW5hbWljIFN5bWJvbAoJCQltb2NrW2N1c3RvbVN5bWJvbF0gPSAnbW9kaWZpZWRWYWx1ZSc7CgkJCW1vY2tbYWRkZWRTeW1ib2xdID0gJ2FkZGVkJzsKCgkJCS8vIFJlc2V0CgkJCW1vY2sucmVzZXQoKTsKCgkJCS8vIFN5bWJvbCBmdW5jdGlvbiBtb2NrIHdhcyByZXNldAoJCQlleHBlY3QobW9ja1tTeW1ib2wuaXRlcmF0b3JdLmNhbGxzKCkubGVuZ3RoKS50by5lcXVhbCgwKTsKCQkJZXhwZWN0KG1vY2tbU3ltYm9sLml0ZXJhdG9yXSgpKS50by5lcXVhbCh1bmRlZmluZWQpOwoKCQkJLy8gU3ltYm9sIHBsYWluIHByb3BlcnR5IHdhcyByZXN0b3JlZAoJCQlleHBlY3QobW9ja1tjdXN0b21TeW1ib2xdKS50by5lcXVhbCgnaW5pdGlhbFZhbHVlJyk7CgoJCQkvLyBEeW5hbWljIFN5bWJvbCBwcm9wZXJ0eSB3YXMgZGVsZXRlZAoJCQlleHBlY3QobW9ja1thZGRlZFN5bWJvbF0pLnRvLmVxdWFsKHVuZGVmaW5lZCk7CgkJCWV4cGVjdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG1vY2spLmluY2x1ZGVzKGFkZGVkU3ltYm9sKSkudG8uZXF1YWwoZmFsc2UpOwoJCX0pOwoJCWl0KCd3aWxsIGhhbmRsZSBudWxsIGFuZCB1bmRlZmluZWQgcHJvcGVydHkgdmFsdWVzJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBtb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5Lm9iamVjdCh7CgkJCQludWxsUHJvcDogbnVsbCwKCQkJCXVuZGVmaW5lZFByb3A6IHVuZGVmaW5lZCwKCQkJCXplcm9Qcm9wOiAwLAoJCQkJZmFsc2VQcm9wOiBmYWxzZSwKCQkJCWVtcHR5U3RyaW5nUHJvcDogJycKCQkJfSkpOwoKCQkJLy8gVmVyaWZ5IGluaXRpYWwgdmFsdWVzCgkJCWV4cGVjdChtb2NrLm51bGxQcm9wKS50by5lcXVhbChudWxsKTsKCQkJZXhwZWN0KG1vY2sudW5kZWZpbmVkUHJvcCkudG8uZXF1YWwodW5kZWZpbmVkKTsKCQkJZXhwZWN0KG1vY2suemVyb1Byb3ApLnRvLmVxdWFsKDApOwoJCQlleHBlY3QobW9jay5mYWxzZVByb3ApLnRvLmVxdWFsKGZhbHNlKTsKCQkJZXhwZWN0KG1vY2suZW1wdHlTdHJpbmdQcm9wKS50by5lcXVhbCgnJyk7CgoJCQkvLyBNb2RpZnkgdmFsdWVzCgkJCW1vY2subnVsbFByb3AgPSAnY2hhbmdlZCc7CgkJCW1vY2sudW5kZWZpbmVkUHJvcCA9ICdjaGFuZ2VkJzsKCQkJbW9jay56ZXJvUHJvcCA9IDEwMDsKCQkJbW9jay5mYWxzZVByb3AgPSB0cnVlOwoJCQltb2NrLmVtcHR5U3RyaW5nUHJvcCA9ICdjaGFuZ2VkJzsKCgkJCS8vIFJlc2V0CgkJCW1vY2sucmVzZXQoKTsKCgkJCS8vIFZlcmlmeSByZXN0b3JlZCB0byBpbml0aWFsIHZhbHVlcwoJCQlleHBlY3QobW9jay5udWxsUHJvcCkudG8uZXF1YWwobnVsbCk7CgkJCWV4cGVjdChtb2NrLnVuZGVmaW5lZFByb3ApLnRvLmVxdWFsKHVuZGVmaW5lZCk7CgkJCWV4cGVjdChtb2NrLnplcm9Qcm9wKS50by5lcXVhbCgwKTsKCQkJZXhwZWN0KG1vY2suZmFsc2VQcm9wKS50by5lcXVhbChmYWxzZSk7CgkJCWV4cGVjdChtb2NrLmVtcHR5U3RyaW5nUHJvcCkudG8uZXF1YWwoJycpOwoJCX0pOwoJfSk7CgoJZGVzY3JpYmUoJ2NsYXNzJywgKCkgPT4gewoJCWl0KCd3aWxsIGJlIGNsYXNzIHdpdGggY29uc3RydWN0b3IgYW5kIG1ldGhvZCcsIGFzeW5jICgpID0+IHsKCQkJY29uc3QgTW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5jbGFzcyh7CgkJCQljb25zdHJ1Y3RvcjogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCdpbml0QXJnJyksCgkJCQlydW46IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnZmlyc3RBcmcnKQoJCQl9KSk7CgkJCU1vY2suaW5zdCgpLnJ1bi5yZXQoJ3Rlc3RSZXQnKTsKCgkJCWNvbnN0IG1vY2tJbnN0YW5jZSA9IG5ldyBNb2NrKCd0ZXN0T3B0aW9uJyk7CgkJCWV4cGVjdChNb2NrLmluc3QoKS5jb25zdHJ1Y3Rvci5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7IGluaXRBcmc6ICd0ZXN0T3B0aW9uJyB9KTsKCQkJZXhwZWN0KE1vY2suaW5zdCgpLmNvbnN0cnVjdG9yLmNhbGxzKCkubGVuZ3RoKS50by5lcXVhbCgxKTsKCgkJCWV4cGVjdChtb2NrSW5zdGFuY2UucnVuKCd0ZXN0QXJnJykpLnRvLmVxdWFsKCd0ZXN0UmV0Jyk7CgkJCWV4cGVjdChNb2NrLmluc3QoKS5ydW4uY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoeyBmaXJzdEFyZzogJ3Rlc3RBcmcnIH0pOwoJCQlleHBlY3QoTW9jay5pbnN0KCkucnVuLmNhbGxzKCkubGVuZ3RoKS50by5lcXVhbCgxKTsKCQl9KTsKCgkJaXQoJ3dpbGwgYmUgY2xhc3Mgd2l0aCBjb25zdHJ1Y3RvciBhbmQgYnVpbGRlciBtZXRob2RzJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBNb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKCQkJCWluZGV4OiBtb2NreS5mdW5jdGlvbigoY29udGV4dCkgPT4gewoJCQkJCXJldHVybiBjb250ZXh0LnNlbGY7CgkJCQl9KS5hcmdzKCdpbmRleCcpLAoJCQkJbmFtZXNwYWNlOiBtb2NreS5mdW5jdGlvbigoY29udGV4dCkgPT4gewoJCQkJCXJldHVybiBjb250ZXh0LnNlbGY7CgkJCQl9KS5hcmdzKCduYW1lc3BhY2UnKSwKCQkJCXF1ZXJ5OiBtb2NreS5mdW5jdGlvbigoY29udGV4dCkgPT4gewoJCQkJCXJldHVybiBjb250ZXh0LnNlbGY7CgkJCQl9KS5hcmdzKCdxdWVyeScpCgkJCX0pKTsKCgkJCWNvbnN0IG1vY2tJbnN0YW5jZSA9IG5ldyBNb2NrKCk7CgkJCW1vY2tJbnN0YW5jZS5pbmRleCgndGVzdC1pbmRleCcpLm5hbWVzcGFjZSgndGVzdC1uYW1lc3BhY2UnKS5xdWVyeSh7IHRlc3Q6ICdxdWVyeScgfSk7CgkJCWV4cGVjdChNb2NrLmluc3QoKS5pbmRleC5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7IGluZGV4OiAndGVzdC1pbmRleCcgfSk7CgkJCWV4cGVjdChNb2NrLmluc3QoKS5pbmRleC5jYWxscygpLmxlbmd0aCkudG8uZXF1YWwoMSk7CgkJCWV4cGVjdChNb2NrLmluc3QoKS5uYW1lc3BhY2UuY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoeyBuYW1lc3BhY2U6ICd0ZXN0LW5hbWVzcGFjZScgfSk7CgkJCWV4cGVjdChNb2NrLmluc3QoKS5uYW1lc3BhY2UuY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDEpOwoJCQlleHBlY3QoTW9jay5pbnN0KCkucXVlcnkuY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoeyBxdWVyeTogeyB0ZXN0OiAncXVlcnknIH0gfSk7CgkJCWV4cGVjdChNb2NrLmluc3QoKS5xdWVyeS5jYWxscygpLmxlbmd0aCkudG8uZXF1YWwoMSk7CgkJfSk7CgoJCWl0KCd3aWxsIGRlbW9uc3RyYXRlIHRoYXQgc3RhdGUuZGF0YSBpcyBwZXItbWV0aG9kLCBub3Qgc2hhcmVkJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBDb3VudGVyID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKCQkJCWNvbnN0cnVjdG9yOiBtb2NreS5mdW5jdGlvbigoY29udGV4dCkgPT4gewoJCQkJCS8vIHN0YXRlLmRhdGEgaGVyZSBpcyBzZXBhcmF0ZSBmcm9tIG90aGVyIG1ldGhvZHMKCQkJCQljb250ZXh0LnN0YXRlLmRhdGEuY29uc3RydWN0b3JEYXRhID0gJ3NldCBpbiBjb25zdHJ1Y3Rvcic7CgkJCQl9KS5hcmdzKCdzdGFydFZhbHVlJyksCgkJCQlnZXRDb25zdHJ1Y3RvckRhdGE6IG1vY2t5LmZ1bmN0aW9uKChjb250ZXh0KSA9PiB7CgkJCQkJLy8gVGhpcyBzdGF0ZS5kYXRhIGlzIGRpZmZlcmVudCBmcm9tIGNvbnN0cnVjdG9yJ3Mgc3RhdGUuZGF0YQoJCQkJCXJldHVybiBjb250ZXh0LnN0YXRlLmRhdGEuY29uc3RydWN0b3JEYXRhOyAvLyBXaWxsIGJlIHVuZGVmaW5lZAoJCQkJfSkKCQkJfSkpOwoKCQkJY29uc3QgY291bnRlciA9IG5ldyBDb3VudGVyKDEwKTsKCQkJLy8gVGhpcyB3aWxsIGJlIHVuZGVmaW5lZCBiZWNhdXNlIGVhY2ggbWV0aG9kIGhhcyBpdHMgb3duIHN0YXRlLmRhdGEKCQkJZXhwZWN0KGNvdW50ZXIuZ2V0Q29uc3RydWN0b3JEYXRhKCkpLnRvLmVxdWFsKHVuZGVmaW5lZCk7CgkJfSk7CgoJCWl0KCd3aWxsIHN0b3JlIGRhdGEgb24gaW5zdGFuY2UgdmlhIGNvbnRleHQuc2VsZiBpbiBjb25zdHJ1Y3RvcicsIGFzeW5jICgpID0+IHsKCQkJY29uc3QgQ291bnRlciA9IG1vY2t5LmNyZWF0ZShtb2NreS5jbGFzcyh7CgkJCQljb25zdHJ1Y3RvcjogbW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKCQkJCQkvLyBTdG9yZSBkYXRhIGRpcmVjdGx5IG9uIHRoZSBpbnN0YW5jZQoJCQkJCWNvbnRleHQuc2VsZi5fY291bnQgPSBjb250ZXh0LmFyZ3Muc3RhcnRWYWx1ZSB8fCAwOwoJCQkJCWNvbnRleHQuc2VsZi5faW5pdGlhbGl6ZWQgPSB0cnVlOwoJCQkJfSkuYXJncygnc3RhcnRWYWx1ZScpLAoJCQkJaW5jcmVtZW50OiBtb2NreS5mdW5jdGlvbigoY29udGV4dCkgPT4gewoJCQkJCWNvbnRleHQuc2VsZi5fY291bnQrKzsKCQkJCQlyZXR1cm4gY29udGV4dC5zZWxmLl9jb3VudDsKCQkJCX0pLAoJCQkJZ2V0Q291bnQ6IG1vY2t5LmZ1bmN0aW9uKChjb250ZXh0KSA9PiB7CgkJCQkJcmV0dXJuIGNvbnRleHQuc2VsZi5fY291bnQ7CgkJCQl9KSwKCQkJCWlzSW5pdGlhbGl6ZWQ6IG1vY2t5LmZ1bmN0aW9uKChjb250ZXh0KSA9PiB7CgkJCQkJcmV0dXJuIGNvbnRleHQuc2VsZi5faW5pdGlhbGl6ZWQ7CgkJCQl9KQoJCQl9KSk7CgoJCQljb25zdCBjb3VudGVyMSA9IG5ldyBDb3VudGVyKDEwKTsKCQkJZXhwZWN0KGNvdW50ZXIxLl9pbml0aWFsaXplZCkudG8uZXF1YWwodHJ1ZSk7CgkJCWV4cGVjdChjb3VudGVyMS5pc0luaXRpYWxpemVkKCkpLnRvLmVxdWFsKHRydWUpOwoJCQlleHBlY3QoY291bnRlcjEuZ2V0Q291bnQoKSkudG8uZXF1YWwoMTApOwoJCQlleHBlY3QoY291bnRlcjEuaW5jcmVtZW50KCkpLnRvLmVxdWFsKDExKTsKCQkJZXhwZWN0KGNvdW50ZXIxLmluY3JlbWVudCgpKS50by5lcXVhbCgxMik7CgkJCWV4cGVjdChjb3VudGVyMS5nZXRDb3VudCgpKS50by5lcXVhbCgxMik7CgoJCQkvLyBTZWNvbmQgaW5zdGFuY2Ugc2hvdWxkIGhhdmUgc2VwYXJhdGUgZGF0YQoJCQljb25zdCBjb3VudGVyMiA9IG5ldyBDb3VudGVyKDUpOwoJCQlleHBlY3QoY291bnRlcjIuZ2V0Q291bnQoKSkudG8uZXF1YWwoNSk7CgkJCWV4cGVjdChjb3VudGVyMi5pbmNyZW1lbnQoKSkudG8uZXF1YWwoNik7CgoJCQkvLyBGaXJzdCBpbnN0YW5jZSBzaG91bGQgYmUgdW5hZmZlY3RlZAoJCQlleHBlY3QoY291bnRlcjEuZ2V0Q291bnQoKSkudG8uZXF1YWwoMTIpOwoJCX0pOwoKCQlpdCgnd2lsbCB0cmFjayBudW1iZXIgb2YgaW5zdGFuY2VzIGNyZWF0ZWQgd2l0aCBudW1JbnN0cycsIGFzeW5jICgpID0+IHsKCQkJY29uc3QgTW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5jbGFzcyh7CgkJCQljb25zdHJ1Y3RvcjogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCd2YWx1ZScpCgkJCX0pKTsKCgkJCWV4cGVjdChNb2NrLm51bUluc3RzKCkpLnRvLmVxdWFsKDApOwoKCQkJY29uc3QgaW5zdDEgPSBuZXcgTW9jaygnZmlyc3QnKTsKCQkJZXhwZWN0KE1vY2subnVtSW5zdHMoKSkudG8uZXF1YWwoMSk7CgoJCQljb25zdCBpbnN0MiA9IG5ldyBNb2NrKCdzZWNvbmQnKTsKCQkJZXhwZWN0KE1vY2subnVtSW5zdHMoKSkudG8uZXF1YWwoMik7CgoJCQljb25zdCBpbnN0MyA9IG5ldyBNb2NrKCd0aGlyZCcpOwoJCQlleHBlY3QoTW9jay5udW1JbnN0cygpKS50by5lcXVhbCgzKTsKCQl9KTsKCgkJaXQoJ3dpbGwgcmVzZXQgYWxsIGluc3RhbmNlcyBhbmQgY291bnRlcnMnLCBhc3luYyAoKSA9PiB7CgkJCWNvbnN0IE1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuY2xhc3MoewoJCQkJY29uc3RydWN0b3I6IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygndmFsdWUnKSwKCQkJCXJ1bjogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCdhcmcnKQoJCQl9KSk7CgoJCQlNb2NrLmluc3QoMCkucnVuLnJldCgnZmlyc3QtcmV0Jyk7CgkJCU1vY2suaW5zdCgxKS5ydW4ucmV0KCdzZWNvbmQtcmV0Jyk7CgoJCQljb25zdCBpbnN0MSA9IG5ldyBNb2NrKCdmaXJzdCcpOwoJCQljb25zdCBpbnN0MiA9IG5ldyBNb2NrKCdzZWNvbmQnKTsKCgkJCWV4cGVjdChpbnN0MS5ydW4oJ3Rlc3QnKSkudG8uZXF1YWwoJ2ZpcnN0LXJldCcpOwoJCQlleHBlY3QoaW5zdDIucnVuKCd0ZXN0JykpLnRvLmVxdWFsKCdzZWNvbmQtcmV0Jyk7CgkJCWV4cGVjdChNb2NrLm51bUluc3RzKCkpLnRvLmVxdWFsKDIpOwoJCQlleHBlY3QoTW9jay5pbnN0KDApLnJ1bi5jYWxscygpLmxlbmd0aCkudG8uZXF1YWwoMSk7CgoJCQkvLyBSZXNldCBzaG91bGQgY2xlYXIgZXZlcnl0aGluZwoJCQlNb2NrLnJlc2V0KCk7CgoJCQlleHBlY3QoTW9jay5udW1JbnN0cygpKS50by5lcXVhbCgwKTsKCgkJCS8vIEFmdGVyIHJlc2V0LCBuZXcgaW5zdGFuY2VzIHN0YXJ0IGZyb20gaW5kZXggMCBhZ2FpbgoJCQljb25zdCBpbnN0MyA9IG5ldyBNb2NrKCd0aGlyZCcpOwoJCQlleHBlY3QoTW9jay5udW1JbnN0cygpKS50by5lcXVhbCgxKTsKCQkJLy8gUmV0dXJucyBzaG91bGQgYmUgY2xlYXJlZAoJCQlleHBlY3QoaW5zdDMucnVuKCd0ZXN0JykpLnRvLmVxdWFsKHVuZGVmaW5lZCk7CgkJCS8vIENhbGxzIHNob3VsZCBiZSBjbGVhcmVkCgkJCWV4cGVjdChNb2NrLmluc3QoMCkucnVuLmNhbGxzKCkubGVuZ3RoKS50by5lcXVhbCgxKTsgLy8gSnVzdCB0aGlzIG9uZSBjYWxsCgkJfSk7CgoJCWl0KCd3aWxsIHJlc2V0IHBsYWluIHZhbHVlIHByb3BlcnRpZXMgdG8gaW5pdGlhbCB2YWx1ZXMnLCBhc3luYyAoKSA9PiB7CgkJCWNvbnN0IE1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuY2xhc3MoewoJCQkJbmFtZTogbnVsbCwKCQkJCWNvdW50OiAwCgkJCX0pKTsKCgkJCS8vIENyZWF0ZSBhbmQgbW9kaWZ5IGluc3RhbmNlcwoJCQljb25zdCBpbnN0MSA9IG5ldyBNb2NrKCk7CgkJCWluc3QxLm5hbWUgPSAnZmlyc3QnOwoJCQlpbnN0MS5jb3VudCA9IDEwOwoKCQkJY29uc3QgaW5zdDIgPSBuZXcgTW9jaygpOwoJCQlpbnN0Mi5uYW1lID0gJ3NlY29uZCc7CgkJCWluc3QyLmNvdW50ID0gMjA7CgoJCQlleHBlY3QoTW9jay5udW1JbnN0cygpKS50by5lcXVhbCgyKTsKCQkJZXhwZWN0KE1vY2suaW5zdCgwKS5uYW1lKS50by5lcXVhbCgnZmlyc3QnKTsKCQkJZXhwZWN0KE1vY2suaW5zdCgxKS5jb3VudCkudG8uZXF1YWwoMjApOwoKCQkJLy8gUmVzZXQKCQkJTW9jay5yZXNldCgpOwoKCQkJZXhwZWN0KE1vY2subnVtSW5zdHMoKSkudG8uZXF1YWwoMCk7CgoJCQkvLyBBZnRlciByZXNldCwgZGVzY3JpcHRpb25zIGFyZSBmcmVzaCB3aXRoIGluaXRpYWwgdmFsdWVzCgkJCWV4cGVjdChNb2NrLmluc3QoMCkubmFtZSkudG8uZXF1YWwobnVsbCk7CgkJCWV4cGVjdChNb2NrLmluc3QoMCkuY291bnQpLnRvLmVxdWFsKDApOwoKCQkJLy8gTmV3IGluc3RhbmNlIGdldHMgaW5pdGlhbCB2YWx1ZXMKCQkJY29uc3QgaW5zdDMgPSBuZXcgTW9jaygpOwoJCQlleHBlY3QoaW5zdDMubmFtZSkudG8uZXF1YWwobnVsbCk7CgkJCWV4cGVjdChpbnN0My5jb3VudCkudG8uZXF1YWwoMCk7CgkJfSk7CgoJCWl0KCd3aWxsIHByZS1jb25maWd1cmUgaW5zdGFuY2VzIGJlZm9yZSBpbnN0YW50aWF0aW9uJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBNb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKCQkJCXJ1bjogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCdhcmcnKQoJCQl9KSk7CgoJCQkvLyBDb25maWd1cmUgaW5zdGFuY2VzIGJlZm9yZSB0aGV5J3JlIGNyZWF0ZWQKCQkJTW9jay5pbnN0KDApLnJ1bi5yZXQoJ2ZpcnN0LXZhbHVlJyk7CgkJCU1vY2suaW5zdCgxKS5ydW4ucmV0KCdzZWNvbmQtdmFsdWUnKTsKCQkJTW9jay5pbnN0KDIpLnJ1bi5yZXQoJ3RoaXJkLXZhbHVlJyk7CgoJCQljb25zdCBpbnN0MSA9IG5ldyBNb2NrKCk7CgkJCWNvbnN0IGluc3QyID0gbmV3IE1vY2soKTsKCQkJY29uc3QgaW5zdDMgPSBuZXcgTW9jaygpOwoKCQkJZXhwZWN0KGluc3QxLnJ1bigndGVzdCcpKS50by5lcXVhbCgnZmlyc3QtdmFsdWUnKTsKCQkJZXhwZWN0KGluc3QyLnJ1bigndGVzdCcpKS50by5lcXVhbCgnc2Vjb25kLXZhbHVlJyk7CgkJCWV4cGVjdChpbnN0My5ydW4oJ3Rlc3QnKSkudG8uZXF1YWwoJ3RoaXJkLXZhbHVlJyk7CgkJfSk7CgoJCWl0KCd3aWxsIHN1cHBvcnQgYXN5bmMgbWV0aG9kcycsIGFzeW5jICgpID0+IHsKCQkJY29uc3QgTW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5jbGFzcyh7CgkJCQlmZXRjaERhdGE6IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnaWQnKS5hc3luYygpCgkJCX0pKTsKCgkJCU1vY2suaW5zdCgpLmZldGNoRGF0YS5yZXQoJ2FzeW5jLXJlc3VsdCcpOwoKCQkJY29uc3QgaW5zdCA9IG5ldyBNb2NrKCk7CgkJCWNvbnN0IHJlc3VsdCA9IGF3YWl0IGluc3QuZmV0Y2hEYXRhKCd0ZXN0LWlkJyk7CgoJCQlleHBlY3QocmVzdWx0KS50by5lcXVhbCgnYXN5bmMtcmVzdWx0Jyk7CgkJCWV4cGVjdChNb2NrLmluc3QoKS5mZXRjaERhdGEuY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoeyBpZDogJ3Rlc3QtaWQnIH0pOwoJCX0pOwoKCQlpdCgnd2lsbCB0aHJvdyBlcnJvcnMgZnJvbSBjbGFzcyBtZXRob2RzJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBNb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKCQkJCXRocm93RXJyb3I6IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnbWVzc2FnZScpCgkJCX0pKTsKCgkJCWNvbnN0IHRlc3RFcnJvciA9IG5ldyBFcnJvcignVGVzdCBlcnJvcicpOwoJCQlNb2NrLmluc3QoKS50aHJvd0Vycm9yLnJldCh0ZXN0RXJyb3IpOwoKCQkJY29uc3QgaW5zdCA9IG5ldyBNb2NrKCk7CgoJCQlleHBlY3QoKCkgPT4gaW5zdC50aHJvd0Vycm9yKCdmYWlsJykpLnRvLnRocm93KCdUZXN0IGVycm9yJyk7CgkJCWV4cGVjdChNb2NrLmluc3QoKS50aHJvd0Vycm9yLmNhbGxzKDApKS50by5kZWVwLmVxdWFsKHsgbWVzc2FnZTogJ2ZhaWwnIH0pOwoJCX0pOwoKCQlpdCgnd2lsbCBoYW5kbGUgb25SZXQgaGFuZGxlcnMgaW4gY2xhc3MgbWV0aG9kcycsIGFzeW5jICgpID0+IHsKCQkJY29uc3QgTW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5jbGFzcyh7CgkJCQljYWxjdWxhdGU6IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygneCcsICd5JykKCQkJfSkpOwoKCQkJTW9jay5pbnN0KCkuY2FsY3VsYXRlLm9uUmV0KChhcmdzKSA9PiB7CgkJCQlyZXR1cm4gYXJncy54ICsgYXJncy55OwoJCQl9KTsKCgkJCWNvbnN0IGluc3QgPSBuZXcgTW9jaygpOwoKCQkJZXhwZWN0KGluc3QuY2FsY3VsYXRlKDUsIDMpKS50by5lcXVhbCg4KTsKCQkJZXhwZWN0KGluc3QuY2FsY3VsYXRlKDEwLCAyMCkpLnRvLmVxdWFsKDMwKTsKCQl9KTsKCgkJaXQoJ3dpbGwgaGFuZGxlIGRpZmZlcmVudCByZXR1cm4gdmFsdWVzIHBlciBjYWxsJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBNb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKCQkJCWdldFZhbHVlOiBtb2NreS5mdW5jdGlvbigpCgkJCX0pKTsKCgkJCU1vY2suaW5zdCgpLmdldFZhbHVlLnJldCgnZGVmYXVsdCcpOwoJCQlNb2NrLmluc3QoKS5nZXRWYWx1ZS5yZXQoJ2ZpcnN0LWNhbGwnLCAxKTsKCQkJTW9jay5pbnN0KCkuZ2V0VmFsdWUucmV0KCdzZWNvbmQtY2FsbCcsIDIpOwoKCQkJY29uc3QgaW5zdCA9IG5ldyBNb2NrKCk7CgoJCQlleHBlY3QoaW5zdC5nZXRWYWx1ZSgpKS50by5lcXVhbCgnZmlyc3QtY2FsbCcpOwoJCQlleHBlY3QoaW5zdC5nZXRWYWx1ZSgpKS50by5lcXVhbCgnc2Vjb25kLWNhbGwnKTsKCQkJZXhwZWN0KGluc3QuZ2V0VmFsdWUoKSkudG8uZXF1YWwoJ2RlZmF1bHQnKTsgLy8gRmFsbHMgYmFjayB0byBjYWxsIDAKCQl9KTsKCgkJaXQoJ3dpbGwgYWxsb3cgYSBjbGFzcyB0byBleHRlbmQgdGhlIG1vY2sgY2xhc3MnLCAoKSA9PiB7CgkJCWNvbnN0IE1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuY2xhc3MoewoJCQkJZ2V0VmFsdWU6IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygneCcpCgkJCX0pKTsKCgkJCU1vY2suaW5zdCgpLmdldFZhbHVlLnJldCgnbW9jay12YWx1ZScpOwoKCQkJY2xhc3MgQ2hpbGQgZXh0ZW5kcyBNb2NrIHsKCQkJfQoKCQkJY29uc3QgY2hpbGQgPSBuZXcgQ2hpbGQoKTsKCQkJZXhwZWN0KGNoaWxkLmdldFZhbHVlKCd0ZXN0JykpLnRvLmVxdWFsKCdtb2NrLXZhbHVlJyk7CgkJCWV4cGVjdChNb2NrLmluc3QoKS5nZXRWYWx1ZS5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7IHg6ICd0ZXN0JyB9KTsKCQl9KTsKCgkJaXQoJ3dpbGwgYWxsb3cgY2hpbGQgY2xhc3MgdG8gb3ZlcnJpZGUgbW9jayBtZXRob2QgYW5kIGNhbGwgc3VwZXInLCAoKSA9PiB7CgkJCWNvbnN0IE1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuY2xhc3MoewoJCQkJZ2V0VmFsdWU6IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygneCcpCgkJCX0pKTsKCgkJCU1vY2suaW5zdCgpLmdldFZhbHVlLnJldCgnbW9jay12YWx1ZScpOwoKCQkJY2xhc3MgQ2hpbGQgZXh0ZW5kcyBNb2NrIHsKCQkJCWdldFZhbHVlKHgpIHsKCQkJCQljb25zdCBwYXJlbnRSZXN1bHQgPSBzdXBlci5nZXRWYWx1ZSh4KTsKCQkJCQlyZXR1cm4gYGNoaWxkLSR7cGFyZW50UmVzdWx0fWA7CgkJCQl9CgkJCX0KCgkJCWNvbnN0IGNoaWxkID0gbmV3IENoaWxkKCk7CgkJCWNvbnN0IHJlc3VsdCA9IGNoaWxkLmdldFZhbHVlKCd0ZXN0Jyk7CgoJCQkvLyBDaGlsZCdzIG1ldGhvZCBzaG91bGQgcnVuIGFuZCB3cmFwIHRoZSBwYXJlbnQncyByZXN1bHQKCQkJZXhwZWN0KHJlc3VsdCkudG8uZXF1YWwoJ2NoaWxkLW1vY2stdmFsdWUnKTsKCQkJZXhwZWN0KE1vY2suaW5zdCgpLmdldFZhbHVlLmNhbGxzKDApKS50by5kZWVwLmVxdWFsKHsgeDogJ3Rlc3QnIH0pOwoJCX0pOwoKCQlpdCgnd2lsbCBhbGxvdyBjaGlsZCBjbGFzcyB0byBjYWxsIHN1cGVyIGluIGNvbnN0cnVjdG9yJywgKCkgPT4gewoJCQljb25zdCBNb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKCQkJCWNvbnN0cnVjdG9yOiBtb2NreS5mdW5jdGlvbigoY29udGV4dCkgPT4gewoJCQkJCWNvbnRleHQuc2VsZi5tb2NrSW5pdGlhbGl6ZWQgPSB0cnVlOwoJCQkJCWNvbnRleHQuc2VsZi5tb2NrVmFsdWUgPSBjb250ZXh0LmFyZ3MudmFsdWU7CgkJCQl9KS5hcmdzKCd2YWx1ZScpLAoJCQkJZ2V0VmFsdWU6IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygneCcpCgkJCX0pKTsKCgkJCU1vY2suaW5zdCgpLmdldFZhbHVlLnJldCgnbW9jay12YWx1ZScpOwoKCQkJY2xhc3MgQ2hpbGQgZXh0ZW5kcyBNb2NrIHsKCQkJCWNvbnN0cnVjdG9yKHZhbHVlKSB7CgkJCQkJc3VwZXIodmFsdWUpOwoJCQkJCXRoaXMuY2hpbGRJbml0aWFsaXplZCA9IHRydWU7CgkJCQkJdGhpcy5jaGlsZFZhbHVlID0gdmFsdWUgKiAyOwoJCQkJfQoJCQl9CgoJCQljb25zdCBjaGlsZCA9IG5ldyBDaGlsZCgxMCk7CgoJCQkvLyBNb2NrIGNvbnN0cnVjdG9yIHNob3VsZCBoYXZlIHJ1bgoJCQlleHBlY3QoY2hpbGQubW9ja0luaXRpYWxpemVkKS50by5lcXVhbCh0cnVlKTsKCQkJZXhwZWN0KGNoaWxkLm1vY2tWYWx1ZSkudG8uZXF1YWwoMTApOwoJCQlleHBlY3QoTW9jay5pbnN0KCkuY29uc3RydWN0b3IuY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoeyB2YWx1ZTogMTAgfSk7CgoJCQkvLyBDaGlsZCBjb25zdHJ1Y3RvciBzaG91bGQgaGF2ZSBydW4gYWZ0ZXIKCQkJZXhwZWN0KGNoaWxkLmNoaWxkSW5pdGlhbGl6ZWQpLnRvLmVxdWFsKHRydWUpOwoJCQlleHBlY3QoY2hpbGQuY2hpbGRWYWx1ZSkudG8uZXF1YWwoMjApOwoKCQkJLy8gTWV0aG9kcyBzaG91bGQgc3RpbGwgd29yawoJCQlleHBlY3QoY2hpbGQuZ2V0VmFsdWUoJ3Rlc3QnKSkudG8uZXF1YWwoJ21vY2stdmFsdWUnKTsKCQl9KTsKCgkJaXQoJ3dpbGwgbm90IGV4cG9zZSBfbW9ja0luZGV4IGluIGRlZXAgZXF1YWwgY29tcGFyaXNvbnMnLCAoKSA9PiB7CgkJCWNvbnN0IE1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuY2xhc3MoewoJCQkJY29uc3RydWN0b3I6IG1vY2t5LmZ1bmN0aW9uKChjb250ZXh0KSA9PiB7CgkJCQkJY29udGV4dC5zZWxmLm5hbWUgPSBjb250ZXh0LmFyZ3MubmFtZTsKCQkJCX0pLmFyZ3MoJ25hbWUnKQoJCQl9KSk7CgoJCQljb25zdCBpbnN0YW5jZSA9IG5ldyBNb2NrKCd0ZXN0Jyk7CgoJCQlleHBlY3QoaW5zdGFuY2UpLnRvLmRlZXAuZXF1YWwoeyBuYW1lOiAndGVzdCcgfSk7CgkJfSk7CgoJCWl0KCd3aWxsIHN5bmMgcGxhaW4gdmFsdWUgbWVtYmVycyBiZXR3ZWVuIGluc3RhbmNlIGFuZCBNb2NrLmluc3QoKScsICgpID0+IHsKCQkJY29uc3QgTW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5jbGFzcyh7CgkJCQluYW1lOiBudWxsLAoJCQkJY291bnQ6IDAKCQkJfSkpOwoKCQkJY29uc3QgaW5zdCA9IG5ldyBNb2NrKCk7CgoJCQkvLyBJbml0aWFsIHZhbHVlcyBmcm9tIGRlZmluaXRpb24KCQkJZXhwZWN0KGluc3QubmFtZSkudG8uZXF1YWwobnVsbCk7CgkJCWV4cGVjdChpbnN0LmNvdW50KS50by5lcXVhbCgwKTsKCgkJCS8vIFNldHRpbmcgb24gaW5zdGFuY2Ugc3luY3MgdG8gTW9jay5pbnN0KCkKCQkJaW5zdC5uYW1lID0gJ3Rlc3QnOwoJCQlpbnN0LmNvdW50ID0gNDI7CgkJCWV4cGVjdChNb2NrLmluc3QoMCkubmFtZSkudG8uZXF1YWwoJ3Rlc3QnKTsKCQkJZXhwZWN0KE1vY2suaW5zdCgwKS5jb3VudCkudG8uZXF1YWwoNDIpOwoKCQkJLy8gU2V0dGluZyBvbiBNb2NrLmluc3QoKSBzeW5jcyB0byBpbnN0YW5jZQoJCQlNb2NrLmluc3QoMCkubmFtZSA9ICdjaGFuZ2VkJzsKCQkJZXhwZWN0KGluc3QubmFtZSkudG8uZXF1YWwoJ2NoYW5nZWQnKTsKCQl9KTsKCgkJaXQoJ3dpbGwgaXNvbGF0ZSBwbGFpbiB2YWx1ZSBtZW1iZXJzIGJldHdlZW4gY2xhc3MgaW5zdGFuY2VzJywgKCkgPT4gewoJCQljb25zdCBNb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKCQkJCXZhbHVlOiBudWxsCgkJCX0pKTsKCgkJCWNvbnN0IGluc3QxID0gbmV3IE1vY2soKTsKCQkJY29uc3QgaW5zdDIgPSBuZXcgTW9jaygpOwoKCQkJaW5zdDEudmFsdWUgPSAnZmlyc3QnOwoJCQlpbnN0Mi52YWx1ZSA9ICdzZWNvbmQnOwoKCQkJZXhwZWN0KGluc3QxLnZhbHVlKS50by5lcXVhbCgnZmlyc3QnKTsKCQkJZXhwZWN0KGluc3QyLnZhbHVlKS50by5lcXVhbCgnc2Vjb25kJyk7CgkJCWV4cGVjdChNb2NrLmluc3QoMCkudmFsdWUpLnRvLmVxdWFsKCdmaXJzdCcpOwoJCQlleHBlY3QoTW9jay5pbnN0KDEpLnZhbHVlKS50by5lcXVhbCgnc2Vjb25kJyk7CgkJfSk7CgoJCWl0KCd3aWxsIGFsbG93IHByZS1jb25maWd1cmluZyBwbGFpbiB2YWx1ZSBtZW1iZXJzIGJlZm9yZSBpbnN0YW50aWF0aW9uJywgKCkgPT4gewoJCQljb25zdCBNb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKCQkJCWNvbmZpZzogbnVsbAoJCQl9KSk7CgoJCQkvLyBQcmUtY29uZmlndXJlIGJlZm9yZSBpbnN0YW50aWF0aW9uCgkJCU1vY2suaW5zdCgwKS5jb25maWcgPSAncHJlc2V0LXZhbHVlJzsKCgkJCWNvbnN0IGluc3QgPSBuZXcgTW9jaygpOwoJCQlleHBlY3QoaW5zdC5jb25maWcpLnRvLmVxdWFsKCdwcmVzZXQtdmFsdWUnKTsKCQl9KTsKCgkJaXQoJ3dpbGwgc3VwcG9ydCBtaXhpbmcgcGxhaW4gdmFsdWVzIGFuZCBtZXRob2RzIGluIGNsYXNzJywgKCkgPT4gewoJCQljb25zdCBNb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKCQkJCW5hbWU6IG51bGwsCgkJCQlncmVldDogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCdncmVldGluZycpCgkJCX0pKTsKCgkJCU1vY2suaW5zdCgpLmdyZWV0LnJldCgnSGVsbG8hJyk7CgoJCQljb25zdCBpbnN0ID0gbmV3IE1vY2soKTsKCQkJaW5zdC5uYW1lID0gJ1dvcmxkJzsKCgkJCWV4cGVjdChpbnN0Lm5hbWUpLnRvLmVxdWFsKCdXb3JsZCcpOwoJCQlleHBlY3QoTW9jay5pbnN0KDApLm5hbWUpLnRvLmVxdWFsKCdXb3JsZCcpOwoJCQlleHBlY3QoaW5zdC5ncmVldCgnSGknKSkudG8uZXF1YWwoJ0hlbGxvIScpOwoJCQlleHBlY3QoTW9jay5pbnN0KCkuZ3JlZXQuY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoeyBncmVldGluZzogJ0hpJyB9KTsKCQl9KTsKCgkJaXQoJ3dpbGwgc3VwcG9ydCBuZXN0ZWQgb2JqZWN0cyB3aXRoIG1ldGhvZHMnLCAoKSA9PiB7CgkJCWNvbnN0IE1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuY2xhc3MoewoJCQkJZGI6IG1vY2t5Lm9iamVjdCh7CgkJCQkJcXVlcnk6IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnc3FsJyksCgkJCQkJY2xvc2U6IG1vY2t5LmZ1bmN0aW9uKCkKCQkJCX0pCgkJCX0pKTsKCgkJCU1vY2suaW5zdCgwKS5kYi5xdWVyeS5yZXQoeyByb3dzOiBbJ2EnLCAnYiddIH0pOwoJCQlNb2NrLmluc3QoMCkuZGIuY2xvc2UucmV0KHRydWUpOwoKCQkJY29uc3QgaW5zdCA9IG5ldyBNb2NrKCk7CgoJCQlleHBlY3QoaW5zdC5kYi5xdWVyeSgnU0VMRUNUIConKSkudG8uZGVlcC5lcXVhbCh7IHJvd3M6IFsnYScsICdiJ10gfSk7CgkJCWV4cGVjdChpbnN0LmRiLmNsb3NlKCkpLnRvLmVxdWFsKHRydWUpOwoJCQlleHBlY3QoTW9jay5pbnN0KDApLmRiLnF1ZXJ5LmNhbGxzKDApKS50by5kZWVwLmVxdWFsKHsgc3FsOiAnU0VMRUNUIConIH0pOwoJCX0pOwoJfSk7CgoJZGVzY3JpYmUoJ3NweScsICgpID0+IHsKCQlpdCgnd2lsbCBzcHkgb24gbWV0aG9kIGFuZCBjYWxsIHRocm91Z2ggdG8gb3JpZ2luYWwnLCAoKSA9PiB7CgkJCWNvbnN0IG9iaiA9IHsKCQkJCWdyZWV0OiBmdW5jdGlvbihuYW1lKSB7CgkJCQkJcmV0dXJuIGBIZWxsbywgJHtuYW1lfSFgOwoJCQkJfQoJCQl9OwoKCQkJY29uc3Qgc3B5ID0gbW9ja3kuc3B5KG9iaiwgJ2dyZWV0Jyk7CgoJCQljb25zdCByZXN1bHQgPSBvYmouZ3JlZXQoJ1dvcmxkJyk7CgoJCQlleHBlY3QocmVzdWx0KS50by5lcXVhbCgnSGVsbG8sIFdvcmxkIScpOwoJCQlleHBlY3Qoc3B5LmNhbGxzKCkubGVuZ3RoKS50by5lcXVhbCgxKTsKCQkJZXhwZWN0KHNweS5jYWxscygwKSkudG8uZGVlcC5lcXVhbChbJ1dvcmxkJ10pOwoJCX0pOwoKCQlpdCgnd2lsbCB0cmFjayBtdWx0aXBsZSBjYWxscyB0byBzcGllZCBtZXRob2QnLCAoKSA9PiB7CgkJCWNvbnN0IG9iaiA9IHsKCQkJCWFkZDogZnVuY3Rpb24oYSwgYikgewoJCQkJCXJldHVybiBhICsgYjsKCQkJCX0KCQkJfTsKCgkJCWNvbnN0IHNweSA9IG1vY2t5LnNweShvYmosICdhZGQnKTsKCgkJCWV4cGVjdChvYmouYWRkKDIsIDMpKS50by5lcXVhbCg1KTsKCQkJZXhwZWN0KG9iai5hZGQoMTAsIDIwKSkudG8uZXF1YWwoMzApOwoKCQkJZXhwZWN0KHNweS5jYWxscygpLmxlbmd0aCkudG8uZXF1YWwoMik7CgkJCWV4cGVjdChzcHkuY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoWzIsIDNdKTsKCQkJZXhwZWN0KHNweS5jYWxscygxKSkudG8uZGVlcC5lcXVhbChbMTAsIDIwXSk7CgkJfSk7CgoJCWl0KCd3aWxsIG92ZXJyaWRlIHJldHVybiB2YWx1ZSB3aXRoIHJldCgpIHdoaWxlIHN0aWxsIHRyYWNraW5nJywgKCkgPT4gewoJCQljb25zdCBvYmogPSB7CgkJCQlnZXRWYWx1ZTogZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuICdvcmlnaW5hbCc7CgkJCQl9CgkJCX07CgoJCQljb25zdCBzcHkgPSBtb2NreS5zcHkob2JqLCAnZ2V0VmFsdWUnKTsKCQkJc3B5LnJldCgnb3ZlcnJpZGRlbicpOwoKCQkJY29uc3QgcmVzdWx0ID0gb2JqLmdldFZhbHVlKCk7CgoJCQlleHBlY3QocmVzdWx0KS50by5lcXVhbCgnb3ZlcnJpZGRlbicpOwoJCQlleHBlY3Qoc3B5LmNhbGxzKCkubGVuZ3RoKS50by5lcXVhbCgxKTsKCQl9KTsKCgkJaXQoJ3dpbGwgc3B5IHdpdGggcmVwbGFjZW1lbnQgZnVuY3Rpb24nLCAoKSA9PiB7CgkJCWNvbnN0IG9iaiA9IHsKCQkJCWNhbGN1bGF0ZTogZnVuY3Rpb24oeCwgeSkgewoJCQkJCXJldHVybiB4ICogeTsKCQkJCX0KCQkJfTsKCgkJCWNvbnN0IHNweSA9IG1vY2t5LnNweShvYmosICdjYWxjdWxhdGUnLCBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ3gnLCAneScpKTsKCQkJc3B5LnJldCgxMDApOwoKCQkJY29uc3QgcmVzdWx0ID0gb2JqLmNhbGN1bGF0ZSg1LCAzKTsKCgkJCWV4cGVjdChyZXN1bHQpLnRvLmVxdWFsKDEwMCk7CgkJCWV4cGVjdChzcHkuY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoeyB4OiA1LCB5OiAzIH0pOwoJCX0pOwoKCQlpdCgnd2lsbCByZXN0b3JlIG9yaWdpbmFsIG1ldGhvZCcsICgpID0+IHsKCQkJY29uc3Qgb2JqID0gewoJCQkJZG9UaGluZzogZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuICdvcmlnaW5hbCc7CgkJCQl9CgkJCX07CgoJCQljb25zdCBzcHkgPSBtb2NreS5zcHkob2JqLCAnZG9UaGluZycpOwoJCQlzcHkucmV0KCdzcGllZCcpOwoKCQkJZXhwZWN0KG9iai5kb1RoaW5nKCkpLnRvLmVxdWFsKCdzcGllZCcpOwoKCQkJc3B5LnJlc3RvcmUoKTsKCgkJCWV4cGVjdChvYmouZG9UaGluZygpKS50by5lcXVhbCgnb3JpZ2luYWwnKTsKCQl9KTsKCgkJaXQoJ3dpbGwgc3B5IG9uIGNsYXNzIHByb3RvdHlwZSBtZXRob2QnLCAoKSA9PiB7CgkJCWNsYXNzIE15Q2xhc3MgewoJCQkJZ3JlZXQobmFtZSkgewoJCQkJCXJldHVybiBgSGVsbG8sICR7bmFtZX1gOwoJCQkJfQoJCQl9CgoJCQljb25zdCBzcHkgPSBtb2NreS5zcHkoTXlDbGFzcy5wcm90b3R5cGUsICdncmVldCcpOwoKCQkJY29uc3QgaW5zdGFuY2UgPSBuZXcgTXlDbGFzcygpOwoJCQljb25zdCByZXN1bHQgPSBpbnN0YW5jZS5ncmVldCgnVGVzdCcpOwoKCQkJZXhwZWN0KHJlc3VsdCkudG8uZXF1YWwoJ0hlbGxvLCBUZXN0Jyk7CgkJCWV4cGVjdChzcHkuY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDEpOwoJCQlleHBlY3Qoc3B5LmNhbGxzKDApKS50by5kZWVwLmVxdWFsKFsnVGVzdCddKTsKCgkJCXNweS5yZXN0b3JlKCk7CgkJfSk7CgoJCWl0KCd3aWxsIHNweSB3aXRoIGN1c3RvbSByZXBsYWNlbWVudCBib2R5IHRoYXQgY2FsbHMgdGhyb3VnaCcsICgpID0+IHsKCQkJY29uc3Qgb2JqID0gewoJCQkJbXVsdGlwbHk6IGZ1bmN0aW9uKGEsIGIpIHsKCQkJCQlyZXR1cm4gYSAqIGI7CgkJCQl9CgkJCX07CgoJCQljb25zdCBvcmlnaW5hbCA9IG9iai5tdWx0aXBseTsKCQkJY29uc3Qgc3B5ID0gbW9ja3kuc3B5KG9iaiwgJ211bHRpcGx5JywgbW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKCQkJCWNvbnN0IHJlc3VsdCA9IG9yaWdpbmFsLmFwcGx5KGNvbnRleHQuc2VsZiwgY29udGV4dC5yYXdBcmdzKTsKCQkJCXJldHVybiByZXN1bHQgKiAyOyAvLyBEb3VibGUgdGhlIHJlc3VsdAoJCQl9KSk7CgoJCQljb25zdCByZXN1bHQgPSBvYmoubXVsdGlwbHkoMywgNCk7CgoJCQlleHBlY3QocmVzdWx0KS50by5lcXVhbCgyNCk7IC8vICgzICogNCkgKiAyCgkJCWV4cGVjdChzcHkuY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDEpOwoKCQkJc3B5LnJlc3RvcmUoKTsKCQl9KTsKCgkJaXQoJ3dpbGwgcHJlc2VydmUgdGhpcyBjb250ZXh0IHdoZW4gc3B5aW5nJywgKCkgPT4gewoJCQljb25zdCBvYmogPSB7CgkJCQl2YWx1ZTogNDIsCgkJCQlnZXRWYWx1ZTogZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuIHRoaXMudmFsdWU7CgkJCQl9CgkJCX07CgoJCQljb25zdCBzcHkgPSBtb2NreS5zcHkob2JqLCAnZ2V0VmFsdWUnKTsKCgkJCWNvbnN0IHJlc3VsdCA9IG9iai5nZXRWYWx1ZSgpOwoKCQkJZXhwZWN0KHJlc3VsdCkudG8uZXF1YWwoNDIpOwoJCQlleHBlY3Qoc3B5LmNhbGxzKCkubGVuZ3RoKS50by5lcXVhbCgxKTsKCgkJCXNweS5yZXN0b3JlKCk7CgkJfSk7CgoJCWl0KCd3aWxsIHByb3ZpZGUgY29udGV4dC5vcmlnaW5hbCBpbiByZXBsYWNlbWVudCBidWlsZGVyJywgKCkgPT4gewoJCQljb25zdCBvYmogPSB7CgkJCQlhZGQ6IGZ1bmN0aW9uKGEsIGIpIHsKCQkJCQlyZXR1cm4gYSArIGI7CgkJCQl9CgkJCX07CgoJCQljb25zdCBzcHkgPSBtb2NreS5zcHkob2JqLCAnYWRkJywgbW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKCQkJCS8vIENhbGwgb3JpZ2luYWwgYW5kIG1vZGlmeSByZXN1bHQKCQkJCWNvbnN0IG9yaWdpbmFsUmVzdWx0ID0gY29udGV4dC5vcmlnaW5hbC5hcHBseShjb250ZXh0LnNlbGYsIGNvbnRleHQucmF3QXJncyk7CgkJCQlyZXR1cm4gb3JpZ2luYWxSZXN1bHQgKiAxMDsKCQkJfSkuYXJncygneCcsICd5JykpOwoKCQkJY29uc3QgcmVzdWx0ID0gb2JqLmFkZCgzLCA0KTsKCgkJCWV4cGVjdChyZXN1bHQpLnRvLmVxdWFsKDcwKTsgLy8gKDMgKyA0KSAqIDEwCgkJCWV4cGVjdChzcHkuY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoeyB4OiAzLCB5OiA0IH0pOwoKCQkJc3B5LnJlc3RvcmUoKTsKCQl9KTsKCX0pOwp9KTsKAAAAAAAAAADLWwAAAAAAAAAAAAA",
997
+ "AwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvw"
998
+ ],
999
+ [
1000
+ 5,
1001
+ 1,
1002
+ "revert",
1003
+ null,
1004
+ "AgAAAAAAAAAAAAAAAAAAAAAAAADLWwAAY29uc3QgeyBleHBlY3QgfSA9IHJlcXVpcmUoJ2NoYWknKTsKY29uc3QgbW9ja3kgPSByZXF1aXJlKCcuLi9zcmMvbGlsLW1vY2t5LmpzJyk7CgoKZGVzY3JpYmUoJ2xpbC1tb2NreScsICgpID0+IHsKCWRlc2NyaWJlKCdmdW5jdGlvbicsICgpID0+IHsKCQlpdCgnd2lsbCBidWlsZCBkaXJlY3RseSB3aXRob3V0IG1vY2t5LmNyZWF0ZScsIGFzeW5jICgpID0+IHsKCQkJY29uc3QgbW9jayA9IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygneCcsICd5JykuYnVpbGQoKTsKCQkJbW9jay5yZXQoJ3Jlc3VsdCcpOwoKCQkJZXhwZWN0KG1vY2soMSwgMikpLnRvLmVxdWFsKCdyZXN1bHQnKTsKCQkJZXhwZWN0KG1vY2suY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoeyB4OiAxLCB5OiAyIH0pOwoJCX0pOwoJCWl0KCd3aWxsIGJlIGEgZnVuY3Rpb24gd2l0aCBhcmdzJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBtb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnZmlyc3RBcmcnLCB7IHNlY29uZEFyZzogJ3Rlc3REZWZhdWx0JyB9KSk7CgkJCW1vY2sucmV0KCd0ZXN0UmV0Jyk7CgoJCQlleHBlY3QobW9jaygndGVzdEFyZycpKS50by5lcXVhbCgndGVzdFJldCcpOwoJCQlleHBlY3QobW9jay5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7CgkJCQlmaXJzdEFyZzogJ3Rlc3RBcmcnLAoJCQkJc2Vjb25kQXJnOiAndGVzdERlZmF1bHQnCgkJCX0pOwoJCQlleHBlY3QobW9jay5jYWxscygpLmxlbmd0aCkudG8uZXF1YWwoMSk7CgkJfSk7CgkJaXQoJ3dpbGwgYmUgYSBmdW5jdGlvbiB3aXRoIGN1c3RvbSByZXR1cm4nLCBhc3luYyAoKSA9PiB7CgkJCWNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKCQkJCXJldHVybiBjb250ZXh0LnJldDsKCQkJfSkuYXJncygnZmlyc3RBcmcnKSk7CgkJCW1vY2sucmV0KCd0ZXN0UmV0Jyk7CgoJCQlleHBlY3QobW9jaygndGVzdEFyZycpKS50by5lcXVhbCgndGVzdFJldCcpOwoJCQlleHBlY3QobW9jay5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7IGZpcnN0QXJnOiAndGVzdEFyZycgfSk7CgkJCWV4cGVjdChtb2NrLmNhbGxzKCkubGVuZ3RoKS50by5lcXVhbCgxKTsKCQl9KTsKCQlpdCgnd2lsbCB1c2UgYXJnU2VsZWN0IHdpdGggc2luZ2xlIGluZGV4IHRvIHJldHVybiByYXcgYXJndW1lbnQnLCBhc3luYyAoKSA9PiB7CgkJCWNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuZnVuY3Rpb24oKS5hcmdTZWxlY3QoMSkpOwoJCQltb2NrLnJldCgndGVzdFJldCcpOwoKCQkJY29uc3QgcmVzdWx0ID0gbW9jaygnZmlyc3QnLCB7IHRlc3Q6ICdkYXRhJyB9LCAndGhpcmQnKTsKCgkJCWV4cGVjdChyZXN1bHQpLnRvLmVxdWFsKCd0ZXN0UmV0Jyk7CgkJCS8vIFdoZW4gYXJnU2VsZWN0IGhhcyBzaW5nbGUgaW5kZXgsIGNhbGxzIHJldHVybnMgdGhlIHJhdyBhcmd1bWVudAoJCQlleHBlY3QobW9jay5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7IHRlc3Q6ICdkYXRhJyB9KTsKCQl9KTsKCQlpdCgnd2lsbCB1c2UgYXJnU2VsZWN0IHdpdGggbXVsdGlwbGUgaW5kZXhlcyB0byBmaWx0ZXIgbmFtZWQgYXJncycsIGFzeW5jICgpID0+IHsKCQkJY29uc3QgbW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ2ZpcnN0JywgJ3NlY29uZCcsICd0aGlyZCcpLmFyZ1NlbGVjdCgwLCAyKSk7CgoJCQltb2NrKCd2YWx1ZTEnLCAndmFsdWUyJywgJ3ZhbHVlMycpOwoKCQkJLy8gT25seSBmaXJzdCBhbmQgdGhpcmQgYXJlIGNhcHR1cmVkCgkJCWV4cGVjdChtb2NrLmNhbGxzKDApKS50by5kZWVwLmVxdWFsKHsKCQkJCWZpcnN0OiAndmFsdWUxJywKCQkJCXRoaXJkOiAndmFsdWUzJwoJCQl9KTsKCQl9KTsKCQlpdCgnd2lsbCBkZWVwIGNsb25lIGFyZ3VtZW50cyB0byBwcmV2ZW50IG11dGF0aW9uJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBtb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnZGF0YScpKTsKCgkJCWNvbnN0IG9iaiA9IHsgbmVzdGVkOiB7IHZhbHVlOiAnb3JpZ2luYWwnIH0gfTsKCQkJbW9jayhvYmopOwoKCQkJLy8gTXV0YXRlIHRoZSBvcmlnaW5hbAoJCQlvYmoubmVzdGVkLnZhbHVlID0gJ211dGF0ZWQnOwoKCQkJLy8gU3RvcmVkIGNhbGwgc2hvdWxkIGJlIHVuY2hhbmdlZAoJCQlleHBlY3QobW9jay5jYWxscygwKS5kYXRhLm5lc3RlZC52YWx1ZSkudG8uZXF1YWwoJ29yaWdpbmFsJyk7CgkJfSk7CgkJaXQoJ3dpbGwgcmVzZXQgZnVuY3Rpb24gc3RhdGUgaW5jbHVkaW5nIGNhbGxzLCByZXR1cm5zIGFuZCBkYXRhJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBtb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmZ1bmN0aW9uKChjb250ZXh0KSA9PiB7CgkJCQljb250ZXh0LnN0YXRlLmRhdGEuY291bnRlciA9IChjb250ZXh0LnN0YXRlLmRhdGEuY291bnRlciB8fCAwKSArIDE7CgkJCQlyZXR1cm4gY29udGV4dC5yZXQ7CgkJCX0pLmFyZ3MoJ2FyZycpKTsKCQkJbW9jay5yZXQoJ3Rlc3QtcmV0Jyk7CgoJCQltb2NrKCdjYWxsMScpOwoJCQltb2NrKCdjYWxsMicpOwoKCQkJZXhwZWN0KG1vY2suY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDIpOwoJCQlleHBlY3QobW9jay5kYXRhKCdjb3VudGVyJykpLnRvLmVxdWFsKDIpOwoKCQkJbW9jay5yZXNldCgpOwoKCQkJZXhwZWN0KG1vY2suY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDApOwoJCQlleHBlY3QobW9jaygnY2FsbDMnKSkudG8uZXF1YWwodW5kZWZpbmVkKTsgLy8gUmV0dXJuIHZhbHVlcyBjbGVhcmVkCgkJCWV4cGVjdChtb2NrLmRhdGEoJ2NvdW50ZXInKSkudG8uZXF1YWwoMSk7IC8vIFJlc3RhcnRlZCBmcm9tIHNjcmF0Y2gKCQkJZXhwZWN0KG1vY2suZGF0YSgpKS50by5kZWVwLmVxdWFsKHsgY291bnRlcjogMSB9KTsKCQl9KTsKCQlpdCgnd2lsbCBwcm92aWRlIGNvbnRleHQgd2l0aCBjYWxsLCBhcmdzLCByZXQsIHN0YXRlIGFuZCBkYXRhJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBtb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmZ1bmN0aW9uKChjb250ZXh0KSA9PiB7CgkJCQljb250ZXh0LnN0YXRlLmRhdGEuYWxsSXRlbXMgPSBjb250ZXh0LnN0YXRlLmRhdGEuYWxsSXRlbXMgfHwgW107CgkJCQljb250ZXh0LnN0YXRlLmRhdGEuYWxsSXRlbXMucHVzaCguLi5jb250ZXh0LmFyZ3MuaXRlbXMpOwoJCQkJcmV0dXJuIHsKCQkJCQljYWxsOiBjb250ZXh0LmNhbGwsCgkJCQkJYXJnczogY29udGV4dC5hcmdzLAoJCQkJCXJldDogY29udGV4dC5yZXQsCgkJCQkJaGFzU3RhdGU6IHR5cGVvZiBjb250ZXh0LnN0YXRlID09PSAnb2JqZWN0JywKCQkJCQloYXNEYXRhOiB0eXBlb2YgY29udGV4dC5zdGF0ZS5kYXRhID09PSAnb2JqZWN0JwoJCQkJfTsKCQkJfSkuYXJncygnaXRlbXMnKSk7CgkJCW1vY2sucmV0KCdjdXN0b20tcmV0Jyk7CgoJCQljb25zdCByZXN1bHQgPSBtb2NrKFsnYScsICdiJ10pOwoKCQkJZXhwZWN0KHJlc3VsdC5jYWxsKS50by5lcXVhbCgxKTsKCQkJZXhwZWN0KHJlc3VsdC5hcmdzKS50by5kZWVwLmVxdWFsKHsgaXRlbXM6IFsnYScsICdiJ10gfSk7CgkJCWV4cGVjdChyZXN1bHQucmV0KS50by5lcXVhbCgnY3VzdG9tLXJldCcpOwoJCQlleHBlY3QocmVzdWx0Lmhhc1N0YXRlKS50by5lcXVhbCh0cnVlKTsKCQkJZXhwZWN0KHJlc3VsdC5oYXNEYXRhKS50by5lcXVhbCh0cnVlKTsKCgkJCS8vIERhdGEgYWNjdW11bGF0ZXMgYWNyb3NzIGNhbGxzCgkJCW1vY2soWydjJ10pOwoJCQlleHBlY3QobW9jay5kYXRhKCdhbGxJdGVtcycpKS50by5kZWVwLmVxdWFsKFsnYScsICdiJywgJ2MnXSk7CgkJfSk7Cgl9KTsKCglkZXNjcmliZSgnb2JqZWN0JywgKCkgPT4gewoJCWl0KCd3aWxsIGJlIG9iamVjdCB3aXRoIGZ1bmN0aW9uJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBtb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5Lm9iamVjdCh7CgkJCQlydW46IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnZmlyc3RBcmcnKQoJCQl9KSk7CgoJCQltb2NrLnJ1bi5yZXQoJ3Rlc3RSZXQnKTsKCQkJZXhwZWN0KG1vY2sucnVuKCd0ZXN0QXJnJykpLnRvLmVxdWFsKCd0ZXN0UmV0Jyk7CgkJCWV4cGVjdChtb2NrLnJ1bi5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7IGZpcnN0QXJnOiAndGVzdEFyZycgfSk7CgkJCWV4cGVjdChtb2NrLnJ1bi5jYWxscygpLmxlbmd0aCkudG8uZXF1YWwoMSk7CgkJfSk7CgkJaXQoJ3dpbGwgYmUgb2JqZWN0IHdpdGggbmVzdGVkIG9iamVjdCBhbmQgZnVuY3Rpb24nLCBhc3luYyAoKSA9PiB7CgkJCWNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kub2JqZWN0KHsKCQkJCXN1YjogbW9ja3kub2JqZWN0KHsKCQkJCQlydW46IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnZmlyc3RBcmcnKQoJCQkJfSkKCQkJfSkpOwoJCQltb2NrLnN1Yi5ydW4ucmV0KCd0ZXN0UmV0Jyk7CgoJCQlleHBlY3QobW9jay5zdWIucnVuKCd0ZXN0QXJnJykpLnRvLmVxdWFsKCd0ZXN0UmV0Jyk7CgkJCWV4cGVjdChtb2NrLnN1Yi5ydW4uY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoeyBmaXJzdEFyZzogJ3Rlc3RBcmcnIH0pOwoJCQlleHBlY3QobW9jay5zdWIucnVuLmNhbGxzKCkubGVuZ3RoKS50by5lcXVhbCgxKTsKCQl9KTsKCQlpdCgnd2lsbCByZXNldCBhbGwgbmVzdGVkIG1vY2tzIHdoZW4gb2JqZWN0IGlzIHJlc2V0JywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBtb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5Lm9iamVjdCh7CgkJCQltZXRob2QxOiBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ2FyZycpLAoJCQkJbmVzdGVkOiBtb2NreS5vYmplY3QoewoJCQkJCW1ldGhvZDI6IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnYXJnJykKCQkJCX0pCgkJCX0pKTsKCgkJCW1vY2subWV0aG9kMS5yZXQoJ3JldDEnKTsKCQkJbW9jay5uZXN0ZWQubWV0aG9kMi5yZXQoJ3JldDInKTsKCgkJCW1vY2subWV0aG9kMSgnY2FsbDEnKTsKCQkJbW9jay5uZXN0ZWQubWV0aG9kMignY2FsbDInKTsKCgkJCWV4cGVjdChtb2NrLm1ldGhvZDEuY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDEpOwoJCQlleHBlY3QobW9jay5uZXN0ZWQubWV0aG9kMi5jYWxscygpLmxlbmd0aCkudG8uZXF1YWwoMSk7CgoJCQkvLyBSZXNldCBzaG91bGQgcHJvcGFnYXRlIHRvIGFsbCBuZXN0ZWQgbW9ja3MKCQkJbW9jay5yZXNldCgpOwoKCQkJZXhwZWN0KG1vY2subWV0aG9kMS5jYWxscygpLmxlbmd0aCkudG8uZXF1YWwoMCk7CgkJCWV4cGVjdChtb2NrLm5lc3RlZC5tZXRob2QyLmNhbGxzKCkubGVuZ3RoKS50by5lcXVhbCgwKTsKCQkJZXhwZWN0KG1vY2subWV0aG9kMSgndGVzdCcpKS50by5lcXVhbCh1bmRlZmluZWQpOwoJCQlleHBlY3QobW9jay5uZXN0ZWQubWV0aG9kMigndGVzdCcpKS50by5lcXVhbCh1bmRlZmluZWQpOwoJCX0pOwoJCWl0KCd3aWxsIGJlIG9iamVjdCB3aXRoIHByb3BlcnR5IGdldHRlciBhbmQgc2V0dGVyJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBtb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5Lm9iamVjdCh7CgkJCQlhY2Nlc3NvcjogbW9ja3kucHJvcGVydHkoKQoJCQl9KSk7CgoJCQkvLyBJbml0aWFsIHZhbHVlIHNob3VsZCBiZSB1bmRlZmluZWQKCQkJZXhwZWN0KG1vY2suYWNjZXNzb3IpLnRvLmVxdWFsKHVuZGVmaW5lZCk7CgoJCQkvLyBTZXQgYSB2YWx1ZQoJCQltb2NrLmFjY2Vzc29yID0gJ3Rlc3RWYWx1ZSc7CgkJCWV4cGVjdChtb2NrLmFjY2Vzc29yKS50by5lcXVhbCgndGVzdFZhbHVlJyk7CgoJCQkvLyBDaGFuZ2UgdGhlIHZhbHVlCgkJCW1vY2suYWNjZXNzb3IgPSAnbmV3VmFsdWUnOwoJCQlleHBlY3QobW9jay5hY2Nlc3NvcikudG8uZXF1YWwoJ25ld1ZhbHVlJyk7CgkJfSk7CgkJaXQoJ3dpbGwgcmVzZXQgYWxsIHByb3BlcnR5IHR5cGVzIHRvIGluaXRpYWwgdmFsdWVzJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBtb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5Lm9iamVjdCh7CgkJCQljb3VudGVyOiA0MiwKCQkJCW5hbWU6ICdBbGljZScsCgkJCQltZXRob2Q6IG1vY2t5LmZ1bmN0aW9uKCksCgkJCQlhY2Nlc3NvcjogbW9ja3kucHJvcGVydHkoKQoJCQl9KSk7CgoJCQkvLyBNb2RpZnkgYWxsIHByb3BlcnRpZXMKCQkJbW9jay5jb3VudGVyID0gMTAwOwoJCQltb2NrLm5hbWUgPSAnQm9iJzsKCQkJbW9jay5tZXRob2QucmV0KCd0ZXN0Jyk7CgkJCW1vY2subWV0aG9kKCk7CgkJCW1vY2suYWNjZXNzb3IgPSAndmFsdWUnOwoKCQkJLy8gQWRkIGR5bmFtaWMgcHJvcGVydHkKCQkJbW9jay5hZGRlZCA9ICduZXcnOwoKCQkJbW9jay5yZXNldCgpOwoKCQkJLy8gUGxhaW4gdmFsdWVzIHJlc2V0CgkJCWV4cGVjdChtb2NrLmNvdW50ZXIpLnRvLmVxdWFsKDQyKTsKCQkJZXhwZWN0KG1vY2submFtZSkudG8uZXF1YWwoJ0FsaWNlJyk7CgoJCQkvLyBNZXRob2RzIHJlc2V0CgkJCWV4cGVjdChtb2NrLm1ldGhvZC5jYWxscygpLmxlbmd0aCkudG8uZXF1YWwoMCk7CgoJCQkvLyBtb2NreS5wcm9wZXJ0eSgpIHJlc2V0cyB0byB1bmRlZmluZWQKCQkJZXhwZWN0KG1vY2suYWNjZXNzb3IpLnRvLmVxdWFsKHVuZGVmaW5lZCk7CgoJCQkvLyBEeW5hbWljIHByb3BlcnRpZXMgZGVsZXRlZAoJCQlleHBlY3QobW9jay5hZGRlZCkudG8uZXF1YWwodW5kZWZpbmVkKTsKCQkJZXhwZWN0KCdhZGRlZCcgaW4gbW9jaykudG8uZXF1YWwoZmFsc2UpOwoJCX0pOwoJCWl0KCd3aWxsIHN1cHBvcnQgU3ltYm9sIHByb3BlcnRpZXMgYW5kIHJlc2V0IHRoZW0gY29ycmVjdGx5JywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBjdXN0b21TeW1ib2wgPSBTeW1ib2woJ2N1c3RvbScpOwoJCQljb25zdCBhZGRlZFN5bWJvbCA9IFN5bWJvbCgnYWRkZWQnKTsKCgkJCWNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kub2JqZWN0KHsKCQkJCVtTeW1ib2wuaXRlcmF0b3JdOiBtb2NreS5mdW5jdGlvbigpLAoJCQkJW2N1c3RvbVN5bWJvbF06ICdpbml0aWFsVmFsdWUnCgkJCX0pKTsKCgkJCS8vIFZlcmlmeSBTeW1ib2wgcHJvcGVydGllcyB3b3JrCgkJCWV4cGVjdCh0eXBlb2YgbW9ja1tTeW1ib2wuaXRlcmF0b3JdKS50by5lcXVhbCgnZnVuY3Rpb24nKTsKCQkJZXhwZWN0KG1vY2tbY3VzdG9tU3ltYm9sXSkudG8uZXF1YWwoJ2luaXRpYWxWYWx1ZScpOwoKCQkJLy8gQ29uZmlndXJlIGFuZCB1c2UgU3ltYm9sIGZ1bmN0aW9uCgkJCW1vY2tbU3ltYm9sLml0ZXJhdG9yXS5yZXQoJ2l0ZXJhdG9yUmVzdWx0Jyk7CgkJCWV4cGVjdChtb2NrW1N5bWJvbC5pdGVyYXRvcl0oKSkudG8uZXF1YWwoJ2l0ZXJhdG9yUmVzdWx0Jyk7CgkJCWV4cGVjdChtb2NrW1N5bWJvbC5pdGVyYXRvcl0uY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDEpOwoKCQkJLy8gTW9kaWZ5IFN5bWJvbCB2YWx1ZSBhbmQgYWRkIGR5bmFtaWMgU3ltYm9sCgkJCW1vY2tbY3VzdG9tU3ltYm9sXSA9ICdtb2RpZmllZFZhbHVlJzsKCQkJbW9ja1thZGRlZFN5bWJvbF0gPSAnYWRkZWQnOwoKCQkJLy8gUmVzZXQKCQkJbW9jay5yZXNldCgpOwoKCQkJLy8gU3ltYm9sIGZ1bmN0aW9uIG1vY2sgd2FzIHJlc2V0CgkJCWV4cGVjdChtb2NrW1N5bWJvbC5pdGVyYXRvcl0uY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDApOwoJCQlleHBlY3QobW9ja1tTeW1ib2wuaXRlcmF0b3JdKCkpLnRvLmVxdWFsKHVuZGVmaW5lZCk7CgoJCQkvLyBTeW1ib2wgcGxhaW4gcHJvcGVydHkgd2FzIHJlc3RvcmVkCgkJCWV4cGVjdChtb2NrW2N1c3RvbVN5bWJvbF0pLnRvLmVxdWFsKCdpbml0aWFsVmFsdWUnKTsKCgkJCS8vIER5bmFtaWMgU3ltYm9sIHByb3BlcnR5IHdhcyBkZWxldGVkCgkJCWV4cGVjdChtb2NrW2FkZGVkU3ltYm9sXSkudG8uZXF1YWwodW5kZWZpbmVkKTsKCQkJZXhwZWN0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMobW9jaykuaW5jbHVkZXMoYWRkZWRTeW1ib2wpKS50by5lcXVhbChmYWxzZSk7CgkJfSk7CgkJaXQoJ3dpbGwgaGFuZGxlIG51bGwgYW5kIHVuZGVmaW5lZCBwcm9wZXJ0eSB2YWx1ZXMnLCBhc3luYyAoKSA9PiB7CgkJCWNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kub2JqZWN0KHsKCQkJCW51bGxQcm9wOiBudWxsLAoJCQkJdW5kZWZpbmVkUHJvcDogdW5kZWZpbmVkLAoJCQkJemVyb1Byb3A6IDAsCgkJCQlmYWxzZVByb3A6IGZhbHNlLAoJCQkJZW1wdHlTdHJpbmdQcm9wOiAnJwoJCQl9KSk7CgoJCQkvLyBWZXJpZnkgaW5pdGlhbCB2YWx1ZXMKCQkJZXhwZWN0KG1vY2subnVsbFByb3ApLnRvLmVxdWFsKG51bGwpOwoJCQlleHBlY3QobW9jay51bmRlZmluZWRQcm9wKS50by5lcXVhbCh1bmRlZmluZWQpOwoJCQlleHBlY3QobW9jay56ZXJvUHJvcCkudG8uZXF1YWwoMCk7CgkJCWV4cGVjdChtb2NrLmZhbHNlUHJvcCkudG8uZXF1YWwoZmFsc2UpOwoJCQlleHBlY3QobW9jay5lbXB0eVN0cmluZ1Byb3ApLnRvLmVxdWFsKCcnKTsKCgkJCS8vIE1vZGlmeSB2YWx1ZXMKCQkJbW9jay5udWxsUHJvcCA9ICdjaGFuZ2VkJzsKCQkJbW9jay51bmRlZmluZWRQcm9wID0gJ2NoYW5nZWQnOwoJCQltb2NrLnplcm9Qcm9wID0gMTAwOwoJCQltb2NrLmZhbHNlUHJvcCA9IHRydWU7CgkJCW1vY2suZW1wdHlTdHJpbmdQcm9wID0gJ2NoYW5nZWQnOwoKCQkJLy8gUmVzZXQKCQkJbW9jay5yZXNldCgpOwoKCQkJLy8gVmVyaWZ5IHJlc3RvcmVkIHRvIGluaXRpYWwgdmFsdWVzCgkJCWV4cGVjdChtb2NrLm51bGxQcm9wKS50by5lcXVhbChudWxsKTsKCQkJZXhwZWN0KG1vY2sudW5kZWZpbmVkUHJvcCkudG8uZXF1YWwodW5kZWZpbmVkKTsKCQkJZXhwZWN0KG1vY2suemVyb1Byb3ApLnRvLmVxdWFsKDApOwoJCQlleHBlY3QobW9jay5mYWxzZVByb3ApLnRvLmVxdWFsKGZhbHNlKTsKCQkJZXhwZWN0KG1vY2suZW1wdHlTdHJpbmdQcm9wKS50by5lcXVhbCgnJyk7CgkJfSk7Cgl9KTsKCglkZXNjcmliZSgnY2xhc3MnLCAoKSA9PiB7CgkJaXQoJ3dpbGwgYmUgY2xhc3Mgd2l0aCBjb25zdHJ1Y3RvciBhbmQgbWV0aG9kJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBNb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKCQkJCWNvbnN0cnVjdG9yOiBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ2luaXRBcmcnKSwKCQkJCXJ1bjogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCdmaXJzdEFyZycpCgkJCX0pKTsKCQkJTW9jay5pbnN0KCkucnVuLnJldCgndGVzdFJldCcpOwoKCQkJY29uc3QgbW9ja0luc3RhbmNlID0gbmV3IE1vY2soJ3Rlc3RPcHRpb24nKTsKCQkJZXhwZWN0KE1vY2suaW5zdCgpLmNvbnN0cnVjdG9yLmNhbGxzKDApKS50by5kZWVwLmVxdWFsKHsgaW5pdEFyZzogJ3Rlc3RPcHRpb24nIH0pOwoJCQlleHBlY3QoTW9jay5pbnN0KCkuY29uc3RydWN0b3IuY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDEpOwoKCQkJZXhwZWN0KG1vY2tJbnN0YW5jZS5ydW4oJ3Rlc3RBcmcnKSkudG8uZXF1YWwoJ3Rlc3RSZXQnKTsKCQkJZXhwZWN0KE1vY2suaW5zdCgpLnJ1bi5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7IGZpcnN0QXJnOiAndGVzdEFyZycgfSk7CgkJCWV4cGVjdChNb2NrLmluc3QoKS5ydW4uY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDEpOwoJCX0pOwoKCQlpdCgnd2lsbCBiZSBjbGFzcyB3aXRoIGNvbnN0cnVjdG9yIGFuZCBidWlsZGVyIG1ldGhvZHMnLCBhc3luYyAoKSA9PiB7CgkJCWNvbnN0IE1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuY2xhc3MoewoJCQkJaW5kZXg6IG1vY2t5LmZ1bmN0aW9uKChjb250ZXh0KSA9PiB7CgkJCQkJcmV0dXJuIGNvbnRleHQuc2VsZjsKCQkJCX0pLmFyZ3MoJ2luZGV4JyksCgkJCQluYW1lc3BhY2U6IG1vY2t5LmZ1bmN0aW9uKChjb250ZXh0KSA9PiB7CgkJCQkJcmV0dXJuIGNvbnRleHQuc2VsZjsKCQkJCX0pLmFyZ3MoJ25hbWVzcGFjZScpLAoJCQkJcXVlcnk6IG1vY2t5LmZ1bmN0aW9uKChjb250ZXh0KSA9PiB7CgkJCQkJcmV0dXJuIGNvbnRleHQuc2VsZjsKCQkJCX0pLmFyZ3MoJ3F1ZXJ5JykKCQkJfSkpOwoKCQkJY29uc3QgbW9ja0luc3RhbmNlID0gbmV3IE1vY2soKTsKCQkJbW9ja0luc3RhbmNlLmluZGV4KCd0ZXN0LWluZGV4JykubmFtZXNwYWNlKCd0ZXN0LW5hbWVzcGFjZScpLnF1ZXJ5KHsgdGVzdDogJ3F1ZXJ5JyB9KTsKCQkJZXhwZWN0KE1vY2suaW5zdCgpLmluZGV4LmNhbGxzKDApKS50by5kZWVwLmVxdWFsKHsgaW5kZXg6ICd0ZXN0LWluZGV4JyB9KTsKCQkJZXhwZWN0KE1vY2suaW5zdCgpLmluZGV4LmNhbGxzKCkubGVuZ3RoKS50by5lcXVhbCgxKTsKCQkJZXhwZWN0KE1vY2suaW5zdCgpLm5hbWVzcGFjZS5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7IG5hbWVzcGFjZTogJ3Rlc3QtbmFtZXNwYWNlJyB9KTsKCQkJZXhwZWN0KE1vY2suaW5zdCgpLm5hbWVzcGFjZS5jYWxscygpLmxlbmd0aCkudG8uZXF1YWwoMSk7CgkJCWV4cGVjdChNb2NrLmluc3QoKS5xdWVyeS5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7IHF1ZXJ5OiB7IHRlc3Q6ICdxdWVyeScgfSB9KTsKCQkJZXhwZWN0KE1vY2suaW5zdCgpLnF1ZXJ5LmNhbGxzKCkubGVuZ3RoKS50by5lcXVhbCgxKTsKCQl9KTsKCgkJaXQoJ3dpbGwgZGVtb25zdHJhdGUgdGhhdCBzdGF0ZS5kYXRhIGlzIHBlci1tZXRob2QsIG5vdCBzaGFyZWQnLCBhc3luYyAoKSA9PiB7CgkJCWNvbnN0IENvdW50ZXIgPSBtb2NreS5jcmVhdGUobW9ja3kuY2xhc3MoewoJCQkJY29uc3RydWN0b3I6IG1vY2t5LmZ1bmN0aW9uKChjb250ZXh0KSA9PiB7CgkJCQkJLy8gc3RhdGUuZGF0YSBoZXJlIGlzIHNlcGFyYXRlIGZyb20gb3RoZXIgbWV0aG9kcwoJCQkJCWNvbnRleHQuc3RhdGUuZGF0YS5jb25zdHJ1Y3RvckRhdGEgPSAnc2V0IGluIGNvbnN0cnVjdG9yJzsKCQkJCX0pLmFyZ3MoJ3N0YXJ0VmFsdWUnKSwKCQkJCWdldENvbnN0cnVjdG9yRGF0YTogbW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKCQkJCQkvLyBUaGlzIHN0YXRlLmRhdGEgaXMgZGlmZmVyZW50IGZyb20gY29uc3RydWN0b3IncyBzdGF0ZS5kYXRhCgkJCQkJcmV0dXJuIGNvbnRleHQuc3RhdGUuZGF0YS5jb25zdHJ1Y3RvckRhdGE7IC8vIFdpbGwgYmUgdW5kZWZpbmVkCgkJCQl9KQoJCQl9KSk7CgoJCQljb25zdCBjb3VudGVyID0gbmV3IENvdW50ZXIoMTApOwoJCQkvLyBUaGlzIHdpbGwgYmUgdW5kZWZpbmVkIGJlY2F1c2UgZWFjaCBtZXRob2QgaGFzIGl0cyBvd24gc3RhdGUuZGF0YQoJCQlleHBlY3QoY291bnRlci5nZXRDb25zdHJ1Y3RvckRhdGEoKSkudG8uZXF1YWwodW5kZWZpbmVkKTsKCQl9KTsKCgkJaXQoJ3dpbGwgc3RvcmUgZGF0YSBvbiBpbnN0YW5jZSB2aWEgY29udGV4dC5zZWxmIGluIGNvbnN0cnVjdG9yJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBDb3VudGVyID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKCQkJCWNvbnN0cnVjdG9yOiBtb2NreS5mdW5jdGlvbigoY29udGV4dCkgPT4gewoJCQkJCS8vIFN0b3JlIGRhdGEgZGlyZWN0bHkgb24gdGhlIGluc3RhbmNlCgkJCQkJY29udGV4dC5zZWxmLl9jb3VudCA9IGNvbnRleHQuYXJncy5zdGFydFZhbHVlIHx8IDA7CgkJCQkJY29udGV4dC5zZWxmLl9pbml0aWFsaXplZCA9IHRydWU7CgkJCQl9KS5hcmdzKCdzdGFydFZhbHVlJyksCgkJCQlpbmNyZW1lbnQ6IG1vY2t5LmZ1bmN0aW9uKChjb250ZXh0KSA9PiB7CgkJCQkJY29udGV4dC5zZWxmLl9jb3VudCsrOwoJCQkJCXJldHVybiBjb250ZXh0LnNlbGYuX2NvdW50OwoJCQkJfSksCgkJCQlnZXRDb3VudDogbW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKCQkJCQlyZXR1cm4gY29udGV4dC5zZWxmLl9jb3VudDsKCQkJCX0pLAoJCQkJaXNJbml0aWFsaXplZDogbW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKCQkJCQlyZXR1cm4gY29udGV4dC5zZWxmLl9pbml0aWFsaXplZDsKCQkJCX0pCgkJCX0pKTsKCgkJCWNvbnN0IGNvdW50ZXIxID0gbmV3IENvdW50ZXIoMTApOwoJCQlleHBlY3QoY291bnRlcjEuX2luaXRpYWxpemVkKS50by5lcXVhbCh0cnVlKTsKCQkJZXhwZWN0KGNvdW50ZXIxLmlzSW5pdGlhbGl6ZWQoKSkudG8uZXF1YWwodHJ1ZSk7CgkJCWV4cGVjdChjb3VudGVyMS5nZXRDb3VudCgpKS50by5lcXVhbCgxMCk7CgkJCWV4cGVjdChjb3VudGVyMS5pbmNyZW1lbnQoKSkudG8uZXF1YWwoMTEpOwoJCQlleHBlY3QoY291bnRlcjEuaW5jcmVtZW50KCkpLnRvLmVxdWFsKDEyKTsKCQkJZXhwZWN0KGNvdW50ZXIxLmdldENvdW50KCkpLnRvLmVxdWFsKDEyKTsKCgkJCS8vIFNlY29uZCBpbnN0YW5jZSBzaG91bGQgaGF2ZSBzZXBhcmF0ZSBkYXRhCgkJCWNvbnN0IGNvdW50ZXIyID0gbmV3IENvdW50ZXIoNSk7CgkJCWV4cGVjdChjb3VudGVyMi5nZXRDb3VudCgpKS50by5lcXVhbCg1KTsKCQkJZXhwZWN0KGNvdW50ZXIyLmluY3JlbWVudCgpKS50by5lcXVhbCg2KTsKCgkJCS8vIEZpcnN0IGluc3RhbmNlIHNob3VsZCBiZSB1bmFmZmVjdGVkCgkJCWV4cGVjdChjb3VudGVyMS5nZXRDb3VudCgpKS50by5lcXVhbCgxMik7CgkJfSk7CgoJCWl0KCd3aWxsIHRyYWNrIG51bWJlciBvZiBpbnN0YW5jZXMgY3JlYXRlZCB3aXRoIG51bUluc3RzJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBNb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKCQkJCWNvbnN0cnVjdG9yOiBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ3ZhbHVlJykKCQkJfSkpOwoKCQkJZXhwZWN0KE1vY2subnVtSW5zdHMoKSkudG8uZXF1YWwoMCk7CgoJCQljb25zdCBpbnN0MSA9IG5ldyBNb2NrKCdmaXJzdCcpOwoJCQlleHBlY3QoTW9jay5udW1JbnN0cygpKS50by5lcXVhbCgxKTsKCgkJCWNvbnN0IGluc3QyID0gbmV3IE1vY2soJ3NlY29uZCcpOwoJCQlleHBlY3QoTW9jay5udW1JbnN0cygpKS50by5lcXVhbCgyKTsKCgkJCWNvbnN0IGluc3QzID0gbmV3IE1vY2soJ3RoaXJkJyk7CgkJCWV4cGVjdChNb2NrLm51bUluc3RzKCkpLnRvLmVxdWFsKDMpOwoJCX0pOwoKCQlpdCgnd2lsbCByZXNldCBhbGwgaW5zdGFuY2VzIGFuZCBjb3VudGVycycsIGFzeW5jICgpID0+IHsKCQkJY29uc3QgTW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5jbGFzcyh7CgkJCQljb25zdHJ1Y3RvcjogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCd2YWx1ZScpLAoJCQkJcnVuOiBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ2FyZycpCgkJCX0pKTsKCgkJCU1vY2suaW5zdCgwKS5ydW4ucmV0KCdmaXJzdC1yZXQnKTsKCQkJTW9jay5pbnN0KDEpLnJ1bi5yZXQoJ3NlY29uZC1yZXQnKTsKCgkJCWNvbnN0IGluc3QxID0gbmV3IE1vY2soJ2ZpcnN0Jyk7CgkJCWNvbnN0IGluc3QyID0gbmV3IE1vY2soJ3NlY29uZCcpOwoKCQkJZXhwZWN0KGluc3QxLnJ1bigndGVzdCcpKS50by5lcXVhbCgnZmlyc3QtcmV0Jyk7CgkJCWV4cGVjdChpbnN0Mi5ydW4oJ3Rlc3QnKSkudG8uZXF1YWwoJ3NlY29uZC1yZXQnKTsKCQkJZXhwZWN0KE1vY2subnVtSW5zdHMoKSkudG8uZXF1YWwoMik7CgkJCWV4cGVjdChNb2NrLmluc3QoMCkucnVuLmNhbGxzKCkubGVuZ3RoKS50by5lcXVhbCgxKTsKCgkJCS8vIFJlc2V0IHNob3VsZCBjbGVhciBldmVyeXRoaW5nCgkJCU1vY2sucmVzZXQoKTsKCgkJCWV4cGVjdChNb2NrLm51bUluc3RzKCkpLnRvLmVxdWFsKDApOwoKCQkJLy8gQWZ0ZXIgcmVzZXQsIG5ldyBpbnN0YW5jZXMgc3RhcnQgZnJvbSBpbmRleCAwIGFnYWluCgkJCWNvbnN0IGluc3QzID0gbmV3IE1vY2soJ3RoaXJkJyk7CgkJCWV4cGVjdChNb2NrLm51bUluc3RzKCkpLnRvLmVxdWFsKDEpOwoJCQkvLyBSZXR1cm5zIHNob3VsZCBiZSBjbGVhcmVkCgkJCWV4cGVjdChpbnN0My5ydW4oJ3Rlc3QnKSkudG8uZXF1YWwodW5kZWZpbmVkKTsKCQkJLy8gQ2FsbHMgc2hvdWxkIGJlIGNsZWFyZWQKCQkJZXhwZWN0KE1vY2suaW5zdCgwKS5ydW4uY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDEpOyAvLyBKdXN0IHRoaXMgb25lIGNhbGwKCQl9KTsKCgkJaXQoJ3dpbGwgcmVzZXQgcGxhaW4gdmFsdWUgcHJvcGVydGllcyB0byBpbml0aWFsIHZhbHVlcycsIGFzeW5jICgpID0+IHsKCQkJY29uc3QgTW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5jbGFzcyh7CgkJCQluYW1lOiBudWxsLAoJCQkJY291bnQ6IDAKCQkJfSkpOwoKCQkJLy8gQ3JlYXRlIGFuZCBtb2RpZnkgaW5zdGFuY2VzCgkJCWNvbnN0IGluc3QxID0gbmV3IE1vY2soKTsKCQkJaW5zdDEubmFtZSA9ICdmaXJzdCc7CgkJCWluc3QxLmNvdW50ID0gMTA7CgoJCQljb25zdCBpbnN0MiA9IG5ldyBNb2NrKCk7CgkJCWluc3QyLm5hbWUgPSAnc2Vjb25kJzsKCQkJaW5zdDIuY291bnQgPSAyMDsKCgkJCWV4cGVjdChNb2NrLm51bUluc3RzKCkpLnRvLmVxdWFsKDIpOwoJCQlleHBlY3QoTW9jay5pbnN0KDApLm5hbWUpLnRvLmVxdWFsKCdmaXJzdCcpOwoJCQlleHBlY3QoTW9jay5pbnN0KDEpLmNvdW50KS50by5lcXVhbCgyMCk7CgoJCQkvLyBSZXNldAoJCQlNb2NrLnJlc2V0KCk7CgoJCQlleHBlY3QoTW9jay5udW1JbnN0cygpKS50by5lcXVhbCgwKTsKCgkJCS8vIEFmdGVyIHJlc2V0LCBkZXNjcmlwdGlvbnMgYXJlIGZyZXNoIHdpdGggaW5pdGlhbCB2YWx1ZXMKCQkJZXhwZWN0KE1vY2suaW5zdCgwKS5uYW1lKS50by5lcXVhbChudWxsKTsKCQkJZXhwZWN0KE1vY2suaW5zdCgwKS5jb3VudCkudG8uZXF1YWwoMCk7CgoJCQkvLyBOZXcgaW5zdGFuY2UgZ2V0cyBpbml0aWFsIHZhbHVlcwoJCQljb25zdCBpbnN0MyA9IG5ldyBNb2NrKCk7CgkJCWV4cGVjdChpbnN0My5uYW1lKS50by5lcXVhbChudWxsKTsKCQkJZXhwZWN0KGluc3QzLmNvdW50KS50by5lcXVhbCgwKTsKCQl9KTsKCgkJaXQoJ3dpbGwgcHJlLWNvbmZpZ3VyZSBpbnN0YW5jZXMgYmVmb3JlIGluc3RhbnRpYXRpb24nLCBhc3luYyAoKSA9PiB7CgkJCWNvbnN0IE1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuY2xhc3MoewoJCQkJcnVuOiBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ2FyZycpCgkJCX0pKTsKCgkJCS8vIENvbmZpZ3VyZSBpbnN0YW5jZXMgYmVmb3JlIHRoZXkncmUgY3JlYXRlZAoJCQlNb2NrLmluc3QoMCkucnVuLnJldCgnZmlyc3QtdmFsdWUnKTsKCQkJTW9jay5pbnN0KDEpLnJ1bi5yZXQoJ3NlY29uZC12YWx1ZScpOwoJCQlNb2NrLmluc3QoMikucnVuLnJldCgndGhpcmQtdmFsdWUnKTsKCgkJCWNvbnN0IGluc3QxID0gbmV3IE1vY2soKTsKCQkJY29uc3QgaW5zdDIgPSBuZXcgTW9jaygpOwoJCQljb25zdCBpbnN0MyA9IG5ldyBNb2NrKCk7CgoJCQlleHBlY3QoaW5zdDEucnVuKCd0ZXN0JykpLnRvLmVxdWFsKCdmaXJzdC12YWx1ZScpOwoJCQlleHBlY3QoaW5zdDIucnVuKCd0ZXN0JykpLnRvLmVxdWFsKCdzZWNvbmQtdmFsdWUnKTsKCQkJZXhwZWN0KGluc3QzLnJ1bigndGVzdCcpKS50by5lcXVhbCgndGhpcmQtdmFsdWUnKTsKCQl9KTsKCgkJaXQoJ3dpbGwgc3VwcG9ydCBhc3luYyBtZXRob2RzJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBNb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKCQkJCWZldGNoRGF0YTogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCdpZCcpLmFzeW5jKCkKCQkJfSkpOwoKCQkJTW9jay5pbnN0KCkuZmV0Y2hEYXRhLnJldCgnYXN5bmMtcmVzdWx0Jyk7CgoJCQljb25zdCBpbnN0ID0gbmV3IE1vY2soKTsKCQkJY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5zdC5mZXRjaERhdGEoJ3Rlc3QtaWQnKTsKCgkJCWV4cGVjdChyZXN1bHQpLnRvLmVxdWFsKCdhc3luYy1yZXN1bHQnKTsKCQkJZXhwZWN0KE1vY2suaW5zdCgpLmZldGNoRGF0YS5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7IGlkOiAndGVzdC1pZCcgfSk7CgkJfSk7CgoJCWl0KCd3aWxsIHRocm93IGVycm9ycyBmcm9tIGNsYXNzIG1ldGhvZHMnLCBhc3luYyAoKSA9PiB7CgkJCWNvbnN0IE1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuY2xhc3MoewoJCQkJdGhyb3dFcnJvcjogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCdtZXNzYWdlJykKCQkJfSkpOwoKCQkJY29uc3QgdGVzdEVycm9yID0gbmV3IEVycm9yKCdUZXN0IGVycm9yJyk7CgkJCU1vY2suaW5zdCgpLnRocm93RXJyb3IucmV0KHRlc3RFcnJvcik7CgoJCQljb25zdCBpbnN0ID0gbmV3IE1vY2soKTsKCgkJCWV4cGVjdCgoKSA9PiBpbnN0LnRocm93RXJyb3IoJ2ZhaWwnKSkudG8udGhyb3coJ1Rlc3QgZXJyb3InKTsKCQkJZXhwZWN0KE1vY2suaW5zdCgpLnRocm93RXJyb3IuY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoeyBtZXNzYWdlOiAnZmFpbCcgfSk7CgkJfSk7CgoJCWl0KCd3aWxsIGhhbmRsZSBvblJldCBoYW5kbGVycyBpbiBjbGFzcyBtZXRob2RzJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBNb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKCQkJCWNhbGN1bGF0ZTogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCd4JywgJ3knKQoJCQl9KSk7CgoJCQlNb2NrLmluc3QoKS5jYWxjdWxhdGUub25SZXQoKGFyZ3MpID0+IHsKCQkJCXJldHVybiBhcmdzLnggKyBhcmdzLnk7CgkJCX0pOwoKCQkJY29uc3QgaW5zdCA9IG5ldyBNb2NrKCk7CgoJCQlleHBlY3QoaW5zdC5jYWxjdWxhdGUoNSwgMykpLnRvLmVxdWFsKDgpOwoJCQlleHBlY3QoaW5zdC5jYWxjdWxhdGUoMTAsIDIwKSkudG8uZXF1YWwoMzApOwoJCX0pOwoKCQlpdCgnd2lsbCBoYW5kbGUgZGlmZmVyZW50IHJldHVybiB2YWx1ZXMgcGVyIGNhbGwnLCBhc3luYyAoKSA9PiB7CgkJCWNvbnN0IE1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuY2xhc3MoewoJCQkJZ2V0VmFsdWU6IG1vY2t5LmZ1bmN0aW9uKCkKCQkJfSkpOwoKCQkJTW9jay5pbnN0KCkuZ2V0VmFsdWUucmV0KCdkZWZhdWx0Jyk7CgkJCU1vY2suaW5zdCgpLmdldFZhbHVlLnJldCgnZmlyc3QtY2FsbCcsIDEpOwoJCQlNb2NrLmluc3QoKS5nZXRWYWx1ZS5yZXQoJ3NlY29uZC1jYWxsJywgMik7CgoJCQljb25zdCBpbnN0ID0gbmV3IE1vY2soKTsKCgkJCWV4cGVjdChpbnN0LmdldFZhbHVlKCkpLnRvLmVxdWFsKCdmaXJzdC1jYWxsJyk7CgkJCWV4cGVjdChpbnN0LmdldFZhbHVlKCkpLnRvLmVxdWFsKCdzZWNvbmQtY2FsbCcpOwoJCQlleHBlY3QoaW5zdC5nZXRWYWx1ZSgpKS50by5lcXVhbCgnZGVmYXVsdCcpOyAvLyBGYWxscyBiYWNrIHRvIGNhbGwgMAoJCX0pOwoKCQlpdCgnd2lsbCBzdXBwb3J0IGNsYXNzIGluaGVyaXRhbmNlIHdpdGggc3VwZXIgY2FsbHMnLCAoKSA9PiB7CgkJCWNvbnN0IE1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuY2xhc3MoewoJCQkJY29uc3RydWN0b3I6IG1vY2t5LmZ1bmN0aW9uKChjb250ZXh0KSA9PiB7CgkJCQkJY29udGV4dC5zZWxmLm1vY2tJbml0aWFsaXplZCA9IHRydWU7CgkJCQkJY29udGV4dC5zZWxmLm1vY2tWYWx1ZSA9IGNvbnRleHQuYXJncy52YWx1ZTsKCQkJCX0pLmFyZ3MoJ3ZhbHVlJyksCgkJCQlnZXRWYWx1ZTogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCd4JykKCQkJfSkpOwoKCQkJTW9jay5pbnN0KCkuZ2V0VmFsdWUucmV0KCdtb2NrLXZhbHVlJyk7CgoJCQljbGFzcyBDaGlsZCBleHRlbmRzIE1vY2sgewoJCQkJY29uc3RydWN0b3IodmFsdWUpIHsKCQkJCQlzdXBlcih2YWx1ZSk7CgkJCQkJdGhpcy5jaGlsZEluaXRpYWxpemVkID0gdHJ1ZTsKCQkJCQl0aGlzLmNoaWxkVmFsdWUgPSB2YWx1ZSAqIDI7CgkJCQl9CgkJCQlnZXRWYWx1ZSh4KSB7CgkJCQkJY29uc3QgcGFyZW50UmVzdWx0ID0gc3VwZXIuZ2V0VmFsdWUoeCk7CgkJCQkJcmV0dXJuIGBjaGlsZC0ke3BhcmVudFJlc3VsdH1gOwoJCQkJfQoJCQl9CgoJCQljb25zdCBjaGlsZCA9IG5ldyBDaGlsZCgxMCk7CgoJCQkvLyBNb2NrIGNvbnN0cnVjdG9yIHNob3VsZCBoYXZlIHJ1bgoJCQlleHBlY3QoY2hpbGQubW9ja0luaXRpYWxpemVkKS50by5lcXVhbCh0cnVlKTsKCQkJZXhwZWN0KGNoaWxkLm1vY2tWYWx1ZSkudG8uZXF1YWwoMTApOwoJCQlleHBlY3QoTW9jay5pbnN0KCkuY29uc3RydWN0b3IuY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoeyB2YWx1ZTogMTAgfSk7CgoJCQkvLyBDaGlsZCBjb25zdHJ1Y3RvciBzaG91bGQgaGF2ZSBydW4gYWZ0ZXIKCQkJZXhwZWN0KGNoaWxkLmNoaWxkSW5pdGlhbGl6ZWQpLnRvLmVxdWFsKHRydWUpOwoJCQlleHBlY3QoY2hpbGQuY2hpbGRWYWx1ZSkudG8uZXF1YWwoMjApOwoKCQkJLy8gQ2hpbGQncyBvdmVycmlkZGVuIG1ldGhvZCBjYWxscyBzdXBlciBhbmQgd3JhcHMgcmVzdWx0CgkJCWNvbnN0IHJlc3VsdCA9IGNoaWxkLmdldFZhbHVlKCd0ZXN0Jyk7CgkJCWV4cGVjdChyZXN1bHQpLnRvLmVxdWFsKCdjaGlsZC1tb2NrLXZhbHVlJyk7CgkJCWV4cGVjdChNb2NrLmluc3QoKS5nZXRWYWx1ZS5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7IHg6ICd0ZXN0JyB9KTsKCQl9KTsKCgkJaXQoJ3dpbGwgbm90IGV4cG9zZSBfbW9ja0luZGV4IGluIGRlZXAgZXF1YWwgY29tcGFyaXNvbnMnLCAoKSA9PiB7CgkJCWNvbnN0IE1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuY2xhc3MoewoJCQkJY29uc3RydWN0b3I6IG1vY2t5LmZ1bmN0aW9uKChjb250ZXh0KSA9PiB7CgkJCQkJY29udGV4dC5zZWxmLm5hbWUgPSBjb250ZXh0LmFyZ3MubmFtZTsKCQkJCX0pLmFyZ3MoJ25hbWUnKQoJCQl9KSk7CgoJCQljb25zdCBpbnN0YW5jZSA9IG5ldyBNb2NrKCd0ZXN0Jyk7CgoJCQlleHBlY3QoaW5zdGFuY2UpLnRvLmRlZXAuZXF1YWwoeyBuYW1lOiAndGVzdCcgfSk7CgkJfSk7CgoJCWl0KCd3aWxsIHN5bmMgcGxhaW4gdmFsdWUgbWVtYmVycyBiZXR3ZWVuIGluc3RhbmNlIGFuZCBNb2NrLmluc3QoKScsICgpID0+IHsKCQkJY29uc3QgTW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5jbGFzcyh7CgkJCQluYW1lOiBudWxsLAoJCQkJY291bnQ6IDAKCQkJfSkpOwoKCQkJY29uc3QgaW5zdCA9IG5ldyBNb2NrKCk7CgoJCQkvLyBJbml0aWFsIHZhbHVlcyBmcm9tIGRlZmluaXRpb24KCQkJZXhwZWN0KGluc3QubmFtZSkudG8uZXF1YWwobnVsbCk7CgkJCWV4cGVjdChpbnN0LmNvdW50KS50by5lcXVhbCgwKTsKCgkJCS8vIFNldHRpbmcgb24gaW5zdGFuY2Ugc3luY3MgdG8gTW9jay5pbnN0KCkKCQkJaW5zdC5uYW1lID0gJ3Rlc3QnOwoJCQlpbnN0LmNvdW50ID0gNDI7CgkJCWV4cGVjdChNb2NrLmluc3QoMCkubmFtZSkudG8uZXF1YWwoJ3Rlc3QnKTsKCQkJZXhwZWN0KE1vY2suaW5zdCgwKS5jb3VudCkudG8uZXF1YWwoNDIpOwoKCQkJLy8gU2V0dGluZyBvbiBNb2NrLmluc3QoKSBzeW5jcyB0byBpbnN0YW5jZQoJCQlNb2NrLmluc3QoMCkubmFtZSA9ICdjaGFuZ2VkJzsKCQkJZXhwZWN0KGluc3QubmFtZSkudG8uZXF1YWwoJ2NoYW5nZWQnKTsKCQl9KTsKCgkJaXQoJ3dpbGwgaXNvbGF0ZSBwbGFpbiB2YWx1ZSBtZW1iZXJzIGJldHdlZW4gY2xhc3MgaW5zdGFuY2VzJywgKCkgPT4gewoJCQljb25zdCBNb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKCQkJCXZhbHVlOiBudWxsCgkJCX0pKTsKCgkJCWNvbnN0IGluc3QxID0gbmV3IE1vY2soKTsKCQkJY29uc3QgaW5zdDIgPSBuZXcgTW9jaygpOwoKCQkJaW5zdDEudmFsdWUgPSAnZmlyc3QnOwoJCQlpbnN0Mi52YWx1ZSA9ICdzZWNvbmQnOwoKCQkJZXhwZWN0KGluc3QxLnZhbHVlKS50by5lcXVhbCgnZmlyc3QnKTsKCQkJZXhwZWN0KGluc3QyLnZhbHVlKS50by5lcXVhbCgnc2Vjb25kJyk7CgkJCWV4cGVjdChNb2NrLmluc3QoMCkudmFsdWUpLnRvLmVxdWFsKCdmaXJzdCcpOwoJCQlleHBlY3QoTW9jay5pbnN0KDEpLnZhbHVlKS50by5lcXVhbCgnc2Vjb25kJyk7CgkJfSk7CgoJCWl0KCd3aWxsIGFsbG93IHByZS1jb25maWd1cmluZyBwbGFpbiB2YWx1ZSBtZW1iZXJzIGJlZm9yZSBpbnN0YW50aWF0aW9uJywgKCkgPT4gewoJCQljb25zdCBNb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKCQkJCWNvbmZpZzogbnVsbAoJCQl9KSk7CgoJCQkvLyBQcmUtY29uZmlndXJlIGJlZm9yZSBpbnN0YW50aWF0aW9uCgkJCU1vY2suaW5zdCgwKS5jb25maWcgPSAncHJlc2V0LXZhbHVlJzsKCgkJCWNvbnN0IGluc3QgPSBuZXcgTW9jaygpOwoJCQlleHBlY3QoaW5zdC5jb25maWcpLnRvLmVxdWFsKCdwcmVzZXQtdmFsdWUnKTsKCQl9KTsKCgkJaXQoJ3dpbGwgc3VwcG9ydCBtaXhpbmcgcGxhaW4gdmFsdWVzIGFuZCBtZXRob2RzIGluIGNsYXNzJywgKCkgPT4gewoJCQljb25zdCBNb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKCQkJCW5hbWU6IG51bGwsCgkJCQlncmVldDogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCdncmVldGluZycpCgkJCX0pKTsKCgkJCU1vY2suaW5zdCgpLmdyZWV0LnJldCgnSGVsbG8hJyk7CgoJCQljb25zdCBpbnN0ID0gbmV3IE1vY2soKTsKCQkJaW5zdC5uYW1lID0gJ1dvcmxkJzsKCgkJCWV4cGVjdChpbnN0Lm5hbWUpLnRvLmVxdWFsKCdXb3JsZCcpOwoJCQlleHBlY3QoTW9jay5pbnN0KDApLm5hbWUpLnRvLmVxdWFsKCdXb3JsZCcpOwoJCQlleHBlY3QoaW5zdC5ncmVldCgnSGknKSkudG8uZXF1YWwoJ0hlbGxvIScpOwoJCQlleHBlY3QoTW9jay5pbnN0KCkuZ3JlZXQuY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoeyBncmVldGluZzogJ0hpJyB9KTsKCQl9KTsKCgkJaXQoJ3dpbGwgc3VwcG9ydCBuZXN0ZWQgb2JqZWN0cyB3aXRoIG1ldGhvZHMnLCAoKSA9PiB7CgkJCWNvbnN0IE1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuY2xhc3MoewoJCQkJZGI6IG1vY2t5Lm9iamVjdCh7CgkJCQkJcXVlcnk6IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnc3FsJyksCgkJCQkJY2xvc2U6IG1vY2t5LmZ1bmN0aW9uKCkKCQkJCX0pCgkJCX0pKTsKCgkJCU1vY2suaW5zdCgwKS5kYi5xdWVyeS5yZXQoeyByb3dzOiBbJ2EnLCAnYiddIH0pOwoJCQlNb2NrLmluc3QoMCkuZGIuY2xvc2UucmV0KHRydWUpOwoKCQkJY29uc3QgaW5zdCA9IG5ldyBNb2NrKCk7CgoJCQlleHBlY3QoaW5zdC5kYi5xdWVyeSgnU0VMRUNUIConKSkudG8uZGVlcC5lcXVhbCh7IHJvd3M6IFsnYScsICdiJ10gfSk7CgkJCWV4cGVjdChpbnN0LmRiLmNsb3NlKCkpLnRvLmVxdWFsKHRydWUpOwoJCQlleHBlY3QoTW9jay5pbnN0KDApLmRiLnF1ZXJ5LmNhbGxzKDApKS50by5kZWVwLmVxdWFsKHsgc3FsOiAnU0VMRUNUIConIH0pOwoJCX0pOwoJfSk7CgoJZGVzY3JpYmUoJ3NweScsICgpID0+IHsKCQlpdCgnd2lsbCBzcHkgb24gbWV0aG9kLCBjYWxsIHRocm91Z2gsIHRyYWNrIGNhbGxzIGFuZCBwcmVzZXJ2ZSB0aGlzJywgKCkgPT4gewoJCQljb25zdCBvYmogPSB7CgkJCQl2YWx1ZTogNDIsCgkJCQlncmVldDogZnVuY3Rpb24obmFtZSkgewoJCQkJCXJldHVybiBgSGVsbG8sICR7bmFtZX0hYDsKCQkJCX0sCgkJCQlnZXRWYWx1ZTogZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuIHRoaXMudmFsdWU7CgkJCQl9CgkJCX07CgoJCQljb25zdCBncmVldFNweSA9IG1vY2t5LnNweShvYmosICdncmVldCcpOwoJCQljb25zdCB2YWx1ZVNweSA9IG1vY2t5LnNweShvYmosICdnZXRWYWx1ZScpOwoKCQkJLy8gQ2FsbHMgdGhyb3VnaCB0byBvcmlnaW5hbAoJCQlleHBlY3Qob2JqLmdyZWV0KCdXb3JsZCcpKS50by5lcXVhbCgnSGVsbG8sIFdvcmxkIScpOwoJCQlleHBlY3Qob2JqLmdyZWV0KCdUZXN0JykpLnRvLmVxdWFsKCdIZWxsbywgVGVzdCEnKTsKCgkJCS8vIFRyYWNrcyBtdWx0aXBsZSBjYWxscwoJCQlleHBlY3QoZ3JlZXRTcHkuY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDIpOwoJCQlleHBlY3QoZ3JlZXRTcHkuY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoWydXb3JsZCddKTsKCQkJZXhwZWN0KGdyZWV0U3B5LmNhbGxzKDEpKS50by5kZWVwLmVxdWFsKFsnVGVzdCddKTsKCgkJCS8vIFByZXNlcnZlcyB0aGlzIGNvbnRleHQKCQkJZXhwZWN0KG9iai5nZXRWYWx1ZSgpKS50by5lcXVhbCg0Mik7CgkJCWV4cGVjdCh2YWx1ZVNweS5jYWxscygpLmxlbmd0aCkudG8uZXF1YWwoMSk7CgoJCQlncmVldFNweS5yZXN0b3JlKCk7CgkJCXZhbHVlU3B5LnJlc3RvcmUoKTsKCQl9KTsKCgkJaXQoJ3dpbGwgb3ZlcnJpZGUgcmV0dXJuIHZhbHVlIHdpdGggcmV0KCkgd2hpbGUgc3RpbGwgdHJhY2tpbmcnLCAoKSA9PiB7CgkJCWNvbnN0IG9iaiA9IHsKCQkJCWdldFZhbHVlOiBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gJ29yaWdpbmFsJzsKCQkJCX0KCQkJfTsKCgkJCWNvbnN0IHNweSA9IG1vY2t5LnNweShvYmosICdnZXRWYWx1ZScpOwoJCQlzcHkucmV0KCdvdmVycmlkZGVuJyk7CgoJCQljb25zdCByZXN1bHQgPSBvYmouZ2V0VmFsdWUoKTsKCgkJCWV4cGVjdChyZXN1bHQpLnRvLmVxdWFsKCdvdmVycmlkZGVuJyk7CgkJCWV4cGVjdChzcHkuY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDEpOwoJCX0pOwoKCQlpdCgnd2lsbCByZXN0b3JlIG9yaWdpbmFsIG1ldGhvZCcsICgpID0+IHsKCQkJY29uc3Qgb2JqID0gewoJCQkJZG9UaGluZzogZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuICdvcmlnaW5hbCc7CgkJCQl9CgkJCX07CgoJCQljb25zdCBzcHkgPSBtb2NreS5zcHkob2JqLCAnZG9UaGluZycpOwoJCQlzcHkucmV0KCdzcGllZCcpOwoKCQkJZXhwZWN0KG9iai5kb1RoaW5nKCkpLnRvLmVxdWFsKCdzcGllZCcpOwoKCQkJc3B5LnJlc3RvcmUoKTsKCgkJCWV4cGVjdChvYmouZG9UaGluZygpKS50by5lcXVhbCgnb3JpZ2luYWwnKTsKCQl9KTsKCgkJaXQoJ3dpbGwgc3B5IG9uIGNsYXNzIHByb3RvdHlwZSBtZXRob2QnLCAoKSA9PiB7CgkJCWNsYXNzIE15Q2xhc3MgewoJCQkJZ3JlZXQobmFtZSkgewoJCQkJCXJldHVybiBgSGVsbG8sICR7bmFtZX1gOwoJCQkJfQoJCQl9CgoJCQljb25zdCBzcHkgPSBtb2NreS5zcHkoTXlDbGFzcy5wcm90b3R5cGUsICdncmVldCcpOwoKCQkJY29uc3QgaW5zdGFuY2UgPSBuZXcgTXlDbGFzcygpOwoJCQljb25zdCByZXN1bHQgPSBpbnN0YW5jZS5ncmVldCgnVGVzdCcpOwoKCQkJZXhwZWN0KHJlc3VsdCkudG8uZXF1YWwoJ0hlbGxvLCBUZXN0Jyk7CgkJCWV4cGVjdChzcHkuY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDEpOwoJCQlleHBlY3Qoc3B5LmNhbGxzKDApKS50by5kZWVwLmVxdWFsKFsnVGVzdCddKTsKCgkJCXNweS5yZXN0b3JlKCk7CgkJfSk7CgoJCWl0KCd3aWxsIHNweSB3aXRoIHJlcGxhY2VtZW50IGZ1bmN0aW9uIGFuZCBwcm92aWRlIGNvbnRleHQub3JpZ2luYWwnLCAoKSA9PiB7CgkJCWNvbnN0IG9iaiA9IHsKCQkJCWFkZDogZnVuY3Rpb24oYSwgYikgewoJCQkJCXJldHVybiBhICsgYjsKCQkJCX0KCQkJfTsKCgkJCS8vIFJlcGxhY2VtZW50IHdpdGggYXJncyBhbmQgY29udGV4dC5vcmlnaW5hbAoJCQljb25zdCBzcHkgPSBtb2NreS5zcHkob2JqLCAnYWRkJywgbW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKCQkJCWNvbnN0IG9yaWdpbmFsUmVzdWx0ID0gY29udGV4dC5vcmlnaW5hbC5hcHBseShjb250ZXh0LnNlbGYsIGNvbnRleHQucmF3QXJncyk7CgkJCQlyZXR1cm4gb3JpZ2luYWxSZXN1bHQgKiAxMDsKCQkJfSkuYXJncygneCcsICd5JykpOwoKCQkJY29uc3QgcmVzdWx0ID0gb2JqLmFkZCgzLCA0KTsKCgkJCWV4cGVjdChyZXN1bHQpLnRvLmVxdWFsKDcwKTsgLy8gKDMgKyA0KSAqIDEwCgkJCWV4cGVjdChzcHkuY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoeyB4OiAzLCB5OiA0IH0pOwoKCQkJc3B5LnJlc3RvcmUoKTsKCQl9KTsKCX0pOwp9KTsKAAAAAAAAAADNWwAAAAAAAAAAAAA",
1005
+ "AwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAMtbAAAAAAAAy1sAAAAAAAAAAAAAAADwvw"
1006
+ ],
1007
+ [
1008
+ 6,
1009
+ 1,
1010
+ "revert",
1011
+ null,
1012
+ "BAAAAAAAAAAAAAAAAAAAAAAAAADNWwAAY29uc3QgeyBleHBlY3QgfSA9IHJlcXVpcmUoJ2NoYWknKTsKY29uc3QgbW9ja3kgPSByZXF1aXJlKCcuLi9zcmMvbGlsLW1vY2t5LmpzJyk7CgoKZGVzY3JpYmUoJ2xpbC1tb2NreScsICgpID0+IHsKCWRlc2NyaWJlKCdmdW5jdGlvbicsICgpID0+IHsKCQlpdCgnd2lsbCBidWlsZCBkaXJlY3RseSB3aXRob3V0IG1vY2t5LmNyZWF0ZScsIGFzeW5jICgpID0+IHsKCQkJY29uc3QgbW9jayA9IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygneCcsICd5JykuYnVpbGQoKTsKCQkJbW9jay5yZXQoJ3Jlc3VsdCcpOwoKCQkJZXhwZWN0KG1vY2soMSwgMikpLnRvLmVxdWFsKCdyZXN1bHQnKTsKCQkJZXhwZWN0KG1vY2suY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoeyB4OiAxLCB5OiAyIH0pOwoJCX0pOwoJCWl0KCd3aWxsIGJlIGEgZnVuY3Rpb24gd2l0aCBhcmdzJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBtb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnZmlyc3RBcmcnLCB7IHNlY29uZEFyZzogJ3Rlc3REZWZhdWx0JyB9KSk7CgkJCW1vY2sucmV0KCd0ZXN0UmV0Jyk7CgoJCQlleHBlY3QobW9jaygndGVzdEFyZycpKS50by5lcXVhbCgndGVzdFJldCcpOwoJCQlleHBlY3QobW9jay5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7CgkJCQlmaXJzdEFyZzogJ3Rlc3RBcmcnLAoJCQkJc2Vjb25kQXJnOiAndGVzdERlZmF1bHQnCgkJCX0pOwoJCQlleHBlY3QobW9jay5jYWxscygpLmxlbmd0aCkudG8uZXF1YWwoMSk7CgkJfSk7CgkJaXQoJ3dpbGwgYmUgYSBmdW5jdGlvbiB3aXRoIGN1c3RvbSByZXR1cm4nLCBhc3luYyAoKSA9PiB7CgkJCWNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKCQkJCXJldHVybiBjb250ZXh0LnJldDsKCQkJfSkuYXJncygnZmlyc3RBcmcnKSk7CgkJCW1vY2sucmV0KCd0ZXN0UmV0Jyk7CgoJCQlleHBlY3QobW9jaygndGVzdEFyZycpKS50by5lcXVhbCgndGVzdFJldCcpOwoJCQlleHBlY3QobW9jay5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7IGZpcnN0QXJnOiAndGVzdEFyZycgfSk7CgkJCWV4cGVjdChtb2NrLmNhbGxzKCkubGVuZ3RoKS50by5lcXVhbCgxKTsKCQl9KTsKCQlpdCgnd2lsbCB1c2UgYXJnU2VsZWN0IHdpdGggc2luZ2xlIGluZGV4IHRvIHJldHVybiByYXcgYXJndW1lbnQnLCBhc3luYyAoKSA9PiB7CgkJCWNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuZnVuY3Rpb24oKS5hcmdTZWxlY3QoMSkpOwoJCQltb2NrLnJldCgndGVzdFJldCcpOwoKCQkJY29uc3QgcmVzdWx0ID0gbW9jaygnZmlyc3QnLCB7IHRlc3Q6ICdkYXRhJyB9LCAndGhpcmQnKTsKCgkJCWV4cGVjdChyZXN1bHQpLnRvLmVxdWFsKCd0ZXN0UmV0Jyk7CgkJCS8vIFdoZW4gYXJnU2VsZWN0IGhhcyBzaW5nbGUgaW5kZXgsIGNhbGxzIHJldHVybnMgdGhlIHJhdyBhcmd1bWVudAoJCQlleHBlY3QobW9jay5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7IHRlc3Q6ICdkYXRhJyB9KTsKCQl9KTsKCQlpdCgnd2lsbCB1c2UgYXJnU2VsZWN0IHdpdGggbXVsdGlwbGUgaW5kZXhlcyB0byBmaWx0ZXIgbmFtZWQgYXJncycsIGFzeW5jICgpID0+IHsKCQkJY29uc3QgbW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ2ZpcnN0JywgJ3NlY29uZCcsICd0aGlyZCcpLmFyZ1NlbGVjdCgwLCAyKSk7CgoJCQltb2NrKCd2YWx1ZTEnLCAndmFsdWUyJywgJ3ZhbHVlMycpOwoKCQkJLy8gT25seSBmaXJzdCBhbmQgdGhpcmQgYXJlIGNhcHR1cmVkCgkJCWV4cGVjdChtb2NrLmNhbGxzKDApKS50by5kZWVwLmVxdWFsKHsKCQkJCWZpcnN0OiAndmFsdWUxJywKCQkJCXRoaXJkOiAndmFsdWUzJwoJCQl9KTsKCQl9KTsKCQlpdCgnd2lsbCBkZWVwIGNsb25lIGFyZ3VtZW50cyB0byBwcmV2ZW50IG11dGF0aW9uJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBtb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnZGF0YScpKTsKCgkJCWNvbnN0IG9iaiA9IHsgbmVzdGVkOiB7IHZhbHVlOiAnb3JpZ2luYWwnIH0gfTsKCQkJbW9jayhvYmopOwoKCQkJLy8gTXV0YXRlIHRoZSBvcmlnaW5hbAoJCQlvYmoubmVzdGVkLnZhbHVlID0gJ211dGF0ZWQnOwoKCQkJLy8gU3RvcmVkIGNhbGwgc2hvdWxkIGJlIHVuY2hhbmdlZAoJCQlleHBlY3QobW9jay5jYWxscygwKS5kYXRhLm5lc3RlZC52YWx1ZSkudG8uZXF1YWwoJ29yaWdpbmFsJyk7CgkJfSk7CgkJaXQoJ3dpbGwgcmVzZXQgZnVuY3Rpb24gc3RhdGUgaW5jbHVkaW5nIGNhbGxzLCByZXR1cm5zIGFuZCBkYXRhJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBtb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmZ1bmN0aW9uKChjb250ZXh0KSA9PiB7CgkJCQljb250ZXh0LnN0YXRlLmRhdGEuY291bnRlciA9IChjb250ZXh0LnN0YXRlLmRhdGEuY291bnRlciB8fCAwKSArIDE7CgkJCQlyZXR1cm4gY29udGV4dC5yZXQ7CgkJCX0pLmFyZ3MoJ2FyZycpKTsKCQkJbW9jay5yZXQoJ3Rlc3QtcmV0Jyk7CgoJCQltb2NrKCdjYWxsMScpOwoJCQltb2NrKCdjYWxsMicpOwoKCQkJZXhwZWN0KG1vY2suY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDIpOwoJCQlleHBlY3QobW9jay5kYXRhKCdjb3VudGVyJykpLnRvLmVxdWFsKDIpOwoKCQkJbW9jay5yZXNldCgpOwoKCQkJZXhwZWN0KG1vY2suY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDApOwoJCQlleHBlY3QobW9jaygnY2FsbDMnKSkudG8uZXF1YWwodW5kZWZpbmVkKTsgLy8gUmV0dXJuIHZhbHVlcyBjbGVhcmVkCgkJCWV4cGVjdChtb2NrLmRhdGEoJ2NvdW50ZXInKSkudG8uZXF1YWwoMSk7IC8vIFJlc3RhcnRlZCBmcm9tIHNjcmF0Y2gKCQkJZXhwZWN0KG1vY2suZGF0YSgpKS50by5kZWVwLmVxdWFsKHsgY291bnRlcjogMSB9KTsKCQl9KTsKCQlpdCgnd2lsbCBwcm92aWRlIGNvbnRleHQgd2l0aCBjYWxsLCBhcmdzLCByZXQsIHN0YXRlIGFuZCBkYXRhJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBtb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmZ1bmN0aW9uKChjb250ZXh0KSA9PiB7CgkJCQljb250ZXh0LnN0YXRlLmRhdGEuYWxsSXRlbXMgPSBjb250ZXh0LnN0YXRlLmRhdGEuYWxsSXRlbXMgfHwgW107CgkJCQljb250ZXh0LnN0YXRlLmRhdGEuYWxsSXRlbXMucHVzaCguLi5jb250ZXh0LmFyZ3MuaXRlbXMpOwoJCQkJcmV0dXJuIHsKCQkJCQljYWxsOiBjb250ZXh0LmNhbGwsCgkJCQkJYXJnczogY29udGV4dC5hcmdzLAoJCQkJCXJldDogY29udGV4dC5yZXQsCgkJCQkJaGFzU3RhdGU6IHR5cGVvZiBjb250ZXh0LnN0YXRlID09PSAnb2JqZWN0JywKCQkJCQloYXNEYXRhOiB0eXBlb2YgY29udGV4dC5zdGF0ZS5kYXRhID09PSAnb2JqZWN0JwoJCQkJfTsKCQkJfSkuYXJncygnaXRlbXMnKSk7CgkJCW1vY2sucmV0KCdjdXN0b20tcmV0Jyk7CgoJCQljb25zdCByZXN1bHQgPSBtb2NrKFsnYScsICdiJ10pOwoKCQkJZXhwZWN0KHJlc3VsdC5jYWxsKS50by5lcXVhbCgxKTsKCQkJZXhwZWN0KHJlc3VsdC5hcmdzKS50by5kZWVwLmVxdWFsKHsgaXRlbXM6IFsnYScsICdiJ10gfSk7CgkJCWV4cGVjdChyZXN1bHQucmV0KS50by5lcXVhbCgnY3VzdG9tLXJldCcpOwoJCQlleHBlY3QocmVzdWx0Lmhhc1N0YXRlKS50by5lcXVhbCh0cnVlKTsKCQkJZXhwZWN0KHJlc3VsdC5oYXNEYXRhKS50by5lcXVhbCh0cnVlKTsKCgkJCS8vIERhdGEgYWNjdW11bGF0ZXMgYWNyb3NzIGNhbGxzCgkJCW1vY2soWydjJ10pOwoJCQlleHBlY3QobW9jay5kYXRhKCdhbGxJdGVtcycpKS50by5kZWVwLmVxdWFsKFsnYScsICdiJywgJ2MnXSk7CgkJfSk7Cgl9KTsKCglkZXNjcmliZSgnb2JqZWN0JywgKCkgPT4gewoJCWl0KCd3aWxsIGJlIG9iamVjdCB3aXRoIGZ1bmN0aW9uJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBtb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5Lm9iamVjdCh7CgkJCQlydW46IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnZmlyc3RBcmcnKQoJCQl9KSk7CgoJCQltb2NrLnJ1bi5yZXQoJ3Rlc3RSZXQnKTsKCQkJZXhwZWN0KG1vY2sucnVuKCd0ZXN0QXJnJykpLnRvLmVxdWFsKCd0ZXN0UmV0Jyk7CgkJCWV4cGVjdChtb2NrLnJ1bi5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7IGZpcnN0QXJnOiAndGVzdEFyZycgfSk7CgkJCWV4cGVjdChtb2NrLnJ1bi5jYWxscygpLmxlbmd0aCkudG8uZXF1YWwoMSk7CgkJfSk7CgkJaXQoJ3dpbGwgYmUgb2JqZWN0IHdpdGggbmVzdGVkIG9iamVjdCBhbmQgZnVuY3Rpb24nLCBhc3luYyAoKSA9PiB7CgkJCWNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kub2JqZWN0KHsKCQkJCXN1YjogbW9ja3kub2JqZWN0KHsKCQkJCQlydW46IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnZmlyc3RBcmcnKQoJCQkJfSkKCQkJfSkpOwoJCQltb2NrLnN1Yi5ydW4ucmV0KCd0ZXN0UmV0Jyk7CgoJCQlleHBlY3QobW9jay5zdWIucnVuKCd0ZXN0QXJnJykpLnRvLmVxdWFsKCd0ZXN0UmV0Jyk7CgkJCWV4cGVjdChtb2NrLnN1Yi5ydW4uY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoeyBmaXJzdEFyZzogJ3Rlc3RBcmcnIH0pOwoJCQlleHBlY3QobW9jay5zdWIucnVuLmNhbGxzKCkubGVuZ3RoKS50by5lcXVhbCgxKTsKCQl9KTsKCQlpdCgnd2lsbCByZXNldCBhbGwgbmVzdGVkIG1vY2tzIHdoZW4gb2JqZWN0IGlzIHJlc2V0JywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBtb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5Lm9iamVjdCh7CgkJCQltZXRob2QxOiBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ2FyZycpLAoJCQkJbmVzdGVkOiBtb2NreS5vYmplY3QoewoJCQkJCW1ldGhvZDI6IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnYXJnJykKCQkJCX0pCgkJCX0pKTsKCgkJCW1vY2subWV0aG9kMS5yZXQoJ3JldDEnKTsKCQkJbW9jay5uZXN0ZWQubWV0aG9kMi5yZXQoJ3JldDInKTsKCgkJCW1vY2subWV0aG9kMSgnY2FsbDEnKTsKCQkJbW9jay5uZXN0ZWQubWV0aG9kMignY2FsbDInKTsKCgkJCWV4cGVjdChtb2NrLm1ldGhvZDEuY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDEpOwoJCQlleHBlY3QobW9jay5uZXN0ZWQubWV0aG9kMi5jYWxscygpLmxlbmd0aCkudG8uZXF1YWwoMSk7CgoJCQkvLyBSZXNldCBzaG91bGQgcHJvcGFnYXRlIHRvIGFsbCBuZXN0ZWQgbW9ja3MKCQkJbW9jay5yZXNldCgpOwoKCQkJZXhwZWN0KG1vY2subWV0aG9kMS5jYWxscygpLmxlbmd0aCkudG8uZXF1YWwoMCk7CgkJCWV4cGVjdChtb2NrLm5lc3RlZC5tZXRob2QyLmNhbGxzKCkubGVuZ3RoKS50by5lcXVhbCgwKTsKCQkJZXhwZWN0KG1vY2subWV0aG9kMSgndGVzdCcpKS50by5lcXVhbCh1bmRlZmluZWQpOwoJCQlleHBlY3QobW9jay5uZXN0ZWQubWV0aG9kMigndGVzdCcpKS50by5lcXVhbCh1bmRlZmluZWQpOwoJCX0pOwoJCWl0KCd3aWxsIGJlIG9iamVjdCB3aXRoIHByb3BlcnR5IGdldHRlciBhbmQgc2V0dGVyJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBtb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5Lm9iamVjdCh7CgkJCQlhY2Nlc3NvcjogbW9ja3kucHJvcGVydHkoKQoJCQl9KSk7CgoJCQkvLyBJbml0aWFsIHZhbHVlIHNob3VsZCBiZSB1bmRlZmluZWQKCQkJZXhwZWN0KG1vY2suYWNjZXNzb3IpLnRvLmVxdWFsKHVuZGVmaW5lZCk7CgoJCQkvLyBTZXQgYSB2YWx1ZQoJCQltb2NrLmFjY2Vzc29yID0gJ3Rlc3RWYWx1ZSc7CgkJCWV4cGVjdChtb2NrLmFjY2Vzc29yKS50by5lcXVhbCgndGVzdFZhbHVlJyk7CgoJCQkvLyBDaGFuZ2UgdGhlIHZhbHVlCgkJCW1vY2suYWNjZXNzb3IgPSAnbmV3VmFsdWUnOwoJCQlleHBlY3QobW9jay5hY2Nlc3NvcikudG8uZXF1YWwoJ25ld1ZhbHVlJyk7CgkJfSk7CgkJaXQoJ3dpbGwgcmVzZXQgYWxsIHByb3BlcnR5IHR5cGVzIHRvIGluaXRpYWwgdmFsdWVzJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBtb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5Lm9iamVjdCh7CgkJCQljb3VudGVyOiA0MiwKCQkJCW5hbWU6ICdBbGljZScsCgkJCQltZXRob2Q6IG1vY2t5LmZ1bmN0aW9uKCksCgkJCQlhY2Nlc3NvcjogbW9ja3kucHJvcGVydHkoKQoJCQl9KSk7CgoJCQkvLyBNb2RpZnkgYWxsIHByb3BlcnRpZXMKCQkJbW9jay5jb3VudGVyID0gMTAwOwoJCQltb2NrLm5hbWUgPSAnQm9iJzsKCQkJbW9jay5tZXRob2QucmV0KCd0ZXN0Jyk7CgkJCW1vY2subWV0aG9kKCk7CgkJCW1vY2suYWNjZXNzb3IgPSAndmFsdWUnOwoKCQkJLy8gQWRkIGR5bmFtaWMgcHJvcGVydHkKCQkJbW9jay5hZGRlZCA9ICduZXcnOwoKCQkJbW9jay5yZXNldCgpOwoKCQkJLy8gUGxhaW4gdmFsdWVzIHJlc2V0CgkJCWV4cGVjdChtb2NrLmNvdW50ZXIpLnRvLmVxdWFsKDQyKTsKCQkJZXhwZWN0KG1vY2submFtZSkudG8uZXF1YWwoJ0FsaWNlJyk7CgoJCQkvLyBNZXRob2RzIHJlc2V0CgkJCWV4cGVjdChtb2NrLm1ldGhvZC5jYWxscygpLmxlbmd0aCkudG8uZXF1YWwoMCk7CgoJCQkvLyBtb2NreS5wcm9wZXJ0eSgpIHJlc2V0cyB0byB1bmRlZmluZWQKCQkJZXhwZWN0KG1vY2suYWNjZXNzb3IpLnRvLmVxdWFsKHVuZGVmaW5lZCk7CgoJCQkvLyBEeW5hbWljIHByb3BlcnRpZXMgZGVsZXRlZAoJCQlleHBlY3QobW9jay5hZGRlZCkudG8uZXF1YWwodW5kZWZpbmVkKTsKCQkJZXhwZWN0KCdhZGRlZCcgaW4gbW9jaykudG8uZXF1YWwoZmFsc2UpOwoJCX0pOwoJCWl0KCd3aWxsIHN1cHBvcnQgU3ltYm9sIHByb3BlcnRpZXMgYW5kIHJlc2V0IHRoZW0gY29ycmVjdGx5JywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBjdXN0b21TeW1ib2wgPSBTeW1ib2woJ2N1c3RvbScpOwoJCQljb25zdCBhZGRlZFN5bWJvbCA9IFN5bWJvbCgnYWRkZWQnKTsKCgkJCWNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kub2JqZWN0KHsKCQkJCVtTeW1ib2wuaXRlcmF0b3JdOiBtb2NreS5mdW5jdGlvbigpLAoJCQkJW2N1c3RvbVN5bWJvbF06ICdpbml0aWFsVmFsdWUnCgkJCX0pKTsKCgkJCS8vIFZlcmlmeSBTeW1ib2wgcHJvcGVydGllcyB3b3JrCgkJCWV4cGVjdCh0eXBlb2YgbW9ja1tTeW1ib2wuaXRlcmF0b3JdKS50by5lcXVhbCgnZnVuY3Rpb24nKTsKCQkJZXhwZWN0KG1vY2tbY3VzdG9tU3ltYm9sXSkudG8uZXF1YWwoJ2luaXRpYWxWYWx1ZScpOwoKCQkJLy8gQ29uZmlndXJlIGFuZCB1c2UgU3ltYm9sIGZ1bmN0aW9uCgkJCW1vY2tbU3ltYm9sLml0ZXJhdG9yXS5yZXQoJ2l0ZXJhdG9yUmVzdWx0Jyk7CgkJCWV4cGVjdChtb2NrW1N5bWJvbC5pdGVyYXRvcl0oKSkudG8uZXF1YWwoJ2l0ZXJhdG9yUmVzdWx0Jyk7CgkJCWV4cGVjdChtb2NrW1N5bWJvbC5pdGVyYXRvcl0uY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDEpOwoKCQkJLy8gTW9kaWZ5IFN5bWJvbCB2YWx1ZSBhbmQgYWRkIGR5bmFtaWMgU3ltYm9sCgkJCW1vY2tbY3VzdG9tU3ltYm9sXSA9ICdtb2RpZmllZFZhbHVlJzsKCQkJbW9ja1thZGRlZFN5bWJvbF0gPSAnYWRkZWQnOwoKCQkJLy8gUmVzZXQKCQkJbW9jay5yZXNldCgpOwoKCQkJLy8gU3ltYm9sIGZ1bmN0aW9uIG1vY2sgd2FzIHJlc2V0CgkJCWV4cGVjdChtb2NrW1N5bWJvbC5pdGVyYXRvcl0uY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDApOwoJCQlleHBlY3QobW9ja1tTeW1ib2wuaXRlcmF0b3JdKCkpLnRvLmVxdWFsKHVuZGVmaW5lZCk7CgoJCQkvLyBTeW1ib2wgcGxhaW4gcHJvcGVydHkgd2FzIHJlc3RvcmVkCgkJCWV4cGVjdChtb2NrW2N1c3RvbVN5bWJvbF0pLnRvLmVxdWFsKCdpbml0aWFsVmFsdWUnKTsKCgkJCS8vIER5bmFtaWMgU3ltYm9sIHByb3BlcnR5IHdhcyBkZWxldGVkCgkJCWV4cGVjdChtb2NrW2FkZGVkU3ltYm9sXSkudG8uZXF1YWwodW5kZWZpbmVkKTsKCQkJZXhwZWN0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMobW9jaykuaW5jbHVkZXMoYWRkZWRTeW1ib2wpKS50by5lcXVhbChmYWxzZSk7CgkJfSk7CgkJaXQoJ3dpbGwgaGFuZGxlIG51bGwgYW5kIHVuZGVmaW5lZCBwcm9wZXJ0eSB2YWx1ZXMnLCBhc3luYyAoKSA9PiB7CgkJCWNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kub2JqZWN0KHsKCQkJCW51bGxQcm9wOiBudWxsLAoJCQkJdW5kZWZpbmVkUHJvcDogdW5kZWZpbmVkLAoJCQkJemVyb1Byb3A6IDAsCgkJCQlmYWxzZVByb3A6IGZhbHNlLAoJCQkJZW1wdHlTdHJpbmdQcm9wOiAnJwoJCQl9KSk7CgoJCQkvLyBWZXJpZnkgaW5pdGlhbCB2YWx1ZXMKCQkJZXhwZWN0KG1vY2subnVsbFByb3ApLnRvLmVxdWFsKG51bGwpOwoJCQlleHBlY3QobW9jay51bmRlZmluZWRQcm9wKS50by5lcXVhbCh1bmRlZmluZWQpOwoJCQlleHBlY3QobW9jay56ZXJvUHJvcCkudG8uZXF1YWwoMCk7CgkJCWV4cGVjdChtb2NrLmZhbHNlUHJvcCkudG8uZXF1YWwoZmFsc2UpOwoJCQlleHBlY3QobW9jay5lbXB0eVN0cmluZ1Byb3ApLnRvLmVxdWFsKCcnKTsKCgkJCS8vIE1vZGlmeSB2YWx1ZXMKCQkJbW9jay5udWxsUHJvcCA9ICdjaGFuZ2VkJzsKCQkJbW9jay51bmRlZmluZWRQcm9wID0gJ2NoYW5nZWQnOwoJCQltb2NrLnplcm9Qcm9wID0gMTAwOwoJCQltb2NrLmZhbHNlUHJvcCA9IHRydWU7CgkJCW1vY2suZW1wdHlTdHJpbmdQcm9wID0gJ2NoYW5nZWQnOwoKCQkJLy8gUmVzZXQKCQkJbW9jay5yZXNldCgpOwoKCQkJLy8gVmVyaWZ5IHJlc3RvcmVkIHRvIGluaXRpYWwgdmFsdWVzCgkJCWV4cGVjdChtb2NrLm51bGxQcm9wKS50by5lcXVhbChudWxsKTsKCQkJZXhwZWN0KG1vY2sudW5kZWZpbmVkUHJvcCkudG8uZXF1YWwodW5kZWZpbmVkKTsKCQkJZXhwZWN0KG1vY2suemVyb1Byb3ApLnRvLmVxdWFsKDApOwoJCQlleHBlY3QobW9jay5mYWxzZVByb3ApLnRvLmVxdWFsKGZhbHNlKTsKCQkJZXhwZWN0KG1vY2suZW1wdHlTdHJpbmdQcm9wKS50by5lcXVhbCgnJyk7CgkJfSk7Cgl9KTsKCglkZXNjcmliZSgnY2xhc3MnLCAoKSA9PiB7CgkJaXQoJ3dpbGwgYmUgY2xhc3Mgd2l0aCBjb25zdHJ1Y3RvciBhbmQgbWV0aG9kJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBNb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKCQkJCWNvbnN0cnVjdG9yOiBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ2luaXRBcmcnKSwKCQkJCXJ1bjogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCdmaXJzdEFyZycpCgkJCX0pKTsKCQkJTW9jay5pbnN0KCkucnVuLnJldCgndGVzdFJldCcpOwoKCQkJY29uc3QgbW9ja0luc3RhbmNlID0gbmV3IE1vY2soJ3Rlc3RPcHRpb24nKTsKCQkJZXhwZWN0KE1vY2suaW5zdCgpLmNvbnN0cnVjdG9yLmNhbGxzKDApKS50by5kZWVwLmVxdWFsKHsgaW5pdEFyZzogJ3Rlc3RPcHRpb24nIH0pOwoJCQlleHBlY3QoTW9jay5pbnN0KCkuY29uc3RydWN0b3IuY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDEpOwoKCQkJZXhwZWN0KG1vY2tJbnN0YW5jZS5ydW4oJ3Rlc3RBcmcnKSkudG8uZXF1YWwoJ3Rlc3RSZXQnKTsKCQkJZXhwZWN0KE1vY2suaW5zdCgpLnJ1bi5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7IGZpcnN0QXJnOiAndGVzdEFyZycgfSk7CgkJCWV4cGVjdChNb2NrLmluc3QoKS5ydW4uY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDEpOwoJCX0pOwoKCQlpdCgnd2lsbCBiZSBjbGFzcyB3aXRoIGNvbnN0cnVjdG9yIGFuZCBidWlsZGVyIG1ldGhvZHMnLCBhc3luYyAoKSA9PiB7CgkJCWNvbnN0IE1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuY2xhc3MoewoJCQkJaW5kZXg6IG1vY2t5LmZ1bmN0aW9uKChjb250ZXh0KSA9PiB7CgkJCQkJcmV0dXJuIGNvbnRleHQuc2VsZjsKCQkJCX0pLmFyZ3MoJ2luZGV4JyksCgkJCQluYW1lc3BhY2U6IG1vY2t5LmZ1bmN0aW9uKChjb250ZXh0KSA9PiB7CgkJCQkJcmV0dXJuIGNvbnRleHQuc2VsZjsKCQkJCX0pLmFyZ3MoJ25hbWVzcGFjZScpLAoJCQkJcXVlcnk6IG1vY2t5LmZ1bmN0aW9uKChjb250ZXh0KSA9PiB7CgkJCQkJcmV0dXJuIGNvbnRleHQuc2VsZjsKCQkJCX0pLmFyZ3MoJ3F1ZXJ5JykKCQkJfSkpOwoKCQkJY29uc3QgbW9ja0luc3RhbmNlID0gbmV3IE1vY2soKTsKCQkJbW9ja0luc3RhbmNlLmluZGV4KCd0ZXN0LWluZGV4JykubmFtZXNwYWNlKCd0ZXN0LW5hbWVzcGFjZScpLnF1ZXJ5KHsgdGVzdDogJ3F1ZXJ5JyB9KTsKCQkJZXhwZWN0KE1vY2suaW5zdCgpLmluZGV4LmNhbGxzKDApKS50by5kZWVwLmVxdWFsKHsgaW5kZXg6ICd0ZXN0LWluZGV4JyB9KTsKCQkJZXhwZWN0KE1vY2suaW5zdCgpLmluZGV4LmNhbGxzKCkubGVuZ3RoKS50by5lcXVhbCgxKTsKCQkJZXhwZWN0KE1vY2suaW5zdCgpLm5hbWVzcGFjZS5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7IG5hbWVzcGFjZTogJ3Rlc3QtbmFtZXNwYWNlJyB9KTsKCQkJZXhwZWN0KE1vY2suaW5zdCgpLm5hbWVzcGFjZS5jYWxscygpLmxlbmd0aCkudG8uZXF1YWwoMSk7CgkJCWV4cGVjdChNb2NrLmluc3QoKS5xdWVyeS5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7IHF1ZXJ5OiB7IHRlc3Q6ICdxdWVyeScgfSB9KTsKCQkJZXhwZWN0KE1vY2suaW5zdCgpLnF1ZXJ5LmNhbGxzKCkubGVuZ3RoKS50by5lcXVhbCgxKTsKCQl9KTsKCgkJaXQoJ3dpbGwgZGVtb25zdHJhdGUgdGhhdCBzdGF0ZS5kYXRhIGlzIHBlci1tZXRob2QsIG5vdCBzaGFyZWQnLCBhc3luYyAoKSA9PiB7CgkJCWNvbnN0IENvdW50ZXIgPSBtb2NreS5jcmVhdGUobW9ja3kuY2xhc3MoewoJCQkJY29uc3RydWN0b3I6IG1vY2t5LmZ1bmN0aW9uKChjb250ZXh0KSA9PiB7CgkJCQkJLy8gc3RhdGUuZGF0YSBoZXJlIGlzIHNlcGFyYXRlIGZyb20gb3RoZXIgbWV0aG9kcwoJCQkJCWNvbnRleHQuc3RhdGUuZGF0YS5jb25zdHJ1Y3RvckRhdGEgPSAnc2V0IGluIGNvbnN0cnVjdG9yJzsKCQkJCX0pLmFyZ3MoJ3N0YXJ0VmFsdWUnKSwKCQkJCWdldENvbnN0cnVjdG9yRGF0YTogbW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKCQkJCQkvLyBUaGlzIHN0YXRlLmRhdGEgaXMgZGlmZmVyZW50IGZyb20gY29uc3RydWN0b3IncyBzdGF0ZS5kYXRhCgkJCQkJcmV0dXJuIGNvbnRleHQuc3RhdGUuZGF0YS5jb25zdHJ1Y3RvckRhdGE7IC8vIFdpbGwgYmUgdW5kZWZpbmVkCgkJCQl9KQoJCQl9KSk7CgoJCQljb25zdCBjb3VudGVyID0gbmV3IENvdW50ZXIoMTApOwoJCQkvLyBUaGlzIHdpbGwgYmUgdW5kZWZpbmVkIGJlY2F1c2UgZWFjaCBtZXRob2QgaGFzIGl0cyBvd24gc3RhdGUuZGF0YQoJCQlleHBlY3QoY291bnRlci5nZXRDb25zdHJ1Y3RvckRhdGEoKSkudG8uZXF1YWwodW5kZWZpbmVkKTsKCQl9KTsKCgkJaXQoJ3dpbGwgc3RvcmUgZGF0YSBvbiBpbnN0YW5jZSB2aWEgY29udGV4dC5zZWxmIGluIGNvbnN0cnVjdG9yJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBDb3VudGVyID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKCQkJCWNvbnN0cnVjdG9yOiBtb2NreS5mdW5jdGlvbigoY29udGV4dCkgPT4gewoJCQkJCS8vIFN0b3JlIGRhdGEgZGlyZWN0bHkgb24gdGhlIGluc3RhbmNlCgkJCQkJY29udGV4dC5zZWxmLl9jb3VudCA9IGNvbnRleHQuYXJncy5zdGFydFZhbHVlIHx8IDA7CgkJCQkJY29udGV4dC5zZWxmLl9pbml0aWFsaXplZCA9IHRydWU7CgkJCQl9KS5hcmdzKCdzdGFydFZhbHVlJyksCgkJCQlpbmNyZW1lbnQ6IG1vY2t5LmZ1bmN0aW9uKChjb250ZXh0KSA9PiB7CgkJCQkJY29udGV4dC5zZWxmLl9jb3VudCsrOwoJCQkJCXJldHVybiBjb250ZXh0LnNlbGYuX2NvdW50OwoJCQkJfSksCgkJCQlnZXRDb3VudDogbW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKCQkJCQlyZXR1cm4gY29udGV4dC5zZWxmLl9jb3VudDsKCQkJCX0pLAoJCQkJaXNJbml0aWFsaXplZDogbW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKCQkJCQlyZXR1cm4gY29udGV4dC5zZWxmLl9pbml0aWFsaXplZDsKCQkJCX0pCgkJCX0pKTsKCgkJCWNvbnN0IGNvdW50ZXIxID0gbmV3IENvdW50ZXIoMTApOwoJCQlleHBlY3QoY291bnRlcjEuX2luaXRpYWxpemVkKS50by5lcXVhbCh0cnVlKTsKCQkJZXhwZWN0KGNvdW50ZXIxLmlzSW5pdGlhbGl6ZWQoKSkudG8uZXF1YWwodHJ1ZSk7CgkJCWV4cGVjdChjb3VudGVyMS5nZXRDb3VudCgpKS50by5lcXVhbCgxMCk7CgkJCWV4cGVjdChjb3VudGVyMS5pbmNyZW1lbnQoKSkudG8uZXF1YWwoMTEpOwoJCQlleHBlY3QoY291bnRlcjEuaW5jcmVtZW50KCkpLnRvLmVxdWFsKDEyKTsKCQkJZXhwZWN0KGNvdW50ZXIxLmdldENvdW50KCkpLnRvLmVxdWFsKDEyKTsKCgkJCS8vIFNlY29uZCBpbnN0YW5jZSBzaG91bGQgaGF2ZSBzZXBhcmF0ZSBkYXRhCgkJCWNvbnN0IGNvdW50ZXIyID0gbmV3IENvdW50ZXIoNSk7CgkJCWV4cGVjdChjb3VudGVyMi5nZXRDb3VudCgpKS50by5lcXVhbCg1KTsKCQkJZXhwZWN0KGNvdW50ZXIyLmluY3JlbWVudCgpKS50by5lcXVhbCg2KTsKCgkJCS8vIEZpcnN0IGluc3RhbmNlIHNob3VsZCBiZSB1bmFmZmVjdGVkCgkJCWV4cGVjdChjb3VudGVyMS5nZXRDb3VudCgpKS50by5lcXVhbCgxMik7CgkJfSk7CgoJCWl0KCd3aWxsIHRyYWNrIG51bWJlciBvZiBpbnN0YW5jZXMgY3JlYXRlZCB3aXRoIG51bUluc3RzJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBNb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKCQkJCWNvbnN0cnVjdG9yOiBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ3ZhbHVlJykKCQkJfSkpOwoKCQkJZXhwZWN0KE1vY2subnVtSW5zdHMoKSkudG8uZXF1YWwoMCk7CgoJCQljb25zdCBpbnN0MSA9IG5ldyBNb2NrKCdmaXJzdCcpOwoJCQlleHBlY3QoTW9jay5udW1JbnN0cygpKS50by5lcXVhbCgxKTsKCgkJCWNvbnN0IGluc3QyID0gbmV3IE1vY2soJ3NlY29uZCcpOwoJCQlleHBlY3QoTW9jay5udW1JbnN0cygpKS50by5lcXVhbCgyKTsKCgkJCWNvbnN0IGluc3QzID0gbmV3IE1vY2soJ3RoaXJkJyk7CgkJCWV4cGVjdChNb2NrLm51bUluc3RzKCkpLnRvLmVxdWFsKDMpOwoJCX0pOwoKCQlpdCgnd2lsbCByZXNldCBhbGwgaW5zdGFuY2VzIGFuZCBjb3VudGVycycsIGFzeW5jICgpID0+IHsKCQkJY29uc3QgTW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5jbGFzcyh7CgkJCQljb25zdHJ1Y3RvcjogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCd2YWx1ZScpLAoJCQkJcnVuOiBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ2FyZycpCgkJCX0pKTsKCgkJCU1vY2suaW5zdCgwKS5ydW4ucmV0KCdmaXJzdC1yZXQnKTsKCQkJTW9jay5pbnN0KDEpLnJ1bi5yZXQoJ3NlY29uZC1yZXQnKTsKCgkJCWNvbnN0IGluc3QxID0gbmV3IE1vY2soJ2ZpcnN0Jyk7CgkJCWNvbnN0IGluc3QyID0gbmV3IE1vY2soJ3NlY29uZCcpOwoKCQkJZXhwZWN0KGluc3QxLnJ1bigndGVzdCcpKS50by5lcXVhbCgnZmlyc3QtcmV0Jyk7CgkJCWV4cGVjdChpbnN0Mi5ydW4oJ3Rlc3QnKSkudG8uZXF1YWwoJ3NlY29uZC1yZXQnKTsKCQkJZXhwZWN0KE1vY2subnVtSW5zdHMoKSkudG8uZXF1YWwoMik7CgkJCWV4cGVjdChNb2NrLmluc3QoMCkucnVuLmNhbGxzKCkubGVuZ3RoKS50by5lcXVhbCgxKTsKCgkJCS8vIFJlc2V0IHNob3VsZCBjbGVhciBldmVyeXRoaW5nCgkJCU1vY2sucmVzZXQoKTsKCgkJCWV4cGVjdChNb2NrLm51bUluc3RzKCkpLnRvLmVxdWFsKDApOwoKCQkJLy8gQWZ0ZXIgcmVzZXQsIG5ldyBpbnN0YW5jZXMgc3RhcnQgZnJvbSBpbmRleCAwIGFnYWluCgkJCWNvbnN0IGluc3QzID0gbmV3IE1vY2soJ3RoaXJkJyk7CgkJCWV4cGVjdChNb2NrLm51bUluc3RzKCkpLnRvLmVxdWFsKDEpOwoJCQkvLyBSZXR1cm5zIHNob3VsZCBiZSBjbGVhcmVkCgkJCWV4cGVjdChpbnN0My5ydW4oJ3Rlc3QnKSkudG8uZXF1YWwodW5kZWZpbmVkKTsKCQkJLy8gQ2FsbHMgc2hvdWxkIGJlIGNsZWFyZWQKCQkJZXhwZWN0KE1vY2suaW5zdCgwKS5ydW4uY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDEpOyAvLyBKdXN0IHRoaXMgb25lIGNhbGwKCQl9KTsKCgkJaXQoJ3dpbGwgcmVzZXQgcGxhaW4gdmFsdWUgcHJvcGVydGllcyB0byBpbml0aWFsIHZhbHVlcycsIGFzeW5jICgpID0+IHsKCQkJY29uc3QgTW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5jbGFzcyh7CgkJCQluYW1lOiBudWxsLAoJCQkJY291bnQ6IDAKCQkJfSkpOwoKCQkJLy8gQ3JlYXRlIGFuZCBtb2RpZnkgaW5zdGFuY2VzCgkJCWNvbnN0IGluc3QxID0gbmV3IE1vY2soKTsKCQkJaW5zdDEubmFtZSA9ICdmaXJzdCc7CgkJCWluc3QxLmNvdW50ID0gMTA7CgoJCQljb25zdCBpbnN0MiA9IG5ldyBNb2NrKCk7CgkJCWluc3QyLm5hbWUgPSAnc2Vjb25kJzsKCQkJaW5zdDIuY291bnQgPSAyMDsKCgkJCWV4cGVjdChNb2NrLm51bUluc3RzKCkpLnRvLmVxdWFsKDIpOwoJCQlleHBlY3QoTW9jay5pbnN0KDApLm5hbWUpLnRvLmVxdWFsKCdmaXJzdCcpOwoJCQlleHBlY3QoTW9jay5pbnN0KDEpLmNvdW50KS50by5lcXVhbCgyMCk7CgoJCQkvLyBSZXNldAoJCQlNb2NrLnJlc2V0KCk7CgoJCQlleHBlY3QoTW9jay5udW1JbnN0cygpKS50by5lcXVhbCgwKTsKCgkJCS8vIEFmdGVyIHJlc2V0LCBkZXNjcmlwdGlvbnMgYXJlIGZyZXNoIHdpdGggaW5pdGlhbCB2YWx1ZXMKCQkJZXhwZWN0KE1vY2suaW5zdCgwKS5uYW1lKS50by5lcXVhbChudWxsKTsKCQkJZXhwZWN0KE1vY2suaW5zdCgwKS5jb3VudCkudG8uZXF1YWwoMCk7CgoJCQkvLyBOZXcgaW5zdGFuY2UgZ2V0cyBpbml0aWFsIHZhbHVlcwoJCQljb25zdCBpbnN0MyA9IG5ldyBNb2NrKCk7CgkJCWV4cGVjdChpbnN0My5uYW1lKS50by5lcXVhbChudWxsKTsKCQkJZXhwZWN0KGluc3QzLmNvdW50KS50by5lcXVhbCgwKTsKCQl9KTsKCgkJaXQoJ3dpbGwgcHJlLWNvbmZpZ3VyZSBpbnN0YW5jZXMgYmVmb3JlIGluc3RhbnRpYXRpb24nLCBhc3luYyAoKSA9PiB7CgkJCWNvbnN0IE1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuY2xhc3MoewoJCQkJcnVuOiBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ2FyZycpCgkJCX0pKTsKCgkJCS8vIENvbmZpZ3VyZSBpbnN0YW5jZXMgYmVmb3JlIHRoZXkncmUgY3JlYXRlZAoJCQlNb2NrLmluc3QoMCkucnVuLnJldCgnZmlyc3QtdmFsdWUnKTsKCQkJTW9jay5pbnN0KDEpLnJ1bi5yZXQoJ3NlY29uZC12YWx1ZScpOwoJCQlNb2NrLmluc3QoMikucnVuLnJldCgndGhpcmQtdmFsdWUnKTsKCgkJCWNvbnN0IGluc3QxID0gbmV3IE1vY2soKTsKCQkJY29uc3QgaW5zdDIgPSBuZXcgTW9jaygpOwoJCQljb25zdCBpbnN0MyA9IG5ldyBNb2NrKCk7CgoJCQlleHBlY3QoaW5zdDEucnVuKCd0ZXN0JykpLnRvLmVxdWFsKCdmaXJzdC12YWx1ZScpOwoJCQlleHBlY3QoaW5zdDIucnVuKCd0ZXN0JykpLnRvLmVxdWFsKCdzZWNvbmQtdmFsdWUnKTsKCQkJZXhwZWN0KGluc3QzLnJ1bigndGVzdCcpKS50by5lcXVhbCgndGhpcmQtdmFsdWUnKTsKCQl9KTsKCgkJaXQoJ3dpbGwgc3VwcG9ydCBhc3luYyBtZXRob2RzJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBNb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKCQkJCWZldGNoRGF0YTogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCdpZCcpLmFzeW5jKCkKCQkJfSkpOwoKCQkJTW9jay5pbnN0KCkuZmV0Y2hEYXRhLnJldCgnYXN5bmMtcmVzdWx0Jyk7CgoJCQljb25zdCBpbnN0ID0gbmV3IE1vY2soKTsKCQkJY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5zdC5mZXRjaERhdGEoJ3Rlc3QtaWQnKTsKCgkJCWV4cGVjdChyZXN1bHQpLnRvLmVxdWFsKCdhc3luYy1yZXN1bHQnKTsKCQkJZXhwZWN0KE1vY2suaW5zdCgpLmZldGNoRGF0YS5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7IGlkOiAndGVzdC1pZCcgfSk7CgkJfSk7CgoJCWl0KCd3aWxsIHRocm93IGVycm9ycyBmcm9tIGNsYXNzIG1ldGhvZHMnLCBhc3luYyAoKSA9PiB7CgkJCWNvbnN0IE1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuY2xhc3MoewoJCQkJdGhyb3dFcnJvcjogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCdtZXNzYWdlJykKCQkJfSkpOwoKCQkJY29uc3QgdGVzdEVycm9yID0gbmV3IEVycm9yKCdUZXN0IGVycm9yJyk7CgkJCU1vY2suaW5zdCgpLnRocm93RXJyb3IucmV0KHRlc3RFcnJvcik7CgoJCQljb25zdCBpbnN0ID0gbmV3IE1vY2soKTsKCgkJCWV4cGVjdCgoKSA9PiBpbnN0LnRocm93RXJyb3IoJ2ZhaWwnKSkudG8udGhyb3coJ1Rlc3QgZXJyb3InKTsKCQkJZXhwZWN0KE1vY2suaW5zdCgpLnRocm93RXJyb3IuY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoeyBtZXNzYWdlOiAnZmFpbCcgfSk7CgkJfSk7CgoJCWl0KCd3aWxsIGhhbmRsZSBvblJldCBoYW5kbGVycyBpbiBjbGFzcyBtZXRob2RzJywgYXN5bmMgKCkgPT4gewoJCQljb25zdCBNb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKCQkJCWNhbGN1bGF0ZTogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCd4JywgJ3knKQoJCQl9KSk7CgoJCQlNb2NrLmluc3QoKS5jYWxjdWxhdGUub25SZXQoKGFyZ3MpID0+IHsKCQkJCXJldHVybiBhcmdzLnggKyBhcmdzLnk7CgkJCX0pOwoKCQkJY29uc3QgaW5zdCA9IG5ldyBNb2NrKCk7CgoJCQlleHBlY3QoaW5zdC5jYWxjdWxhdGUoNSwgMykpLnRvLmVxdWFsKDgpOwoJCQlleHBlY3QoaW5zdC5jYWxjdWxhdGUoMTAsIDIwKSkudG8uZXF1YWwoMzApOwoJCX0pOwoKCQlpdCgnd2lsbCBoYW5kbGUgZGlmZmVyZW50IHJldHVybiB2YWx1ZXMgcGVyIGNhbGwnLCBhc3luYyAoKSA9PiB7CgkJCWNvbnN0IE1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuY2xhc3MoewoJCQkJZ2V0VmFsdWU6IG1vY2t5LmZ1bmN0aW9uKCkKCQkJfSkpOwoKCQkJTW9jay5pbnN0KCkuZ2V0VmFsdWUucmV0KCdkZWZhdWx0Jyk7CgkJCU1vY2suaW5zdCgpLmdldFZhbHVlLnJldCgnZmlyc3QtY2FsbCcsIDEpOwoJCQlNb2NrLmluc3QoKS5nZXRWYWx1ZS5yZXQoJ3NlY29uZC1jYWxsJywgMik7CgoJCQljb25zdCBpbnN0ID0gbmV3IE1vY2soKTsKCgkJCWV4cGVjdChpbnN0LmdldFZhbHVlKCkpLnRvLmVxdWFsKCdmaXJzdC1jYWxsJyk7CgkJCWV4cGVjdChpbnN0LmdldFZhbHVlKCkpLnRvLmVxdWFsKCdzZWNvbmQtY2FsbCcpOwoJCQlleHBlY3QoaW5zdC5nZXRWYWx1ZSgpKS50by5lcXVhbCgnZGVmYXVsdCcpOyAvLyBGYWxscyBiYWNrIHRvIGNhbGwgMAoJCX0pOwoKCQlpdCgnd2lsbCBzdXBwb3J0IGNsYXNzIGluaGVyaXRhbmNlIHdpdGggc3VwZXIgY2FsbHMnLCAoKSA9PiB7CgkJCWNvbnN0IE1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuY2xhc3MoewoJCQkJY29uc3RydWN0b3I6IG1vY2t5LmZ1bmN0aW9uKChjb250ZXh0KSA9PiB7CgkJCQkJY29udGV4dC5zZWxmLm1vY2tJbml0aWFsaXplZCA9IHRydWU7CgkJCQkJY29udGV4dC5zZWxmLm1vY2tWYWx1ZSA9IGNvbnRleHQuYXJncy52YWx1ZTsKCQkJCX0pLmFyZ3MoJ3ZhbHVlJyksCgkJCQlnZXRWYWx1ZTogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCd4JykKCQkJfSkpOwoKCQkJTW9jay5pbnN0KCkuZ2V0VmFsdWUucmV0KCdtb2NrLXZhbHVlJyk7CgoJCQljbGFzcyBDaGlsZCBleHRlbmRzIE1vY2sgewoJCQkJY29uc3RydWN0b3IodmFsdWUpIHsKCQkJCQlzdXBlcih2YWx1ZSk7CgkJCQkJdGhpcy5jaGlsZEluaXRpYWxpemVkID0gdHJ1ZTsKCQkJCQl0aGlzLmNoaWxkVmFsdWUgPSB2YWx1ZSAqIDI7CgkJCQl9CgkJCQlnZXRWYWx1ZSh4KSB7CgkJCQkJY29uc3QgcGFyZW50UmVzdWx0ID0gc3VwZXIuZ2V0VmFsdWUoeCk7CgkJCQkJcmV0dXJuIGBjaGlsZC0ke3BhcmVudFJlc3VsdH1gOwoJCQkJfQoJCQl9CgoJCQljb25zdCBjaGlsZCA9IG5ldyBDaGlsZCgxMCk7CgoJCQkvLyBNb2NrIGNvbnN0cnVjdG9yIHNob3VsZCBoYXZlIHJ1bgoJCQlleHBlY3QoY2hpbGQubW9ja0luaXRpYWxpemVkKS50by5lcXVhbCh0cnVlKTsKCQkJZXhwZWN0KGNoaWxkLm1vY2tWYWx1ZSkudG8uZXF1YWwoMTApOwoJCQlleHBlY3QoTW9jay5pbnN0KCkuY29uc3RydWN0b3IuY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoeyB2YWx1ZTogMTAgfSk7CgoJCQkvLyBDaGlsZCBjb25zdHJ1Y3RvciBzaG91bGQgaGF2ZSBydW4gYWZ0ZXIKCQkJZXhwZWN0KGNoaWxkLmNoaWxkSW5pdGlhbGl6ZWQpLnRvLmVxdWFsKHRydWUpOwoJCQlleHBlY3QoY2hpbGQuY2hpbGRWYWx1ZSkudG8uZXF1YWwoMjApOwoKCQkJLy8gQ2hpbGQncyBvdmVycmlkZGVuIG1ldGhvZCBjYWxscyBzdXBlciBhbmQgd3JhcHMgcmVzdWx0CgkJCWNvbnN0IHJlc3VsdCA9IGNoaWxkLmdldFZhbHVlKCd0ZXN0Jyk7CgkJCWV4cGVjdChyZXN1bHQpLnRvLmVxdWFsKCdjaGlsZC1tb2NrLXZhbHVlJyk7CgkJCWV4cGVjdChNb2NrLmluc3QoKS5nZXRWYWx1ZS5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7IHg6ICd0ZXN0JyB9KTsKCQl9KTsKCgkJaXQoJ3dpbGwgbm90IGV4cG9zZSBfX21vY2t5SW5kZXggaW4gZGVlcCBlcXVhbCBjb21wYXJpc29ucycsICgpID0+IHsKCQkJY29uc3QgTW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5jbGFzcyh7CgkJCQljb25zdHJ1Y3RvcjogbW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKCQkJCQljb250ZXh0LnNlbGYubmFtZSA9IGNvbnRleHQuYXJncy5uYW1lOwoJCQkJfSkuYXJncygnbmFtZScpCgkJCX0pKTsKCgkJCWNvbnN0IGluc3RhbmNlID0gbmV3IE1vY2soJ3Rlc3QnKTsKCgkJCWV4cGVjdChpbnN0YW5jZSkudG8uZGVlcC5lcXVhbCh7IG5hbWU6ICd0ZXN0JyB9KTsKCQl9KTsKCgkJaXQoJ3dpbGwgc3luYyBwbGFpbiB2YWx1ZSBtZW1iZXJzIGJldHdlZW4gaW5zdGFuY2UgYW5kIE1vY2suaW5zdCgpJywgKCkgPT4gewoJCQljb25zdCBNb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKCQkJCW5hbWU6IG51bGwsCgkJCQljb3VudDogMAoJCQl9KSk7CgoJCQljb25zdCBpbnN0ID0gbmV3IE1vY2soKTsKCgkJCS8vIEluaXRpYWwgdmFsdWVzIGZyb20gZGVmaW5pdGlvbgoJCQlleHBlY3QoaW5zdC5uYW1lKS50by5lcXVhbChudWxsKTsKCQkJZXhwZWN0KGluc3QuY291bnQpLnRvLmVxdWFsKDApOwoKCQkJLy8gU2V0dGluZyBvbiBpbnN0YW5jZSBzeW5jcyB0byBNb2NrLmluc3QoKQoJCQlpbnN0Lm5hbWUgPSAndGVzdCc7CgkJCWluc3QuY291bnQgPSA0MjsKCQkJZXhwZWN0KE1vY2suaW5zdCgwKS5uYW1lKS50by5lcXVhbCgndGVzdCcpOwoJCQlleHBlY3QoTW9jay5pbnN0KDApLmNvdW50KS50by5lcXVhbCg0Mik7CgoJCQkvLyBTZXR0aW5nIG9uIE1vY2suaW5zdCgpIHN5bmNzIHRvIGluc3RhbmNlCgkJCU1vY2suaW5zdCgwKS5uYW1lID0gJ2NoYW5nZWQnOwoJCQlleHBlY3QoaW5zdC5uYW1lKS50by5lcXVhbCgnY2hhbmdlZCcpOwoJCX0pOwoKCQlpdCgnd2lsbCBpc29sYXRlIHBsYWluIHZhbHVlIG1lbWJlcnMgYmV0d2VlbiBjbGFzcyBpbnN0YW5jZXMnLCAoKSA9PiB7CgkJCWNvbnN0IE1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuY2xhc3MoewoJCQkJdmFsdWU6IG51bGwKCQkJfSkpOwoKCQkJY29uc3QgaW5zdDEgPSBuZXcgTW9jaygpOwoJCQljb25zdCBpbnN0MiA9IG5ldyBNb2NrKCk7CgoJCQlpbnN0MS52YWx1ZSA9ICdmaXJzdCc7CgkJCWluc3QyLnZhbHVlID0gJ3NlY29uZCc7CgoJCQlleHBlY3QoaW5zdDEudmFsdWUpLnRvLmVxdWFsKCdmaXJzdCcpOwoJCQlleHBlY3QoaW5zdDIudmFsdWUpLnRvLmVxdWFsKCdzZWNvbmQnKTsKCQkJZXhwZWN0KE1vY2suaW5zdCgwKS52YWx1ZSkudG8uZXF1YWwoJ2ZpcnN0Jyk7CgkJCWV4cGVjdChNb2NrLmluc3QoMSkudmFsdWUpLnRvLmVxdWFsKCdzZWNvbmQnKTsKCQl9KTsKCgkJaXQoJ3dpbGwgYWxsb3cgcHJlLWNvbmZpZ3VyaW5nIHBsYWluIHZhbHVlIG1lbWJlcnMgYmVmb3JlIGluc3RhbnRpYXRpb24nLCAoKSA9PiB7CgkJCWNvbnN0IE1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuY2xhc3MoewoJCQkJY29uZmlnOiBudWxsCgkJCX0pKTsKCgkJCS8vIFByZS1jb25maWd1cmUgYmVmb3JlIGluc3RhbnRpYXRpb24KCQkJTW9jay5pbnN0KDApLmNvbmZpZyA9ICdwcmVzZXQtdmFsdWUnOwoKCQkJY29uc3QgaW5zdCA9IG5ldyBNb2NrKCk7CgkJCWV4cGVjdChpbnN0LmNvbmZpZykudG8uZXF1YWwoJ3ByZXNldC12YWx1ZScpOwoJCX0pOwoKCQlpdCgnd2lsbCBzdXBwb3J0IG1peGluZyBwbGFpbiB2YWx1ZXMgYW5kIG1ldGhvZHMgaW4gY2xhc3MnLCAoKSA9PiB7CgkJCWNvbnN0IE1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuY2xhc3MoewoJCQkJbmFtZTogbnVsbCwKCQkJCWdyZWV0OiBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ2dyZWV0aW5nJykKCQkJfSkpOwoKCQkJTW9jay5pbnN0KCkuZ3JlZXQucmV0KCdIZWxsbyEnKTsKCgkJCWNvbnN0IGluc3QgPSBuZXcgTW9jaygpOwoJCQlpbnN0Lm5hbWUgPSAnV29ybGQnOwoKCQkJZXhwZWN0KGluc3QubmFtZSkudG8uZXF1YWwoJ1dvcmxkJyk7CgkJCWV4cGVjdChNb2NrLmluc3QoMCkubmFtZSkudG8uZXF1YWwoJ1dvcmxkJyk7CgkJCWV4cGVjdChpbnN0LmdyZWV0KCdIaScpKS50by5lcXVhbCgnSGVsbG8hJyk7CgkJCWV4cGVjdChNb2NrLmluc3QoKS5ncmVldC5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7IGdyZWV0aW5nOiAnSGknIH0pOwoJCX0pOwoKCQlpdCgnd2lsbCBzdXBwb3J0IG5lc3RlZCBvYmplY3RzIHdpdGggbWV0aG9kcycsICgpID0+IHsKCQkJY29uc3QgTW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5jbGFzcyh7CgkJCQlkYjogbW9ja3kub2JqZWN0KHsKCQkJCQlxdWVyeTogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCdzcWwnKSwKCQkJCQljbG9zZTogbW9ja3kuZnVuY3Rpb24oKQoJCQkJfSkKCQkJfSkpOwoKCQkJTW9jay5pbnN0KDApLmRiLnF1ZXJ5LnJldCh7IHJvd3M6IFsnYScsICdiJ10gfSk7CgkJCU1vY2suaW5zdCgwKS5kYi5jbG9zZS5yZXQodHJ1ZSk7CgoJCQljb25zdCBpbnN0ID0gbmV3IE1vY2soKTsKCgkJCWV4cGVjdChpbnN0LmRiLnF1ZXJ5KCdTRUxFQ1QgKicpKS50by5kZWVwLmVxdWFsKHsgcm93czogWydhJywgJ2InXSB9KTsKCQkJZXhwZWN0KGluc3QuZGIuY2xvc2UoKSkudG8uZXF1YWwodHJ1ZSk7CgkJCWV4cGVjdChNb2NrLmluc3QoMCkuZGIucXVlcnkuY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoeyBzcWw6ICdTRUxFQ1QgKicgfSk7CgkJfSk7Cgl9KTsKCglkZXNjcmliZSgnc3B5JywgKCkgPT4gewoJCWl0KCd3aWxsIHNweSBvbiBtZXRob2QsIGNhbGwgdGhyb3VnaCwgdHJhY2sgY2FsbHMgYW5kIHByZXNlcnZlIHRoaXMnLCAoKSA9PiB7CgkJCWNvbnN0IG9iaiA9IHsKCQkJCXZhbHVlOiA0MiwKCQkJCWdyZWV0OiBmdW5jdGlvbihuYW1lKSB7CgkJCQkJcmV0dXJuIGBIZWxsbywgJHtuYW1lfSFgOwoJCQkJfSwKCQkJCWdldFZhbHVlOiBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gdGhpcy52YWx1ZTsKCQkJCX0KCQkJfTsKCgkJCWNvbnN0IGdyZWV0U3B5ID0gbW9ja3kuc3B5KG9iaiwgJ2dyZWV0Jyk7CgkJCWNvbnN0IHZhbHVlU3B5ID0gbW9ja3kuc3B5KG9iaiwgJ2dldFZhbHVlJyk7CgoJCQkvLyBDYWxscyB0aHJvdWdoIHRvIG9yaWdpbmFsCgkJCWV4cGVjdChvYmouZ3JlZXQoJ1dvcmxkJykpLnRvLmVxdWFsKCdIZWxsbywgV29ybGQhJyk7CgkJCWV4cGVjdChvYmouZ3JlZXQoJ1Rlc3QnKSkudG8uZXF1YWwoJ0hlbGxvLCBUZXN0IScpOwoKCQkJLy8gVHJhY2tzIG11bHRpcGxlIGNhbGxzCgkJCWV4cGVjdChncmVldFNweS5jYWxscygpLmxlbmd0aCkudG8uZXF1YWwoMik7CgkJCWV4cGVjdChncmVldFNweS5jYWxscygwKSkudG8uZGVlcC5lcXVhbChbJ1dvcmxkJ10pOwoJCQlleHBlY3QoZ3JlZXRTcHkuY2FsbHMoMSkpLnRvLmRlZXAuZXF1YWwoWydUZXN0J10pOwoKCQkJLy8gUHJlc2VydmVzIHRoaXMgY29udGV4dAoJCQlleHBlY3Qob2JqLmdldFZhbHVlKCkpLnRvLmVxdWFsKDQyKTsKCQkJZXhwZWN0KHZhbHVlU3B5LmNhbGxzKCkubGVuZ3RoKS50by5lcXVhbCgxKTsKCgkJCWdyZWV0U3B5LnJlc3RvcmUoKTsKCQkJdmFsdWVTcHkucmVzdG9yZSgpOwoJCX0pOwoKCQlpdCgnd2lsbCBvdmVycmlkZSByZXR1cm4gdmFsdWUgd2l0aCByZXQoKSB3aGlsZSBzdGlsbCB0cmFja2luZycsICgpID0+IHsKCQkJY29uc3Qgb2JqID0gewoJCQkJZ2V0VmFsdWU6IGZ1bmN0aW9uKCkgewoJCQkJCXJldHVybiAnb3JpZ2luYWwnOwoJCQkJfQoJCQl9OwoKCQkJY29uc3Qgc3B5ID0gbW9ja3kuc3B5KG9iaiwgJ2dldFZhbHVlJyk7CgkJCXNweS5yZXQoJ292ZXJyaWRkZW4nKTsKCgkJCWNvbnN0IHJlc3VsdCA9IG9iai5nZXRWYWx1ZSgpOwoKCQkJZXhwZWN0KHJlc3VsdCkudG8uZXF1YWwoJ292ZXJyaWRkZW4nKTsKCQkJZXhwZWN0KHNweS5jYWxscygpLmxlbmd0aCkudG8uZXF1YWwoMSk7CgkJfSk7CgoJCWl0KCd3aWxsIHJlc3RvcmUgb3JpZ2luYWwgbWV0aG9kJywgKCkgPT4gewoJCQljb25zdCBvYmogPSB7CgkJCQlkb1RoaW5nOiBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gJ29yaWdpbmFsJzsKCQkJCX0KCQkJfTsKCgkJCWNvbnN0IHNweSA9IG1vY2t5LnNweShvYmosICdkb1RoaW5nJyk7CgkJCXNweS5yZXQoJ3NwaWVkJyk7CgoJCQlleHBlY3Qob2JqLmRvVGhpbmcoKSkudG8uZXF1YWwoJ3NwaWVkJyk7CgoJCQlzcHkucmVzdG9yZSgpOwoKCQkJZXhwZWN0KG9iai5kb1RoaW5nKCkpLnRvLmVxdWFsKCdvcmlnaW5hbCcpOwoJCX0pOwoKCQlpdCgnd2lsbCBzcHkgb24gY2xhc3MgcHJvdG90eXBlIG1ldGhvZCcsICgpID0+IHsKCQkJY2xhc3MgTXlDbGFzcyB7CgkJCQlncmVldChuYW1lKSB7CgkJCQkJcmV0dXJuIGBIZWxsbywgJHtuYW1lfWA7CgkJCQl9CgkJCX0KCgkJCWNvbnN0IHNweSA9IG1vY2t5LnNweShNeUNsYXNzLnByb3RvdHlwZSwgJ2dyZWV0Jyk7CgoJCQljb25zdCBpbnN0YW5jZSA9IG5ldyBNeUNsYXNzKCk7CgkJCWNvbnN0IHJlc3VsdCA9IGluc3RhbmNlLmdyZWV0KCdUZXN0Jyk7CgoJCQlleHBlY3QocmVzdWx0KS50by5lcXVhbCgnSGVsbG8sIFRlc3QnKTsKCQkJZXhwZWN0KHNweS5jYWxscygpLmxlbmd0aCkudG8uZXF1YWwoMSk7CgkJCWV4cGVjdChzcHkuY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoWydUZXN0J10pOwoKCQkJc3B5LnJlc3RvcmUoKTsKCQl9KTsKCgkJaXQoJ3dpbGwgc3B5IHdpdGggcmVwbGFjZW1lbnQgZnVuY3Rpb24gYW5kIHByb3ZpZGUgY29udGV4dC5vcmlnaW5hbCcsICgpID0+IHsKCQkJY29uc3Qgb2JqID0gewoJCQkJYWRkOiBmdW5jdGlvbihhLCBiKSB7CgkJCQkJcmV0dXJuIGEgKyBiOwoJCQkJfQoJCQl9OwoKCQkJLy8gUmVwbGFjZW1lbnQgd2l0aCBhcmdzIGFuZCBjb250ZXh0Lm9yaWdpbmFsCgkJCWNvbnN0IHNweSA9IG1vY2t5LnNweShvYmosICdhZGQnLCBtb2NreS5mdW5jdGlvbigoY29udGV4dCkgPT4gewoJCQkJY29uc3Qgb3JpZ2luYWxSZXN1bHQgPSBjb250ZXh0Lm9yaWdpbmFsLmFwcGx5KGNvbnRleHQuc2VsZiwgY29udGV4dC5yYXdBcmdzKTsKCQkJCXJldHVybiBvcmlnaW5hbFJlc3VsdCAqIDEwOwoJCQl9KS5hcmdzKCd4JywgJ3knKSk7CgoJCQljb25zdCByZXN1bHQgPSBvYmouYWRkKDMsIDQpOwoKCQkJZXhwZWN0KHJlc3VsdCkudG8uZXF1YWwoNzApOyAvLyAoMyArIDQpICogMTAKCQkJZXhwZWN0KHNweS5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7IHg6IDMsIHk6IDQgfSk7CgoJCQlzcHkucmVzdG9yZSgpOwoJCX0pOwoJfSk7Cn0pOwoAAAAAAAAAAMxbAAAAAAAAAAAAAAAAAAAAAAAAmWUAAAAAAAAAAAAAAAAAAAAAAACZZQAAAAAAAAAAAAA",
1013
+ "AwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAMtbAAAAAAAAy1sAAAAAAAAAAAAAAADwvw"
1014
+ ]
1015
+ ]
1016
+ },
1017
+ {
1018
+ "file": "README.md",
1019
+ "settings":
1020
+ {
1021
+ "buffer_size": 17313,
1022
+ "encoding": "UTF-8",
1023
+ "line_ending": "Unix"
1024
+ },
1025
+ "undo_stack":
1026
+ [
1027
+ [
1028
+ 1,
1029
+ 1,
1030
+ "revert",
1031
+ null,
1032
+ "AgAAAAAAAAAAAAAAAAAAAAAAAAALAAAAIyBsaWwtbW9ja3kAAAAAAAAAACQgAAAAAAAAAAAAAA",
1033
+ "CgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/"
1034
+ ],
1035
+ [
1036
+ 2,
1037
+ 1,
1038
+ "revert",
1039
+ null,
1040
+ "AgAAAAAAAAAAAAAAAAAAAAAAAABmIAAAIyBsaWwtbW9ja3kKCkEgbGlnaHR3ZWlnaHQgSmF2YVNjcmlwdCBtb2NraW5nIGxpYnJhcnkgZm9yIHRlc3RpbmcuIENyZWF0ZSBtb2NrIGZ1bmN0aW9ucywgb2JqZWN0cywgY2xhc3NlcywgYW5kIHByb3BlcnRpZXMgd2l0aCBjYWxsIHRyYWNraW5nIGFuZCByZXR1cm4gdmFsdWUgY29udHJvbC4gSW5jbHVkZXMgc3B5IGZ1bmN0aW9uYWxpdHkgZm9yIHRyYWNraW5nIGNhbGxzIHRvIGV4aXN0aW5nIG1ldGhvZHMuCgojIyDwn46vIEZlYXR1cmVzCgotIPCfqrYgKipMaWdodHdlaWdodCoqOiBNaW5pbWFsIGRlcGVuZGVuY2llcywgZm9jdXNlZCBvbiBjb3JlIG1vY2tpbmcgZnVuY3Rpb25hbGl0eQotIPCflKcgKipGbGV4aWJsZSoqOiBCdWlsZGVyIHBhdHRlcm4gZm9yIGNvbXBvc2FibGUgbW9jayBjb25maWd1cmF0aW9uCi0g8J+TiiAqKkNhbGwgVHJhY2tpbmcqKjogQXV0b21hdGljIHRyYWNraW5nIG9mIGFsbCBmdW5jdGlvbiBjYWxscyB3aXRoIGRlZXAtY2xvbmVkIGFyZ3VtZW50cwotIPCfjq0gKipTcHkgU3VwcG9ydCoqOiBUcmFjayBjYWxscyB0byBleGlzdGluZyBtZXRob2RzIHdoaWxlIHByZXNlcnZpbmcgb3IgcmVwbGFjaW5nIGJlaGF2aW9yCi0g8J+Pl++4jyAqKkNsYXNzIE1vY2tzKio6IFBlci1pbnN0YW5jZSBtb2NrIGNvbmZpZ3VyYXRpb24gZm9yIGNvbXBsZXggY2xhc3MgdGVzdGluZwotIOKchSAqKlNpbXBsZSBBUEkqKjogQ2xlYW4sIGludHVpdGl2ZSBBUEkgdGhhdCdzIGVhc3kgdG8gbGVhcm4gYW5kIHVzZQoKIyMg8J+TpSBJbnN0YWxsYXRpb24KCmBgYGJhc2gKbnBtIGluc3RhbGwgbGlsLW1vY2t5CmBgYAoKIyMg8J+agCBRdWljayBTdGFydAoKYGBgamF2YXNjcmlwdApjb25zdCBtb2NreSA9IHJlcXVpcmUoJ2xpbC1tb2NreScpOwoKLy8gQ3JlYXRlIGEgc2ltcGxlIG1vY2sgZnVuY3Rpb24KY29uc3QgbW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ25hbWUnLCAnYWdlJykpOwptb2NrLnJldCgnc3VjY2VzcycpOwoKbW9jaygnQWxpY2UnLCAzMCk7Cgpjb25zb2xlLmxvZyhtb2NrLmNhbGxzKDApKTsgLy8geyBuYW1lOiAnQWxpY2UnLCBhZ2U6IDMwIH0KY29uc29sZS5sb2cobW9jay5jYWxscygpLmxlbmd0aCk7IC8vIDEKCi8vIFNweSBvbiBhbiBleGlzdGluZyBtZXRob2QKY29uc3Qgb2JqID0geyBncmVldDogKG5hbWUpID0+IGBIZWxsbywgJHtuYW1lfSFgIH07CmNvbnN0IHNweSA9IG1vY2t5LnNweShvYmosICdncmVldCcpOwoKb2JqLmdyZWV0KCdXb3JsZCcpOwpjb25zb2xlLmxvZyhzcHkuY2FsbHMoMCkpOyAvLyBbJ1dvcmxkJ10Kc3B5LnJlc3RvcmUoKTsKYGBgCgojIyDwn5OWIEFQSSBSZWZlcmVuY2UKCiMjIyDwn5SoIEZ1bmN0aW9uIE1vY2tzCgpDcmVhdGUgbW9jayBmdW5jdGlvbnMgd2l0aCBjb25maWd1cmFibGUgYXJndW1lbnQgdHJhY2tpbmcgYW5kIHJldHVybiB2YWx1ZXM6CgpgYGBqYXZhc2NyaXB0Ci8vIEJhc2ljIGZ1bmN0aW9uIG1vY2sKY29uc3QgbW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5mdW5jdGlvbigpKTsKbW9jay5yZXQoJ3JldHVybiB2YWx1ZScpOwoKLy8gTmFtZWQgYXJndW1lbnRzCmNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuZnVuY3Rpb24oKS5hcmdzKCd4JywgJ3knKSk7Cm1vY2soJ2hlbGxvJywgJ3dvcmxkJyk7Cm1vY2suY2FsbHMoMCk7IC8vIHsgeDogJ2hlbGxvJywgeTogJ3dvcmxkJyB9CgovLyBBcmd1bWVudHMgd2l0aCBkZWZhdWx0cwpjb25zdCBtb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnbmFtZScsIHsgYWdlOiAxOCB9KSk7Cm1vY2soJ0FsaWNlJyk7Cm1vY2suY2FsbHMoMCk7IC8vIHsgbmFtZTogJ0FsaWNlJywgYWdlOiAxOCB9CgovLyBTZWxlY3Qgc3BlY2lmaWMgYXJndW1lbnRzCmNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuZnVuY3Rpb24oKS5hcmdTZWxlY3QoMSkpOwptb2NrKCdmaXJzdCcsICdzZWNvbmQnLCAndGhpcmQnKTsKbW9jay5jYWxscygwKTsgLy8gJ3NlY29uZCcKCi8vIEN1c3RvbSBmdW5jdGlvbiBib2R5CmNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKICByZXR1cm4gY29udGV4dC5hcmdzLnggKyBjb250ZXh0LmFyZ3MueTsKfSkuYXJncygneCcsICd5JykpOwptb2NrLnJldCgxMDApOyAvLyBDYW4gc3RpbGwgb3ZlcnJpZGUgdmlhIHJldAptb2NrKDUsIDMpOyAvLyBSZXR1cm5zIDEwMAoKLy8gQXN5bmMgZnVuY3Rpb25zCmNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuZnVuY3Rpb24oKS5hc3luYygpKTsKYXdhaXQgbW9jaygpOyAvLyBSZXR1cm5zIGEgcHJvbWlzZQpgYGAKCiMjIyDwn5OmIE9iamVjdCBNb2NrcwoKQ3JlYXRlIG1vY2sgb2JqZWN0cyB3aXRoIG5lc3RlZCBtb2NrczoKCmBgYGphdmFzY3JpcHQKY29uc3QgbW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5vYmplY3QoewogIG1ldGhvZDogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCdpbnB1dCcpLAogIG5lc3RlZDogbW9ja3kub2JqZWN0KHsKICAgIGRlZXBNZXRob2Q6IG1vY2t5LmZ1bmN0aW9uKCkKICB9KSwKICB2YWx1ZTogNDIKfSkpOwoKbW9jay5tZXRob2QucmV0KCdyZXN1bHQnKTsKbW9jay5tZXRob2QoJ3Rlc3QnKTsKbW9jay5tZXRob2QuY2FsbHMoMCk7IC8vIHsgaW5wdXQ6ICd0ZXN0JyB9CgovLyBSZXNldCBhbGwgbmVzdGVkIG1vY2tzCm1vY2sucmVzZXQoKTsKYGBgCgojIyMg8J+Pm++4jyBDbGFzcyBNb2NrcwoKQ3JlYXRlIG1vY2sgY2xhc3NlcyB3aXRoIHBlci1pbnN0YW5jZSBjb25maWd1cmF0aW9uOgoKYGBgamF2YXNjcmlwdApjb25zdCBNb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKICBjb25zdHJ1Y3RvcjogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCduYW1lJyksCiAgZ3JlZXQ6IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnZ3JlZXRpbmcnKQp9KSk7CgovLyBQcmUtY29uZmlndXJlIGluc3RhbmNlIGJlaGF2aW9yCk1vY2suaW5zdCgwKS5ncmVldC5yZXQoJ0hlbGxvIScpOwpNb2NrLmluc3QoMSkuZ3JlZXQucmV0KCdIb2xhIScpOwoKY29uc3QgaW5zdGFuY2UxID0gbmV3IE1vY2soJ0FsaWNlJyk7CmNvbnN0IGluc3RhbmNlMiA9IG5ldyBNb2NrKCdCb2InKTsKCmluc3RhbmNlMS5ncmVldCgnSGknKTsgLy8gUmV0dXJucyAnSGVsbG8hJwppbnN0YW5jZTIuZ3JlZXQoJ0hpJyk7IC8vIFJldHVybnMgJ0hvbGEhJwoKLy8gQWNjZXNzIGluc3RhbmNlIG1vY2tzIGFmdGVyIGNyZWF0aW9uCk1vY2suaW5zdCgwKS5jb25zdHJ1Y3Rvci5jYWxscygwKTsgLy8geyBuYW1lOiAnQWxpY2UnIH0KTW9jay5udW1JbnN0cygpOyAvLyAyCmBgYAoKIyMjIPCfjq8gUHJvcGVydHkgTW9ja3MKCkNyZWF0ZSBnZXR0ZXIvc2V0dGVyIHByb3BlcnRpZXM6CgpgYGBqYXZhc2NyaXB0CmNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kub2JqZWN0KHsKICB2YWx1ZTogbW9ja3kucHJvcGVydHkoKQp9KSk7Cgptb2NrLnZhbHVlID0gNDI7CmNvbnNvbGUubG9nKG1vY2sudmFsdWUpOyAvLyA0MgpgYGAKCiMjIyDwn5SNIFNweSBGdW5jdGlvbgoKVHJhY2sgY2FsbHMgdG8gZXhpc3RpbmcgbWV0aG9kcyB3aGlsZSBvcHRpb25hbGx5IHJlcGxhY2luZyB0aGVpciBpbXBsZW1lbnRhdGlvbjoKCmBgYGphdmFzY3JpcHQKLy8gQmFzaWMgc3B5IC0gY2FsbHMgdGhyb3VnaCB0byBvcmlnaW5hbApjb25zdCBvYmogPSB7IGFkZDogKGEsIGIpID0+IGEgKyBiIH07CmNvbnN0IHNweSA9IG1vY2t5LnNweShvYmosICdhZGQnKTsKCm9iai5hZGQoMiwgMyk7IC8vIFJldHVybnMgNQpzcHkuY2FsbHMoMCk7IC8vIFsyLCAzXQoKLy8gT3ZlcnJpZGUgcmV0dXJuIHZhbHVlCnNweS5yZXQoMTAwKTsKb2JqLmFkZCgyLCAzKTsgLy8gUmV0dXJucyAxMDAKCi8vIFNweSB3aXRoIGN1c3RvbSByZXBsYWNlbWVudApjb25zdCBzcHkgPSBtb2NreS5zcHkob2JqLCAnYWRkJywgbW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKICBjb25zdCByZXN1bHQgPSBjb250ZXh0Lm9yaWdpbmFsLmFwcGx5KGNvbnRleHQuc2VsZiwgY29udGV4dC5yYXdBcmdzKTsKICByZXR1cm4gcmVzdWx0ICogMjsgLy8gRG91YmxlIHRoZSByZXN1bHQKfSkuYXJncygnYScsICdiJykpOwoKb2JqLmFkZCg1LCAzKTsgLy8gUmV0dXJucyAxNiAoNSszKSoyCnNweS5jYWxscygwKTsgLy8geyBhOiA1LCBiOiAzIH0KCi8vIFJlc3RvcmUgb3JpZ2luYWwgbWV0aG9kCnNweS5yZXN0b3JlKCk7Cm9iai5hZGQoMiwgMyk7IC8vIFJldHVybnMgNSBhZ2FpbgoKLy8gU3B5IG9uIGNsYXNzIHByb3RvdHlwZXMKY2xhc3MgTXlDbGFzcyB7CiAgZG9UaGluZygpIHsgcmV0dXJuICdvcmlnaW5hbCc7IH0KfQoKY29uc3Qgc3B5ID0gbW9ja3kuc3B5KE15Q2xhc3MucHJvdG90eXBlLCAnZG9UaGluZycpOwpjb25zdCBpbnN0YW5jZSA9IG5ldyBNeUNsYXNzKCk7Cmluc3RhbmNlLmRvVGhpbmcoKTsgLy8gQ2FsbHMgdGhyb3VnaCB0byBvcmlnaW5hbApzcHkuY2FsbHMoKS5sZW5ndGg7IC8vIDEKc3B5LnJlc3RvcmUoKTsKYGBgCgojIyDwn46oIEFkdmFuY2VkIFVzYWdlCgojIyMgUmV0dXJuIFZhbHVlcyBQZXIgQ2FsbAoKQ29uZmlndXJlIGRpZmZlcmVudCByZXR1cm4gdmFsdWVzIGZvciBlYWNoIGNhbGw6CgpgYGBqYXZhc2NyaXB0CmNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuZnVuY3Rpb24oKSk7Cgptb2NrLnJldCgnZGVmYXVsdCcpOyAvLyBDYWxsIDAgKGRlZmF1bHQgZm9yIGFsbCBjYWxscykKbW9jay5yZXQoJ2ZpcnN0JywgMSk7IC8vIENhbGwgMQptb2NrLnJldCgnc2Vjb25kJywgMik7IC8vIENhbGwgMgoKbW9jaygpOyAvLyAnZmlyc3QnCm1vY2soKTsgLy8gJ3NlY29uZCcKbW9jaygpOyAvLyAnZGVmYXVsdCcgKGZhbGxzIGJhY2sgdG8gY2FsbCAwKQpgYGAKCiMjIyBEeW5hbWljIFJldHVybiBWYWx1ZXMKClVzZSBoYW5kbGVycyBmb3IgZHluYW1pYyByZXR1cm4gdmFsdWVzIGJhc2VkIG9uIGFyZ3VtZW50czoKCmBgYGphdmFzY3JpcHQKY29uc3QgbW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ3gnKSk7Cgptb2NrLm9uUmV0KChhcmdzKSA9PiBhcmdzLnggKiAyKTsKCm1vY2soNSk7IC8vIFJldHVybnMgMTAKbW9jaygzKTsgLy8gUmV0dXJucyA2CmBgYAoKIyMjIEVycm9yIFRocm93aW5nCgpSZXR1cm4gYW4gRXJyb3IgaW5zdGFuY2UgdG8gbWFrZSB0aGUgbW9jayB0aHJvdzoKCmBgYGphdmFzY3JpcHQKY29uc3QgbW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5mdW5jdGlvbigpKTsKbW9jay5yZXQobmV3IEVycm9yKCdUZXN0IGVycm9yJykpOwoKbW9jaygpOyAvLyBUaHJvd3MgJ1Rlc3QgZXJyb3InCmBgYAoKIyMjIEN1c3RvbSBDb250ZXh0CgpBY2Nlc3MgZnVsbCBjb250ZXh0IGluIGN1c3RvbSBmdW5jdGlvbiBib2RpZXM6CgpgYGBqYXZhc2NyaXB0CmNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKICAvLyBjb250ZXh0LnNlbGYgLSBUaGUgJ3RoaXMnIGNvbnRleHQKICAvLyBjb250ZXh0LnN0YXRlIC0gSW50ZXJuYWwgc3RhdGUgb2JqZWN0CiAgLy8gY29udGV4dC5jYWxsIC0gQ2FsbCBudW1iZXIgKDEtaW5kZXhlZCkKICAvLyBjb250ZXh0LmFyZ3MgLSBQcm9jZXNzZWQgYXJndW1lbnRzCiAgLy8gY29udGV4dC5yYXdBcmdzIC0gVW5wcm9jZXNzZWQgYXJndW1lbnRzIGFycmF5CiAgLy8gY29udGV4dC5vcmlnaW5hbCAtIE9yaWdpbmFsIGZ1bmN0aW9uIChpZiBzZXQgdmlhIC5vcmlnaW5hbCgpKQogIC8vIGNvbnRleHQucmV0IC0gQ29uZmlndXJlZCByZXR1cm4gdmFsdWUKCiAgcmV0dXJuIGNvbnRleHQucmV0IHx8ICdkZWZhdWx0JzsKfSkuYXJncygneCcsICd5JykpOwpgYGAKCiMjIyBSZXNldHRpbmcgTW9ja3MKCkFsbCBtb2NrcyBzdXBwb3J0IGAucmVzZXQoKWAgdG8gY2xlYXIgc3RhdGU6CgpgYGBqYXZhc2NyaXB0CmNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuZnVuY3Rpb24oKSk7Cm1vY2sucmV0KCd2YWx1ZScpOwptb2NrKCd0ZXN0Jyk7Cgptb2NrLmNhbGxzKCkubGVuZ3RoOyAvLyAxCgptb2NrLnJlc2V0KCk7Cgptb2NrLmNhbGxzKCkubGVuZ3RoOyAvLyAwCm1vY2soKTsgLy8gUmV0dXJucyB1bmRlZmluZWQgKHJldCBjbGVhcmVkKQpgYGAKCiMjIPCfp6ogVGVzdGluZyB3aXRoIE1vY2hhL0NoYWkKCmBgYGphdmFzY3JpcHQKY29uc3QgeyBleHBlY3QgfSA9IHJlcXVpcmUoJ2NoYWknKTsKY29uc3QgbW9ja3kgPSByZXF1aXJlKCdsaWwtbW9ja3knKTsKCmRlc2NyaWJlKCdNeSBNb2R1bGUnLCAoKSA9PiB7CiAgaXQoJ2NhbGxzIHRoZSBBUEkgd2l0aCBjb3JyZWN0IHBhcmFtZXRlcnMnLCAoKSA9PiB7CiAgICBjb25zdCBhcGkgPSB7CiAgICAgIGZldGNoOiAodXJsLCBvcHRpb25zKSA9PiB7IC8qIHJlYWwgaW1wbGVtZW50YXRpb24gKi8gfQogICAgfTsKCiAgICBjb25zdCBzcHkgPSBtb2NreS5zcHkoYXBpLCAnZmV0Y2gnLCBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ3VybCcsICdvcHRpb25zJykpOwogICAgc3B5LnJldChQcm9taXNlLnJlc29sdmUoeyBkYXRhOiAndGVzdCcgfSkpOwoKICAgIC8vIFRlc3QgeW91ciBjb2RlIHRoYXQgY2FsbHMgYXBpLmZldGNoKCkKICAgIG15TW9kdWxlLmRvU29tZXRoaW5nKGFwaSk7CgogICAgZXhwZWN0KHNweS5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7CiAgICAgIHVybDogJy9hcGkvZW5kcG9pbnQnLAogICAgICBvcHRpb25zOiB7IG1ldGhvZDogJ1BPU1QnIH0KICAgIH0pOwoKICAgIHNweS5yZXN0b3JlKCk7CiAgfSk7Cn0pOwpgYGAKCiMjIPCflIQgQ29tcGFyaXNvbiB3aXRoIEplc3QKCmxpbC1tb2NreSBwcm92aWRlcyBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkgdG8gSmVzdCBtb2NrcyBidXQgd2l0aCBhIGJ1aWxkZXItYmFzZWQgQVBJOgoKfCBKZXN0IHwgbGlsLW1vY2t5IHwKfC0tLS0tLXwtLS0tLS0tLS0tLXwKfCBgamVzdC5mbigpYCB8IGBtb2NreS5jcmVhdGUobW9ja3kuZnVuY3Rpb24oKSlgIHwKfCBgbW9jay5tb2NrUmV0dXJuVmFsdWUodmFsKWAgfCBgbW9jay5yZXQodmFsKWAgfAp8IGBtb2NrLm1vY2suY2FsbHNbMF1bMF1gIHwgYG1vY2suY2FsbHMoMClgIHwKfCBgamVzdC5zcHlPbihvYmosICdtZXRob2QnKWAgfCBgbW9ja3kuc3B5KG9iaiwgJ21ldGhvZCcpYCB8CnwgYHNweS5tb2NrUmVzdG9yZSgpYCB8IGBzcHkucmVzdG9yZSgpYCB8CgoqKktleSBkaWZmZXJlbmNlczoqKgotICoqQnVpbGRlciBwYXR0ZXJuKio6IGxpbC1tb2NreSB1c2VzIGNoYWluYWJsZSBidWlsZGVycyBmb3IgY29uZmlndXJhdGlvbgotICoqTmFtZWQgYXJndW1lbnRzKio6IEJ1aWx0LWluIHN1cHBvcnQgZm9yIG5hbWVkIGFyZ3VtZW50IHRyYWNraW5nCi0gKipQZXItaW5zdGFuY2UgY2xhc3MgbW9ja3MqKjogQ29uZmlndXJlIGRpZmZlcmVudCBiZWhhdmlvciBmb3IgZWFjaCBjbGFzcyBpbnN0YW5jZQotICoqU2ltcGxlciBBUEkqKjogRmV3ZXIgY29uY2VwdHMgdG8gbGVhcm4sIG1vcmUgcHJlZGljdGFibGUgYmVoYXZpb3IKCiMjIPCfk50gTm90ZXMKCiMjIyBCcmVha2luZyBDaGFuZ2VzCgoqKnYxLngqKjogRnVuY3Rpb25zIHdpdGhvdXQgYC5hcmdzKClgIGNvbmZpZ3VyYXRpb24gbm93IHJldHVybiBhbiBhcmd1bWVudHMgYXJyYXkgaW4gYC5jYWxscygpYCBpbnN0ZWFkIG9mIGBudWxsYC4gVGhpcyBlbmFibGVzIHNweSBmdW5jdGlvbmFsaXR5IGJ1dCBtYXkgYWZmZWN0IGV4aXN0aW5nIGNvZGUgdGhhdCBleHBlY3RzIGBudWxsYC4KCiMjIyBCdWlsZGVyIHZzLiBCdWlsdCBNb2NrcwoKLSBCdWlsZGVycyBoYXZlIG1ldGhvZHMgbGlrZSBgLmFyZ3MoKWAsIGAuYXN5bmMoKWAsIGAuYnVpbGQoKWAKLSBCdWlsdCBtb2NrcyBoYXZlIG1ldGhvZHMgbGlrZSBgLnJldCgpYCwgYC5jYWxscygpYCwgYC5yZXNldCgpYAotIENhbGwgYC5idWlsZCgpYCBvciB1c2UgYG1vY2t5LmNyZWF0ZSgpYCB0byBjb252ZXJ0IGEgYnVpbGRlciB0byBhIG1vY2sKCmBgYGphdmFzY3JpcHQKLy8gQnVpbGRlciAobm90IHlldCB1c2FibGUgYXMgYSBtb2NrKQpjb25zdCBidWlsZGVyID0gbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCd4Jyk7CgovLyBCdWlsdCBtb2NrIChyZWFkeSB0byB1c2UpCmNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUoYnVpbGRlcik7IC8vIG9yIGJ1aWxkZXIuYnVpbGQoKQptb2NrLnJldCgndmFsdWUnKTsKYGBgCgojIyDwn5OEIExpY2Vuc2UKCk1JVAoKIyMg8J+knSBDb250cmlidXRpbmcKCkNvbnRyaWJ1dGlvbnMgd2VsY29tZSEgUGxlYXNlIG9wZW4gYW4gaXNzdWUgb3IgUFIgb24gR2l0SHViLgoAAAAAAAAAAPofAAAAAAAAAAAAAA",
1041
+ "CgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/"
1042
+ ],
1043
+ [
1044
+ 3,
1045
+ 1,
1046
+ "revert",
1047
+ null,
1048
+ "AgAAAAAAAAAAAAAAAAAAAAAAAAA8IAAAIyBsaWwtbW9ja3kKCkEgbGlnaHR3ZWlnaHQgSmF2YVNjcmlwdCBtb2NraW5nIGxpYnJhcnkgZm9yIHRlc3RpbmcuIENyZWF0ZSBtb2NrIGZ1bmN0aW9ucywgb2JqZWN0cywgY2xhc3NlcywgYW5kIHByb3BlcnRpZXMgd2l0aCBjYWxsIHRyYWNraW5nIGFuZCByZXR1cm4gdmFsdWUgY29udHJvbC4gSW5jbHVkZXMgc3B5IGZ1bmN0aW9uYWxpdHkgZm9yIHRyYWNraW5nIGNhbGxzIHRvIGV4aXN0aW5nIG1ldGhvZHMuCgojIyDwn46vIEZlYXR1cmVzCgotIPCfqrYgKipMaWdodHdlaWdodCoqOiBNaW5pbWFsIGRlcGVuZGVuY2llcywgZm9jdXNlZCBvbiBjb3JlIG1vY2tpbmcgZnVuY3Rpb25hbGl0eQotIPCflKcgKipGbGV4aWJsZSoqOiBCdWlsZGVyIHBhdHRlcm4gZm9yIGNvbXBvc2FibGUgbW9jayBjb25maWd1cmF0aW9uCi0g8J+TiiAqKkNhbGwgVHJhY2tpbmcqKjogQXV0b21hdGljIHRyYWNraW5nIG9mIGFsbCBmdW5jdGlvbiBjYWxscyB3aXRoIGRlZXAtY2xvbmVkIGFyZ3VtZW50cwotIPCfjq0gKipTcHkgU3VwcG9ydCoqOiBUcmFjayBjYWxscyB0byBleGlzdGluZyBtZXRob2RzIHdoaWxlIHByZXNlcnZpbmcgb3IgcmVwbGFjaW5nIGJlaGF2aW9yCi0g8J+Pl++4jyAqKkNsYXNzIE1vY2tzKio6IFBlci1pbnN0YW5jZSBtb2NrIGNvbmZpZ3VyYXRpb24gZm9yIGNvbXBsZXggY2xhc3MgdGVzdGluZwotIOKchSAqKlNpbXBsZSBBUEkqKjogQ2xlYW4sIGludHVpdGl2ZSBBUEkgdGhhdCdzIGVhc3kgdG8gbGVhcm4gYW5kIHVzZQoKIyMg8J+TpSBJbnN0YWxsYXRpb24KCmBgYGJhc2gKbnBtIGluc3RhbGwgbGlsLW1vY2t5CmBgYAoKIyMg8J+agCBRdWljayBTdGFydAoKYGBgamF2YXNjcmlwdApjb25zdCBtb2NreSA9IHJlcXVpcmUoJ2xpbC1tb2NreScpOwoKLy8gQ3JlYXRlIGEgc2ltcGxlIG1vY2sgZnVuY3Rpb24KY29uc3QgbW9jayA9IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnbmFtZScsICdhZ2UnKS5idWlsZCgpOwptb2NrLnJldCgnc3VjY2VzcycpOwoKbW9jaygnQWxpY2UnLCAzMCk7Cgpjb25zb2xlLmxvZyhtb2NrLmNhbGxzKDApKTsgLy8geyBuYW1lOiAnQWxpY2UnLCBhZ2U6IDMwIH0KY29uc29sZS5sb2cobW9jay5jYWxscygpLmxlbmd0aCk7IC8vIDEKCi8vIFNweSBvbiBhbiBleGlzdGluZyBtZXRob2QKY29uc3Qgb2JqID0geyBncmVldDogKG5hbWUpID0+IGBIZWxsbywgJHtuYW1lfSFgIH07CmNvbnN0IHNweSA9IG1vY2t5LnNweShvYmosICdncmVldCcpOwoKb2JqLmdyZWV0KCdXb3JsZCcpOwpjb25zb2xlLmxvZyhzcHkuY2FsbHMoMCkpOyAvLyBbJ1dvcmxkJ10Kc3B5LnJlc3RvcmUoKTsKYGBgCgojIyDwn5OWIEFQSSBSZWZlcmVuY2UKCiMjIyDwn5SoIEZ1bmN0aW9uIE1vY2tzCgpDcmVhdGUgbW9jayBmdW5jdGlvbnMgd2l0aCBjb25maWd1cmFibGUgYXJndW1lbnQgdHJhY2tpbmcgYW5kIHJldHVybiB2YWx1ZXM6CgpgYGBqYXZhc2NyaXB0Ci8vIEJhc2ljIGZ1bmN0aW9uIG1vY2sKY29uc3QgbW9jayA9IG1vY2t5LmZ1bmN0aW9uKCkuYnVpbGQoKTsKbW9jay5yZXQoJ3JldHVybiB2YWx1ZScpOwoKLy8gTmFtZWQgYXJndW1lbnRzCmNvbnN0IG1vY2sgPSBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ3gnLCAneScpLmJ1aWxkKCk7Cm1vY2soJ2hlbGxvJywgJ3dvcmxkJyk7Cm1vY2suY2FsbHMoMCk7IC8vIHsgeDogJ2hlbGxvJywgeTogJ3dvcmxkJyB9CgovLyBBcmd1bWVudHMgd2l0aCBkZWZhdWx0cwpjb25zdCBtb2NrID0gbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCduYW1lJywgeyBhZ2U6IDE4IH0pLmJ1aWxkKCk7Cm1vY2soJ0FsaWNlJyk7Cm1vY2suY2FsbHMoMCk7IC8vIHsgbmFtZTogJ0FsaWNlJywgYWdlOiAxOCB9CgovLyBTZWxlY3Qgc3BlY2lmaWMgYXJndW1lbnRzCmNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuZnVuY3Rpb24oKS5hcmdTZWxlY3QoMSkpOwptb2NrKCdmaXJzdCcsICdzZWNvbmQnLCAndGhpcmQnKTsKbW9jay5jYWxscygwKTsgLy8gJ3NlY29uZCcKCi8vIEN1c3RvbSBmdW5jdGlvbiBib2R5CmNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKICByZXR1cm4gY29udGV4dC5hcmdzLnggKyBjb250ZXh0LmFyZ3MueTsKfSkuYXJncygneCcsICd5JykpOwptb2NrLnJldCgxMDApOyAvLyBDYW4gc3RpbGwgb3ZlcnJpZGUgdmlhIHJldAptb2NrKDUsIDMpOyAvLyBSZXR1cm5zIDEwMAoKLy8gQXN5bmMgZnVuY3Rpb25zCmNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuZnVuY3Rpb24oKS5hc3luYygpKTsKYXdhaXQgbW9jaygpOyAvLyBSZXR1cm5zIGEgcHJvbWlzZQpgYGAKCiMjIyDwn5OmIE9iamVjdCBNb2NrcwoKQ3JlYXRlIG1vY2sgb2JqZWN0cyB3aXRoIG5lc3RlZCBtb2NrczoKCmBgYGphdmFzY3JpcHQKY29uc3QgbW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5vYmplY3QoewogIG1ldGhvZDogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCdpbnB1dCcpLAogIG5lc3RlZDogbW9ja3kub2JqZWN0KHsKICAgIGRlZXBNZXRob2Q6IG1vY2t5LmZ1bmN0aW9uKCkKICB9KSwKICB2YWx1ZTogNDIKfSkpOwoKbW9jay5tZXRob2QucmV0KCdyZXN1bHQnKTsKbW9jay5tZXRob2QoJ3Rlc3QnKTsKbW9jay5tZXRob2QuY2FsbHMoMCk7IC8vIHsgaW5wdXQ6ICd0ZXN0JyB9CgovLyBSZXNldCBhbGwgbmVzdGVkIG1vY2tzCm1vY2sucmVzZXQoKTsKYGBgCgojIyMg8J+Pm++4jyBDbGFzcyBNb2NrcwoKQ3JlYXRlIG1vY2sgY2xhc3NlcyB3aXRoIHBlci1pbnN0YW5jZSBjb25maWd1cmF0aW9uOgoKYGBgamF2YXNjcmlwdApjb25zdCBNb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKICBjb25zdHJ1Y3RvcjogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCduYW1lJyksCiAgZ3JlZXQ6IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnZ3JlZXRpbmcnKQp9KSk7CgovLyBQcmUtY29uZmlndXJlIGluc3RhbmNlIGJlaGF2aW9yCk1vY2suaW5zdCgwKS5ncmVldC5yZXQoJ0hlbGxvIScpOwpNb2NrLmluc3QoMSkuZ3JlZXQucmV0KCdIb2xhIScpOwoKY29uc3QgaW5zdGFuY2UxID0gbmV3IE1vY2soJ0FsaWNlJyk7CmNvbnN0IGluc3RhbmNlMiA9IG5ldyBNb2NrKCdCb2InKTsKCmluc3RhbmNlMS5ncmVldCgnSGknKTsgLy8gUmV0dXJucyAnSGVsbG8hJwppbnN0YW5jZTIuZ3JlZXQoJ0hpJyk7IC8vIFJldHVybnMgJ0hvbGEhJwoKLy8gQWNjZXNzIGluc3RhbmNlIG1vY2tzIGFmdGVyIGNyZWF0aW9uCk1vY2suaW5zdCgwKS5jb25zdHJ1Y3Rvci5jYWxscygwKTsgLy8geyBuYW1lOiAnQWxpY2UnIH0KTW9jay5udW1JbnN0cygpOyAvLyAyCmBgYAoKIyMjIPCfjq8gUHJvcGVydHkgTW9ja3MKCkNyZWF0ZSBnZXR0ZXIvc2V0dGVyIHByb3BlcnRpZXM6CgpgYGBqYXZhc2NyaXB0CmNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kub2JqZWN0KHsKICB2YWx1ZTogbW9ja3kucHJvcGVydHkoKQp9KSk7Cgptb2NrLnZhbHVlID0gNDI7CmNvbnNvbGUubG9nKG1vY2sudmFsdWUpOyAvLyA0MgpgYGAKCiMjIyDwn5SNIFNweSBGdW5jdGlvbgoKVHJhY2sgY2FsbHMgdG8gZXhpc3RpbmcgbWV0aG9kcyB3aGlsZSBvcHRpb25hbGx5IHJlcGxhY2luZyB0aGVpciBpbXBsZW1lbnRhdGlvbjoKCmBgYGphdmFzY3JpcHQKLy8gQmFzaWMgc3B5IC0gY2FsbHMgdGhyb3VnaCB0byBvcmlnaW5hbApjb25zdCBvYmogPSB7IGFkZDogKGEsIGIpID0+IGEgKyBiIH07CmNvbnN0IHNweSA9IG1vY2t5LnNweShvYmosICdhZGQnKTsKCm9iai5hZGQoMiwgMyk7IC8vIFJldHVybnMgNQpzcHkuY2FsbHMoMCk7IC8vIFsyLCAzXQoKLy8gT3ZlcnJpZGUgcmV0dXJuIHZhbHVlCnNweS5yZXQoMTAwKTsKb2JqLmFkZCgyLCAzKTsgLy8gUmV0dXJucyAxMDAKCi8vIFNweSB3aXRoIGN1c3RvbSByZXBsYWNlbWVudApjb25zdCBzcHkgPSBtb2NreS5zcHkob2JqLCAnYWRkJywgbW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKICBjb25zdCByZXN1bHQgPSBjb250ZXh0Lm9yaWdpbmFsLmFwcGx5KGNvbnRleHQuc2VsZiwgY29udGV4dC5yYXdBcmdzKTsKICByZXR1cm4gcmVzdWx0ICogMjsgLy8gRG91YmxlIHRoZSByZXN1bHQKfSkuYXJncygnYScsICdiJykpOwoKb2JqLmFkZCg1LCAzKTsgLy8gUmV0dXJucyAxNiAoNSszKSoyCnNweS5jYWxscygwKTsgLy8geyBhOiA1LCBiOiAzIH0KCi8vIFJlc3RvcmUgb3JpZ2luYWwgbWV0aG9kCnNweS5yZXN0b3JlKCk7Cm9iai5hZGQoMiwgMyk7IC8vIFJldHVybnMgNSBhZ2FpbgoKLy8gU3B5IG9uIGNsYXNzIHByb3RvdHlwZXMKY2xhc3MgTXlDbGFzcyB7CiAgZG9UaGluZygpIHsgcmV0dXJuICdvcmlnaW5hbCc7IH0KfQoKY29uc3Qgc3B5ID0gbW9ja3kuc3B5KE15Q2xhc3MucHJvdG90eXBlLCAnZG9UaGluZycpOwpjb25zdCBpbnN0YW5jZSA9IG5ldyBNeUNsYXNzKCk7Cmluc3RhbmNlLmRvVGhpbmcoKTsgLy8gQ2FsbHMgdGhyb3VnaCB0byBvcmlnaW5hbApzcHkuY2FsbHMoKS5sZW5ndGg7IC8vIDEKc3B5LnJlc3RvcmUoKTsKYGBgCgojIyDwn46oIEFkdmFuY2VkIFVzYWdlCgojIyMgUmV0dXJuIFZhbHVlcyBQZXIgQ2FsbAoKQ29uZmlndXJlIGRpZmZlcmVudCByZXR1cm4gdmFsdWVzIGZvciBlYWNoIGNhbGw6CgpgYGBqYXZhc2NyaXB0CmNvbnN0IG1vY2sgPSBtb2NreS5mdW5jdGlvbigpLmJ1aWxkKCk7Cgptb2NrLnJldCgnZGVmYXVsdCcpOyAvLyBDYWxsIDAgKGRlZmF1bHQgZm9yIGFsbCBjYWxscykKbW9jay5yZXQoJ2ZpcnN0JywgMSk7IC8vIENhbGwgMQptb2NrLnJldCgnc2Vjb25kJywgMik7IC8vIENhbGwgMgoKbW9jaygpOyAvLyAnZmlyc3QnCm1vY2soKTsgLy8gJ3NlY29uZCcKbW9jaygpOyAvLyAnZGVmYXVsdCcgKGZhbGxzIGJhY2sgdG8gY2FsbCAwKQpgYGAKCiMjIyBEeW5hbWljIFJldHVybiBWYWx1ZXMKClVzZSBoYW5kbGVycyBmb3IgZHluYW1pYyByZXR1cm4gdmFsdWVzIGJhc2VkIG9uIGFyZ3VtZW50czoKCmBgYGphdmFzY3JpcHQKY29uc3QgbW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ3gnKSk7Cgptb2NrLm9uUmV0KChhcmdzKSA9PiBhcmdzLnggKiAyKTsKCm1vY2soNSk7IC8vIFJldHVybnMgMTAKbW9jaygzKTsgLy8gUmV0dXJucyA2CmBgYAoKIyMjIEVycm9yIFRocm93aW5nCgpSZXR1cm4gYW4gRXJyb3IgaW5zdGFuY2UgdG8gbWFrZSB0aGUgbW9jayB0aHJvdzoKCmBgYGphdmFzY3JpcHQKY29uc3QgbW9jayA9IG1vY2t5LmZ1bmN0aW9uKCkuYnVpbGQoKTsKbW9jay5yZXQobmV3IEVycm9yKCdUZXN0IGVycm9yJykpOwoKbW9jaygpOyAvLyBUaHJvd3MgJ1Rlc3QgZXJyb3InCmBgYAoKIyMjIEN1c3RvbSBDb250ZXh0CgpBY2Nlc3MgZnVsbCBjb250ZXh0IGluIGN1c3RvbSBmdW5jdGlvbiBib2RpZXM6CgpgYGBqYXZhc2NyaXB0CmNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKICAvLyBjb250ZXh0LnNlbGYgLSBUaGUgJ3RoaXMnIGNvbnRleHQKICAvLyBjb250ZXh0LnN0YXRlIC0gSW50ZXJuYWwgc3RhdGUgb2JqZWN0CiAgLy8gY29udGV4dC5jYWxsIC0gQ2FsbCBudW1iZXIgKDEtaW5kZXhlZCkKICAvLyBjb250ZXh0LmFyZ3MgLSBQcm9jZXNzZWQgYXJndW1lbnRzCiAgLy8gY29udGV4dC5yYXdBcmdzIC0gVW5wcm9jZXNzZWQgYXJndW1lbnRzIGFycmF5CiAgLy8gY29udGV4dC5vcmlnaW5hbCAtIE9yaWdpbmFsIGZ1bmN0aW9uIChpZiBzZXQgdmlhIC5vcmlnaW5hbCgpKQogIC8vIGNvbnRleHQucmV0IC0gQ29uZmlndXJlZCByZXR1cm4gdmFsdWUKCiAgcmV0dXJuIGNvbnRleHQucmV0IHx8ICdkZWZhdWx0JzsKfSkuYXJncygneCcsICd5JykpOwpgYGAKCiMjIyBSZXNldHRpbmcgTW9ja3MKCkFsbCBtb2NrcyBzdXBwb3J0IGAucmVzZXQoKWAgdG8gY2xlYXIgc3RhdGU6CgpgYGBqYXZhc2NyaXB0CmNvbnN0IG1vY2sgPSBtb2NreS5mdW5jdGlvbigpLmJ1aWxkKCk7Cm1vY2sucmV0KCd2YWx1ZScpOwptb2NrKCd0ZXN0Jyk7Cgptb2NrLmNhbGxzKCkubGVuZ3RoOyAvLyAxCgptb2NrLnJlc2V0KCk7Cgptb2NrLmNhbGxzKCkubGVuZ3RoOyAvLyAwCm1vY2soKTsgLy8gUmV0dXJucyB1bmRlZmluZWQgKHJldCBjbGVhcmVkKQpgYGAKCiMjIPCfp6ogVGVzdGluZyB3aXRoIE1vY2hhL0NoYWkKCmBgYGphdmFzY3JpcHQKY29uc3QgeyBleHBlY3QgfSA9IHJlcXVpcmUoJ2NoYWknKTsKY29uc3QgbW9ja3kgPSByZXF1aXJlKCdsaWwtbW9ja3knKTsKCmRlc2NyaWJlKCdNeSBNb2R1bGUnLCAoKSA9PiB7CiAgaXQoJ2NhbGxzIHRoZSBBUEkgd2l0aCBjb3JyZWN0IHBhcmFtZXRlcnMnLCAoKSA9PiB7CiAgICBjb25zdCBhcGkgPSB7CiAgICAgIGZldGNoOiAodXJsLCBvcHRpb25zKSA9PiB7IC8qIHJlYWwgaW1wbGVtZW50YXRpb24gKi8gfQogICAgfTsKCiAgICBjb25zdCBzcHkgPSBtb2NreS5zcHkoYXBpLCAnZmV0Y2gnLCBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ3VybCcsICdvcHRpb25zJykpOwogICAgc3B5LnJldChQcm9taXNlLnJlc29sdmUoeyBkYXRhOiAndGVzdCcgfSkpOwoKICAgIC8vIFRlc3QgeW91ciBjb2RlIHRoYXQgY2FsbHMgYXBpLmZldGNoKCkKICAgIG15TW9kdWxlLmRvU29tZXRoaW5nKGFwaSk7CgogICAgZXhwZWN0KHNweS5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7CiAgICAgIHVybDogJy9hcGkvZW5kcG9pbnQnLAogICAgICBvcHRpb25zOiB7IG1ldGhvZDogJ1BPU1QnIH0KICAgIH0pOwoKICAgIHNweS5yZXN0b3JlKCk7CiAgfSk7Cn0pOwpgYGAKCiMjIPCflIQgQ29tcGFyaXNvbiB3aXRoIEplc3QKCmxpbC1tb2NreSBwcm92aWRlcyBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkgdG8gSmVzdCBtb2NrcyBidXQgd2l0aCBhIGJ1aWxkZXItYmFzZWQgQVBJOgoKfCBKZXN0IHwgbGlsLW1vY2t5IHwKfC0tLS0tLXwtLS0tLS0tLS0tLXwKfCBgamVzdC5mbigpYCB8IGBtb2NreS5jcmVhdGUobW9ja3kuZnVuY3Rpb24oKSlgIHwKfCBgbW9jay5tb2NrUmV0dXJuVmFsdWUodmFsKWAgfCBgbW9jay5yZXQodmFsKWAgfAp8IGBtb2NrLm1vY2suY2FsbHNbMF1bMF1gIHwgYG1vY2suY2FsbHMoMClgIHwKfCBgamVzdC5zcHlPbihvYmosICdtZXRob2QnKWAgfCBgbW9ja3kuc3B5KG9iaiwgJ21ldGhvZCcpYCB8CnwgYHNweS5tb2NrUmVzdG9yZSgpYCB8IGBzcHkucmVzdG9yZSgpYCB8CgoqKktleSBkaWZmZXJlbmNlczoqKgotICoqQnVpbGRlciBwYXR0ZXJuKio6IGxpbC1tb2NreSB1c2VzIGNoYWluYWJsZSBidWlsZGVycyBmb3IgY29uZmlndXJhdGlvbgotICoqTmFtZWQgYXJndW1lbnRzKio6IEJ1aWx0LWluIHN1cHBvcnQgZm9yIG5hbWVkIGFyZ3VtZW50IHRyYWNraW5nCi0gKipQZXItaW5zdGFuY2UgY2xhc3MgbW9ja3MqKjogQ29uZmlndXJlIGRpZmZlcmVudCBiZWhhdmlvciBmb3IgZWFjaCBjbGFzcyBpbnN0YW5jZQotICoqU2ltcGxlciBBUEkqKjogRmV3ZXIgY29uY2VwdHMgdG8gbGVhcm4sIG1vcmUgcHJlZGljdGFibGUgYmVoYXZpb3IKCiMjIPCfk50gTm90ZXMKCiMjIyBCcmVha2luZyBDaGFuZ2VzCgoqKnYxLngqKjogRnVuY3Rpb25zIHdpdGhvdXQgYC5hcmdzKClgIGNvbmZpZ3VyYXRpb24gbm93IHJldHVybiBhbiBhcmd1bWVudHMgYXJyYXkgaW4gYC5jYWxscygpYCBpbnN0ZWFkIG9mIGBudWxsYC4gVGhpcyBlbmFibGVzIHNweSBmdW5jdGlvbmFsaXR5IGJ1dCBtYXkgYWZmZWN0IGV4aXN0aW5nIGNvZGUgdGhhdCBleHBlY3RzIGBudWxsYC4KCiMjIyBCdWlsZGVyIHZzLiBCdWlsdCBNb2NrcwoKLSBCdWlsZGVycyBoYXZlIG1ldGhvZHMgbGlrZSBgLmFyZ3MoKWAsIGAuYXN5bmMoKWAsIGAuYnVpbGQoKWAKLSBCdWlsdCBtb2NrcyBoYXZlIG1ldGhvZHMgbGlrZSBgLnJldCgpYCwgYC5jYWxscygpYCwgYC5yZXNldCgpYAotIENhbGwgYC5idWlsZCgpYCBvciB1c2UgYG1vY2t5LmNyZWF0ZSgpYCB0byBjb252ZXJ0IGEgYnVpbGRlciB0byBhIG1vY2sKCmBgYGphdmFzY3JpcHQKLy8gQnVpbGRlciAobm90IHlldCB1c2FibGUgYXMgYSBtb2NrKQpjb25zdCBidWlsZGVyID0gbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCd4Jyk7CgovLyBCdWlsdCBtb2NrIChyZWFkeSB0byB1c2UpCmNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUoYnVpbGRlcik7IC8vIG9yIGJ1aWxkZXIuYnVpbGQoKQptb2NrLnJldCgndmFsdWUnKTsKYGBgCgojIyDwn5OEIExpY2Vuc2UKCk1JVAoKIyMg8J+knSBDb250cmlidXRpbmcKCkNvbnRyaWJ1dGlvbnMgd2VsY29tZSEgUGxlYXNlIG9wZW4gYW4gaXNzdWUgb3IgUFIgb24gR2l0SHViLgoAAAAAAAAAAO4fAAAAAAAAAAAAAA",
1049
+ "CgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/"
1050
+ ],
1051
+ [
1052
+ 4,
1053
+ 1,
1054
+ "revert",
1055
+ null,
1056
+ "AgAAAAAAAAAAAAAAAAAAAAAAAAAwIAAAIyBsaWwtbW9ja3kKCkEgbGlnaHR3ZWlnaHQgSmF2YVNjcmlwdCBtb2NraW5nIGxpYnJhcnkgZm9yIHRlc3RpbmcuIENyZWF0ZSBtb2NrIGZ1bmN0aW9ucywgb2JqZWN0cywgY2xhc3NlcywgYW5kIHByb3BlcnRpZXMgd2l0aCBjYWxsIHRyYWNraW5nIGFuZCByZXR1cm4gdmFsdWUgY29udHJvbC4gSW5jbHVkZXMgc3B5IGZ1bmN0aW9uYWxpdHkgZm9yIHRyYWNraW5nIGNhbGxzIHRvIGV4aXN0aW5nIG1ldGhvZHMuCgojIyDwn46vIEZlYXR1cmVzCgotIPCfqrYgKipMaWdodHdlaWdodCoqOiBNaW5pbWFsIGRlcGVuZGVuY2llcywgZm9jdXNlZCBvbiBjb3JlIG1vY2tpbmcgZnVuY3Rpb25hbGl0eQotIPCflKcgKipGbGV4aWJsZSoqOiBCdWlsZGVyIHBhdHRlcm4gZm9yIGNvbXBvc2FibGUgbW9jayBjb25maWd1cmF0aW9uCi0g8J+TiiAqKkNhbGwgVHJhY2tpbmcqKjogQXV0b21hdGljIHRyYWNraW5nIG9mIGFsbCBmdW5jdGlvbiBjYWxscyB3aXRoIGRlZXAtY2xvbmVkIGFyZ3VtZW50cwotIPCfjq0gKipTcHkgU3VwcG9ydCoqOiBUcmFjayBjYWxscyB0byBleGlzdGluZyBtZXRob2RzIHdoaWxlIHByZXNlcnZpbmcgb3IgcmVwbGFjaW5nIGJlaGF2aW9yCi0g8J+Pl++4jyAqKkNsYXNzIE1vY2tzKio6IFBlci1pbnN0YW5jZSBtb2NrIGNvbmZpZ3VyYXRpb24gZm9yIGNvbXBsZXggY2xhc3MgdGVzdGluZwotIOKchSAqKlNpbXBsZSBBUEkqKjogQ2xlYW4sIGludHVpdGl2ZSBBUEkgdGhhdCdzIGVhc3kgdG8gbGVhcm4gYW5kIHVzZQoKIyMg8J+TpSBJbnN0YWxsYXRpb24KCmBgYGJhc2gKbnBtIGluc3RhbGwgbGlsLW1vY2t5CmBgYAoKIyMg8J+agCBRdWljayBTdGFydAoKYGBgamF2YXNjcmlwdApjb25zdCBtb2NreSA9IHJlcXVpcmUoJ2xpbC1tb2NreScpOwoKLy8gQ3JlYXRlIGEgc2ltcGxlIG1vY2sgZnVuY3Rpb24KY29uc3QgbW9jayA9IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnbmFtZScsICdhZ2UnKS5idWlsZCgpOwptb2NrLnJldCgnc3VjY2VzcycpOwoKbW9jaygnQWxpY2UnLCAzMCk7Cgpjb25zb2xlLmxvZyhtb2NrLmNhbGxzKDApKTsgLy8geyBuYW1lOiAnQWxpY2UnLCBhZ2U6IDMwIH0KY29uc29sZS5sb2cobW9jay5jYWxscygpLmxlbmd0aCk7IC8vIDEKCi8vIFNweSBvbiBhbiBleGlzdGluZyBtZXRob2QKY29uc3Qgb2JqID0geyBncmVldDogKG5hbWUpID0+IGBIZWxsbywgJHtuYW1lfSFgIH07CmNvbnN0IHNweSA9IG1vY2t5LnNweShvYmosICdncmVldCcpOwoKb2JqLmdyZWV0KCdXb3JsZCcpOwpjb25zb2xlLmxvZyhzcHkuY2FsbHMoMCkpOyAvLyBbJ1dvcmxkJ10Kc3B5LnJlc3RvcmUoKTsKYGBgCgojIyDwn5OWIEFQSSBSZWZlcmVuY2UKCiMjIyDwn5SoIEZ1bmN0aW9uIE1vY2tzCgpDcmVhdGUgbW9jayBmdW5jdGlvbnMgd2l0aCBjb25maWd1cmFibGUgYXJndW1lbnQgdHJhY2tpbmcgYW5kIHJldHVybiB2YWx1ZXM6CgpgYGBqYXZhc2NyaXB0Ci8vIEJhc2ljIGZ1bmN0aW9uIG1vY2sKY29uc3QgbW9jayA9IG1vY2t5LmZ1bmN0aW9uKCkuYnVpbGQoKTsKbW9jay5yZXQoJ3JldHVybiB2YWx1ZScpOwoKLy8gTmFtZWQgYXJndW1lbnRzCmNvbnN0IG1vY2sgPSBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ3gnLCAneScpLmJ1aWxkKCk7Cm1vY2soJ2hlbGxvJywgJ3dvcmxkJyk7Cm1vY2suY2FsbHMoMCk7IC8vIHsgeDogJ2hlbGxvJywgeTogJ3dvcmxkJyB9CgovLyBBcmd1bWVudHMgd2l0aCBkZWZhdWx0cwpjb25zdCBtb2NrID0gbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCduYW1lJywgeyBhZ2U6IDE4IH0pLmJ1aWxkKCk7Cm1vY2soJ0FsaWNlJyk7Cm1vY2suY2FsbHMoMCk7IC8vIHsgbmFtZTogJ0FsaWNlJywgYWdlOiAxOCB9CgovLyBTZWxlY3Qgc3BlY2lmaWMgYXJndW1lbnRzCmNvbnN0IG1vY2sgPSBtb2NreS5mdW5jdGlvbigpLmFyZ1NlbGVjdCgxKS5idWlsZCgpOwptb2NrKCdmaXJzdCcsICdzZWNvbmQnLCAndGhpcmQnKTsKbW9jay5jYWxscygwKTsgLy8gJ3NlY29uZCcKCi8vIEN1c3RvbSBmdW5jdGlvbiBib2R5CmNvbnN0IG1vY2sgPSBtb2NreS5mdW5jdGlvbigoY29udGV4dCkgPT4gewogIHJldHVybiBjb250ZXh0LmFyZ3MueCArIGNvbnRleHQuYXJncy55Owp9KS5hcmdzKCd4JywgJ3knKS5idWlsZCgpOwptb2NrLnJldCgxMDApOyAvLyBDYW4gc3RpbGwgb3ZlcnJpZGUgdmlhIHJldAptb2NrKDUsIDMpOyAvLyBSZXR1cm5zIDEwMAoKLy8gQXN5bmMgZnVuY3Rpb25zCmNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuZnVuY3Rpb24oKS5hc3luYygpKTsKYXdhaXQgbW9jaygpOyAvLyBSZXR1cm5zIGEgcHJvbWlzZQpgYGAKCiMjIyDwn5OmIE9iamVjdCBNb2NrcwoKQ3JlYXRlIG1vY2sgb2JqZWN0cyB3aXRoIG5lc3RlZCBtb2NrczoKCmBgYGphdmFzY3JpcHQKY29uc3QgbW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5vYmplY3QoewogIG1ldGhvZDogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCdpbnB1dCcpLAogIG5lc3RlZDogbW9ja3kub2JqZWN0KHsKICAgIGRlZXBNZXRob2Q6IG1vY2t5LmZ1bmN0aW9uKCkKICB9KSwKICB2YWx1ZTogNDIKfSkpOwoKbW9jay5tZXRob2QucmV0KCdyZXN1bHQnKTsKbW9jay5tZXRob2QoJ3Rlc3QnKTsKbW9jay5tZXRob2QuY2FsbHMoMCk7IC8vIHsgaW5wdXQ6ICd0ZXN0JyB9CgovLyBSZXNldCBhbGwgbmVzdGVkIG1vY2tzCm1vY2sucmVzZXQoKTsKYGBgCgojIyMg8J+Pm++4jyBDbGFzcyBNb2NrcwoKQ3JlYXRlIG1vY2sgY2xhc3NlcyB3aXRoIHBlci1pbnN0YW5jZSBjb25maWd1cmF0aW9uOgoKYGBgamF2YXNjcmlwdApjb25zdCBNb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKICBjb25zdHJ1Y3RvcjogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCduYW1lJyksCiAgZ3JlZXQ6IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnZ3JlZXRpbmcnKQp9KSk7CgovLyBQcmUtY29uZmlndXJlIGluc3RhbmNlIGJlaGF2aW9yCk1vY2suaW5zdCgwKS5ncmVldC5yZXQoJ0hlbGxvIScpOwpNb2NrLmluc3QoMSkuZ3JlZXQucmV0KCdIb2xhIScpOwoKY29uc3QgaW5zdGFuY2UxID0gbmV3IE1vY2soJ0FsaWNlJyk7CmNvbnN0IGluc3RhbmNlMiA9IG5ldyBNb2NrKCdCb2InKTsKCmluc3RhbmNlMS5ncmVldCgnSGknKTsgLy8gUmV0dXJucyAnSGVsbG8hJwppbnN0YW5jZTIuZ3JlZXQoJ0hpJyk7IC8vIFJldHVybnMgJ0hvbGEhJwoKLy8gQWNjZXNzIGluc3RhbmNlIG1vY2tzIGFmdGVyIGNyZWF0aW9uCk1vY2suaW5zdCgwKS5jb25zdHJ1Y3Rvci5jYWxscygwKTsgLy8geyBuYW1lOiAnQWxpY2UnIH0KTW9jay5udW1JbnN0cygpOyAvLyAyCmBgYAoKIyMjIPCfjq8gUHJvcGVydHkgTW9ja3MKCkNyZWF0ZSBnZXR0ZXIvc2V0dGVyIHByb3BlcnRpZXM6CgpgYGBqYXZhc2NyaXB0CmNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kub2JqZWN0KHsKICB2YWx1ZTogbW9ja3kucHJvcGVydHkoKQp9KSk7Cgptb2NrLnZhbHVlID0gNDI7CmNvbnNvbGUubG9nKG1vY2sudmFsdWUpOyAvLyA0MgpgYGAKCiMjIyDwn5SNIFNweSBGdW5jdGlvbgoKVHJhY2sgY2FsbHMgdG8gZXhpc3RpbmcgbWV0aG9kcyB3aGlsZSBvcHRpb25hbGx5IHJlcGxhY2luZyB0aGVpciBpbXBsZW1lbnRhdGlvbjoKCmBgYGphdmFzY3JpcHQKLy8gQmFzaWMgc3B5IC0gY2FsbHMgdGhyb3VnaCB0byBvcmlnaW5hbApjb25zdCBvYmogPSB7IGFkZDogKGEsIGIpID0+IGEgKyBiIH07CmNvbnN0IHNweSA9IG1vY2t5LnNweShvYmosICdhZGQnKTsKCm9iai5hZGQoMiwgMyk7IC8vIFJldHVybnMgNQpzcHkuY2FsbHMoMCk7IC8vIFsyLCAzXQoKLy8gT3ZlcnJpZGUgcmV0dXJuIHZhbHVlCnNweS5yZXQoMTAwKTsKb2JqLmFkZCgyLCAzKTsgLy8gUmV0dXJucyAxMDAKCi8vIFNweSB3aXRoIGN1c3RvbSByZXBsYWNlbWVudApjb25zdCBzcHkgPSBtb2NreS5zcHkob2JqLCAnYWRkJywgbW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKICBjb25zdCByZXN1bHQgPSBjb250ZXh0Lm9yaWdpbmFsLmFwcGx5KGNvbnRleHQuc2VsZiwgY29udGV4dC5yYXdBcmdzKTsKICByZXR1cm4gcmVzdWx0ICogMjsgLy8gRG91YmxlIHRoZSByZXN1bHQKfSkuYXJncygnYScsICdiJykpOwoKb2JqLmFkZCg1LCAzKTsgLy8gUmV0dXJucyAxNiAoNSszKSoyCnNweS5jYWxscygwKTsgLy8geyBhOiA1LCBiOiAzIH0KCi8vIFJlc3RvcmUgb3JpZ2luYWwgbWV0aG9kCnNweS5yZXN0b3JlKCk7Cm9iai5hZGQoMiwgMyk7IC8vIFJldHVybnMgNSBhZ2FpbgoKLy8gU3B5IG9uIGNsYXNzIHByb3RvdHlwZXMKY2xhc3MgTXlDbGFzcyB7CiAgZG9UaGluZygpIHsgcmV0dXJuICdvcmlnaW5hbCc7IH0KfQoKY29uc3Qgc3B5ID0gbW9ja3kuc3B5KE15Q2xhc3MucHJvdG90eXBlLCAnZG9UaGluZycpOwpjb25zdCBpbnN0YW5jZSA9IG5ldyBNeUNsYXNzKCk7Cmluc3RhbmNlLmRvVGhpbmcoKTsgLy8gQ2FsbHMgdGhyb3VnaCB0byBvcmlnaW5hbApzcHkuY2FsbHMoKS5sZW5ndGg7IC8vIDEKc3B5LnJlc3RvcmUoKTsKYGBgCgojIyDwn46oIEFkdmFuY2VkIFVzYWdlCgojIyMgUmV0dXJuIFZhbHVlcyBQZXIgQ2FsbAoKQ29uZmlndXJlIGRpZmZlcmVudCByZXR1cm4gdmFsdWVzIGZvciBlYWNoIGNhbGw6CgpgYGBqYXZhc2NyaXB0CmNvbnN0IG1vY2sgPSBtb2NreS5mdW5jdGlvbigpLmJ1aWxkKCk7Cgptb2NrLnJldCgnZGVmYXVsdCcpOyAvLyBDYWxsIDAgKGRlZmF1bHQgZm9yIGFsbCBjYWxscykKbW9jay5yZXQoJ2ZpcnN0JywgMSk7IC8vIENhbGwgMQptb2NrLnJldCgnc2Vjb25kJywgMik7IC8vIENhbGwgMgoKbW9jaygpOyAvLyAnZmlyc3QnCm1vY2soKTsgLy8gJ3NlY29uZCcKbW9jaygpOyAvLyAnZGVmYXVsdCcgKGZhbGxzIGJhY2sgdG8gY2FsbCAwKQpgYGAKCiMjIyBEeW5hbWljIFJldHVybiBWYWx1ZXMKClVzZSBoYW5kbGVycyBmb3IgZHluYW1pYyByZXR1cm4gdmFsdWVzIGJhc2VkIG9uIGFyZ3VtZW50czoKCmBgYGphdmFzY3JpcHQKY29uc3QgbW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ3gnKSk7Cgptb2NrLm9uUmV0KChhcmdzKSA9PiBhcmdzLnggKiAyKTsKCm1vY2soNSk7IC8vIFJldHVybnMgMTAKbW9jaygzKTsgLy8gUmV0dXJucyA2CmBgYAoKIyMjIEVycm9yIFRocm93aW5nCgpSZXR1cm4gYW4gRXJyb3IgaW5zdGFuY2UgdG8gbWFrZSB0aGUgbW9jayB0aHJvdzoKCmBgYGphdmFzY3JpcHQKY29uc3QgbW9jayA9IG1vY2t5LmZ1bmN0aW9uKCkuYnVpbGQoKTsKbW9jay5yZXQobmV3IEVycm9yKCdUZXN0IGVycm9yJykpOwoKbW9jaygpOyAvLyBUaHJvd3MgJ1Rlc3QgZXJyb3InCmBgYAoKIyMjIEN1c3RvbSBDb250ZXh0CgpBY2Nlc3MgZnVsbCBjb250ZXh0IGluIGN1c3RvbSBmdW5jdGlvbiBib2RpZXM6CgpgYGBqYXZhc2NyaXB0CmNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKICAvLyBjb250ZXh0LnNlbGYgLSBUaGUgJ3RoaXMnIGNvbnRleHQKICAvLyBjb250ZXh0LnN0YXRlIC0gSW50ZXJuYWwgc3RhdGUgb2JqZWN0CiAgLy8gY29udGV4dC5jYWxsIC0gQ2FsbCBudW1iZXIgKDEtaW5kZXhlZCkKICAvLyBjb250ZXh0LmFyZ3MgLSBQcm9jZXNzZWQgYXJndW1lbnRzCiAgLy8gY29udGV4dC5yYXdBcmdzIC0gVW5wcm9jZXNzZWQgYXJndW1lbnRzIGFycmF5CiAgLy8gY29udGV4dC5vcmlnaW5hbCAtIE9yaWdpbmFsIGZ1bmN0aW9uIChpZiBzZXQgdmlhIC5vcmlnaW5hbCgpKQogIC8vIGNvbnRleHQucmV0IC0gQ29uZmlndXJlZCByZXR1cm4gdmFsdWUKCiAgcmV0dXJuIGNvbnRleHQucmV0IHx8ICdkZWZhdWx0JzsKfSkuYXJncygneCcsICd5JykpOwpgYGAKCiMjIyBSZXNldHRpbmcgTW9ja3MKCkFsbCBtb2NrcyBzdXBwb3J0IGAucmVzZXQoKWAgdG8gY2xlYXIgc3RhdGU6CgpgYGBqYXZhc2NyaXB0CmNvbnN0IG1vY2sgPSBtb2NreS5mdW5jdGlvbigpLmJ1aWxkKCk7Cm1vY2sucmV0KCd2YWx1ZScpOwptb2NrKCd0ZXN0Jyk7Cgptb2NrLmNhbGxzKCkubGVuZ3RoOyAvLyAxCgptb2NrLnJlc2V0KCk7Cgptb2NrLmNhbGxzKCkubGVuZ3RoOyAvLyAwCm1vY2soKTsgLy8gUmV0dXJucyB1bmRlZmluZWQgKHJldCBjbGVhcmVkKQpgYGAKCiMjIPCfp6ogVGVzdGluZyB3aXRoIE1vY2hhL0NoYWkKCmBgYGphdmFzY3JpcHQKY29uc3QgeyBleHBlY3QgfSA9IHJlcXVpcmUoJ2NoYWknKTsKY29uc3QgbW9ja3kgPSByZXF1aXJlKCdsaWwtbW9ja3knKTsKCmRlc2NyaWJlKCdNeSBNb2R1bGUnLCAoKSA9PiB7CiAgaXQoJ2NhbGxzIHRoZSBBUEkgd2l0aCBjb3JyZWN0IHBhcmFtZXRlcnMnLCAoKSA9PiB7CiAgICBjb25zdCBhcGkgPSB7CiAgICAgIGZldGNoOiAodXJsLCBvcHRpb25zKSA9PiB7IC8qIHJlYWwgaW1wbGVtZW50YXRpb24gKi8gfQogICAgfTsKCiAgICBjb25zdCBzcHkgPSBtb2NreS5zcHkoYXBpLCAnZmV0Y2gnLCBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ3VybCcsICdvcHRpb25zJykpOwogICAgc3B5LnJldChQcm9taXNlLnJlc29sdmUoeyBkYXRhOiAndGVzdCcgfSkpOwoKICAgIC8vIFRlc3QgeW91ciBjb2RlIHRoYXQgY2FsbHMgYXBpLmZldGNoKCkKICAgIG15TW9kdWxlLmRvU29tZXRoaW5nKGFwaSk7CgogICAgZXhwZWN0KHNweS5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7CiAgICAgIHVybDogJy9hcGkvZW5kcG9pbnQnLAogICAgICBvcHRpb25zOiB7IG1ldGhvZDogJ1BPU1QnIH0KICAgIH0pOwoKICAgIHNweS5yZXN0b3JlKCk7CiAgfSk7Cn0pOwpgYGAKCiMjIPCflIQgQ29tcGFyaXNvbiB3aXRoIEplc3QKCmxpbC1tb2NreSBwcm92aWRlcyBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkgdG8gSmVzdCBtb2NrcyBidXQgd2l0aCBhIGJ1aWxkZXItYmFzZWQgQVBJOgoKfCBKZXN0IHwgbGlsLW1vY2t5IHwKfC0tLS0tLXwtLS0tLS0tLS0tLXwKfCBgamVzdC5mbigpYCB8IGBtb2NreS5jcmVhdGUobW9ja3kuZnVuY3Rpb24oKSlgIHwKfCBgbW9jay5tb2NrUmV0dXJuVmFsdWUodmFsKWAgfCBgbW9jay5yZXQodmFsKWAgfAp8IGBtb2NrLm1vY2suY2FsbHNbMF1bMF1gIHwgYG1vY2suY2FsbHMoMClgIHwKfCBgamVzdC5zcHlPbihvYmosICdtZXRob2QnKWAgfCBgbW9ja3kuc3B5KG9iaiwgJ21ldGhvZCcpYCB8CnwgYHNweS5tb2NrUmVzdG9yZSgpYCB8IGBzcHkucmVzdG9yZSgpYCB8CgoqKktleSBkaWZmZXJlbmNlczoqKgotICoqQnVpbGRlciBwYXR0ZXJuKio6IGxpbC1tb2NreSB1c2VzIGNoYWluYWJsZSBidWlsZGVycyBmb3IgY29uZmlndXJhdGlvbgotICoqTmFtZWQgYXJndW1lbnRzKio6IEJ1aWx0LWluIHN1cHBvcnQgZm9yIG5hbWVkIGFyZ3VtZW50IHRyYWNraW5nCi0gKipQZXItaW5zdGFuY2UgY2xhc3MgbW9ja3MqKjogQ29uZmlndXJlIGRpZmZlcmVudCBiZWhhdmlvciBmb3IgZWFjaCBjbGFzcyBpbnN0YW5jZQotICoqU2ltcGxlciBBUEkqKjogRmV3ZXIgY29uY2VwdHMgdG8gbGVhcm4sIG1vcmUgcHJlZGljdGFibGUgYmVoYXZpb3IKCiMjIPCfk50gTm90ZXMKCiMjIyBCcmVha2luZyBDaGFuZ2VzCgoqKnYxLngqKjogRnVuY3Rpb25zIHdpdGhvdXQgYC5hcmdzKClgIGNvbmZpZ3VyYXRpb24gbm93IHJldHVybiBhbiBhcmd1bWVudHMgYXJyYXkgaW4gYC5jYWxscygpYCBpbnN0ZWFkIG9mIGBudWxsYC4gVGhpcyBlbmFibGVzIHNweSBmdW5jdGlvbmFsaXR5IGJ1dCBtYXkgYWZmZWN0IGV4aXN0aW5nIGNvZGUgdGhhdCBleHBlY3RzIGBudWxsYC4KCiMjIyBCdWlsZGVyIHZzLiBCdWlsdCBNb2NrcwoKLSBCdWlsZGVycyBoYXZlIG1ldGhvZHMgbGlrZSBgLmFyZ3MoKWAsIGAuYXN5bmMoKWAsIGAuYnVpbGQoKWAKLSBCdWlsdCBtb2NrcyBoYXZlIG1ldGhvZHMgbGlrZSBgLnJldCgpYCwgYC5jYWxscygpYCwgYC5yZXNldCgpYAotIENhbGwgYC5idWlsZCgpYCBvciB1c2UgYG1vY2t5LmNyZWF0ZSgpYCB0byBjb252ZXJ0IGEgYnVpbGRlciB0byBhIG1vY2sKCmBgYGphdmFzY3JpcHQKLy8gQnVpbGRlciAobm90IHlldCB1c2FibGUgYXMgYSBtb2NrKQpjb25zdCBidWlsZGVyID0gbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCd4Jyk7CgovLyBCdWlsdCBtb2NrIChyZWFkeSB0byB1c2UpCmNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUoYnVpbGRlcik7IC8vIG9yIGJ1aWxkZXIuYnVpbGQoKQptb2NrLnJldCgndmFsdWUnKTsKYGBgCgojIyDwn5OEIExpY2Vuc2UKCk1JVAoKIyMg8J+knSBDb250cmlidXRpbmcKCkNvbnRyaWJ1dGlvbnMgd2VsY29tZSEgUGxlYXNlIG9wZW4gYW4gaXNzdWUgb3IgUFIgb24gR2l0SHViLgoAAAAAAAAAAOgfAAAAAAAAAAAAAA",
1057
+ "CgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/"
1058
+ ],
1059
+ [
1060
+ 5,
1061
+ 1,
1062
+ "revert",
1063
+ null,
1064
+ "AwAAAAAAAAAAAAAAAAAAAAAAAAAqIAAAIyBsaWwtbW9ja3kKCkEgbGlnaHR3ZWlnaHQgSmF2YVNjcmlwdCBtb2NraW5nIGxpYnJhcnkgZm9yIHRlc3RpbmcuIENyZWF0ZSBtb2NrIGZ1bmN0aW9ucywgb2JqZWN0cywgY2xhc3NlcywgYW5kIHByb3BlcnRpZXMgd2l0aCBjYWxsIHRyYWNraW5nIGFuZCByZXR1cm4gdmFsdWUgY29udHJvbC4gSW5jbHVkZXMgc3B5IGZ1bmN0aW9uYWxpdHkgZm9yIHRyYWNraW5nIGNhbGxzIHRvIGV4aXN0aW5nIG1ldGhvZHMuCgojIyDwn46vIEZlYXR1cmVzCgotIPCfqrYgKipMaWdodHdlaWdodCoqOiBNaW5pbWFsIGRlcGVuZGVuY2llcywgZm9jdXNlZCBvbiBjb3JlIG1vY2tpbmcgZnVuY3Rpb25hbGl0eQotIPCflKcgKipGbGV4aWJsZSoqOiBCdWlsZGVyIHBhdHRlcm4gZm9yIGNvbXBvc2FibGUgbW9jayBjb25maWd1cmF0aW9uCi0g8J+TiiAqKkNhbGwgVHJhY2tpbmcqKjogQXV0b21hdGljIHRyYWNraW5nIG9mIGFsbCBmdW5jdGlvbiBjYWxscyB3aXRoIGRlZXAtY2xvbmVkIGFyZ3VtZW50cwotIPCfjq0gKipTcHkgU3VwcG9ydCoqOiBUcmFjayBjYWxscyB0byBleGlzdGluZyBtZXRob2RzIHdoaWxlIHByZXNlcnZpbmcgb3IgcmVwbGFjaW5nIGJlaGF2aW9yCi0g8J+Pl++4jyAqKkNsYXNzIE1vY2tzKio6IFBlci1pbnN0YW5jZSBtb2NrIGNvbmZpZ3VyYXRpb24gZm9yIGNvbXBsZXggY2xhc3MgdGVzdGluZwotIOKchSAqKlNpbXBsZSBBUEkqKjogQ2xlYW4sIGludHVpdGl2ZSBBUEkgdGhhdCdzIGVhc3kgdG8gbGVhcm4gYW5kIHVzZQoKIyMg8J+TpSBJbnN0YWxsYXRpb24KCmBgYGJhc2gKbnBtIGluc3RhbGwgbGlsLW1vY2t5CmBgYAoKIyMg8J+agCBRdWljayBTdGFydAoKYGBgamF2YXNjcmlwdApjb25zdCBtb2NreSA9IHJlcXVpcmUoJ2xpbC1tb2NreScpOwoKLy8gQ3JlYXRlIGEgc2ltcGxlIG1vY2sgZnVuY3Rpb24KY29uc3QgbW9jayA9IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnbmFtZScsICdhZ2UnKS5idWlsZCgpOwptb2NrLnJldCgnc3VjY2VzcycpOwoKbW9jaygnQWxpY2UnLCAzMCk7Cgpjb25zb2xlLmxvZyhtb2NrLmNhbGxzKDApKTsgLy8geyBuYW1lOiAnQWxpY2UnLCBhZ2U6IDMwIH0KY29uc29sZS5sb2cobW9jay5jYWxscygpLmxlbmd0aCk7IC8vIDEKCi8vIFNweSBvbiBhbiBleGlzdGluZyBtZXRob2QKY29uc3Qgb2JqID0geyBncmVldDogKG5hbWUpID0+IGBIZWxsbywgJHtuYW1lfSFgIH07CmNvbnN0IHNweSA9IG1vY2t5LnNweShvYmosICdncmVldCcpOwoKb2JqLmdyZWV0KCdXb3JsZCcpOwpjb25zb2xlLmxvZyhzcHkuY2FsbHMoMCkpOyAvLyBbJ1dvcmxkJ10Kc3B5LnJlc3RvcmUoKTsKYGBgCgojIyDwn5OWIEFQSSBSZWZlcmVuY2UKCiMjIyDwn5SoIEZ1bmN0aW9uIE1vY2tzCgpDcmVhdGUgbW9jayBmdW5jdGlvbnMgd2l0aCBjb25maWd1cmFibGUgYXJndW1lbnQgdHJhY2tpbmcgYW5kIHJldHVybiB2YWx1ZXM6CgpgYGBqYXZhc2NyaXB0Ci8vIEJhc2ljIGZ1bmN0aW9uIG1vY2sKY29uc3QgbW9jayA9IG1vY2t5LmZ1bmN0aW9uKCkuYnVpbGQoKTsKbW9jay5yZXQoJ3JldHVybiB2YWx1ZScpOwoKLy8gTmFtZWQgYXJndW1lbnRzCmNvbnN0IG1vY2sgPSBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ3gnLCAneScpLmJ1aWxkKCk7Cm1vY2soJ2hlbGxvJywgJ3dvcmxkJyk7Cm1vY2suY2FsbHMoMCk7IC8vIHsgeDogJ2hlbGxvJywgeTogJ3dvcmxkJyB9CgovLyBBcmd1bWVudHMgd2l0aCBkZWZhdWx0cwpjb25zdCBtb2NrID0gbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCduYW1lJywgeyBhZ2U6IDE4IH0pLmJ1aWxkKCk7Cm1vY2soJ0FsaWNlJyk7Cm1vY2suY2FsbHMoMCk7IC8vIHsgbmFtZTogJ0FsaWNlJywgYWdlOiAxOCB9CgovLyBTZWxlY3Qgc3BlY2lmaWMgYXJndW1lbnRzCmNvbnN0IG1vY2sgPSBtb2NreS5mdW5jdGlvbigpLmFyZ1NlbGVjdCgxKS5idWlsZCgpOwptb2NrKCdmaXJzdCcsICdzZWNvbmQnLCAndGhpcmQnKTsKbW9jay5jYWxscygwKTsgLy8gJ3NlY29uZCcKCi8vIEN1c3RvbSBmdW5jdGlvbiBib2R5CmNvbnN0IG1vY2sgPSBtb2NreS5mdW5jdGlvbigoY29udGV4dCkgPT4gewogIHJldHVybiBjb250ZXh0LmFyZ3MueCArIGNvbnRleHQuYXJncy55Owp9KS5hcmdzKCd4JywgJ3knKS5idWlsZCgpOwptb2NrLnJldCgxMDApOyAvLyBDYW4gc3RpbGwgb3ZlcnJpZGUgdmlhIHJldAptb2NrKDUsIDMpOyAvLyBSZXR1cm5zIDEwMAoKLy8gQXN5bmMgZnVuY3Rpb25zCmNvbnN0IG1vY2sgPSBtb2NreS5mdW5jdGlvbigpLmFzeW5jKCkuYnVpbGQoKTsKYXdhaXQgbW9jaygpOyAvLyBSZXR1cm5zIGEgcHJvbWlzZQpgYGAKCiMjIyDwn5OmIE9iamVjdCBNb2NrcwoKQ3JlYXRlIG1vY2sgb2JqZWN0cyB3aXRoIG5lc3RlZCBtb2NrczoKCmBgYGphdmFzY3JpcHQKY29uc3QgbW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5vYmplY3QoewogIG1ldGhvZDogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCdpbnB1dCcpLAogIG5lc3RlZDogbW9ja3kub2JqZWN0KHsKICAgIGRlZXBNZXRob2Q6IG1vY2t5LmZ1bmN0aW9uKCkKICB9KSwKICB2YWx1ZTogNDIKfSkpOwoKbW9jay5tZXRob2QucmV0KCdyZXN1bHQnKTsKbW9jay5tZXRob2QoJ3Rlc3QnKTsKbW9jay5tZXRob2QuY2FsbHMoMCk7IC8vIHsgaW5wdXQ6ICd0ZXN0JyB9CgovLyBSZXNldCBhbGwgbmVzdGVkIG1vY2tzCm1vY2sucmVzZXQoKTsKYGBgCgojIyMg8J+Pm++4jyBDbGFzcyBNb2NrcwoKQ3JlYXRlIG1vY2sgY2xhc3NlcyB3aXRoIHBlci1pbnN0YW5jZSBjb25maWd1cmF0aW9uOgoKYGBgamF2YXNjcmlwdApjb25zdCBNb2NrID0gbW9ja3kuY3JlYXRlKG1vY2t5LmNsYXNzKHsKICBjb25zdHJ1Y3RvcjogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCduYW1lJyksCiAgZ3JlZXQ6IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnZ3JlZXRpbmcnKQp9KSk7CgovLyBQcmUtY29uZmlndXJlIGluc3RhbmNlIGJlaGF2aW9yCk1vY2suaW5zdCgwKS5ncmVldC5yZXQoJ0hlbGxvIScpOwpNb2NrLmluc3QoMSkuZ3JlZXQucmV0KCdIb2xhIScpOwoKY29uc3QgaW5zdGFuY2UxID0gbmV3IE1vY2soJ0FsaWNlJyk7CmNvbnN0IGluc3RhbmNlMiA9IG5ldyBNb2NrKCdCb2InKTsKCmluc3RhbmNlMS5ncmVldCgnSGknKTsgLy8gUmV0dXJucyAnSGVsbG8hJwppbnN0YW5jZTIuZ3JlZXQoJ0hpJyk7IC8vIFJldHVybnMgJ0hvbGEhJwoKLy8gQWNjZXNzIGluc3RhbmNlIG1vY2tzIGFmdGVyIGNyZWF0aW9uCk1vY2suaW5zdCgwKS5jb25zdHJ1Y3Rvci5jYWxscygwKTsgLy8geyBuYW1lOiAnQWxpY2UnIH0KTW9jay5udW1JbnN0cygpOyAvLyAyCmBgYAoKIyMjIPCfjq8gUHJvcGVydHkgTW9ja3MKCkNyZWF0ZSBnZXR0ZXIvc2V0dGVyIHByb3BlcnRpZXM6CgpgYGBqYXZhc2NyaXB0CmNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kub2JqZWN0KHsKICB2YWx1ZTogbW9ja3kucHJvcGVydHkoKQp9KSk7Cgptb2NrLnZhbHVlID0gNDI7CmNvbnNvbGUubG9nKG1vY2sudmFsdWUpOyAvLyA0MgpgYGAKCiMjIyDwn5SNIFNweSBGdW5jdGlvbgoKVHJhY2sgY2FsbHMgdG8gZXhpc3RpbmcgbWV0aG9kcyB3aGlsZSBvcHRpb25hbGx5IHJlcGxhY2luZyB0aGVpciBpbXBsZW1lbnRhdGlvbjoKCmBgYGphdmFzY3JpcHQKLy8gQmFzaWMgc3B5IC0gY2FsbHMgdGhyb3VnaCB0byBvcmlnaW5hbApjb25zdCBvYmogPSB7IGFkZDogKGEsIGIpID0+IGEgKyBiIH07CmNvbnN0IHNweSA9IG1vY2t5LnNweShvYmosICdhZGQnKTsKCm9iai5hZGQoMiwgMyk7IC8vIFJldHVybnMgNQpzcHkuY2FsbHMoMCk7IC8vIFsyLCAzXQoKLy8gT3ZlcnJpZGUgcmV0dXJuIHZhbHVlCnNweS5yZXQoMTAwKTsKb2JqLmFkZCgyLCAzKTsgLy8gUmV0dXJucyAxMDAKCi8vIFNweSB3aXRoIGN1c3RvbSByZXBsYWNlbWVudApjb25zdCBzcHkgPSBtb2NreS5zcHkob2JqLCAnYWRkJywgbW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKICBjb25zdCByZXN1bHQgPSBjb250ZXh0Lm9yaWdpbmFsLmFwcGx5KGNvbnRleHQuc2VsZiwgY29udGV4dC5yYXdBcmdzKTsKICByZXR1cm4gcmVzdWx0ICogMjsgLy8gRG91YmxlIHRoZSByZXN1bHQKfSkuYXJncygnYScsICdiJykpOwoKb2JqLmFkZCg1LCAzKTsgLy8gUmV0dXJucyAxNiAoNSszKSoyCnNweS5jYWxscygwKTsgLy8geyBhOiA1LCBiOiAzIH0KCi8vIFJlc3RvcmUgb3JpZ2luYWwgbWV0aG9kCnNweS5yZXN0b3JlKCk7Cm9iai5hZGQoMiwgMyk7IC8vIFJldHVybnMgNSBhZ2FpbgoKLy8gU3B5IG9uIGNsYXNzIHByb3RvdHlwZXMKY2xhc3MgTXlDbGFzcyB7CiAgZG9UaGluZygpIHsgcmV0dXJuICdvcmlnaW5hbCc7IH0KfQoKY29uc3Qgc3B5ID0gbW9ja3kuc3B5KE15Q2xhc3MucHJvdG90eXBlLCAnZG9UaGluZycpOwpjb25zdCBpbnN0YW5jZSA9IG5ldyBNeUNsYXNzKCk7Cmluc3RhbmNlLmRvVGhpbmcoKTsgLy8gQ2FsbHMgdGhyb3VnaCB0byBvcmlnaW5hbApzcHkuY2FsbHMoKS5sZW5ndGg7IC8vIDEKc3B5LnJlc3RvcmUoKTsKYGBgCgojIyDwn46oIEFkdmFuY2VkIFVzYWdlCgojIyMgUmV0dXJuIFZhbHVlcyBQZXIgQ2FsbAoKQ29uZmlndXJlIGRpZmZlcmVudCByZXR1cm4gdmFsdWVzIGZvciBlYWNoIGNhbGw6CgpgYGBqYXZhc2NyaXB0CmNvbnN0IG1vY2sgPSBtb2NreS5mdW5jdGlvbigpLmJ1aWxkKCk7Cgptb2NrLnJldCgnZGVmYXVsdCcpOyAvLyBDYWxsIDAgKGRlZmF1bHQgZm9yIGFsbCBjYWxscykKbW9jay5yZXQoJ2ZpcnN0JywgMSk7IC8vIENhbGwgMQptb2NrLnJldCgnc2Vjb25kJywgMik7IC8vIENhbGwgMgoKbW9jaygpOyAvLyAnZmlyc3QnCm1vY2soKTsgLy8gJ3NlY29uZCcKbW9jaygpOyAvLyAnZGVmYXVsdCcgKGZhbGxzIGJhY2sgdG8gY2FsbCAwKQpgYGAKCiMjIyBEeW5hbWljIFJldHVybiBWYWx1ZXMKClVzZSBoYW5kbGVycyBmb3IgZHluYW1pYyByZXR1cm4gdmFsdWVzIGJhc2VkIG9uIGFyZ3VtZW50czoKCmBgYGphdmFzY3JpcHQKY29uc3QgbW9jayA9IG1vY2t5LmNyZWF0ZShtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ3gnKSk7Cgptb2NrLm9uUmV0KChhcmdzKSA9PiBhcmdzLnggKiAyKTsKCm1vY2soNSk7IC8vIFJldHVybnMgMTAKbW9jaygzKTsgLy8gUmV0dXJucyA2CmBgYAoKIyMjIEVycm9yIFRocm93aW5nCgpSZXR1cm4gYW4gRXJyb3IgaW5zdGFuY2UgdG8gbWFrZSB0aGUgbW9jayB0aHJvdzoKCmBgYGphdmFzY3JpcHQKY29uc3QgbW9jayA9IG1vY2t5LmZ1bmN0aW9uKCkuYnVpbGQoKTsKbW9jay5yZXQobmV3IEVycm9yKCdUZXN0IGVycm9yJykpOwoKbW9jaygpOyAvLyBUaHJvd3MgJ1Rlc3QgZXJyb3InCmBgYAoKIyMjIEN1c3RvbSBDb250ZXh0CgpBY2Nlc3MgZnVsbCBjb250ZXh0IGluIGN1c3RvbSBmdW5jdGlvbiBib2RpZXM6CgpgYGBqYXZhc2NyaXB0CmNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUobW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKICAvLyBjb250ZXh0LnNlbGYgLSBUaGUgJ3RoaXMnIGNvbnRleHQKICAvLyBjb250ZXh0LnN0YXRlIC0gSW50ZXJuYWwgc3RhdGUgb2JqZWN0CiAgLy8gY29udGV4dC5jYWxsIC0gQ2FsbCBudW1iZXIgKDEtaW5kZXhlZCkKICAvLyBjb250ZXh0LmFyZ3MgLSBQcm9jZXNzZWQgYXJndW1lbnRzCiAgLy8gY29udGV4dC5yYXdBcmdzIC0gVW5wcm9jZXNzZWQgYXJndW1lbnRzIGFycmF5CiAgLy8gY29udGV4dC5vcmlnaW5hbCAtIE9yaWdpbmFsIGZ1bmN0aW9uIChpZiBzZXQgdmlhIC5vcmlnaW5hbCgpKQogIC8vIGNvbnRleHQucmV0IC0gQ29uZmlndXJlZCByZXR1cm4gdmFsdWUKCiAgcmV0dXJuIGNvbnRleHQucmV0IHx8ICdkZWZhdWx0JzsKfSkuYXJncygneCcsICd5JykpOwpgYGAKCiMjIyBSZXNldHRpbmcgTW9ja3MKCkFsbCBtb2NrcyBzdXBwb3J0IGAucmVzZXQoKWAgdG8gY2xlYXIgc3RhdGU6CgpgYGBqYXZhc2NyaXB0CmNvbnN0IG1vY2sgPSBtb2NreS5mdW5jdGlvbigpLmJ1aWxkKCk7Cm1vY2sucmV0KCd2YWx1ZScpOwptb2NrKCd0ZXN0Jyk7Cgptb2NrLmNhbGxzKCkubGVuZ3RoOyAvLyAxCgptb2NrLnJlc2V0KCk7Cgptb2NrLmNhbGxzKCkubGVuZ3RoOyAvLyAwCm1vY2soKTsgLy8gUmV0dXJucyB1bmRlZmluZWQgKHJldCBjbGVhcmVkKQpgYGAKCiMjIPCfp6ogVGVzdGluZyB3aXRoIE1vY2hhL0NoYWkKCmBgYGphdmFzY3JpcHQKY29uc3QgeyBleHBlY3QgfSA9IHJlcXVpcmUoJ2NoYWknKTsKY29uc3QgbW9ja3kgPSByZXF1aXJlKCdsaWwtbW9ja3knKTsKCmRlc2NyaWJlKCdNeSBNb2R1bGUnLCAoKSA9PiB7CiAgaXQoJ2NhbGxzIHRoZSBBUEkgd2l0aCBjb3JyZWN0IHBhcmFtZXRlcnMnLCAoKSA9PiB7CiAgICBjb25zdCBhcGkgPSB7CiAgICAgIGZldGNoOiAodXJsLCBvcHRpb25zKSA9PiB7IC8qIHJlYWwgaW1wbGVtZW50YXRpb24gKi8gfQogICAgfTsKCiAgICBjb25zdCBzcHkgPSBtb2NreS5zcHkoYXBpLCAnZmV0Y2gnLCBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ3VybCcsICdvcHRpb25zJykpOwogICAgc3B5LnJldChQcm9taXNlLnJlc29sdmUoeyBkYXRhOiAndGVzdCcgfSkpOwoKICAgIC8vIFRlc3QgeW91ciBjb2RlIHRoYXQgY2FsbHMgYXBpLmZldGNoKCkKICAgIG15TW9kdWxlLmRvU29tZXRoaW5nKGFwaSk7CgogICAgZXhwZWN0KHNweS5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7CiAgICAgIHVybDogJy9hcGkvZW5kcG9pbnQnLAogICAgICBvcHRpb25zOiB7IG1ldGhvZDogJ1BPU1QnIH0KICAgIH0pOwoKICAgIHNweS5yZXN0b3JlKCk7CiAgfSk7Cn0pOwpgYGAKCiMjIPCflIQgQ29tcGFyaXNvbiB3aXRoIEplc3QKCmxpbC1tb2NreSBwcm92aWRlcyBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkgdG8gSmVzdCBtb2NrcyBidXQgd2l0aCBhIGJ1aWxkZXItYmFzZWQgQVBJOgoKfCBKZXN0IHwgbGlsLW1vY2t5IHwKfC0tLS0tLXwtLS0tLS0tLS0tLXwKfCBgamVzdC5mbigpYCB8IGBtb2NreS5jcmVhdGUobW9ja3kuZnVuY3Rpb24oKSlgIHwKfCBgbW9jay5tb2NrUmV0dXJuVmFsdWUodmFsKWAgfCBgbW9jay5yZXQodmFsKWAgfAp8IGBtb2NrLm1vY2suY2FsbHNbMF1bMF1gIHwgYG1vY2suY2FsbHMoMClgIHwKfCBgamVzdC5zcHlPbihvYmosICdtZXRob2QnKWAgfCBgbW9ja3kuc3B5KG9iaiwgJ21ldGhvZCcpYCB8CnwgYHNweS5tb2NrUmVzdG9yZSgpYCB8IGBzcHkucmVzdG9yZSgpYCB8CgoqKktleSBkaWZmZXJlbmNlczoqKgotICoqQnVpbGRlciBwYXR0ZXJuKio6IGxpbC1tb2NreSB1c2VzIGNoYWluYWJsZSBidWlsZGVycyBmb3IgY29uZmlndXJhdGlvbgotICoqTmFtZWQgYXJndW1lbnRzKio6IEJ1aWx0LWluIHN1cHBvcnQgZm9yIG5hbWVkIGFyZ3VtZW50IHRyYWNraW5nCi0gKipQZXItaW5zdGFuY2UgY2xhc3MgbW9ja3MqKjogQ29uZmlndXJlIGRpZmZlcmVudCBiZWhhdmlvciBmb3IgZWFjaCBjbGFzcyBpbnN0YW5jZQotICoqU2ltcGxlciBBUEkqKjogRmV3ZXIgY29uY2VwdHMgdG8gbGVhcm4sIG1vcmUgcHJlZGljdGFibGUgYmVoYXZpb3IKCiMjIPCfk50gTm90ZXMKCiMjIyBCcmVha2luZyBDaGFuZ2VzCgoqKnYxLngqKjogRnVuY3Rpb25zIHdpdGhvdXQgYC5hcmdzKClgIGNvbmZpZ3VyYXRpb24gbm93IHJldHVybiBhbiBhcmd1bWVudHMgYXJyYXkgaW4gYC5jYWxscygpYCBpbnN0ZWFkIG9mIGBudWxsYC4gVGhpcyBlbmFibGVzIHNweSBmdW5jdGlvbmFsaXR5IGJ1dCBtYXkgYWZmZWN0IGV4aXN0aW5nIGNvZGUgdGhhdCBleHBlY3RzIGBudWxsYC4KCiMjIyBCdWlsZGVyIHZzLiBCdWlsdCBNb2NrcwoKLSBCdWlsZGVycyBoYXZlIG1ldGhvZHMgbGlrZSBgLmFyZ3MoKWAsIGAuYXN5bmMoKWAsIGAuYnVpbGQoKWAKLSBCdWlsdCBtb2NrcyBoYXZlIG1ldGhvZHMgbGlrZSBgLnJldCgpYCwgYC5jYWxscygpYCwgYC5yZXNldCgpYAotIENhbGwgYC5idWlsZCgpYCBvciB1c2UgYG1vY2t5LmNyZWF0ZSgpYCB0byBjb252ZXJ0IGEgYnVpbGRlciB0byBhIG1vY2sKCmBgYGphdmFzY3JpcHQKLy8gQnVpbGRlciAobm90IHlldCB1c2FibGUgYXMgYSBtb2NrKQpjb25zdCBidWlsZGVyID0gbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCd4Jyk7CgovLyBCdWlsdCBtb2NrIChyZWFkeSB0byB1c2UpCmNvbnN0IG1vY2sgPSBtb2NreS5jcmVhdGUoYnVpbGRlcik7IC8vIG9yIGJ1aWxkZXIuYnVpbGQoKQptb2NrLnJldCgndmFsdWUnKTsKYGBgCgojIyDwn5OEIExpY2Vuc2UKCk1JVAoKIyMg8J+knSBDb250cmlidXRpbmcKCkNvbnRyaWJ1dGlvbnMgd2VsY29tZSEgUGxlYXNlIG9wZW4gYW4gaXNzdWUgb3IgUFIgb24gR2l0SHViLgoAAAAAAAAAAAggAAAAAAAAAAAAAAAAAAAAAAAACCAAAAAAAAAAAAAA",
1065
+ "CgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/"
1066
+ ],
1067
+ [
1068
+ 3,
1069
+ 1,
1070
+ "revert",
1071
+ null,
1072
+ "CAAAAAAAAAAAAAAAAAAAAAAAAABKIAAAIyBsaWwtbW9ja3kKCkEgbGlnaHR3ZWlnaHQgSmF2YVNjcmlwdCBtb2NraW5nIGxpYnJhcnkgZm9yIHRlc3RpbmcuIENyZWF0ZSBtb2NrIGZ1bmN0aW9ucywgb2JqZWN0cywgY2xhc3NlcywgYW5kIHByb3BlcnRpZXMgd2l0aCBjYWxsIHRyYWNraW5nIGFuZCByZXR1cm4gdmFsdWUgY29udHJvbC4gSW5jbHVkZXMgc3B5IGZ1bmN0aW9uYWxpdHkgZm9yIHRyYWNraW5nIGNhbGxzIHRvIGV4aXN0aW5nIG1ldGhvZHMuCgojIyDwn46vIEZlYXR1cmVzCgotIPCfqrYgKipMaWdodHdlaWdodCoqOiBNaW5pbWFsIGRlcGVuZGVuY2llcywgZm9jdXNlZCBvbiBjb3JlIG1vY2tpbmcgZnVuY3Rpb25hbGl0eQotIPCflKcgKipGbGV4aWJsZSoqOiBCdWlsZGVyIHBhdHRlcm4gZm9yIGNvbXBvc2FibGUgbW9jayBjb25maWd1cmF0aW9uCi0g8J+TiiAqKkNhbGwgVHJhY2tpbmcqKjogQXV0b21hdGljIHRyYWNraW5nIG9mIGFsbCBmdW5jdGlvbiBjYWxscyB3aXRoIGRlZXAtY2xvbmVkIGFyZ3VtZW50cwotIPCfjq0gKipTcHkgU3VwcG9ydCoqOiBUcmFjayBjYWxscyB0byBleGlzdGluZyBtZXRob2RzIHdoaWxlIHByZXNlcnZpbmcgb3IgcmVwbGFjaW5nIGJlaGF2aW9yCi0g8J+Pl++4jyAqKkNsYXNzIE1vY2tzKio6IFBlci1pbnN0YW5jZSBtb2NrIGNvbmZpZ3VyYXRpb24gZm9yIGNvbXBsZXggY2xhc3MgdGVzdGluZwotIOKchSAqKlNpbXBsZSBBUEkqKjogQ2xlYW4sIGludHVpdGl2ZSBBUEkgdGhhdCdzIGVhc3kgdG8gbGVhcm4gYW5kIHVzZQoKIyMg8J+TpSBJbnN0YWxsYXRpb24KCmBgYGJhc2gKbnBtIGluc3RhbGwgbGlsLW1vY2t5CmBgYAoKIyMg8J+agCBRdWljayBTdGFydAoKYGBgamF2YXNjcmlwdApjb25zdCBtb2NreSA9IHJlcXVpcmUoJ2xpbC1tb2NreScpOwoKLy8gQ3JlYXRlIGEgc2ltcGxlIG1vY2sgZnVuY3Rpb24KY29uc3QgbW9jayA9IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnbmFtZScsICdhZ2UnKS5idWlsZCgpOwptb2NrLnJldCgnc3VjY2VzcycpOwoKbW9jaygnQWxpY2UnLCAzMCk7Cgpjb25zb2xlLmxvZyhtb2NrLmNhbGxzKDApKTsgLy8geyBuYW1lOiAnQWxpY2UnLCBhZ2U6IDMwIH0KY29uc29sZS5sb2cobW9jay5jYWxscygpLmxlbmd0aCk7IC8vIDEKCi8vIFNweSBvbiBhbiBleGlzdGluZyBtZXRob2QKY29uc3Qgb2JqID0geyBncmVldDogKG5hbWUpID0+IGBIZWxsbywgJHtuYW1lfSFgIH07CmNvbnN0IHNweSA9IG1vY2t5LnNweShvYmosICdncmVldCcpOwoKb2JqLmdyZWV0KCdXb3JsZCcpOwpjb25zb2xlLmxvZyhzcHkuY2FsbHMoMCkpOyAvLyBbJ1dvcmxkJ10Kc3B5LnJlc3RvcmUoKTsKYGBgCgojIyDwn5OWIEFQSSBSZWZlcmVuY2UKCiMjIyDwn5SoIEZ1bmN0aW9uIE1vY2tzCgpDcmVhdGUgbW9jayBmdW5jdGlvbnMgd2l0aCBjb25maWd1cmFibGUgYXJndW1lbnQgdHJhY2tpbmcgYW5kIHJldHVybiB2YWx1ZXM6CgpgYGBqYXZhc2NyaXB0Ci8vIEJhc2ljIGZ1bmN0aW9uIG1vY2sKY29uc3QgbW9jayA9IG1vY2t5LmZ1bmN0aW9uKCkuYnVpbGQoKTsKbW9jay5yZXQoJ3JldHVybiB2YWx1ZScpOwoKLy8gTmFtZWQgYXJndW1lbnRzCmNvbnN0IG1vY2sgPSBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ3gnLCAneScpLmJ1aWxkKCk7Cm1vY2soJ2hlbGxvJywgJ3dvcmxkJyk7Cm1vY2suY2FsbHMoMCk7IC8vIHsgeDogJ2hlbGxvJywgeTogJ3dvcmxkJyB9CgovLyBBcmd1bWVudHMgd2l0aCBkZWZhdWx0cwpjb25zdCBtb2NrID0gbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCduYW1lJywgeyBhZ2U6IDE4IH0pLmJ1aWxkKCk7Cm1vY2soJ0FsaWNlJyk7Cm1vY2suY2FsbHMoMCk7IC8vIHsgbmFtZTogJ0FsaWNlJywgYWdlOiAxOCB9CgovLyBTZWxlY3Qgc3BlY2lmaWMgYXJndW1lbnRzCmNvbnN0IG1vY2sgPSBtb2NreS5mdW5jdGlvbigpLmFyZ1NlbGVjdCgxKS5idWlsZCgpOwptb2NrKCdmaXJzdCcsICdzZWNvbmQnLCAndGhpcmQnKTsKbW9jay5jYWxscygwKTsgLy8gJ3NlY29uZCcKCi8vIEN1c3RvbSBmdW5jdGlvbiBib2R5CmNvbnN0IG1vY2sgPSBtb2NreS5mdW5jdGlvbigoY29udGV4dCkgPT4gewogIHJldHVybiBjb250ZXh0LmFyZ3MueCArIGNvbnRleHQuYXJncy55Owp9KS5hcmdzKCd4JywgJ3knKS5idWlsZCgpOwptb2NrLnJldCgxMDApOyAvLyBDYW4gc3RpbGwgb3ZlcnJpZGUgdmlhIHJldAptb2NrKDUsIDMpOyAvLyBSZXR1cm5zIDEwMAoKLy8gQXN5bmMgZnVuY3Rpb25zCmNvbnN0IG1vY2sgPSBtb2NreS5mdW5jdGlvbigpLmFzeW5jKCkuYnVpbGQoKTsKYXdhaXQgbW9jaygpOyAvLyBSZXR1cm5zIGEgcHJvbWlzZQpgYGAKCiMjIyDwn5OmIE9iamVjdCBNb2NrcwoKQ3JlYXRlIG1vY2sgb2JqZWN0cyB3aXRoIG5lc3RlZCBtb2NrczoKCmBgYGphdmFzY3JpcHQKY29uc3QgbW9jayA9IG1vY2t5Lm9iamVjdCh7CiAgbWV0aG9kOiBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ2lucHV0JyksCiAgbmVzdGVkOiBtb2NreS5vYmplY3QoewogICAgZGVlcE1ldGhvZDogbW9ja3kuZnVuY3Rpb24oKQogIH0pLAogIHZhbHVlOiA0Mgp9KS5idWlsZCgpOwoKbW9jay5tZXRob2QucmV0KCdyZXN1bHQnKTsKbW9jay5tZXRob2QoJ3Rlc3QnKTsKbW9jay5tZXRob2QuY2FsbHMoMCk7IC8vIHsgaW5wdXQ6ICd0ZXN0JyB9CgovLyBSZXNldCBhbGwgbmVzdGVkIG1vY2tzCm1vY2sucmVzZXQoKTsKYGBgCgojIyMg8J+Pm++4jyBDbGFzcyBNb2NrcwoKQ3JlYXRlIG1vY2sgY2xhc3NlcyB3aXRoIHBlci1pbnN0YW5jZSBjb25maWd1cmF0aW9uOgoKYGBgamF2YXNjcmlwdApjb25zdCBNb2NrID0gbW9ja3kuY2xhc3MoewogIGNvbnN0cnVjdG9yOiBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ25hbWUnKSwKICBncmVldDogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCdncmVldGluZycpCn0pLmJ1aWxkKCk7CgovLyBQcmUtY29uZmlndXJlIGluc3RhbmNlIGJlaGF2aW9yCk1vY2suaW5zdCgwKS5ncmVldC5yZXQoJ0hlbGxvIScpOwpNb2NrLmluc3QoMSkuZ3JlZXQucmV0KCdIb2xhIScpOwoKY29uc3QgaW5zdGFuY2UxID0gbmV3IE1vY2soJ0FsaWNlJyk7CmNvbnN0IGluc3RhbmNlMiA9IG5ldyBNb2NrKCdCb2InKTsKCmluc3RhbmNlMS5ncmVldCgnSGknKTsgLy8gUmV0dXJucyAnSGVsbG8hJwppbnN0YW5jZTIuZ3JlZXQoJ0hpJyk7IC8vIFJldHVybnMgJ0hvbGEhJwoKLy8gQWNjZXNzIGluc3RhbmNlIG1vY2tzIGFmdGVyIGNyZWF0aW9uCk1vY2suaW5zdCgwKS5jb25zdHJ1Y3Rvci5jYWxscygwKTsgLy8geyBuYW1lOiAnQWxpY2UnIH0KTW9jay5udW1JbnN0cygpOyAvLyAyCmBgYAoKIyMjIPCfjq8gUHJvcGVydHkgTW9ja3MKCkNyZWF0ZSBnZXR0ZXIvc2V0dGVyIHByb3BlcnRpZXM6CgpgYGBqYXZhc2NyaXB0CmNvbnN0IG1vY2sgPSBtb2NreS5vYmplY3QoewogIHZhbHVlOiBtb2NreS5wcm9wZXJ0eSgpCn0pLmJ1aWxkKCk7Cgptb2NrLnZhbHVlID0gNDI7CmNvbnNvbGUubG9nKG1vY2sudmFsdWUpOyAvLyA0MgpgYGAKCiMjIyDwn5SNIFNweSBGdW5jdGlvbgoKVHJhY2sgY2FsbHMgdG8gZXhpc3RpbmcgbWV0aG9kcyB3aGlsZSBvcHRpb25hbGx5IHJlcGxhY2luZyB0aGVpciBpbXBsZW1lbnRhdGlvbjoKCmBgYGphdmFzY3JpcHQKLy8gQmFzaWMgc3B5IC0gY2FsbHMgdGhyb3VnaCB0byBvcmlnaW5hbApjb25zdCBvYmogPSB7IGFkZDogKGEsIGIpID0+IGEgKyBiIH07CmNvbnN0IHNweSA9IG1vY2t5LnNweShvYmosICdhZGQnKTsKCm9iai5hZGQoMiwgMyk7IC8vIFJldHVybnMgNQpzcHkuY2FsbHMoMCk7IC8vIFsyLCAzXQoKLy8gT3ZlcnJpZGUgcmV0dXJuIHZhbHVlCnNweS5yZXQoMTAwKTsKb2JqLmFkZCgyLCAzKTsgLy8gUmV0dXJucyAxMDAKCi8vIFNweSB3aXRoIGN1c3RvbSByZXBsYWNlbWVudApjb25zdCBzcHkgPSBtb2NreS5zcHkob2JqLCAnYWRkJywgbW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKICBjb25zdCByZXN1bHQgPSBjb250ZXh0Lm9yaWdpbmFsLmFwcGx5KGNvbnRleHQuc2VsZiwgY29udGV4dC5yYXdBcmdzKTsKICByZXR1cm4gcmVzdWx0ICogMjsgLy8gRG91YmxlIHRoZSByZXN1bHQKfSkuYXJncygnYScsICdiJykpOwoKb2JqLmFkZCg1LCAzKTsgLy8gUmV0dXJucyAxNiAoNSszKSoyCnNweS5jYWxscygwKTsgLy8geyBhOiA1LCBiOiAzIH0KCi8vIFJlc3RvcmUgb3JpZ2luYWwgbWV0aG9kCnNweS5yZXN0b3JlKCk7Cm9iai5hZGQoMiwgMyk7IC8vIFJldHVybnMgNSBhZ2FpbgoKLy8gU3B5IG9uIGNsYXNzIHByb3RvdHlwZXMKY2xhc3MgTXlDbGFzcyB7CiAgZG9UaGluZygpIHsgcmV0dXJuICdvcmlnaW5hbCc7IH0KfQoKY29uc3Qgc3B5ID0gbW9ja3kuc3B5KE15Q2xhc3MucHJvdG90eXBlLCAnZG9UaGluZycpOwpjb25zdCBpbnN0YW5jZSA9IG5ldyBNeUNsYXNzKCk7Cmluc3RhbmNlLmRvVGhpbmcoKTsgLy8gQ2FsbHMgdGhyb3VnaCB0byBvcmlnaW5hbApzcHkuY2FsbHMoKS5sZW5ndGg7IC8vIDEKc3B5LnJlc3RvcmUoKTsKYGBgCgojIyDwn46oIEFkdmFuY2VkIFVzYWdlCgojIyMgUmV0dXJuIFZhbHVlcyBQZXIgQ2FsbAoKQ29uZmlndXJlIGRpZmZlcmVudCByZXR1cm4gdmFsdWVzIGZvciBlYWNoIGNhbGw6CgpgYGBqYXZhc2NyaXB0CmNvbnN0IG1vY2sgPSBtb2NreS5mdW5jdGlvbigpLmJ1aWxkKCk7Cgptb2NrLnJldCgnZGVmYXVsdCcpOyAvLyBDYWxsIDAgKGRlZmF1bHQgZm9yIGFsbCBjYWxscykKbW9jay5yZXQoJ2ZpcnN0JywgMSk7IC8vIENhbGwgMQptb2NrLnJldCgnc2Vjb25kJywgMik7IC8vIENhbGwgMgoKbW9jaygpOyAvLyAnZmlyc3QnCm1vY2soKTsgLy8gJ3NlY29uZCcKbW9jaygpOyAvLyAnZGVmYXVsdCcgKGZhbGxzIGJhY2sgdG8gY2FsbCAwKQpgYGAKCiMjIyBEeW5hbWljIFJldHVybiBWYWx1ZXMKClVzZSBoYW5kbGVycyBmb3IgZHluYW1pYyByZXR1cm4gdmFsdWVzIGJhc2VkIG9uIGFyZ3VtZW50czoKCmBgYGphdmFzY3JpcHQKY29uc3QgbW9jayA9IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygneCcpLmJ1aWxkKCk7Cgptb2NrLm9uUmV0KChhcmdzKSA9PiBhcmdzLnggKiAyKTsKCm1vY2soNSk7IC8vIFJldHVybnMgMTAKbW9jaygzKTsgLy8gUmV0dXJucyA2CmBgYAoKIyMjIEVycm9yIFRocm93aW5nCgpSZXR1cm4gYW4gRXJyb3IgaW5zdGFuY2UgdG8gbWFrZSB0aGUgbW9jayB0aHJvdzoKCmBgYGphdmFzY3JpcHQKY29uc3QgbW9jayA9IG1vY2t5LmZ1bmN0aW9uKCkuYnVpbGQoKTsKbW9jay5yZXQobmV3IEVycm9yKCdUZXN0IGVycm9yJykpOwoKbW9jaygpOyAvLyBUaHJvd3MgJ1Rlc3QgZXJyb3InCmBgYAoKIyMjIEN1c3RvbSBDb250ZXh0CgpBY2Nlc3MgZnVsbCBjb250ZXh0IGluIGN1c3RvbSBmdW5jdGlvbiBib2RpZXM6CgpgYGBqYXZhc2NyaXB0CmNvbnN0IG1vY2sgPSBtb2NreS5mdW5jdGlvbigoY29udGV4dCkgPT4gewogIC8vIGNvbnRleHQuc2VsZiAtIFRoZSAndGhpcycgY29udGV4dAogIC8vIGNvbnRleHQuc3RhdGUgLSBJbnRlcm5hbCBzdGF0ZSBvYmplY3QKICAvLyBjb250ZXh0LmNhbGwgLSBDYWxsIG51bWJlciAoMS1pbmRleGVkKQogIC8vIGNvbnRleHQuYXJncyAtIFByb2Nlc3NlZCBhcmd1bWVudHMKICAvLyBjb250ZXh0LnJhd0FyZ3MgLSBVbnByb2Nlc3NlZCBhcmd1bWVudHMgYXJyYXkKICAvLyBjb250ZXh0Lm9yaWdpbmFsIC0gT3JpZ2luYWwgZnVuY3Rpb24gKGlmIHNldCB2aWEgLm9yaWdpbmFsKCkpCiAgLy8gY29udGV4dC5yZXQgLSBDb25maWd1cmVkIHJldHVybiB2YWx1ZQoKICByZXR1cm4gY29udGV4dC5yZXQgfHwgJ2RlZmF1bHQnOwp9KS5hcmdzKCd4JywgJ3knKS5idWlsZCgpOwpgYGAKCiMjIyBSZXNldHRpbmcgTW9ja3MKCkFsbCBtb2NrcyBzdXBwb3J0IGAucmVzZXQoKWAgdG8gY2xlYXIgc3RhdGU6CgpgYGBqYXZhc2NyaXB0CmNvbnN0IG1vY2sgPSBtb2NreS5mdW5jdGlvbigpLmJ1aWxkKCk7Cm1vY2sucmV0KCd2YWx1ZScpOwptb2NrKCd0ZXN0Jyk7Cgptb2NrLmNhbGxzKCkubGVuZ3RoOyAvLyAxCgptb2NrLnJlc2V0KCk7Cgptb2NrLmNhbGxzKCkubGVuZ3RoOyAvLyAwCm1vY2soKTsgLy8gUmV0dXJucyB1bmRlZmluZWQgKHJldCBjbGVhcmVkKQpgYGAKCiMjIPCfp6ogVGVzdGluZyB3aXRoIE1vY2hhL0NoYWkKCmBgYGphdmFzY3JpcHQKY29uc3QgeyBleHBlY3QgfSA9IHJlcXVpcmUoJ2NoYWknKTsKY29uc3QgbW9ja3kgPSByZXF1aXJlKCdsaWwtbW9ja3knKTsKCmRlc2NyaWJlKCdNeSBNb2R1bGUnLCAoKSA9PiB7CiAgaXQoJ2NhbGxzIHRoZSBBUEkgd2l0aCBjb3JyZWN0IHBhcmFtZXRlcnMnLCAoKSA9PiB7CiAgICBjb25zdCBhcGkgPSB7CiAgICAgIGZldGNoOiAodXJsLCBvcHRpb25zKSA9PiB7IC8qIHJlYWwgaW1wbGVtZW50YXRpb24gKi8gfQogICAgfTsKCiAgICBjb25zdCBzcHkgPSBtb2NreS5zcHkoYXBpLCAnZmV0Y2gnLCBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ3VybCcsICdvcHRpb25zJykpOwogICAgc3B5LnJldChQcm9taXNlLnJlc29sdmUoeyBkYXRhOiAndGVzdCcgfSkpOwoKICAgIC8vIFRlc3QgeW91ciBjb2RlIHRoYXQgY2FsbHMgYXBpLmZldGNoKCkKICAgIG15TW9kdWxlLmRvU29tZXRoaW5nKGFwaSk7CgogICAgZXhwZWN0KHNweS5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7CiAgICAgIHVybDogJy9hcGkvZW5kcG9pbnQnLAogICAgICBvcHRpb25zOiB7IG1ldGhvZDogJ1BPU1QnIH0KICAgIH0pOwoKICAgIHNweS5yZXN0b3JlKCk7CiAgfSk7Cn0pOwpgYGAKCiMjIPCflIQgQ29tcGFyaXNvbiB3aXRoIEplc3QKCmxpbC1tb2NreSBwcm92aWRlcyBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkgdG8gSmVzdCBtb2NrcyBidXQgd2l0aCBhIGJ1aWxkZXItYmFzZWQgQVBJOgoKfCBKZXN0IHwgbGlsLW1vY2t5IHwKfC0tLS0tLXwtLS0tLS0tLS0tLXwKfCBgamVzdC5mbigpYCB8IGBtb2NreS5mdW5jdGlvbigpLmJ1aWxkKClgIHwKfCBgbW9jay5tb2NrUmV0dXJuVmFsdWUodmFsKWAgfCBgbW9jay5yZXQodmFsKWAgfAp8IGBtb2NrLm1vY2suY2FsbHNbMF1bMF1gIHwgYG1vY2suY2FsbHMoMClgIHwKfCBgamVzdC5zcHlPbihvYmosICdtZXRob2QnKWAgfCBgbW9ja3kuc3B5KG9iaiwgJ21ldGhvZCcpYCB8CnwgYHNweS5tb2NrUmVzdG9yZSgpYCB8IGBzcHkucmVzdG9yZSgpYCB8CgoqKktleSBkaWZmZXJlbmNlczoqKgotICoqQnVpbGRlciBwYXR0ZXJuKio6IGxpbC1tb2NreSB1c2VzIGNoYWluYWJsZSBidWlsZGVycyBmb3IgY29uZmlndXJhdGlvbgotICoqTmFtZWQgYXJndW1lbnRzKio6IEJ1aWx0LWluIHN1cHBvcnQgZm9yIG5hbWVkIGFyZ3VtZW50IHRyYWNraW5nCi0gKipQZXItaW5zdGFuY2UgY2xhc3MgbW9ja3MqKjogQ29uZmlndXJlIGRpZmZlcmVudCBiZWhhdmlvciBmb3IgZWFjaCBjbGFzcyBpbnN0YW5jZQotICoqU2ltcGxlciBBUEkqKjogRmV3ZXIgY29uY2VwdHMgdG8gbGVhcm4sIG1vcmUgcHJlZGljdGFibGUgYmVoYXZpb3IKCiMjIPCfk50gTm90ZXMKCiMjIyBCcmVha2luZyBDaGFuZ2VzCgoqKnYxLngqKjogRnVuY3Rpb25zIHdpdGhvdXQgYC5hcmdzKClgIGNvbmZpZ3VyYXRpb24gbm93IHJldHVybiBhbiBhcmd1bWVudHMgYXJyYXkgaW4gYC5jYWxscygpYCBpbnN0ZWFkIG9mIGBudWxsYC4gVGhpcyBlbmFibGVzIHNweSBmdW5jdGlvbmFsaXR5IGJ1dCBtYXkgYWZmZWN0IGV4aXN0aW5nIGNvZGUgdGhhdCBleHBlY3RzIGBudWxsYC4KCiMjIyBCdWlsZGVyIHZzLiBCdWlsdCBNb2NrcwoKLSBCdWlsZGVycyBoYXZlIG1ldGhvZHMgbGlrZSBgLmFyZ3MoKWAsIGAuYXN5bmMoKWAsIGAuYnVpbGQoKWAKLSBCdWlsdCBtb2NrcyBoYXZlIG1ldGhvZHMgbGlrZSBgLnJldCgpYCwgYC5jYWxscygpYCwgYC5yZXNldCgpYAotIENhbGwgYC5idWlsZCgpYCB0byBjb252ZXJ0IGEgYnVpbGRlciB0byBhIG1vY2sKCmBgYGphdmFzY3JpcHQKLy8gQnVpbGRlciAobm90IHlldCB1c2FibGUgYXMgYSBtb2NrKQpjb25zdCBidWlsZGVyID0gbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCd4Jyk7CgovLyBCdWlsdCBtb2NrIChyZWFkeSB0byB1c2UpCmNvbnN0IG1vY2sgPSBidWlsZGVyLmJ1aWxkKCk7Cm1vY2sucmV0KCd2YWx1ZScpOwpgYGAKCioqTm90ZSoqOiBgbW9ja3kuY3JlYXRlKGJ1aWxkZXIpYCBhbHNvIGV4aXN0cyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgLSBpdCdzIGp1c3QgYSB3cmFwcGVyIHRoYXQgY2FsbHMgYC5idWlsZCgpYC4KCiMjIPCfk4QgTGljZW5zZQoKTUlUCgojIyDwn6SdIENvbnRyaWJ1dGluZwoKQ29udHJpYnV0aW9ucyB3ZWxjb21lISBQbGVhc2Ugb3BlbiBhbiBpc3N1ZSBvciBQUiBvbiBHaXRIdWIuCgAAAAAAAAAAaCAAAAAAAAAAAAAAAAAAAAAAAABoIAAAAAAAAAAAAAAAAAAAAAAAAGggAAAAAAAAAAAAAAAAAAAAAAAAaCAAAAAAAAAAAAAAAAAAAAAAAADWQAAAAAAAAAAAAAAAAAAAAAAAANZAAAAAAAAAAAAAAAAAAAAAAAAA1kAAAAAAAAAAAAAA",
1073
+ "CQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAMYdAAAAAAAAxh0AAAAAAAAAAAAAAADwvw"
1074
+ ],
1075
+ [
1076
+ 1,
1077
+ 1,
1078
+ "revert",
1079
+ null,
1080
+ "BAAAAAAAAAAAAAAAAAAAAAAAAAARQQAAIyBsaWwtbW9ja3kKCkEgbGlnaHR3ZWlnaHQgSmF2YVNjcmlwdCBtb2NraW5nIGxpYnJhcnkgZm9yIHRlc3RpbmcuIENyZWF0ZSBtb2NrIGZ1bmN0aW9ucywgb2JqZWN0cywgY2xhc3NlcywgYW5kIHByb3BlcnRpZXMgd2l0aCBjYWxsIHRyYWNraW5nIGFuZCByZXR1cm4gdmFsdWUgY29udHJvbC4gSW5jbHVkZXMgc3B5IGZ1bmN0aW9uYWxpdHkgZm9yIHRyYWNraW5nIGNhbGxzIHRvIGV4aXN0aW5nIG1ldGhvZHMuCgojIyDwn46vIEZlYXR1cmVzCgotIPCfqrYgKipMaWdodHdlaWdodCoqOiBNaW5pbWFsIGRlcGVuZGVuY2llcywgZm9jdXNlZCBvbiBjb3JlIG1vY2tpbmcgZnVuY3Rpb25hbGl0eQotIPCflKcgKipGbGV4aWJsZSoqOiBCdWlsZGVyIHBhdHRlcm4gZm9yIGNvbXBvc2FibGUgbW9jayBjb25maWd1cmF0aW9uCi0g8J+TiiAqKkNhbGwgVHJhY2tpbmcqKjogQXV0b21hdGljIHRyYWNraW5nIG9mIGFsbCBmdW5jdGlvbiBjYWxscyB3aXRoIGRlZXAtY2xvbmVkIGFyZ3VtZW50cwotIPCfjq0gKipTcHkgU3VwcG9ydCoqOiBUcmFjayBjYWxscyB0byBleGlzdGluZyBtZXRob2RzIHdoaWxlIHByZXNlcnZpbmcgb3IgcmVwbGFjaW5nIGJlaGF2aW9yCi0g8J+Pl++4jyAqKkNsYXNzIE1vY2tzKio6IFBlci1pbnN0YW5jZSBtb2NrIGNvbmZpZ3VyYXRpb24gZm9yIGNvbXBsZXggY2xhc3MgdGVzdGluZwotIOKchSAqKlNpbXBsZSBBUEkqKjogQ2xlYW4sIGludHVpdGl2ZSBBUEkgdGhhdCdzIGVhc3kgdG8gbGVhcm4gYW5kIHVzZQoKIyMg8J+TpSBJbnN0YWxsYXRpb24KCmBgYGJhc2gKbnBtIGluc3RhbGwgbGlsLW1vY2t5CmBgYAoKIyMg8J+agCBRdWljayBTdGFydAoKYGBgamF2YXNjcmlwdApjb25zdCB7IGV4cGVjdCB9ID0gcmVxdWlyZSgnY2hhaScpOwpjb25zdCBtb2NreSA9IHJlcXVpcmUoJ2xpbC1tb2NreScpOwoKZGVzY3JpYmUoJ1VzZXIgU2VydmljZScsICgpID0+IHsKICBpdCgnY2FsbHMgdGhlIGNhbGxiYWNrIHdpdGggdXNlciBkYXRhJywgKCkgPT4gewogICAgLy8gQ3JlYXRlIGEgbW9jayBmdW5jdGlvbgogICAgY29uc3QgY2FsbGJhY2sgPSBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ3VzZXInKS5idWlsZCgpOwoKICAgIC8vIENhbGwgaXQgaW4geW91ciBjb2RlCiAgICBjYWxsYmFjayh7IG5hbWU6ICdBbGljZScsIGFnZTogMzAgfSk7CgogICAgLy8gVmVyaWZ5IGl0IHdhcyBjYWxsZWQgY29ycmVjdGx5CiAgICBleHBlY3QoY2FsbGJhY2suY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoewogICAgICB1c2VyOiB7IG5hbWU6ICdBbGljZScsIGFnZTogMzAgfQogICAgfSk7CiAgICBleHBlY3QoY2FsbGJhY2suY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDEpOwogIH0pOwp9KTsKYGBgCgotLS0KCiMjIyDwn5SoIEZ1bmN0aW9uIE1vY2tzCgpNb2NrIGZ1bmN0aW9ucyBmb3IgdGVzdGluZyBjYWxsYmFja3MgYW5kIGhhbmRsZXJzOgoKYGBgamF2YXNjcmlwdAovLyBUZXN0aW5nIGNvZGUgdGhhdCBhY2NlcHRzIGEgY2FsbGJhY2sKZnVuY3Rpb24gcHJvY2Vzc1VzZXJzKHVzZXJzLCBvbkNvbXBsZXRlKSB7CiAgY29uc3QgcHJvY2Vzc2VkID0gdXNlcnMubWFwKHUgPT4gKHsgLi4udSwgcHJvY2Vzc2VkOiB0cnVlIH0pKTsKICBvbkNvbXBsZXRlKHByb2Nlc3NlZCk7Cn0KCi8vIENyZWF0ZSBtb2NrIGNhbGxiYWNrIHdpdGggbmFtZWQgYXJndW1lbnRzCmNvbnN0IG9uQ29tcGxldGUgPSBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ3Jlc3VsdCcpLmJ1aWxkKCk7CgovLyBSdW4gdGhlIGNvZGUgdW5kZXIgdGVzdApwcm9jZXNzVXNlcnMoW3sgbmFtZTogJ0FsaWNlJyB9XSwgb25Db21wbGV0ZSk7CgovLyBWZXJpZnkgdGhlIGNhbGxiYWNrIHdhcyBjYWxsZWQgY29ycmVjdGx5CmV4cGVjdChvbkNvbXBsZXRlLmNhbGxzKDApKS50by5kZWVwLmVxdWFsKHsKICByZXN1bHQ6IFt7IG5hbWU6ICdBbGljZScsIHByb2Nlc3NlZDogdHJ1ZSB9XQp9KTsKZXhwZWN0KG9uQ29tcGxldGUuY2FsbHMoKS5sZW5ndGgpLnRvLmVxdWFsKDEpOwpgYGAKCioqQ29tbW9uIHBhdHRlcm5zOioqCgpgYGBqYXZhc2NyaXB0Ci8vIE1vY2sgd2l0aCByZXR1cm4gdmFsdWUKY29uc3QgbW9jayA9IG1vY2t5LmZ1bmN0aW9uKCkuYnVpbGQoKTsKbW9jay5yZXQoJ3N1Y2Nlc3MnKTsKY29uc3QgcmVzdWx0ID0gbW9jaygpOwpleHBlY3QocmVzdWx0KS50by5lcXVhbCgnc3VjY2VzcycpOwoKLy8gTW9jayBhc3luYyBmdW5jdGlvbnMKY29uc3QgZmV0Y2hEYXRhID0gbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCd1cmwnKS5hc3luYygpLmJ1aWxkKCk7CmZldGNoRGF0YS5yZXQoeyBkYXRhOiBbMSwgMiwgM10gfSk7CmNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoRGF0YSgnL2FwaS9kYXRhJyk7CmV4cGVjdChyZXN1bHQuZGF0YSkudG8uZGVlcC5lcXVhbChbMSwgMiwgM10pOwoKLy8gQXJndW1lbnRzIHdpdGggZGVmYXVsdHMKY29uc3QgbG9nZ2VyID0gbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCdtZXNzYWdlJywgeyBsZXZlbDogJ2luZm8nIH0pLmJ1aWxkKCk7CmxvZ2dlcignVGVzdCBtZXNzYWdlJyk7CmV4cGVjdChsb2dnZXIuY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoewogIG1lc3NhZ2U6ICdUZXN0IG1lc3NhZ2UnLAogIGxldmVsOiAnaW5mbycKfSk7CmBgYAoKIyMjIyAucmV0KCkgLSBTZXQgUmV0dXJuIFZhbHVlcwoKQ29uZmlndXJlIHdoYXQgdGhlIG1vY2sgcmV0dXJucyB3aGVuIGNhbGxlZDoKCmBgYGphdmFzY3JpcHQKY29uc3QgbW9jayA9IG1vY2t5LmZ1bmN0aW9uKCkuYnVpbGQoKTsKCi8vIFNpbXBsZSByZXR1cm4gdmFsdWUKbW9jay5yZXQoJ2hlbGxvJyk7Cm1vY2soKTsgLy8gUmV0dXJucyAnaGVsbG8nCgovLyBBbnkgdmFsdWUgdHlwZQptb2NrLnJldChudWxsKTsKbW9jay5yZXQoNDIpOwptb2NrLnJldChbMSwgMiwgM10pOwptb2NrLnJldCh7IGRhdGE6ICd2YWx1ZScgfSk7CgovLyBEaWZmZXJlbnQgcmV0dXJuIHBlciBjYWxsIChjYWxsIG51bWJlcnMgYXJlIDEtaW5kZXhlZCkKbW9jay5yZXQoJ2ZpcnN0JywgMSk7ICAgLy8gRmlyc3QgY2FsbAptb2NrLnJldCgnc2Vjb25kJywgMik7ICAvLyBTZWNvbmQgY2FsbAptb2NrLnJldCgnZGVmYXVsdCcpOyAgICAvLyBBbGwgb3RoZXIgY2FsbHMgKGNhbGwgMCBpcyB0aGUgZGVmYXVsdCkKCm1vY2soKTsgLy8gJ2ZpcnN0Jwptb2NrKCk7IC8vICdzZWNvbmQnCm1vY2soKTsgLy8gJ2RlZmF1bHQnCm1vY2soKTsgLy8gJ2RlZmF1bHQnCmBgYAoKKipJbXBvcnRhbnQ6KiogYC5yZXQoKWAgc3RvcmVzIHRoZSB2YWx1ZSAtIGl0IGRvZXNuJ3QgY2FsbCBmdW5jdGlvbnM6CgpgYGBqYXZhc2NyaXB0Ci8vIOKdjCBXUk9ORyAtIHJldHVybnMgdGhlIGZ1bmN0aW9uIGl0c2VsZgptb2NrLnJldCgoKSA9PiBjb21wdXRlKCkpOwoKLy8g4pyFIFJJR0hUIC0gdXNlIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBmb3IgZHluYW1pYyBiZWhhdmlvcgpjb25zdCBtb2NrID0gbW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKICByZXR1cm4gY29tcHV0ZSgpOwp9KS5idWlsZCgpOwpgYGAKCioqVGhyb3dpbmcgZXJyb3JzOioqCgpgYGBqYXZhc2NyaXB0Cm1vY2sucmV0KG5ldyBFcnJvcignU29tZXRoaW5nIHdlbnQgd3JvbmcnKSk7Cm1vY2soKTsgLy8gVGhyb3dzICdTb21ldGhpbmcgd2VudCB3cm9uZycKCi8vIERpZmZlcmVudCBlcnJvcnMgcGVyIGNhbGwKbW9jay5yZXQobmV3IEVycm9yKCdGaXJzdCBlcnJvcicpLCAxKTsKbW9jay5yZXQobmV3IEVycm9yKCdTZWNvbmQgZXJyb3InKSwgMik7CmBgYAoKIyMjIyAuY2FsbHMoKSAtIFZlcmlmeSBBcmd1bWVudHMKCkNoZWNrIHdoYXQgYXJndW1lbnRzIHdlcmUgcGFzc2VkIHRvIHRoZSBtb2NrOgoKYGBgamF2YXNjcmlwdApjb25zdCBtb2NrID0gbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCduYW1lJywgJ2FnZScpLmJ1aWxkKCk7Cgptb2NrKCdBbGljZScsIDMwKTsKbW9jaygnQm9iJywgMjUpOwoKLy8gR2V0IHNwZWNpZmljIGNhbGwKbW9jay5jYWxscygwKTsgLy8geyBuYW1lOiAnQWxpY2UnLCBhZ2U6IDMwIH0KbW9jay5jYWxscygxKTsgLy8geyBuYW1lOiAnQm9iJywgYWdlOiAyNSB9CgovLyBHZXQgYWxsIGNhbGxzCm1vY2suY2FsbHMoKTsgLy8gW3sgbmFtZTogJ0FsaWNlJywgYWdlOiAzMCB9LCB7IG5hbWU6ICdCb2InLCBhZ2U6IDI1IH1dCm1vY2suY2FsbHMoKS5sZW5ndGg7IC8vIDIKCi8vIFdpdGhvdXQgLmFyZ3MoKSBjb25maWcsIHJldHVybnMgcmF3IGFyZ3VtZW50cyBhcnJheQpjb25zdCByYXdNb2NrID0gbW9ja3kuZnVuY3Rpb24oKS5idWlsZCgpOwpyYXdNb2NrKCdhJywgJ2InLCAnYycpOwpyYXdNb2NrLmNhbGxzKDApOyAvLyBbJ2EnLCAnYicsICdjJ10KYGBgCgojIyMjIC5yZXNldCgpIC0gQ2xlYXIgU3RhdGUKClJlc2V0IHRoZSBtb2NrIGJhY2sgdG8gaXRzIGluaXRpYWwgc3RhdGU6CgpgYGBqYXZhc2NyaXB0CmNvbnN0IG1vY2sgPSBtb2NreS5mdW5jdGlvbigpLmJ1aWxkKCk7Cm1vY2sucmV0KCd2YWx1ZScpOwptb2NrKCd0ZXN0Jyk7Cgptb2NrLmNhbGxzKCkubGVuZ3RoOyAvLyAxCgptb2NrLnJlc2V0KCk7CgovLyBFdmVyeXRoaW5nIGNsZWFyZWQKbW9jay5jYWxscygpLmxlbmd0aDsgLy8gMAptb2NrKCk7IC8vIFJldHVybnMgdW5kZWZpbmVkIChyZXQgY2xlYXJlZCkKYGBgCgojIyMjIFVzaW5nIGNvbnRleHQgZm9yIEN1c3RvbSBJbXBsZW1lbnRhdGlvbnMKCkZvciBkeW5hbWljIGJlaGF2aW9yLCBwYXNzIGEgZnVuY3Rpb24gdGhhdCByZWNlaXZlcyBhIGBjb250ZXh0YCBvYmplY3Q6CgpgYGBqYXZhc2NyaXB0CmNvbnN0IG1vY2sgPSBtb2NreS5mdW5jdGlvbigoY29udGV4dCkgPT4gewogIC8vIFlvdXIgY3VzdG9tIGxvZ2ljIGhlcmUKICByZXR1cm4gY29udGV4dC5hcmdzLnggKiAyOwp9KS5hcmdzKCd4JykuYnVpbGQoKTsKCm1vY2soNSk7IC8vIFJldHVybnMgMTAKYGBgCgoqKkNvbnRleHQgcHJvcGVydGllczoqKgoKYGBgamF2YXNjcmlwdApjb25zdCBtb2NrID0gbW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKICAvLyBjb250ZXh0LmFyZ3MgLSBOYW1lZCBhcmd1bWVudHMgKGZyb20gLmFyZ3MoKSBjb25maWcpCiAgLy8gY29udGV4dC5yZXQgLSBWYWx1ZSBzZXQgdmlhIC5yZXQoKQogIC8vIGNvbnRleHQuY2FsbCAtIENhbGwgbnVtYmVyICgxLWluZGV4ZWQpCiAgLy8gY29udGV4dC5zZWxmIC0gVGhlICd0aGlzJyBjb250ZXh0CiAgLy8gY29udGV4dC5zdGF0ZSAtIEludGVybmFsIHN0YXRlIG9iamVjdCAoZm9yIHN0b3JpbmcgY3VzdG9tIGRhdGEpCgogIHJldHVybiBzb21lVmFsdWU7Cn0pLmFyZ3MoJ3BhcmFtMScsICdwYXJhbTInKS5idWlsZCgpOwpgYGAKCioqT3ZlcnJpZGUgcGF0dGVybioqIC0gQWxsb3cgYC5yZXQoKWAgdG8gb3ZlcnJpZGUgZGVmYXVsdCBiZWhhdmlvcjoKCmBgYGphdmFzY3JpcHQKY29uc3QgY29tcHV0ZSA9IG1vY2t5LmZ1bmN0aW9uKChjb250ZXh0KSA9PiB7CiAgLy8gQ2hlY2sgaWYgLnJldCgpIHdhcyBjYWxsZWQKICBpZiAoY29udGV4dC5yZXQgIT09IHVuZGVmaW5lZCkKICAgIHJldHVybiBjb250ZXh0LnJldDsKCiAgLy8gRGVmYXVsdCBsb2dpYwogIHJldHVybiBjb250ZXh0LmFyZ3MueCAqIGNvbnRleHQuYXJncy55Owp9KS5hcmdzKCd4JywgJ3knKS5idWlsZCgpOwoKY29tcHV0ZSg1LCAzKTsgLy8gUmV0dXJucyAxNSAoZGVmYXVsdCBsb2dpYykKCmNvbXB1dGUucmV0KDk5OSk7IC8vIE92ZXJyaWRlCmNvbXB1dGUoNSwgMyk7IC8vIFJldHVybnMgOTk5CmBgYAoKKipDb25kaXRpb25hbCBiZWhhdmlvcioqIC0gRGlmZmVyZW50IGxvZ2ljIGJhc2VkIG9uIGFyZ3VtZW50czoKCmBgYGphdmFzY3JpcHQKY29uc3QgdmFsaWRhdG9yID0gbW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKICBpZiAoY29udGV4dC5hcmdzLnZhbHVlID09PSBudWxsKQogICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBjYW5ub3QgYmUgbnVsbCcpOwoKICBpZiAoY29udGV4dC5hcmdzLnZhbHVlLmxlbmd0aCA8IDMpCiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnVG9vIHNob3J0JyB9OwoKICByZXR1cm4geyB2YWxpZDogdHJ1ZSB9Owp9KS5hcmdzKCd2YWx1ZScpLmJ1aWxkKCk7Cgp2YWxpZGF0b3IoJ2FiJyk7IC8vIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ1RvbyBzaG9ydCcgfQp2YWxpZGF0b3IoJ2FiYycpOyAvLyB7IHZhbGlkOiB0cnVlIH0KYGBgCgoqKlN0YXRlZnVsIG1vY2tzKiogLSBUcmFjayBzdGF0ZSBhY3Jvc3MgY2FsbHM6CgpgYGBqYXZhc2NyaXB0CmNvbnN0IGNvdW50ZXIgPSBtb2NreS5mdW5jdGlvbigoY29udGV4dCkgPT4gewogIC8vIFVzZSBjb250ZXh0LnN0YXRlIHRvIHN0b3JlIGRhdGEgYmV0d2VlbiBjYWxscwogIGlmICghY29udGV4dC5zdGF0ZS5jb3VudCkKICAgIGNvbnRleHQuc3RhdGUuY291bnQgPSAwOwoKICBjb250ZXh0LnN0YXRlLmNvdW50Kys7CiAgcmV0dXJuIGNvbnRleHQuc3RhdGUuY291bnQ7Cn0pLmJ1aWxkKCk7Cgpjb3VudGVyKCk7IC8vIDEKY291bnRlcigpOyAvLyAyCmNvdW50ZXIoKTsgLy8gMwoKY291bnRlci5yZXNldCgpOyAvLyBDbGVhcnMgY29udGV4dC5zdGF0ZQpjb3VudGVyKCk7IC8vIDEKYGBgCgoqKkNhbGwtc3BlY2lmaWMgYmVoYXZpb3IqKiAtIERpZmZlcmVudCBsb2dpYyBwZXIgY2FsbDoKCmBgYGphdmFzY3JpcHQKY29uc3QgZmV0Y2hlciA9IG1vY2t5LmZ1bmN0aW9uKChjb250ZXh0KSA9PiB7CiAgaWYgKGNvbnRleHQuY2FsbCA9PT0gMSkKICAgIHJldHVybiB7IHN0YXR1czogJ2xvYWRpbmcnIH07CgogIGlmIChjb250ZXh0LmNhbGwgPT09IDIpCiAgICByZXR1cm4geyBzdGF0dXM6ICdzdWNjZXNzJywgZGF0YTogWzEsIDIsIDNdIH07CgogIHJldHVybiB7IHN0YXR1czogJ2NhY2hlZCcgfTsKfSkuYnVpbGQoKTsKCmZldGNoZXIoKTsgLy8geyBzdGF0dXM6ICdsb2FkaW5nJyB9CmZldGNoZXIoKTsgLy8geyBzdGF0dXM6ICdzdWNjZXNzJywgLi4uIH0KZmV0Y2hlcigpOyAvLyB7IHN0YXR1czogJ2NhY2hlZCcgfQpgYGAKCi0tLQoKIyMjIPCfk6YgT2JqZWN0IE1vY2tzCgpNb2NrIG9iamVjdHMgZm9yIHRlc3RpbmcgQVBJcywgZGF0YWJhc2VzLCBhbmQgc2VydmljZXM6CgpgYGBqYXZhc2NyaXB0Ci8vIE1vY2sgYW4gQVBJIGNsaWVudApjb25zdCBhcGkgPSBtb2NreS5vYmplY3QoewogIGdldDogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCd1cmwnKSwKICBwb3N0OiBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ3VybCcsICdkYXRhJyksCiAgYmFzZVVSTDogJ2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tJywKICB0aW1lb3V0OiA1MDAwCn0pLmJ1aWxkKCk7CgovLyBDb25maWd1cmUgcmVzcG9uc2VzCmFwaS5nZXQucmV0KHsgc3RhdHVzOiAyMDAsIGRhdGE6IHsgdXNlcnM6IFtdIH0gfSk7CmFwaS5wb3N0LnJldCh7IHN0YXR1czogMjAxLCBkYXRhOiB7IGlkOiAxMjMgfSB9KTsKCi8vIFRlc3QgeW91ciBjb2RlIHRoYXQgdXNlcyB0aGUgQVBJCmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVVzZXIoYXBpQ2xpZW50LCB1c2VyRGF0YSkgewogIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXBpQ2xpZW50LnBvc3QoJy91c2VycycsIHVzZXJEYXRhKTsKICByZXR1cm4gcmVzcG9uc2UuZGF0YTsKfQoKY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlVXNlcihhcGksIHsgbmFtZTogJ0FsaWNlJyB9KTsKCi8vIFZlcmlmeSB0aGUgQVBJIHdhcyBjYWxsZWQgY29ycmVjdGx5CmV4cGVjdChhcGkucG9zdC5jYWxscygwKSkudG8uZGVlcC5lcXVhbCh7CiAgdXJsOiAnL3VzZXJzJywKICBkYXRhOiB7IG5hbWU6ICdBbGljZScgfQp9KTsKZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbCh7IGlkOiAxMjMgfSk7CmBgYAoKKipJbW11dGFiaWxpdHkgYWZ0ZXIgLmJ1aWxkKCk6KioKCk9uY2UgeW91IGNhbGwgYC5idWlsZCgpYCwgdGhlIG1vY2sgb2JqZWN0J3Mgc3RydWN0dXJlIGlzIGltbXV0YWJsZS4gWW91IGNhbm5vdCBhZGQgb3IgcmVhc3NpZ24gcHJvcGVydGllczoKCmBgYGphdmFzY3JpcHQKLy8g4p2MIFdST05HIC0gY2FuJ3QgbW9kaWZ5IGFmdGVyIC5idWlsZCgpCmNvbnN0IG1vY2sgPSBtb2NreS5vYmplY3QoewogIG1ldGhvZDogbW9ja3kuZnVuY3Rpb24oKQp9KS5idWlsZCgpOwoKbW9jay5tZXRob2QgPSBuZXdJbXBsZW1lbnRhdGlvbjsgLy8gVHlwZUVycm9yOiBDYW5ub3QgYXNzaWduIHRvIHJlYWQgb25seSBwcm9wZXJ0eQptb2NrLm5ld01ldGhvZCA9IG1vY2t5LmZ1bmN0aW9uKCkuYnVpbGQoKTsgLy8gVHlwZUVycm9yOiBDYW5ub3QgYWRkIHByb3BlcnR5CgovLyDinIUgUklHSFQgLSBkZWZpbmUgZXZlcnl0aGluZyB3aGVuIGJ1aWxkaW5nCmNvbnN0IG1vY2sgPSBtb2NreS5vYmplY3QoewogIG1ldGhvZDogbW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKICAgIC8vIFlvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uIGhlcmUKICAgIHJldHVybiAncmVzdWx0JzsKICB9KQp9KS5idWlsZCgpOwpgYGAKClRoaXMgaW1tdXRhYmlsaXR5IHByZXZlbnRzIGJ1Z3MgYW5kIGVuc3VyZXMgYC5yZXNldCgpYCB3b3JrcyBjb3JyZWN0bHkuIFRvIGNoYW5nZSBiZWhhdmlvciBkdXJpbmcgdGVzdHMsIHVzZSBgLnJldCgpYCBvciBgLnJlc2V0KClgIGluc3RlYWQgb2YgcmVhc3NpZ25pbmcgcHJvcGVydGllcy4KCioqTmVzdGVkIG1vY2tzIGZvciBjb21wbGV4IHN0cnVjdHVyZXM6KioKCmBgYGphdmFzY3JpcHQKY29uc3QgZGIgPSBtb2NreS5vYmplY3QoewogIHVzZXJzOiBtb2NreS5vYmplY3QoewogICAgZmluZEJ5SWQ6IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnaWQnKSwKICAgIGNyZWF0ZTogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCd1c2VyRGF0YScpCiAgfSksCiAgY29ubmVjdGVkOiB0cnVlCn0pLmJ1aWxkKCk7CgpkYi51c2Vycy5maW5kQnlJZC5yZXQoeyBpZDogMSwgbmFtZTogJ0FsaWNlJyB9KTsKY29uc3QgdXNlciA9IGF3YWl0IGRiLnVzZXJzLmZpbmRCeUlkKDEpOwpgYGAKCioqU3ltYm9sIHByb3BlcnRpZXMgKGFkdmFuY2VkKToqKgoKYGBgamF2YXNjcmlwdApjb25zdCBpdGVyYWJsZSA9IG1vY2t5Lm9iamVjdCh7CiAgW1N5bWJvbC5pdGVyYXRvcl06IG1vY2t5LmZ1bmN0aW9uKCkKfSkuYnVpbGQoKTsKCml0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0ucmV0KCdpdGVyYXRvcicpOwpgYGAKCiMjIyMgT2JqZWN0IC5yZXNldCgpIEJlaGF2aW9yCgpDYWxsaW5nIGAucmVzZXQoKWAgb24gYW4gb2JqZWN0IG1vY2s6Ci0gQ2FsbHMgYC5yZXNldCgpYCBvbiBhbGwgbmVzdGVkIG1vY2tzIChjbGVhcnMgY2FsbHMgYW5kIHJldHVybiB2YWx1ZXMpCi0gUmVzdG9yZXMgcGxhaW4gcHJvcGVydGllcyB0byB0aGVpciBpbml0aWFsIHZhbHVlcwotIERlbGV0ZXMgYW55IHByb3BlcnRpZXMgYWRkZWQgYWZ0ZXIgY3JlYXRpb24KCmBgYGphdmFzY3JpcHQKY29uc3QgYXBpID0gbW9ja3kub2JqZWN0KHsKICBnZXQ6IG1vY2t5LmZ1bmN0aW9uKCksCiAgYmFzZVVSTDogJ2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tJywKICB0aW1lb3V0OiA1MDAwCn0pLmJ1aWxkKCk7CgphcGkuZ2V0LnJldCgncmVzcG9uc2UnKTsKYXBpLmdldCgndGVzdCcpOwphcGkuYmFzZVVSTCA9ICdodHRwczovL290aGVyLmNvbSc7CmFwaS50aW1lb3V0ID0gMTAwMDA7CmFwaS5uZXdQcm9wID0gJ2FkZGVkJzsKCmFwaS5yZXNldCgpOwoKLy8gQWZ0ZXIgcmVzZXQ6Ci8vIC0gYXBpLmdldC5jYWxscygpIGlzIFtdCi8vIC0gYXBpLmdldCByZXR1cm4gdmFsdWVzIGNsZWFyZWQKLy8gLSBhcGkuYmFzZVVSTCBpcyAnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20nIChyZXN0b3JlZCkKLy8gLSBhcGkudGltZW91dCBpcyA1MDAwIChyZXN0b3JlZCkKLy8gLSBhcGkubmV3UHJvcCBpcyBkZWxldGVkCmBgYAoKLS0tCgojIyMg8J+Pm++4jyBDbGFzcyBNb2NrcwoKTW9jayBjbGFzc2VzIHdpdGggcGVyLWluc3RhbmNlIGJlaGF2aW9yIC0gcGVyZmVjdCBmb3Igc2VydmljZXMgdGhhdCBnZXQgaW5zdGFudGlhdGVkOgoKYGBgamF2YXNjcmlwdAovLyBNb2NrIGEgTG9nZ2VyIGNsYXNzIHRoYXQgZ2V0cyBpbnN0YW50aWF0ZWQgcGVyIG1vZHVsZQpjb25zdCBMb2dnZXIgPSBtb2NreS5jbGFzcyh7CiAgY29uc3RydWN0b3I6IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnbW9kdWxlTmFtZScpLAogIGluZm86IG1vY2t5LmZ1bmN0aW9uKCkuYXJncygnbWVzc2FnZScpLAogIGVycm9yOiBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ21lc3NhZ2UnKQp9KS5idWlsZCgpOwoKLy8gVGVzdCBjb2RlIHRoYXQgY3JlYXRlcyBtdWx0aXBsZSBsb2dnZXIgaW5zdGFuY2VzCmNsYXNzIFVzZXJTZXJ2aWNlIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcignVXNlclNlcnZpY2UnKTsKICB9CgogIGFzeW5jIGNyZWF0ZVVzZXIoZGF0YSkgewogICAgdGhpcy5sb2dnZXIuaW5mbygnQ3JlYXRpbmcgdXNlcicpOwogICAgLy8gLi4uIGNyZWF0ZSB1c2VyIGxvZ2ljCiAgICByZXR1cm4geyBpZDogMSwgLi4uZGF0YSB9OwogIH0KfQoKY2xhc3MgQXV0aFNlcnZpY2UgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKCdBdXRoU2VydmljZScpOwogIH0KCiAgbG9naW4odXNlcm5hbWUpIHsKICAgIHRoaXMubG9nZ2VyLmluZm8oJ1VzZXIgbG9nZ2luZyBpbicpOwogICAgLy8gLi4uIGF1dGggbG9naWMKICB9Cn0KCi8vIENyZWF0ZSB0aGUgc2VydmljZXMgKGVhY2ggY3JlYXRlcyBpdHMgb3duIExvZ2dlciBpbnN0YW5jZSkKY29uc3QgdXNlclNlcnZpY2UgPSBuZXcgVXNlclNlcnZpY2UoKTsKY29uc3QgYXV0aFNlcnZpY2UgPSBuZXcgQXV0aFNlcnZpY2UoKTsKCmF3YWl0IHVzZXJTZXJ2aWNlLmNyZWF0ZVVzZXIoeyBuYW1lOiAnQWxpY2UnIH0pOwphdXRoU2VydmljZS5sb2dpbignYWxpY2UnKTsKCi8vIFZlcmlmeSBlYWNoIGluc3RhbmNlIHdhcyB1c2VkIGNvcnJlY3RseQpleHBlY3QoTG9nZ2VyLmluc3QoMCkuY29uc3RydWN0b3IuY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoewogIG1vZHVsZU5hbWU6ICdVc2VyU2VydmljZScKfSk7CmV4cGVjdChMb2dnZXIuaW5zdCgwKS5pbmZvLmNhbGxzKDApKS50by5kZWVwLmVxdWFsKHsKICBtZXNzYWdlOiAnQ3JlYXRpbmcgdXNlcicKfSk7CgpleHBlY3QoTG9nZ2VyLmluc3QoMSkuY29uc3RydWN0b3IuY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoewogIG1vZHVsZU5hbWU6ICdBdXRoU2VydmljZScKfSk7CmV4cGVjdChMb2dnZXIuaW5zdCgxKS5pbmZvLmNhbGxzKDApKS50by5kZWVwLmVxdWFsKHsKICBtZXNzYWdlOiAnVXNlciBsb2dnaW5nIGluJwp9KTsKCmV4cGVjdChMb2dnZXIubnVtSW5zdHMoKSkudG8uZXF1YWwoMik7CmBgYAoKKipQcmUtY29uZmlndXJpbmcgaW5zdGFuY2VzOioqCgpgYGBqYXZhc2NyaXB0Ci8vIENvbmZpZ3VyZSBiZWhhdmlvciBCRUZPUkUgaW5zdGFuY2VzIGFyZSBjcmVhdGVkCmNvbnN0IERhdGFiYXNlID0gbW9ja3kuY2xhc3MoewogIGNvbnN0cnVjdG9yOiBtb2NreS5mdW5jdGlvbigpLmFyZ3MoJ2Nvbm5lY3Rpb25TdHJpbmcnKSwKICBxdWVyeTogbW9ja3kuZnVuY3Rpb24oKS5hcmdzKCdzcWwnKQp9KS5idWlsZCgpOwoKLy8gRmlyc3QgaW5zdGFuY2UgcmV0dXJucyB1c2VyIGRhdGEKRGF0YWJhc2UuaW5zdCgwKS5xdWVyeS5yZXQoW3sgaWQ6IDEsIG5hbWU6ICdBbGljZScgfV0pOwovLyBTZWNvbmQgaW5zdGFuY2UgcmV0dXJucyBlbXB0eSByZXN1bHRzCkRhdGFiYXNlLmluc3QoMSkucXVlcnkucmV0KFtdKTsKCmNvbnN0IGRiMSA9IG5ldyBEYXRhYmFzZSgncG9zdGdyZXM6Ly9wcmltYXJ5Jyk7CmNvbnN0IGRiMiA9IG5ldyBEYXRhYmFzZSgncG9zdGdyZXM6Ly9yZXBsaWNhJyk7Cgpjb25zdCB1c2VycyA9IGF3YWl0IGRiMS5xdWVyeSgnU0VMRUNUICogRlJPTSB1c2VycycpOyAvLyBbeyBpZDogMSwgLi4uIH1dCmNvbnN0IGVtcHR5ID0gYXdhaXQgZGIyLnF1ZXJ5KCdTRUxFQ1QgKiBGUk9NIHVzZXJzJyk7IC8vIFtdCmBgYAoKIyMjIyBVc2luZyBjb250ZXh0LnNlbGYgZm9yIEluc3RhbmNlIFN0YXRlCgpVc2UgYGNvbnRleHQuc2VsZmAgdG8gYWNjZXNzIGFuZCBtb2RpZnkgaW5zdGFuY2UgcHJvcGVydGllczoKCmBgYGphdmFzY3JpcHQKLy8gTW9jayBhIGNsYXNzIHdoZXJlIG1ldGhvZHMgbmVlZCB0byBhY2Nlc3MgaW5zdGFuY2UgcHJvcGVydGllcwpjb25zdCBDb3VudGVyID0gbW9ja3kuY2xhc3MoewogIGNvbnN0cnVjdG9yOiBtb2NreS5mdW5jdGlvbigoY29udGV4dCkgPT4gewogICAgLy8gU3RvcmUgaW5pdGlhbCB2YWx1ZSBvbiB0aGUgaW5zdGFuY2UKICAgIGNvbnRleHQuc2VsZi5fY291bnQgPSBjb250ZXh0LmFyZ3MuaW5pdGlhbCB8fCAwOwogIH0pLmFyZ3MoJ2luaXRpYWwnKSwKCiAgaW5jcmVtZW50OiBtb2NreS5mdW5jdGlvbigoY29udGV4dCkgPT4gewogICAgLy8gQWNjZXNzIGluc3RhbmNlIHN0YXRlIHZpYSBjb250ZXh0LnNlbGYKICAgIGNvbnRleHQuc2VsZi5fY291bnQrKzsKICAgIHJldHVybiBjb250ZXh0LnNlbGYuX2NvdW50OwogIH0pLAoKICBnZXRDb3VudDogbW9ja3kuZnVuY3Rpb24oKGNvbnRleHQpID0+IHsKICAgIHJldHVybiBjb250ZXh0LnNlbGYuX2NvdW50OwogIH0pCn0pLmJ1aWxkKCk7Cgpjb25zdCBjb3VudGVyID0gbmV3IENvdW50ZXIoMTApOwpjb3VudGVyLmluY3JlbWVudCgpOyAvLyAxMQpjb3VudGVyLmluY3JlbWVudCgpOyAvLyAxMgpjb3VudGVyLmdldENvdW50KCk7ICAvLyAxMgoKLy8gRWFjaCBpbnN0YW5jZSBoYXMgaXRzIG93biBzdGF0ZQpjb25zdCBjb3VudGVyMiA9IG5ldyBDb3VudGVyKDEwMCk7CmNvdW50ZXIyLmluY3JlbWVudCgpOyAvLyAxMDEKY291bnRlci5nZXRDb3VudCgpOyAgIC8vIFN0aWxsIDEyCmBgYAoKIyMjIyBDbGFzcyAucmVzZXQoKSBCZWhhdmlvcgoKQ2FsbGluZyBgLnJlc2V0KClgIG9uIGEgY2xhc3MgbW9jazoKLSBDbGVhcnMgYWxsIGluc3RhbmNlIGNvbmZpZ3VyYXRpb25zCi0gUmVzZXRzIGluc3RhbmNlIGNvdW50ZXIgdG8gMAotIE5leHQgaW5zdGFudGlhdGlvbiBzdGFydHMgZnJlc2ggYXQgaW5zdGFuY2UgMAoKYGBgamF2YXNjcmlwdApjb25zdCBNb2NrID0gbW9ja3kuY2xhc3MoewogIG1ldGhvZDogbW9ja3kuZnVuY3Rpb24oKQp9KS5idWlsZCgpOwoKTW9jay5pbnN0KDApLm1ldGhvZC5yZXQoJ3ZhbHVlJyk7CmNvbnN0IGluc3RhbmNlMSA9IG5ldyBNb2NrKCk7CmNvbnN0IGluc3RhbmNlMiA9IG5ldyBNb2NrKCk7CgpNb2NrLm51bUluc3RzKCk7IC8vIDIKCk1vY2sucmVzZXQoKTsKCi8vIEFmdGVyIHJlc2V0OgovLyAtIEFsbCBpbnN0YW5jZSBjb25maWd1cmF0aW9ucyBjbGVhcmVkCi8vIC0gTW9jay5udW1JbnN0cygpIGlzIDAKLy8gLSBOZXh0IGluc3RhbnRpYXRpb24gc3RhcnRzIGZyZXNoIGF0IGluc3RhbmNlIDAKYGBgCgotLS0KCiMjIyDwn5SNIFNweSBGdW5jdGlvbgoKVHJhY2sgY2FsbHMgdG8gZXhpc3RpbmcgbWV0aG9kcyB3aXRob3V0IGJyZWFraW5nIHRoZWlyIGJlaGF2aW9yOgoKYGBgamF2YXNjcmlwdAovLyBTcHkgb24gYW4gZXhpc3Rpbmcgb2JqZWN0J3MgbWV0aG9kCmNvbnN0IGVtYWlsU2VydmljZSA9IHsKICBzZW5kOiAodG8sIHN1YmplY3QsIGJvZHkpID0+IHsKICAgIC8vIFJlYWwgaW1wbGVtZW50YXRpb24gdGhhdCBzZW5kcyBlbWFpbAogICAgY29uc29sZS5sb2coYFNlbmRpbmcgZW1haWwgdG8gJHt0b31gKTsKICAgIHJldHVybiB7IHNlbnQ6IHRydWUsIGlkOiAnMTIzNDUnIH07CiAgfQp9OwoKLy8gQ3JlYXRlIGEgc3B5IC0gY2FsbHMgdGhyb3VnaCB0byBvcmlnaW5hbCBieSBkZWZhdWx0CmNvbnN0IHNweSA9IG1vY2t5LnNweShlbWFpbFNlcnZpY2UsICdzZW5kJyk7CgovLyBUZXN0IGNvZGUgdGhhdCB1c2VzIHRoZSBlbWFpbCBzZXJ2aWNlCmZ1bmN0aW9uIG5vdGlmeVVzZXIodXNlciwgbWVzc2FnZSkgewogIHJldHVybiBlbWFpbFNlcnZpY2Uuc2VuZCh1c2VyLmVtYWlsLCAnTm90aWZpY2F0aW9uJywgbWVzc2FnZSk7Cn0KCmNvbnN0IHJlc3VsdCA9IG5vdGlmeVVzZXIoeyBlbWFpbDogJ2FsaWNlQGV4YW1wbGUuY29tJyB9LCAnSGVsbG8hJyk7CgovLyBWZXJpZnkgdGhlIG1ldGhvZCB3YXMgY2FsbGVkIGNvcnJlY3RseQpleHBlY3Qoc3B5LmNhbGxzKDApKS50by5kZWVwLmVxdWFsKFsKICAnYWxpY2VAZXhhbXBsZS5jb20nLAogICdOb3RpZmljYXRpb24nLAogICdIZWxsbyEnCl0pOwpleHBlY3QocmVzdWx0KS50by5kZWVwLmVxdWFsKHsgc2VudDogdHJ1ZSwgaWQ6ICcxMjM0NScgfSk7CgovLyBDbGVhbiB1cApzcHkucmVzdG9yZSgpOwpgYGAKCioqT3ZlcnJpZGUgcmV0dXJuIHZhbHVlOioqCgpgYGBqYXZhc2NyaXB0CmNvbnN0IGNhY2hlID0gewogIGdldDogKGtleSkgPT4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KQp9OwoKY29uc3Qgc3B5ID0gbW9ja3kuc3B5KGNhY2hlLCAnZ2V0Jyk7CnNweS5yZXQoJ21vY2tlZC12YWx1ZScpOyAvLyBPdmVycmlkZSByZXR1cm4gdmFsdWUKCmNvbnN0IHZhbHVlID0gY2FjaGUuZ2V0KCd1c2VyLWRhdGEnKTsgLy8gUmV0dXJucyAnbW9ja2VkLXZhbHVlJwpzcHkucmVzdG9yZSgpOwpgYGAKCioqU3B5IHdpdGggY3VzdG9tIHJlcGxhY2VtZW50OioqCgpXaGVuIHVzaW5nIGEgY3VzdG9tIHJlcGxhY2VtZW50LCBjb250ZXh0IGluY2x1ZGVzIGFkZGl0aW9uYWwgcHJvcGVydGllcyBmb3Igd29ya2luZyB3aXRoIHRoZSBvcmlnaW5hbCBmdW5jdGlvbjoKCmBgYGphdmFzY3JpcHQKY29uc3QgYW5hbHl0aWNzID0gewogIHRyYWNrOiAoZXZlbnQsIGRhdGEpID0+IHsKICAgIC8vIFJlYWwgaW1wbGVtZW50YXRpb24gcG9zdHMgdG8gYW5hbHl0aWNzIHNlcnZlcgogICAgZmV0Y2goJy9hbmFseXRpY3MnLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGV2ZW50LCBkYXRhIH0pIH0pOwogIH0KfTsKCmNvbnN0IHNweSA9IG1vY2t5LnNweShhbmFseXRpY3MsICd0cmFjaycsIG1vY2t5LmZ1bmN0aW9uKChjb250ZXh0KSA9PiB7CiAgLy8gY29udGV4dC5vcmlnaW5hbCAtIFRoZSBvcmlnaW5hbCBmdW5jdGlvbgogIC8vIGNvbnRleHQucmF3QXJncyAtIFVucHJvY2Vzc2VkIGFyZ3VtZW50cyBhcnJheQoKICAvLyBDYWxsIG9yaWdpbmFsIGJ1dCBhbHNvIGFkZCB0ZXN0IGxvZ2dpbmcKICBjb25zb2xlLmxvZygnQW5hbHl0aWNzIGNhbGxlZDonLCBjb250ZXh0LnJhd0FyZ3MpOwogIGNvbnRleHQub3JpZ2luYWwuYXBwbHkoY29udGV4dC5zZWxmLCBjb250ZXh0LnJhd0FyZ3MpOwp9KS5hcmdzKCdldmVudCcsICdkYXRhJykpOwoKYW5hbHl0aWNzLnRyYWNrKCdwYWdlX3ZpZXcnLCB7IHBhZ2U6ICcvaG9tZScgfSk7CmV4cGVjdChzcHkuY2FsbHMoMCkpLnRvLmRlZXAuZXF1YWwoewogIGV2ZW50OiAncGFnZV92aWV3JywKICBkYXRhOiB7IHBhZ2U6ICcvaG9tZScgfQp9KTsKCnNweS5yZXN0b3JlKCk7CmBgYAoKKipTcHkgb24gY2xhc3MgcHJvdG90eXBlcyAoYWZmZWN0cyBhbGwgaW5zdGFuY2VzKToqKgoKYGBgamF2YXNjcmlwdApjbGFzcyBIdHRwQ2xpZW50IHsKICByZXF1ZXN0KHVybCwgb3B0aW9ucykgewogICAgcmV0dXJuIGZldGNoKHVybCwgb3B0aW9ucyk7CiAgfQp9Cgpjb25zdCBzcHkgPSBtb2NreS5zcHkoSHR0cENsaWVudC5wcm90b3R5cGUsICdyZXF1ZXN0Jyk7Cgpjb25zdCBjbGllbnQxID0gbmV3IEh0dHBDbGllbnQoKTsKY29uc3QgY2xpZW50MiA9IG5ldyBIdHRwQ2xpZW50KCk7CgpjbGllbnQxLnJlcXVlc3QoJy9hcGkvdXNlcnMnLCB7IG1ldGhvZDogJ0dFVCcgfSk7CmNsaWVudDIucmVxdWVzdCgnL2FwaS9wb3N0cycsIHsgbWV0aG9kOiAnR0VUJyB9KTsKCi8vIEJvdGggaW5zdGFuY2VzJyBjYWxscyBhcmUgdHJhY2tlZApleHBlY3Qoc3B5LmNhbGxzKCkubGVuZ3RoKS50by5lcXVhbCgyKTsKc3B5LnJlc3RvcmUoKTsKYGBgCgotLS0KCiMjIPCflIQgQ29taW5nIGZyb20gSmVzdD8KCk1pZ3JhdGlvbiBndWlkZSBmb3IgSmVzdCB1c2VyczoKCnwgSmVzdCB8IGxpbC1tb2NreSB8CnwtLS0tLS18LS0tLS0tLS0tLS18CnwgYGplc3QuZm4oKWAgfCBgbW9ja3kuZnVuY3Rpb24oKS5idWlsZCgpYCB8CnwgYG1vY2subW9ja1JldHVyblZhbHVlKHZhbClgIHwgYG1vY2sucmV0KHZhbClgIHwKfCBgbW9jay5tb2NrLmNhbGxzWzBdWzBdYCB8IGBtb2NrLmNhbGxzKDApYCB8CnwgYGplc3Quc3B5T24ob2JqLCAnbWV0aG9kJylgIHwgYG1vY2t5LnNweShvYmosICdtZXRob2QnKWAgfAp8IGBzcHkubW9ja1Jlc3RvcmUoKWAgfCBgc3B5LnJlc3RvcmUoKWAgfAoKKipLZXkgZGlmZmVyZW5jZXM6KioKLSAqKkJ1aWxkZXIgcGF0dGVybioqOiBFeHBsaWNpdCBjb25maWd1cmF0aW9uIHZpYSBjaGFpbmFibGUgYnVpbGRlcnMgYmVmb3JlIGAuYnVpbGQoKWAKLSAqKk5hbWVkIGFyZ3VtZW50cyoqOiBCdWlsdC1pbiBzdXBwb3J0IGZvciBuYW1lZCBhcmd1bWVudCB0cmFja2luZyB3aXRoIGAuYXJncygpYAotICoqUGVyLWluc3RhbmNlIGNsYXNzIG1vY2tzKio6IENvbmZpZ3VyZSBkaWZmZXJlbnQgYmVoYXZpb3IgZm9yIGVhY2ggY2xhc3MgaW5zdGFuY2UKLSAqKlNpbXBsZXIgQVBJKio6IEZld2VyIGNvbmNlcHRzLCBtb3JlIHByZWRpY3RhYmxlIGJlaGF2aW9yCgotLS0KCiMjIPCfk4QgTGljZW5zZQoKTUlUCgojIyDwn6SdIENvbnRyaWJ1dGluZwoKQ29udHJpYnV0aW9ucyB3ZWxjb21lISBQbGVhc2Ugb3BlbiBhbiBpc3N1ZSBvciBQUiBvbiBHaXRIdWIuCgAAAAAAAAAAQUEAAAAAAAAAAAAAAAAAAAAAAAChQwAAAAAAAAAAAAAAAAAAAAAAAKFDAAAAAAAAAAAAAA",
1081
+ "AwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvw"
1082
+ ]
1083
+ ]
1084
+ }
1085
+ ],
1086
+ "build_system": "",
1087
+ "build_system_choices":
1088
+ [
1089
+ ],
1090
+ "build_varint": "",
1091
+ "command_palette":
1092
+ {
1093
+ "height": 0.0,
1094
+ "last_filter": "",
1095
+ "selected_items":
1096
+ [
1097
+ [
1098
+ "remove",
1099
+ "Package Control: Remove Package"
1100
+ ],
1101
+ [
1102
+ "tab",
1103
+ "Indentation: Convert to Tabs"
1104
+ ],
1105
+ [
1106
+ "tabs",
1107
+ "Indentation: Convert to Tabs"
1108
+ ],
1109
+ [
1110
+ "word",
1111
+ "Word Wrap: Toggle"
1112
+ ],
1113
+ [
1114
+ "convert to ",
1115
+ "Indentation: Convert to Tabs"
1116
+ ],
1117
+ [
1118
+ "close",
1119
+ "File: Close All"
1120
+ ],
1121
+ [
1122
+ "clo",
1123
+ "File: Close All"
1124
+ ],
1125
+ [
1126
+ "wor",
1127
+ "Word Wrap: Toggle"
1128
+ ],
1129
+ [
1130
+ "inde",
1131
+ "Indentation: Reindent Lines"
1132
+ ],
1133
+ [
1134
+ "save",
1135
+ "File: Save All"
1136
+ ],
1137
+ [
1138
+ "indent",
1139
+ "Indentation: Reindent Lines"
1140
+ ],
1141
+ [
1142
+ "cl",
1143
+ "File: Close All"
1144
+ ],
1145
+ [
1146
+ "lsp",
1147
+ "LSP: Restart Server"
1148
+ ],
1149
+ [
1150
+ "lsp re",
1151
+ "LSP: Restart Server"
1152
+ ],
1153
+ [
1154
+ "inst",
1155
+ "Package Control: Install Package"
1156
+ ],
1157
+ [
1158
+ "title",
1159
+ "Convert Case: Title Case"
1160
+ ],
1161
+ [
1162
+ "install",
1163
+ "Package Control: Install Package"
1164
+ ]
1165
+ ],
1166
+ "width": 0.0
1167
+ },
1168
+ "console":
1169
+ {
1170
+ "height": 0.0,
1171
+ "history":
1172
+ [
1173
+ ]
1174
+ },
1175
+ "distraction_free":
1176
+ {
1177
+ "menu_visible": true,
1178
+ "show_minimap": false,
1179
+ "show_open_files": false,
1180
+ "show_tabs": false,
1181
+ "side_bar_visible": false,
1182
+ "status_bar_visible": false
1183
+ },
1184
+ "expanded_folders":
1185
+ [
1186
+ "/app/lil-mocky",
1187
+ "/app/lil-mocky/src",
1188
+ "/app/lil-mocky/test"
1189
+ ],
1190
+ "file_history":
1191
+ [
1192
+ "/app/guidegeek-embed/src/js/slices/MapSlice.js",
1193
+ "/app/guidegeek-embed/src/js/libs/device.js",
1194
+ "/app/guidegeek-embed/src/test/unit/mocks/MainStoreMock.js",
1195
+ "/app/guidegeek-embed/src/test/unit/slices/MapSlice.test.js",
1196
+ "/app/guidegeek-embed/src/js/gg/MainStore.js",
1197
+ "/app/guidegeek-embed/src/js/widget/TextMessage.js",
1198
+ "/app/guidegeek-embed/src/gg-common/js/lilMarkyRenderers.js",
1199
+ "/app/guidegeek-embed/src/js/map/MapLine.js",
1200
+ "/app/guidegeek-embed/src/js/map/AdvancedMap.js",
1201
+ "/app/guidegeek-embed/src/js/map/MapMarker.js",
1202
+ "/app/guidegeek-embed/src/js/helpers/mapMessageHelpers.js",
1203
+ "/app/guidegeek-embed/src/scss/widget/_toast-notifier.scss",
1204
+ "/app/guidegeek-embed/src/scss/widget/_map-window.scss",
1205
+ "/app/guidegeek-embed/src/js/widget/MapFilterModal.js",
1206
+ "/app/guidegeek-embed/src/js/widget/MapWindow.js",
1207
+ "/app/guidegeek-embed/src/scss/widget/_card-slider.scss",
1208
+ "/app/guidegeek-embed/src/js/widget/CardSlider.js",
1209
+ "/app/guidegeek-embed/src/scss/widget/_chat-conversation.scss",
1210
+ "/app/guidegeek-embed/src/scss/widget/_text-message.scss",
1211
+ "/app/guidegeek-embed/src/scss/widget/_modal-dialog.scss",
1212
+ "/app/guidegeek-embed/src/scss/widget.scss",
1213
+ "/app/guidegeek-embed/src/scss/widget/_variables.scss",
1214
+ "/app/guidegeek-embed/src/js/map/CardSlider.js",
1215
+ "/app/guidegeek-embed/src/js/widget/PlaceWindow.js",
1216
+ "/app/guidegeek-embed/TODO",
1217
+ "/app/guidegeek-embed/src/test/unit/libs/ComponentElement.test.js",
1218
+ "/app/guidegeek-embed/src/js/widget/PlaceWindowContent.js",
1219
+ "/app/guidegeek-embed/www/map.html",
1220
+ "/app/guidegeek-embed/src/scss/map/_card-slider.scss",
1221
+ "/app/guidegeek-embed/src/scss/map/_base.scss",
1222
+ "/app/guidegeek-embed/src/js/map.js",
1223
+ "/app/guidegeek-embed/src/scss/map.scss",
1224
+ "/app/guidegeek-embed/src/js/widget/ImageSlider.js",
1225
+ "/app/guidegeek-embed/src/js/libs/ComponentElement.js",
1226
+ "/app/guidegeek-embed/src/node_modules/jsdom/lib/jsdom/living/generated/CustomElementConstructor.js",
1227
+ "/app/guidegeek-embed/src/scss/widget/_image-slider.scss",
1228
+ "/app/guidegeek-embed/src/scss/widget/_place-window.scss",
1229
+ "/app/guidegeek-embed/src/js/widget/AppWindow.js",
1230
+ "/app/guidegeek-embed/src/js/helpers/unsplashTracking.js",
1231
+ "/app/guidegeek-embed/src/scss/widget/_content-form.scss",
1232
+ "/app/guidegeek-embed/docker-compose.yml",
1233
+ "/app/guidegeek-embed/src/js/widget/HotelSearchDateModal.js",
1234
+ "/app/guidegeek-embed/src/js/slices/LayoutSlice.js",
1235
+ "/app/guidegeek-embed/src/js/gg/Chat.js",
1236
+ "/app/guidegeek-embed/src/scss/widget/_chat-toggle.scss",
1237
+ "/app/guidegeek-embed/src/scss/widget/_chat-message.scss",
1238
+ "/app/guidegeek-embed/src/scss/widget/_place-search.scss",
1239
+ "/app/guidegeek-embed/src/scss/map/_map-marker.scss",
1240
+ "/home/doug/Downloads/icon-sign-post.svg",
1241
+ "/app/guidegeek-embed/src/js/widget/FeedbackModal.js",
1242
+ "/app/guidegeek-embed/src/js/simple-map.js",
1243
+ "/home/doug/Downloads/icon-dollar-sign.svg",
1244
+ "/app/guidegeek-embed/src/js/map/MapDataHelper.js",
1245
+ "/app/guidegeek-embed/src/js/slices/PlacesSlice.js",
1246
+ "/app/guidegeek-embed/src/js/widget/PlaceHotelSearch.js",
1247
+ "/app/guidegeek-embed/src/js/widget/HotelSearchRoomsModal.js",
1248
+ "/app/guidegeek-embed/src/js/libs/SliceBuddy.js",
1249
+ "/app/guidegeek-embed/src/js/libs/GuideGeekHttp.js",
1250
+ "/app/guidegeek-embed/src/scss/map/_map-cluster.scss",
1251
+ "/app/guidegeek-embed/src/js/libs/AnalyticsClient.js",
1252
+ "/app/guidegeek-embed/src/js/widget/ChatWindow.js",
1253
+ "/app/guidegeek-embed/src/js/widget/ChatToggle.js",
1254
+ "/app/guidegeek-embed/src/js/widget/ChatMessageList.js",
1255
+ "/home/doug/Temp/icon-funnel.svg",
1256
+ "/app/guidegeek-embed/src/js/map/SimpleMap.js",
1257
+ "/app/guidegeek-embed/src/js/widget/createWidget.js",
1258
+ "/app/guidegeek-embed/src/scss/widget/_app-window.scss",
1259
+ "/app/guidegeek-embed/src/scss/widget/_app.scss",
1260
+ "/app/guidegeek-embed/src/js/widget/App.js",
1261
+ "/app/guidegeek-embed/src/js/libs/StoreBuddy.js",
1262
+ "/app/guidegeek-embed/www/dev/index.html",
1263
+ "/app/guidegeek-embed/src/js/gg/messageHelper.js",
1264
+ "/app/guidegeek-embed/src/js/libs/StateStorage.js",
1265
+ "/app/guidegeek-embed/src/package.json",
1266
+ "/app/guidegeek-embed/src/gg-common/js/lilMarkyRenderers.cjs",
1267
+ "/app/guidegeek-embed/src/js/helpers/imageHelpers.js",
1268
+ "/app/guidegeek-embed/sonar-project.properties",
1269
+ "/app/guidegeek-embed/src/js/gg/createWindowApi.js",
1270
+ "/app/guidegeek-embed/src/test/unit/libs/StoreBuddy.test.js",
1271
+ "/app/guidegeek-embed/src/js/widget/createTheme.js",
1272
+ "/app/guidegeek-embed/www/dev/cta.html",
1273
+ "/app/guidegeek-embed/src/js/libs/CrossOrigin.js",
1274
+ "/app/guidegeek-embed/src/js/widget/MessageActions.js",
1275
+ "/app/guidegeek-embed/src/js/libs/StoreBuddyNeo.js",
1276
+ "/app/guidegeek-embed/src/js/libs/DispatcherNeo.js",
1277
+ "/app/guidegeek-embed/src/gulpfile.js",
1278
+ "/app/guidegeek-embed/src/js/test.js",
1279
+ "/app/guidegeek-embed/Jenkinsfile",
1280
+ "/app/guidegeek-embed/src/js/embed.js",
1281
+ "/app/guidegeek-embed/src/test/unit/gg/createWindowApi.test.js",
1282
+ "/app/guidegeek-embed/src/scss/widget/_app-window-header.scss",
1283
+ "/app/guidegeek-embed/src/package-old.json",
1284
+ "/app/guidegeek-embed/Dockerfile",
1285
+ "/app/guidegeek-embed/src/scss/widget/_base.scss",
1286
+ "/app/guidegeek-embed/src/gg-common/js/placeFormat.cjs",
1287
+ "/app/guidegeek-embed/src/js/widget/PlaceTourSearch.js",
1288
+ "/app/guidegeek-embed/src/scss/widget/_content-status.scss",
1289
+ "/app/guidegeek-embed/src/gg-common/js/placeFormat.js",
1290
+ "/app/guidegeek-embed/src/js/libs/registerElements.js",
1291
+ "/app/guidegeek-embed/src/js/widget/PlaceWindowSearch.js",
1292
+ "/app/guidegeek-embed/src/gg-common/scss/_variables.scss",
1293
+ "/app/guidegeek-embed/src/scss/widget/_modal.scss",
1294
+ "/app/guidegeek-embed/src/scss/widget/_modal-form.scss",
1295
+ "/app/guidegeek-embed/src/scss/widget/_modal-control.scss",
1296
+ "/app/guidegeek-embed/src/js/widget/ModalWindow.js",
1297
+ "/app/guidegeek-embed/src/js/widget/CarouselMessage.js",
1298
+ "/app/guidegeek-embed/src/gg-common/scss/_flight-message-card.scss",
1299
+ "/app/guidegeek-embed/src/test/unit/libs/placeFormat.test.js",
1300
+ "/app/guidegeek-embed/src/node_modules/lit/async-directive.js",
1301
+ "/app/guidegeek-embed/src/js/helpers/mapDataHelpers.js",
1302
+ "/app/guidegeek-embed/src/js/markdown.js",
1303
+ "/app/guidegeek-embed/www/embed.js",
1304
+ "/app/guidegeek-embed/src/js/map/AdvancedMapOld.js",
1305
+ "/app/guidegeek-embed/src/js/gg/MainStoreOld.js",
1306
+ "/app/guidegeek-embed/src/js/libs/analytics.js",
1307
+ "/app/guidegeek-embed/src/js/gg/MainProvider.js",
1308
+ "/app/guidegeek-embed/src/js/libs/ProviderBuddy.js",
1309
+ "/app/guidegeek-embed/src/js/libs/Dispatcher.js",
1310
+ "/app/guidegeek-embed/src/js/gg/MainProviderOld.js",
1311
+ "/app/guidegeek-embed/src/js/config/config.js",
1312
+ "/app/guidegeek-embed/src/scss/widget/_control-modal.scss",
1313
+ "/app/guidegeek-embed/src/js/libs/Component.js",
1314
+ "/app/guidegeek-embed/src/js/libs/labels.js",
1315
+ "/app/guidegeek-embed/www/map.css",
1316
+ "/app/guidegeek-embed/src/scss/map/_map-menu.scss",
1317
+ "/home/doug/Temp/icon-bust.svg",
1318
+ "/app/guidegeek-embed/src/gg-common/scss/_wide-neo-message-card.scss",
1319
+ "/app/guidegeek-embed/deploy/deploy-mn-guidegeek-embed.sh"
1320
+ ],
1321
+ "find":
1322
+ {
1323
+ "height": 30.0
1324
+ },
1325
+ "find_in_files":
1326
+ {
1327
+ "height": 119.0,
1328
+ "where_history":
1329
+ [
1330
+ ]
1331
+ },
1332
+ "find_state":
1333
+ {
1334
+ "case_sensitive": true,
1335
+ "find_history":
1336
+ [
1337
+ "call33",
1338
+ "__mockyIndex",
1339
+ "deepClone",
1340
+ ".ret",
1341
+ "objectBuilder",
1342
+ "replacement",
1343
+ "methodName",
1344
+ "spy",
1345
+ "context",
1346
+ "original",
1347
+ "functionBuilder",
1348
+ "original",
1349
+ "functionBuilder",
1350
+ "createFunction",
1351
+ "wireFunction",
1352
+ "mocky.function",
1353
+ ".data",
1354
+ "context",
1355
+ "reset"
1356
+ ],
1357
+ "highlight": true,
1358
+ "in_selection": false,
1359
+ "preserve_case": false,
1360
+ "regex": false,
1361
+ "replace_history":
1362
+ [
1363
+ ],
1364
+ "reverse": false,
1365
+ "scrollbar_highlights": true,
1366
+ "show_context": true,
1367
+ "use_buffer2": true,
1368
+ "use_gitignore": true,
1369
+ "whole_word": false,
1370
+ "wrap": true
1371
+ },
1372
+ "groups":
1373
+ [
1374
+ {
1375
+ "sheets":
1376
+ [
1377
+ {
1378
+ "buffer": 0,
1379
+ "file": "src/lil-mocky.js",
1380
+ "selected": true,
1381
+ "semi_transient": false,
1382
+ "settings":
1383
+ {
1384
+ "buffer_size": 6800,
1385
+ "regions":
1386
+ {
1387
+ },
1388
+ "selection":
1389
+ [
1390
+ [
1391
+ 5856,
1392
+ 5856
1393
+ ]
1394
+ ],
1395
+ "settings":
1396
+ {
1397
+ "auto_complete_triggers":
1398
+ [
1399
+ {
1400
+ "characters": "<",
1401
+ "selector": "text.html, text.xml"
1402
+ },
1403
+ {
1404
+ "rhs_empty": true,
1405
+ "selector": "punctuation.accessor"
1406
+ }
1407
+ ],
1408
+ "copilot.completion._is_modified": false,
1409
+ "copilot.completion._is_saving": false,
1410
+ "copilot.completion.completion_index": 0,
1411
+ "copilot.completion.completion_style": "popup",
1412
+ "copilot.completion.completions":
1413
+ [
1414
+ {
1415
+ "displayText": "{",
1416
+ "docVersion": 1,
1417
+ "point": 758,
1418
+ "position":
1419
+ {
1420
+ "character": 33,
1421
+ "line": 39
1422
+ },
1423
+ "range":
1424
+ {
1425
+ "end":
1426
+ {
1427
+ "character": 34,
1428
+ "line": 39
1429
+ },
1430
+ "start":
1431
+ {
1432
+ "character": 0,
1433
+ "line": 39
1434
+ }
1435
+ },
1436
+ "region":
1437
+ [
1438
+ 725,
1439
+ 759
1440
+ ],
1441
+ "text": "\tmock.ret = (value, call = 0) => {",
1442
+ "uuid": "70a02f05-e467-4383-904c-9f5796513926"
1443
+ }
1444
+ ],
1445
+ "copilot.completion.is_visible": false,
1446
+ "copilot.completion.is_visible_panel_completions": false,
1447
+ "copilot.completion.is_waiting_completion": false,
1448
+ "copilot.completion.is_waiting_panel_completions": false,
1449
+ "copilot.completion.original_layout": null,
1450
+ "lsp_active": true,
1451
+ "lsp_uri": "file:///app/lil-mocky/src/lil-mocky.js",
1452
+ "syntax": "Packages/Babel/JavaScript (Babel).sublime-syntax"
1453
+ },
1454
+ "translation.x": 0.0,
1455
+ "translation.y": 5515.0,
1456
+ "zoom_level": 1.0
1457
+ },
1458
+ "stack_index": 0,
1459
+ "stack_multiselect": false,
1460
+ "type": "text"
1461
+ },
1462
+ {
1463
+ "buffer": 1,
1464
+ "file": "test/lilMockyTest.js",
1465
+ "semi_transient": false,
1466
+ "settings":
1467
+ {
1468
+ "buffer_size": 26009,
1469
+ "regions":
1470
+ {
1471
+ },
1472
+ "selection":
1473
+ [
1474
+ [
1475
+ 0,
1476
+ 0
1477
+ ]
1478
+ ],
1479
+ "settings":
1480
+ {
1481
+ "auto_complete_triggers":
1482
+ [
1483
+ {
1484
+ "characters": "<",
1485
+ "selector": "text.html, text.xml"
1486
+ },
1487
+ {
1488
+ "rhs_empty": true,
1489
+ "selector": "punctuation.accessor"
1490
+ }
1491
+ ],
1492
+ "copilot.completion._is_modified": false,
1493
+ "copilot.completion.is_visible": false,
1494
+ "copilot.completion.is_visible_panel_completions": false,
1495
+ "copilot.completion.is_waiting_completion": false,
1496
+ "copilot.completion.is_waiting_panel_completions": false,
1497
+ "copilot.completion.original_layout": null,
1498
+ "lsp_active": true,
1499
+ "lsp_uri": "file:///app/lil-mocky/test/lilMockyTest.js",
1500
+ "syntax": "Packages/Babel/JavaScript (Babel).sublime-syntax"
1501
+ },
1502
+ "translation.x": 0.0,
1503
+ "translation.y": 15898.0,
1504
+ "zoom_level": 1.0
1505
+ },
1506
+ "stack_index": 1,
1507
+ "stack_multiselect": false,
1508
+ "type": "text"
1509
+ },
1510
+ {
1511
+ "buffer": 2,
1512
+ "file": "README.md",
1513
+ "semi_transient": false,
1514
+ "settings":
1515
+ {
1516
+ "buffer_size": 17313,
1517
+ "regions":
1518
+ {
1519
+ },
1520
+ "selection":
1521
+ [
1522
+ [
1523
+ 0,
1524
+ 0
1525
+ ]
1526
+ ],
1527
+ "settings":
1528
+ {
1529
+ "auto_complete_triggers":
1530
+ [
1531
+ {
1532
+ "characters": "<",
1533
+ "selector": "text.html, text.xml"
1534
+ },
1535
+ {
1536
+ "rhs_empty": true,
1537
+ "selector": "punctuation.accessor"
1538
+ }
1539
+ ],
1540
+ "copilot.completion._is_modified": false,
1541
+ "copilot.completion.is_visible": false,
1542
+ "copilot.completion.is_visible_panel_completions": false,
1543
+ "copilot.completion.is_waiting_completion": false,
1544
+ "copilot.completion.is_waiting_panel_completions": false,
1545
+ "copilot.completion.original_layout": null,
1546
+ "lsp_active": true,
1547
+ "lsp_uri": "file:///app/lil-mocky/README.md",
1548
+ "syntax": "Packages/Markdown/Markdown.sublime-syntax"
1549
+ },
1550
+ "translation.x": 0.0,
1551
+ "translation.y": 6161.0,
1552
+ "zoom_level": 1.0
1553
+ },
1554
+ "stack_index": 2,
1555
+ "stack_multiselect": false,
1556
+ "type": "text"
1557
+ }
1558
+ ]
1559
+ }
1560
+ ],
1561
+ "incremental_find":
1562
+ {
1563
+ "height": 30.0
1564
+ },
1565
+ "input":
1566
+ {
1567
+ "height": 41.0
1568
+ },
1569
+ "layout":
1570
+ {
1571
+ "cells":
1572
+ [
1573
+ [
1574
+ 0,
1575
+ 0,
1576
+ 1,
1577
+ 1
1578
+ ]
1579
+ ],
1580
+ "cols":
1581
+ [
1582
+ 0.0,
1583
+ 1.0
1584
+ ],
1585
+ "rows":
1586
+ [
1587
+ 0.0,
1588
+ 1.0
1589
+ ]
1590
+ },
1591
+ "menu_visible": false,
1592
+ "output.LSP Log Panel":
1593
+ {
1594
+ "height": 0.0,
1595
+ "history":
1596
+ [
1597
+ ]
1598
+ },
1599
+ "output.diagnostics":
1600
+ {
1601
+ "height": 0.0,
1602
+ "history":
1603
+ [
1604
+ ]
1605
+ },
1606
+ "output.diff_views":
1607
+ {
1608
+ "height": 274.0,
1609
+ "history":
1610
+ [
1611
+ ]
1612
+ },
1613
+ "output.find_results":
1614
+ {
1615
+ "height": 0.0,
1616
+ "history":
1617
+ [
1618
+ ]
1619
+ },
1620
+ "output.mdpopups":
1621
+ {
1622
+ "height": 0.0,
1623
+ "history":
1624
+ [
1625
+ ]
1626
+ },
1627
+ "output.mdpopups-dummy":
1628
+ {
1629
+ "height": 0.0,
1630
+ "history":
1631
+ [
1632
+ ]
1633
+ },
1634
+ "pinned_build_system": "",
1635
+ "project": "lil-mocky.sublime-project",
1636
+ "replace":
1637
+ {
1638
+ "height": 56.0
1639
+ },
1640
+ "save_all_on_build": true,
1641
+ "select_file":
1642
+ {
1643
+ "height": 0.0,
1644
+ "last_filter": "",
1645
+ "selected_items":
1646
+ [
1647
+ [
1648
+ "",
1649
+ "src/lil-mocky.js"
1650
+ ],
1651
+ [
1652
+ "mockyte",
1653
+ "test/lilMockyTest.js"
1654
+ ],
1655
+ [
1656
+ "readme",
1657
+ "README.md"
1658
+ ],
1659
+ [
1660
+ "mainstoremo",
1661
+ "src/test/unit/mocks/MainStoreMock.js"
1662
+ ],
1663
+ [
1664
+ "mapslice",
1665
+ "src/test/unit/slices/MapSlice.test.js"
1666
+ ],
1667
+ [
1668
+ "mapsl",
1669
+ "src/js/slices/MapSlice.js"
1670
+ ],
1671
+ [
1672
+ "mainstore",
1673
+ "src/js/gg/MainStore.js"
1674
+ ],
1675
+ [
1676
+ "main",
1677
+ "src/js/gg/MainStore.js"
1678
+ ],
1679
+ [
1680
+ "mapline",
1681
+ "src/js/map/MapLine.js"
1682
+ ],
1683
+ [
1684
+ "advan",
1685
+ "src/js/map/AdvancedMap.js"
1686
+ ],
1687
+ [
1688
+ "cardslid",
1689
+ "src/js/widget/CardSlider.js"
1690
+ ],
1691
+ [
1692
+ "cardslider",
1693
+ "src/scss/widget/_card-slider.scss"
1694
+ ],
1695
+ [
1696
+ "toasnoti",
1697
+ "src/scss/widget/_toast-notifier.scss"
1698
+ ],
1699
+ [
1700
+ "mapwindoc",
1701
+ "src/scss/widget/_map-window.scss"
1702
+ ],
1703
+ [
1704
+ "mapfilter",
1705
+ "src/js/widget/MapFilterModal.js"
1706
+ ],
1707
+ [
1708
+ "mapwind",
1709
+ "src/js/widget/MapWindow.js"
1710
+ ],
1711
+ [
1712
+ "toast",
1713
+ "src/scss/widget/_toast-notifier.scss"
1714
+ ],
1715
+ [
1716
+ "placewind",
1717
+ "src/js/widget/PlaceWindow.js"
1718
+ ],
1719
+ [
1720
+ "modal",
1721
+ "src/scss/widget/_modal-dialog.scss"
1722
+ ],
1723
+ [
1724
+ "mapwindow",
1725
+ "src/scss/widget/_map-window.scss"
1726
+ ],
1727
+ [
1728
+ "varscs",
1729
+ "src/scss/widget/_variables.scss"
1730
+ ],
1731
+ [
1732
+ "modaldia",
1733
+ "src/scss/widget/_modal-dialog.scss"
1734
+ ],
1735
+ [
1736
+ "filtermod",
1737
+ "src/js/widget/MapFilterModal.js"
1738
+ ],
1739
+ [
1740
+ "mamark",
1741
+ "src/js/map/MapMarker.js"
1742
+ ],
1743
+ [
1744
+ "advancedmap",
1745
+ "src/js/map/AdvancedMap.js"
1746
+ ],
1747
+ [
1748
+ "ComponentElement.test.js",
1749
+ "src/test/unit/libs/ComponentElement.test.js"
1750
+ ],
1751
+ [
1752
+ "mapsli",
1753
+ "src/js/slices/MapSlice.js"
1754
+ ],
1755
+ [
1756
+ "todo",
1757
+ "TODO"
1758
+ ],
1759
+ [
1760
+ "adva",
1761
+ "src/js/map/AdvancedMap.js"
1762
+ ],
1763
+ [
1764
+ "mapmark",
1765
+ "src/js/map/MapMarker.js"
1766
+ ],
1767
+ [
1768
+ "cardsl",
1769
+ "src/js/widget/CardSlider.js"
1770
+ ],
1771
+ [
1772
+ "carsl",
1773
+ "src/js/map/CardSlider.js"
1774
+ ],
1775
+ [
1776
+ "mapwindo",
1777
+ "src/scss/widget/_map-window.scss"
1778
+ ],
1779
+ [
1780
+ "mapjs",
1781
+ "src/js/map.js"
1782
+ ],
1783
+ [
1784
+ "mapscss",
1785
+ "src/scss/map.scss"
1786
+ ],
1787
+ [
1788
+ "cardslscs",
1789
+ "src/scss/map/_card-slider.scss"
1790
+ ],
1791
+ [
1792
+ "mainstor",
1793
+ "src/js/gg/MainStore.js"
1794
+ ],
1795
+ [
1796
+ "imagesl",
1797
+ "src/js/widget/ImageSlider.js"
1798
+ ],
1799
+ [
1800
+ "compele",
1801
+ "src/js/libs/ComponentElement.js"
1802
+ ],
1803
+ [
1804
+ "comel",
1805
+ "src/node_modules/jsdom/lib/jsdom/living/generated/CustomElementConstructor.js"
1806
+ ],
1807
+ [
1808
+ "mapslc",
1809
+ "src/js/slices/MapSlice.js"
1810
+ ],
1811
+ [
1812
+ "widgetscs",
1813
+ "src/scss/widget.scss"
1814
+ ],
1815
+ [
1816
+ "text",
1817
+ "src/js/widget/TextMessage.js"
1818
+ ],
1819
+ [
1820
+ "comp",
1821
+ "src/js/libs/ComponentElement.js"
1822
+ ],
1823
+ [
1824
+ "textmes",
1825
+ "src/js/widget/TextMessage.js"
1826
+ ],
1827
+ [
1828
+ "mapwindowscs",
1829
+ "src/scss/widget/_map-window.scss"
1830
+ ],
1831
+ [
1832
+ "cardls",
1833
+ "src/js/widget/CardSlider.js"
1834
+ ],
1835
+ [
1836
+ "imageslider",
1837
+ "src/scss/widget/_image-slider.scss"
1838
+ ],
1839
+ [
1840
+ "maphtml",
1841
+ "www/map.html"
1842
+ ],
1843
+ [
1844
+ "mapwin",
1845
+ "src/js/widget/MapWindow.js"
1846
+ ],
1847
+ [
1848
+ "placecontent",
1849
+ "src/js/widget/PlaceWindowContent.js"
1850
+ ],
1851
+ [
1852
+ "appwind",
1853
+ "src/js/widget/AppWindow.js"
1854
+ ],
1855
+ [
1856
+ "docke",
1857
+ "docker-compose.yml"
1858
+ ],
1859
+ [
1860
+ "modalscs",
1861
+ "src/scss/widget/_modal-dialog.scss"
1862
+ ],
1863
+ [
1864
+ "contenform",
1865
+ "src/scss/widget/_content-form.scss"
1866
+ ],
1867
+ [
1868
+ "hoteldate",
1869
+ "src/js/widget/HotelSearchDateModal.js"
1870
+ ],
1871
+ [
1872
+ "mapmoda",
1873
+ "src/js/widget/MapFilterModal.js"
1874
+ ],
1875
+ [
1876
+ "helpers/map",
1877
+ "src/js/helpers/mapMessageHelpers.js"
1878
+ ],
1879
+ [
1880
+ "maphelp",
1881
+ "src/js/map/MapDataHelper.js"
1882
+ ],
1883
+ [
1884
+ "mapmar",
1885
+ "src/scss/map/_map-marker.scss"
1886
+ ],
1887
+ [
1888
+ "mapwindscs",
1889
+ "src/scss/widget/_map-window.scss"
1890
+ ],
1891
+ [
1892
+ "carslider",
1893
+ "src/js/widget/CardSlider.js"
1894
+ ],
1895
+ [
1896
+ "cars",
1897
+ "src/js/map/CardSlider.js"
1898
+ ],
1899
+ [
1900
+ "chatjs",
1901
+ "src/js/gg/Chat.js"
1902
+ ],
1903
+ [
1904
+ "advanced",
1905
+ "src/js/map/AdvancedMap.js"
1906
+ ],
1907
+ [
1908
+ "mapmodal",
1909
+ "src/js/widget/MapFilterModal.js"
1910
+ ],
1911
+ [
1912
+ "modalscss",
1913
+ "src/scss/widget/_modal-dialog.scss"
1914
+ ],
1915
+ [
1916
+ "layout",
1917
+ "src/js/slices/LayoutSlice.js"
1918
+ ],
1919
+ [
1920
+ "mapmak",
1921
+ "src/js/map/MapMarker.js"
1922
+ ],
1923
+ [
1924
+ "roomod",
1925
+ "src/js/widget/HotelSearchRoomsModal.js"
1926
+ ],
1927
+ [
1928
+ "placesl",
1929
+ "src/js/slices/PlacesSlice.js"
1930
+ ],
1931
+ [
1932
+ "gghttp",
1933
+ "src/js/libs/GuideGeekHttp.js"
1934
+ ],
1935
+ [
1936
+ "gghtt",
1937
+ "src/js/libs/GuideGeekHttp.js"
1938
+ ],
1939
+ [
1940
+ "placeslice",
1941
+ "src/js/slices/PlacesSlice.js"
1942
+ ],
1943
+ [
1944
+ "guidegeek",
1945
+ "src/js/libs/GuideGeekHttp.js"
1946
+ ],
1947
+ [
1948
+ "placecont",
1949
+ "src/js/widget/PlaceWindowContent.js"
1950
+ ],
1951
+ [
1952
+ "mapli",
1953
+ "src/js/map/MapLine.js"
1954
+ ],
1955
+ [
1956
+ "mapwindoscs",
1957
+ "src/scss/widget/_map-window.scss"
1958
+ ],
1959
+ [
1960
+ "mapscs",
1961
+ "src/scss/map/_map-cluster.scss"
1962
+ ],
1963
+ [
1964
+ "mapbase",
1965
+ "src/scss/map/_base.scss"
1966
+ ],
1967
+ [
1968
+ "mapmod",
1969
+ "src/js/widget/MapFilterModal.js"
1970
+ ],
1971
+ [
1972
+ "lilmark",
1973
+ "src/gg-common/js/lilMarkyRenderers.js"
1974
+ ],
1975
+ [
1976
+ "feedback",
1977
+ "src/js/widget/FeedbackModal.js"
1978
+ ],
1979
+ [
1980
+ "hotelsearch",
1981
+ "src/js/widget/PlaceHotelSearch.js"
1982
+ ],
1983
+ [
1984
+ "roommodal",
1985
+ "src/js/widget/HotelSearchRoomsModal.js"
1986
+ ],
1987
+ [
1988
+ "mapfil",
1989
+ "src/js/widget/MapFilterModal.js"
1990
+ ],
1991
+ [
1992
+ "varscss",
1993
+ "src/scss/widget/_variables.scss"
1994
+ ],
1995
+ [
1996
+ "layoutslice",
1997
+ "src/js/slices/LayoutSlice.js"
1998
+ ],
1999
+ [
2000
+ "mapfi",
2001
+ "src/js/widget/MapFilterModal.js"
2002
+ ],
2003
+ [
2004
+ "mapslic",
2005
+ "src/js/slices/MapSlice.js"
2006
+ ],
2007
+ [
2008
+ "store",
2009
+ "src/js/libs/StoreBuddy.js"
2010
+ ],
2011
+ [
2012
+ "appcss",
2013
+ "src/scss/widget/_app.scss"
2014
+ ],
2015
+ [
2016
+ "create",
2017
+ "src/js/widget/createWidget.js"
2018
+ ],
2019
+ [
2020
+ "appjs",
2021
+ "src/js/widget/App.js"
2022
+ ],
2023
+ [
2024
+ "mapfilte",
2025
+ "src/js/widget/MapFilterModal.js"
2026
+ ],
2027
+ [
2028
+ "hotel",
2029
+ "src/js/widget/PlaceHotelSearch.js"
2030
+ ],
2031
+ [
2032
+ "devinde",
2033
+ "www/dev/index.html"
2034
+ ],
2035
+ [
2036
+ "app",
2037
+ "src/js/widget/App.js"
2038
+ ],
2039
+ [
2040
+ "docker",
2041
+ "docker-compose.yml"
2042
+ ],
2043
+ [
2044
+ "placesear",
2045
+ "src/js/widget/PlaceHotelSearch.js"
2046
+ ],
2047
+ [
2048
+ "layouts",
2049
+ "src/js/slices/LayoutSlice.js"
2050
+ ],
2051
+ [
2052
+ "mapme",
2053
+ "src/js/helpers/mapMessageHelpers.js"
2054
+ ],
2055
+ [
2056
+ "mapslider",
2057
+ "src/js/map/CardSlider.js"
2058
+ ],
2059
+ [
2060
+ "mains",
2061
+ "src/js/gg/MainStore.js"
2062
+ ],
2063
+ [
2064
+ "chatmes",
2065
+ "src/js/widget/ChatMessageList.js"
2066
+ ],
2067
+ [
2068
+ "creat",
2069
+ "src/js/widget/createWidget.js"
2070
+ ],
2071
+ [
2072
+ "layoutslc",
2073
+ "src/js/slices/LayoutSlice.js"
2074
+ ],
2075
+ [
2076
+ "storage",
2077
+ "src/js/libs/StateStorage.js"
2078
+ ],
2079
+ [
2080
+ "pack",
2081
+ "src/package.json"
2082
+ ],
2083
+ [
2084
+ "mainst",
2085
+ "src/js/gg/MainStore.js"
2086
+ ],
2087
+ [
2088
+ "advancedma",
2089
+ "src/js/map/AdvancedMap.js"
2090
+ ],
2091
+ [
2092
+ "simple",
2093
+ "src/js/map/SimpleMap.js"
2094
+ ],
2095
+ [
2096
+ "advanc",
2097
+ "src/js/map/AdvancedMap.js"
2098
+ ],
2099
+ [
2100
+ "packae",
2101
+ "src/package.json"
2102
+ ],
2103
+ [
2104
+ "widget/createWidget.js",
2105
+ "src/js/widget/createWidget.js"
2106
+ ],
2107
+ [
2108
+ "placewindow",
2109
+ "src/js/widget/PlaceWindow.js"
2110
+ ],
2111
+ [
2112
+ "placesearch",
2113
+ "src/js/widget/PlaceHotelSearch.js"
2114
+ ],
2115
+ [
2116
+ "chatwin",
2117
+ "src/js/widget/ChatWindow.js"
2118
+ ],
2119
+ [
2120
+ "appwin",
2121
+ "src/js/widget/AppWindow.js"
2122
+ ],
2123
+ [
2124
+ "slices/MapSlice.js",
2125
+ "src/js/slices/MapSlice.js"
2126
+ ],
2127
+ [
2128
+ "simplemap",
2129
+ "src/js/map/SimpleMap.js"
2130
+ ],
2131
+ [
2132
+ "js/helpers/imageHelpers.js",
2133
+ "src/js/helpers/imageHelpers.js"
2134
+ ],
2135
+ [
2136
+ "helpers/mapMessageHelpers.js",
2137
+ "src/js/helpers/mapMessageHelpers.js"
2138
+ ],
2139
+ [
2140
+ "contenfrm",
2141
+ "src/scss/widget/_content-form.scss"
2142
+ ],
2143
+ [
2144
+ "cta.html",
2145
+ "www/dev/cta.html"
2146
+ ],
2147
+ [
2148
+ "feeb",
2149
+ "src/js/widget/FeedbackModal.js"
2150
+ ],
2151
+ [
2152
+ "compoele",
2153
+ "src/js/libs/ComponentElement.js"
2154
+ ],
2155
+ [
2156
+ "crossori",
2157
+ "src/js/libs/CrossOrigin.js"
2158
+ ]
2159
+ ],
2160
+ "width": 0.0
2161
+ },
2162
+ "select_project":
2163
+ {
2164
+ "height": 500.0,
2165
+ "last_filter": "con",
2166
+ "selected_items":
2167
+ [
2168
+ [
2169
+ "con",
2170
+ "~/.config/linux-config.sublime-project"
2171
+ ],
2172
+ [
2173
+ "em",
2174
+ "/app/guidegeek-embed/guidegeek-embed.sublime-project"
2175
+ ],
2176
+ [
2177
+ "",
2178
+ "/app/guidegeek-embed/guidegeek-embed.sublime-project"
2179
+ ],
2180
+ [
2181
+ "api",
2182
+ "/app/guidegeek-api/guidegeek-api.sublime-project"
2183
+ ],
2184
+ [
2185
+ "mata",
2186
+ "/app/matadornetwork.com/matadornetwork-com.sublime-project"
2187
+ ],
2188
+ [
2189
+ "ma",
2190
+ "/app/matadornetwork.com/matadornetwork-com.sublime-project"
2191
+ ],
2192
+ [
2193
+ "ao",
2194
+ "/app/aoc/aoc.sublime-project"
2195
+ ],
2196
+ [
2197
+ "aoc",
2198
+ "/app/aoc/aoc.sublime-project"
2199
+ ],
2200
+ [
2201
+ "admin",
2202
+ "/app/guidegeek-admin/guidegeek-admin.sublime-project"
2203
+ ],
2204
+ [
2205
+ "ad",
2206
+ "/app/guidegeek-admin/guidegeek-admin.sublime-project"
2207
+ ],
2208
+ [
2209
+ "pro",
2210
+ "/app/matador-proxy/matador-proxy.sublime-project"
2211
+ ],
2212
+ [
2213
+ "lil",
2214
+ "/app/lil-marky/lil-marky.sublime-project"
2215
+ ],
2216
+ [
2217
+ "amdin",
2218
+ "/app/guidegeek-admin/guidegeek-admin.sublime-project"
2219
+ ],
2220
+ [
2221
+ "guide",
2222
+ "/app/guidegeek.com/guidegeek-com.sublime-project"
2223
+ ],
2224
+ [
2225
+ "conf",
2226
+ "~/.config/linux-config.sublime-project"
2227
+ ],
2228
+ [
2229
+ "travel",
2230
+ "/app/travelstoke-app/travelstoke-app.sublime-project"
2231
+ ],
2232
+ [
2233
+ "trav",
2234
+ "/app/travelstoke-app/travelstoke-app.sublime-project"
2235
+ ],
2236
+ [
2237
+ "tr",
2238
+ "/app/travelstoke-app/travelstoke-app.sublime-project"
2239
+ ],
2240
+ [
2241
+ "travl",
2242
+ "/app/travelstoke-app/travelstoke-app.sublime-project"
2243
+ ],
2244
+ [
2245
+ "confi",
2246
+ "~/.config/linux-config.sublime-project"
2247
+ ],
2248
+ [
2249
+ "matador",
2250
+ "/app/matadornetwork.com/matadornetwork-com.sublime-project"
2251
+ ],
2252
+ [
2253
+ "ap",
2254
+ "/app/guidegeek-api/guidegeek-api.sublime-project"
2255
+ ],
2256
+ [
2257
+ "lilmark",
2258
+ "/app/lil-marky/lil-marky.sublime-project"
2259
+ ],
2260
+ [
2261
+ "cloud",
2262
+ "/app/cloudinary-migrator/cloudinary.sublime-project"
2263
+ ],
2264
+ [
2265
+ "gui",
2266
+ "/app/guidegeek.com/guidegeek-com.sublime-project"
2267
+ ],
2268
+ [
2269
+ "lilmar",
2270
+ "/app/lil-marky/lil-marky.sublime-project"
2271
+ ],
2272
+ [
2273
+ "cl",
2274
+ "/app/cloudinary-migrator/cloudinary.sublime-project"
2275
+ ],
2276
+ [
2277
+ "lin",
2278
+ "~/.config/linux-config.sublime-project"
2279
+ ],
2280
+ [
2281
+ "linux",
2282
+ "~/.config/linux-config.sublime-project"
2283
+ ],
2284
+ [
2285
+ "tra",
2286
+ "/app/travelstoke-app/travelstoke-app.sublime-project"
2287
+ ],
2288
+ [
2289
+ "trave",
2290
+ "/app/travelstoke-app/travelstoke-app.sublime-project"
2291
+ ],
2292
+ [
2293
+ "config",
2294
+ "~/.config/linux-config.sublime-project"
2295
+ ],
2296
+ [
2297
+ "lilmak",
2298
+ "/app/lil-marky/lil-marky.sublime-project"
2299
+ ],
2300
+ [
2301
+ "crea",
2302
+ "/app/creators.matadornetwork.com/creators-matadornetwork-com.sublime-project"
2303
+ ],
2304
+ [
2305
+ "ocn",
2306
+ "/app/cloudinary-migrator/cloudinary.sublime-project"
2307
+ ],
2308
+ [
2309
+ "doug",
2310
+ "/app/dougmcleod.ca/dougmcleod-ca.sublime-project"
2311
+ ],
2312
+ [
2313
+ "clo",
2314
+ "/app/cloudinary-migrator/cloudinary.sublime-project"
2315
+ ],
2316
+ [
2317
+ "LIN",
2318
+ "~/.config/linux-config.sublime-project"
2319
+ ],
2320
+ [
2321
+ "li",
2322
+ "~/.config/linux-config.sublime-project"
2323
+ ],
2324
+ [
2325
+ "API",
2326
+ "\\\\wsl.localhost\\Gentoo\\app\\guidegeek-api\\guidegeek-api.sublime-project"
2327
+ ],
2328
+ [
2329
+ "go",
2330
+ "\\\\wsl.localhost\\Gentoo\\app\\gopttrn.com\\gopttrn-com.sublime-project"
2331
+ ],
2332
+ [
2333
+ "ani",
2334
+ "\\\\wsl.localhost\\Gentoo\\app\\animalcrossingprices.com\\animalcrossingprices-com.sublime-project"
2335
+ ],
2336
+ [
2337
+ "a",
2338
+ "\\\\wsl.localhost\\Gentoo\\app\\guidegeek-api\\guidegeek-api.sublime-project"
2339
+ ],
2340
+ [
2341
+ "embe",
2342
+ "\\\\wsl.localhost\\Gentoo\\app\\guidegeek-embed\\guidegeek-embed.sublime-project"
2343
+ ],
2344
+ [
2345
+ "cre",
2346
+ "\\\\wsl.localhost\\Gentoo\\app\\creators.matadornetwork.com\\creators-matadornetwork-com.sublime-project"
2347
+ ],
2348
+ [
2349
+ "emb",
2350
+ "\\\\wsl.localhost\\Gentoo\\app\\guidegeek-embed-thales\\guidegeek-embed-thales.sublime-project"
2351
+ ],
2352
+ [
2353
+ "tha",
2354
+ "\\\\wsl.localhost\\Gentoo\\app\\guidegeek-embed-thales\\guidegeek-embed-thales.sublime-project"
2355
+ ],
2356
+ [
2357
+ "thal",
2358
+ "\\\\wsl.localhost\\Gentoo\\app\\guidegeek-embed-thales\\guidegeek-embed-thales.sublime-project"
2359
+ ]
2360
+ ],
2361
+ "width": 380.0
2362
+ },
2363
+ "select_symbol":
2364
+ {
2365
+ "height": 0.0,
2366
+ "last_filter": "",
2367
+ "selected_items":
2368
+ [
2369
+ ],
2370
+ "width": 0.0
2371
+ },
2372
+ "selected_group": 0,
2373
+ "settings":
2374
+ {
2375
+ "copilot.conversation.code_block_index":
2376
+ {
2377
+ },
2378
+ "copilot.conversation.conversation_entries":
2379
+ [
2380
+ ],
2381
+ "copilot.conversation.conversation_id": "",
2382
+ "copilot.conversation.follow_up": "",
2383
+ "copilot.conversation.is_visible": false,
2384
+ "copilot.conversation.is_waiting_conversation": false,
2385
+ "copilot.conversation.last_active_view_id": 215,
2386
+ "copilot.conversation.original_layout": null,
2387
+ "copilot.conversation.reference_block_state":
2388
+ {
2389
+ },
2390
+ "copilot.conversation.suggested_title": "",
2391
+ "copilot.copilotignore.patterns":
2392
+ {
2393
+ },
2394
+ "lsp_show_inlay_hints": false
2395
+ },
2396
+ "show_minimap": false,
2397
+ "show_open_files": false,
2398
+ "show_tabs": false,
2399
+ "side_bar_visible": false,
2400
+ "side_bar_width": 248.0,
2401
+ "status_bar_visible": true,
2402
+ "template_settings":
2403
+ {
2404
+ }
2405
+ }