@okyiww/form 0.0.4 → 0.0.5
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.
- package/dist/index.js +7 -5
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -4521,10 +4521,9 @@ function b_(f, s, r) {
|
|
|
4521
4521
|
};
|
|
4522
4522
|
}
|
|
4523
4523
|
function D_(f) {
|
|
4524
|
-
var
|
|
4524
|
+
var r;
|
|
4525
4525
|
return {
|
|
4526
|
-
|
|
4527
|
-
...((c = ke.context.default) == null ? void 0 : c.formProps) ?? {},
|
|
4526
|
+
...((r = ke.context.default) == null ? void 0 : r.formProps) ?? {},
|
|
4528
4527
|
...f._options.formProps
|
|
4529
4528
|
};
|
|
4530
4529
|
}
|
|
@@ -4703,7 +4702,9 @@ class F_ {
|
|
|
4703
4702
|
const s = D_(this.runtime);
|
|
4704
4703
|
return () => je(this.meta.Form, rs({
|
|
4705
4704
|
ref: this.formRef
|
|
4706
|
-
}, s
|
|
4705
|
+
}, s, {
|
|
4706
|
+
[this.runtime._adapter.adaptee.formModelName]: this.runtime._model.model.value
|
|
4707
|
+
}), {
|
|
4707
4708
|
...this.runtime._options.formSlots,
|
|
4708
4709
|
default: () => je("div", {
|
|
4709
4710
|
style: T_(this.runtime._options.layoutGap)
|
|
@@ -5408,7 +5409,7 @@ class u0 {
|
|
|
5408
5409
|
this._model.model.value = {
|
|
5409
5410
|
...this._model.model.value,
|
|
5410
5411
|
...s
|
|
5411
|
-
};
|
|
5412
|
+
}, console.log("hydrate", this._model.model.value);
|
|
5412
5413
|
});
|
|
5413
5414
|
}
|
|
5414
5415
|
getFormRef() {
|
|
@@ -5459,3 +5460,4 @@ export {
|
|
|
5459
5460
|
d0 as useForm,
|
|
5460
5461
|
_0 as version
|
|
5461
5462
|
};
|
|
5463
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2hANC4xNy4yMS9ub2RlX21vZHVsZXMvbG9kYXNoL2xvZGFzaC5qcyIsIi4uL3NyYy9jb3JlL2NvbnRleHQvaW5kZXgudHMiLCIuLi9zcmMvaGVscGVycy9kZWZpbmVGb3JtU2V0dXAvaW5kZXgudHMiLCIuLi9zcmMvaGVscGVycy9kZWZpbmVGb3JtU2NoZW1hL2luZGV4LnRzIiwiLi4vc3JjL2hlbHBlcnMvaW5pdEZvcm0vaW5kZXgudHMiLCIuLi9zcmMvY29yZS9hZGFwdGVyL0FyY29WdWVBZGFwdGVyLnRzIiwiLi4vc3JjL2NvcmUvYWRhcHRlci9OYWl2ZVVJQWRhcHRlci50cyIsIi4uL3NyYy9jb3JlL2FkYXB0ZXIvTnV0VUlBZGFwdGVyLnRzIiwiLi4vc3JjL2NvcmUvYWRhcHRlci9pbmRleC50cyIsIi4uL3NyYy9jb3JlL3NlcnZpY2VzL2lzTnVtZXJpY0xpa2UudHMiLCIuLi9zcmMvY29yZS9zZXJ2aWNlcy90cmF2ZXJzZS50cyIsIi4uL3NyYy9jb3JlL3NlcnZpY2VzL2lzUHJvbWlzZS50cyIsIi4uL3NyYy9jb3JlL3NlcnZpY2VzL2lzVmFsaWRDb21wb25lbnQudHMiLCIuLi9zcmMvY29yZS9zZXJ2aWNlcy9jaGVja1BhdGgudHMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vb24tY2hhbmdlQDYuMC4xL25vZGVfbW9kdWxlcy9vbi1jaGFuZ2Uvc291cmNlL2NvbnN0YW50cy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9vbi1jaGFuZ2VANi4wLjEvbm9kZV9tb2R1bGVzL29uLWNoYW5nZS9zb3VyY2UvaXMtYnVpbHRpbi5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9vbi1jaGFuZ2VANi4wLjEvbm9kZV9tb2R1bGVzL29uLWNoYW5nZS9zb3VyY2UvaXMtc3ltYm9sLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL29uLWNoYW5nZUA2LjAuMS9ub2RlX21vZHVsZXMvb24tY2hhbmdlL3NvdXJjZS9wYXRoLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL29uLWNoYW5nZUA2LjAuMS9ub2RlX21vZHVsZXMvb24tY2hhbmdlL3NvdXJjZS9pcy1vYmplY3QuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vb24tY2hhbmdlQDYuMC4xL25vZGVfbW9kdWxlcy9vbi1jaGFuZ2Uvc291cmNlL2lzLWl0ZXJhdG9yLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL29uLWNoYW5nZUA2LjAuMS9ub2RlX21vZHVsZXMvb24tY2hhbmdlL3NvdXJjZS93cmFwLWl0ZXJhdG9yLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL29uLWNoYW5nZUA2LjAuMS9ub2RlX21vZHVsZXMvb24tY2hhbmdlL3NvdXJjZS9pZ25vcmUtcHJvcGVydHkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vb24tY2hhbmdlQDYuMC4xL25vZGVfbW9kdWxlcy9vbi1jaGFuZ2Uvc291cmNlL2NhY2hlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL29uLWNoYW5nZUA2LjAuMS9ub2RlX21vZHVsZXMvb24tY2hhbmdlL3NvdXJjZS9pcy1hcnJheS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9vbi1jaGFuZ2VANi4wLjEvbm9kZV9tb2R1bGVzL29uLWNoYW5nZS9zb3VyY2Uvc21hcnQtY2xvbmUvZGlmZi9pcy1kaWZmLWNlcnRhaW4uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vb24tY2hhbmdlQDYuMC4xL25vZGVfbW9kdWxlcy9vbi1jaGFuZ2Uvc291cmNlL3NtYXJ0LWNsb25lL2RpZmYvaXMtZGlmZi1hcnJheXMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vb24tY2hhbmdlQDYuMC4xL25vZGVfbW9kdWxlcy9vbi1jaGFuZ2Uvc291cmNlL3NtYXJ0LWNsb25lL21ldGhvZHMvb2JqZWN0LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL29uLWNoYW5nZUA2LjAuMS9ub2RlX21vZHVsZXMvb24tY2hhbmdlL3NvdXJjZS9zbWFydC1jbG9uZS9tZXRob2RzL2FycmF5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL29uLWNoYW5nZUA2LjAuMS9ub2RlX21vZHVsZXMvb24tY2hhbmdlL3NvdXJjZS9zbWFydC1jbG9uZS9kaWZmL2lzLWRpZmYtc2V0cy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9vbi1jaGFuZ2VANi4wLjEvbm9kZV9tb2R1bGVzL29uLWNoYW5nZS9zb3VyY2Uvc21hcnQtY2xvbmUvbWV0aG9kcy9zZXQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vb24tY2hhbmdlQDYuMC4xL25vZGVfbW9kdWxlcy9vbi1jaGFuZ2Uvc291cmNlL3NtYXJ0LWNsb25lL2RpZmYvaXMtZGlmZi1tYXBzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL29uLWNoYW5nZUA2LjAuMS9ub2RlX21vZHVsZXMvb24tY2hhbmdlL3NvdXJjZS9zbWFydC1jbG9uZS9tZXRob2RzL21hcC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9vbi1jaGFuZ2VANi4wLjEvbm9kZV9tb2R1bGVzL29uLWNoYW5nZS9zb3VyY2Uvc21hcnQtY2xvbmUvY2xvbmUvY2xvbmUtb2JqZWN0LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL29uLWNoYW5nZUA2LjAuMS9ub2RlX21vZHVsZXMvb24tY2hhbmdlL3NvdXJjZS9zbWFydC1jbG9uZS9jbG9uZS9jbG9uZS1hcnJheS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9vbi1jaGFuZ2VANi4wLjEvbm9kZV9tb2R1bGVzL29uLWNoYW5nZS9zb3VyY2Uvc21hcnQtY2xvbmUvY2xvbmUvY2xvbmUtZGF0ZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9vbi1jaGFuZ2VANi4wLjEvbm9kZV9tb2R1bGVzL29uLWNoYW5nZS9zb3VyY2Uvc21hcnQtY2xvbmUvY2xvbmUvY2xvbmUtc2V0LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL29uLWNoYW5nZUA2LjAuMS9ub2RlX21vZHVsZXMvb24tY2hhbmdlL3NvdXJjZS9zbWFydC1jbG9uZS9jbG9uZS9jbG9uZS1tYXAuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vb24tY2hhbmdlQDYuMC4xL25vZGVfbW9kdWxlcy9vbi1jaGFuZ2Uvc291cmNlL3NtYXJ0LWNsb25lL2Nsb25lL2Nsb25lLXdlYWtzZXQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vb24tY2hhbmdlQDYuMC4xL25vZGVfbW9kdWxlcy9vbi1jaGFuZ2Uvc291cmNlL3NtYXJ0LWNsb25lL2Nsb25lL2Nsb25lLXdlYWttYXAuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vb24tY2hhbmdlQDYuMC4xL25vZGVfbW9kdWxlcy9vbi1jaGFuZ2Uvc291cmNlL3NtYXJ0LWNsb25lL3NtYXJ0LWNsb25lLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL29uLWNoYW5nZUA2LjAuMS9ub2RlX21vZHVsZXMvb24tY2hhbmdlL3NvdXJjZS9pbmRleC5qcyIsIi4uL3NyYy9jb3JlL2xpZmVjeWNsZS9Nb2RlbC9pbmRleC50cyIsIi4uL3NyYy9jb3JlL2xpZmVjeWNsZS9ob29rcy91c2VCYXNlU3R5bGUudHMiLCIuLi9zcmMvY29yZS9saWZlY3ljbGUvaG9va3MvdXNlRm9ybUl0ZW1Qcm9wcy50cyIsIi4uL3NyYy9jb3JlL2xpZmVjeWNsZS9ob29rcy91c2VGb3JtUHJvcHMudHMiLCIuLi9zcmMvY29yZS9saWZlY3ljbGUvaG9va3MvdXNlTGFiZWwudHMiLCIuLi9zcmMvY29yZS9saWZlY3ljbGUvaG9va3MvdXNlTGF5b3V0LnRzIiwiLi4vc3JjL2NvcmUvbGlmZWN5Y2xlL2hvb2tzL3VzZUxheW91dFN0eWxlLnRzIiwiLi4vc3JjL2NvcmUvbGlmZWN5Y2xlL2hvb2tzL3VzZVBsYWNlaG9sZGVyLnRzIiwiLi4vc3JjL2NvcmUvbGlmZWN5Y2xlL2hvb2tzL3VzZVJ1bGVzLnRzIiwiLi4vc3JjL2NvcmUvbGlmZWN5Y2xlL1JlbmRlci9pbmRleC50c3giLCIuLi9zcmMvY29yZS9saWZlY3ljbGUvaG9va3MvdXNlUGF0aFRyYWNrZXIudHMiLCIuLi9zcmMvY29yZS9saWZlY3ljbGUvaG9va3MvdXNlU1NSQ29tcG9uZW50LnRzIiwiLi4vc3JjL2NvcmUvc2VydmljZXMvZGVlcFRyYXZlcnNlLnRzIiwiLi4vc3JjL2NvcmUvbGlmZWN5Y2xlL2hvb2tzL3VzZURpc3BhdGNoSGFuZGxlci9pcy50cyIsIi4uL3NyYy9jb3JlL2xpZmVjeWNsZS9ob29rcy91c2VEaXNwYXRjaEhhbmRsZXIvcHJvY2Vzc0R5bmFtaWNWYWx1ZS50cyIsIi4uL3NyYy9jb3JlL2xpZmVjeWNsZS9ob29rcy91c2VEaXNwYXRjaEhhbmRsZXIvcHJvY2Vzc0NvbXBhcmUudHMiLCIuLi9zcmMvY29yZS9saWZlY3ljbGUvaG9va3MvdXNlRGlzcGF0Y2hIYW5kbGVyL3Byb2Nlc3NSZXF1ZXN0cy50cyIsIi4uL3NyYy9jb3JlL2xpZmVjeWNsZS9ob29rcy91c2VEaXNwYXRjaEhhbmRsZXIvcHJvY2Vzc1RyYW5zZm9ybS50cyIsIi4uL3NyYy9jb3JlL2xpZmVjeWNsZS9ob29rcy91c2VEaXNwYXRjaEhhbmRsZXIvaW5kZXgudHMiLCIuLi9zcmMvY29yZS9saWZlY3ljbGUvU2NoZW1hL2luZGV4LnRzIiwiLi4vc3JjL2NvcmUvbGlmZWN5Y2xlL1VwZGF0ZS9pbmRleC50cyIsIi4uL3NyYy9jb3JlL3J1bnRpbWUvaW5kZXgudHMiLCIuLi9zcmMvaGVscGVycy91c2VGb3JtL2luZGV4LnRzIiwiLi4vc3JjL2hlbHBlcnMvcmF3L2luZGV4LnRzIiwiLi4vc3JjL2hlbHBlcnMvb25jZS9pbmRleC50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBMb2Rhc2ggPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBDb3B5cmlnaHQgT3BlbkpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9vcGVuanNmLm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cbjsoZnVuY3Rpb24oKSB7XG5cbiAgLyoqIFVzZWQgYXMgYSBzYWZlIHJlZmVyZW5jZSBmb3IgYHVuZGVmaW5lZGAgaW4gcHJlLUVTNSBlbnZpcm9ubWVudHMuICovXG4gIHZhciB1bmRlZmluZWQ7XG5cbiAgLyoqIFVzZWQgYXMgdGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyLiAqL1xuICB2YXIgVkVSU0lPTiA9ICc0LjE3LjIxJztcblxuICAvKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi9cbiAgdmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbiAgLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xuICB2YXIgQ09SRV9FUlJPUl9URVhUID0gJ1Vuc3VwcG9ydGVkIGNvcmUtanMgdXNlLiBUcnkgaHR0cHM6Ly9ucG1zLmlvL3NlYXJjaD9xPXBvbnlmaWxsLicsXG4gICAgICBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbicsXG4gICAgICBJTlZBTElEX1RFTVBMX1ZBUl9FUlJPUl9URVhUID0gJ0ludmFsaWQgYHZhcmlhYmxlYCBvcHRpb24gcGFzc2VkIGludG8gYF8udGVtcGxhdGVgJztcblxuICAvKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG4gIHZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuICAvKiogVXNlZCBhcyB0aGUgbWF4aW11bSBtZW1vaXplIGNhY2hlIHNpemUuICovXG4gIHZhciBNQVhfTUVNT0laRV9TSVpFID0gNTAwO1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBpbnRlcm5hbCBhcmd1bWVudCBwbGFjZWhvbGRlci4gKi9cbiAgdmFyIFBMQUNFSE9MREVSID0gJ19fbG9kYXNoX3BsYWNlaG9sZGVyX18nO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNsb25pbmcuICovXG4gIHZhciBDTE9ORV9ERUVQX0ZMQUcgPSAxLFxuICAgICAgQ0xPTkVfRkxBVF9GTEFHID0gMixcbiAgICAgIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG4gIHZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuICAvKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBmdW5jdGlvbiBtZXRhZGF0YS4gKi9cbiAgdmFyIFdSQVBfQklORF9GTEFHID0gMSxcbiAgICAgIFdSQVBfQklORF9LRVlfRkxBRyA9IDIsXG4gICAgICBXUkFQX0NVUlJZX0JPVU5EX0ZMQUcgPSA0LFxuICAgICAgV1JBUF9DVVJSWV9GTEFHID0gOCxcbiAgICAgIFdSQVBfQ1VSUllfUklHSFRfRkxBRyA9IDE2LFxuICAgICAgV1JBUF9QQVJUSUFMX0ZMQUcgPSAzMixcbiAgICAgIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHID0gNjQsXG4gICAgICBXUkFQX0FSWV9GTEFHID0gMTI4LFxuICAgICAgV1JBUF9SRUFSR19GTEFHID0gMjU2LFxuICAgICAgV1JBUF9GTElQX0ZMQUcgPSA1MTI7XG5cbiAgLyoqIFVzZWQgYXMgZGVmYXVsdCBvcHRpb25zIGZvciBgXy50cnVuY2F0ZWAuICovXG4gIHZhciBERUZBVUxUX1RSVU5DX0xFTkdUSCA9IDMwLFxuICAgICAgREVGQVVMVF9UUlVOQ19PTUlTU0lPTiA9ICcuLi4nO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBob3QgZnVuY3Rpb25zIGJ5IG51bWJlciBvZiBjYWxscyB3aXRoaW4gYSBzcGFuIG9mIG1pbGxpc2Vjb25kcy4gKi9cbiAgdmFyIEhPVF9DT1VOVCA9IDgwMCxcbiAgICAgIEhPVF9TUEFOID0gMTY7XG5cbiAgLyoqIFVzZWQgdG8gaW5kaWNhdGUgdGhlIHR5cGUgb2YgbGF6eSBpdGVyYXRlZXMuICovXG4gIHZhciBMQVpZX0ZJTFRFUl9GTEFHID0gMSxcbiAgICAgIExBWllfTUFQX0ZMQUcgPSAyLFxuICAgICAgTEFaWV9XSElMRV9GTEFHID0gMztcblxuICAvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbiAgdmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgICBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MSxcbiAgICAgIE1BWF9JTlRFR0VSID0gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgsXG4gICAgICBOQU4gPSAwIC8gMDtcblxuICAvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB0aGUgbWF4aW11bSBsZW5ndGggYW5kIGluZGV4IG9mIGFuIGFycmF5LiAqL1xuICB2YXIgTUFYX0FSUkFZX0xFTkdUSCA9IDQyOTQ5NjcyOTUsXG4gICAgICBNQVhfQVJSQVlfSU5ERVggPSBNQVhfQVJSQVlfTEVOR1RIIC0gMSxcbiAgICAgIEhBTEZfTUFYX0FSUkFZX0xFTkdUSCA9IE1BWF9BUlJBWV9MRU5HVEggPj4+IDE7XG5cbiAgLyoqIFVzZWQgdG8gYXNzb2NpYXRlIHdyYXAgbWV0aG9kcyB3aXRoIHRoZWlyIGJpdCBmbGFncy4gKi9cbiAgdmFyIHdyYXBGbGFncyA9IFtcbiAgICBbJ2FyeScsIFdSQVBfQVJZX0ZMQUddLFxuICAgIFsnYmluZCcsIFdSQVBfQklORF9GTEFHXSxcbiAgICBbJ2JpbmRLZXknLCBXUkFQX0JJTkRfS0VZX0ZMQUddLFxuICAgIFsnY3VycnknLCBXUkFQX0NVUlJZX0ZMQUddLFxuICAgIFsnY3VycnlSaWdodCcsIFdSQVBfQ1VSUllfUklHSFRfRkxBR10sXG4gICAgWydmbGlwJywgV1JBUF9GTElQX0ZMQUddLFxuICAgIFsncGFydGlhbCcsIFdSQVBfUEFSVElBTF9GTEFHXSxcbiAgICBbJ3BhcnRpYWxSaWdodCcsIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHXSxcbiAgICBbJ3JlYXJnJywgV1JBUF9SRUFSR19GTEFHXVxuICBdO1xuXG4gIC8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbiAgdmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICAgIGFzeW5jVGFnID0gJ1tvYmplY3QgQXN5bmNGdW5jdGlvbl0nLFxuICAgICAgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgICBkb21FeGNUYWcgPSAnW29iamVjdCBET01FeGNlcHRpb25dJyxcbiAgICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgICBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nLFxuICAgICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgICBwcm9taXNlVGFnID0gJ1tvYmplY3QgUHJvbWlzZV0nLFxuICAgICAgcHJveHlUYWcgPSAnW29iamVjdCBQcm94eV0nLFxuICAgICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXScsXG4gICAgICB1bmRlZmluZWRUYWcgPSAnW29iamVjdCBVbmRlZmluZWRdJyxcbiAgICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXScsXG4gICAgICB3ZWFrU2V0VGFnID0gJ1tvYmplY3QgV2Vha1NldF0nO1xuXG4gIHZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggZW1wdHkgc3RyaW5nIGxpdGVyYWxzIGluIGNvbXBpbGVkIHRlbXBsYXRlIHNvdXJjZS4gKi9cbiAgdmFyIHJlRW1wdHlTdHJpbmdMZWFkaW5nID0gL1xcYl9fcCBcXCs9ICcnOy9nLFxuICAgICAgcmVFbXB0eVN0cmluZ01pZGRsZSA9IC9cXGIoX19wIFxcKz0pICcnIFxcKy9nLFxuICAgICAgcmVFbXB0eVN0cmluZ1RyYWlsaW5nID0gLyhfX2VcXCguKj9cXCl8XFxiX190XFwpKSBcXCtcXG4nJzsvZztcblxuICAvKiogVXNlZCB0byBtYXRjaCBIVE1MIGVudGl0aWVzIGFuZCBIVE1MIGNoYXJhY3RlcnMuICovXG4gIHZhciByZUVzY2FwZWRIdG1sID0gLyYoPzphbXB8bHR8Z3R8cXVvdHwjMzkpOy9nLFxuICAgICAgcmVVbmVzY2FwZWRIdG1sID0gL1smPD5cIiddL2csXG4gICAgICByZUhhc0VzY2FwZWRIdG1sID0gUmVnRXhwKHJlRXNjYXBlZEh0bWwuc291cmNlKSxcbiAgICAgIHJlSGFzVW5lc2NhcGVkSHRtbCA9IFJlZ0V4cChyZVVuZXNjYXBlZEh0bWwuc291cmNlKTtcblxuICAvKiogVXNlZCB0byBtYXRjaCB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLiAqL1xuICB2YXIgcmVFc2NhcGUgPSAvPCUtKFtcXHNcXFNdKz8pJT4vZyxcbiAgICAgIHJlRXZhbHVhdGUgPSAvPCUoW1xcc1xcU10rPyklPi9nLFxuICAgICAgcmVJbnRlcnBvbGF0ZSA9IC88JT0oW1xcc1xcU10rPyklPi9nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbiAgdmFyIHJlSXNEZWVwUHJvcCA9IC9cXC58XFxbKD86W15bXFxdXSp8KFtcIiddKSg/Oig/IVxcMSlbXlxcXFxdfFxcXFwuKSo/XFwxKVxcXS8sXG4gICAgICByZUlzUGxhaW5Qcm9wID0gL15cXHcqJC8sXG4gICAgICByZVByb3BOYW1lID0gL1teLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89KD86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCQpKS9nO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gICAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuICAgKi9cbiAgdmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZyxcbiAgICAgIHJlSGFzUmVnRXhwQ2hhciA9IFJlZ0V4cChyZVJlZ0V4cENoYXIuc291cmNlKTtcblxuICAvKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIHdoaXRlc3BhY2UuICovXG4gIHZhciByZVRyaW1TdGFydCA9IC9eXFxzKy87XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYSBzaW5nbGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuICovXG4gIHZhciByZVdoaXRlc3BhY2UgPSAvXFxzLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB3cmFwIGRldGFpbCBjb21tZW50cy4gKi9cbiAgdmFyIHJlV3JhcENvbW1lbnQgPSAvXFx7KD86XFxuXFwvXFwqIFxcW3dyYXBwZWQgd2l0aCAuK1xcXSBcXCpcXC8pP1xcbj8vLFxuICAgICAgcmVXcmFwRGV0YWlscyA9IC9cXHtcXG5cXC9cXCogXFxbd3JhcHBlZCB3aXRoICguKylcXF0gXFwqLyxcbiAgICAgIHJlU3BsaXREZXRhaWxzID0gLyw/ICYgLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB3b3JkcyBjb21wb3NlZCBvZiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gKi9cbiAgdmFyIHJlQXNjaWlXb3JkID0gL1teXFx4MDAtXFx4MmZcXHgzYS1cXHg0MFxceDViLVxceDYwXFx4N2ItXFx4N2ZdKy9nO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHZhbGlkYXRlIHRoZSBgdmFsaWRhdGVgIG9wdGlvbiBpbiBgXy50ZW1wbGF0ZWAgdmFyaWFibGUuXG4gICAqXG4gICAqIEZvcmJpZHMgY2hhcmFjdGVycyB3aGljaCBjb3VsZCBwb3RlbnRpYWxseSBjaGFuZ2UgdGhlIG1lYW5pbmcgb2YgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50IGRlZmluaXRpb246XG4gICAqIC0gXCIoKSxcIiAobW9kaWZpY2F0aW9uIG9mIGZ1bmN0aW9uIHBhcmFtZXRlcnMpXG4gICAqIC0gXCI9XCIgKGRlZmF1bHQgdmFsdWUpXG4gICAqIC0gXCJbXXt9XCIgKGRlc3RydWN0dXJpbmcgb2YgZnVuY3Rpb24gcGFyYW1ldGVycylcbiAgICogLSBcIi9cIiAoYmVnaW5uaW5nIG9mIGEgY29tbWVudClcbiAgICogLSB3aGl0ZXNwYWNlXG4gICAqL1xuICB2YXIgcmVGb3JiaWRkZW5JZGVudGlmaWVyQ2hhcnMgPSAvWygpPSx7fVxcW1xcXVxcL1xcc10vO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xuICB2YXIgcmVFc2NhcGVDaGFyID0gL1xcXFwoXFxcXCk/L2c7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gbWF0Y2hcbiAgICogW0VTIHRlbXBsYXRlIGRlbGltaXRlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRlbXBsYXRlLWxpdGVyYWwtbGV4aWNhbC1jb21wb25lbnRzKS5cbiAgICovXG4gIHZhciByZUVzVGVtcGxhdGUgPSAvXFwkXFx7KFteXFxcXH1dKig/OlxcXFwuW15cXFxcfV0qKSopXFx9L2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGAgZmxhZ3MgZnJvbSB0aGVpciBjb2VyY2VkIHN0cmluZyB2YWx1ZXMuICovXG4gIHZhciByZUZsYWdzID0gL1xcdyokLztcblxuICAvKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xuICB2YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkpLiAqL1xuICB2YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xuICB2YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIExhdGluIFVuaWNvZGUgbGV0dGVycyAoZXhjbHVkaW5nIG1hdGhlbWF0aWNhbCBvcGVyYXRvcnMpLiAqL1xuICB2YXIgcmVMYXRpbiA9IC9bXFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxceGZmXFx1MDEwMC1cXHUwMTdmXS9nO1xuXG4gIC8qKiBVc2VkIHRvIGVuc3VyZSBjYXB0dXJpbmcgb3JkZXIgb2YgdGVtcGxhdGUgZGVsaW1pdGVycy4gKi9cbiAgdmFyIHJlTm9NYXRjaCA9IC8oJF4pLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB1bmVzY2FwZWQgY2hhcmFjdGVycyBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuICovXG4gIHZhciByZVVuZXNjYXBlZFN0cmluZyA9IC9bJ1xcblxcclxcdTIwMjhcXHUyMDI5XFxcXF0vZztcblxuICAvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG4gIHZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgICAgcnNDb21ib01hcmtzUmFuZ2UgPSAnXFxcXHUwMzAwLVxcXFx1MDM2ZicsXG4gICAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgICAgcnNDb21ib1JhbmdlID0gcnNDb21ib01hcmtzUmFuZ2UgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgKyByc0NvbWJvU3ltYm9sc1JhbmdlLFxuICAgICAgcnNEaW5nYmF0UmFuZ2UgPSAnXFxcXHUyNzAwLVxcXFx1MjdiZicsXG4gICAgICByc0xvd2VyUmFuZ2UgPSAnYS16XFxcXHhkZi1cXFxceGY2XFxcXHhmOC1cXFxceGZmJyxcbiAgICAgIHJzTWF0aE9wUmFuZ2UgPSAnXFxcXHhhY1xcXFx4YjFcXFxceGQ3XFxcXHhmNycsXG4gICAgICByc05vbkNoYXJSYW5nZSA9ICdcXFxceDAwLVxcXFx4MmZcXFxceDNhLVxcXFx4NDBcXFxceDViLVxcXFx4NjBcXFxceDdiLVxcXFx4YmYnLFxuICAgICAgcnNQdW5jdHVhdGlvblJhbmdlID0gJ1xcXFx1MjAwMC1cXFxcdTIwNmYnLFxuICAgICAgcnNTcGFjZVJhbmdlID0gJyBcXFxcdFxcXFx4MGJcXFxcZlxcXFx4YTBcXFxcdWZlZmZcXFxcblxcXFxyXFxcXHUyMDI4XFxcXHUyMDI5XFxcXHUxNjgwXFxcXHUxODBlXFxcXHUyMDAwXFxcXHUyMDAxXFxcXHUyMDAyXFxcXHUyMDAzXFxcXHUyMDA0XFxcXHUyMDA1XFxcXHUyMDA2XFxcXHUyMDA3XFxcXHUyMDA4XFxcXHUyMDA5XFxcXHUyMDBhXFxcXHUyMDJmXFxcXHUyMDVmXFxcXHUzMDAwJyxcbiAgICAgIHJzVXBwZXJSYW5nZSA9ICdBLVpcXFxceGMwLVxcXFx4ZDZcXFxceGQ4LVxcXFx4ZGUnLFxuICAgICAgcnNWYXJSYW5nZSA9ICdcXFxcdWZlMGVcXFxcdWZlMGYnLFxuICAgICAgcnNCcmVha1JhbmdlID0gcnNNYXRoT3BSYW5nZSArIHJzTm9uQ2hhclJhbmdlICsgcnNQdW5jdHVhdGlvblJhbmdlICsgcnNTcGFjZVJhbmdlO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbiAgdmFyIHJzQXBvcyA9IFwiWydcXHUyMDE5XVwiLFxuICAgICAgcnNBc3RyYWwgPSAnWycgKyByc0FzdHJhbFJhbmdlICsgJ10nLFxuICAgICAgcnNCcmVhayA9ICdbJyArIHJzQnJlYWtSYW5nZSArICddJyxcbiAgICAgIHJzQ29tYm8gPSAnWycgKyByc0NvbWJvUmFuZ2UgKyAnXScsXG4gICAgICByc0RpZ2l0cyA9ICdcXFxcZCsnLFxuICAgICAgcnNEaW5nYmF0ID0gJ1snICsgcnNEaW5nYmF0UmFuZ2UgKyAnXScsXG4gICAgICByc0xvd2VyID0gJ1snICsgcnNMb3dlclJhbmdlICsgJ10nLFxuICAgICAgcnNNaXNjID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyByc0JyZWFrUmFuZ2UgKyByc0RpZ2l0cyArIHJzRGluZ2JhdFJhbmdlICsgcnNMb3dlclJhbmdlICsgcnNVcHBlclJhbmdlICsgJ10nLFxuICAgICAgcnNGaXR6ID0gJ1xcXFx1ZDgzY1tcXFxcdWRmZmItXFxcXHVkZmZmXScsXG4gICAgICByc01vZGlmaWVyID0gJyg/OicgKyByc0NvbWJvICsgJ3wnICsgcnNGaXR6ICsgJyknLFxuICAgICAgcnNOb25Bc3RyYWwgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICAgIHJzUmVnaW9uYWwgPSAnKD86XFxcXHVkODNjW1xcXFx1ZGRlNi1cXFxcdWRkZmZdKXsyfScsXG4gICAgICByc1N1cnJQYWlyID0gJ1tcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXScsXG4gICAgICByc1VwcGVyID0gJ1snICsgcnNVcHBlclJhbmdlICsgJ10nLFxuICAgICAgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuICAvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgcmVnZXhlcy4gKi9cbiAgdmFyIHJzTWlzY0xvd2VyID0gJyg/OicgKyByc0xvd2VyICsgJ3wnICsgcnNNaXNjICsgJyknLFxuICAgICAgcnNNaXNjVXBwZXIgPSAnKD86JyArIHJzVXBwZXIgKyAnfCcgKyByc01pc2MgKyAnKScsXG4gICAgICByc09wdENvbnRyTG93ZXIgPSAnKD86JyArIHJzQXBvcyArICcoPzpkfGxsfG18cmV8c3x0fHZlKSk/JyxcbiAgICAgIHJzT3B0Q29udHJVcHBlciA9ICcoPzonICsgcnNBcG9zICsgJyg/OkR8TEx8TXxSRXxTfFR8VkUpKT8nLFxuICAgICAgcmVPcHRNb2QgPSByc01vZGlmaWVyICsgJz8nLFxuICAgICAgcnNPcHRWYXIgPSAnWycgKyByc1ZhclJhbmdlICsgJ10/JyxcbiAgICAgIHJzT3B0Sm9pbiA9ICcoPzonICsgcnNaV0ogKyAnKD86JyArIFtyc05vbkFzdHJhbCwgcnNSZWdpb25hbCwgcnNTdXJyUGFpcl0uam9pbignfCcpICsgJyknICsgcnNPcHRWYXIgKyByZU9wdE1vZCArICcpKicsXG4gICAgICByc09yZExvd2VyID0gJ1xcXFxkKig/OjFzdHwybmR8M3JkfCg/IVsxMjNdKVxcXFxkdGgpKD89XFxcXGJ8W0EtWl9dKScsXG4gICAgICByc09yZFVwcGVyID0gJ1xcXFxkKig/OjFTVHwyTkR8M1JEfCg/IVsxMjNdKVxcXFxkVEgpKD89XFxcXGJ8W2Etel9dKScsXG4gICAgICByc1NlcSA9IHJzT3B0VmFyICsgcmVPcHRNb2QgKyByc09wdEpvaW4sXG4gICAgICByc0Vtb2ppID0gJyg/OicgKyBbcnNEaW5nYmF0LCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyXS5qb2luKCd8JykgKyAnKScgKyByc1NlcSxcbiAgICAgIHJzU3ltYm9sID0gJyg/OicgKyBbcnNOb25Bc3RyYWwgKyByc0NvbWJvICsgJz8nLCByc0NvbWJvLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyLCByc0FzdHJhbF0uam9pbignfCcpICsgJyknO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGFwb3N0cm9waGVzLiAqL1xuICB2YXIgcmVBcG9zID0gUmVnRXhwKHJzQXBvcywgJ2cnKTtcblxuICAvKipcbiAgICogVXNlZCB0byBtYXRjaCBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3MpIGFuZFxuICAgKiBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzIGZvciBzeW1ib2xzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3NfZm9yX1N5bWJvbHMpLlxuICAgKi9cbiAgdmFyIHJlQ29tYm9NYXJrID0gUmVnRXhwKHJzQ29tYm8sICdnJyk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggW3N0cmluZyBzeW1ib2xzXShodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC11bmljb2RlKS4gKi9cbiAgdmFyIHJlVW5pY29kZSA9IFJlZ0V4cChyc0ZpdHogKyAnKD89JyArIHJzRml0eiArICcpfCcgKyByc1N5bWJvbCArIHJzU2VxLCAnZycpO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGNvbXBsZXggb3IgY29tcG91bmQgd29yZHMuICovXG4gIHZhciByZVVuaWNvZGVXb3JkID0gUmVnRXhwKFtcbiAgICByc1VwcGVyICsgJz8nICsgcnNMb3dlciArICcrJyArIHJzT3B0Q29udHJMb3dlciArICcoPz0nICsgW3JzQnJlYWssIHJzVXBwZXIsICckJ10uam9pbignfCcpICsgJyknLFxuICAgIHJzTWlzY1VwcGVyICsgJysnICsgcnNPcHRDb250clVwcGVyICsgJyg/PScgKyBbcnNCcmVhaywgcnNVcHBlciArIHJzTWlzY0xvd2VyLCAnJCddLmpvaW4oJ3wnKSArICcpJyxcbiAgICByc1VwcGVyICsgJz8nICsgcnNNaXNjTG93ZXIgKyAnKycgKyByc09wdENvbnRyTG93ZXIsXG4gICAgcnNVcHBlciArICcrJyArIHJzT3B0Q29udHJVcHBlcixcbiAgICByc09yZFVwcGVyLFxuICAgIHJzT3JkTG93ZXIsXG4gICAgcnNEaWdpdHMsXG4gICAgcnNFbW9qaVxuICBdLmpvaW4oJ3wnKSwgJ2cnKTtcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB3aXRoIFt6ZXJvLXdpZHRoIGpvaW5lcnMgb3IgY29kZSBwb2ludHMgZnJvbSB0aGUgYXN0cmFsIHBsYW5lc10oaHR0cDovL2Vldi5lZS9ibG9nLzIwMTUvMDkvMTIvZGFyay1jb3JuZXJzLW9mLXVuaWNvZGUvKS4gKi9cbiAgdmFyIHJlSGFzVW5pY29kZSA9IFJlZ0V4cCgnWycgKyByc1pXSiArIHJzQXN0cmFsUmFuZ2UgICsgcnNDb21ib1JhbmdlICsgcnNWYXJSYW5nZSArICddJyk7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IHN0cmluZ3MgdGhhdCBuZWVkIGEgbW9yZSByb2J1c3QgcmVnZXhwIHRvIG1hdGNoIHdvcmRzLiAqL1xuICB2YXIgcmVIYXNVbmljb2RlV29yZCA9IC9bYS16XVtBLVpdfFtBLVpdezJ9W2Etel18WzAtOV1bYS16QS1aXXxbYS16QS1aXVswLTldfFteYS16QS1aMC05IF0vO1xuXG4gIC8qKiBVc2VkIHRvIGFzc2lnbiBkZWZhdWx0IGBjb250ZXh0YCBvYmplY3QgcHJvcGVydGllcy4gKi9cbiAgdmFyIGNvbnRleHRQcm9wcyA9IFtcbiAgICAnQXJyYXknLCAnQnVmZmVyJywgJ0RhdGFWaWV3JywgJ0RhdGUnLCAnRXJyb3InLCAnRmxvYXQzMkFycmF5JywgJ0Zsb2F0NjRBcnJheScsXG4gICAgJ0Z1bmN0aW9uJywgJ0ludDhBcnJheScsICdJbnQxNkFycmF5JywgJ0ludDMyQXJyYXknLCAnTWFwJywgJ01hdGgnLCAnT2JqZWN0JyxcbiAgICAnUHJvbWlzZScsICdSZWdFeHAnLCAnU2V0JywgJ1N0cmluZycsICdTeW1ib2wnLCAnVHlwZUVycm9yJywgJ1VpbnQ4QXJyYXknLFxuICAgICdVaW50OENsYW1wZWRBcnJheScsICdVaW50MTZBcnJheScsICdVaW50MzJBcnJheScsICdXZWFrTWFwJyxcbiAgICAnXycsICdjbGVhclRpbWVvdXQnLCAnaXNGaW5pdGUnLCAncGFyc2VJbnQnLCAnc2V0VGltZW91dCdcbiAgXTtcblxuICAvKiogVXNlZCB0byBtYWtlIHRlbXBsYXRlIHNvdXJjZVVSTHMgZWFzaWVyIHRvIGlkZW50aWZ5LiAqL1xuICB2YXIgdGVtcGxhdGVDb3VudGVyID0gLTE7XG5cbiAgLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgb2YgdHlwZWQgYXJyYXlzLiAqL1xuICB2YXIgdHlwZWRBcnJheVRhZ3MgPSB7fTtcbiAgdHlwZWRBcnJheVRhZ3NbZmxvYXQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1tmbG9hdDY0VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2ludDhUYWddID0gdHlwZWRBcnJheVRhZ3NbaW50MTZUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbaW50MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDhUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbiAgdHlwZWRBcnJheVRhZ3NbYXJnc1RhZ10gPSB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ10gPSB0eXBlZEFycmF5VGFnc1tib29sVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2RhdGFWaWV3VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2RhdGVUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddID0gdHlwZWRBcnJheVRhZ3NbZnVuY1RhZ10gPVxuICB0eXBlZEFycmF5VGFnc1ttYXBUYWddID0gdHlwZWRBcnJheVRhZ3NbbnVtYmVyVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ10gPSB0eXBlZEFycmF5VGFnc1tyZWdleHBUYWddID1cbiAgdHlwZWRBcnJheVRhZ3Nbc2V0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ10gPVxuICB0eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4gIC8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIHN1cHBvcnRlZCBieSBgXy5jbG9uZWAuICovXG4gIHZhciBjbG9uZWFibGVUYWdzID0ge307XG4gIGNsb25lYWJsZVRhZ3NbYXJnc1RhZ10gPSBjbG9uZWFibGVUYWdzW2FycmF5VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRhVmlld1RhZ10gPVxuICBjbG9uZWFibGVUYWdzW2Jvb2xUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRlVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbZmxvYXQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW2Zsb2F0NjRUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbaW50MTZUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tpbnQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW21hcFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW251bWJlclRhZ10gPSBjbG9uZWFibGVUYWdzW29iamVjdFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3JlZ2V4cFRhZ10gPSBjbG9uZWFibGVUYWdzW3NldFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3N0cmluZ1RhZ10gPSBjbG9uZWFibGVUYWdzW3N5bWJvbFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3VpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbdWludDE2VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG4gIGNsb25lYWJsZVRhZ3NbZXJyb3JUYWddID0gY2xvbmVhYmxlVGFnc1tmdW5jVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuICAvKiogVXNlZCB0byBtYXAgTGF0aW4gVW5pY29kZSBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMuICovXG4gIHZhciBkZWJ1cnJlZExldHRlcnMgPSB7XG4gICAgLy8gTGF0aW4tMSBTdXBwbGVtZW50IGJsb2NrLlxuICAgICdcXHhjMCc6ICdBJywgICdcXHhjMSc6ICdBJywgJ1xceGMyJzogJ0EnLCAnXFx4YzMnOiAnQScsICdcXHhjNCc6ICdBJywgJ1xceGM1JzogJ0EnLFxuICAgICdcXHhlMCc6ICdhJywgICdcXHhlMSc6ICdhJywgJ1xceGUyJzogJ2EnLCAnXFx4ZTMnOiAnYScsICdcXHhlNCc6ICdhJywgJ1xceGU1JzogJ2EnLFxuICAgICdcXHhjNyc6ICdDJywgICdcXHhlNyc6ICdjJyxcbiAgICAnXFx4ZDAnOiAnRCcsICAnXFx4ZjAnOiAnZCcsXG4gICAgJ1xceGM4JzogJ0UnLCAgJ1xceGM5JzogJ0UnLCAnXFx4Y2EnOiAnRScsICdcXHhjYic6ICdFJyxcbiAgICAnXFx4ZTgnOiAnZScsICAnXFx4ZTknOiAnZScsICdcXHhlYSc6ICdlJywgJ1xceGViJzogJ2UnLFxuICAgICdcXHhjYyc6ICdJJywgICdcXHhjZCc6ICdJJywgJ1xceGNlJzogJ0knLCAnXFx4Y2YnOiAnSScsXG4gICAgJ1xceGVjJzogJ2knLCAgJ1xceGVkJzogJ2knLCAnXFx4ZWUnOiAnaScsICdcXHhlZic6ICdpJyxcbiAgICAnXFx4ZDEnOiAnTicsICAnXFx4ZjEnOiAnbicsXG4gICAgJ1xceGQyJzogJ08nLCAgJ1xceGQzJzogJ08nLCAnXFx4ZDQnOiAnTycsICdcXHhkNSc6ICdPJywgJ1xceGQ2JzogJ08nLCAnXFx4ZDgnOiAnTycsXG4gICAgJ1xceGYyJzogJ28nLCAgJ1xceGYzJzogJ28nLCAnXFx4ZjQnOiAnbycsICdcXHhmNSc6ICdvJywgJ1xceGY2JzogJ28nLCAnXFx4ZjgnOiAnbycsXG4gICAgJ1xceGQ5JzogJ1UnLCAgJ1xceGRhJzogJ1UnLCAnXFx4ZGInOiAnVScsICdcXHhkYyc6ICdVJyxcbiAgICAnXFx4ZjknOiAndScsICAnXFx4ZmEnOiAndScsICdcXHhmYic6ICd1JywgJ1xceGZjJzogJ3UnLFxuICAgICdcXHhkZCc6ICdZJywgICdcXHhmZCc6ICd5JywgJ1xceGZmJzogJ3knLFxuICAgICdcXHhjNic6ICdBZScsICdcXHhlNic6ICdhZScsXG4gICAgJ1xceGRlJzogJ1RoJywgJ1xceGZlJzogJ3RoJyxcbiAgICAnXFx4ZGYnOiAnc3MnLFxuICAgIC8vIExhdGluIEV4dGVuZGVkLUEgYmxvY2suXG4gICAgJ1xcdTAxMDAnOiAnQScsICAnXFx1MDEwMic6ICdBJywgJ1xcdTAxMDQnOiAnQScsXG4gICAgJ1xcdTAxMDEnOiAnYScsICAnXFx1MDEwMyc6ICdhJywgJ1xcdTAxMDUnOiAnYScsXG4gICAgJ1xcdTAxMDYnOiAnQycsICAnXFx1MDEwOCc6ICdDJywgJ1xcdTAxMGEnOiAnQycsICdcXHUwMTBjJzogJ0MnLFxuICAgICdcXHUwMTA3JzogJ2MnLCAgJ1xcdTAxMDknOiAnYycsICdcXHUwMTBiJzogJ2MnLCAnXFx1MDEwZCc6ICdjJyxcbiAgICAnXFx1MDEwZSc6ICdEJywgICdcXHUwMTEwJzogJ0QnLCAnXFx1MDEwZic6ICdkJywgJ1xcdTAxMTEnOiAnZCcsXG4gICAgJ1xcdTAxMTInOiAnRScsICAnXFx1MDExNCc6ICdFJywgJ1xcdTAxMTYnOiAnRScsICdcXHUwMTE4JzogJ0UnLCAnXFx1MDExYSc6ICdFJyxcbiAgICAnXFx1MDExMyc6ICdlJywgICdcXHUwMTE1JzogJ2UnLCAnXFx1MDExNyc6ICdlJywgJ1xcdTAxMTknOiAnZScsICdcXHUwMTFiJzogJ2UnLFxuICAgICdcXHUwMTFjJzogJ0cnLCAgJ1xcdTAxMWUnOiAnRycsICdcXHUwMTIwJzogJ0cnLCAnXFx1MDEyMic6ICdHJyxcbiAgICAnXFx1MDExZCc6ICdnJywgICdcXHUwMTFmJzogJ2cnLCAnXFx1MDEyMSc6ICdnJywgJ1xcdTAxMjMnOiAnZycsXG4gICAgJ1xcdTAxMjQnOiAnSCcsICAnXFx1MDEyNic6ICdIJywgJ1xcdTAxMjUnOiAnaCcsICdcXHUwMTI3JzogJ2gnLFxuICAgICdcXHUwMTI4JzogJ0knLCAgJ1xcdTAxMmEnOiAnSScsICdcXHUwMTJjJzogJ0knLCAnXFx1MDEyZSc6ICdJJywgJ1xcdTAxMzAnOiAnSScsXG4gICAgJ1xcdTAxMjknOiAnaScsICAnXFx1MDEyYic6ICdpJywgJ1xcdTAxMmQnOiAnaScsICdcXHUwMTJmJzogJ2knLCAnXFx1MDEzMSc6ICdpJyxcbiAgICAnXFx1MDEzNCc6ICdKJywgICdcXHUwMTM1JzogJ2onLFxuICAgICdcXHUwMTM2JzogJ0snLCAgJ1xcdTAxMzcnOiAnaycsICdcXHUwMTM4JzogJ2snLFxuICAgICdcXHUwMTM5JzogJ0wnLCAgJ1xcdTAxM2InOiAnTCcsICdcXHUwMTNkJzogJ0wnLCAnXFx1MDEzZic6ICdMJywgJ1xcdTAxNDEnOiAnTCcsXG4gICAgJ1xcdTAxM2EnOiAnbCcsICAnXFx1MDEzYyc6ICdsJywgJ1xcdTAxM2UnOiAnbCcsICdcXHUwMTQwJzogJ2wnLCAnXFx1MDE0Mic6ICdsJyxcbiAgICAnXFx1MDE0Myc6ICdOJywgICdcXHUwMTQ1JzogJ04nLCAnXFx1MDE0Nyc6ICdOJywgJ1xcdTAxNGEnOiAnTicsXG4gICAgJ1xcdTAxNDQnOiAnbicsICAnXFx1MDE0Nic6ICduJywgJ1xcdTAxNDgnOiAnbicsICdcXHUwMTRiJzogJ24nLFxuICAgICdcXHUwMTRjJzogJ08nLCAgJ1xcdTAxNGUnOiAnTycsICdcXHUwMTUwJzogJ08nLFxuICAgICdcXHUwMTRkJzogJ28nLCAgJ1xcdTAxNGYnOiAnbycsICdcXHUwMTUxJzogJ28nLFxuICAgICdcXHUwMTU0JzogJ1InLCAgJ1xcdTAxNTYnOiAnUicsICdcXHUwMTU4JzogJ1InLFxuICAgICdcXHUwMTU1JzogJ3InLCAgJ1xcdTAxNTcnOiAncicsICdcXHUwMTU5JzogJ3InLFxuICAgICdcXHUwMTVhJzogJ1MnLCAgJ1xcdTAxNWMnOiAnUycsICdcXHUwMTVlJzogJ1MnLCAnXFx1MDE2MCc6ICdTJyxcbiAgICAnXFx1MDE1Yic6ICdzJywgICdcXHUwMTVkJzogJ3MnLCAnXFx1MDE1Zic6ICdzJywgJ1xcdTAxNjEnOiAncycsXG4gICAgJ1xcdTAxNjInOiAnVCcsICAnXFx1MDE2NCc6ICdUJywgJ1xcdTAxNjYnOiAnVCcsXG4gICAgJ1xcdTAxNjMnOiAndCcsICAnXFx1MDE2NSc6ICd0JywgJ1xcdTAxNjcnOiAndCcsXG4gICAgJ1xcdTAxNjgnOiAnVScsICAnXFx1MDE2YSc6ICdVJywgJ1xcdTAxNmMnOiAnVScsICdcXHUwMTZlJzogJ1UnLCAnXFx1MDE3MCc6ICdVJywgJ1xcdTAxNzInOiAnVScsXG4gICAgJ1xcdTAxNjknOiAndScsICAnXFx1MDE2Yic6ICd1JywgJ1xcdTAxNmQnOiAndScsICdcXHUwMTZmJzogJ3UnLCAnXFx1MDE3MSc6ICd1JywgJ1xcdTAxNzMnOiAndScsXG4gICAgJ1xcdTAxNzQnOiAnVycsICAnXFx1MDE3NSc6ICd3JyxcbiAgICAnXFx1MDE3Nic6ICdZJywgICdcXHUwMTc3JzogJ3knLCAnXFx1MDE3OCc6ICdZJyxcbiAgICAnXFx1MDE3OSc6ICdaJywgICdcXHUwMTdiJzogJ1onLCAnXFx1MDE3ZCc6ICdaJyxcbiAgICAnXFx1MDE3YSc6ICd6JywgICdcXHUwMTdjJzogJ3onLCAnXFx1MDE3ZSc6ICd6JyxcbiAgICAnXFx1MDEzMic6ICdJSicsICdcXHUwMTMzJzogJ2lqJyxcbiAgICAnXFx1MDE1Mic6ICdPZScsICdcXHUwMTUzJzogJ29lJyxcbiAgICAnXFx1MDE0OSc6IFwiJ25cIiwgJ1xcdTAxN2YnOiAncydcbiAgfTtcblxuICAvKiogVXNlZCB0byBtYXAgY2hhcmFjdGVycyB0byBIVE1MIGVudGl0aWVzLiAqL1xuICB2YXIgaHRtbEVzY2FwZXMgPSB7XG4gICAgJyYnOiAnJmFtcDsnLFxuICAgICc8JzogJyZsdDsnLFxuICAgICc+JzogJyZndDsnLFxuICAgICdcIic6ICcmcXVvdDsnLFxuICAgIFwiJ1wiOiAnJiMzOTsnXG4gIH07XG5cbiAgLyoqIFVzZWQgdG8gbWFwIEhUTUwgZW50aXRpZXMgdG8gY2hhcmFjdGVycy4gKi9cbiAgdmFyIGh0bWxVbmVzY2FwZXMgPSB7XG4gICAgJyZhbXA7JzogJyYnLFxuICAgICcmbHQ7JzogJzwnLFxuICAgICcmZ3Q7JzogJz4nLFxuICAgICcmcXVvdDsnOiAnXCInLFxuICAgICcmIzM5Oyc6IFwiJ1wiXG4gIH07XG5cbiAgLyoqIFVzZWQgdG8gZXNjYXBlIGNoYXJhY3RlcnMgZm9yIGluY2x1c2lvbiBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuICovXG4gIHZhciBzdHJpbmdFc2NhcGVzID0ge1xuICAgICdcXFxcJzogJ1xcXFwnLFxuICAgIFwiJ1wiOiBcIidcIixcbiAgICAnXFxuJzogJ24nLFxuICAgICdcXHInOiAncicsXG4gICAgJ1xcdTIwMjgnOiAndTIwMjgnLFxuICAgICdcXHUyMDI5JzogJ3UyMDI5J1xuICB9O1xuXG4gIC8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG4gIHZhciBmcmVlUGFyc2VGbG9hdCA9IHBhcnNlRmxvYXQsXG4gICAgICBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xuICB2YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbiAgdmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbiAgLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG4gIHZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG4gIHZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG4gIHZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbiAgLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbiAgdmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBwcm9jZXNzYCBmcm9tIE5vZGUuanMuICovXG4gIHZhciBmcmVlUHJvY2VzcyA9IG1vZHVsZUV4cG9ydHMgJiYgZnJlZUdsb2JhbC5wcm9jZXNzO1xuXG4gIC8qKiBVc2VkIHRvIGFjY2VzcyBmYXN0ZXIgTm9kZS5qcyBoZWxwZXJzLiAqL1xuICB2YXIgbm9kZVV0aWwgPSAoZnVuY3Rpb24oKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSBgdXRpbC50eXBlc2AgZm9yIE5vZGUuanMgMTArLlxuICAgICAgdmFyIHR5cGVzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlKCd1dGlsJykudHlwZXM7XG5cbiAgICAgIGlmICh0eXBlcykge1xuICAgICAgICByZXR1cm4gdHlwZXM7XG4gICAgICB9XG5cbiAgICAgIC8vIExlZ2FjeSBgcHJvY2Vzcy5iaW5kaW5nKCd1dGlsJylgIGZvciBOb2RlLmpzIDwgMTAuXG4gICAgICByZXR1cm4gZnJlZVByb2Nlc3MgJiYgZnJlZVByb2Nlc3MuYmluZGluZyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nKCd1dGlsJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfSgpKTtcblxuICAvKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xuICB2YXIgbm9kZUlzQXJyYXlCdWZmZXIgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc0FycmF5QnVmZmVyLFxuICAgICAgbm9kZUlzRGF0ZSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzRGF0ZSxcbiAgICAgIG5vZGVJc01hcCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzTWFwLFxuICAgICAgbm9kZUlzUmVnRXhwID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNSZWdFeHAsXG4gICAgICBub2RlSXNTZXQgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1NldCxcbiAgICAgIG5vZGVJc1R5cGVkQXJyYXkgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1R5cGVkQXJyYXk7XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgLyoqXG4gICAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAgICogd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgYHRoaXNBcmdgIGFuZCB0aGUgYXJndW1lbnRzIG9mIGBhcmdzYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICAgKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuXG4gICAqL1xuICBmdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcpO1xuICAgICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgICAgY2FzZSAyOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgY2FzZSAzOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIH1cbiAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VBZ2dyZWdhdG9yYCBmb3IgYXJyYXlzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCBhZ2dyZWdhdGVkIG9iamVjdC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUFnZ3JlZ2F0b3IoYXJyYXksIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgIHNldHRlcihhY2N1bXVsYXRvciwgdmFsdWUsIGl0ZXJhdGVlKHZhbHVlKSwgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZvckVhY2hgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoUmlnaHRgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlFYWNoUmlnaHQoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBpZiAoaXRlcmF0ZWUoYXJyYXlbbGVuZ3RoXSwgbGVuZ3RoLCBhcnJheSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmV2ZXJ5YCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAqICBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUV2ZXJ5KGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKCFwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZpbHRlcmAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlGaWx0ZXIoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmNsdWRlc2AgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIHNwZWNpZnlpbmcgYW4gaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksIHZhbHVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgIHJldHVybiAhIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIDApID4gLTE7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhcnJheUluY2x1ZGVzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGEgY29tcGFyYXRvci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUluY2x1ZGVzV2l0aChhcnJheSwgdmFsdWUsIGNvbXBhcmF0b3IpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGNvbXBhcmF0b3IodmFsdWUsIGFycmF5W2luZGV4XSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWFwYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAgICogc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIHRoZSBlbGVtZW50cyBvZiBgdmFsdWVzYCB0byBgYXJyYXlgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhcHBlbmQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LCB2YWx1ZXMpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgICAgb2Zmc2V0ID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGFycmF5W29mZnNldCArIGluZGV4XSA9IHZhbHVlc1tpbmRleF07XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luaXRBY2N1bV0gU3BlY2lmeSB1c2luZyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgIGFzXG4gICAqICB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbKytpbmRleF07XG4gICAgfVxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gICAgfVxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlUmlnaHRgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaW5pdEFjY3VtXSBTcGVjaWZ5IHVzaW5nIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YCBhc1xuICAgKiAgdGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5UmVkdWNlUmlnaHQoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgIGlmIChpbml0QWNjdW0gJiYgbGVuZ3RoKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGFycmF5Wy0tbGVuZ3RoXTtcbiAgICB9XG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtsZW5ndGhdLCBsZW5ndGgsIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zb21lYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAgICogc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlTb21lKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIGFuIEFTQ0lJIGBzdHJpbmdgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgaW5zcGVjdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gICAqL1xuICB2YXIgYXNjaWlTaXplID0gYmFzZVByb3BlcnR5KCdsZW5ndGgnKTtcblxuICAvKipcbiAgICogQ29udmVydHMgYW4gQVNDSUkgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGFzY2lpVG9BcnJheShzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLnNwbGl0KCcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdHMgYW4gQVNDSUkgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd29yZHMgb2YgYHN0cmluZ2AuXG4gICAqL1xuICBmdW5jdGlvbiBhc2NpaVdvcmRzKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVBc2NpaVdvcmQpIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5maW5kS2V5YCBhbmQgYF8uZmluZExhc3RLZXlgLFxuICAgKiB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYGNvbGxlY3Rpb25gXG4gICAqIHVzaW5nIGBlYWNoRnVuY2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGBjb2xsZWN0aW9uYC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZvdW5kIGVsZW1lbnQgb3IgaXRzIGtleSwgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VGaW5kS2V5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZWFjaEZ1bmMpIHtcbiAgICB2YXIgcmVzdWx0O1xuICAgIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGtleSwgY29sbGVjdGlvbikpIHtcbiAgICAgICAgcmVzdWx0ID0ga2V5O1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maW5kSW5kZXhgIGFuZCBgXy5maW5kTGFzdEluZGV4YCB3aXRob3V0XG4gICAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgsIGZyb21SaWdodCkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gZnJvbUluZGV4ICsgKGZyb21SaWdodCA/IDEgOiAtMSk7XG5cbiAgICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5kZXhPZmAgd2l0aG91dCBgZnJvbUluZGV4YCBib3VuZHMgY2hlY2tzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVcbiAgICAgID8gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleClcbiAgICAgIDogYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUlzTmFOLCBmcm9tSW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYmFzZUluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VJbmRleE9mV2l0aChhcnJheSwgdmFsdWUsIGZyb21JbmRleCwgY29tcGFyYXRvcikge1xuICAgIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoY29tcGFyYXRvcihhcnJheVtpbmRleF0sIHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hTmAgd2l0aG91dCBzdXBwb3J0IGZvciBudW1iZXIgb2JqZWN0cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1lYW5gIGFuZCBgXy5tZWFuQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbWVhbi5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VNZWFuKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICByZXR1cm4gbGVuZ3RoID8gKGJhc2VTdW0oYXJyYXksIGl0ZXJhdGVlKSAvIGxlbmd0aCkgOiBOQU47XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHJvcGVydHlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVByb3BlcnR5KGtleSkge1xuICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHJvcGVydHlPZmAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVByb3BlcnR5T2Yob2JqZWN0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZWR1Y2VgIGFuZCBgXy5yZWR1Y2VSaWdodGAsIHdpdGhvdXQgc3VwcG9ydFxuICAgKiBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgY29sbGVjdGlvbmAgdXNpbmcgYGVhY2hGdW5jYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0geyp9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluaXRBY2N1bSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBvciBsYXN0IGVsZW1lbnQgb2ZcbiAgICogIGBjb2xsZWN0aW9uYCBhcyB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBgY29sbGVjdGlvbmAuXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VSZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGVhY2hGdW5jKSB7XG4gICAgZWFjaEZ1bmMoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGluaXRBY2N1bVxuICAgICAgICA/IChpbml0QWNjdW0gPSBmYWxzZSwgdmFsdWUpXG4gICAgICAgIDogaXRlcmF0ZWUoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvcnRCeWAgd2hpY2ggdXNlcyBgY29tcGFyZXJgIHRvIGRlZmluZSB0aGVcbiAgICogc29ydCBvcmRlciBvZiBgYXJyYXlgIGFuZCByZXBsYWNlcyBjcml0ZXJpYSBvYmplY3RzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZ1xuICAgKiB2YWx1ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzb3J0LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJlciBUaGUgZnVuY3Rpb24gdG8gZGVmaW5lIHNvcnQgb3JkZXIuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVNvcnRCeShhcnJheSwgY29tcGFyZXIpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgYXJyYXkuc29ydChjb21wYXJlcik7XG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBhcnJheVtsZW5ndGhdID0gYXJyYXlbbGVuZ3RoXS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnN1bWAgYW5kIGBfLnN1bUJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN1bS5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VTdW0oYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIHJlc3VsdCxcbiAgICAgICAgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdKTtcbiAgICAgIGlmIChjdXJyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBjdXJyZW50IDogKHJlc3VsdCArIGN1cnJlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRpbWVzYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHNcbiAgICogb3IgbWF4IGFycmF5IGxlbmd0aCBjaGVja3MuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShuKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1BhaXJzYCBhbmQgYF8udG9QYWlyc0luYCB3aGljaCBjcmVhdGVzIGFuIGFycmF5XG4gICAqIG9mIGtleS12YWx1ZSBwYWlycyBmb3IgYG9iamVjdGAgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYHByb3BzYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VUb1BhaXJzKG9iamVjdCwgcHJvcHMpIHtcbiAgICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIFtrZXksIG9iamVjdFtrZXldXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50cmltYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVRyaW0oc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZ1xuICAgICAgPyBzdHJpbmcuc2xpY2UoMCwgdHJpbW1lZEVuZEluZGV4KHN0cmluZykgKyAxKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJylcbiAgICAgIDogc3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xuICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGZ1bmModmFsdWUpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udmFsdWVzYCBhbmQgYF8udmFsdWVzSW5gIHdoaWNoIGNyZWF0ZXMgYW5cbiAgICogYXJyYXkgb2YgYG9iamVjdGAgcHJvcGVydHkgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3BlcnR5IG5hbWVzXG4gICAqIG9mIGBwcm9wc2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCwgcHJvcHMpIHtcbiAgICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdFtrZXldO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGBjYWNoZWAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIFRoZSBjYWNoZSB0byBxdWVyeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLCBrZXkpIHtcbiAgICByZXR1cm4gY2FjaGUuaGFzKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbVN0YXJ0YCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBzdHJpbmcgc3ltYm9sXG4gICAqIHRoYXQgaXMgbm90IGZvdW5kIGluIHRoZSBjaGFyYWN0ZXIgc3ltYm9scy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gc3RyU3ltYm9scyBUaGUgc3RyaW5nIHN5bWJvbHMgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtBcnJheX0gY2hyU3ltYm9scyBUaGUgY2hhcmFjdGVyIHN5bWJvbHMgdG8gZmluZC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHVubWF0Y2hlZCBzdHJpbmcgc3ltYm9sLlxuICAgKi9cbiAgZnVuY3Rpb24gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gc3RyU3ltYm9scy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCAmJiBiYXNlSW5kZXhPZihjaHJTeW1ib2xzLCBzdHJTeW1ib2xzW2luZGV4XSwgMCkgPiAtMSkge31cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbUVuZGAgdG8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzdHJpbmcgc3ltYm9sXG4gICAqIHRoYXQgaXMgbm90IGZvdW5kIGluIHRoZSBjaGFyYWN0ZXIgc3ltYm9scy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gc3RyU3ltYm9scyBUaGUgc3RyaW5nIHN5bWJvbHMgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtBcnJheX0gY2hyU3ltYm9scyBUaGUgY2hhcmFjdGVyIHN5bWJvbHMgdG8gZmluZC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgdW5tYXRjaGVkIHN0cmluZyBzeW1ib2wuXG4gICAqL1xuICBmdW5jdGlvbiBjaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpIHtcbiAgICB2YXIgaW5kZXggPSBzdHJTeW1ib2xzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpbmRleC0tICYmIGJhc2VJbmRleE9mKGNoclN5bWJvbHMsIHN0clN5bWJvbHNbaW5kZXhdLCAwKSA+IC0xKSB7fVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgYHBsYWNlaG9sZGVyYCBvY2N1cnJlbmNlcyBpbiBgYXJyYXlgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdG8gc2VhcmNoIGZvci5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcGxhY2Vob2xkZXIgY291bnQuXG4gICAqL1xuICBmdW5jdGlvbiBjb3VudEhvbGRlcnMoYXJyYXksIHBsYWNlaG9sZGVyKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzdWx0ID0gMDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgaWYgKGFycmF5W2xlbmd0aF0gPT09IHBsYWNlaG9sZGVyKSB7XG4gICAgICAgICsrcmVzdWx0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8uZGVidXJyYCB0byBjb252ZXJ0IExhdGluLTEgU3VwcGxlbWVudCBhbmQgTGF0aW4gRXh0ZW5kZWQtQVxuICAgKiBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsZXR0ZXIgVGhlIG1hdGNoZWQgbGV0dGVyIHRvIGRlYnVyci5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZGVidXJyZWQgbGV0dGVyLlxuICAgKi9cbiAgdmFyIGRlYnVyckxldHRlciA9IGJhc2VQcm9wZXJ0eU9mKGRlYnVycmVkTGV0dGVycyk7XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8uZXNjYXBlYCB0byBjb252ZXJ0IGNoYXJhY3RlcnMgdG8gSFRNTCBlbnRpdGllcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gZXNjYXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIHZhciBlc2NhcGVIdG1sQ2hhciA9IGJhc2VQcm9wZXJ0eU9mKGh0bWxFc2NhcGVzKTtcblxuICAvKipcbiAgICogVXNlZCBieSBgXy50ZW1wbGF0ZWAgdG8gZXNjYXBlIGNoYXJhY3RlcnMgZm9yIGluY2x1c2lvbiBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaHIgVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIGVzY2FwZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAqL1xuICBmdW5jdGlvbiBlc2NhcGVTdHJpbmdDaGFyKGNocikge1xuICAgIHJldHVybiAnXFxcXCcgKyBzdHJpbmdFc2NhcGVzW2Nocl07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LCBrZXkpIHtcbiAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYHN0cmluZ2AgY29udGFpbnMgVW5pY29kZSBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgc3ltYm9sIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBoYXNVbmljb2RlKHN0cmluZykge1xuICAgIHJldHVybiByZUhhc1VuaWNvZGUudGVzdChzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBhIHdvcmQgY29tcG9zZWQgb2YgVW5pY29kZSBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgd29yZCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gaGFzVW5pY29kZVdvcmQoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHJlSGFzVW5pY29kZVdvcmQudGVzdChzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBpdGVyYXRvcmAgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVyYXRvciBUaGUgaXRlcmF0b3IgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBpdGVyYXRvclRvQXJyYXkoaXRlcmF0b3IpIHtcbiAgICB2YXIgZGF0YSxcbiAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICB3aGlsZSAoIShkYXRhID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICByZXN1bHQucHVzaChkYXRhLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBgbWFwYCB0byBpdHMga2V5LXZhbHVlIHBhaXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAqL1xuICBmdW5jdGlvbiBtYXBUb0FycmF5KG1hcCkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShtYXAuc2l6ZSk7XG5cbiAgICBtYXAuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZXN1bHRbKytpbmRleF0gPSBba2V5LCB2YWx1ZV07XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgYHBsYWNlaG9sZGVyYCBlbGVtZW50cyBpbiBgYXJyYXlgIHdpdGggYW4gaW50ZXJuYWwgcGxhY2Vob2xkZXJcbiAgICogYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdGhlaXIgaW5kZXhlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdG8gcmVwbGFjZS5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICovXG4gIGZ1bmN0aW9uIHJlcGxhY2VIb2xkZXJzKGFycmF5LCBwbGFjZWhvbGRlcikge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgaWYgKHZhbHVlID09PSBwbGFjZWhvbGRlciB8fCB2YWx1ZSA9PT0gUExBQ0VIT0xERVIpIHtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gUExBQ0VIT0xERVI7XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzZXRgIHRvIGFuIGFycmF5IG9mIGl0cyB2YWx1ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzZXQgVGhlIHNldCB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHZhbHVlcy5cbiAgICovXG4gIGZ1bmN0aW9uIHNldFRvQXJyYXkoc2V0KSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICAgIHNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXN1bHRbKytpbmRleF0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzZXRgIHRvIGl0cyB2YWx1ZS12YWx1ZSBwYWlycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IHNldCBUaGUgc2V0IHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWUtdmFsdWUgcGFpcnMuXG4gICAqL1xuICBmdW5jdGlvbiBzZXRUb1BhaXJzKHNldCkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShzZXQuc2l6ZSk7XG5cbiAgICBzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmVzdWx0WysraW5kZXhdID0gW3ZhbHVlLCB2YWx1ZV07XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5kZXhPZmAgd2hpY2ggcGVyZm9ybXMgc3RyaWN0IGVxdWFsaXR5XG4gICAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubGFzdEluZGV4T2ZgIHdoaWNoIHBlcmZvcm1zIHN0cmljdCBlcXVhbGl0eVxuICAgKiBjb21wYXJpc29ucyBvZiB2YWx1ZXMsIGkuZS4gYD09PWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmljdExhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgdmFyIGluZGV4ID0gZnJvbUluZGV4ICsgMTtcbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gYHN0cmluZ2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ1NpemUoc3RyaW5nKSB7XG4gICAgcmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKVxuICAgICAgPyB1bmljb2RlU2l6ZShzdHJpbmcpXG4gICAgICA6IGFzY2lpU2l6ZShzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBzdHJpbmdUb0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBoYXNVbmljb2RlKHN0cmluZylcbiAgICAgID8gdW5pY29kZVRvQXJyYXkoc3RyaW5nKVxuICAgICAgOiBhc2NpaVRvQXJyYXkoc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltRW5kYCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlXG4gICAqIGNoYXJhY3RlciBvZiBgc3RyaW5nYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlci5cbiAgICovXG4gIGZ1bmN0aW9uIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpIHtcbiAgICB2YXIgaW5kZXggPSBzdHJpbmcubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGluZGV4LS0gJiYgcmVXaGl0ZXNwYWNlLnRlc3Qoc3RyaW5nLmNoYXJBdChpbmRleCkpKSB7fVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnVuZXNjYXBlYCB0byBjb252ZXJ0IEhUTUwgZW50aXRpZXMgdG8gY2hhcmFjdGVycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gdW5lc2NhcGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAqL1xuICB2YXIgdW5lc2NhcGVIdG1sQ2hhciA9IGJhc2VQcm9wZXJ0eU9mKGh0bWxVbmVzY2FwZXMpO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIGEgVW5pY29kZSBgc3RyaW5nYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLlxuICAgKi9cbiAgZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKSB7XG4gICAgdmFyIHJlc3VsdCA9IHJlVW5pY29kZS5sYXN0SW5kZXggPSAwO1xuICAgIHdoaWxlIChyZVVuaWNvZGUudGVzdChzdHJpbmcpKSB7XG4gICAgICArK3Jlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIFVuaWNvZGUgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIHVuaWNvZGVUb0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlKSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdHMgYSBVbmljb2RlIGBzdHJpbmdgIGludG8gYW4gYXJyYXkgb2YgaXRzIHdvcmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICAgKi9cbiAgZnVuY3Rpb24gdW5pY29kZVdvcmRzKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlV29yZCkgfHwgW107XG4gIH1cblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHByaXN0aW5lIGBsb2Rhc2hgIGZ1bmN0aW9uIHVzaW5nIHRoZSBgY29udGV4dGAgb2JqZWN0LlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEBtZW1iZXJPZiBfXG4gICAqIEBzaW5jZSAxLjEuMFxuICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgKiBAcGFyYW0ge09iamVjdH0gW2NvbnRleHQ9cm9vdF0gVGhlIGNvbnRleHQgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYSBuZXcgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIF8ubWl4aW4oeyAnZm9vJzogXy5jb25zdGFudCgnZm9vJykgfSk7XG4gICAqXG4gICAqIHZhciBsb2Rhc2ggPSBfLnJ1bkluQ29udGV4dCgpO1xuICAgKiBsb2Rhc2gubWl4aW4oeyAnYmFyJzogbG9kYXNoLmNvbnN0YW50KCdiYXInKSB9KTtcbiAgICpcbiAgICogXy5pc0Z1bmN0aW9uKF8uZm9vKTtcbiAgICogLy8gPT4gdHJ1ZVxuICAgKiBfLmlzRnVuY3Rpb24oXy5iYXIpO1xuICAgKiAvLyA9PiBmYWxzZVxuICAgKlxuICAgKiBsb2Rhc2guaXNGdW5jdGlvbihsb2Rhc2guZm9vKTtcbiAgICogLy8gPT4gZmFsc2VcbiAgICogbG9kYXNoLmlzRnVuY3Rpb24obG9kYXNoLmJhcik7XG4gICAqIC8vID0+IHRydWVcbiAgICpcbiAgICogLy8gQ3JlYXRlIGEgc3VwZWQtdXAgYGRlZmVyYCBpbiBOb2RlLmpzLlxuICAgKiB2YXIgZGVmZXIgPSBfLnJ1bkluQ29udGV4dCh7ICdzZXRUaW1lb3V0Jzogc2V0SW1tZWRpYXRlIH0pLmRlZmVyO1xuICAgKi9cbiAgdmFyIHJ1bkluQ29udGV4dCA9IChmdW5jdGlvbiBydW5JbkNvbnRleHQoY29udGV4dCkge1xuICAgIGNvbnRleHQgPSBjb250ZXh0ID09IG51bGwgPyByb290IDogXy5kZWZhdWx0cyhyb290Lk9iamVjdCgpLCBjb250ZXh0LCBfLnBpY2socm9vdCwgY29udGV4dFByb3BzKSk7XG5cbiAgICAvKiogQnVpbHQtaW4gY29uc3RydWN0b3IgcmVmZXJlbmNlcy4gKi9cbiAgICB2YXIgQXJyYXkgPSBjb250ZXh0LkFycmF5LFxuICAgICAgICBEYXRlID0gY29udGV4dC5EYXRlLFxuICAgICAgICBFcnJvciA9IGNvbnRleHQuRXJyb3IsXG4gICAgICAgIEZ1bmN0aW9uID0gY29udGV4dC5GdW5jdGlvbixcbiAgICAgICAgTWF0aCA9IGNvbnRleHQuTWF0aCxcbiAgICAgICAgT2JqZWN0ID0gY29udGV4dC5PYmplY3QsXG4gICAgICAgIFJlZ0V4cCA9IGNvbnRleHQuUmVnRXhwLFxuICAgICAgICBTdHJpbmcgPSBjb250ZXh0LlN0cmluZyxcbiAgICAgICAgVHlwZUVycm9yID0gY29udGV4dC5UeXBlRXJyb3I7XG5cbiAgICAvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG4gICAgdmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGUsXG4gICAgICAgIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICAgICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4gICAgLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xuICAgIHZhciBjb3JlSnNEYXRhID0gY29udGV4dFsnX19jb3JlLWpzX3NoYXJlZF9fJ107XG5cbiAgICAvKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG4gICAgdmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuICAgIC8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xuICAgIHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4gICAgLyoqIFVzZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIElEcy4gKi9cbiAgICB2YXIgaWRDb3VudGVyID0gMDtcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBtZXRob2RzIG1hc3F1ZXJhZGluZyBhcyBuYXRpdmUuICovXG4gICAgdmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgJycpO1xuICAgICAgcmV0dXJuIHVpZCA/ICgnU3ltYm9sKHNyYylfMS4nICsgdWlkKSA6ICcnO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gICAgICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gICAgICogb2YgdmFsdWVzLlxuICAgICAqL1xuICAgIHZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4gICAgLyoqIFVzZWQgdG8gaW5mZXIgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLiAqL1xuICAgIHZhciBvYmplY3RDdG9yU3RyaW5nID0gZnVuY1RvU3RyaW5nLmNhbGwoT2JqZWN0KTtcblxuICAgIC8qKiBVc2VkIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGBfYCByZWZlcmVuY2UgaW4gYF8ubm9Db25mbGljdGAuICovXG4gICAgdmFyIG9sZERhc2ggPSByb290Ll87XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xuICAgIHZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArXG4gICAgICBmdW5jVG9TdHJpbmcuY2FsbChoYXNPd25Qcm9wZXJ0eSkucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAgICAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4gICAgKTtcblxuICAgIC8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xuICAgIHZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gY29udGV4dC5CdWZmZXIgOiB1bmRlZmluZWQsXG4gICAgICAgIFN5bWJvbCA9IGNvbnRleHQuU3ltYm9sLFxuICAgICAgICBVaW50OEFycmF5ID0gY29udGV4dC5VaW50OEFycmF5LFxuICAgICAgICBhbGxvY1Vuc2FmZSA9IEJ1ZmZlciA/IEJ1ZmZlci5hbGxvY1Vuc2FmZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCksXG4gICAgICAgIG9iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGUsXG4gICAgICAgIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGUsXG4gICAgICAgIHNwbGljZSA9IGFycmF5UHJvdG8uc3BsaWNlLFxuICAgICAgICBzcHJlYWRhYmxlU3ltYm9sID0gU3ltYm9sID8gU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltSXRlcmF0b3IgPSBTeW1ib2wgPyBTeW1ib2wuaXRlcmF0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4gICAgdmFyIGRlZmluZVByb3BlcnR5ID0gKGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIGZ1bmMgPSBnZXROYXRpdmUoT2JqZWN0LCAnZGVmaW5lUHJvcGVydHknKTtcbiAgICAgICAgZnVuYyh7fSwgJycsIHt9KTtcbiAgICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH0oKSk7XG5cbiAgICAvKiogTW9ja2VkIGJ1aWx0LWlucy4gKi9cbiAgICB2YXIgY3R4Q2xlYXJUaW1lb3V0ID0gY29udGV4dC5jbGVhclRpbWVvdXQgIT09IHJvb3QuY2xlYXJUaW1lb3V0ICYmIGNvbnRleHQuY2xlYXJUaW1lb3V0LFxuICAgICAgICBjdHhOb3cgPSBEYXRlICYmIERhdGUubm93ICE9PSByb290LkRhdGUubm93ICYmIERhdGUubm93LFxuICAgICAgICBjdHhTZXRUaW1lb3V0ID0gY29udGV4dC5zZXRUaW1lb3V0ICE9PSByb290LnNldFRpbWVvdXQgJiYgY29udGV4dC5zZXRUaW1lb3V0O1xuXG4gICAgLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xuICAgIHZhciBuYXRpdmVDZWlsID0gTWF0aC5jZWlsLFxuICAgICAgICBuYXRpdmVGbG9vciA9IE1hdGguZmxvb3IsXG4gICAgICAgIG5hdGl2ZUdldFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLFxuICAgICAgICBuYXRpdmVJc0J1ZmZlciA9IEJ1ZmZlciA/IEJ1ZmZlci5pc0J1ZmZlciA6IHVuZGVmaW5lZCxcbiAgICAgICAgbmF0aXZlSXNGaW5pdGUgPSBjb250ZXh0LmlzRmluaXRlLFxuICAgICAgICBuYXRpdmVKb2luID0gYXJyYXlQcm90by5qb2luLFxuICAgICAgICBuYXRpdmVLZXlzID0gb3ZlckFyZyhPYmplY3Qua2V5cywgT2JqZWN0KSxcbiAgICAgICAgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluLFxuICAgICAgICBuYXRpdmVOb3cgPSBEYXRlLm5vdyxcbiAgICAgICAgbmF0aXZlUGFyc2VJbnQgPSBjb250ZXh0LnBhcnNlSW50LFxuICAgICAgICBuYXRpdmVSYW5kb20gPSBNYXRoLnJhbmRvbSxcbiAgICAgICAgbmF0aXZlUmV2ZXJzZSA9IGFycmF5UHJvdG8ucmV2ZXJzZTtcblxuICAgIC8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbiAgICB2YXIgRGF0YVZpZXcgPSBnZXROYXRpdmUoY29udGV4dCwgJ0RhdGFWaWV3JyksXG4gICAgICAgIE1hcCA9IGdldE5hdGl2ZShjb250ZXh0LCAnTWFwJyksXG4gICAgICAgIFByb21pc2UgPSBnZXROYXRpdmUoY29udGV4dCwgJ1Byb21pc2UnKSxcbiAgICAgICAgU2V0ID0gZ2V0TmF0aXZlKGNvbnRleHQsICdTZXQnKSxcbiAgICAgICAgV2Vha01hcCA9IGdldE5hdGl2ZShjb250ZXh0LCAnV2Vha01hcCcpLFxuICAgICAgICBuYXRpdmVDcmVhdGUgPSBnZXROYXRpdmUoT2JqZWN0LCAnY3JlYXRlJyk7XG5cbiAgICAvKiogVXNlZCB0byBzdG9yZSBmdW5jdGlvbiBtZXRhZGF0YS4gKi9cbiAgICB2YXIgbWV0YU1hcCA9IFdlYWtNYXAgJiYgbmV3IFdlYWtNYXA7XG5cbiAgICAvKiogVXNlZCB0byBsb29rdXAgdW5taW5pZmllZCBmdW5jdGlvbiBuYW1lcy4gKi9cbiAgICB2YXIgcmVhbE5hbWVzID0ge307XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3QgbWFwcywgc2V0cywgYW5kIHdlYWttYXBzLiAqL1xuICAgIHZhciBkYXRhVmlld0N0b3JTdHJpbmcgPSB0b1NvdXJjZShEYXRhVmlldyksXG4gICAgICAgIG1hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShNYXApLFxuICAgICAgICBwcm9taXNlQ3RvclN0cmluZyA9IHRvU291cmNlKFByb21pc2UpLFxuICAgICAgICBzZXRDdG9yU3RyaW5nID0gdG9Tb3VyY2UoU2V0KSxcbiAgICAgICAgd2Vha01hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShXZWFrTWFwKTtcblxuICAgIC8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xuICAgIHZhciBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by50b1N0cmluZyA6IHVuZGVmaW5lZDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCBvYmplY3Qgd2hpY2ggd3JhcHMgYHZhbHVlYCB0byBlbmFibGUgaW1wbGljaXQgbWV0aG9kXG4gICAgICogY2hhaW4gc2VxdWVuY2VzLiBNZXRob2RzIHRoYXQgb3BlcmF0ZSBvbiBhbmQgcmV0dXJuIGFycmF5cywgY29sbGVjdGlvbnMsXG4gICAgICogYW5kIGZ1bmN0aW9ucyBjYW4gYmUgY2hhaW5lZCB0b2dldGhlci4gTWV0aG9kcyB0aGF0IHJldHJpZXZlIGEgc2luZ2xlIHZhbHVlXG4gICAgICogb3IgbWF5IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZSB3aWxsIGF1dG9tYXRpY2FsbHkgZW5kIHRoZSBjaGFpbiBzZXF1ZW5jZVxuICAgICAqIGFuZCByZXR1cm4gdGhlIHVud3JhcHBlZCB2YWx1ZS4gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgbXVzdCBiZSB1bndyYXBwZWRcbiAgICAgKiB3aXRoIGBfI3ZhbHVlYC5cbiAgICAgKlxuICAgICAqIEV4cGxpY2l0IGNoYWluIHNlcXVlbmNlcywgd2hpY2ggbXVzdCBiZSB1bndyYXBwZWQgd2l0aCBgXyN2YWx1ZWAsIG1heSBiZVxuICAgICAqIGVuYWJsZWQgdXNpbmcgYF8uY2hhaW5gLlxuICAgICAqXG4gICAgICogVGhlIGV4ZWN1dGlvbiBvZiBjaGFpbmVkIG1ldGhvZHMgaXMgbGF6eSwgdGhhdCBpcywgaXQncyBkZWZlcnJlZCB1bnRpbFxuICAgICAqIGBfI3ZhbHVlYCBpcyBpbXBsaWNpdGx5IG9yIGV4cGxpY2l0bHkgY2FsbGVkLlxuICAgICAqXG4gICAgICogTGF6eSBldmFsdWF0aW9uIGFsbG93cyBzZXZlcmFsIG1ldGhvZHMgdG8gc3VwcG9ydCBzaG9ydGN1dCBmdXNpb24uXG4gICAgICogU2hvcnRjdXQgZnVzaW9uIGlzIGFuIG9wdGltaXphdGlvbiB0byBtZXJnZSBpdGVyYXRlZSBjYWxsczsgdGhpcyBhdm9pZHNcbiAgICAgKiB0aGUgY3JlYXRpb24gb2YgaW50ZXJtZWRpYXRlIGFycmF5cyBhbmQgY2FuIGdyZWF0bHkgcmVkdWNlIHRoZSBudW1iZXIgb2ZcbiAgICAgKiBpdGVyYXRlZSBleGVjdXRpb25zLiBTZWN0aW9ucyBvZiBhIGNoYWluIHNlcXVlbmNlIHF1YWxpZnkgZm9yIHNob3J0Y3V0XG4gICAgICogZnVzaW9uIGlmIHRoZSBzZWN0aW9uIGlzIGFwcGxpZWQgdG8gYW4gYXJyYXkgYW5kIGl0ZXJhdGVlcyBhY2NlcHQgb25seVxuICAgICAqIG9uZSBhcmd1bWVudC4gVGhlIGhldXJpc3RpYyBmb3Igd2hldGhlciBhIHNlY3Rpb24gcXVhbGlmaWVzIGZvciBzaG9ydGN1dFxuICAgICAqIGZ1c2lvbiBpcyBzdWJqZWN0IHRvIGNoYW5nZS5cbiAgICAgKlxuICAgICAqIENoYWluaW5nIGlzIHN1cHBvcnRlZCBpbiBjdXN0b20gYnVpbGRzIGFzIGxvbmcgYXMgdGhlIGBfI3ZhbHVlYCBtZXRob2QgaXNcbiAgICAgKiBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluY2x1ZGVkIGluIHRoZSBidWlsZC5cbiAgICAgKlxuICAgICAqIEluIGFkZGl0aW9uIHRvIGxvZGFzaCBtZXRob2RzLCB3cmFwcGVycyBoYXZlIGBBcnJheWAgYW5kIGBTdHJpbmdgIG1ldGhvZHMuXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBgQXJyYXlgIG1ldGhvZHMgYXJlOlxuICAgICAqIGBjb25jYXRgLCBgam9pbmAsIGBwb3BgLCBgcHVzaGAsIGBzaGlmdGAsIGBzb3J0YCwgYHNwbGljZWAsIGFuZCBgdW5zaGlmdGBcbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIGBTdHJpbmdgIG1ldGhvZHMgYXJlOlxuICAgICAqIGByZXBsYWNlYCBhbmQgYHNwbGl0YFxuICAgICAqXG4gICAgICogVGhlIHdyYXBwZXIgbWV0aG9kcyB0aGF0IHN1cHBvcnQgc2hvcnRjdXQgZnVzaW9uIGFyZTpcbiAgICAgKiBgYXRgLCBgY29tcGFjdGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsIGBkcm9wV2hpbGVgLCBgZmlsdGVyYCwgYGZpbmRgLFxuICAgICAqIGBmaW5kTGFzdGAsIGBoZWFkYCwgYGluaXRpYWxgLCBgbGFzdGAsIGBtYXBgLCBgcmVqZWN0YCwgYHJldmVyc2VgLCBgc2xpY2VgLFxuICAgICAqIGB0YWlsYCwgYHRha2VgLCBgdGFrZVJpZ2h0YCwgYHRha2VSaWdodFdoaWxlYCwgYHRha2VXaGlsZWAsIGFuZCBgdG9BcnJheWBcbiAgICAgKlxuICAgICAqIFRoZSBjaGFpbmFibGUgd3JhcHBlciBtZXRob2RzIGFyZTpcbiAgICAgKiBgYWZ0ZXJgLCBgYXJ5YCwgYGFzc2lnbmAsIGBhc3NpZ25JbmAsIGBhc3NpZ25JbldpdGhgLCBgYXNzaWduV2l0aGAsIGBhdGAsXG4gICAgICogYGJlZm9yZWAsIGBiaW5kYCwgYGJpbmRBbGxgLCBgYmluZEtleWAsIGBjYXN0QXJyYXlgLCBgY2hhaW5gLCBgY2h1bmtgLFxuICAgICAqIGBjb21taXRgLCBgY29tcGFjdGAsIGBjb25jYXRgLCBgY29uZm9ybXNgLCBgY29uc3RhbnRgLCBgY291bnRCeWAsIGBjcmVhdGVgLFxuICAgICAqIGBjdXJyeWAsIGBkZWJvdW5jZWAsIGBkZWZhdWx0c2AsIGBkZWZhdWx0c0RlZXBgLCBgZGVmZXJgLCBgZGVsYXlgLFxuICAgICAqIGBkaWZmZXJlbmNlYCwgYGRpZmZlcmVuY2VCeWAsIGBkaWZmZXJlbmNlV2l0aGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsXG4gICAgICogYGRyb3BSaWdodFdoaWxlYCwgYGRyb3BXaGlsZWAsIGBleHRlbmRgLCBgZXh0ZW5kV2l0aGAsIGBmaWxsYCwgYGZpbHRlcmAsXG4gICAgICogYGZsYXRNYXBgLCBgZmxhdE1hcERlZXBgLCBgZmxhdE1hcERlcHRoYCwgYGZsYXR0ZW5gLCBgZmxhdHRlbkRlZXBgLFxuICAgICAqIGBmbGF0dGVuRGVwdGhgLCBgZmxpcGAsIGBmbG93YCwgYGZsb3dSaWdodGAsIGBmcm9tUGFpcnNgLCBgZnVuY3Rpb25zYCxcbiAgICAgKiBgZnVuY3Rpb25zSW5gLCBgZ3JvdXBCeWAsIGBpbml0aWFsYCwgYGludGVyc2VjdGlvbmAsIGBpbnRlcnNlY3Rpb25CeWAsXG4gICAgICogYGludGVyc2VjdGlvbldpdGhgLCBgaW52ZXJ0YCwgYGludmVydEJ5YCwgYGludm9rZU1hcGAsIGBpdGVyYXRlZWAsIGBrZXlCeWAsXG4gICAgICogYGtleXNgLCBga2V5c0luYCwgYG1hcGAsIGBtYXBLZXlzYCwgYG1hcFZhbHVlc2AsIGBtYXRjaGVzYCwgYG1hdGNoZXNQcm9wZXJ0eWAsXG4gICAgICogYG1lbW9pemVgLCBgbWVyZ2VgLCBgbWVyZ2VXaXRoYCwgYG1ldGhvZGAsIGBtZXRob2RPZmAsIGBtaXhpbmAsIGBuZWdhdGVgLFxuICAgICAqIGBudGhBcmdgLCBgb21pdGAsIGBvbWl0QnlgLCBgb25jZWAsIGBvcmRlckJ5YCwgYG92ZXJgLCBgb3ZlckFyZ3NgLFxuICAgICAqIGBvdmVyRXZlcnlgLCBgb3ZlclNvbWVgLCBgcGFydGlhbGAsIGBwYXJ0aWFsUmlnaHRgLCBgcGFydGl0aW9uYCwgYHBpY2tgLFxuICAgICAqIGBwaWNrQnlgLCBgcGxhbnRgLCBgcHJvcGVydHlgLCBgcHJvcGVydHlPZmAsIGBwdWxsYCwgYHB1bGxBbGxgLCBgcHVsbEFsbEJ5YCxcbiAgICAgKiBgcHVsbEFsbFdpdGhgLCBgcHVsbEF0YCwgYHB1c2hgLCBgcmFuZ2VgLCBgcmFuZ2VSaWdodGAsIGByZWFyZ2AsIGByZWplY3RgLFxuICAgICAqIGByZW1vdmVgLCBgcmVzdGAsIGByZXZlcnNlYCwgYHNhbXBsZVNpemVgLCBgc2V0YCwgYHNldFdpdGhgLCBgc2h1ZmZsZWAsXG4gICAgICogYHNsaWNlYCwgYHNvcnRgLCBgc29ydEJ5YCwgYHNwbGljZWAsIGBzcHJlYWRgLCBgdGFpbGAsIGB0YWtlYCwgYHRha2VSaWdodGAsXG4gICAgICogYHRha2VSaWdodFdoaWxlYCwgYHRha2VXaGlsZWAsIGB0YXBgLCBgdGhyb3R0bGVgLCBgdGhydWAsIGB0b0FycmF5YCxcbiAgICAgKiBgdG9QYWlyc2AsIGB0b1BhaXJzSW5gLCBgdG9QYXRoYCwgYHRvUGxhaW5PYmplY3RgLCBgdHJhbnNmb3JtYCwgYHVuYXJ5YCxcbiAgICAgKiBgdW5pb25gLCBgdW5pb25CeWAsIGB1bmlvbldpdGhgLCBgdW5pcWAsIGB1bmlxQnlgLCBgdW5pcVdpdGhgLCBgdW5zZXRgLFxuICAgICAqIGB1bnNoaWZ0YCwgYHVuemlwYCwgYHVuemlwV2l0aGAsIGB1cGRhdGVgLCBgdXBkYXRlV2l0aGAsIGB2YWx1ZXNgLFxuICAgICAqIGB2YWx1ZXNJbmAsIGB3aXRob3V0YCwgYHdyYXBgLCBgeG9yYCwgYHhvckJ5YCwgYHhvcldpdGhgLCBgemlwYCxcbiAgICAgKiBgemlwT2JqZWN0YCwgYHppcE9iamVjdERlZXBgLCBhbmQgYHppcFdpdGhgXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBtZXRob2RzIHRoYXQgYXJlICoqbm90KiogY2hhaW5hYmxlIGJ5IGRlZmF1bHQgYXJlOlxuICAgICAqIGBhZGRgLCBgYXR0ZW1wdGAsIGBjYW1lbENhc2VgLCBgY2FwaXRhbGl6ZWAsIGBjZWlsYCwgYGNsYW1wYCwgYGNsb25lYCxcbiAgICAgKiBgY2xvbmVEZWVwYCwgYGNsb25lRGVlcFdpdGhgLCBgY2xvbmVXaXRoYCwgYGNvbmZvcm1zVG9gLCBgZGVidXJyYCxcbiAgICAgKiBgZGVmYXVsdFRvYCwgYGRpdmlkZWAsIGBlYWNoYCwgYGVhY2hSaWdodGAsIGBlbmRzV2l0aGAsIGBlcWAsIGBlc2NhcGVgLFxuICAgICAqIGBlc2NhcGVSZWdFeHBgLCBgZXZlcnlgLCBgZmluZGAsIGBmaW5kSW5kZXhgLCBgZmluZEtleWAsIGBmaW5kTGFzdGAsXG4gICAgICogYGZpbmRMYXN0SW5kZXhgLCBgZmluZExhc3RLZXlgLCBgZmlyc3RgLCBgZmxvb3JgLCBgZm9yRWFjaGAsIGBmb3JFYWNoUmlnaHRgLFxuICAgICAqIGBmb3JJbmAsIGBmb3JJblJpZ2h0YCwgYGZvck93bmAsIGBmb3JPd25SaWdodGAsIGBnZXRgLCBgZ3RgLCBgZ3RlYCwgYGhhc2AsXG4gICAgICogYGhhc0luYCwgYGhlYWRgLCBgaWRlbnRpdHlgLCBgaW5jbHVkZXNgLCBgaW5kZXhPZmAsIGBpblJhbmdlYCwgYGludm9rZWAsXG4gICAgICogYGlzQXJndW1lbnRzYCwgYGlzQXJyYXlgLCBgaXNBcnJheUJ1ZmZlcmAsIGBpc0FycmF5TGlrZWAsIGBpc0FycmF5TGlrZU9iamVjdGAsXG4gICAgICogYGlzQm9vbGVhbmAsIGBpc0J1ZmZlcmAsIGBpc0RhdGVgLCBgaXNFbGVtZW50YCwgYGlzRW1wdHlgLCBgaXNFcXVhbGAsXG4gICAgICogYGlzRXF1YWxXaXRoYCwgYGlzRXJyb3JgLCBgaXNGaW5pdGVgLCBgaXNGdW5jdGlvbmAsIGBpc0ludGVnZXJgLCBgaXNMZW5ndGhgLFxuICAgICAqIGBpc01hcGAsIGBpc01hdGNoYCwgYGlzTWF0Y2hXaXRoYCwgYGlzTmFOYCwgYGlzTmF0aXZlYCwgYGlzTmlsYCwgYGlzTnVsbGAsXG4gICAgICogYGlzTnVtYmVyYCwgYGlzT2JqZWN0YCwgYGlzT2JqZWN0TGlrZWAsIGBpc1BsYWluT2JqZWN0YCwgYGlzUmVnRXhwYCxcbiAgICAgKiBgaXNTYWZlSW50ZWdlcmAsIGBpc1NldGAsIGBpc1N0cmluZ2AsIGBpc1VuZGVmaW5lZGAsIGBpc1R5cGVkQXJyYXlgLFxuICAgICAqIGBpc1dlYWtNYXBgLCBgaXNXZWFrU2V0YCwgYGpvaW5gLCBga2ViYWJDYXNlYCwgYGxhc3RgLCBgbGFzdEluZGV4T2ZgLFxuICAgICAqIGBsb3dlckNhc2VgLCBgbG93ZXJGaXJzdGAsIGBsdGAsIGBsdGVgLCBgbWF4YCwgYG1heEJ5YCwgYG1lYW5gLCBgbWVhbkJ5YCxcbiAgICAgKiBgbWluYCwgYG1pbkJ5YCwgYG11bHRpcGx5YCwgYG5vQ29uZmxpY3RgLCBgbm9vcGAsIGBub3dgLCBgbnRoYCwgYHBhZGAsXG4gICAgICogYHBhZEVuZGAsIGBwYWRTdGFydGAsIGBwYXJzZUludGAsIGBwb3BgLCBgcmFuZG9tYCwgYHJlZHVjZWAsIGByZWR1Y2VSaWdodGAsXG4gICAgICogYHJlcGVhdGAsIGByZXN1bHRgLCBgcm91bmRgLCBgcnVuSW5Db250ZXh0YCwgYHNhbXBsZWAsIGBzaGlmdGAsIGBzaXplYCxcbiAgICAgKiBgc25ha2VDYXNlYCwgYHNvbWVgLCBgc29ydGVkSW5kZXhgLCBgc29ydGVkSW5kZXhCeWAsIGBzb3J0ZWRMYXN0SW5kZXhgLFxuICAgICAqIGBzb3J0ZWRMYXN0SW5kZXhCeWAsIGBzdGFydENhc2VgLCBgc3RhcnRzV2l0aGAsIGBzdHViQXJyYXlgLCBgc3R1YkZhbHNlYCxcbiAgICAgKiBgc3R1Yk9iamVjdGAsIGBzdHViU3RyaW5nYCwgYHN0dWJUcnVlYCwgYHN1YnRyYWN0YCwgYHN1bWAsIGBzdW1CeWAsXG4gICAgICogYHRlbXBsYXRlYCwgYHRpbWVzYCwgYHRvRmluaXRlYCwgYHRvSW50ZWdlcmAsIGB0b0pTT05gLCBgdG9MZW5ndGhgLFxuICAgICAqIGB0b0xvd2VyYCwgYHRvTnVtYmVyYCwgYHRvU2FmZUludGVnZXJgLCBgdG9TdHJpbmdgLCBgdG9VcHBlcmAsIGB0cmltYCxcbiAgICAgKiBgdHJpbUVuZGAsIGB0cmltU3RhcnRgLCBgdHJ1bmNhdGVgLCBgdW5lc2NhcGVgLCBgdW5pcXVlSWRgLCBgdXBwZXJDYXNlYCxcbiAgICAgKiBgdXBwZXJGaXJzdGAsIGB2YWx1ZWAsIGFuZCBgd29yZHNgXG4gICAgICpcbiAgICAgKiBAbmFtZSBfXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAgaW4gYSBgbG9kYXNoYCBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDIsIDNdKTtcbiAgICAgKlxuICAgICAqIC8vIFJldHVybnMgYW4gdW53cmFwcGVkIHZhbHVlLlxuICAgICAqIHdyYXBwZWQucmVkdWNlKF8uYWRkKTtcbiAgICAgKiAvLyA9PiA2XG4gICAgICpcbiAgICAgKiAvLyBSZXR1cm5zIGEgd3JhcHBlZCB2YWx1ZS5cbiAgICAgKiB2YXIgc3F1YXJlcyA9IHdyYXBwZWQubWFwKHNxdWFyZSk7XG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoc3F1YXJlcyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShzcXVhcmVzLnZhbHVlKCkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsb2Rhc2godmFsdWUpIHtcbiAgICAgIGlmIChpc09iamVjdExpa2UodmFsdWUpICYmICFpc0FycmF5KHZhbHVlKSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExvZGFzaFdyYXBwZXIpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdfX3dyYXBwZWRfXycpKSB7XG4gICAgICAgICAgcmV0dXJuIHdyYXBwZXJDbG9uZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY3JlYXRlYCB3aXRob3V0IHN1cHBvcnQgZm9yIGFzc2lnbmluZ1xuICAgICAqIHByb3BlcnRpZXMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvdG8gVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUNyZWF0ZSA9IChmdW5jdGlvbigpIHtcbiAgICAgIGZ1bmN0aW9uIG9iamVjdCgpIHt9XG4gICAgICByZXR1cm4gZnVuY3Rpb24ocHJvdG8pIHtcbiAgICAgICAgaWYgKCFpc09iamVjdChwcm90bykpIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9iamVjdENyZWF0ZSkge1xuICAgICAgICAgIHJldHVybiBvYmplY3RDcmVhdGUocHJvdG8pO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdC5wcm90b3R5cGUgPSBwcm90bztcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBvYmplY3Q7XG4gICAgICAgIG9iamVjdC5wcm90b3R5cGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVuY3Rpb24gd2hvc2UgcHJvdG90eXBlIGNoYWluIHNlcXVlbmNlIHdyYXBwZXJzIGluaGVyaXQgZnJvbS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUxvZGFzaCgpIHtcbiAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWQuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIGBsb2Rhc2hgIHdyYXBwZXIgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjaGFpbkFsbF0gRW5hYmxlIGV4cGxpY2l0IG1ldGhvZCBjaGFpbiBzZXF1ZW5jZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gTG9kYXNoV3JhcHBlcih2YWx1ZSwgY2hhaW5BbGwpIHtcbiAgICAgIHRoaXMuX193cmFwcGVkX18gPSB2YWx1ZTtcbiAgICAgIHRoaXMuX19hY3Rpb25zX18gPSBbXTtcbiAgICAgIHRoaXMuX19jaGFpbl9fID0gISFjaGFpbkFsbDtcbiAgICAgIHRoaXMuX19pbmRleF9fID0gMDtcbiAgICAgIHRoaXMuX192YWx1ZXNfXyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgdGVtcGxhdGUgZGVsaW1pdGVycyB1c2VkIGJ5IGxvZGFzaCBhcmUgbGlrZSB0aG9zZSBpblxuICAgICAqIGVtYmVkZGVkIFJ1YnkgKEVSQikgYXMgd2VsbCBhcyBFUzIwMTUgdGVtcGxhdGUgc3RyaW5ncy4gQ2hhbmdlIHRoZVxuICAgICAqIGZvbGxvd2luZyB0ZW1wbGF0ZSBzZXR0aW5ncyB0byB1c2UgYWx0ZXJuYXRpdmUgZGVsaW1pdGVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICovXG4gICAgbG9kYXNoLnRlbXBsYXRlU2V0dGluZ3MgPSB7XG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgYGRhdGFgIHByb3BlcnR5IHZhbHVlcyB0byBiZSBIVE1MLWVzY2FwZWQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge1JlZ0V4cH1cbiAgICAgICAqL1xuICAgICAgJ2VzY2FwZSc6IHJlRXNjYXBlLFxuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGNvZGUgdG8gYmUgZXZhbHVhdGVkLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtSZWdFeHB9XG4gICAgICAgKi9cbiAgICAgICdldmFsdWF0ZSc6IHJlRXZhbHVhdGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgYGRhdGFgIHByb3BlcnR5IHZhbHVlcyB0byBpbmplY3QuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge1JlZ0V4cH1cbiAgICAgICAqL1xuICAgICAgJ2ludGVycG9sYXRlJzogcmVJbnRlcnBvbGF0ZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIHJlZmVyZW5jZSB0aGUgZGF0YSBvYmplY3QgaW4gdGhlIHRlbXBsYXRlIHRleHQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAqL1xuICAgICAgJ3ZhcmlhYmxlJzogJycsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBpbXBvcnQgdmFyaWFibGVzIGludG8gdGhlIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgKi9cbiAgICAgICdpbXBvcnRzJzoge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3MuaW1wb3J0c1xuICAgICAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICAgICAqL1xuICAgICAgICAnXyc6IGxvZGFzaFxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBFbnN1cmUgd3JhcHBlcnMgYXJlIGluc3RhbmNlcyBvZiBgYmFzZUxvZGFzaGAuXG4gICAgbG9kYXNoLnByb3RvdHlwZSA9IGJhc2VMb2Rhc2gucHJvdG90eXBlO1xuICAgIGxvZGFzaC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBsb2Rhc2g7XG5cbiAgICBMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZSA9IGJhc2VDcmVhdGUoYmFzZUxvZGFzaC5wcm90b3R5cGUpO1xuICAgIExvZGFzaFdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTG9kYXNoV3JhcHBlcjtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBsYXp5IHdyYXBwZXIgb2JqZWN0IHdoaWNoIHdyYXBzIGB2YWx1ZWAgdG8gZW5hYmxlIGxhenkgZXZhbHVhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMYXp5V3JhcHBlcih2YWx1ZSkge1xuICAgICAgdGhpcy5fX3dyYXBwZWRfXyA9IHZhbHVlO1xuICAgICAgdGhpcy5fX2FjdGlvbnNfXyA9IFtdO1xuICAgICAgdGhpcy5fX2Rpcl9fID0gMTtcbiAgICAgIHRoaXMuX19maWx0ZXJlZF9fID0gZmFsc2U7XG4gICAgICB0aGlzLl9faXRlcmF0ZWVzX18gPSBbXTtcbiAgICAgIHRoaXMuX190YWtlQ291bnRfXyA9IE1BWF9BUlJBWV9MRU5HVEg7XG4gICAgICB0aGlzLl9fdmlld3NfXyA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgbGF6eSB3cmFwcGVyIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xvbmVcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgYExhenlXcmFwcGVyYCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eUNsb25lKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMYXp5V3JhcHBlcih0aGlzLl9fd3JhcHBlZF9fKTtcbiAgICAgIHJlc3VsdC5fX2FjdGlvbnNfXyA9IGNvcHlBcnJheSh0aGlzLl9fYWN0aW9uc19fKTtcbiAgICAgIHJlc3VsdC5fX2Rpcl9fID0gdGhpcy5fX2Rpcl9fO1xuICAgICAgcmVzdWx0Ll9fZmlsdGVyZWRfXyA9IHRoaXMuX19maWx0ZXJlZF9fO1xuICAgICAgcmVzdWx0Ll9faXRlcmF0ZWVzX18gPSBjb3B5QXJyYXkodGhpcy5fX2l0ZXJhdGVlc19fKTtcbiAgICAgIHJlc3VsdC5fX3Rha2VDb3VudF9fID0gdGhpcy5fX3Rha2VDb3VudF9fO1xuICAgICAgcmVzdWx0Ll9fdmlld3NfXyA9IGNvcHlBcnJheSh0aGlzLl9fdmlld3NfXyk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2VzIHRoZSBkaXJlY3Rpb24gb2YgbGF6eSBpdGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHJldmVyc2VcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgcmV2ZXJzZWQgYExhenlXcmFwcGVyYCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eVJldmVyc2UoKSB7XG4gICAgICBpZiAodGhpcy5fX2ZpbHRlcmVkX18pIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMYXp5V3JhcHBlcih0aGlzKTtcbiAgICAgICAgcmVzdWx0Ll9fZGlyX18gPSAtMTtcbiAgICAgICAgcmVzdWx0Ll9fZmlsdGVyZWRfXyA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHJlc3VsdC5fX2Rpcl9fICo9IC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyB0aGUgdW53cmFwcGVkIHZhbHVlIGZyb20gaXRzIGxhenkgd3JhcHBlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgdmFsdWVcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhenlWYWx1ZSgpIHtcbiAgICAgIHZhciBhcnJheSA9IHRoaXMuX193cmFwcGVkX18udmFsdWUoKSxcbiAgICAgICAgICBkaXIgPSB0aGlzLl9fZGlyX18sXG4gICAgICAgICAgaXNBcnIgPSBpc0FycmF5KGFycmF5KSxcbiAgICAgICAgICBpc1JpZ2h0ID0gZGlyIDwgMCxcbiAgICAgICAgICBhcnJMZW5ndGggPSBpc0FyciA/IGFycmF5Lmxlbmd0aCA6IDAsXG4gICAgICAgICAgdmlldyA9IGdldFZpZXcoMCwgYXJyTGVuZ3RoLCB0aGlzLl9fdmlld3NfXyksXG4gICAgICAgICAgc3RhcnQgPSB2aWV3LnN0YXJ0LFxuICAgICAgICAgIGVuZCA9IHZpZXcuZW5kLFxuICAgICAgICAgIGxlbmd0aCA9IGVuZCAtIHN0YXJ0LFxuICAgICAgICAgIGluZGV4ID0gaXNSaWdodCA/IGVuZCA6IChzdGFydCAtIDEpLFxuICAgICAgICAgIGl0ZXJhdGVlcyA9IHRoaXMuX19pdGVyYXRlZXNfXyxcbiAgICAgICAgICBpdGVyTGVuZ3RoID0gaXRlcmF0ZWVzLmxlbmd0aCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgdGFrZUNvdW50ID0gbmF0aXZlTWluKGxlbmd0aCwgdGhpcy5fX3Rha2VDb3VudF9fKTtcblxuICAgICAgaWYgKCFpc0FyciB8fCAoIWlzUmlnaHQgJiYgYXJyTGVuZ3RoID09IGxlbmd0aCAmJiB0YWtlQ291bnQgPT0gbGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZShhcnJheSwgdGhpcy5fX2FjdGlvbnNfXyk7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKGxlbmd0aC0tICYmIHJlc0luZGV4IDwgdGFrZUNvdW50KSB7XG4gICAgICAgIGluZGV4ICs9IGRpcjtcblxuICAgICAgICB2YXIgaXRlckluZGV4ID0gLTEsXG4gICAgICAgICAgICB2YWx1ZSA9IGFycmF5W2luZGV4XTtcblxuICAgICAgICB3aGlsZSAoKytpdGVySW5kZXggPCBpdGVyTGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGRhdGEgPSBpdGVyYXRlZXNbaXRlckluZGV4XSxcbiAgICAgICAgICAgICAgaXRlcmF0ZWUgPSBkYXRhLml0ZXJhdGVlLFxuICAgICAgICAgICAgICB0eXBlID0gZGF0YS50eXBlLFxuICAgICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgICAgIGlmICh0eXBlID09IExBWllfTUFQX0ZMQUcpIHtcbiAgICAgICAgICAgIHZhbHVlID0gY29tcHV0ZWQ7XG4gICAgICAgICAgfSBlbHNlIGlmICghY29tcHV0ZWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlID09IExBWllfRklMVEVSX0ZMQUcpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBgTGF6eVdyYXBwZXJgIGlzIGFuIGluc3RhbmNlIG9mIGBiYXNlTG9kYXNoYC5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUgPSBiYXNlQ3JlYXRlKGJhc2VMb2Rhc2gucHJvdG90eXBlKTtcbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMYXp5V3JhcHBlcjtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBoYXNoIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gSGFzaChlbnRyaWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIEhhc2hcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gICAgICB0aGlzLl9fZGF0YV9fID0gbmF0aXZlQ3JlYXRlID8gbmF0aXZlQ3JlYXRlKG51bGwpIDoge307XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBoYXNoLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBkZWxldGVcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBoYXNoIFRoZSBoYXNoIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0aGlzLmhhcyhrZXkpICYmIGRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV07XG4gICAgICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGhhc2ggdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoR2V0KGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgaWYgKG5hdGl2ZUNyZWF0ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gZGF0YVtrZXldO1xuICAgICAgICByZXR1cm4gcmVzdWx0ID09PSBIQVNIX1VOREVGSU5FRCA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkgPyBkYXRhW2tleV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgaGFzaCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoSGFzKGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaGFzaCBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBoYXNoIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgdGhpcy5zaXplICs9IHRoaXMuaGFzKGtleSkgPyAwIDogMTtcbiAgICAgIGRhdGFba2V5XSA9IChuYXRpdmVDcmVhdGUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuICAgIEhhc2gucHJvdG90eXBlLmNsZWFyID0gaGFzaENsZWFyO1xuICAgIEhhc2gucHJvdG90eXBlWydkZWxldGUnXSA9IGhhc2hEZWxldGU7XG4gICAgSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDtcbiAgICBIYXNoLnByb3RvdHlwZS5oYXMgPSBoYXNoSGFzO1xuICAgIEhhc2gucHJvdG90eXBlLnNldCA9IGhhc2hTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGxpc3QgY2FjaGUgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMaXN0Q2FjaGUoZW50cmllcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbGVhclxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpIHtcbiAgICAgIHRoaXMuX19kYXRhX18gPSBbXTtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlRGVsZXRlKGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIGxhc3RJbmRleCA9IGRhdGEubGVuZ3RoIC0gMTtcbiAgICAgIGlmIChpbmRleCA9PSBsYXN0SW5kZXgpIHtcbiAgICAgICAgZGF0YS5wb3AoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwbGljZS5jYWxsKGRhdGEsIGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICAgIC0tdGhpcy5zaXplO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGdldFxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgICAgIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleSkge1xuICAgICAgcmV0dXJuIGFzc29jSW5kZXhPZih0aGlzLl9fZGF0YV9fLCBrZXkpID4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbGlzdCBjYWNoZSBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGxpc3QgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICsrdGhpcy5zaXplO1xuICAgICAgICBkYXRhLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGFbaW5kZXhdWzFdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTGlzdENhY2hlYC5cbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gbGlzdENhY2hlQ2xlYXI7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBsaXN0Q2FjaGVEZWxldGU7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5nZXQgPSBsaXN0Q2FjaGVHZXQ7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5oYXMgPSBsaXN0Q2FjaGVIYXM7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbWFwIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbGVhclxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKSB7XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgICAgdGhpcy5fX2RhdGFfXyA9IHtcbiAgICAgICAgJ2hhc2gnOiBuZXcgSGFzaCxcbiAgICAgICAgJ21hcCc6IG5ldyAoTWFwIHx8IExpc3RDYWNoZSksXG4gICAgICAgICdzdHJpbmcnOiBuZXcgSGFzaFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBkZWxldGVcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpWydkZWxldGUnXShrZXkpO1xuICAgICAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBtYXAgdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmdldChrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIG1hcCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmhhcyhrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbWFwIGNhY2hlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLFxuICAgICAgICAgIHNpemUgPSBkYXRhLnNpemU7XG5cbiAgICAgIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgdGhpcy5zaXplICs9IGRhdGEuc2l6ZSA9PSBzaXplID8gMCA6IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTWFwQ2FjaGVgLlxuICAgIE1hcENhY2hlLnByb3RvdHlwZS5jbGVhciA9IG1hcENhY2hlQ2xlYXI7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IG1hcENhY2hlRGVsZXRlO1xuICAgIE1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBDYWNoZUdldDtcbiAgICBNYXBDYWNoZS5wcm90b3R5cGUuaGFzID0gbWFwQ2FjaGVIYXM7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlLnNldCA9IG1hcENhY2hlU2V0O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IGNhY2hlIG9iamVjdCB0byBzdG9yZSB1bmlxdWUgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFNldENhY2hlKHZhbHVlcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gdmFsdWVzID09IG51bGwgPyAwIDogdmFsdWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYWRkKHZhbHVlc1tpbmRleF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYHZhbHVlYCB0byB0aGUgYXJyYXkgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGFkZFxuICAgICAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICAgICAqIEBhbGlhcyBwdXNoXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcbiAgICAgIHRoaXMuX19kYXRhX18uc2V0KHZhbHVlLCBIQVNIX1VOREVGSU5FRCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiB0aGUgYXJyYXkgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldENhY2hlSGFzKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBTZXRDYWNoZWAuXG4gICAgU2V0Q2FjaGUucHJvdG90eXBlLmFkZCA9IFNldENhY2hlLnByb3RvdHlwZS5wdXNoID0gc2V0Q2FjaGVBZGQ7XG4gICAgU2V0Q2FjaGUucHJvdG90eXBlLmhhcyA9IHNldENhY2hlSGFzO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHN0YWNrIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFN0YWNrKGVudHJpZXMpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoZW50cmllcyk7XG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tDbGVhcigpIHtcbiAgICAgIHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlO1xuICAgICAgdGhpcy5zaXplID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBTdGFja1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFja0RlbGV0ZShrZXkpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgICAgICByZXN1bHQgPSBkYXRhWydkZWxldGUnXShrZXkpO1xuXG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHN0YWNrIHZhbHVlIGZvciBga2V5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZ2V0XG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrR2V0KGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgc3RhY2sgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrSGFzKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RhY2sgYGtleWAgdG8gYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgc2V0XG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHN0YWNrIGNhY2hlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgTGlzdENhY2hlKSB7XG4gICAgICAgIHZhciBwYWlycyA9IGRhdGEuX19kYXRhX187XG4gICAgICAgIGlmICghTWFwIHx8IChwYWlycy5sZW5ndGggPCBMQVJHRV9BUlJBWV9TSVpFIC0gMSkpIHtcbiAgICAgICAgICBwYWlycy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICAgICAgdGhpcy5zaXplID0gKytkYXRhLnNpemU7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGUocGFpcnMpO1xuICAgICAgfVxuICAgICAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgU3RhY2tgLlxuICAgIFN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7XG4gICAgU3RhY2sucHJvdG90eXBlWydkZWxldGUnXSA9IHN0YWNrRGVsZXRlO1xuICAgIFN0YWNrLnByb3RvdHlwZS5nZXQgPSBzdGFja0dldDtcbiAgICBTdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7XG4gICAgU3RhY2sucHJvdG90eXBlLnNldCA9IHN0YWNrU2V0O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiB0aGUgYXJyYXktbGlrZSBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpLFxuICAgICAgICAgIGlzQXJnID0gIWlzQXJyICYmIGlzQXJndW1lbnRzKHZhbHVlKSxcbiAgICAgICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgIWlzQXJnICYmIGlzQnVmZmVyKHZhbHVlKSxcbiAgICAgICAgICBpc1R5cGUgPSAhaXNBcnIgJiYgIWlzQXJnICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHZhbHVlKSxcbiAgICAgICAgICBza2lwSW5kZXhlcyA9IGlzQXJyIHx8IGlzQXJnIHx8IGlzQnVmZiB8fCBpc1R5cGUsXG4gICAgICAgICAgcmVzdWx0ID0gc2tpcEluZGV4ZXMgPyBiYXNlVGltZXModmFsdWUubGVuZ3RoLCBTdHJpbmcpIDogW10sXG4gICAgICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICAgICAhKHNraXBJbmRleGVzICYmIChcbiAgICAgICAgICAgICAgIC8vIFNhZmFyaSA5IGhhcyBlbnVtZXJhYmxlIGBhcmd1bWVudHMubGVuZ3RoYCBpbiBzdHJpY3QgbW9kZS5cbiAgICAgICAgICAgICAgIGtleSA9PSAnbGVuZ3RoJyB8fFxuICAgICAgICAgICAgICAgLy8gTm9kZS5qcyAwLjEwIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIGJ1ZmZlcnMuXG4gICAgICAgICAgICAgICAoaXNCdWZmICYmIChrZXkgPT0gJ29mZnNldCcgfHwga2V5ID09ICdwYXJlbnQnKSkgfHxcbiAgICAgICAgICAgICAgIC8vIFBoYW50b21KUyAyIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIHR5cGVkIGFycmF5cy5cbiAgICAgICAgICAgICAgIChpc1R5cGUgJiYgKGtleSA9PSAnYnVmZmVyJyB8fCBrZXkgPT0gJ2J5dGVMZW5ndGgnIHx8IGtleSA9PSAnYnl0ZU9mZnNldCcpKSB8fFxuICAgICAgICAgICAgICAgLy8gU2tpcCBpbmRleCBwcm9wZXJ0aWVzLlxuICAgICAgICAgICAgICAgaXNJbmRleChrZXksIGxlbmd0aClcbiAgICAgICAgICAgICkpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2FtcGxlYCBmb3IgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheVNhbXBsZShhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBhcnJheVtiYXNlUmFuZG9tKDAsIGxlbmd0aCAtIDEpXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2FtcGxlU2l6ZWAgZm9yIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNhbXBsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheVNhbXBsZVNpemUoYXJyYXksIG4pIHtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZihjb3B5QXJyYXkoYXJyYXkpLCBiYXNlQ2xhbXAobiwgMCwgYXJyYXkubGVuZ3RoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNodWZmbGVgIGZvciBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5U2h1ZmZsZShhcnJheSkge1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKGNvcHlBcnJheShhcnJheSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXNzaWduVmFsdWVgIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgYXNzaWduXG4gICAgICogYHVuZGVmaW5lZGAgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICFlcShvYmplY3Rba2V5XSwgdmFsdWUpKSB8fFxuICAgICAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzc2lnbnMgYHZhbHVlYCB0byBga2V5YCBvZiBgb2JqZWN0YCBpZiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgbm90IGVxdWl2YWxlbnRcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgICAgIGlmICghKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGVxKG9ialZhbHVlLCB2YWx1ZSkpIHx8XG4gICAgICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGBrZXlgIGlzIGZvdW5kIGluIGBhcnJheWAgb2Yga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IGtleSBUaGUga2V5IHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhc3NvY0luZGV4T2YoYXJyYXksIGtleSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBpZiAoZXEoYXJyYXlbbGVuZ3RoXVswXSwga2V5KSkge1xuICAgICAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZ2dyZWdhdGVzIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBvbiBgYWNjdW11bGF0b3JgIHdpdGgga2V5cyB0cmFuc2Zvcm1lZFxuICAgICAqIGJ5IGBpdGVyYXRlZWAgYW5kIHZhbHVlcyBzZXQgYnkgYHNldHRlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBgYWNjdW11bGF0b3JgIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIGFnZ3JlZ2F0ZWQgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgYWNjdW11bGF0b3JgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBZ2dyZWdhdG9yKGNvbGxlY3Rpb24sIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHNldHRlcihhY2N1bXVsYXRvciwgdmFsdWUsIGl0ZXJhdGVlKHZhbHVlKSwgY29sbGVjdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICAgICAqIG9yIGBjdXN0b21pemVyYCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFzc2lnbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbkluYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXNcbiAgICAgKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ25JbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGFzc2lnblZhbHVlYCBhbmQgYGFzc2lnbk1lcmdlVmFsdWVgIHdpdGhvdXRcbiAgICAgKiB2YWx1ZSBjaGVja3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgICAgIGlmIChrZXkgPT0gJ19fcHJvdG9fXycgJiYgZGVmaW5lUHJvcGVydHkpIHtcbiAgICAgICAgZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHtcbiAgICAgICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICAgICAnZW51bWVyYWJsZSc6IHRydWUsXG4gICAgICAgICAgJ3ZhbHVlJzogdmFsdWUsXG4gICAgICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHBpY2tlZCBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQXQob2JqZWN0LCBwYXRocykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aHMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgICAgc2tpcCA9IG9iamVjdCA9PSBudWxsO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICByZXN1bHRbaW5kZXhdID0gc2tpcCA/IHVuZGVmaW5lZCA6IGdldChvYmplY3QsIHBhdGhzW2luZGV4XSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNsYW1wYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjbGFtcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xvd2VyXSBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjbGFtcGVkIG51bWJlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ2xhbXAobnVtYmVyLCBsb3dlciwgdXBwZXIpIHtcbiAgICAgIGlmIChudW1iZXIgPT09IG51bWJlcikge1xuICAgICAgICBpZiAodXBwZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG51bWJlciA9IG51bWJlciA8PSB1cHBlciA/IG51bWJlciA6IHVwcGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb3dlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbnVtYmVyID0gbnVtYmVyID49IGxvd2VyID8gbnVtYmVyIDogbG93ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudW1iZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xvbmVgIGFuZCBgXy5jbG9uZURlZXBgIHdoaWNoIHRyYWNrc1xuICAgICAqIHRyYXZlcnNlZCBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gICAgICogIDEgLSBEZWVwIGNsb25lXG4gICAgICogIDIgLSBGbGF0dGVuIGluaGVyaXRlZCBwcm9wZXJ0aWVzXG4gICAgICogIDQgLSBDbG9uZSBzeW1ib2xzXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gVGhlIGtleSBvZiBgdmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgcGFyZW50IG9iamVjdCBvZiBgdmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBhbmQgdGhlaXIgY2xvbmUgY291bnRlcnBhcnRzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUNsb25lKHZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIG9iamVjdCwgc3RhY2spIHtcbiAgICAgIHZhciByZXN1bHQsXG4gICAgICAgICAgaXNEZWVwID0gYml0bWFzayAmIENMT05FX0RFRVBfRkxBRyxcbiAgICAgICAgICBpc0ZsYXQgPSBiaXRtYXNrICYgQ0xPTkVfRkxBVF9GTEFHLFxuICAgICAgICAgIGlzRnVsbCA9IGJpdG1hc2sgJiBDTE9ORV9TWU1CT0xTX0ZMQUc7XG5cbiAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgIHJlc3VsdCA9IG9iamVjdCA/IGN1c3RvbWl6ZXIodmFsdWUsIGtleSwgb2JqZWN0LCBzdGFjaykgOiBjdXN0b21pemVyKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSk7XG4gICAgICBpZiAoaXNBcnIpIHtcbiAgICAgICAgcmVzdWx0ID0gaW5pdENsb25lQXJyYXkodmFsdWUpO1xuICAgICAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgICAgIHJldHVybiBjb3B5QXJyYXkodmFsdWUsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpLFxuICAgICAgICAgICAgaXNGdW5jID0gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZztcblxuICAgICAgICBpZiAoaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGNsb25lQnVmZmVyKHZhbHVlLCBpc0RlZXApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWcgPT0gb2JqZWN0VGFnIHx8IHRhZyA9PSBhcmdzVGFnIHx8IChpc0Z1bmMgJiYgIW9iamVjdCkpIHtcbiAgICAgICAgICByZXN1bHQgPSAoaXNGbGF0IHx8IGlzRnVuYykgPyB7fSA6IGluaXRDbG9uZU9iamVjdCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKCFpc0RlZXApIHtcbiAgICAgICAgICAgIHJldHVybiBpc0ZsYXRcbiAgICAgICAgICAgICAgPyBjb3B5U3ltYm9sc0luKHZhbHVlLCBiYXNlQXNzaWduSW4ocmVzdWx0LCB2YWx1ZSkpXG4gICAgICAgICAgICAgIDogY29weVN5bWJvbHModmFsdWUsIGJhc2VBc3NpZ24ocmVzdWx0LCB2YWx1ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIWNsb25lYWJsZVRhZ3NbdGFnXSkge1xuICAgICAgICAgICAgcmV0dXJuIG9iamVjdCA/IHZhbHVlIDoge307XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IGluaXRDbG9uZUJ5VGFnKHZhbHVlLCB0YWcsIGlzRGVlcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm4gaXRzIGNvcnJlc3BvbmRpbmcgY2xvbmUuXG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQodmFsdWUpO1xuICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrZWQ7XG4gICAgICB9XG4gICAgICBzdGFjay5zZXQodmFsdWUsIHJlc3VsdCk7XG5cbiAgICAgIGlmIChpc1NldCh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSkge1xuICAgICAgICAgIHJlc3VsdC5hZGQoYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdWJWYWx1ZSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChpc01hcCh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgICAgICAgcmVzdWx0LnNldChrZXksIGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCB2YWx1ZSwgc3RhY2spKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBrZXlzRnVuYyA9IGlzRnVsbFxuICAgICAgICA/IChpc0ZsYXQgPyBnZXRBbGxLZXlzSW4gOiBnZXRBbGxLZXlzKVxuICAgICAgICA6IChpc0ZsYXQgPyBrZXlzSW4gOiBrZXlzKTtcblxuICAgICAgdmFyIHByb3BzID0gaXNBcnIgPyB1bmRlZmluZWQgOiBrZXlzRnVuYyh2YWx1ZSk7XG4gICAgICBhcnJheUVhY2gocHJvcHMgfHwgdmFsdWUsIGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICAgICAgaWYgKHByb3BzKSB7XG4gICAgICAgICAga2V5ID0gc3ViVmFsdWU7XG4gICAgICAgICAgc3ViVmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHBvcHVsYXRlIGNsb25lIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIGFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY29uZm9ybXNgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNvdXJjZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ29uZm9ybXMoc291cmNlKSB7XG4gICAgICB2YXIgcHJvcHMgPSBrZXlzKHNvdXJjZSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBiYXNlQ29uZm9ybXNUbyhvYmplY3QsIHNvdXJjZSwgcHJvcHMpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jb25mb3Jtc1RvYCB3aGljaCBhY2NlcHRzIGBwcm9wc2AgdG8gY2hlY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGNvbmZvcm1zLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UsIHByb3BzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAhbGVuZ3RoO1xuICAgICAgfVxuICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGtleSA9IHByb3BzW2xlbmd0aF0sXG4gICAgICAgICAgICBwcmVkaWNhdGUgPSBzb3VyY2Vba2V5XSxcbiAgICAgICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICAgICAgaWYgKCh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpIHx8ICFwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5kZWxheWAgYW5kIGBfLmRlZmVyYCB3aGljaCBhY2NlcHRzIGBhcmdzYFxuICAgICAqIHRvIHByb3ZpZGUgdG8gYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWxheS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBpbnZvY2F0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBwcm92aWRlIHRvIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfE9iamVjdH0gUmV0dXJucyB0aGUgdGltZXIgaWQgb3IgdGltZW91dCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZURlbGF5KGZ1bmMsIHdhaXQsIGFyZ3MpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7IH0sIHdhaXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5kaWZmZXJlbmNlYCB3aXRob3V0IHN1cHBvcnRcbiAgICAgKiBmb3IgZXhjbHVkaW5nIG11bHRpcGxlIGFycmF5cyBvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VEaWZmZXJlbmNlKGFycmF5LCB2YWx1ZXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXMsXG4gICAgICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBbXSxcbiAgICAgICAgICB2YWx1ZXNMZW5ndGggPSB2YWx1ZXMubGVuZ3RoO1xuXG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgIHZhbHVlcyA9IGFycmF5TWFwKHZhbHVlcywgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29tcGFyYXRvcikge1xuICAgICAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXNXaXRoO1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodmFsdWVzLmxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSB7XG4gICAgICAgIGluY2x1ZGVzID0gY2FjaGVIYXM7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBTZXRDYWNoZSh2YWx1ZXMpO1xuICAgICAgfVxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID09IG51bGwgPyB2YWx1ZSA6IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICAgICAgaWYgKGlzQ29tbW9uICYmIGNvbXB1dGVkID09PSBjb21wdXRlZCkge1xuICAgICAgICAgIHZhciB2YWx1ZXNJbmRleCA9IHZhbHVlc0xlbmd0aDtcbiAgICAgICAgICB3aGlsZSAodmFsdWVzSW5kZXgtLSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlc1t2YWx1ZXNJbmRleF0gPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWluY2x1ZGVzKHZhbHVlcywgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvckVhY2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICovXG4gICAgdmFyIGJhc2VFYWNoID0gY3JlYXRlQmFzZUVhY2goYmFzZUZvck93bik7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JFYWNoUmlnaHRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICovXG4gICAgdmFyIGJhc2VFYWNoUmlnaHQgPSBjcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duUmlnaHQsIHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZXZlcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgcGFzcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRXZlcnkoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICByZXN1bHQgPSAhIXByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5tYXhgIGFuZCBgXy5taW5gIHdoaWNoIGFjY2VwdHMgYVxuICAgICAqIGBjb21wYXJhdG9yYCB0byBkZXRlcm1pbmUgdGhlIGV4dHJlbXVtIHZhbHVlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciB1c2VkIHRvIGNvbXBhcmUgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBleHRyZW11bSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRXh0cmVtdW0oYXJyYXksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBpdGVyYXRlZSh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbCAmJiAoY29tcHV0ZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IChjdXJyZW50ID09PSBjdXJyZW50ICYmICFpc1N5bWJvbChjdXJyZW50KSlcbiAgICAgICAgICAgICAgOiBjb21wYXJhdG9yKGN1cnJlbnQsIGNvbXB1dGVkKVxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIHZhciBjb21wdXRlZCA9IGN1cnJlbnQsXG4gICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbGxgIHdpdGhvdXQgYW4gaXRlcmF0ZWUgY2FsbCBndWFyZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZpbGwuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBgYXJyYXlgIHdpdGguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGaWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgc3RhcnQgPSB0b0ludGVnZXIoc3RhcnQpO1xuICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICBzdGFydCA9IC1zdGFydCA+IGxlbmd0aCA/IDAgOiAobGVuZ3RoICsgc3RhcnQpO1xuICAgICAgfVxuICAgICAgZW5kID0gKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IGxlbmd0aCkgPyBsZW5ndGggOiB0b0ludGVnZXIoZW5kKTtcbiAgICAgIGlmIChlbmQgPCAwKSB7XG4gICAgICAgIGVuZCArPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICBlbmQgPSBzdGFydCA+IGVuZCA/IDAgOiB0b0xlbmd0aChlbmQpO1xuICAgICAgd2hpbGUgKHN0YXJ0IDwgZW5kKSB7XG4gICAgICAgIGFycmF5W3N0YXJ0KytdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmlsdGVyYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRmlsdGVyKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZsYXR0ZW5gIHdpdGggc3VwcG9ydCBmb3IgcmVzdHJpY3RpbmcgZmxhdHRlbmluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlcHRoIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N0cmljdF0gUmVzdHJpY3QgdG8gdmFsdWVzIHRoYXQgcGFzcyBgcHJlZGljYXRlYCBjaGVja3MuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdD1bXV0gVGhlIGluaXRpYWwgcmVzdWx0IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSwgZGVwdGgsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBwcmVkaWNhdGUgfHwgKHByZWRpY2F0ZSA9IGlzRmxhdHRlbmFibGUpO1xuICAgICAgcmVzdWx0IHx8IChyZXN1bHQgPSBbXSk7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgaWYgKGRlcHRoID4gMCAmJiBwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICAgICAgaWYgKGRlcHRoID4gMSkge1xuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgZmxhdHRlbiBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgICAgIGJhc2VGbGF0dGVuKHZhbHVlLCBkZXB0aCAtIDEsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFycmF5UHVzaChyZXN1bHQsIHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzU3RyaWN0KSB7XG4gICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGJhc2VGb3JPd25gIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYG9iamVjdGBcbiAgICAgKiBwcm9wZXJ0aWVzIHJldHVybmVkIGJ5IGBrZXlzRnVuY2AgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICAgKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgdmFyIGJhc2VGb3IgPSBjcmVhdGVCYXNlRm9yKCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGJhc2VGb3JgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgcHJvcGVydGllc1xuICAgICAqIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUZvclJpZ2h0ID0gY3JlYXRlQmFzZUZvcih0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvck93bmAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRm9yT3duKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgYmFzZUZvcihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JPd25SaWdodGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRm9yT3duUmlnaHQob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yUmlnaHQob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZnVuY3Rpb25zYCB3aGljaCBjcmVhdGVzIGFuIGFycmF5IG9mXG4gICAgICogYG9iamVjdGAgZnVuY3Rpb24gcHJvcGVydHkgbmFtZXMgZmlsdGVyZWQgZnJvbSBgcHJvcHNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZmlsdGVyLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZ1bmN0aW9ucyhvYmplY3QsIHByb3BzKSB7XG4gICAgICByZXR1cm4gYXJyYXlGaWx0ZXIocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihvYmplY3Rba2V5XSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5nZXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVmYXVsdCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR2V0KG9iamVjdCwgcGF0aCkge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgICAgIHZhciBpbmRleCA9IDAsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChvYmplY3QgIT0gbnVsbCAmJiBpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBvYmplY3QgPSBvYmplY3RbdG9LZXkocGF0aFtpbmRleCsrXSldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChpbmRleCAmJiBpbmRleCA9PSBsZW5ndGgpID8gb2JqZWN0IDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRBbGxLZXlzYCBhbmQgYGdldEFsbEtleXNJbmAgd2hpY2ggdXNlc1xuICAgICAqIGBrZXlzRnVuY2AgYW5kIGBzeW1ib2xzRnVuY2AgdG8gZ2V0IHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICAgICAqIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN5bWJvbHNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNGdW5jLCBzeW1ib2xzRnVuYykge1xuICAgICAgdmFyIHJlc3VsdCA9IGtleXNGdW5jKG9iamVjdCk7XG4gICAgICByZXR1cm4gaXNBcnJheShvYmplY3QpID8gcmVzdWx0IDogYXJyYXlQdXNoKHJlc3VsdCwgc3ltYm9sc0Z1bmMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldFRhZ2Agd2l0aG91dCBmYWxsYmFja3MgZm9yIGJ1Z2d5IGVudmlyb25tZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZFRhZyA6IG51bGxUYWc7XG4gICAgICB9XG4gICAgICByZXR1cm4gKHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSkpXG4gICAgICAgID8gZ2V0UmF3VGFnKHZhbHVlKVxuICAgICAgICA6IG9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5ndGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR3QodmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPiBvdGhlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5oYXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSGFzKG9iamVjdCwga2V5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSGFzSW4ob2JqZWN0LCBrZXkpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBrZXkgaW4gT2JqZWN0KG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5SYW5nZWAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG51bWJlcmAgaXMgaW4gdGhlIHJhbmdlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUluUmFuZ2UobnVtYmVyLCBzdGFydCwgZW5kKSB7XG4gICAgICByZXR1cm4gbnVtYmVyID49IG5hdGl2ZU1pbihzdGFydCwgZW5kKSAmJiBudW1iZXIgPCBuYXRpdmVNYXgoc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmludGVyc2VjdGlvbmAsIHdpdGhvdXQgc3VwcG9ydFxuICAgICAqIGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLCB0aGF0IGFjY2VwdHMgYW4gYXJyYXkgb2YgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5cyBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBzaGFyZWQgdmFsdWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJbnRlcnNlY3Rpb24oYXJyYXlzLCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICAgICAgdmFyIGluY2x1ZGVzID0gY29tcGFyYXRvciA/IGFycmF5SW5jbHVkZXNXaXRoIDogYXJyYXlJbmNsdWRlcyxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheXNbMF0ubGVuZ3RoLFxuICAgICAgICAgIG90aExlbmd0aCA9IGFycmF5cy5sZW5ndGgsXG4gICAgICAgICAgb3RoSW5kZXggPSBvdGhMZW5ndGgsXG4gICAgICAgICAgY2FjaGVzID0gQXJyYXkob3RoTGVuZ3RoKSxcbiAgICAgICAgICBtYXhMZW5ndGggPSBJbmZpbml0eSxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgd2hpbGUgKG90aEluZGV4LS0pIHtcbiAgICAgICAgdmFyIGFycmF5ID0gYXJyYXlzW290aEluZGV4XTtcbiAgICAgICAgaWYgKG90aEluZGV4ICYmIGl0ZXJhdGVlKSB7XG4gICAgICAgICAgYXJyYXkgPSBhcnJheU1hcChhcnJheSwgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgbWF4TGVuZ3RoID0gbmF0aXZlTWluKGFycmF5Lmxlbmd0aCwgbWF4TGVuZ3RoKTtcbiAgICAgICAgY2FjaGVzW290aEluZGV4XSA9ICFjb21wYXJhdG9yICYmIChpdGVyYXRlZSB8fCAobGVuZ3RoID49IDEyMCAmJiBhcnJheS5sZW5ndGggPj0gMTIwKSlcbiAgICAgICAgICA/IG5ldyBTZXRDYWNoZShvdGhJbmRleCAmJiBhcnJheSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGFycmF5ID0gYXJyYXlzWzBdO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBzZWVuID0gY2FjaGVzWzBdO1xuXG4gICAgICBvdXRlcjpcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoICYmIHJlc3VsdC5sZW5ndGggPCBtYXhMZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgICAgICBpZiAoIShzZWVuXG4gICAgICAgICAgICAgID8gY2FjaGVIYXMoc2VlbiwgY29tcHV0ZWQpXG4gICAgICAgICAgICAgIDogaW5jbHVkZXMocmVzdWx0LCBjb21wdXRlZCwgY29tcGFyYXRvcilcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICBvdGhJbmRleCA9IG90aExlbmd0aDtcbiAgICAgICAgICB3aGlsZSAoLS1vdGhJbmRleCkge1xuICAgICAgICAgICAgdmFyIGNhY2hlID0gY2FjaGVzW290aEluZGV4XTtcbiAgICAgICAgICAgIGlmICghKGNhY2hlXG4gICAgICAgICAgICAgICAgICA/IGNhY2hlSGFzKGNhY2hlLCBjb21wdXRlZClcbiAgICAgICAgICAgICAgICAgIDogaW5jbHVkZXMoYXJyYXlzW290aEluZGV4XSwgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlZW4pIHtcbiAgICAgICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbnZlcnRgIGFuZCBgXy5pbnZlcnRCeWAgd2hpY2ggaW52ZXJ0c1xuICAgICAqIGBvYmplY3RgIHdpdGggdmFsdWVzIHRyYW5zZm9ybWVkIGJ5IGBpdGVyYXRlZWAgYW5kIHNldCBieSBgc2V0dGVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBgYWNjdW11bGF0b3JgIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgaW52ZXJ0ZWQgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgYWNjdW11bGF0b3JgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJbnZlcnRlcihvYmplY3QsIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICBiYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICAgIHNldHRlcihhY2N1bXVsYXRvciwgaXRlcmF0ZWUodmFsdWUpLCBrZXksIG9iamVjdCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbnZva2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbFxuICAgICAqIG1ldGhvZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSW52b2tlKG9iamVjdCwgcGF0aCwgYXJncykge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG4gICAgICBvYmplY3QgPSBwYXJlbnQob2JqZWN0LCBwYXRoKTtcbiAgICAgIHZhciBmdW5jID0gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBvYmplY3RbdG9LZXkobGFzdChwYXRoKSldO1xuICAgICAgcmV0dXJuIGZ1bmMgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGFwcGx5KGZ1bmMsIG9iamVjdCwgYXJncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNBcmd1bWVudHNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzQXJndW1lbnRzKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcmdzVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzQXJyYXlCdWZmZXJgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNBcnJheUJ1ZmZlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYXJyYXlCdWZmZXJUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNEYXRlYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBkYXRlIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0RhdGUodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGRhdGVUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNFcXVhbGAgd2hpY2ggc3VwcG9ydHMgcGFydGlhbCBjb21wYXJpc29uc1xuICAgICAqIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gICAgICogIDEgLSBVbm9yZGVyZWQgY29tcGFyaXNvblxuICAgICAqICAyIC0gUGFydGlhbCBjb21wYXJpc29uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgdmFsdWVgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gICAgICBpZiAodmFsdWUgPT09IG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgb3RoZXIgPT0gbnVsbCB8fCAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgIWlzT2JqZWN0TGlrZShvdGhlcikpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJc0VxdWFsRGVlcCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGJhc2VJc0VxdWFsLCBzdGFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICAgICAqIGRlZXAgY29tcGFyaXNvbnMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAgICAgKiByZWZlcmVuY2VzIHRvIGJlIGNvbXBhcmVkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0VxdWFsRGVlcChvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gICAgICB2YXIgb2JqSXNBcnIgPSBpc0FycmF5KG9iamVjdCksXG4gICAgICAgICAgb3RoSXNBcnIgPSBpc0FycmF5KG90aGVyKSxcbiAgICAgICAgICBvYmpUYWcgPSBvYmpJc0FyciA/IGFycmF5VGFnIDogZ2V0VGFnKG9iamVjdCksXG4gICAgICAgICAgb3RoVGFnID0gb3RoSXNBcnIgPyBhcnJheVRhZyA6IGdldFRhZyhvdGhlcik7XG5cbiAgICAgIG9ialRhZyA9IG9ialRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb2JqVGFnO1xuICAgICAgb3RoVGFnID0gb3RoVGFnID09IGFyZ3NUYWcgPyBvYmplY3RUYWcgOiBvdGhUYWc7XG5cbiAgICAgIHZhciBvYmpJc09iaiA9IG9ialRhZyA9PSBvYmplY3RUYWcsXG4gICAgICAgICAgb3RoSXNPYmogPSBvdGhUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgICAgIGlzU2FtZVRhZyA9IG9ialRhZyA9PSBvdGhUYWc7XG5cbiAgICAgIGlmIChpc1NhbWVUYWcgJiYgaXNCdWZmZXIob2JqZWN0KSkge1xuICAgICAgICBpZiAoIWlzQnVmZmVyKG90aGVyKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBvYmpJc0FyciA9IHRydWU7XG4gICAgICAgIG9iaklzT2JqID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoaXNTYW1lVGFnICYmICFvYmpJc09iaikge1xuICAgICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgICByZXR1cm4gKG9iaklzQXJyIHx8IGlzVHlwZWRBcnJheShvYmplY3QpKVxuICAgICAgICAgID8gZXF1YWxBcnJheXMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaylcbiAgICAgICAgICA6IGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgb2JqVGFnLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgICAgIH1cbiAgICAgIGlmICghKGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRykpIHtcbiAgICAgICAgdmFyIG9iaklzV3JhcHBlZCA9IG9iaklzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCAnX193cmFwcGVkX18nKSxcbiAgICAgICAgICAgIG90aElzV3JhcHBlZCA9IG90aElzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsICdfX3dyYXBwZWRfXycpO1xuXG4gICAgICAgIGlmIChvYmpJc1dyYXBwZWQgfHwgb3RoSXNXcmFwcGVkKSB7XG4gICAgICAgICAgdmFyIG9ialVud3JhcHBlZCA9IG9iaklzV3JhcHBlZCA/IG9iamVjdC52YWx1ZSgpIDogb2JqZWN0LFxuICAgICAgICAgICAgICBvdGhVbndyYXBwZWQgPSBvdGhJc1dyYXBwZWQgPyBvdGhlci52YWx1ZSgpIDogb3RoZXI7XG5cbiAgICAgICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgICAgIHJldHVybiBlcXVhbEZ1bmMob2JqVW53cmFwcGVkLCBvdGhVbndyYXBwZWQsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFpc1NhbWVUYWcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgIHJldHVybiBlcXVhbE9iamVjdHMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXBgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG1hcCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc01hcCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBtYXBUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXRjaGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IG1hdGNoRGF0YSBUaGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3MgdG8gbWF0Y2guXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgbWF0Y2hEYXRhLCBjdXN0b21pemVyKSB7XG4gICAgICB2YXIgaW5kZXggPSBtYXRjaERhdGEubGVuZ3RoLFxuICAgICAgICAgIGxlbmd0aCA9IGluZGV4LFxuICAgICAgICAgIG5vQ3VzdG9taXplciA9ICFjdXN0b21pemVyO1xuXG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICFsZW5ndGg7XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgIHZhciBkYXRhID0gbWF0Y2hEYXRhW2luZGV4XTtcbiAgICAgICAgaWYgKChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSlcbiAgICAgICAgICAgICAgPyBkYXRhWzFdICE9PSBvYmplY3RbZGF0YVswXV1cbiAgICAgICAgICAgICAgOiAhKGRhdGFbMF0gaW4gb2JqZWN0KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBkYXRhID0gbWF0Y2hEYXRhW2luZGV4XTtcbiAgICAgICAgdmFyIGtleSA9IGRhdGFbMF0sXG4gICAgICAgICAgICBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICAgICAgc3JjVmFsdWUgPSBkYXRhWzFdO1xuXG4gICAgICAgIGlmIChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSkge1xuICAgICAgICAgIGlmIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHN0YWNrID0gbmV3IFN0YWNrO1xuICAgICAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEocmVzdWx0ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHLCBjdXN0b21pemVyLCBzdGFjaylcbiAgICAgICAgICAgICAgICA6IHJlc3VsdFxuICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hdGl2ZWAgd2l0aG91dCBiYWQgc2hpbSBjaGVja3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzTmF0aXZlKHZhbHVlKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHBhdHRlcm4gPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7XG4gICAgICByZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNSZWdFeHBgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHJlZ2V4cCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc1JlZ0V4cCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gcmVnZXhwVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzU2V0YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzZXQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNTZXQodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gc2V0VGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzVHlwZWRBcnJheWAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNUeXBlZEFycmF5KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJlxuICAgICAgICBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICEhdHlwZWRBcnJheVRhZ3NbYmFzZUdldFRhZyh2YWx1ZSldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLml0ZXJhdGVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBbdmFsdWU9Xy5pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYW4gaXRlcmF0ZWUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBpdGVyYXRlZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpIHtcbiAgICAgIC8vIERvbid0IHN0b3JlIHRoZSBgdHlwZW9mYCByZXN1bHQgaW4gYSB2YXJpYWJsZSB0byBhdm9pZCBhIEpJVCBidWcgaW4gU2FmYXJpIDkuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NjAzNCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBpZGVudGl0eTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgPyBiYXNlTWF0Y2hlc1Byb3BlcnR5KHZhbHVlWzBdLCB2YWx1ZVsxXSlcbiAgICAgICAgICA6IGJhc2VNYXRjaGVzKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c2Agd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlS2V5cyhvYmplY3QpIHtcbiAgICAgIGlmICghaXNQcm90b3R5cGUob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gbmF0aXZlS2V5cyhvYmplY3QpO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBrZXkgIT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c0luYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VLZXlzSW4ob2JqZWN0KSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZUtleXNJbihvYmplY3QpO1xuICAgICAgfVxuICAgICAgdmFyIGlzUHJvdG8gPSBpc1Byb3RvdHlwZShvYmplY3QpLFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgIGlmICghKGtleSA9PSAnY29uc3RydWN0b3InICYmIChpc1Byb3RvIHx8ICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5sdGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTHQodmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPCBvdGhlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXBgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHJlc3VsdCA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gQXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpIDogW107XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmVzdWx0WysraW5kZXhdID0gaXRlcmF0ZWUodmFsdWUsIGtleSwgY29sbGVjdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWF0Y2hlc2Agd2hpY2ggZG9lc24ndCBjbG9uZSBgc291cmNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNYXRjaGVzKHNvdXJjZSkge1xuICAgICAgdmFyIG1hdGNoRGF0YSA9IGdldE1hdGNoRGF0YShzb3VyY2UpO1xuICAgICAgaWYgKG1hdGNoRGF0YS5sZW5ndGggPT0gMSAmJiBtYXRjaERhdGFbMF1bMl0pIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKG1hdGNoRGF0YVswXVswXSwgbWF0Y2hEYXRhWzBdWzFdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdCA9PT0gc291cmNlIHx8IGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBtYXRjaERhdGEpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzUHJvcGVydHlgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNyY1ZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNYXRjaGVzUHJvcGVydHkocGF0aCwgc3JjVmFsdWUpIHtcbiAgICAgIGlmIChpc0tleShwYXRoKSAmJiBpc1N0cmljdENvbXBhcmFibGUoc3JjVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSh0b0tleShwYXRoKSwgc3JjVmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICB2YXIgb2JqVmFsdWUgPSBnZXQob2JqZWN0LCBwYXRoKTtcbiAgICAgICAgcmV0dXJuIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIG9ialZhbHVlID09PSBzcmNWYWx1ZSlcbiAgICAgICAgICA/IGhhc0luKG9iamVjdCwgcGF0aClcbiAgICAgICAgICA6IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVyZ2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNyY0luZGV4IFRoZSBpbmRleCBvZiBgc291cmNlYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBtZXJnZWQgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gICAgICogIGNvdW50ZXJwYXJ0cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyLCBzdGFjaykge1xuICAgICAgaWYgKG9iamVjdCA9PT0gc291cmNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGJhc2VGb3Ioc291cmNlLCBmdW5jdGlvbihzcmNWYWx1ZSwga2V5KSB7XG4gICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICAgIGlmIChpc09iamVjdChzcmNWYWx1ZSkpIHtcbiAgICAgICAgICBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBiYXNlTWVyZ2UsIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBjdXN0b21pemVyXG4gICAgICAgICAgICA/IGN1c3RvbWl6ZXIoc2FmZUdldChvYmplY3QsIGtleSksIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGtleXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlTWVyZ2VgIGZvciBhcnJheXMgYW5kIG9iamVjdHMgd2hpY2ggcGVyZm9ybXNcbiAgICAgKiBkZWVwIG1lcmdlcyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICAgICAqIHJlZmVyZW5jZXMgdG8gYmUgbWVyZ2VkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIG1lcmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbWVyZ2VGdW5jIFRoZSBmdW5jdGlvbiB0byBtZXJnZSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gICAgICogIGNvdW50ZXJwYXJ0cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBtZXJnZUZ1bmMsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBzYWZlR2V0KG9iamVjdCwga2V5KSxcbiAgICAgICAgICBzcmNWYWx1ZSA9IHNhZmVHZXQoc291cmNlLCBrZXkpLFxuICAgICAgICAgIHN0YWNrZWQgPSBzdGFjay5nZXQoc3JjVmFsdWUpO1xuXG4gICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBzdGFja2VkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICB2YXIgaXNDb21tb24gPSBuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoaXNDb21tb24pIHtcbiAgICAgICAgdmFyIGlzQXJyID0gaXNBcnJheShzcmNWYWx1ZSksXG4gICAgICAgICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgaXNCdWZmZXIoc3JjVmFsdWUpLFxuICAgICAgICAgICAgaXNUeXBlZCA9ICFpc0FyciAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheShzcmNWYWx1ZSk7XG5cbiAgICAgICAgbmV3VmFsdWUgPSBzcmNWYWx1ZTtcbiAgICAgICAgaWYgKGlzQXJyIHx8IGlzQnVmZiB8fCBpc1R5cGVkKSB7XG4gICAgICAgICAgaWYgKGlzQXJyYXkob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChpc0FycmF5TGlrZU9iamVjdChvYmpWYWx1ZSkpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gY29weUFycmF5KG9ialZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaXNCdWZmKSB7XG4gICAgICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBjbG9uZUJ1ZmZlcihzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGlzVHlwZWQpIHtcbiAgICAgICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGNsb25lVHlwZWRBcnJheShzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQbGFpbk9iamVjdChzcmNWYWx1ZSkgfHwgaXNBcmd1bWVudHMoc3JjVmFsdWUpKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBvYmpWYWx1ZTtcbiAgICAgICAgICBpZiAoaXNBcmd1bWVudHMob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHRvUGxhaW5PYmplY3Qob2JqVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmICghaXNPYmplY3Qob2JqVmFsdWUpIHx8IGlzRnVuY3Rpb24ob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGluaXRDbG9uZU9iamVjdChzcmNWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc0NvbW1vbikge1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBtZXJnZSBvYmplY3RzIGFuZCBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgc3RhY2suc2V0KHNyY1ZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgICAgIG1lcmdlRnVuYyhuZXdWYWx1ZSwgc3JjVmFsdWUsIHNyY0luZGV4LCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgICAgIHN0YWNrWydkZWxldGUnXShzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubnRoYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmV0dXJuLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBudGggZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VOdGgoYXJyYXksIG4pIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBuICs9IG4gPCAwID8gbGVuZ3RoIDogMDtcbiAgICAgIHJldHVybiBpc0luZGV4KG4sIGxlbmd0aCkgPyBhcnJheVtuXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5vcmRlckJ5YCB3aXRob3V0IHBhcmFtIGd1YXJkcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gaXRlcmF0ZWVzIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBvcmRlcnMgVGhlIHNvcnQgb3JkZXJzIG9mIGBpdGVyYXRlZXNgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycykge1xuICAgICAgaWYgKGl0ZXJhdGVlcy5sZW5ndGgpIHtcbiAgICAgICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgIGlmIChpc0FycmF5KGl0ZXJhdGVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlR2V0KHZhbHVlLCBpdGVyYXRlZS5sZW5ndGggPT09IDEgPyBpdGVyYXRlZVswXSA6IGl0ZXJhdGVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGl0ZXJhdGVlO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IFtpZGVudGl0eV07XG4gICAgICB9XG5cbiAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZU1hcChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHZhciBjcml0ZXJpYSA9IGFycmF5TWFwKGl0ZXJhdGVlcywgZnVuY3Rpb24oaXRlcmF0ZWUpIHtcbiAgICAgICAgICByZXR1cm4gaXRlcmF0ZWUodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgJ2NyaXRlcmlhJzogY3JpdGVyaWEsICdpbmRleCc6ICsraW5kZXgsICd2YWx1ZSc6IHZhbHVlIH07XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGJhc2VTb3J0QnkocmVzdWx0LCBmdW5jdGlvbihvYmplY3QsIG90aGVyKSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnBpY2tgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbFxuICAgICAqIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVBpY2sob2JqZWN0LCBwYXRocykge1xuICAgICAgcmV0dXJuIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgZnVuY3Rpb24odmFsdWUsIHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGhhc0luKG9iamVjdCwgcGF0aCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiAgYF8ucGlja0J5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0ge307XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBwYXRoID0gcGF0aHNbaW5kZXhdLFxuICAgICAgICAgICAgdmFsdWUgPSBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG5cbiAgICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgcGF0aCkpIHtcbiAgICAgICAgICBiYXNlU2V0KHJlc3VsdCwgY2FzdFBhdGgocGF0aCwgb2JqZWN0KSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVByb3BlcnR5YCB3aGljaCBzdXBwb3J0cyBkZWVwIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQcm9wZXJ0eURlZXAocGF0aCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wdWxsQWxsQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAgICAgKiBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5kZXhPZiA9IGNvbXBhcmF0b3IgPyBiYXNlSW5kZXhPZldpdGggOiBiYXNlSW5kZXhPZixcbiAgICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICAgICAgc2VlbiA9IGFycmF5O1xuXG4gICAgICBpZiAoYXJyYXkgPT09IHZhbHVlcykge1xuICAgICAgICB2YWx1ZXMgPSBjb3B5QXJyYXkodmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICBzZWVuID0gYXJyYXlNYXAoYXJyYXksIGJhc2VVbmFyeShpdGVyYXRlZSkpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGZyb21JbmRleCA9IDAsXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlc1tpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICAgICAgd2hpbGUgKChmcm9tSW5kZXggPSBpbmRleE9mKHNlZW4sIGNvbXB1dGVkLCBmcm9tSW5kZXgsIGNvbXBhcmF0b3IpKSA+IC0xKSB7XG4gICAgICAgICAgaWYgKHNlZW4gIT09IGFycmF5KSB7XG4gICAgICAgICAgICBzcGxpY2UuY2FsbChzZWVuLCBmcm9tSW5kZXgsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzcGxpY2UuY2FsbChhcnJheSwgZnJvbUluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnB1bGxBdGAgd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gICAgICogaW5kZXhlcyBvciBjYXB0dXJpbmcgdGhlIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJbXX0gaW5kZXhlcyBUaGUgaW5kZXhlcyBvZiBlbGVtZW50cyB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVB1bGxBdChhcnJheSwgaW5kZXhlcykge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID8gaW5kZXhlcy5sZW5ndGggOiAwLFxuICAgICAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIgaW5kZXggPSBpbmRleGVzW2xlbmd0aF07XG4gICAgICAgIGlmIChsZW5ndGggPT0gbGFzdEluZGV4IHx8IGluZGV4ICE9PSBwcmV2aW91cykge1xuICAgICAgICAgIHZhciBwcmV2aW91cyA9IGluZGV4O1xuICAgICAgICAgIGlmIChpc0luZGV4KGluZGV4KSkge1xuICAgICAgICAgICAgc3BsaWNlLmNhbGwoYXJyYXksIGluZGV4LCAxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYmFzZVVuc2V0KGFycmF5LCBpbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmFuZG9tYCB3aXRob3V0IHN1cHBvcnQgZm9yIHJldHVybmluZ1xuICAgICAqIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsb3dlciBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByYW5kb20gbnVtYmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VSYW5kb20obG93ZXIsIHVwcGVyKSB7XG4gICAgICByZXR1cm4gbG93ZXIgKyBuYXRpdmVGbG9vcihuYXRpdmVSYW5kb20oKSAqICh1cHBlciAtIGxvd2VyICsgMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJhbmdlYCBhbmQgYF8ucmFuZ2VSaWdodGAgd2hpY2ggZG9lc24ndFxuICAgICAqIGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0ZXAgVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VSYW5nZShzdGFydCwgZW5kLCBzdGVwLCBmcm9tUmlnaHQpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChuYXRpdmVDZWlsKChlbmQgLSBzdGFydCkgLyAoc3RlcCB8fCAxKSksIDApLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICByZXN1bHRbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF0gPSBzdGFydDtcbiAgICAgICAgc3RhcnQgKz0gc3RlcDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVwZWF0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byByZXBlYXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHN0cmluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByZXBlYXRlZCBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJlcGVhdChzdHJpbmcsIG4pIHtcbiAgICAgIHZhciByZXN1bHQgPSAnJztcbiAgICAgIGlmICghc3RyaW5nIHx8IG4gPCAxIHx8IG4gPiBNQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICAvLyBMZXZlcmFnZSB0aGUgZXhwb25lbnRpYXRpb24gYnkgc3F1YXJpbmcgYWxnb3JpdGhtIGZvciBhIGZhc3RlciByZXBlYXQuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRXhwb25lbnRpYXRpb25fYnlfc3F1YXJpbmcgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKG4gJSAyKSB7XG4gICAgICAgICAgcmVzdWx0ICs9IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBuID0gbmF0aXZlRmxvb3IobiAvIDIpO1xuICAgICAgICBpZiAobikge1xuICAgICAgICAgIHN0cmluZyArPSBzdHJpbmc7XG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKG4pO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlc3RgIHdoaWNoIGRvZXNuJ3QgdmFsaWRhdGUgb3IgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJlc3QoZnVuYywgc3RhcnQpIHtcbiAgICAgIHJldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLCBzdGFydCwgaWRlbnRpdHkpLCBmdW5jICsgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNhbXBsZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNhbXBsZShjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gYXJyYXlTYW1wbGUodmFsdWVzKGNvbGxlY3Rpb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zYW1wbGVTaXplYCB3aXRob3V0IHBhcmFtIGd1YXJkcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTYW1wbGVTaXplKGNvbGxlY3Rpb24sIG4pIHtcbiAgICAgIHZhciBhcnJheSA9IHZhbHVlcyhjb2xsZWN0aW9uKTtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZihhcnJheSwgYmFzZUNsYW1wKG4sIDAsIGFycmF5Lmxlbmd0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNldGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMSxcbiAgICAgICAgICBuZXN0ZWQgPSBvYmplY3Q7XG5cbiAgICAgIHdoaWxlIChuZXN0ZWQgIT0gbnVsbCAmJiArK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSksXG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHZhbHVlO1xuXG4gICAgICAgIGlmIChrZXkgPT09ICdfX3Byb3RvX18nIHx8IGtleSA9PT0gJ2NvbnN0cnVjdG9yJyB8fCBrZXkgPT09ICdwcm90b3R5cGUnKSB7XG4gICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRleCAhPSBsYXN0SW5kZXgpIHtcbiAgICAgICAgICB2YXIgb2JqVmFsdWUgPSBuZXN0ZWRba2V5XTtcbiAgICAgICAgICBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXIgPyBjdXN0b21pemVyKG9ialZhbHVlLCBrZXksIG5lc3RlZCkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gaXNPYmplY3Qob2JqVmFsdWUpXG4gICAgICAgICAgICAgID8gb2JqVmFsdWVcbiAgICAgICAgICAgICAgOiAoaXNJbmRleChwYXRoW2luZGV4ICsgMV0pID8gW10gOiB7fSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzc2lnblZhbHVlKG5lc3RlZCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgIG5lc3RlZCA9IG5lc3RlZFtrZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0RGF0YWAgd2l0aG91dCBzdXBwb3J0IGZvciBob3QgbG9vcCBzaG9ydGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzb2NpYXRlIG1ldGFkYXRhIHdpdGguXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXRhZGF0YS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBiYXNlU2V0RGF0YSA9ICFtZXRhTWFwID8gaWRlbnRpdHkgOiBmdW5jdGlvbihmdW5jLCBkYXRhKSB7XG4gICAgICBtZXRhTWFwLnNldChmdW5jLCBkYXRhKTtcbiAgICAgIHJldHVybiBmdW5jO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0VG9TdHJpbmdgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaG90IGxvb3Agc2hvcnRpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIGJhc2VTZXRUb1N0cmluZyA9ICFkZWZpbmVQcm9wZXJ0eSA/IGlkZW50aXR5IDogZnVuY3Rpb24oZnVuYywgc3RyaW5nKSB7XG4gICAgICByZXR1cm4gZGVmaW5lUHJvcGVydHkoZnVuYywgJ3RvU3RyaW5nJywge1xuICAgICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICAgJ2VudW1lcmFibGUnOiBmYWxzZSxcbiAgICAgICAgJ3ZhbHVlJzogY29uc3RhbnQoc3RyaW5nKSxcbiAgICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNodWZmbGVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTaHVmZmxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZih2YWx1ZXMoY29sbGVjdGlvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNsaWNlYCB3aXRob3V0IGFuIGl0ZXJhdGVlIGNhbGwgZ3VhcmQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzbGljZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHN0YXJ0ID0gLXN0YXJ0ID4gbGVuZ3RoID8gMCA6IChsZW5ndGggKyBzdGFydCk7XG4gICAgICB9XG4gICAgICBlbmQgPSBlbmQgPiBsZW5ndGggPyBsZW5ndGggOiBlbmQ7XG4gICAgICBpZiAoZW5kIDwgMCkge1xuICAgICAgICBlbmQgKz0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgbGVuZ3RoID0gc3RhcnQgPiBlbmQgPyAwIDogKChlbmQgLSBzdGFydCkgPj4+IDApO1xuICAgICAgc3RhcnQgPj4+PSAwO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBhcnJheVtpbmRleCArIHN0YXJ0XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29tZWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvbWUoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuXG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmVzdWx0ID0gcHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICAgIHJldHVybiAhcmVzdWx0O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gISFyZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydGVkSW5kZXhgIGFuZCBgXy5zb3J0ZWRMYXN0SW5kZXhgIHdoaWNoXG4gICAgICogcGVyZm9ybXMgYSBiaW5hcnkgc2VhcmNoIG9mIGBhcnJheWAgdG8gZGV0ZXJtaW5lIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgXG4gICAgICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0byBtYWludGFpbiBpdHMgc29ydCBvcmRlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldEhpZ2hlc3RdIFNwZWNpZnkgcmV0dXJuaW5nIHRoZSBoaWdoZXN0IHF1YWxpZmllZCBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgcmV0SGlnaGVzdCkge1xuICAgICAgdmFyIGxvdyA9IDAsXG4gICAgICAgICAgaGlnaCA9IGFycmF5ID09IG51bGwgPyBsb3cgOiBhcnJheS5sZW5ndGg7XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgdmFsdWUgPT09IHZhbHVlICYmIGhpZ2ggPD0gSEFMRl9NQVhfQVJSQVlfTEVOR1RIKSB7XG4gICAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgICAgdmFyIG1pZCA9IChsb3cgKyBoaWdoKSA+Pj4gMSxcbiAgICAgICAgICAgICAgY29tcHV0ZWQgPSBhcnJheVttaWRdO1xuXG4gICAgICAgICAgaWYgKGNvbXB1dGVkICE9PSBudWxsICYmICFpc1N5bWJvbChjb21wdXRlZCkgJiZcbiAgICAgICAgICAgICAgKHJldEhpZ2hlc3QgPyAoY29tcHV0ZWQgPD0gdmFsdWUpIDogKGNvbXB1dGVkIDwgdmFsdWUpKSkge1xuICAgICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhpZ2g7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBpZGVudGl0eSwgcmV0SGlnaGVzdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydGVkSW5kZXhCeWAgYW5kIGBfLnNvcnRlZExhc3RJbmRleEJ5YFxuICAgICAqIHdoaWNoIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgYHZhbHVlYCBhbmQgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgdG8gY29tcHV0ZVxuICAgICAqIHRoZWlyIHNvcnQgcmFua2luZy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXRIaWdoZXN0XSBTcGVjaWZ5IHJldHVybmluZyB0aGUgaGlnaGVzdCBxdWFsaWZpZWQgaW5kZXguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaXRlcmF0ZWUsIHJldEhpZ2hlc3QpIHtcbiAgICAgIHZhciBsb3cgPSAwLFxuICAgICAgICAgIGhpZ2ggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmIChoaWdoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICB2YWx1ZSA9IGl0ZXJhdGVlKHZhbHVlKTtcbiAgICAgIHZhciB2YWxJc05hTiA9IHZhbHVlICE9PSB2YWx1ZSxcbiAgICAgICAgICB2YWxJc051bGwgPSB2YWx1ZSA9PT0gbnVsbCxcbiAgICAgICAgICB2YWxJc1N5bWJvbCA9IGlzU3ltYm9sKHZhbHVlKSxcbiAgICAgICAgICB2YWxJc1VuZGVmaW5lZCA9IHZhbHVlID09PSB1bmRlZmluZWQ7XG5cbiAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgIHZhciBtaWQgPSBuYXRpdmVGbG9vcigobG93ICsgaGlnaCkgLyAyKSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUoYXJyYXlbbWlkXSksXG4gICAgICAgICAgICBvdGhJc0RlZmluZWQgPSBjb21wdXRlZCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgb3RoSXNOdWxsID0gY29tcHV0ZWQgPT09IG51bGwsXG4gICAgICAgICAgICBvdGhJc1JlZmxleGl2ZSA9IGNvbXB1dGVkID09PSBjb21wdXRlZCxcbiAgICAgICAgICAgIG90aElzU3ltYm9sID0gaXNTeW1ib2woY29tcHV0ZWQpO1xuXG4gICAgICAgIGlmICh2YWxJc05hTikge1xuICAgICAgICAgIHZhciBzZXRMb3cgPSByZXRIaWdoZXN0IHx8IG90aElzUmVmbGV4aXZlO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbElzVW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2V0TG93ID0gb3RoSXNSZWZsZXhpdmUgJiYgKHJldEhpZ2hlc3QgfHwgb3RoSXNEZWZpbmVkKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWxJc051bGwpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiBvdGhJc0RlZmluZWQgJiYgKHJldEhpZ2hlc3QgfHwgIW90aElzTnVsbCk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsSXNTeW1ib2wpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiBvdGhJc0RlZmluZWQgJiYgIW90aElzTnVsbCAmJiAocmV0SGlnaGVzdCB8fCAhb3RoSXNTeW1ib2wpO1xuICAgICAgICB9IGVsc2UgaWYgKG90aElzTnVsbCB8fCBvdGhJc1N5bWJvbCkge1xuICAgICAgICAgIHNldExvdyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldExvdyA9IHJldEhpZ2hlc3QgPyAoY29tcHV0ZWQgPD0gdmFsdWUpIDogKGNvbXB1dGVkIDwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXRMb3cpIHtcbiAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhpZ2ggPSBtaWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuYXRpdmVNaW4oaGlnaCwgTUFYX0FSUkFZX0lOREVYKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRVbmlxYCBhbmQgYF8uc29ydGVkVW5pcUJ5YCB3aXRob3V0XG4gICAgICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29ydGVkVW5pcShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgICAgICBpZiAoIWluZGV4IHx8ICFlcShjb21wdXRlZCwgc2VlbikpIHtcbiAgICAgICAgICB2YXIgc2VlbiA9IGNvbXB1dGVkO1xuICAgICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlID09PSAwID8gMCA6IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRvTnVtYmVyYCB3aGljaCBkb2Vzbid0IGVuc3VyZSBjb3JyZWN0XG4gICAgICogY29udmVyc2lvbnMgb2YgYmluYXJ5LCBoZXhhZGVjaW1hbCwgb3Igb2N0YWwgc3RyaW5nIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVRvTnVtYmVyKHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIE5BTjtcbiAgICAgIH1cbiAgICAgIHJldHVybiArdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9TdHJpbmdgIHdoaWNoIGRvZXNuJ3QgY29udmVydCBudWxsaXNoXG4gICAgICogdmFsdWVzIHRvIGVtcHR5IHN0cmluZ3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VUb1N0cmluZyh2YWx1ZSkge1xuICAgICAgLy8gRXhpdCBlYXJseSBmb3Igc3RyaW5ncyB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIGhpdCBpbiBzb21lIGVudmlyb25tZW50cy5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbnZlcnQgdmFsdWVzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgYmFzZVRvU3RyaW5nKSArICcnO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9ICh2YWx1ZSArICcnKTtcbiAgICAgIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmlxQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlVW5pcShhcnJheSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgICAgIHNlZW4gPSByZXN1bHQ7XG5cbiAgICAgIGlmIChjb21wYXJhdG9yKSB7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChsZW5ndGggPj0gTEFSR0VfQVJSQVlfU0laRSkge1xuICAgICAgICB2YXIgc2V0ID0gaXRlcmF0ZWUgPyBudWxsIDogY3JlYXRlU2V0KGFycmF5KTtcbiAgICAgICAgaWYgKHNldCkge1xuICAgICAgICAgIHJldHVybiBzZXRUb0FycmF5KHNldCk7XG4gICAgICAgIH1cbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICAgICAgc2VlbiA9IG5ldyBTZXRDYWNoZTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzZWVuID0gaXRlcmF0ZWUgPyBbXSA6IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgICAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgdmFyIHNlZW5JbmRleCA9IHNlZW4ubGVuZ3RoO1xuICAgICAgICAgIHdoaWxlIChzZWVuSW5kZXgtLSkge1xuICAgICAgICAgICAgaWYgKHNlZW5bc2VlbkluZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFpbmNsdWRlcyhzZWVuLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgICAgICBpZiAoc2VlbiAhPT0gcmVzdWx0KSB7XG4gICAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5zZXRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoIHRvIHVuc2V0LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcHJvcGVydHkgaXMgZGVsZXRlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVbnNldChvYmplY3QsIHBhdGgpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuICAgICAgb2JqZWN0ID0gcGFyZW50KG9iamVjdCwgcGF0aCk7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgfHwgZGVsZXRlIG9iamVjdFt0b0tleShsYXN0KHBhdGgpKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udXBkYXRlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gdXBkYXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZXIgVGhlIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHVwZGF0ZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVcGRhdGUob2JqZWN0LCBwYXRoLCB1cGRhdGVyLCBjdXN0b21pemVyKSB7XG4gICAgICByZXR1cm4gYmFzZVNldChvYmplY3QsIHBhdGgsIHVwZGF0ZXIoYmFzZUdldChvYmplY3QsIHBhdGgpKSwgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmRyb3BXaGlsZWAgYW5kIGBfLnRha2VXaGlsZWBcbiAgICAgKiB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0Ryb3BdIFNwZWNpZnkgZHJvcHBpbmcgZWxlbWVudHMgaW5zdGVhZCBvZiB0YWtpbmcgdGhlbS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVdoaWxlKGFycmF5LCBwcmVkaWNhdGUsIGlzRHJvcCwgZnJvbVJpZ2h0KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIGluZGV4ID0gZnJvbVJpZ2h0ID8gbGVuZ3RoIDogLTE7XG5cbiAgICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpICYmXG4gICAgICAgIHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHt9XG5cbiAgICAgIHJldHVybiBpc0Ryb3BcbiAgICAgICAgPyBiYXNlU2xpY2UoYXJyYXksIChmcm9tUmlnaHQgPyAwIDogaW5kZXgpLCAoZnJvbVJpZ2h0ID8gaW5kZXggKyAxIDogbGVuZ3RoKSlcbiAgICAgICAgOiBiYXNlU2xpY2UoYXJyYXksIChmcm9tUmlnaHQgPyBpbmRleCArIDEgOiAwKSwgKGZyb21SaWdodCA/IGxlbmd0aCA6IGluZGV4KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHdyYXBwZXJWYWx1ZWAgd2hpY2ggcmV0dXJucyB0aGUgcmVzdWx0IG9mXG4gICAgICogcGVyZm9ybWluZyBhIHNlcXVlbmNlIG9mIGFjdGlvbnMgb24gdGhlIHVud3JhcHBlZCBgdmFsdWVgLCB3aGVyZSBlYWNoXG4gICAgICogc3VjY2Vzc2l2ZSBhY3Rpb24gaXMgc3VwcGxpZWQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJldmlvdXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhY3Rpb25zIEFjdGlvbnMgdG8gcGVyZm9ybSB0byByZXNvbHZlIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VXcmFwcGVyVmFsdWUodmFsdWUsIGFjdGlvbnMpIHtcbiAgICAgIHZhciByZXN1bHQgPSB2YWx1ZTtcbiAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQudmFsdWUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheVJlZHVjZShhY3Rpb25zLCBmdW5jdGlvbihyZXN1bHQsIGFjdGlvbikge1xuICAgICAgICByZXR1cm4gYWN0aW9uLmZ1bmMuYXBwbHkoYWN0aW9uLnRoaXNBcmcsIGFycmF5UHVzaChbcmVzdWx0XSwgYWN0aW9uLmFyZ3MpKTtcbiAgICAgIH0sIHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLnhvcmAsIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLCB0aGF0IGFjY2VwdHMgYW4gYXJyYXkgb2YgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5cyBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiB2YWx1ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVhvcihhcnJheXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXlzLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlVW5pcShhcnJheXNbMF0pIDogW107XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcnJheXNbaW5kZXhdLFxuICAgICAgICAgICAgb3RoSW5kZXggPSAtMTtcblxuICAgICAgICB3aGlsZSAoKytvdGhJbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGlmIChvdGhJbmRleCAhPSBpbmRleCkge1xuICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IGJhc2VEaWZmZXJlbmNlKHJlc3VsdFtpbmRleF0gfHwgYXJyYXksIGFycmF5c1tvdGhJbmRleF0sIGl0ZXJhdGVlLCBjb21wYXJhdG9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihyZXN1bHQsIDEpLCBpdGVyYXRlZSwgY29tcGFyYXRvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnppcE9iamVjdGAgd2hpY2ggYXNzaWducyB2YWx1ZXMgdXNpbmcgYGFzc2lnbkZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduRnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VaaXBPYmplY3QocHJvcHMsIHZhbHVlcywgYXNzaWduRnVuYykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgICAgIHZhbHNMZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBpbmRleCA8IHZhbHNMZW5ndGggPyB2YWx1ZXNbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgICBhc3NpZ25GdW5jKHJlc3VsdCwgcHJvcHNbaW5kZXhdLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3RzIGB2YWx1ZWAgdG8gYW4gZW1wdHkgYXJyYXkgaWYgaXQncyBub3QgYW4gYXJyYXkgbGlrZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyB0aGUgY2FzdCBhcnJheS1saWtlIG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0QXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpID8gdmFsdWUgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIHRvIGBpZGVudGl0eWAgaWYgaXQncyBub3QgYSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgY2FzdCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0RnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlIDogaWRlbnRpdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYHZhbHVlYCB0byBhIHBhdGggYXJyYXkgaWYgaXQncyBub3Qgb25lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUsIG9iamVjdCkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0tleSh2YWx1ZSwgb2JqZWN0KSA/IFt2YWx1ZV0gOiBzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGBiYXNlUmVzdGAgYWxpYXMgd2hpY2ggY2FuIGJlIHJlcGxhY2VkIHdpdGggYGlkZW50aXR5YCBieSBtb2R1bGVcbiAgICAgKiByZXBsYWNlbWVudCBwbHVnaW5zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICB2YXIgY2FzdFJlc3QgPSBiYXNlUmVzdDtcblxuICAgIC8qKlxuICAgICAqIENhc3RzIGBhcnJheWAgdG8gYSBzbGljZSBpZiBpdCdzIG5lZWRlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHNsaWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RTbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogZW5kO1xuICAgICAgcmV0dXJuICghc3RhcnQgJiYgZW5kID49IGxlbmd0aCkgPyBhcnJheSA6IGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzaW1wbGUgd3JhcHBlciBhcm91bmQgdGhlIGdsb2JhbCBbYGNsZWFyVGltZW91dGBdKGh0dHBzOi8vbWRuLmlvL2NsZWFyVGltZW91dCkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfE9iamVjdH0gaWQgVGhlIHRpbWVyIGlkIG9yIHRpbWVvdXQgb2JqZWN0IG9mIHRoZSB0aW1lciB0byBjbGVhci5cbiAgICAgKi9cbiAgICB2YXIgY2xlYXJUaW1lb3V0ID0gY3R4Q2xlYXJUaW1lb3V0IHx8IGZ1bmN0aW9uKGlkKSB7XG4gICAgICByZXR1cm4gcm9vdC5jbGVhclRpbWVvdXQoaWQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgIGBidWZmZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIFRoZSBidWZmZXIgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYnVmZmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lQnVmZmVyKGJ1ZmZlciwgaXNEZWVwKSB7XG4gICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgIHJldHVybiBidWZmZXIuc2xpY2UoKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBidWZmZXIubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IGFsbG9jVW5zYWZlID8gYWxsb2NVbnNhZmUobGVuZ3RoKSA6IG5ldyBidWZmZXIuY29uc3RydWN0b3IobGVuZ3RoKTtcblxuICAgICAgYnVmZmVyLmNvcHkocmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGBhcnJheUJ1ZmZlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFycmF5QnVmZmVyIFRoZSBhcnJheSBidWZmZXIgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge0FycmF5QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYXJyYXkgYnVmZmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIpIHtcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgYXJyYXlCdWZmZXIuY29uc3RydWN0b3IoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICBuZXcgVWludDhBcnJheShyZXN1bHQpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGRhdGFWaWV3YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFWaWV3IFRoZSBkYXRhIHZpZXcgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgZGF0YSB2aWV3LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lRGF0YVZpZXcoZGF0YVZpZXcsIGlzRGVlcCkge1xuICAgICAgdmFyIGJ1ZmZlciA9IGlzRGVlcCA/IGNsb25lQXJyYXlCdWZmZXIoZGF0YVZpZXcuYnVmZmVyKSA6IGRhdGFWaWV3LmJ1ZmZlcjtcbiAgICAgIHJldHVybiBuZXcgZGF0YVZpZXcuY29uc3RydWN0b3IoYnVmZmVyLCBkYXRhVmlldy5ieXRlT2Zmc2V0LCBkYXRhVmlldy5ieXRlTGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHJlZ2V4cGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZWdleHAgVGhlIHJlZ2V4cCB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgcmVnZXhwLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lUmVnRXhwKHJlZ2V4cCkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyByZWdleHAuY29uc3RydWN0b3IocmVnZXhwLnNvdXJjZSwgcmVGbGFncy5leGVjKHJlZ2V4cCkpO1xuICAgICAgcmVzdWx0Lmxhc3RJbmRleCA9IHJlZ2V4cC5sYXN0SW5kZXg7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgYHN5bWJvbGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3ltYm9sIFRoZSBzeW1ib2wgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBzeW1ib2wgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lU3ltYm9sKHN5bWJvbCkge1xuICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YgPyBPYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpIDoge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGB0eXBlZEFycmF5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHR5cGVkQXJyYXkgVGhlIHR5cGVkIGFycmF5IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHR5cGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LCBpc0RlZXApIHtcbiAgICAgIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKHR5cGVkQXJyYXkuYnVmZmVyKSA6IHR5cGVkQXJyYXkuYnVmZmVyO1xuICAgICAgcmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlciwgdHlwZWRBcnJheS5ieXRlT2Zmc2V0LCB0eXBlZEFycmF5Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdmFsdWVzIHRvIHNvcnQgdGhlbSBpbiBhc2NlbmRpbmcgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYHZhbHVlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wYXJlQXNjZW5kaW5nKHZhbHVlLCBvdGhlcikge1xuICAgICAgaWYgKHZhbHVlICE9PSBvdGhlcikge1xuICAgICAgICB2YXIgdmFsSXNEZWZpbmVkID0gdmFsdWUgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICAgICAgdmFsSXNSZWZsZXhpdmUgPSB2YWx1ZSA9PT0gdmFsdWUsXG4gICAgICAgICAgICB2YWxJc1N5bWJvbCA9IGlzU3ltYm9sKHZhbHVlKTtcblxuICAgICAgICB2YXIgb3RoSXNEZWZpbmVkID0gb3RoZXIgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG90aElzTnVsbCA9IG90aGVyID09PSBudWxsLFxuICAgICAgICAgICAgb3RoSXNSZWZsZXhpdmUgPSBvdGhlciA9PT0gb3RoZXIsXG4gICAgICAgICAgICBvdGhJc1N5bWJvbCA9IGlzU3ltYm9sKG90aGVyKTtcblxuICAgICAgICBpZiAoKCFvdGhJc051bGwgJiYgIW90aElzU3ltYm9sICYmICF2YWxJc1N5bWJvbCAmJiB2YWx1ZSA+IG90aGVyKSB8fFxuICAgICAgICAgICAgKHZhbElzU3ltYm9sICYmIG90aElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSAmJiAhb3RoSXNOdWxsICYmICFvdGhJc1N5bWJvbCkgfHxcbiAgICAgICAgICAgICh2YWxJc051bGwgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgKCF2YWxJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAhdmFsSXNSZWZsZXhpdmUpIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKCF2YWxJc051bGwgJiYgIXZhbElzU3ltYm9sICYmICFvdGhJc1N5bWJvbCAmJiB2YWx1ZSA8IG90aGVyKSB8fFxuICAgICAgICAgICAgKG90aElzU3ltYm9sICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSAmJiAhdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCkgfHxcbiAgICAgICAgICAgIChvdGhJc051bGwgJiYgdmFsSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgKCFvdGhJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAhb3RoSXNSZWZsZXhpdmUpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8ub3JkZXJCeWAgdG8gY29tcGFyZSBtdWx0aXBsZSBwcm9wZXJ0aWVzIG9mIGEgdmFsdWUgdG8gYW5vdGhlclxuICAgICAqIGFuZCBzdGFibGUgc29ydCB0aGVtLlxuICAgICAqXG4gICAgICogSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXMgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIE90aGVyd2lzZSxcbiAgICAgKiBzcGVjaWZ5IGFuIG9yZGVyIG9mIFwiZGVzY1wiIGZvciBkZXNjZW5kaW5nIG9yIFwiYXNjXCIgZm9yIGFzY2VuZGluZyBzb3J0IG9yZGVyXG4gICAgICogb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtib29sZWFuW118c3RyaW5nW119IG9yZGVycyBUaGUgb3JkZXIgdG8gc29ydCBieSBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgb2JqQ3JpdGVyaWEgPSBvYmplY3QuY3JpdGVyaWEsXG4gICAgICAgICAgb3RoQ3JpdGVyaWEgPSBvdGhlci5jcml0ZXJpYSxcbiAgICAgICAgICBsZW5ndGggPSBvYmpDcml0ZXJpYS5sZW5ndGgsXG4gICAgICAgICAgb3JkZXJzTGVuZ3RoID0gb3JkZXJzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGNvbXBhcmVBc2NlbmRpbmcob2JqQ3JpdGVyaWFbaW5kZXhdLCBvdGhDcml0ZXJpYVtpbmRleF0pO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgaWYgKGluZGV4ID49IG9yZGVyc0xlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIG9yZGVyID0gb3JkZXJzW2luZGV4XTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0ICogKG9yZGVyID09ICdkZXNjJyA/IC0xIDogMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEZpeGVzIGFuIGBBcnJheSNzb3J0YCBidWcgaW4gdGhlIEpTIGVuZ2luZSBlbWJlZGRlZCBpbiBBZG9iZSBhcHBsaWNhdGlvbnNcbiAgICAgIC8vIHRoYXQgY2F1c2VzIGl0LCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHRvIHByb3ZpZGUgdGhlIHNhbWUgdmFsdWUgZm9yXG4gICAgICAvLyBgb2JqZWN0YCBhbmQgYG90aGVyYC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXNoa2VuYXMvdW5kZXJzY29yZS9wdWxsLzEyNDdcbiAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAvL1xuICAgICAgLy8gVGhpcyBhbHNvIGVuc3VyZXMgYSBzdGFibGUgc29ydCBpbiBWOCBhbmQgb3RoZXIgZW5naW5lcy5cbiAgICAgIC8vIFNlZSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD05MCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgcmV0dXJuIG9iamVjdC5pbmRleCAtIG90aGVyLmluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgdGhhdCBpcyB0aGUgY29tcG9zaXRpb24gb2YgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLFxuICAgICAqIHBsYWNlaG9sZGVycywgYW5kIHByb3ZpZGVkIGFyZ3VtZW50cyBpbnRvIGEgc2luZ2xlIGFycmF5IG9mIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBob2xkZXJzIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtcyB7Ym9vbGVhbn0gW2lzQ3VycmllZF0gU3BlY2lmeSBjb21wb3NpbmcgZm9yIGEgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCkge1xuICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aCxcbiAgICAgICAgICBob2xkZXJzTGVuZ3RoID0gaG9sZGVycy5sZW5ndGgsXG4gICAgICAgICAgbGVmdEluZGV4ID0gLTEsXG4gICAgICAgICAgbGVmdExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVmdExlbmd0aCArIHJhbmdlTGVuZ3RoKSxcbiAgICAgICAgICBpc1VuY3VycmllZCA9ICFpc0N1cnJpZWQ7XG5cbiAgICAgIHdoaWxlICgrK2xlZnRJbmRleCA8IGxlZnRMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsrYXJnc0luZGV4IDwgaG9sZGVyc0xlbmd0aCkge1xuICAgICAgICBpZiAoaXNVbmN1cnJpZWQgfHwgYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgICAgIHJlc3VsdFtob2xkZXJzW2FyZ3NJbmRleF1dID0gYXJnc1thcmdzSW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAocmFuZ2VMZW5ndGgtLSkge1xuICAgICAgICByZXN1bHRbbGVmdEluZGV4KytdID0gYXJnc1thcmdzSW5kZXgrK107XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgY29tcG9zZUFyZ3NgIGV4Y2VwdCB0aGF0IHRoZSBhcmd1bWVudHMgY29tcG9zaXRpb25cbiAgICAgKiBpcyB0YWlsb3JlZCBmb3IgYF8ucGFydGlhbFJpZ2h0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW1zIHtib29sZWFufSBbaXNDdXJyaWVkXSBTcGVjaWZ5IGNvbXBvc2luZyBmb3IgYSBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbXBvc2VkIGFyZ3VtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wb3NlQXJnc1JpZ2h0KGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzLCBpc0N1cnJpZWQpIHtcbiAgICAgIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgICAgICBhcmdzTGVuZ3RoID0gYXJncy5sZW5ndGgsXG4gICAgICAgICAgaG9sZGVyc0luZGV4ID0gLTEsXG4gICAgICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgICAgIHJpZ2h0SW5kZXggPSAtMSxcbiAgICAgICAgICByaWdodExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkocmFuZ2VMZW5ndGggKyByaWdodExlbmd0aCksXG4gICAgICAgICAgaXNVbmN1cnJpZWQgPSAhaXNDdXJyaWVkO1xuXG4gICAgICB3aGlsZSAoKythcmdzSW5kZXggPCByYW5nZUxlbmd0aCkge1xuICAgICAgICByZXN1bHRbYXJnc0luZGV4XSA9IGFyZ3NbYXJnc0luZGV4XTtcbiAgICAgIH1cbiAgICAgIHZhciBvZmZzZXQgPSBhcmdzSW5kZXg7XG4gICAgICB3aGlsZSAoKytyaWdodEluZGV4IDwgcmlnaHRMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W29mZnNldCArIHJpZ2h0SW5kZXhdID0gcGFydGlhbHNbcmlnaHRJbmRleF07XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytob2xkZXJzSW5kZXggPCBob2xkZXJzTGVuZ3RoKSB7XG4gICAgICAgIGlmIChpc1VuY3VycmllZCB8fCBhcmdzSW5kZXggPCBhcmdzTGVuZ3RoKSB7XG4gICAgICAgICAgcmVzdWx0W29mZnNldCArIGhvbGRlcnNbaG9sZGVyc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleCsrXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBgc291cmNlYCB0byBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIGZyb20uXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5PVtdXSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgdG8uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSwgYXJyYXkpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG5cbiAgICAgIGFycmF5IHx8IChhcnJheSA9IEFycmF5KGxlbmd0aCkpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gc291cmNlW2luZGV4XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgcHJvcGVydGllcyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyB0by5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb3BpZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UsIHByb3BzLCBvYmplY3QsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBpc05ldyA9ICFvYmplY3Q7XG4gICAgICBvYmplY3QgfHwgKG9iamVjdCA9IHt9KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuXG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgICAgICA/IGN1c3RvbWl6ZXIob2JqZWN0W2tleV0sIHNvdXJjZVtrZXldLCBrZXksIG9iamVjdCwgc291cmNlKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOZXcpIHtcbiAgICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBvd24gc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlTeW1ib2xzKHNvdXJjZSwgb2JqZWN0KSB7XG4gICAgICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHMoc291cmNlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgb3duIGFuZCBpbmhlcml0ZWQgc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlTeW1ib2xzSW4oc291cmNlLCBvYmplY3QpIHtcbiAgICAgIHJldHVybiBjb3B5T2JqZWN0KHNvdXJjZSwgZ2V0U3ltYm9sc0luKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uZ3JvdXBCeWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaW5pdGlhbGl6ZXJdIFRoZSBhY2N1bXVsYXRvciBvYmplY3QgaW5pdGlhbGl6ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWdncmVnYXRvciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlciwgaW5pdGlhbGl6ZXIpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUFnZ3JlZ2F0b3IgOiBiYXNlQWdncmVnYXRvcixcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gaW5pdGlhbGl6ZXIgPyBpbml0aWFsaXplcigpIDoge307XG5cbiAgICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgc2V0dGVyLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMiksIGFjY3VtdWxhdG9yKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uYXNzaWduYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduZXIgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYXNzaWduZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpIHtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIHNvdXJjZXMpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aCxcbiAgICAgICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPiAxID8gc291cmNlc1tsZW5ndGggLSAxXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgY3VzdG9taXplciA9IChhc3NpZ25lci5sZW5ndGggPiAzICYmIHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicpXG4gICAgICAgICAgPyAobGVuZ3RoLS0sIGN1c3RvbWl6ZXIpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPCAzID8gdW5kZWZpbmVkIDogY3VzdG9taXplcjtcbiAgICAgICAgICBsZW5ndGggPSAxO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICBhc3NpZ25lcihvYmplY3QsIHNvdXJjZSwgaW5kZXgsIGN1c3RvbWl6ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBiYXNlRWFjaGAgb3IgYGJhc2VFYWNoUmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGEgY29sbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLCBmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgICAgICAgIHJldHVybiBlYWNoRnVuYyhjb2xsZWN0aW9uLCBpdGVyYXRlZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuICAgICAgICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMSxcbiAgICAgICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuXG4gICAgICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2luZGV4XSwgaW5kZXgsIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJhc2UgZnVuY3Rpb24gZm9yIG1ldGhvZHMgbGlrZSBgXy5mb3JJbmAgYW5kIGBfLmZvck93bmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzRnVuYykge1xuICAgICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KG9iamVjdCksXG4gICAgICAgICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXG4gICAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgICAgdmFyIGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xuICAgICAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtrZXldLCBrZXksIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggdGhlIG9wdGlvbmFsIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUJpbmQoZnVuYywgYml0bWFzaywgdGhpc0FyZykge1xuICAgICAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYztcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ubG93ZXJGaXJzdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgU3RyaW5nYCBjYXNlIG1ldGhvZCB0byB1c2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FzZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDYXNlRmlyc3QobWV0aG9kTmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuXG4gICAgICAgIHZhciBzdHJTeW1ib2xzID0gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgICAgICAgPyBzdHJpbmdUb0FycmF5KHN0cmluZylcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICB2YXIgY2hyID0gc3RyU3ltYm9sc1xuICAgICAgICAgID8gc3RyU3ltYm9sc1swXVxuICAgICAgICAgIDogc3RyaW5nLmNoYXJBdCgwKTtcblxuICAgICAgICB2YXIgdHJhaWxpbmcgPSBzdHJTeW1ib2xzXG4gICAgICAgICAgPyBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMSkuam9pbignJylcbiAgICAgICAgICA6IHN0cmluZy5zbGljZSgxKTtcblxuICAgICAgICByZXR1cm4gY2hyW21ldGhvZE5hbWVdKCkgKyB0cmFpbGluZztcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uY2FtZWxDYXNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmUgZWFjaCB3b3JkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvdW5kZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICByZXR1cm4gYXJyYXlSZWR1Y2Uod29yZHMoZGVidXJyKHN0cmluZykucmVwbGFjZShyZUFwb3MsICcnKSksIGNhbGxiYWNrLCAnJyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIGFuIGluc3RhbmNlIG9mIGBDdG9yYCByZWdhcmRsZXNzIG9mXG4gICAgICogd2hldGhlciBpdCB3YXMgaW52b2tlZCBhcyBwYXJ0IG9mIGEgYG5ld2AgZXhwcmVzc2lvbiBvciBieSBgY2FsbGAgb3IgYGFwcGx5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gQ3RvciBUaGUgY29uc3RydWN0b3IgdG8gd3JhcC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUN0b3IoQ3Rvcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBVc2UgYSBgc3dpdGNoYCBzdGF0ZW1lbnQgdG8gd29yayB3aXRoIGNsYXNzIGNvbnN0cnVjdG9ycy4gU2VlXG4gICAgICAgIC8vIGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtZnVuY3Rpb24tb2JqZWN0cy1jYWxsLXRoaXNhcmd1bWVudC1hcmd1bWVudHNsaXN0XG4gICAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEN0b3I7XG4gICAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSk7XG4gICAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgICAgY2FzZSA0OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICAgICAgY2FzZSA1OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSk7XG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSk7XG4gICAgICAgICAgY2FzZSA3OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSwgYXJnc1s2XSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRoaXNCaW5kaW5nID0gYmFzZUNyZWF0ZShDdG9yLnByb3RvdHlwZSksXG4gICAgICAgICAgICByZXN1bHQgPSBDdG9yLmFwcGx5KHRoaXNCaW5kaW5nLCBhcmdzKTtcblxuICAgICAgICAvLyBNaW1pYyB0aGUgY29uc3RydWN0b3IncyBgcmV0dXJuYCBiZWhhdmlvci5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDEzLjIuMiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IHRoaXNCaW5kaW5nO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gZW5hYmxlIGN1cnJ5aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFyaXR5IFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDdXJyeShmdW5jLCBiaXRtYXNrLCBhcml0eSkge1xuICAgICAgdmFyIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGgsXG4gICAgICAgICAgICBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKTtcblxuICAgICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICAgIGFyZ3NbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaG9sZGVycyA9IChsZW5ndGggPCAzICYmIGFyZ3NbMF0gIT09IHBsYWNlaG9sZGVyICYmIGFyZ3NbbGVuZ3RoIC0gMV0gIT09IHBsYWNlaG9sZGVyKVxuICAgICAgICAgID8gW11cbiAgICAgICAgICA6IHJlcGxhY2VIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcblxuICAgICAgICBsZW5ndGggLT0gaG9sZGVycy5sZW5ndGg7XG4gICAgICAgIGlmIChsZW5ndGggPCBhcml0eSkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB1bmRlZmluZWQsXG4gICAgICAgICAgICBhcmdzLCBob2xkZXJzLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkgLSBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG4gICAgICAgIHJldHVybiBhcHBseShmbiwgdGhpcywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8uZmluZGAgb3IgYF8uZmluZExhc3RgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaW5kSW5kZXhGdW5jIFRoZSBmdW5jdGlvbiB0byBmaW5kIHRoZSBjb2xsZWN0aW9uIGluZGV4LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZpbmQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlRmluZChmaW5kSW5kZXhGdW5jKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgICAgICAgdmFyIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuICAgICAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgdmFyIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKTtcbiAgICAgICAgICBjb2xsZWN0aW9uID0ga2V5cyhjb2xsZWN0aW9uKTtcbiAgICAgICAgICBwcmVkaWNhdGUgPSBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpOyB9O1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbmRleCA9IGZpbmRJbmRleEZ1bmMoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpO1xuICAgICAgICByZXR1cm4gaW5kZXggPiAtMSA/IGl0ZXJhYmxlW2l0ZXJhdGVlID8gY29sbGVjdGlvbltpbmRleF0gOiBpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5mbG93YCBvciBgXy5mbG93UmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmbG93IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUZsb3coZnJvbVJpZ2h0KSB7XG4gICAgICByZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oZnVuY3MpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IGZ1bmNzLmxlbmd0aCxcbiAgICAgICAgICAgIGluZGV4ID0gbGVuZ3RoLFxuICAgICAgICAgICAgcHJlcmVxID0gTG9kYXNoV3JhcHBlci5wcm90b3R5cGUudGhydTtcblxuICAgICAgICBpZiAoZnJvbVJpZ2h0KSB7XG4gICAgICAgICAgZnVuY3MucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgICAgdmFyIGZ1bmMgPSBmdW5jc1tpbmRleF07XG4gICAgICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByZXJlcSAmJiAhd3JhcHBlciAmJiBnZXRGdW5jTmFtZShmdW5jKSA9PSAnd3JhcHBlcicpIHtcbiAgICAgICAgICAgIHZhciB3cmFwcGVyID0gbmV3IExvZGFzaFdyYXBwZXIoW10sIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IHdyYXBwZXIgPyBpbmRleCA6IGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBmdW5jID0gZnVuY3NbaW5kZXhdO1xuXG4gICAgICAgICAgdmFyIGZ1bmNOYW1lID0gZ2V0RnVuY05hbWUoZnVuYyksXG4gICAgICAgICAgICAgIGRhdGEgPSBmdW5jTmFtZSA9PSAnd3JhcHBlcicgPyBnZXREYXRhKGZ1bmMpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgaWYgKGRhdGEgJiYgaXNMYXppYWJsZShkYXRhWzBdKSAmJlxuICAgICAgICAgICAgICAgIGRhdGFbMV0gPT0gKFdSQVBfQVJZX0ZMQUcgfCBXUkFQX0NVUlJZX0ZMQUcgfCBXUkFQX1BBUlRJQUxfRkxBRyB8IFdSQVBfUkVBUkdfRkxBRykgJiZcbiAgICAgICAgICAgICAgICAhZGF0YVs0XS5sZW5ndGggJiYgZGF0YVs5XSA9PSAxXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgd3JhcHBlciA9IHdyYXBwZXJbZ2V0RnVuY05hbWUoZGF0YVswXSldLmFwcGx5KHdyYXBwZXIsIGRhdGFbM10pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3cmFwcGVyID0gKGZ1bmMubGVuZ3RoID09IDEgJiYgaXNMYXppYWJsZShmdW5jKSlcbiAgICAgICAgICAgICAgPyB3cmFwcGVyW2Z1bmNOYW1lXSgpXG4gICAgICAgICAgICAgIDogd3JhcHBlci50aHJ1KGZ1bmMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICAgIHZhbHVlID0gYXJnc1swXTtcblxuICAgICAgICAgIGlmICh3cmFwcGVyICYmIGFyZ3MubGVuZ3RoID09IDEgJiYgaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVyLnBsYW50KHZhbHVlKS52YWx1ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgICAgICByZXN1bHQgPSBsZW5ndGggPyBmdW5jc1tpbmRleF0uYXBwbHkodGhpcywgYXJncykgOiB2YWx1ZTtcblxuICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmdW5jc1tpbmRleF0uY2FsbCh0aGlzLCByZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIG9wdGlvbmFsIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLCBwYXJ0aWFsIGFwcGxpY2F0aW9uLCBhbmQgY3VycnlpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc1JpZ2h0XSBUaGUgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aG9zZSBwcm92aWRlZFxuICAgICAqICB0byB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzUmlnaHRdIFRoZSBgcGFydGlhbHNSaWdodGAgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVIeWJyaWQoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCwgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gICAgICB2YXIgaXNBcnkgPSBiaXRtYXNrICYgV1JBUF9BUllfRkxBRyxcbiAgICAgICAgICBpc0JpbmQgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcsXG4gICAgICAgICAgaXNCaW5kS2V5ID0gYml0bWFzayAmIFdSQVBfQklORF9LRVlfRkxBRyxcbiAgICAgICAgICBpc0N1cnJpZWQgPSBiaXRtYXNrICYgKFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRyksXG4gICAgICAgICAgaXNGbGlwID0gYml0bWFzayAmIFdSQVBfRkxJUF9GTEFHLFxuICAgICAgICAgIEN0b3IgPSBpc0JpbmRLZXkgPyB1bmRlZmluZWQgOiBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgICBhcmdzW2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQ3VycmllZCkge1xuICAgICAgICAgIHZhciBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKSxcbiAgICAgICAgICAgICAgaG9sZGVyc0NvdW50ID0gY291bnRIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydGlhbHMpIHtcbiAgICAgICAgICBhcmdzID0gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRpYWxzUmlnaHQpIHtcbiAgICAgICAgICBhcmdzID0gY29tcG9zZUFyZ3NSaWdodChhcmdzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsIGlzQ3VycmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGVuZ3RoIC09IGhvbGRlcnNDb3VudDtcbiAgICAgICAgaWYgKGlzQ3VycmllZCAmJiBsZW5ndGggPCBhcml0eSkge1xuICAgICAgICAgIHZhciBuZXdIb2xkZXJzID0gcmVwbGFjZUhvbGRlcnMoYXJncywgcGxhY2Vob2xkZXIpO1xuICAgICAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB0aGlzQXJnLFxuICAgICAgICAgICAgYXJncywgbmV3SG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5IC0gbGVuZ3RoXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGhpc0JpbmRpbmcgPSBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcyxcbiAgICAgICAgICAgIGZuID0gaXNCaW5kS2V5ID8gdGhpc0JpbmRpbmdbZnVuY10gOiBmdW5jO1xuXG4gICAgICAgIGxlbmd0aCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICBpZiAoYXJnUG9zKSB7XG4gICAgICAgICAgYXJncyA9IHJlb3JkZXIoYXJncywgYXJnUG9zKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0ZsaXAgJiYgbGVuZ3RoID4gMSkge1xuICAgICAgICAgIGFyZ3MucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0FyeSAmJiBhcnkgPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcmdzLmxlbmd0aCA9IGFyeTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSB7XG4gICAgICAgICAgZm4gPSBDdG9yIHx8IGNyZWF0ZUN0b3IoZm4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzQmluZGluZywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5pbnZlcnRCeWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0b0l0ZXJhdGVlIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIGl0ZXJhdGVlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZlcnRlcihzZXR0ZXIsIHRvSXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52ZXJ0ZXIob2JqZWN0LCBzZXR0ZXIsIHRvSXRlcmF0ZWUoaXRlcmF0ZWUpLCB7fSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbiBvbiB0d28gdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcGVyYXRvciBUaGUgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgdXNlZCBmb3IgYHVuZGVmaW5lZGAgYXJndW1lbnRzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1hdGhlbWF0aWNhbCBvcGVyYXRpb24gZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlTWF0aE9wZXJhdGlvbihvcGVyYXRvciwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIG90aGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG90aGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvdGhlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb3RoZXIgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhbHVlID0gYmFzZVRvU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgIG90aGVyID0gYmFzZVRvU3RyaW5nKG90aGVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBiYXNlVG9OdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgb3RoZXIgPSBiYXNlVG9OdW1iZXIob3RoZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSBvcGVyYXRvcih2YWx1ZSwgb3RoZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLm92ZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhcnJheUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBpdGVyYXRlZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgb3ZlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVPdmVyKGFycmF5RnVuYykge1xuICAgICAgcmV0dXJuIGZsYXRSZXN0KGZ1bmN0aW9uKGl0ZXJhdGVlcykge1xuICAgICAgICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMsIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7XG4gICAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgICAgdmFyIHRoaXNBcmcgPSB0aGlzO1xuICAgICAgICAgIHJldHVybiBhcnJheUZ1bmMoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgICAgcmV0dXJuIGFwcGx5KGl0ZXJhdGVlLCB0aGlzQXJnLCBhcmdzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBwYWRkaW5nIGZvciBgc3RyaW5nYCBiYXNlZCBvbiBgbGVuZ3RoYC4gVGhlIGBjaGFyc2Agc3RyaW5nXG4gICAgICogaXMgdHJ1bmNhdGVkIGlmIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBleGNlZWRzIGBsZW5ndGhgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGluZyBmb3IgYHN0cmluZ2AuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUGFkZGluZyhsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBjaGFycyA9IGNoYXJzID09PSB1bmRlZmluZWQgPyAnICcgOiBiYXNlVG9TdHJpbmcoY2hhcnMpO1xuXG4gICAgICB2YXIgY2hhcnNMZW5ndGggPSBjaGFycy5sZW5ndGg7XG4gICAgICBpZiAoY2hhcnNMZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiBjaGFyc0xlbmd0aCA/IGJhc2VSZXBlYXQoY2hhcnMsIGxlbmd0aCkgOiBjaGFycztcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlUmVwZWF0KGNoYXJzLCBuYXRpdmVDZWlsKGxlbmd0aCAvIHN0cmluZ1NpemUoY2hhcnMpKSk7XG4gICAgICByZXR1cm4gaGFzVW5pY29kZShjaGFycylcbiAgICAgICAgPyBjYXN0U2xpY2Uoc3RyaW5nVG9BcnJheShyZXN1bHQpLCAwLCBsZW5ndGgpLmpvaW4oJycpXG4gICAgICAgIDogcmVzdWx0LnNsaWNlKDAsIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZ1xuICAgICAqIG9mIGB0aGlzQXJnYCBhbmQgYHBhcnRpYWxzYCBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUGFydGlhbChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgICAgICBsZWZ0SW5kZXggPSAtMSxcbiAgICAgICAgICAgIGxlZnRMZW5ndGggPSBwYXJ0aWFscy5sZW5ndGgsXG4gICAgICAgICAgICBhcmdzID0gQXJyYXkobGVmdExlbmd0aCArIGFyZ3NMZW5ndGgpLFxuICAgICAgICAgICAgZm4gPSAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSA/IEN0b3IgOiBmdW5jO1xuXG4gICAgICAgIHdoaWxlICgrK2xlZnRJbmRleCA8IGxlZnRMZW5ndGgpIHtcbiAgICAgICAgICBhcmdzW2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChhcmdzTGVuZ3RoLS0pIHtcbiAgICAgICAgICBhcmdzW2xlZnRJbmRleCsrXSA9IGFyZ3VtZW50c1srK2FyZ3NJbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5KGZuLCBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8ucmFuZ2VgIG9yIGBfLnJhbmdlUmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByYW5nZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSYW5nZShmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzdGFydCwgZW5kLCBzdGVwKSB7XG4gICAgICAgIGlmIChzdGVwICYmIHR5cGVvZiBzdGVwICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKHN0YXJ0LCBlbmQsIHN0ZXApKSB7XG4gICAgICAgICAgZW5kID0gc3RlcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgdGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgICAgIHN0YXJ0ID0gdG9GaW5pdGUoc3RhcnQpO1xuICAgICAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBlbmQgPSBzdGFydDtcbiAgICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICAgICAgfVxuICAgICAgICBzdGVwID0gc3RlcCA9PT0gdW5kZWZpbmVkID8gKHN0YXJ0IDwgZW5kID8gMSA6IC0xKSA6IHRvRmluaXRlKHN0ZXApO1xuICAgICAgICByZXR1cm4gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgcmVsYXRpb25hbCBvcGVyYXRpb24gb24gdHdvIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3BlcmF0b3IgVGhlIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZWxhdGlvbmFsIG9wZXJhdGlvbiBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKG9wZXJhdG9yKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICAgIGlmICghKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyAmJiB0eXBlb2Ygb3RoZXIgPT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gICAgICAgICAgb3RoZXIgPSB0b051bWJlcihvdGhlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9wZXJhdG9yKHZhbHVlLCBvdGhlcik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBjb250aW51ZSBjdXJyeWluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHdyYXBGdW5jIFRoZSBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIGBmdW5jYCB3cmFwcGVyLlxuICAgICAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQgdG9cbiAgICAgKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSZWN1cnJ5KGZ1bmMsIGJpdG1hc2ssIHdyYXBGdW5jLCBwbGFjZWhvbGRlciwgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICAgICAgdmFyIGlzQ3VycnkgPSBiaXRtYXNrICYgV1JBUF9DVVJSWV9GTEFHLFxuICAgICAgICAgIG5ld0hvbGRlcnMgPSBpc0N1cnJ5ID8gaG9sZGVycyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBuZXdIb2xkZXJzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkIDogaG9sZGVycyxcbiAgICAgICAgICBuZXdQYXJ0aWFscyA9IGlzQ3VycnkgPyBwYXJ0aWFscyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBuZXdQYXJ0aWFsc1JpZ2h0ID0gaXNDdXJyeSA/IHVuZGVmaW5lZCA6IHBhcnRpYWxzO1xuXG4gICAgICBiaXRtYXNrIHw9IChpc0N1cnJ5ID8gV1JBUF9QQVJUSUFMX0ZMQUcgOiBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7XG4gICAgICBiaXRtYXNrICY9IH4oaXNDdXJyeSA/IFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHIDogV1JBUF9QQVJUSUFMX0ZMQUcpO1xuXG4gICAgICBpZiAoIShiaXRtYXNrICYgV1JBUF9DVVJSWV9CT1VORF9GTEFHKSkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9CSU5EX0ZMQUcgfCBXUkFQX0JJTkRfS0VZX0ZMQUcpO1xuICAgICAgfVxuICAgICAgdmFyIG5ld0RhdGEgPSBbXG4gICAgICAgIGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIG5ld1BhcnRpYWxzLCBuZXdIb2xkZXJzLCBuZXdQYXJ0aWFsc1JpZ2h0LFxuICAgICAgICBuZXdIb2xkZXJzUmlnaHQsIGFyZ1BvcywgYXJ5LCBhcml0eVxuICAgICAgXTtcblxuICAgICAgdmFyIHJlc3VsdCA9IHdyYXBGdW5jLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gICAgICBpZiAoaXNMYXppYWJsZShmdW5jKSkge1xuICAgICAgICBzZXREYXRhKHJlc3VsdCwgbmV3RGF0YSk7XG4gICAgICB9XG4gICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiBzZXRXcmFwVG9TdHJpbmcocmVzdWx0LCBmdW5jLCBiaXRtYXNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5yb3VuZGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgTWF0aGAgbWV0aG9kIHRvIHVzZSB3aGVuIHJvdW5kaW5nLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJvdW5kIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJvdW5kKG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBmdW5jID0gTWF0aFttZXRob2ROYW1lXTtcbiAgICAgIHJldHVybiBmdW5jdGlvbihudW1iZXIsIHByZWNpc2lvbikge1xuICAgICAgICBudW1iZXIgPSB0b051bWJlcihudW1iZXIpO1xuICAgICAgICBwcmVjaXNpb24gPSBwcmVjaXNpb24gPT0gbnVsbCA/IDAgOiBuYXRpdmVNaW4odG9JbnRlZ2VyKHByZWNpc2lvbiksIDI5Mik7XG4gICAgICAgIGlmIChwcmVjaXNpb24gJiYgbmF0aXZlSXNGaW5pdGUobnVtYmVyKSkge1xuICAgICAgICAgIC8vIFNoaWZ0IHdpdGggZXhwb25lbnRpYWwgbm90YXRpb24gdG8gYXZvaWQgZmxvYXRpbmctcG9pbnQgaXNzdWVzLlxuICAgICAgICAgIC8vIFNlZSBbTUROXShodHRwczovL21kbi5pby9yb3VuZCNFeGFtcGxlcykgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgICB2YXIgcGFpciA9ICh0b1N0cmluZyhudW1iZXIpICsgJ2UnKS5zcGxpdCgnZScpLFxuICAgICAgICAgICAgICB2YWx1ZSA9IGZ1bmMocGFpclswXSArICdlJyArICgrcGFpclsxXSArIHByZWNpc2lvbikpO1xuXG4gICAgICAgICAgcGFpciA9ICh0b1N0cmluZyh2YWx1ZSkgKyAnZScpLnNwbGl0KCdlJyk7XG4gICAgICAgICAgcmV0dXJuICsocGFpclswXSArICdlJyArICgrcGFpclsxXSAtIHByZWNpc2lvbikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jKG51bWJlcik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzZXQgb2JqZWN0IG9mIGB2YWx1ZXNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhZGQgdG8gdGhlIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgc2V0LlxuICAgICAqL1xuICAgIHZhciBjcmVhdGVTZXQgPSAhKFNldCAmJiAoMSAvIHNldFRvQXJyYXkobmV3IFNldChbLC0wXSkpWzFdKSA9PSBJTkZJTklUWSkgPyBub29wIDogZnVuY3Rpb24odmFsdWVzKSB7XG4gICAgICByZXR1cm4gbmV3IFNldCh2YWx1ZXMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8udG9QYWlyc2Agb3IgYF8udG9QYWlyc0luYCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBhIGdpdmVuIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYWlycyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVUb1BhaXJzKGtleXNGdW5jKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHZhciB0YWcgPSBnZXRUYWcob2JqZWN0KTtcbiAgICAgICAgaWYgKHRhZyA9PSBtYXBUYWcpIHtcbiAgICAgICAgICByZXR1cm4gbWFwVG9BcnJheShvYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWcgPT0gc2V0VGFnKSB7XG4gICAgICAgICAgcmV0dXJuIHNldFRvUGFpcnMob2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmFzZVRvUGFpcnMob2JqZWN0LCBrZXlzRnVuYyhvYmplY3QpKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgZWl0aGVyIGN1cnJpZXMgb3IgaW52b2tlcyBgZnVuY2Agd2l0aCBvcHRpb25hbFxuICAgICAqIGB0aGlzYCBiaW5kaW5nIGFuZCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICAgICAqICAgIDEgLSBgXy5iaW5kYFxuICAgICAqICAgIDIgLSBgXy5iaW5kS2V5YFxuICAgICAqICAgIDQgLSBgXy5jdXJyeWAgb3IgYF8uY3VycnlSaWdodGAgb2YgYSBib3VuZCBmdW5jdGlvblxuICAgICAqICAgIDggLSBgXy5jdXJyeWBcbiAgICAgKiAgIDE2IC0gYF8uY3VycnlSaWdodGBcbiAgICAgKiAgIDMyIC0gYF8ucGFydGlhbGBcbiAgICAgKiAgIDY0IC0gYF8ucGFydGlhbFJpZ2h0YFxuICAgICAqICAxMjggLSBgXy5yZWFyZ2BcbiAgICAgKiAgMjU2IC0gYF8uYXJ5YFxuICAgICAqICA1MTIgLSBgXy5mbGlwYFxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVdyYXAoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICAgICAgdmFyIGlzQmluZEtleSA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfS0VZX0ZMQUc7XG4gICAgICBpZiAoIWlzQmluZEtleSAmJiB0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBwYXJ0aWFscyA/IHBhcnRpYWxzLmxlbmd0aCA6IDA7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9QQVJUSUFMX0ZMQUcgfCBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7XG4gICAgICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGFyeSA9IGFyeSA9PT0gdW5kZWZpbmVkID8gYXJ5IDogbmF0aXZlTWF4KHRvSW50ZWdlcihhcnkpLCAwKTtcbiAgICAgIGFyaXR5ID0gYXJpdHkgPT09IHVuZGVmaW5lZCA/IGFyaXR5IDogdG9JbnRlZ2VyKGFyaXR5KTtcbiAgICAgIGxlbmd0aCAtPSBob2xkZXJzID8gaG9sZGVycy5sZW5ndGggOiAwO1xuXG4gICAgICBpZiAoYml0bWFzayAmIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHKSB7XG4gICAgICAgIHZhciBwYXJ0aWFsc1JpZ2h0ID0gcGFydGlhbHMsXG4gICAgICAgICAgICBob2xkZXJzUmlnaHQgPSBob2xkZXJzO1xuXG4gICAgICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHZhciBkYXRhID0gaXNCaW5kS2V5ID8gdW5kZWZpbmVkIDogZ2V0RGF0YShmdW5jKTtcblxuICAgICAgdmFyIG5ld0RhdGEgPSBbXG4gICAgICAgIGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsXG4gICAgICAgIGFyZ1BvcywgYXJ5LCBhcml0eVxuICAgICAgXTtcblxuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgbWVyZ2VEYXRhKG5ld0RhdGEsIGRhdGEpO1xuICAgICAgfVxuICAgICAgZnVuYyA9IG5ld0RhdGFbMF07XG4gICAgICBiaXRtYXNrID0gbmV3RGF0YVsxXTtcbiAgICAgIHRoaXNBcmcgPSBuZXdEYXRhWzJdO1xuICAgICAgcGFydGlhbHMgPSBuZXdEYXRhWzNdO1xuICAgICAgaG9sZGVycyA9IG5ld0RhdGFbNF07XG4gICAgICBhcml0eSA9IG5ld0RhdGFbOV0gPSBuZXdEYXRhWzldID09PSB1bmRlZmluZWRcbiAgICAgICAgPyAoaXNCaW5kS2V5ID8gMCA6IGZ1bmMubGVuZ3RoKVxuICAgICAgICA6IG5hdGl2ZU1heChuZXdEYXRhWzldIC0gbGVuZ3RoLCAwKTtcblxuICAgICAgaWYgKCFhcml0eSAmJiBiaXRtYXNrICYgKFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRykpIHtcbiAgICAgICAgYml0bWFzayAmPSB+KFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRyk7XG4gICAgICB9XG4gICAgICBpZiAoIWJpdG1hc2sgfHwgYml0bWFzayA9PSBXUkFQX0JJTkRfRkxBRykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlQmluZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnKTtcbiAgICAgIH0gZWxzZSBpZiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcgfHwgYml0bWFzayA9PSBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlQ3VycnkoZnVuYywgYml0bWFzaywgYXJpdHkpO1xuICAgICAgfSBlbHNlIGlmICgoYml0bWFzayA9PSBXUkFQX1BBUlRJQUxfRkxBRyB8fCBiaXRtYXNrID09IChXUkFQX0JJTkRfRkxBRyB8IFdSQVBfUEFSVElBTF9GTEFHKSkgJiYgIWhvbGRlcnMubGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdCA9IGNyZWF0ZVBhcnRpYWwoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlSHlicmlkLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gICAgICB9XG4gICAgICB2YXIgc2V0dGVyID0gZGF0YSA/IGJhc2VTZXREYXRhIDogc2V0RGF0YTtcbiAgICAgIHJldHVybiBzZXRXcmFwVG9TdHJpbmcoc2V0dGVyKHJlc3VsdCwgbmV3RGF0YSksIGZ1bmMsIGJpdG1hc2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8uZGVmYXVsdHNgIHRvIGN1c3RvbWl6ZSBpdHMgYF8uYXNzaWduSW5gIHVzZSB0byBhc3NpZ24gcHJvcGVydGllc1xuICAgICAqIG9mIHNvdXJjZSBvYmplY3RzIHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgZm9yIGFsbCBkZXN0aW5hdGlvbiBwcm9wZXJ0aWVzXG4gICAgICogdGhhdCByZXNvbHZlIHRvIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IG9ialZhbHVlIFRoZSBkZXN0aW5hdGlvbiB2YWx1ZS5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSBzb3VyY2UgdmFsdWUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgcGFyZW50IG9iamVjdCBvZiBgb2JqVmFsdWVgLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VzdG9tRGVmYXVsdHNBc3NpZ25JbihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICBpZiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIChlcShvYmpWYWx1ZSwgb2JqZWN0UHJvdG9ba2V5XSkgJiYgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICByZXR1cm4gc3JjVmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqVmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5kZWZhdWx0c0RlZXBgIHRvIGN1c3RvbWl6ZSBpdHMgYF8ubWVyZ2VgIHVzZSB0byBtZXJnZSBzb3VyY2VcbiAgICAgKiBvYmplY3RzIGludG8gZGVzdGluYXRpb24gb2JqZWN0cyB0aGF0IGFyZSBwYXNzZWQgdGhydS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBvYmpWYWx1ZSBUaGUgZGVzdGluYXRpb24gdmFsdWUuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgc291cmNlIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gbWVyZ2UuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgcGFyZW50IG9iamVjdCBvZiBgb2JqVmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHBhcmVudCBvYmplY3Qgb2YgYHNyY1ZhbHVlYC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZFxuICAgICAqICBjb3VudGVycGFydHMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXN0b21EZWZhdWx0c01lcmdlKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spIHtcbiAgICAgIGlmIChpc09iamVjdChvYmpWYWx1ZSkgJiYgaXNPYmplY3Qoc3JjVmFsdWUpKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IG1lcmdlIG9iamVjdHMgYW5kIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBzdGFjay5zZXQoc3JjVmFsdWUsIG9ialZhbHVlKTtcbiAgICAgICAgYmFzZU1lcmdlKG9ialZhbHVlLCBzcmNWYWx1ZSwgdW5kZWZpbmVkLCBjdXN0b21EZWZhdWx0c01lcmdlLCBzdGFjayk7XG4gICAgICAgIHN0YWNrWydkZWxldGUnXShzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqVmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5vbWl0YCB0byBjdXN0b21pemUgaXRzIGBfLmNsb25lRGVlcGAgdXNlIHRvIG9ubHkgY2xvbmUgcGxhaW5cbiAgICAgKiBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdW5jbG9uZWQgdmFsdWUgb3IgYHVuZGVmaW5lZGAgdG8gZGVmZXIgY2xvbmluZyB0byBgXy5jbG9uZURlZXBgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1c3RvbU9taXRDbG9uZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzUGxhaW5PYmplY3QodmFsdWUpID8gdW5kZWZpbmVkIDogdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBhcnJheXMgd2l0aCBzdXBwb3J0IGZvclxuICAgICAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtBcnJheX0gb3RoZXIgVGhlIG90aGVyIGFycmF5IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgYXJyYXlgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcnJheXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICAgICAgYXJyTGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIG90aExlbmd0aCA9IG90aGVyLmxlbmd0aDtcblxuICAgICAgaWYgKGFyckxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIShpc1BhcnRpYWwgJiYgb3RoTGVuZ3RoID4gYXJyTGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBDaGVjayB0aGF0IGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgdmFyIGFyclN0YWNrZWQgPSBzdGFjay5nZXQoYXJyYXkpO1xuICAgICAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICAgICAgaWYgKGFyclN0YWNrZWQgJiYgb3RoU3RhY2tlZCkge1xuICAgICAgICByZXR1cm4gYXJyU3RhY2tlZCA9PSBvdGhlciAmJiBvdGhTdGFja2VkID09IGFycmF5O1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgcmVzdWx0ID0gdHJ1ZSxcbiAgICAgICAgICBzZWVuID0gKGJpdG1hc2sgJiBDT01QQVJFX1VOT1JERVJFRF9GTEFHKSA/IG5ldyBTZXRDYWNoZSA6IHVuZGVmaW5lZDtcblxuICAgICAgc3RhY2suc2V0KGFycmF5LCBvdGhlcik7XG4gICAgICBzdGFjay5zZXQob3RoZXIsIGFycmF5KTtcblxuICAgICAgLy8gSWdub3JlIG5vbi1pbmRleCBwcm9wZXJ0aWVzLlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBhcnJMZW5ndGgpIHtcbiAgICAgICAgdmFyIGFyclZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltpbmRleF07XG5cbiAgICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgICAgICB2YXIgY29tcGFyZWQgPSBpc1BhcnRpYWxcbiAgICAgICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgYXJyVmFsdWUsIGluZGV4LCBvdGhlciwgYXJyYXksIHN0YWNrKVxuICAgICAgICAgICAgOiBjdXN0b21pemVyKGFyclZhbHVlLCBvdGhWYWx1ZSwgaW5kZXgsIGFycmF5LCBvdGhlciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21wYXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGNvbXBhcmVkKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgaWYgKHNlZW4pIHtcbiAgICAgICAgICBpZiAoIWFycmF5U29tZShvdGhlciwgZnVuY3Rpb24ob3RoVmFsdWUsIG90aEluZGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjYWNoZUhhcyhzZWVuLCBvdGhJbmRleCkgJiZcbiAgICAgICAgICAgICAgICAgICAgKGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghKFxuICAgICAgICAgICAgICBhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHxcbiAgICAgICAgICAgICAgICBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaylcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RhY2tbJ2RlbGV0ZSddKGFycmF5KTtcbiAgICAgIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3IgY29tcGFyaW5nIG9iamVjdHMgb2ZcbiAgICAgKiB0aGUgc2FtZSBgdG9TdHJpbmdUYWdgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjb21wYXJpbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICAgICAqIGBCb29sZWFuYCwgYERhdGVgLCBgRXJyb3JgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIG9yIGBTdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdHMgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCB0YWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgICAgICAob2JqZWN0LmJ5dGVPZmZzZXQgIT0gb3RoZXIuYnl0ZU9mZnNldCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb2JqZWN0ID0gb2JqZWN0LmJ1ZmZlcjtcbiAgICAgICAgICBvdGhlciA9IG90aGVyLmJ1ZmZlcjtcblxuICAgICAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAgICAgIWVxdWFsRnVuYyhuZXcgVWludDhBcnJheShvYmplY3QpLCBuZXcgVWludDhBcnJheShvdGhlcikpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIGNhc2UgYm9vbFRhZzpcbiAgICAgICAgY2FzZSBkYXRlVGFnOlxuICAgICAgICBjYXNlIG51bWJlclRhZzpcbiAgICAgICAgICAvLyBDb2VyY2UgYm9vbGVhbnMgdG8gYDFgIG9yIGAwYCBhbmQgZGF0ZXMgdG8gbWlsbGlzZWNvbmRzLlxuICAgICAgICAgIC8vIEludmFsaWQgZGF0ZXMgYXJlIGNvZXJjZWQgdG8gYE5hTmAuXG4gICAgICAgICAgcmV0dXJuIGVxKCtvYmplY3QsICtvdGhlcik7XG5cbiAgICAgICAgY2FzZSBlcnJvclRhZzpcbiAgICAgICAgICByZXR1cm4gb2JqZWN0Lm5hbWUgPT0gb3RoZXIubmFtZSAmJiBvYmplY3QubWVzc2FnZSA9PSBvdGhlci5tZXNzYWdlO1xuXG4gICAgICAgIGNhc2UgcmVnZXhwVGFnOlxuICAgICAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgICAgICAvLyBDb2VyY2UgcmVnZXhlcyB0byBzdHJpbmdzIGFuZCB0cmVhdCBzdHJpbmdzLCBwcmltaXRpdmVzIGFuZCBvYmplY3RzLFxuICAgICAgICAgIC8vIGFzIGVxdWFsLiBTZWUgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXJlZ2V4cC5wcm90b3R5cGUudG9zdHJpbmdcbiAgICAgICAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICAgIHJldHVybiBvYmplY3QgPT0gKG90aGVyICsgJycpO1xuXG4gICAgICAgIGNhc2UgbWFwVGFnOlxuICAgICAgICAgIHZhciBjb252ZXJ0ID0gbWFwVG9BcnJheTtcblxuICAgICAgICBjYXNlIHNldFRhZzpcbiAgICAgICAgICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHO1xuICAgICAgICAgIGNvbnZlcnQgfHwgKGNvbnZlcnQgPSBzZXRUb0FycmF5KTtcblxuICAgICAgICAgIGlmIChvYmplY3Quc2l6ZSAhPSBvdGhlci5zaXplICYmICFpc1BhcnRpYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQXNzdW1lIGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgICAgIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KG9iamVjdCk7XG4gICAgICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGFja2VkID09IG90aGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBiaXRtYXNrIHw9IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUc7XG5cbiAgICAgICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSwgY29udmVydChvdGhlciksIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgICAgICAgIHN0YWNrWydkZWxldGUnXShvYmplY3QpO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICAgICAgaWYgKHN5bWJvbFZhbHVlT2YpIHtcbiAgICAgICAgICAgIHJldHVybiBzeW1ib2xWYWx1ZU9mLmNhbGwob2JqZWN0KSA9PSBzeW1ib2xWYWx1ZU9mLmNhbGwob3RoZXIpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIG9iamVjdHMgd2l0aCBzdXBwb3J0IGZvclxuICAgICAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICAgICAgb2JqUHJvcHMgPSBnZXRBbGxLZXlzKG9iamVjdCksXG4gICAgICAgICAgb2JqTGVuZ3RoID0gb2JqUHJvcHMubGVuZ3RoLFxuICAgICAgICAgIG90aFByb3BzID0gZ2V0QWxsS2V5cyhvdGhlciksXG4gICAgICAgICAgb3RoTGVuZ3RoID0gb3RoUHJvcHMubGVuZ3RoO1xuXG4gICAgICBpZiAob2JqTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhaXNQYXJ0aWFsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IG9iakxlbmd0aDtcbiAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgIHZhciBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgICAgIGlmICghKGlzUGFydGlhbCA/IGtleSBpbiBvdGhlciA6IGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsIGtleSkpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBDaGVjayB0aGF0IGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgdmFyIG9ialN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgICAgIHZhciBvdGhTdGFja2VkID0gc3RhY2suZ2V0KG90aGVyKTtcbiAgICAgIGlmIChvYmpTdGFja2VkICYmIG90aFN0YWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIG9ialN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBvYmplY3Q7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgICAgIHN0YWNrLnNldChvdGhlciwgb2JqZWN0KTtcblxuICAgICAgdmFyIHNraXBDdG9yID0gaXNQYXJ0aWFsO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBvYmpMZW5ndGgpIHtcbiAgICAgICAga2V5ID0gb2JqUHJvcHNbaW5kZXhdO1xuICAgICAgICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XSxcbiAgICAgICAgICAgIG90aFZhbHVlID0gb3RoZXJba2V5XTtcblxuICAgICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBvYmpWYWx1ZSwga2V5LCBvdGhlciwgb2JqZWN0LCBzdGFjaylcbiAgICAgICAgICAgIDogY3VzdG9taXplcihvYmpWYWx1ZSwgb3RoVmFsdWUsIGtleSwgb2JqZWN0LCBvdGhlciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBpZiAoIShjb21wYXJlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gKG9ialZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMob2JqVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpXG4gICAgICAgICAgICAgIDogY29tcGFyZWRcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBza2lwQ3RvciB8fCAoc2tpcEN0b3IgPSBrZXkgPT0gJ2NvbnN0cnVjdG9yJyk7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0ICYmICFza2lwQ3Rvcikge1xuICAgICAgICB2YXIgb2JqQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIG90aEN0b3IgPSBvdGhlci5jb25zdHJ1Y3RvcjtcblxuICAgICAgICAvLyBOb24gYE9iamVjdGAgb2JqZWN0IGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBlcXVhbC5cbiAgICAgICAgaWYgKG9iakN0b3IgIT0gb3RoQ3RvciAmJlxuICAgICAgICAgICAgKCdjb25zdHJ1Y3RvcicgaW4gb2JqZWN0ICYmICdjb25zdHJ1Y3RvcicgaW4gb3RoZXIpICYmXG4gICAgICAgICAgICAhKHR5cGVvZiBvYmpDdG9yID09ICdmdW5jdGlvbicgJiYgb2JqQ3RvciBpbnN0YW5jZW9mIG9iakN0b3IgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIG90aEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvdGhDdG9yIGluc3RhbmNlb2Ygb3RoQ3RvcikpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gICAgICBzdGFja1snZGVsZXRlJ10ob3RoZXIpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCBmbGF0dGVucyB0aGUgcmVzdCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0UmVzdChmdW5jKSB7XG4gICAgICByZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYywgdW5kZWZpbmVkLCBmbGF0dGVuKSwgZnVuYyArICcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRBbGxLZXlzKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5cywgZ2V0U3ltYm9scyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICAgICAqIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEFsbEtleXNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNJbiwgZ2V0U3ltYm9sc0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtZXRhZGF0YSBmb3IgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBnZXREYXRhID0gIW1ldGFNYXAgPyBub29wIDogZnVuY3Rpb24oZnVuYykge1xuICAgICAgcmV0dXJuIG1ldGFNYXAuZ2V0KGZ1bmMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIGBmdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRGdW5jTmFtZShmdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gKGZ1bmMubmFtZSArICcnKSxcbiAgICAgICAgICBhcnJheSA9IHJlYWxOYW1lc1tyZXN1bHRdLFxuICAgICAgICAgIGxlbmd0aCA9IGhhc093blByb3BlcnR5LmNhbGwocmVhbE5hbWVzLCByZXN1bHQpID8gYXJyYXkubGVuZ3RoIDogMDtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBkYXRhID0gYXJyYXlbbGVuZ3RoXSxcbiAgICAgICAgICAgIG90aGVyRnVuYyA9IGRhdGEuZnVuYztcbiAgICAgICAgaWYgKG90aGVyRnVuYyA9PSBudWxsIHx8IG90aGVyRnVuYyA9PSBmdW5jKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGEubmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBhcmd1bWVudCBwbGFjZWhvbGRlciB2YWx1ZSBmb3IgYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwbGFjZWhvbGRlciB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRIb2xkZXIoZnVuYykge1xuICAgICAgdmFyIG9iamVjdCA9IGhhc093blByb3BlcnR5LmNhbGwobG9kYXNoLCAncGxhY2Vob2xkZXInKSA/IGxvZGFzaCA6IGZ1bmM7XG4gICAgICByZXR1cm4gb2JqZWN0LnBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFwcHJvcHJpYXRlIFwiaXRlcmF0ZWVcIiBmdW5jdGlvbi4gSWYgYF8uaXRlcmF0ZWVgIGlzIGN1c3RvbWl6ZWQsXG4gICAgICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXN0b20gbWV0aG9kLCBvdGhlcndpc2UgaXQgcmV0dXJucyBgYmFzZUl0ZXJhdGVlYC5cbiAgICAgKiBJZiBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCB0aGUgY2hvc2VuIGZ1bmN0aW9uIGlzIGludm9rZWQgd2l0aCB0aGVtIGFuZFxuICAgICAqIGl0cyByZXN1bHQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gW3ZhbHVlXSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhbiBpdGVyYXRlZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgdGhlIGNyZWF0ZWQgaXRlcmF0ZWUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjaG9zZW4gZnVuY3Rpb24gb3IgaXRzIHJlc3VsdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRJdGVyYXRlZSgpIHtcbiAgICAgIHZhciByZXN1bHQgPSBsb2Rhc2guaXRlcmF0ZWUgfHwgaXRlcmF0ZWU7XG4gICAgICByZXN1bHQgPSByZXN1bHQgPT09IGl0ZXJhdGVlID8gYmFzZUl0ZXJhdGVlIDogcmVzdWx0O1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyByZXN1bHQoYXJndW1lbnRzWzBdLCBhcmd1bWVudHNbMV0pIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRhdGEgZm9yIGBtYXBgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgcmVmZXJlbmNlIGtleS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TWFwRGF0YShtYXAsIGtleSkge1xuICAgICAgdmFyIGRhdGEgPSBtYXAuX19kYXRhX187XG4gICAgICByZXR1cm4gaXNLZXlhYmxlKGtleSlcbiAgICAgICAgPyBkYXRhW3R5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyAnc3RyaW5nJyA6ICdoYXNoJ11cbiAgICAgICAgOiBkYXRhLm1hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbWF0Y2ggZGF0YSBvZiBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRNYXRjaERhdGEob2JqZWN0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0ga2V5cyhvYmplY3QpLFxuICAgICAgICAgIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIga2V5ID0gcmVzdWx0W2xlbmd0aF0sXG4gICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgICAgIHJlc3VsdFtsZW5ndGhdID0gW2tleSwgdmFsdWUsIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuYXRpdmUgZnVuY3Rpb24gYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZCB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xuICAgICAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICAgICAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VHZXRUYWdgIHdoaWNoIGlnbm9yZXMgYFN5bWJvbC50b1N0cmluZ1RhZ2AgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByYXcgYHRvU3RyaW5nVGFnYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpIHtcbiAgICAgIHZhciBpc093biA9IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHN5bVRvU3RyaW5nVGFnKSxcbiAgICAgICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgIHZhciByZXN1bHQgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICAgIGlmICh1bm1hc2tlZCkge1xuICAgICAgICBpZiAoaXNPd24pIHtcbiAgICAgICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB0YWc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICAgICAqL1xuICAgIHZhciBnZXRTeW1ib2xzID0gIW5hdGl2ZUdldFN5bWJvbHMgPyBzdHViQXJyYXkgOiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICAgIHJldHVybiBhcnJheUZpbHRlcihuYXRpdmVHZXRTeW1ib2xzKG9iamVjdCksIGZ1bmN0aW9uKHN5bWJvbCkge1xuICAgICAgICByZXR1cm4gcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmplY3QsIHN5bWJvbCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICAgICAqL1xuICAgIHZhciBnZXRTeW1ib2xzSW4gPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgd2hpbGUgKG9iamVjdCkge1xuICAgICAgICBhcnJheVB1c2gocmVzdWx0LCBnZXRTeW1ib2xzKG9iamVjdCkpO1xuICAgICAgICBvYmplY3QgPSBnZXRQcm90b3R5cGUob2JqZWN0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGB0b1N0cmluZ1RhZ2Agb2YgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAgICAgKi9cbiAgICB2YXIgZ2V0VGFnID0gYmFzZUdldFRhZztcblxuICAgIC8vIEZhbGxiYWNrIGZvciBkYXRhIHZpZXdzLCBtYXBzLCBzZXRzLCBhbmQgd2VhayBtYXBzIGluIElFIDExIGFuZCBwcm9taXNlcyBpbiBOb2RlLmpzIDwgNi5cbiAgICBpZiAoKERhdGFWaWV3ICYmIGdldFRhZyhuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDEpKSkgIT0gZGF0YVZpZXdUYWcpIHx8XG4gICAgICAgIChNYXAgJiYgZ2V0VGFnKG5ldyBNYXApICE9IG1hcFRhZykgfHxcbiAgICAgICAgKFByb21pc2UgJiYgZ2V0VGFnKFByb21pc2UucmVzb2x2ZSgpKSAhPSBwcm9taXNlVGFnKSB8fFxuICAgICAgICAoU2V0ICYmIGdldFRhZyhuZXcgU2V0KSAhPSBzZXRUYWcpIHx8XG4gICAgICAgIChXZWFrTWFwICYmIGdldFRhZyhuZXcgV2Vha01hcCkgIT0gd2Vha01hcFRhZykpIHtcbiAgICAgIGdldFRhZyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBiYXNlR2V0VGFnKHZhbHVlKSxcbiAgICAgICAgICAgIEN0b3IgPSByZXN1bHQgPT0gb2JqZWN0VGFnID8gdmFsdWUuY29uc3RydWN0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjdG9yU3RyaW5nID0gQ3RvciA/IHRvU291cmNlKEN0b3IpIDogJyc7XG5cbiAgICAgICAgaWYgKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgICBzd2l0Y2ggKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgICAgIGNhc2UgZGF0YVZpZXdDdG9yU3RyaW5nOiByZXR1cm4gZGF0YVZpZXdUYWc7XG4gICAgICAgICAgICBjYXNlIG1hcEN0b3JTdHJpbmc6IHJldHVybiBtYXBUYWc7XG4gICAgICAgICAgICBjYXNlIHByb21pc2VDdG9yU3RyaW5nOiByZXR1cm4gcHJvbWlzZVRhZztcbiAgICAgICAgICAgIGNhc2Ugc2V0Q3RvclN0cmluZzogcmV0dXJuIHNldFRhZztcbiAgICAgICAgICAgIGNhc2Ugd2Vha01hcEN0b3JTdHJpbmc6IHJldHVybiB3ZWFrTWFwVGFnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2aWV3LCBhcHBseWluZyBhbnkgYHRyYW5zZm9ybXNgIHRvIHRoZSBgc3RhcnRgIGFuZCBgZW5kYCBwb3NpdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHZpZXcuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSB2aWV3LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHRyYW5zZm9ybXMgVGhlIHRyYW5zZm9ybWF0aW9ucyB0byBhcHBseSB0byB0aGUgdmlldy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBgc3RhcnRgIGFuZCBgZW5kYFxuICAgICAqICBwb3NpdGlvbnMgb2YgdGhlIHZpZXcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0VmlldyhzdGFydCwgZW5kLCB0cmFuc2Zvcm1zKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSB0cmFuc2Zvcm1zLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSB0cmFuc2Zvcm1zW2luZGV4XSxcbiAgICAgICAgICAgIHNpemUgPSBkYXRhLnNpemU7XG5cbiAgICAgICAgc3dpdGNoIChkYXRhLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdkcm9wJzogICAgICBzdGFydCArPSBzaXplOyBicmVhaztcbiAgICAgICAgICBjYXNlICdkcm9wUmlnaHQnOiBlbmQgLT0gc2l6ZTsgYnJlYWs7XG4gICAgICAgICAgY2FzZSAndGFrZSc6ICAgICAgZW5kID0gbmF0aXZlTWluKGVuZCwgc3RhcnQgKyBzaXplKTsgYnJlYWs7XG4gICAgICAgICAgY2FzZSAndGFrZVJpZ2h0Jzogc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQsIGVuZCAtIHNpemUpOyBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgJ3N0YXJ0Jzogc3RhcnQsICdlbmQnOiBlbmQgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyB3cmFwcGVyIGRldGFpbHMgZnJvbSB0aGUgYHNvdXJjZWAgYm9keSBjb21tZW50LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIFRoZSBzb3VyY2UgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdyYXBwZXIgZGV0YWlscy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRXcmFwRGV0YWlscyhzb3VyY2UpIHtcbiAgICAgIHZhciBtYXRjaCA9IHNvdXJjZS5tYXRjaChyZVdyYXBEZXRhaWxzKTtcbiAgICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdLnNwbGl0KHJlU3BsaXREZXRhaWxzKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcGF0aGAgZXhpc3RzIG9uIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFzRnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2sgcHJvcGVydGllcy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBoYXNGdW5jKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSk7XG4gICAgICAgIGlmICghKHJlc3VsdCA9IG9iamVjdCAhPSBudWxsICYmIGhhc0Z1bmMob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdCA9IG9iamVjdFtrZXldO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCB8fCArK2luZGV4ICE9IGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgbGVuZ3RoID0gb2JqZWN0ID09IG51bGwgPyAwIDogb2JqZWN0Lmxlbmd0aDtcbiAgICAgIHJldHVybiAhIWxlbmd0aCAmJiBpc0xlbmd0aChsZW5ndGgpICYmIGlzSW5kZXgoa2V5LCBsZW5ndGgpICYmXG4gICAgICAgIChpc0FycmF5KG9iamVjdCkgfHwgaXNBcmd1bWVudHMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYW4gYXJyYXkgY2xvbmUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IG5ldyBhcnJheS5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gICAgICAvLyBBZGQgcHJvcGVydGllcyBhc3NpZ25lZCBieSBgUmVnRXhwI2V4ZWNgLlxuICAgICAgaWYgKGxlbmd0aCAmJiB0eXBlb2YgYXJyYXlbMF0gPT0gJ3N0cmluZycgJiYgaGFzT3duUHJvcGVydHkuY2FsbChhcnJheSwgJ2luZGV4JykpIHtcbiAgICAgICAgcmVzdWx0LmluZGV4ID0gYXJyYXkuaW5kZXg7XG4gICAgICAgIHJlc3VsdC5pbnB1dCA9IGFycmF5LmlucHV0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBhbiBvYmplY3QgY2xvbmUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbml0Q2xvbmVPYmplY3Qob2JqZWN0KSB7XG4gICAgICByZXR1cm4gKHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNQcm90b3R5cGUob2JqZWN0KSlcbiAgICAgICAgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKVxuICAgICAgICA6IHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZSBiYXNlZCBvbiBpdHMgYHRvU3RyaW5nVGFnYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY2xvbmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gICAgICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBNYXBgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIGBTZXRgLCBvciBgU3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdCB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKG9iamVjdCwgdGFnLCBpc0RlZXApIHtcbiAgICAgIHZhciBDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yO1xuICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgY2FzZSBhcnJheUJ1ZmZlclRhZzpcbiAgICAgICAgICByZXR1cm4gY2xvbmVBcnJheUJ1ZmZlcihvYmplY3QpO1xuXG4gICAgICAgIGNhc2UgYm9vbFRhZzpcbiAgICAgICAgY2FzZSBkYXRlVGFnOlxuICAgICAgICAgIHJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtcblxuICAgICAgICBjYXNlIGRhdGFWaWV3VGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZURhdGFWaWV3KG9iamVjdCwgaXNEZWVwKTtcblxuICAgICAgICBjYXNlIGZsb2F0MzJUYWc6IGNhc2UgZmxvYXQ2NFRhZzpcbiAgICAgICAgY2FzZSBpbnQ4VGFnOiBjYXNlIGludDE2VGFnOiBjYXNlIGludDMyVGFnOlxuICAgICAgICBjYXNlIHVpbnQ4VGFnOiBjYXNlIHVpbnQ4Q2xhbXBlZFRhZzogY2FzZSB1aW50MTZUYWc6IGNhc2UgdWludDMyVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgICAgIGNhc2UgbWFwVGFnOlxuICAgICAgICAgIHJldHVybiBuZXcgQ3RvcjtcblxuICAgICAgICBjYXNlIG51bWJlclRhZzpcbiAgICAgICAgY2FzZSBzdHJpbmdUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSByZWdleHBUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lUmVnRXhwKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSBzZXRUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yO1xuXG4gICAgICAgIGNhc2Ugc3ltYm9sVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZVN5bWJvbChvYmplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydHMgd3JhcHBlciBgZGV0YWlsc2AgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIGBzb3VyY2VgIGJvZHkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBtb2RpZnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBkZXRhaWxzIFRoZSBkZXRhaWxzIHRvIGluc2VydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBtb2RpZmllZCBzb3VyY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5zZXJ0V3JhcERldGFpbHMoc291cmNlLCBkZXRhaWxzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gZGV0YWlscy5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgfVxuICAgICAgdmFyIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG4gICAgICBkZXRhaWxzW2xhc3RJbmRleF0gPSAobGVuZ3RoID4gMSA/ICcmICcgOiAnJykgKyBkZXRhaWxzW2xhc3RJbmRleF07XG4gICAgICBkZXRhaWxzID0gZGV0YWlscy5qb2luKGxlbmd0aCA+IDIgPyAnLCAnIDogJyAnKTtcbiAgICAgIHJldHVybiBzb3VyY2UucmVwbGFjZShyZVdyYXBDb21tZW50LCAne1xcbi8qIFt3cmFwcGVkIHdpdGggJyArIGRldGFpbHMgKyAnXSAqL1xcbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZmxhdHRlbmFibGUgYGFyZ3VtZW50c2Agb2JqZWN0IG9yIGFycmF5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmbGF0dGVuYWJsZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc0FycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkgfHxcbiAgICAgICAgISEoc3ByZWFkYWJsZVN5bWJvbCAmJiB2YWx1ZSAmJiB2YWx1ZVtzcHJlYWRhYmxlU3ltYm9sXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBpbmRleCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG5cbiAgICAgIHJldHVybiAhIWxlbmd0aCAmJlxuICAgICAgICAodHlwZSA9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICh0eXBlICE9ICdzeW1ib2wnICYmIHJlSXNVaW50LnRlc3QodmFsdWUpKSkgJiZcbiAgICAgICAgICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgdmFsdWUgYXJndW1lbnQuXG4gICAgICogQHBhcmFtIHsqfSBpbmRleCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIGluZGV4IG9yIGtleSBhcmd1bWVudC5cbiAgICAgKiBAcGFyYW0geyp9IG9iamVjdCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIG9iamVjdCBhcmd1bWVudC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJdGVyYXRlZUNhbGwodmFsdWUsIGluZGV4LCBvYmplY3QpIHtcbiAgICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiBpbmRleDtcbiAgICAgIGlmICh0eXBlID09ICdudW1iZXInXG4gICAgICAgICAgICA/IChpc0FycmF5TGlrZShvYmplY3QpICYmIGlzSW5kZXgoaW5kZXgsIG9iamVjdC5sZW5ndGgpKVxuICAgICAgICAgICAgOiAodHlwZSA9PSAnc3RyaW5nJyAmJiBpbmRleCBpbiBvYmplY3QpXG4gICAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiBlcShvYmplY3RbaW5kZXhdLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lIGFuZCBub3QgYSBwcm9wZXJ0eSBwYXRoLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeSBrZXlzIG9uLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzS2V5KHZhbHVlLCBvYmplY3QpIHtcbiAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIGlmICh0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicgfHxcbiAgICAgICAgICB2YWx1ZSA9PSBudWxsIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpIHx8ICFyZUlzRGVlcFByb3AudGVzdCh2YWx1ZSkgfHxcbiAgICAgICAgKG9iamVjdCAhPSBudWxsICYmIHZhbHVlIGluIE9iamVjdChvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaXF1ZSBvYmplY3Qga2V5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICByZXR1cm4gKHR5cGUgPT0gJ3N0cmluZycgfHwgdHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nKVxuICAgICAgICA/ICh2YWx1ZSAhPT0gJ19fcHJvdG9fXycpXG4gICAgICAgIDogKHZhbHVlID09PSBudWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBhIGxhenkgY291bnRlcnBhcnQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaGFzIGEgbGF6eSBjb3VudGVycGFydCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTGF6aWFibGUoZnVuYykge1xuICAgICAgdmFyIGZ1bmNOYW1lID0gZ2V0RnVuY05hbWUoZnVuYyksXG4gICAgICAgICAgb3RoZXIgPSBsb2Rhc2hbZnVuY05hbWVdO1xuXG4gICAgICBpZiAodHlwZW9mIG90aGVyICE9ICdmdW5jdGlvbicgfHwgIShmdW5jTmFtZSBpbiBMYXp5V3JhcHBlci5wcm90b3R5cGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChmdW5jID09PSBvdGhlcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBkYXRhID0gZ2V0RGF0YShvdGhlcik7XG4gICAgICByZXR1cm4gISFkYXRhICYmIGZ1bmMgPT09IGRhdGFbMF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBmdW5jYCBoYXMgaXRzIHNvdXJjZSBtYXNrZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2VkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNNYXNrZWQoZnVuYykge1xuICAgICAgcmV0dXJuICEhbWFza1NyY0tleSAmJiAobWFza1NyY0tleSBpbiBmdW5jKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGlzIGNhcGFibGUgb2YgYmVpbmcgbWFza2VkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2thYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgdmFyIGlzTWFza2FibGUgPSBjb3JlSnNEYXRhID8gaXNGdW5jdGlvbiA6IHN0dWJGYWxzZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIHByb3RvdHlwZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvdG90eXBlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpIHtcbiAgICAgIHZhciBDdG9yID0gdmFsdWUgJiYgdmFsdWUuY29uc3RydWN0b3IsXG4gICAgICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaWYgc3VpdGFibGUgZm9yIHN0cmljdFxuICAgICAqICBlcXVhbGl0eSBjb21wYXJpc29ucywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSAmJiAhaXNPYmplY3QodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgbWF0Y2hlc1Byb3BlcnR5YCBmb3Igc291cmNlIHZhbHVlcyBzdWl0YWJsZVxuICAgICAqIGZvciBzdHJpY3QgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUoa2V5LCBzcmNWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iamVjdFtrZXldID09PSBzcmNWYWx1ZSAmJlxuICAgICAgICAgIChzcmNWYWx1ZSAhPT0gdW5kZWZpbmVkIHx8IChrZXkgaW4gT2JqZWN0KG9iamVjdCkpKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1lbW9pemVgIHdoaWNoIGNsZWFycyB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24nc1xuICAgICAqIGNhY2hlIHdoZW4gaXQgZXhjZWVkcyBgTUFYX01FTU9JWkVfU0laRWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZW1vaXplQ2FwcGVkKGZ1bmMpIHtcbiAgICAgIHZhciByZXN1bHQgPSBtZW1vaXplKGZ1bmMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICBpZiAoY2FjaGUuc2l6ZSA9PT0gTUFYX01FTU9JWkVfU0laRSkge1xuICAgICAgICAgIGNhY2hlLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgY2FjaGUgPSByZXN1bHQuY2FjaGU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlcyB0aGUgZnVuY3Rpb24gbWV0YWRhdGEgb2YgYHNvdXJjZWAgaW50byBgZGF0YWAuXG4gICAgICpcbiAgICAgKiBNZXJnaW5nIG1ldGFkYXRhIHJlZHVjZXMgdGhlIG51bWJlciBvZiB3cmFwcGVycyB1c2VkIHRvIGludm9rZSBhIGZ1bmN0aW9uLlxuICAgICAqIFRoaXMgaXMgcG9zc2libGUgYmVjYXVzZSBtZXRob2RzIGxpa2UgYF8uYmluZGAsIGBfLmN1cnJ5YCwgYW5kIGBfLnBhcnRpYWxgXG4gICAgICogbWF5IGJlIGFwcGxpZWQgcmVnYXJkbGVzcyBvZiBleGVjdXRpb24gb3JkZXIuIE1ldGhvZHMgbGlrZSBgXy5hcnlgIGFuZFxuICAgICAqIGBfLnJlYXJnYCBtb2RpZnkgZnVuY3Rpb24gYXJndW1lbnRzLCBtYWtpbmcgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlXG4gICAgICogZXhlY3V0ZWQgaW1wb3J0YW50LCBwcmV2ZW50aW5nIHRoZSBtZXJnaW5nIG9mIG1ldGFkYXRhLiBIb3dldmVyLCB3ZSBtYWtlXG4gICAgICogYW4gZXhjZXB0aW9uIGZvciBhIHNhZmUgY29tYmluZWQgY2FzZSB3aGVyZSBjdXJyaWVkIGZ1bmN0aW9ucyBoYXZlIGBfLmFyeWBcbiAgICAgKiBhbmQgb3IgYF8ucmVhcmdgIGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGRhdGEgVGhlIGRlc3RpbmF0aW9uIG1ldGFkYXRhLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgc291cmNlIG1ldGFkYXRhLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgZGF0YWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVyZ2VEYXRhKGRhdGEsIHNvdXJjZSkge1xuICAgICAgdmFyIGJpdG1hc2sgPSBkYXRhWzFdLFxuICAgICAgICAgIHNyY0JpdG1hc2sgPSBzb3VyY2VbMV0sXG4gICAgICAgICAgbmV3Qml0bWFzayA9IGJpdG1hc2sgfCBzcmNCaXRtYXNrLFxuICAgICAgICAgIGlzQ29tbW9uID0gbmV3Qml0bWFzayA8IChXUkFQX0JJTkRfRkxBRyB8IFdSQVBfQklORF9LRVlfRkxBRyB8IFdSQVBfQVJZX0ZMQUcpO1xuXG4gICAgICB2YXIgaXNDb21ibyA9XG4gICAgICAgICgoc3JjQml0bWFzayA9PSBXUkFQX0FSWV9GTEFHKSAmJiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcpKSB8fFxuICAgICAgICAoKHNyY0JpdG1hc2sgPT0gV1JBUF9BUllfRkxBRykgJiYgKGJpdG1hc2sgPT0gV1JBUF9SRUFSR19GTEFHKSAmJiAoZGF0YVs3XS5sZW5ndGggPD0gc291cmNlWzhdKSkgfHxcbiAgICAgICAgKChzcmNCaXRtYXNrID09IChXUkFQX0FSWV9GTEFHIHwgV1JBUF9SRUFSR19GTEFHKSkgJiYgKHNvdXJjZVs3XS5sZW5ndGggPD0gc291cmNlWzhdKSAmJiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcpKTtcblxuICAgICAgLy8gRXhpdCBlYXJseSBpZiBtZXRhZGF0YSBjYW4ndCBiZSBtZXJnZWQuXG4gICAgICBpZiAoIShpc0NvbW1vbiB8fCBpc0NvbWJvKSkge1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYHRoaXNBcmdgIGlmIGF2YWlsYWJsZS5cbiAgICAgIGlmIChzcmNCaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcpIHtcbiAgICAgICAgZGF0YVsyXSA9IHNvdXJjZVsyXTtcbiAgICAgICAgLy8gU2V0IHdoZW4gY3VycnlpbmcgYSBib3VuZCBmdW5jdGlvbi5cbiAgICAgICAgbmV3Qml0bWFzayB8PSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcgPyAwIDogV1JBUF9DVVJSWV9CT1VORF9GTEFHO1xuICAgICAgfVxuICAgICAgLy8gQ29tcG9zZSBwYXJ0aWFsIGFyZ3VtZW50cy5cbiAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVszXTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB2YXIgcGFydGlhbHMgPSBkYXRhWzNdO1xuICAgICAgICBkYXRhWzNdID0gcGFydGlhbHMgPyBjb21wb3NlQXJncyhwYXJ0aWFscywgdmFsdWUsIHNvdXJjZVs0XSkgOiB2YWx1ZTtcbiAgICAgICAgZGF0YVs0XSA9IHBhcnRpYWxzID8gcmVwbGFjZUhvbGRlcnMoZGF0YVszXSwgUExBQ0VIT0xERVIpIDogc291cmNlWzRdO1xuICAgICAgfVxuICAgICAgLy8gQ29tcG9zZSBwYXJ0aWFsIHJpZ2h0IGFyZ3VtZW50cy5cbiAgICAgIHZhbHVlID0gc291cmNlWzVdO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHBhcnRpYWxzID0gZGF0YVs1XTtcbiAgICAgICAgZGF0YVs1XSA9IHBhcnRpYWxzID8gY29tcG9zZUFyZ3NSaWdodChwYXJ0aWFscywgdmFsdWUsIHNvdXJjZVs2XSkgOiB2YWx1ZTtcbiAgICAgICAgZGF0YVs2XSA9IHBhcnRpYWxzID8gcmVwbGFjZUhvbGRlcnMoZGF0YVs1XSwgUExBQ0VIT0xERVIpIDogc291cmNlWzZdO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgYXJnUG9zYCBpZiBhdmFpbGFibGUuXG4gICAgICB2YWx1ZSA9IHNvdXJjZVs3XTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBkYXRhWzddID0gdmFsdWU7XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBhcnlgIGlmIGl0J3Mgc21hbGxlci5cbiAgICAgIGlmIChzcmNCaXRtYXNrICYgV1JBUF9BUllfRkxBRykge1xuICAgICAgICBkYXRhWzhdID0gZGF0YVs4XSA9PSBudWxsID8gc291cmNlWzhdIDogbmF0aXZlTWluKGRhdGFbOF0sIHNvdXJjZVs4XSk7XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBhcml0eWAgaWYgb25lIGlzIG5vdCBwcm92aWRlZC5cbiAgICAgIGlmIChkYXRhWzldID09IG51bGwpIHtcbiAgICAgICAgZGF0YVs5XSA9IHNvdXJjZVs5XTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGZ1bmNgIGFuZCBtZXJnZSBiaXRtYXNrcy5cbiAgICAgIGRhdGFbMF0gPSBzb3VyY2VbMF07XG4gICAgICBkYXRhWzFdID0gbmV3Qml0bWFzaztcblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlXG4gICAgICogW2BPYmplY3Qua2V5c2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICAgICAqIGV4Y2VwdCB0aGF0IGl0IGluY2x1ZGVzIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5hdGl2ZUtleXNJbihvYmplY3QpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcbiAgICAgIHJldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCB0cmFuc2Zvcm1zIHRoZSByZXN0IGFycmF5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIHJlc3QgYXJyYXkgdHJhbnNmb3JtLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCB0cmFuc2Zvcm0pIHtcbiAgICAgIHN0YXJ0ID0gbmF0aXZlTWF4KHN0YXJ0ID09PSB1bmRlZmluZWQgPyAoZnVuYy5sZW5ndGggLSAxKSA6IHN0YXJ0LCAwKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3MubGVuZ3RoIC0gc3RhcnQsIDApLFxuICAgICAgICAgICAgYXJyYXkgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgYXJyYXlbaW5kZXhdID0gYXJnc1tzdGFydCArIGluZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICB2YXIgb3RoZXJBcmdzID0gQXJyYXkoc3RhcnQgKyAxKTtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBzdGFydCkge1xuICAgICAgICAgIG90aGVyQXJnc1tpbmRleF0gPSBhcmdzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBvdGhlckFyZ3Nbc3RhcnRdID0gdHJhbnNmb3JtKGFycmF5KTtcbiAgICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHBhcmVudCB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXRoIFRoZSBwYXRoIHRvIGdldCB0aGUgcGFyZW50IHZhbHVlIG9mLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwYXJlbnQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFyZW50KG9iamVjdCwgcGF0aCkge1xuICAgICAgcmV0dXJuIHBhdGgubGVuZ3RoIDwgMiA/IG9iamVjdCA6IGJhc2VHZXQob2JqZWN0LCBiYXNlU2xpY2UocGF0aCwgMCwgLTEpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW9yZGVyIGBhcnJheWAgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXhlcyB3aGVyZSB0aGUgZWxlbWVudCBhdFxuICAgICAqIHRoZSBmaXJzdCBpbmRleCBpcyBhc3NpZ25lZCBhcyB0aGUgZmlyc3QgZWxlbWVudCwgdGhlIGVsZW1lbnQgYXRcbiAgICAgKiB0aGUgc2Vjb25kIGluZGV4IGlzIGFzc2lnbmVkIGFzIHRoZSBzZWNvbmQgZWxlbWVudCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcmVvcmRlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBpbmRleGVzIFRoZSBhcnJhbmdlZCBhcnJheSBpbmRleGVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlb3JkZXIoYXJyYXksIGluZGV4ZXMpIHtcbiAgICAgIHZhciBhcnJMZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKGluZGV4ZXMubGVuZ3RoLCBhcnJMZW5ndGgpLFxuICAgICAgICAgIG9sZEFycmF5ID0gY29weUFycmF5KGFycmF5KTtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGluZGV4ZXNbbGVuZ3RoXTtcbiAgICAgICAgYXJyYXlbbGVuZ3RoXSA9IGlzSW5kZXgoaW5kZXgsIGFyckxlbmd0aCkgPyBvbGRBcnJheVtpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAsIHVubGVzcyBga2V5YCBpcyBcIl9fcHJvdG9fX1wiIG9yIFwiY29uc3RydWN0b3JcIi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzYWZlR2V0KG9iamVjdCwga2V5KSB7XG4gICAgICBpZiAoa2V5ID09PSAnY29uc3RydWN0b3InICYmIHR5cGVvZiBvYmplY3Rba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChrZXkgPT0gJ19fcHJvdG9fXycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBtZXRhZGF0YSBmb3IgYGZ1bmNgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIElmIHRoaXMgZnVuY3Rpb24gYmVjb21lcyBob3QsIGkuZS4gaXMgaW52b2tlZCBhIGxvdCBpbiBhIHNob3J0XG4gICAgICogcGVyaW9kIG9mIHRpbWUsIGl0IHdpbGwgdHJpcCBpdHMgYnJlYWtlciBhbmQgdHJhbnNpdGlvbiB0byBhbiBpZGVudGl0eVxuICAgICAqIGZ1bmN0aW9uIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvbiBwYXVzZXMgaW4gVjguIFNlZVxuICAgICAqIFtWOCBpc3N1ZSAyMDcwXShodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0yMDcwKVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFzc29jaWF0ZSBtZXRhZGF0YSB3aXRoLlxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgbWV0YWRhdGEuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAgICAgKi9cbiAgICB2YXIgc2V0RGF0YSA9IHNob3J0T3V0KGJhc2VTZXREYXRhKTtcblxuICAgIC8qKlxuICAgICAqIEEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIHRoZSBnbG9iYWwgW2BzZXRUaW1lb3V0YF0oaHR0cHM6Ly9tZG4uaW8vc2V0VGltZW91dCkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICogQHJldHVybnMge251bWJlcnxPYmplY3R9IFJldHVybnMgdGhlIHRpbWVyIGlkIG9yIHRpbWVvdXQgb2JqZWN0LlxuICAgICAqL1xuICAgIHZhciBzZXRUaW1lb3V0ID0gY3R4U2V0VGltZW91dCB8fCBmdW5jdGlvbihmdW5jLCB3YWl0KSB7XG4gICAgICByZXR1cm4gcm9vdC5zZXRUaW1lb3V0KGZ1bmMsIHdhaXQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgZnVuY2AgdG8gcmV0dXJuIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBzZXRUb1N0cmluZyA9IHNob3J0T3V0KGJhc2VTZXRUb1N0cmluZyk7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgd3JhcHBlcmAgdG8gbWltaWMgdGhlIHNvdXJjZSBvZiBgcmVmZXJlbmNlYFxuICAgICAqIHdpdGggd3JhcHBlciBkZXRhaWxzIGluIGEgY29tbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBzb3VyY2UgYm9keS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gd3JhcHBlciBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlZmVyZW5jZSBUaGUgcmVmZXJlbmNlIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGB3cmFwcGVyYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRXcmFwVG9TdHJpbmcod3JhcHBlciwgcmVmZXJlbmNlLCBiaXRtYXNrKSB7XG4gICAgICB2YXIgc291cmNlID0gKHJlZmVyZW5jZSArICcnKTtcbiAgICAgIHJldHVybiBzZXRUb1N0cmluZyh3cmFwcGVyLCBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIHVwZGF0ZVdyYXBEZXRhaWxzKGdldFdyYXBEZXRhaWxzKHNvdXJjZSksIGJpdG1hc2spKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQnbGwgc2hvcnQgb3V0IGFuZCBpbnZva2UgYGlkZW50aXR5YCBpbnN0ZWFkXG4gICAgICogb2YgYGZ1bmNgIHdoZW4gaXQncyBjYWxsZWQgYEhPVF9DT1VOVGAgb3IgbW9yZSB0aW1lcyBpbiBgSE9UX1NQQU5gXG4gICAgICogbWlsbGlzZWNvbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzaG9ydGFibGUgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2hvcnRPdXQoZnVuYykge1xuICAgICAgdmFyIGNvdW50ID0gMCxcbiAgICAgICAgICBsYXN0Q2FsbGVkID0gMDtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhbXAgPSBuYXRpdmVOb3coKSxcbiAgICAgICAgICAgIHJlbWFpbmluZyA9IEhPVF9TUEFOIC0gKHN0YW1wIC0gbGFzdENhbGxlZCk7XG5cbiAgICAgICAgbGFzdENhbGxlZCA9IHN0YW1wO1xuICAgICAgICBpZiAocmVtYWluaW5nID4gMCkge1xuICAgICAgICAgIGlmICgrK2NvdW50ID49IEhPVF9DT1VOVCkge1xuICAgICAgICAgICAgcmV0dXJuIGFyZ3VtZW50c1swXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY291bnQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNodWZmbGVgIHdoaWNoIG11dGF0ZXMgYW5kIHNldHMgdGhlIHNpemUgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNodWZmbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPWFycmF5Lmxlbmd0aF0gVGhlIHNpemUgb2YgYGFycmF5YC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaHVmZmxlU2VsZihhcnJheSwgc2l6ZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgICAgIHNpemUgPSBzaXplID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiBzaXplO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBzaXplKSB7XG4gICAgICAgIHZhciByYW5kID0gYmFzZVJhbmRvbShpbmRleCwgbGFzdEluZGV4KSxcbiAgICAgICAgICAgIHZhbHVlID0gYXJyYXlbcmFuZF07XG5cbiAgICAgICAgYXJyYXlbcmFuZF0gPSBhcnJheVtpbmRleF07XG4gICAgICAgIGFycmF5W2luZGV4XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgYXJyYXkubGVuZ3RoID0gc2l6ZTtcbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKi9cbiAgICB2YXIgc3RyaW5nVG9QYXRoID0gbWVtb2l6ZUNhcHBlZChmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGlmIChzdHJpbmcuY2hhckNvZGVBdCgwKSA9PT0gNDYgLyogLiAqLykge1xuICAgICAgICByZXN1bHQucHVzaCgnJyk7XG4gICAgICB9XG4gICAgICBzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHF1b3RlID8gc3ViU3RyaW5nLnJlcGxhY2UocmVFc2NhcGVDaGFyLCAnJDEnKSA6IChudW1iZXIgfHwgbWF0Y2gpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcga2V5IGlmIGl0J3Mgbm90IGEgc3RyaW5nIG9yIHN5bWJvbC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHN5bWJvbH0gUmV0dXJucyB0aGUga2V5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvS2V5KHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICAgICAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JTkZJTklUWSkgPyAnLTAnIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc291cmNlIGNvZGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICAgICAgaWYgKGZ1bmMgIT0gbnVsbCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICB9XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB3cmFwcGVyIGBkZXRhaWxzYCBiYXNlZCBvbiBgYml0bWFza2AgZmxhZ3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gZGV0YWlscyBUaGUgZGV0YWlscyB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGRldGFpbHNgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZVdyYXBEZXRhaWxzKGRldGFpbHMsIGJpdG1hc2spIHtcbiAgICAgIGFycmF5RWFjaCh3cmFwRmxhZ3MsIGZ1bmN0aW9uKHBhaXIpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gJ18uJyArIHBhaXJbMF07XG4gICAgICAgIGlmICgoYml0bWFzayAmIHBhaXJbMV0pICYmICFhcnJheUluY2x1ZGVzKGRldGFpbHMsIHZhbHVlKSkge1xuICAgICAgICAgIGRldGFpbHMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGRldGFpbHMuc29ydCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgd3JhcHBlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB3cmFwcGVyIFRoZSB3cmFwcGVyIHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCB3cmFwcGVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJDbG9uZSh3cmFwcGVyKSB7XG4gICAgICBpZiAod3JhcHBlciBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB7XG4gICAgICAgIHJldHVybiB3cmFwcGVyLmNsb25lKCk7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IExvZGFzaFdyYXBwZXIod3JhcHBlci5fX3dyYXBwZWRfXywgd3JhcHBlci5fX2NoYWluX18pO1xuICAgICAgcmVzdWx0Ll9fYWN0aW9uc19fID0gY29weUFycmF5KHdyYXBwZXIuX19hY3Rpb25zX18pO1xuICAgICAgcmVzdWx0Ll9faW5kZXhfXyAgPSB3cmFwcGVyLl9faW5kZXhfXztcbiAgICAgIHJlc3VsdC5fX3ZhbHVlc19fID0gd3JhcHBlci5fX3ZhbHVlc19fO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHNwbGl0IGludG8gZ3JvdXBzIHRoZSBsZW5ndGggb2YgYHNpemVgLlxuICAgICAqIElmIGBhcnJheWAgY2FuJ3QgYmUgc3BsaXQgZXZlbmx5LCB0aGUgZmluYWwgY2h1bmsgd2lsbCBiZSB0aGUgcmVtYWluaW5nXG4gICAgICogZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NpemU9MV0gVGhlIGxlbmd0aCBvZiBlYWNoIGNodW5rXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjaHVua3MuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2h1bmsoWydhJywgJ2InLCAnYycsICdkJ10sIDIpO1xuICAgICAqIC8vID0+IFtbJ2EnLCAnYiddLCBbJ2MnLCAnZCddXVxuICAgICAqXG4gICAgICogXy5jaHVuayhbJ2EnLCAnYicsICdjJywgJ2QnXSwgMyk7XG4gICAgICogLy8gPT4gW1snYScsICdiJywgJ2MnXSwgWydkJ11dXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2h1bmsoYXJyYXksIHNpemUsIGd1YXJkKSB7XG4gICAgICBpZiAoKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoYXJyYXksIHNpemUsIGd1YXJkKSA6IHNpemUgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgc2l6ZSA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaXplID0gbmF0aXZlTWF4KHRvSW50ZWdlcihzaXplKSwgMCk7XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCB8fCBzaXplIDwgMSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShuYXRpdmVDZWlsKGxlbmd0aCAvIHNpemUpKTtcblxuICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IGJhc2VTbGljZShhcnJheSwgaW5kZXgsIChpbmRleCArPSBzaXplKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgd2l0aCBhbGwgZmFsc2V5IHZhbHVlcyByZW1vdmVkLiBUaGUgdmFsdWVzIGBmYWxzZWAsIGBudWxsYCxcbiAgICAgKiBgMGAsIGBcIlwiYCwgYHVuZGVmaW5lZGAsIGFuZCBgTmFOYCBhcmUgZmFsc2V5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNvbXBhY3QoWzAsIDEsIGZhbHNlLCAyLCAnJywgM10pO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBhY3QoYXJyYXkpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGFycmF5IGNvbmNhdGVuYXRpbmcgYGFycmF5YCB3aXRoIGFueSBhZGRpdGlvbmFsIGFycmF5c1xuICAgICAqIGFuZC9vciB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29uY2F0ZW5hdGUuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNvbmNhdGVuYXRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGNvbmNhdGVuYXRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzFdO1xuICAgICAqIHZhciBvdGhlciA9IF8uY29uY2F0KGFycmF5LCAyLCBbM10sIFtbNF1dKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG90aGVyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgWzRdXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmNhdCgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGFyZ3MgPSBBcnJheShsZW5ndGggLSAxKSxcbiAgICAgICAgICBhcnJheSA9IGFyZ3VtZW50c1swXSxcbiAgICAgICAgICBpbmRleCA9IGxlbmd0aDtcblxuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgYXJnc1tpbmRleCAtIDFdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheVB1c2goaXNBcnJheShhcnJheSkgPyBjb3B5QXJyYXkoYXJyYXkpIDogW2FycmF5XSwgYmFzZUZsYXR0ZW4oYXJncywgMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgYGFycmF5YCB2YWx1ZXMgbm90IGluY2x1ZGVkIGluIHRoZSBvdGhlciBnaXZlbiBhcnJheXNcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxBbGxgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAc2VlIF8ud2l0aG91dCwgXy54b3JcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlKFsyLCAxXSwgWzIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKi9cbiAgICB2YXIgZGlmZmVyZW5jZSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICAgICAgPyBiYXNlRGlmZmVyZW5jZShhcnJheSwgYmFzZUZsYXR0ZW4odmFsdWVzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmRpZmZlcmVuY2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIGFuZCBgdmFsdWVzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uXG4gICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxBbGxCeWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzEuMl1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZGlmZmVyZW5jZUJ5KFt7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgW3sgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIHZhciBkaWZmZXJlbmNlQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KHZhbHVlcyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5kaWZmZXJlbmNlYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgIHRvIGB2YWx1ZXNgLiBUaGUgb3JkZXIgYW5kXG4gICAgICogcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4gVGhlIGNvbXBhcmF0b3JcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbFdpdGhgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dO1xuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlV2l0aChvYmplY3RzLCBbeyAneCc6IDEsICd5JzogMiB9XSwgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIsICd5JzogMSB9XVxuICAgICAqL1xuICAgIHZhciBkaWZmZXJlbmNlV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHZhciBjb21wYXJhdG9yID0gbGFzdCh2YWx1ZXMpO1xuICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGNvbXBhcmF0b3IpKSB7XG4gICAgICAgIGNvbXBhcmF0b3IgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIGJhc2VGbGF0dGVuKHZhbHVlcywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjUuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBkcm9wLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRyb3AoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMiwgM11cbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFszXVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10sIDApO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRyb3AoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgbiA8IDAgPyAwIDogbiwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGVuZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBkcm9wLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRyb3BSaWdodChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcFJpZ2h0KGFycmF5LCBuLCBndWFyZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbiA9IChndWFyZCB8fCBuID09PSB1bmRlZmluZWQpID8gMSA6IHRvSW50ZWdlcihuKTtcbiAgICAgIG4gPSBsZW5ndGggLSBuO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgMCwgbiA8IDAgPyAwIDogbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgZXhjbHVkaW5nIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgZW5kLlxuICAgICAqIEVsZW1lbnRzIGFyZSBkcm9wcGVkIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BSaWdodFdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRyb3BSaWdodFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgdHJ1ZSwgdHJ1ZSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCBleGNsdWRpbmcgZWxlbWVudHMgZHJvcHBlZCBmcm9tIHRoZSBiZWdpbm5pbmcuXG4gICAgICogRWxlbWVudHMgYXJlIGRyb3BwZWQgdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5kcm9wV2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wV2hpbGUodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgdHJ1ZSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWxscyBlbGVtZW50cyBvZiBgYXJyYXlgIHdpdGggYHZhbHVlYCBmcm9tIGBzdGFydGAgdXAgdG8sIGJ1dCBub3RcbiAgICAgKiBpbmNsdWRpbmcsIGBlbmRgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmaWxsLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGZpbGwgYGFycmF5YCB3aXRoLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDNdO1xuICAgICAqXG4gICAgICogXy5maWxsKGFycmF5LCAnYScpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYScsICdhJ11cbiAgICAgKlxuICAgICAqIF8uZmlsbChBcnJheSgzKSwgMik7XG4gICAgICogLy8gPT4gWzIsIDIsIDJdXG4gICAgICpcbiAgICAgKiBfLmZpbGwoWzQsIDYsIDgsIDEwXSwgJyonLCAxLCAzKTtcbiAgICAgKiAvLyA9PiBbNCwgJyonLCAnKicsIDEwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbGwoYXJyYXksIHZhbHVlLCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoc3RhcnQgJiYgdHlwZW9mIHN0YXJ0ICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQpKSB7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgZW5kID0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VGaWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3RcbiAgICAgKiBlbGVtZW50IGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IGl0c2VsZi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZvdW5kIGVsZW1lbnQsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kSW5kZXgodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlciA9PSAnYmFybmV5JzsgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgeyAndXNlcic6ICdmcmVkJywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGZyb21JbmRleCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICBpbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZEluZGV4YCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzXG4gICAgICogb2YgYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD1hcnJheS5sZW5ndGgtMV0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyID09ICdwZWJibGVzJzsgfSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0SW5kZXgodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kTGFzdEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gbGVuZ3RoIC0gMTtcbiAgICAgIGlmIChmcm9tSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbmRleCA9IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgICBpbmRleCA9IGZyb21JbmRleCA8IDBcbiAgICAgICAgICA/IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMClcbiAgICAgICAgICA6IG5hdGl2ZU1pbihpbmRleCwgbGVuZ3RoIC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgaW5kZXgsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZsYXR0ZW5zIGBhcnJheWAgYSBzaW5nbGUgbGV2ZWwgZGVlcC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mbGF0dGVuKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIFszLCBbNF1dLCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXR0ZW4oYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgMSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWN1cnNpdmVseSBmbGF0dGVucyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW5EZWVwKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIDQsIDVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdHRlbkRlZXAoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgSU5GSU5JVFkpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjdXJzaXZlbHkgZmxhdHRlbiBgYXJyYXlgIHVwIHRvIGBkZXB0aGAgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC40LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCBbMiwgWzMsIFs0XV0sIDVdXTtcbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbkRlcHRoKGFycmF5LCAxKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW5EZXB0aChhcnJheSwgMik7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIFs0XSwgNV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0dGVuRGVwdGgoYXJyYXksIGRlcHRoKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBkZXB0aCA9IGRlcHRoID09PSB1bmRlZmluZWQgPyAxIDogdG9JbnRlZ2VyKGRlcHRoKTtcbiAgICAgIHJldHVybiBiYXNlRmxhdHRlbihhcnJheSwgZGVwdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBpbnZlcnNlIG9mIGBfLnRvUGFpcnNgOyB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIG9iamVjdCBjb21wb3NlZFxuICAgICAqIGZyb20ga2V5LXZhbHVlIGBwYWlyc2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWlycyBUaGUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZnJvbVBhaXJzKFtbJ2EnLCAxXSwgWydiJywgMl1dKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tUGFpcnMocGFpcnMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhaXJzID09IG51bGwgPyAwIDogcGFpcnMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgcGFpciA9IHBhaXJzW2luZGV4XTtcbiAgICAgICAgcmVzdWx0W3BhaXJbMF1dID0gcGFpclsxXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGFsaWFzIGZpcnN0XG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaGVhZChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIF8uaGVhZChbXSk7XG4gICAgICogLy8gPT4gdW5kZWZpbmVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGVhZChhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYXJyYXlbMF0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYHZhbHVlYCBpcyBmb3VuZCBpbiBgYXJyYXlgXG4gICAgICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCdzIHVzZWQgYXMgdGhlXG4gICAgICogb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbmRleE9mKFsxLCAyLCAxLCAyXSwgMik7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogLy8gU2VhcmNoIGZyb20gdGhlIGBmcm9tSW5kZXhgLlxuICAgICAqIF8uaW5kZXhPZihbMSwgMiwgMSwgMl0sIDIsIDIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggPT0gbnVsbCA/IDAgOiB0b0ludGVnZXIoZnJvbUluZGV4KTtcbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgaW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGJ1dCB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluaXRpYWwoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbml0aWFsKGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYmFzZVNsaWNlKGFycmF5LCAwLCAtMSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gYWxsIGdpdmVuIGFycmF5c1xuICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBpbnRlcnNlY3RpbmcgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmludGVyc2VjdGlvbihbMiwgMV0sIFsyLCAzXSk7XG4gICAgICogLy8gPT4gWzJdXG4gICAgICovXG4gICAgdmFyIGludGVyc2VjdGlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIG1hcHBlZCA9IGFycmF5TWFwKGFycmF5cywgY2FzdEFycmF5TGlrZU9iamVjdCk7XG4gICAgICByZXR1cm4gKG1hcHBlZC5sZW5ndGggJiYgbWFwcGVkWzBdID09PSBhcnJheXNbMF0pXG4gICAgICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmludGVyc2VjdGlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvblxuICAgICAqIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICAgICAqIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDpcbiAgICAgKiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBpbnRlcnNlY3RpbmcgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmludGVyc2VjdGlvbkJ5KFsyLjEsIDEuMl0sIFsyLjMsIDMuNF0sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsyLjFdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmludGVyc2VjdGlvbkJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSB9XVxuICAgICAqL1xuICAgIHZhciBpbnRlcnNlY3Rpb25CeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGl0ZXJhdGVlID0gbGFzdChhcnJheXMpLFxuICAgICAgICAgIG1hcHBlZCA9IGFycmF5TWFwKGFycmF5cywgY2FzdEFycmF5TGlrZU9iamVjdCk7XG5cbiAgICAgIGlmIChpdGVyYXRlZSA9PT0gbGFzdChtYXBwZWQpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFwcGVkLnBvcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChtYXBwZWQubGVuZ3RoICYmIG1hcHBlZFswXSA9PT0gYXJyYXlzWzBdKVxuICAgICAgICA/IGJhc2VJbnRlcnNlY3Rpb24obWFwcGVkLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmludGVyc2VjdGlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5c2AuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlc1xuICAgICAqIG9mIHJlc3VsdCB2YWx1ZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgY29tcGFyYXRvciBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGludGVyc2VjdGluZyB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8uaW50ZXJzZWN0aW9uV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfV1cbiAgICAgKi9cbiAgICB2YXIgaW50ZXJzZWN0aW9uV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KGFycmF5cyksXG4gICAgICAgICAgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTtcblxuICAgICAgY29tcGFyYXRvciA9IHR5cGVvZiBjb21wYXJhdG9yID09ICdmdW5jdGlvbicgPyBjb21wYXJhdG9yIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICAgICAgbWFwcGVkLnBvcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChtYXBwZWQubGVuZ3RoICYmIG1hcHBlZFswXSA9PT0gYXJyYXlzWzBdKVxuICAgICAgICA/IGJhc2VJbnRlcnNlY3Rpb24obWFwcGVkLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhbGwgZWxlbWVudHMgaW4gYGFycmF5YCBpbnRvIGEgc3RyaW5nIHNlcGFyYXRlZCBieSBgc2VwYXJhdG9yYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb252ZXJ0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VwYXJhdG9yPScsJ10gVGhlIGVsZW1lbnQgc2VwYXJhdG9yLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGpvaW5lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uam9pbihbJ2EnLCAnYicsICdjJ10sICd+Jyk7XG4gICAgICogLy8gPT4gJ2F+Yn5jJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGpvaW4oYXJyYXksIHNlcGFyYXRvcikge1xuICAgICAgcmV0dXJuIGFycmF5ID09IG51bGwgPyAnJyA6IG5hdGl2ZUpvaW4uY2FsbChhcnJheSwgc2VwYXJhdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubGFzdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXN0KGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYXJyYXlbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbmRleE9mYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGFycmF5YCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWFycmF5Lmxlbmd0aC0xXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sYXN0SW5kZXhPZihbMSwgMiwgMSwgMl0sIDIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIC8vIFNlYXJjaCBmcm9tIHRoZSBgZnJvbUluZGV4YC5cbiAgICAgKiBfLmxhc3RJbmRleE9mKFsxLCAyLCAxLCAyXSwgMiwgMik7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBsZW5ndGg7XG4gICAgICBpZiAoZnJvbUluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaW5kZXggPSB0b0ludGVnZXIoZnJvbUluZGV4KTtcbiAgICAgICAgaW5kZXggPSBpbmRleCA8IDAgPyBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApIDogbmF0aXZlTWluKGluZGV4LCBsZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVcbiAgICAgICAgPyBzdHJpY3RMYXN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGluZGV4KVxuICAgICAgICA6IGJhc2VGaW5kSW5kZXgoYXJyYXksIGJhc2VJc05hTiwgaW5kZXgsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGVsZW1lbnQgYXQgaW5kZXggYG5gIG9mIGBhcnJheWAuIElmIGBuYCBpcyBuZWdhdGl2ZSwgdGhlIG50aFxuICAgICAqIGVsZW1lbnQgZnJvbSB0aGUgZW5kIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MF0gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJldHVybi5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbnRoIGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdkJ107XG4gICAgICpcbiAgICAgKiBfLm50aChhcnJheSwgMSk7XG4gICAgICogLy8gPT4gJ2InXG4gICAgICpcbiAgICAgKiBfLm50aChhcnJheSwgLTIpO1xuICAgICAqIC8vID0+ICdjJztcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBudGgoYXJyYXksIG4pIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VOdGgoYXJyYXksIHRvSW50ZWdlcihuKSkgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgZ2l2ZW4gdmFsdWVzIGZyb20gYGFycmF5YCB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy53aXRob3V0YCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLiBVc2UgYF8ucmVtb3ZlYFxuICAgICAqIHRvIHJlbW92ZSBlbGVtZW50cyBmcm9tIGFuIGFycmF5IGJ5IHByZWRpY2F0ZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdhJywgJ2InLCAnYyddO1xuICAgICAqXG4gICAgICogXy5wdWxsKGFycmF5LCAnYScsICdjJyk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYicsICdiJ11cbiAgICAgKi9cbiAgICB2YXIgcHVsbCA9IGJhc2VSZXN0KHB1bGxBbGwpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wdWxsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGFuIGFycmF5IG9mIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdhJywgJ2InLCAnYyddO1xuICAgICAqXG4gICAgICogXy5wdWxsQWxsKGFycmF5LCBbJ2EnLCAnYyddKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWydiJywgJ2InXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHB1bGxBbGwoYXJyYXksIHZhbHVlcykge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGggJiYgdmFsdWVzICYmIHZhbHVlcy5sZW5ndGgpXG4gICAgICAgID8gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcylcbiAgICAgICAgOiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnB1bGxBbGxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIGFuZCBgdmFsdWVzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uXG4gICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VCeWAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH0sIHsgJ3gnOiAzIH0sIHsgJ3gnOiAxIH1dO1xuICAgICAqXG4gICAgICogXy5wdWxsQWxsQnkoYXJyYXksIFt7ICd4JzogMSB9LCB7ICd4JzogMyB9XSwgJ3gnKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHVsbEFsbEJ5KGFycmF5LCB2YWx1ZXMsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCAmJiB2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aClcbiAgICAgICAgPyBiYXNlUHVsbEFsbChhcnJheSwgdmFsdWVzLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wdWxsQWxsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgIHRvIGB2YWx1ZXNgLiBUaGUgY29tcGFyYXRvciBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5kaWZmZXJlbmNlV2l0aGAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjYuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMywgJ3knOiA0IH0sIHsgJ3gnOiA1LCAneSc6IDYgfV07XG4gICAgICpcbiAgICAgKiBfLnB1bGxBbGxXaXRoKGFycmF5LCBbeyAneCc6IDMsICd5JzogNCB9XSwgXy5pc0VxdWFsKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDUsICd5JzogNiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHB1bGxBbGxXaXRoKGFycmF5LCB2YWx1ZXMsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoICYmIHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoKVxuICAgICAgICA/IGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMsIHVuZGVmaW5lZCwgY29tcGFyYXRvcilcbiAgICAgICAgOiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGVsZW1lbnRzIGZyb20gYGFycmF5YCBjb3JyZXNwb25kaW5nIHRvIGBpbmRleGVzYCBhbmQgcmV0dXJucyBhblxuICAgICAqIGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmF0YCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0gey4uLihudW1iZXJ8bnVtYmVyW10pfSBbaW5kZXhlc10gVGhlIGluZGV4ZXMgb2YgZWxlbWVudHMgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsnYScsICdiJywgJ2MnLCAnZCddO1xuICAgICAqIHZhciBwdWxsZWQgPSBfLnB1bGxBdChhcnJheSwgWzEsIDNdKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYyddXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhwdWxsZWQpO1xuICAgICAqIC8vID0+IFsnYicsICdkJ11cbiAgICAgKi9cbiAgICB2YXIgcHVsbEF0ID0gZmxhdFJlc3QoZnVuY3Rpb24oYXJyYXksIGluZGV4ZXMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBiYXNlQXQoYXJyYXksIGluZGV4ZXMpO1xuXG4gICAgICBiYXNlUHVsbEF0KGFycmF5LCBhcnJheU1hcChpbmRleGVzLCBmdW5jdGlvbihpbmRleCkge1xuICAgICAgICByZXR1cm4gaXNJbmRleChpbmRleCwgbGVuZ3RoKSA/ICtpbmRleCA6IGluZGV4O1xuICAgICAgfSkuc29ydChjb21wYXJlQXNjZW5kaW5nKSk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBlbGVtZW50cyBmcm9tIGBhcnJheWAgdGhhdCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3JcbiAgICAgKiBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB0aGUgcmVtb3ZlZCBlbGVtZW50cy4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZmlsdGVyYCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLiBVc2UgYF8ucHVsbGBcbiAgICAgKiB0byBwdWxsIGVsZW1lbnRzIGZyb20gYW4gYXJyYXkgYnkgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZW1vdmVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgMywgNF07XG4gICAgICogdmFyIGV2ZW5zID0gXy5yZW1vdmUoYXJyYXksIGZ1bmN0aW9uKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICUgMiA9PSAwO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAzXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coZXZlbnMpO1xuICAgICAqIC8vID0+IFsyLCA0XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlbW92ZShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpbmRleGVzID0gW10sXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBwcmVkaWNhdGUgPSBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICAgIGluZGV4ZXMucHVzaChpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJhc2VQdWxsQXQoYXJyYXksIGluZGV4ZXMpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnNlcyBgYXJyYXlgIHNvIHRoYXQgdGhlIGZpcnN0IGVsZW1lbnQgYmVjb21lcyB0aGUgbGFzdCwgdGhlIHNlY29uZFxuICAgICAqIGVsZW1lbnQgYmVjb21lcyB0aGUgc2Vjb25kIHRvIGxhc3QsIGFuZCBzbyBvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAgYW5kIGlzIGJhc2VkIG9uXG4gICAgICogW2BBcnJheSNyZXZlcnNlYF0oaHR0cHM6Ly9tZG4uaW8vQXJyYXkvcmV2ZXJzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICpcbiAgICAgKiBfLnJldmVyc2UoYXJyYXkpO1xuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJldmVyc2UoYXJyYXkpIHtcbiAgICAgIHJldHVybiBhcnJheSA9PSBudWxsID8gYXJyYXkgOiBuYXRpdmVSZXZlcnNlLmNhbGwoYXJyYXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIGZyb20gYHN0YXJ0YCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW5zdGVhZCBvZlxuICAgICAqIFtgQXJyYXkjc2xpY2VgXShodHRwczovL21kbi5pby9BcnJheS9zbGljZSkgdG8gZW5zdXJlIGRlbnNlIGFycmF5cyBhcmVcbiAgICAgKiByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzbGljZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoZW5kICYmIHR5cGVvZiBlbmQgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoYXJyYXksIHN0YXJ0LCBlbmQpKSB7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgZW5kID0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHN0YXJ0ID0gc3RhcnQgPT0gbnVsbCA/IDAgOiB0b0ludGVnZXIoc3RhcnQpO1xuICAgICAgICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvSW50ZWdlcihlbmQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlcyBhIGJpbmFyeSBzZWFyY2ggdG8gZGV0ZXJtaW5lIHRoZSBsb3dlc3QgaW5kZXggYXQgd2hpY2ggYHZhbHVlYFxuICAgICAqIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIGBhcnJheWAgaW4gb3JkZXIgdG8gbWFpbnRhaW4gaXRzIHNvcnQgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZEluZGV4KFszMCwgNTBdLCA0MCk7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydGVkSW5kZXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgZm9yIGB2YWx1ZWAgYW5kIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIHRvIGNvbXB1dGUgdGhlaXJcbiAgICAgKiBzb3J0IHJhbmtpbmcuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiA0IH0sIHsgJ3gnOiA1IH1dO1xuICAgICAqXG4gICAgICogXy5zb3J0ZWRJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ueDsgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zb3J0ZWRJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sICd4Jyk7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IHBlcmZvcm1zIGEgYmluYXJ5XG4gICAgICogc2VhcmNoIG9uIGEgc29ydGVkIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkSW5kZXhPZihbNCwgNSwgNSwgNSwgNl0sIDUpO1xuICAgICAqIC8vID0+IDFcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRJbmRleE9mKGFycmF5LCB2YWx1ZSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICB2YXIgaW5kZXggPSBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlKTtcbiAgICAgICAgaWYgKGluZGV4IDwgbGVuZ3RoICYmIGVxKGFycmF5W2luZGV4XSwgdmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRJbmRleGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUgaGlnaGVzdFxuICAgICAqIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0b1xuICAgICAqIG1haW50YWluIGl0cyBzb3J0IG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXgoWzQsIDUsIDUsIDUsIDZdLCA1KTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4KGFycmF5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydGVkTGFzdEluZGV4YCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIGZvciBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlIHRoZWlyXG4gICAgICogc29ydCByYW5raW5nLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogNCB9LCB7ICd4JzogNSB9XTtcbiAgICAgKlxuICAgICAqIF8uc29ydGVkTGFzdEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgZnVuY3Rpb24obykgeyByZXR1cm4gby54OyB9KTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvcnRlZExhc3RJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sICd4Jyk7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZExhc3RJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5sYXN0SW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgcGVyZm9ybXMgYSBiaW5hcnlcbiAgICAgKiBzZWFyY2ggb24gYSBzb3J0ZWQgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXhPZihbNCwgNSwgNSwgNSwgNl0sIDUpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXhPZihhcnJheSwgdmFsdWUpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgdHJ1ZSkgLSAxO1xuICAgICAgICBpZiAoZXEoYXJyYXlbaW5kZXhdLCB2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFgIGV4Y2VwdCB0aGF0IGl0J3MgZGVzaWduZWQgYW5kIG9wdGltaXplZFxuICAgICAqIGZvciBzb3J0ZWQgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkVW5pcShbMSwgMSwgMl0pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZFVuaXEoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VTb3J0ZWRVbmlxKGFycmF5KVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcUJ5YCBleGNlcHQgdGhhdCBpdCdzIGRlc2lnbmVkIGFuZCBvcHRpbWl6ZWRcbiAgICAgKiBmb3Igc29ydGVkIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkVW5pcUJ5KFsxLjEsIDEuMiwgMi4zLCAyLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMS4xLCAyLjNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkVW5pcUJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVNvcnRlZFVuaXEoYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBidXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGFpbChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRhaWwoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlU2xpY2UoYXJyYXksIDEsIGxlbmd0aCkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBiZWdpbm5pbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gdGFrZS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIF8udGFrZShbMSwgMiwgM10sIDUpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlKGFycmF5LCBuLCBndWFyZCkge1xuICAgICAgaWYgKCEoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgMCwgbiA8IDAgPyAwIDogbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBgbmAgZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgZW5kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRha2UuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlUmlnaHQoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgbiA9IGxlbmd0aCAtIG47XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCBuIDwgMCA/IDAgOiBuLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgZW5kLiBFbGVtZW50cyBhcmVcbiAgICAgKiB0YWtlbiB1bnRpbCBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGhcbiAgICAgKiB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVJpZ2h0V2hpbGUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRha2VSaWdodFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgZmFsc2UsIHRydWUpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBiZWdpbm5pbmcuIEVsZW1lbnRzXG4gICAgICogYXJlIHRha2VuIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aFxuICAgICAqIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFrZVdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMsIGluIG9yZGVyLCBmcm9tIGFsbCBnaXZlbiBhcnJheXMgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pb24oWzJdLCBbMSwgMl0pO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqL1xuICAgIHZhciB1bmlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pb25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBlYWNoIGBhcnJheXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnlcbiAgICAgKiB3aGljaCB1bmlxdWVuZXNzIGlzIGNvbXB1dGVkLiBSZXN1bHQgdmFsdWVzIGFyZSBjaG9zZW4gZnJvbSB0aGUgZmlyc3RcbiAgICAgKiBhcnJheSBpbiB3aGljaCB0aGUgdmFsdWUgb2NjdXJzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDpcbiAgICAgKiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pb25CeShbMi4xXSwgWzEuMiwgMi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzIuMSwgMS4yXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy51bmlvbkJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIHZhciB1bmlvbkJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KGFycmF5cyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5c2AuIFJlc3VsdCB2YWx1ZXMgYXJlIGNob3NlbiBmcm9tXG4gICAgICogdGhlIGZpcnN0IGFycmF5IGluIHdoaWNoIHRoZSB2YWx1ZSBvY2N1cnMuIFRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tYmluZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICogdmFyIG90aGVycyA9IFt7ICd4JzogMSwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLnVuaW9uV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAxIH1dXG4gICAgICovXG4gICAgdmFyIHVuaW9uV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KGFycmF5cyk7XG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIHVuZGVmaW5lZCwgY29tcGFyYXRvcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZHVwbGljYXRlLWZyZWUgdmVyc2lvbiBvZiBhbiBhcnJheSwgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucywgaW4gd2hpY2ggb25seSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBlYWNoIGVsZW1lbnRcbiAgICAgKiBpcyBrZXB0LiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyXG4gICAgICogaW4gdGhlIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pcShbMiwgMSwgMl0pO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXEoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5KSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaFxuICAgICAqIHVuaXF1ZW5lc3MgaXMgY29tcHV0ZWQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlXG4gICAgICogb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pcUJ5KFsyLjEsIDEuMiwgMi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzIuMSwgMS4yXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy51bmlxQnkoW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXFCeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpc1xuICAgICAqIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5LlRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLnVuaXFXaXRoKG9iamVjdHMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXFXaXRoKGFycmF5LCBjb21wYXJhdG9yKSB7XG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBiYXNlVW5pcShhcnJheSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uemlwYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGFuIGFycmF5IG9mIGdyb3VwZWRcbiAgICAgKiBlbGVtZW50cyBhbmQgY3JlYXRlcyBhbiBhcnJheSByZWdyb3VwaW5nIHRoZSBlbGVtZW50cyB0byB0aGVpciBwcmUtemlwXG4gICAgICogY29uZmlndXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjIuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcmVncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgemlwcGVkID0gXy56aXAoWydhJywgJ2InXSwgWzEsIDJdLCBbdHJ1ZSwgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBbWydhJywgMSwgdHJ1ZV0sIFsnYicsIDIsIGZhbHNlXV1cbiAgICAgKlxuICAgICAqIF8udW56aXAoemlwcGVkKTtcbiAgICAgKiAvLyA9PiBbWydhJywgJ2InXSwgWzEsIDJdLCBbdHJ1ZSwgZmFsc2VdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuemlwKGFycmF5KSB7XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSAwO1xuICAgICAgYXJyYXkgPSBhcnJheUZpbHRlcihhcnJheSwgZnVuY3Rpb24oZ3JvdXApIHtcbiAgICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGdyb3VwKSkge1xuICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChncm91cC5sZW5ndGgsIGxlbmd0aCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGJhc2VUaW1lcyhsZW5ndGgsIGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICAgIHJldHVybiBhcnJheU1hcChhcnJheSwgYmFzZVByb3BlcnR5KGluZGV4KSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuemlwYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgdG8gc3BlY2lmeVxuICAgICAqIGhvdyByZWdyb3VwZWQgdmFsdWVzIHNob3VsZCBiZSBjb21iaW5lZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aGVcbiAgICAgKiBlbGVtZW50cyBvZiBlYWNoIGdyb3VwOiAoLi4uZ3JvdXApLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmVcbiAgICAgKiAgcmVncm91cGVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZWdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB6aXBwZWQgPSBfLnppcChbMSwgMl0sIFsxMCwgMjBdLCBbMTAwLCAyMDBdKTtcbiAgICAgKiAvLyA9PiBbWzEsIDEwLCAxMDBdLCBbMiwgMjAsIDIwMF1dXG4gICAgICpcbiAgICAgKiBfLnVuemlwV2l0aCh6aXBwZWQsIF8uYWRkKTtcbiAgICAgKiAvLyA9PiBbMywgMzAsIDMwMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bnppcFdpdGgoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSB1bnppcChhcnJheSk7XG4gICAgICBpZiAoaXRlcmF0ZWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5TWFwKHJlc3VsdCwgZnVuY3Rpb24oZ3JvdXApIHtcbiAgICAgICAgcmV0dXJuIGFwcGx5KGl0ZXJhdGVlLCB1bmRlZmluZWQsIGdyb3VwKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgZXhjbHVkaW5nIGFsbCBnaXZlbiB2YWx1ZXMgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQHNlZSBfLmRpZmZlcmVuY2UsIF8ueG9yXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ud2l0aG91dChbMiwgMSwgMiwgM10sIDEsIDIpO1xuICAgICAqIC8vID0+IFszXVxuICAgICAqL1xuICAgIHZhciB3aXRob3V0ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCB2YWx1ZXMpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgdGhhdCBpcyB0aGVcbiAgICAgKiBbc3ltbWV0cmljIGRpZmZlcmVuY2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1N5bW1ldHJpY19kaWZmZXJlbmNlKVxuICAgICAqIG9mIHRoZSBnaXZlbiBhcnJheXMuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyXG4gICAgICogdGhleSBvY2N1ciBpbiB0aGUgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZSwgXy53aXRob3V0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ueG9yKFsyLCAxXSwgWzIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMSwgM11cbiAgICAgKi9cbiAgICB2YXIgeG9yID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICByZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsIGlzQXJyYXlMaWtlT2JqZWN0KSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnhvcmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieVxuICAgICAqIHdoaWNoIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWRcbiAgICAgKiBieSB0aGUgb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXlzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZVxuICAgICAqIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ueG9yQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzEuMiwgMy40XVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy54b3JCeShbeyAneCc6IDEgfV0sIFt7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgJ3gnKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIgfV1cbiAgICAgKi9cbiAgICB2YXIgeG9yQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChpdGVyYXRlZSkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsIGlzQXJyYXlMaWtlT2JqZWN0KSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ueG9yYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlzYC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXNcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuIFRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICogdmFyIG90aGVycyA9IFt7ICd4JzogMSwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLnhvcldpdGgob2JqZWN0cywgb3RoZXJzLCBfLmlzRXF1YWwpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDEgfV1cbiAgICAgKi9cbiAgICB2YXIgeG9yV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KGFycmF5cyk7XG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsIGlzQXJyYXlMaWtlT2JqZWN0KSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cywgdGhlIGZpcnN0IG9mIHdoaWNoIGNvbnRhaW5zIHRoZVxuICAgICAqIGZpcnN0IGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBhcnJheXMsIHRoZSBzZWNvbmQgb2Ygd2hpY2ggY29udGFpbnMgdGhlXG4gICAgICogc2Vjb25kIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBhcnJheXMsIGFuZCBzbyBvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcChbJ2EnLCAnYiddLCBbMSwgMl0sIFt0cnVlLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IFtbJ2EnLCAxLCB0cnVlXSwgWydiJywgMiwgZmFsc2VdXVxuICAgICAqL1xuICAgIHZhciB6aXAgPSBiYXNlUmVzdCh1bnppcCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZyb21QYWlyc2AgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyB0d28gYXJyYXlzLFxuICAgICAqIG9uZSBvZiBwcm9wZXJ0eSBpZGVudGlmaWVycyBhbmQgb25lIG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gW3Byb3BzPVtdXSBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlcz1bXV0gVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcE9iamVjdChbJ2EnLCAnYiddLCBbMSwgMl0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHppcE9iamVjdChwcm9wcywgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gYmFzZVppcE9iamVjdChwcm9wcyB8fCBbXSwgdmFsdWVzIHx8IFtdLCBhc3NpZ25WYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy56aXBPYmplY3RgIGV4Y2VwdCB0aGF0IGl0IHN1cHBvcnRzIHByb3BlcnR5IHBhdGhzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gW3Byb3BzPVtdXSBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlcz1bXV0gVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcE9iamVjdERlZXAoWydhLmJbMF0uYycsICdhLmJbMV0uZCddLCBbMSwgMl0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiB7ICdiJzogW3sgJ2MnOiAxIH0sIHsgJ2QnOiAyIH1dIH0gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHppcE9iamVjdERlZXAocHJvcHMsIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHMgfHwgW10sIHZhbHVlcyB8fCBbXSwgYmFzZVNldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy56aXBgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB0byBzcGVjaWZ5XG4gICAgICogaG93IGdyb3VwZWQgdmFsdWVzIHNob3VsZCBiZSBjb21iaW5lZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aGVcbiAgICAgKiBlbGVtZW50cyBvZiBlYWNoIGdyb3VwOiAoLi4uZ3JvdXApLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gdG8gY29tYmluZVxuICAgICAqICBncm91cGVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcFdpdGgoWzEsIDJdLCBbMTAsIDIwXSwgWzEwMCwgMjAwXSwgZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIGEgKyBiICsgYztcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBbMTExLCAyMjJdXG4gICAgICovXG4gICAgdmFyIHppcFdpdGggPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheXMubGVuZ3RoLFxuICAgICAgICAgIGl0ZXJhdGVlID0gbGVuZ3RoID4gMSA/IGFycmF5c1tsZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgaXRlcmF0ZWUgPSB0eXBlb2YgaXRlcmF0ZWUgPT0gJ2Z1bmN0aW9uJyA/IChhcnJheXMucG9wKCksIGl0ZXJhdGVlKSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB1bnppcFdpdGgoYXJyYXlzLCBpdGVyYXRlZSk7XG4gICAgfSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZSB0aGF0IHdyYXBzIGB2YWx1ZWAgd2l0aCBleHBsaWNpdCBtZXRob2RcbiAgICAgKiBjaGFpbiBzZXF1ZW5jZXMgZW5hYmxlZC4gVGhlIHJlc3VsdCBvZiBzdWNoIHNlcXVlbmNlcyBtdXN0IGJlIHVud3JhcHBlZFxuICAgICAqIHdpdGggYF8jdmFsdWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMy4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIHZhciB5b3VuZ2VzdCA9IF9cbiAgICAgKiAgIC5jaGFpbih1c2VycylcbiAgICAgKiAgIC5zb3J0QnkoJ2FnZScpXG4gICAgICogICAubWFwKGZ1bmN0aW9uKG8pIHtcbiAgICAgKiAgICAgcmV0dXJuIG8udXNlciArICcgaXMgJyArIG8uYWdlO1xuICAgICAqICAgfSlcbiAgICAgKiAgIC5oZWFkKClcbiAgICAgKiAgIC52YWx1ZSgpO1xuICAgICAqIC8vID0+ICdwZWJibGVzIGlzIDEnXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2hhaW4odmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBsb2Rhc2godmFsdWUpO1xuICAgICAgcmVzdWx0Ll9fY2hhaW5fXyA9IHRydWU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGludm9rZXMgYGludGVyY2VwdG9yYCBhbmQgcmV0dXJucyBgdmFsdWVgLiBUaGUgaW50ZXJjZXB0b3JcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAodmFsdWUpLiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0b1xuICAgICAqIFwidGFwIGludG9cIiBhIG1ldGhvZCBjaGFpbiBzZXF1ZW5jZSBpbiBvcmRlciB0byBtb2RpZnkgaW50ZXJtZWRpYXRlIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvdmlkZSB0byBgaW50ZXJjZXB0b3JgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGludGVyY2VwdG9yIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXyhbMSwgMiwgM10pXG4gICAgICogIC50YXAoZnVuY3Rpb24oYXJyYXkpIHtcbiAgICAgKiAgICAvLyBNdXRhdGUgaW5wdXQgYXJyYXkuXG4gICAgICogICAgYXJyYXkucG9wKCk7XG4gICAgICogIH0pXG4gICAgICogIC5yZXZlcnNlKClcbiAgICAgKiAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFwKHZhbHVlLCBpbnRlcmNlcHRvcikge1xuICAgICAgaW50ZXJjZXB0b3IodmFsdWUpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udGFwYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgYGludGVyY2VwdG9yYC5cbiAgICAgKiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBcInBhc3MgdGhydVwiIHZhbHVlcyByZXBsYWNpbmcgaW50ZXJtZWRpYXRlXG4gICAgICogcmVzdWx0cyBpbiBhIG1ldGhvZCBjaGFpbiBzZXF1ZW5jZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm92aWRlIHRvIGBpbnRlcmNlcHRvcmAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaW50ZXJjZXB0b3IgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBpbnRlcmNlcHRvcmAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oJyAgYWJjICAnKVxuICAgICAqICAuY2hhaW4oKVxuICAgICAqICAudHJpbSgpXG4gICAgICogIC50aHJ1KGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICAgcmV0dXJuIFt2YWx1ZV07XG4gICAgICogIH0pXG4gICAgICogIC52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsnYWJjJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0aHJ1KHZhbHVlLCBpbnRlcmNlcHRvcikge1xuICAgICAgcmV0dXJuIGludGVyY2VwdG9yKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgd3JhcHBlciB2ZXJzaW9uIG9mIGBfLmF0YC5cbiAgICAgKlxuICAgICAqIEBuYW1lIGF0XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfSwgNF0gfTtcbiAgICAgKlxuICAgICAqIF8ob2JqZWN0KS5hdChbJ2FbMF0uYi5jJywgJ2FbMV0nXSkudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMywgNF1cbiAgICAgKi9cbiAgICB2YXIgd3JhcHBlckF0ID0gZmxhdFJlc3QoZnVuY3Rpb24ocGF0aHMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICAgICAgc3RhcnQgPSBsZW5ndGggPyBwYXRoc1swXSA6IDAsXG4gICAgICAgICAgdmFsdWUgPSB0aGlzLl9fd3JhcHBlZF9fLFxuICAgICAgICAgIGludGVyY2VwdG9yID0gZnVuY3Rpb24ob2JqZWN0KSB7IHJldHVybiBiYXNlQXQob2JqZWN0LCBwYXRocyk7IH07XG5cbiAgICAgIGlmIChsZW5ndGggPiAxIHx8IHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoIHx8XG4gICAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB8fCAhaXNJbmRleChzdGFydCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhydShpbnRlcmNlcHRvcik7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKHN0YXJ0LCArc3RhcnQgKyAobGVuZ3RoID8gMSA6IDApKTtcbiAgICAgIHZhbHVlLl9fYWN0aW9uc19fLnB1c2goe1xuICAgICAgICAnZnVuYyc6IHRocnUsXG4gICAgICAgICdhcmdzJzogW2ludGVyY2VwdG9yXSxcbiAgICAgICAgJ3RoaXNBcmcnOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHZhbHVlLCB0aGlzLl9fY2hhaW5fXykudGhydShmdW5jdGlvbihhcnJheSkge1xuICAgICAgICBpZiAobGVuZ3RoICYmICFhcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICBhcnJheS5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZSB3aXRoIGV4cGxpY2l0IG1ldGhvZCBjaGFpbiBzZXF1ZW5jZXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEBuYW1lIGNoYWluXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIEEgc2VxdWVuY2Ugd2l0aG91dCBleHBsaWNpdCBjaGFpbmluZy5cbiAgICAgKiBfKHVzZXJzKS5oZWFkKCk7XG4gICAgICogLy8gPT4geyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfVxuICAgICAqXG4gICAgICogLy8gQSBzZXF1ZW5jZSB3aXRoIGV4cGxpY2l0IGNoYWluaW5nLlxuICAgICAqIF8odXNlcnMpXG4gICAgICogICAuY2hhaW4oKVxuICAgICAqICAgLmhlYWQoKVxuICAgICAqICAgLnBpY2soJ3VzZXInKVxuICAgICAqICAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4geyAndXNlcic6ICdiYXJuZXknIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyQ2hhaW4oKSB7XG4gICAgICByZXR1cm4gY2hhaW4odGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIGNoYWluIHNlcXVlbmNlIGFuZCByZXR1cm5zIHRoZSB3cmFwcGVkIHJlc3VsdC5cbiAgICAgKlxuICAgICAqIEBuYW1lIGNvbW1pdFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMl07XG4gICAgICogdmFyIHdyYXBwZWQgPSBfKGFycmF5KS5wdXNoKDMpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogd3JhcHBlZCA9IHdyYXBwZWQuY29tbWl0KCk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogd3JhcHBlZC5sYXN0KCk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJDb21taXQoKSB7XG4gICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodGhpcy52YWx1ZSgpLCB0aGlzLl9fY2hhaW5fXyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbmV4dCB2YWx1ZSBvbiBhIHdyYXBwZWQgb2JqZWN0IGZvbGxvd2luZyB0aGVcbiAgICAgKiBbaXRlcmF0b3IgcHJvdG9jb2xdKGh0dHBzOi8vbWRuLmlvL2l0ZXJhdGlvbl9wcm90b2NvbHMjaXRlcmF0b3IpLlxuICAgICAqXG4gICAgICogQG5hbWUgbmV4dFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5leHQgaXRlcmF0b3IgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pO1xuICAgICAqXG4gICAgICogd3JhcHBlZC5uZXh0KCk7XG4gICAgICogLy8gPT4geyAnZG9uZSc6IGZhbHNlLCAndmFsdWUnOiAxIH1cbiAgICAgKlxuICAgICAqIHdyYXBwZWQubmV4dCgpO1xuICAgICAqIC8vID0+IHsgJ2RvbmUnOiBmYWxzZSwgJ3ZhbHVlJzogMiB9XG4gICAgICpcbiAgICAgKiB3cmFwcGVkLm5leHQoKTtcbiAgICAgKiAvLyA9PiB7ICdkb25lJzogdHJ1ZSwgJ3ZhbHVlJzogdW5kZWZpbmVkIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyTmV4dCgpIHtcbiAgICAgIGlmICh0aGlzLl9fdmFsdWVzX18gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLl9fdmFsdWVzX18gPSB0b0FycmF5KHRoaXMudmFsdWUoKSk7XG4gICAgICB9XG4gICAgICB2YXIgZG9uZSA9IHRoaXMuX19pbmRleF9fID49IHRoaXMuX192YWx1ZXNfXy5sZW5ndGgsXG4gICAgICAgICAgdmFsdWUgPSBkb25lID8gdW5kZWZpbmVkIDogdGhpcy5fX3ZhbHVlc19fW3RoaXMuX19pbmRleF9fKytdO1xuXG4gICAgICByZXR1cm4geyAnZG9uZSc6IGRvbmUsICd2YWx1ZSc6IHZhbHVlIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgd3JhcHBlciB0byBiZSBpdGVyYWJsZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIFN5bWJvbC5pdGVyYXRvclxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHdyYXBwZXIgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDJdKTtcbiAgICAgKlxuICAgICAqIHdyYXBwZWRbU3ltYm9sLml0ZXJhdG9yXSgpID09PSB3cmFwcGVkO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIEFycmF5LmZyb20od3JhcHBlZCk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlclRvSXRlcmF0b3IoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGNoYWluIHNlcXVlbmNlIHBsYW50aW5nIGB2YWx1ZWAgYXMgdGhlIHdyYXBwZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSBwbGFudFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHBsYW50LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pLm1hcChzcXVhcmUpO1xuICAgICAqIHZhciBvdGhlciA9IHdyYXBwZWQucGxhbnQoWzMsIDRdKTtcbiAgICAgKlxuICAgICAqIG90aGVyLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzksIDE2XVxuICAgICAqXG4gICAgICogd3JhcHBlZC52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsxLCA0XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJQbGFudCh2YWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCxcbiAgICAgICAgICBwYXJlbnQgPSB0aGlzO1xuXG4gICAgICB3aGlsZSAocGFyZW50IGluc3RhbmNlb2YgYmFzZUxvZGFzaCkge1xuICAgICAgICB2YXIgY2xvbmUgPSB3cmFwcGVyQ2xvbmUocGFyZW50KTtcbiAgICAgICAgY2xvbmUuX19pbmRleF9fID0gMDtcbiAgICAgICAgY2xvbmUuX192YWx1ZXNfXyA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHByZXZpb3VzLl9fd3JhcHBlZF9fID0gY2xvbmU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gY2xvbmU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByZXZpb3VzID0gY2xvbmU7XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5fX3dyYXBwZWRfXztcbiAgICAgIH1cbiAgICAgIHByZXZpb3VzLl9fd3JhcHBlZF9fID0gdmFsdWU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHRoZSB3cmFwcGVyIHZlcnNpb24gb2YgYF8ucmV2ZXJzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyB0aGUgd3JhcHBlZCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHJldmVyc2VcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDNdO1xuICAgICAqXG4gICAgICogXyhhcnJheSkucmV2ZXJzZSgpLnZhbHVlKClcbiAgICAgKiAvLyA9PiBbMywgMiwgMV1cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMywgMiwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyUmV2ZXJzZSgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX187XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikge1xuICAgICAgICB2YXIgd3JhcHBlZCA9IHZhbHVlO1xuICAgICAgICBpZiAodGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgpIHtcbiAgICAgICAgICB3cmFwcGVkID0gbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHdyYXBwZWQgPSB3cmFwcGVkLnJldmVyc2UoKTtcbiAgICAgICAgd3JhcHBlZC5fX2FjdGlvbnNfXy5wdXNoKHtcbiAgICAgICAgICAnZnVuYyc6IHRocnUsXG4gICAgICAgICAgJ2FyZ3MnOiBbcmV2ZXJzZV0sXG4gICAgICAgICAgJ3RoaXNBcmcnOiB1bmRlZmluZWRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVkLCB0aGlzLl9fY2hhaW5fXyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy50aHJ1KHJldmVyc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBjaGFpbiBzZXF1ZW5jZSB0byByZXNvbHZlIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSB2YWx1ZVxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGFsaWFzIHRvSlNPTiwgdmFsdWVPZlxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfKFsxLCAyLCAzXSkudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyVmFsdWUoKSB7XG4gICAgICByZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZSh0aGlzLl9fd3JhcHBlZF9fLCB0aGlzLl9fYWN0aW9uc19fKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYC4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2ZcbiAgICAgKiBlYWNoIGtleSBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBrZXkgd2FzIHJldHVybmVkIGJ5IGBpdGVyYXRlZWAuIFRoZVxuICAgICAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC41LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY291bnRCeShbNi4xLCA0LjIsIDYuM10sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IHsgJzQnOiAxLCAnNic6IDIgfVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5jb3VudEJ5KFsnb25lJywgJ3R3bycsICd0aHJlZSddLCAnbGVuZ3RoJyk7XG4gICAgICogLy8gPT4geyAnMyc6IDIsICc1JzogMSB9XG4gICAgICovXG4gICAgdmFyIGNvdW50QnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCBrZXkpKSB7XG4gICAgICAgICsrcmVzdWx0W2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIDEpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciAqKmFsbCoqIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBJdGVyYXRpb24gaXMgc3RvcHBlZCBvbmNlIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIHJldHVybnMgYHRydWVgIGZvclxuICAgICAqIFtlbXB0eSBjb2xsZWN0aW9uc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRW1wdHlfc2V0KSBiZWNhdXNlXG4gICAgICogW2V2ZXJ5dGhpbmcgaXMgdHJ1ZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVmFjdW91c190cnV0aCkgb2ZcbiAgICAgKiBlbGVtZW50cyBvZiBlbXB0eSBjb2xsZWN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgcGFzcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZXZlcnkoW3RydWUsIDEsIG51bGwsICd5ZXMnXSwgQm9vbGVhbik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZXZlcnkodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5ldmVyeSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZXZlcnkodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGV2ZXJ5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RXZlcnkgOiBiYXNlRXZlcnk7XG4gICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBndWFyZCkpIHtcbiAgICAgICAgcHJlZGljYXRlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAsIHJldHVybmluZyBhbiBhcnJheSBvZiBhbGwgZWxlbWVudHNcbiAgICAgKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnJlbW92ZWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAgICogQHNlZSBfLnJlamVjdFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcih1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIENvbWJpbmluZyBzZXZlcmFsIHByZWRpY2F0ZXMgdXNpbmcgYF8ub3ZlckV2ZXJ5YCBvciBgXy5vdmVyU29tZWAuXG4gICAgICogXy5maWx0ZXIodXNlcnMsIF8ub3ZlclNvbWUoW3sgJ2FnZSc6IDM2IH0sIFsnYWdlJywgNDBdXSkpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdiYXJuZXknXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RmlsdGVyIDogYmFzZUZpbHRlcjtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgdGhlIGZpcnN0IGVsZW1lbnRcbiAgICAgKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEsICAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAnYmFybmV5J1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmQodXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdCBmb3IgJ3BlYmJsZXMnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAnZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZCh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdCBmb3IgJ2Jhcm5leSdcbiAgICAgKi9cbiAgICB2YXIgZmluZCA9IGNyZWF0ZUZpbmQoZmluZEluZGV4KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWNvbGxlY3Rpb24ubGVuZ3RoLTFdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZpbmRMYXN0KFsxLCAyLCAzLCA0XSwgZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDE7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIHZhciBmaW5kTGFzdCA9IGNyZWF0ZUZpbmQoZmluZExhc3RJbmRleCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZmxhdHRlbmVkIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmBcbiAgICAgKiB0aHJ1IGBpdGVyYXRlZWAgYW5kIGZsYXR0ZW5pbmcgdGhlIG1hcHBlZCByZXN1bHRzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW24sIG5dO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmxhdE1hcChbMSwgMl0sIGR1cGxpY2F0ZSk7XG4gICAgICogLy8gPT4gWzEsIDEsIDIsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdE1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxhdE1hcGAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgZmxhdHRlbnMgdGhlXG4gICAgICogbWFwcGVkIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW1tbbiwgbl1dXTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZsYXRNYXBEZWVwKFsxLCAyXSwgZHVwbGljYXRlKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMiwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0TWFwRGVlcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIElORklOSVRZKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZsYXRNYXBgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIHRoZVxuICAgICAqIG1hcHBlZCByZXN1bHRzIHVwIHRvIGBkZXB0aGAgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW1tbbiwgbl1dXTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZsYXRNYXBEZXB0aChbMSwgMl0sIGR1cGxpY2F0ZSwgMik7XG4gICAgICogLy8gPT4gW1sxLCAxXSwgWzIsIDJdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXRNYXBEZXB0aChjb2xsZWN0aW9uLCBpdGVyYXRlZSwgZGVwdGgpIHtcbiAgICAgIGRlcHRoID0gZGVwdGggPT09IHVuZGVmaW5lZCA/IDEgOiB0b0ludGVnZXIoZGVwdGgpO1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIGRlcHRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIGVsZW1lbnQuXG4gICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogQXMgd2l0aCBvdGhlciBcIkNvbGxlY3Rpb25zXCIgbWV0aG9kcywgb2JqZWN0cyB3aXRoIGEgXCJsZW5ndGhcIlxuICAgICAqIHByb3BlcnR5IGFyZSBpdGVyYXRlZCBsaWtlIGFycmF5cy4gVG8gYXZvaWQgdGhpcyBiZWhhdmlvciB1c2UgYF8uZm9ySW5gXG4gICAgICogb3IgYF8uZm9yT3duYCBmb3Igb2JqZWN0IGl0ZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBhbGlhcyBlYWNoXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICogQHNlZSBfLmZvckVhY2hSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZvckVhY2goWzEsIDJdLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAqICAgY29uc29sZS5sb2codmFsdWUpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgYDFgIHRoZW4gYDJgLlxuICAgICAqXG4gICAgICogXy5mb3JFYWNoKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JFYWNoKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2ggOiBiYXNlRWFjaDtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JFYWNoYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBhbGlhcyBlYWNoUmlnaHRcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBAc2VlIF8uZm9yRWFjaFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZvckVhY2hSaWdodChbMSwgMl0sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyBgMmAgdGhlbiBgMWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9yRWFjaFJpZ2h0KGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2hSaWdodCA6IGJhc2VFYWNoUmlnaHQ7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgb3JkZXIgb2YgZ3JvdXBlZCB2YWx1ZXNcbiAgICAgKiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIGBjb2xsZWN0aW9uYC4gVGhlIGNvcnJlc3BvbmRpbmdcbiAgICAgKiB2YWx1ZSBvZiBlYWNoIGtleSBpcyBhbiBhcnJheSBvZiBlbGVtZW50cyByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGVcbiAgICAgKiBrZXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmdyb3VwQnkoWzYuMSwgNC4yLCA2LjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiB7ICc0JzogWzQuMl0sICc2JzogWzYuMSwgNi4zXSB9XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmdyb3VwQnkoWydvbmUnLCAndHdvJywgJ3RocmVlJ10sICdsZW5ndGgnKTtcbiAgICAgKiAvLyA9PiB7ICczJzogWydvbmUnLCAndHdvJ10sICc1JzogWyd0aHJlZSddIH1cbiAgICAgKi9cbiAgICB2YXIgZ3JvdXBCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIGtleSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIFt2YWx1ZV0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgaW4gYGNvbGxlY3Rpb25gLiBJZiBgY29sbGVjdGlvbmAgaXMgYSBzdHJpbmcsIGl0J3NcbiAgICAgKiBjaGVja2VkIGZvciBhIHN1YnN0cmluZyBvZiBgdmFsdWVgLCBvdGhlcndpc2VcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGlzIHVzZWQgZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBJZiBgZnJvbUluZGV4YCBpcyBuZWdhdGl2ZSwgaXQncyB1c2VkIGFzXG4gICAgICogdGhlIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5yZWR1Y2VgLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSwgMik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoeyAnYSc6IDEsICdiJzogMiB9LCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluY2x1ZGVzKCdhYmNkJywgJ2JjJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluY2x1ZGVzKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgsIGd1YXJkKSB7XG4gICAgICBjb2xsZWN0aW9uID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBjb2xsZWN0aW9uIDogdmFsdWVzKGNvbGxlY3Rpb24pO1xuICAgICAgZnJvbUluZGV4ID0gKGZyb21JbmRleCAmJiAhZ3VhcmQpID8gdG9JbnRlZ2VyKGZyb21JbmRleCkgOiAwO1xuXG4gICAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG4gICAgICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgICAgICBmcm9tSW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgZnJvbUluZGV4LCAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKVxuICAgICAgICA/IChmcm9tSW5kZXggPD0gbGVuZ3RoICYmIGNvbGxlY3Rpb24uaW5kZXhPZih2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKVxuICAgICAgICA6ICghIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihjb2xsZWN0aW9uLCB2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSBtZXRob2QgYXQgYHBhdGhgIG9mIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAsIHJldHVybmluZ1xuICAgICAqIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIGVhY2ggaW52b2tlZCBtZXRob2QuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgICAqIGFyZSBwcm92aWRlZCB0byBlYWNoIGludm9rZWQgbWV0aG9kLiBJZiBgcGF0aGAgaXMgYSBmdW5jdGlvbiwgaXQncyBpbnZva2VkXG4gICAgICogZm9yLCBhbmQgYHRoaXNgIGJvdW5kIHRvLCBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbnxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2Ugb3JcbiAgICAgKiAgdGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBlYWNoIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbnZva2VNYXAoW1s1LCAxLCA3XSwgWzMsIDIsIDFdXSwgJ3NvcnQnKTtcbiAgICAgKiAvLyA9PiBbWzEsIDUsIDddLCBbMSwgMiwgM11dXG4gICAgICpcbiAgICAgKiBfLmludm9rZU1hcChbMTIzLCA0NTZdLCBTdHJpbmcucHJvdG90eXBlLnNwbGl0LCAnJyk7XG4gICAgICogLy8gPT4gW1snMScsICcyJywgJzMnXSwgWyc0JywgJzUnLCAnNiddXVxuICAgICAqL1xuICAgIHZhciBpbnZva2VNYXAgPSBiYXNlUmVzdChmdW5jdGlvbihjb2xsZWN0aW9uLCBwYXRoLCBhcmdzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpc0Z1bmMgPSB0eXBlb2YgcGF0aCA9PSAnZnVuY3Rpb24nLFxuICAgICAgICAgIHJlc3VsdCA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gQXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpIDogW107XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJlc3VsdFsrK2luZGV4XSA9IGlzRnVuYyA/IGFwcGx5KHBhdGgsIHZhbHVlLCBhcmdzKSA6IGJhc2VJbnZva2UodmFsdWUsIHBhdGgsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nXG4gICAgICogZWFjaCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG9mXG4gICAgICogZWFjaCBrZXkgaXMgdGhlIGxhc3QgZWxlbWVudCByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUga2V5LiBUaGVcbiAgICAgKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbXG4gICAgICogICB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSxcbiAgICAgKiAgIHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5rZXlCeShhcnJheSwgZnVuY3Rpb24obykge1xuICAgICAqICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoby5jb2RlKTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sICdkJzogeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfSB9XG4gICAgICpcbiAgICAgKiBfLmtleUJ5KGFycmF5LCAnZGlyJyk7XG4gICAgICogLy8gPT4geyAnbGVmdCc6IHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LCAncmlnaHQnOiB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9IH1cbiAgICAgKi9cbiAgICB2YXIga2V5QnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCB2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgdGhydVxuICAgICAqIGBpdGVyYXRlZWAuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOlxuICAgICAqICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZVxuICAgICAqIGBfLmV2ZXJ5YCwgYF8uZmlsdGVyYCwgYF8ubWFwYCwgYF8ubWFwVmFsdWVzYCwgYF8ucmVqZWN0YCwgYW5kIGBfLnNvbWVgLlxuICAgICAqXG4gICAgICogVGhlIGd1YXJkZWQgbWV0aG9kcyBhcmU6XG4gICAgICogYGFyeWAsIGBjaHVua2AsIGBjdXJyeWAsIGBjdXJyeVJpZ2h0YCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCwgYGV2ZXJ5YCxcbiAgICAgKiBgZmlsbGAsIGBpbnZlcnRgLCBgcGFyc2VJbnRgLCBgcmFuZG9tYCwgYHJhbmdlYCwgYHJhbmdlUmlnaHRgLCBgcmVwZWF0YCxcbiAgICAgKiBgc2FtcGxlU2l6ZWAsIGBzbGljZWAsIGBzb21lYCwgYHNvcnRCeWAsIGBzcGxpdGAsIGB0YWtlYCwgYHRha2VSaWdodGAsXG4gICAgICogYHRlbXBsYXRlYCwgYHRyaW1gLCBgdHJpbUVuZGAsIGB0cmltU3RhcnRgLCBhbmQgYHdvcmRzYFxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8ubWFwKFs0LCA4XSwgc3F1YXJlKTtcbiAgICAgKiAvLyA9PiBbMTYsIDY0XVxuICAgICAqXG4gICAgICogXy5tYXAoeyAnYSc6IDQsICdiJzogOCB9LCBzcXVhcmUpO1xuICAgICAqIC8vID0+IFsxNiwgNjRdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1hcCh1c2VycywgJ3VzZXInKTtcbiAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5TWFwIDogYmFzZU1hcDtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0QnlgIGV4Y2VwdCB0aGF0IGl0IGFsbG93cyBzcGVjaWZ5aW5nIHRoZSBzb3J0XG4gICAgICogb3JkZXJzIG9mIHRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS4gSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXNcbiAgICAgKiBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4gT3RoZXJ3aXNlLCBzcGVjaWZ5IGFuIG9yZGVyIG9mIFwiZGVzY1wiIGZvclxuICAgICAqIGRlc2NlbmRpbmcgb3IgXCJhc2NcIiBmb3IgYXNjZW5kaW5nIHNvcnQgb3JkZXIgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5W118RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gW2l0ZXJhdGVlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbb3JkZXJzXSBUaGUgc29ydCBvcmRlcnMgb2YgYGl0ZXJhdGVlc2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ucmVkdWNlYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQ4IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gU29ydCBieSBgdXNlcmAgaW4gYXNjZW5kaW5nIG9yZGVyIGFuZCBieSBgYWdlYCBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuICAgICAqIF8ub3JkZXJCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddLCBbJ2FzYycsICdkZXNjJ10pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM2XSwgWydiYXJuZXknLCAzNF0sIFsnZnJlZCcsIDQ4XSwgWydmcmVkJywgNDBdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMsIGd1YXJkKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNBcnJheShpdGVyYXRlZXMpKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IGl0ZXJhdGVlcyA9PSBudWxsID8gW10gOiBbaXRlcmF0ZWVzXTtcbiAgICAgIH1cbiAgICAgIG9yZGVycyA9IGd1YXJkID8gdW5kZWZpbmVkIDogb3JkZXJzO1xuICAgICAgaWYgKCFpc0FycmF5KG9yZGVycykpIHtcbiAgICAgICAgb3JkZXJzID0gb3JkZXJzID09IG51bGwgPyBbXSA6IFtvcmRlcnNdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHNwbGl0IGludG8gdHdvIGdyb3VwcywgdGhlIGZpcnN0IG9mIHdoaWNoXG4gICAgICogY29udGFpbnMgZWxlbWVudHMgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLCB0aGUgc2Vjb25kIG9mIHdoaWNoXG4gICAgICogY29udGFpbnMgZWxlbWVudHMgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkgZm9yLiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snZnJlZCddLCBbJ2Jhcm5leScsICdwZWJibGVzJ11dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCB7ICdhZ2UnOiAxLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1sncGViYmxlcyddLCBbJ2Jhcm5leScsICdmcmVkJ11dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAncGViYmxlcyddLCBbJ2ZyZWQnXV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snZnJlZCddLCBbJ2Jhcm5leScsICdwZWJibGVzJ11dXG4gICAgICovXG4gICAgdmFyIHBhcnRpdGlvbiA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICByZXN1bHRba2V5ID8gMCA6IDFdLnB1c2godmFsdWUpO1xuICAgIH0sIGZ1bmN0aW9uKCkgeyByZXR1cm4gW1tdLCBbXV07IH0pO1xuXG4gICAgLyoqXG4gICAgICogUmVkdWNlcyBgY29sbGVjdGlvbmAgdG8gYSB2YWx1ZSB3aGljaCBpcyB0aGUgYWNjdW11bGF0ZWQgcmVzdWx0IG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYCwgd2hlcmUgZWFjaCBzdWNjZXNzaXZlXG4gICAgICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy4gSWYgYGFjY3VtdWxhdG9yYFxuICAgICAqIGlzIG5vdCBnaXZlbiwgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIGlzIHVzZWQgYXMgdGhlIGluaXRpYWxcbiAgICAgKiB2YWx1ZS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czpcbiAgICAgKiAoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gICAgICogYF8ucmVkdWNlYCwgYF8ucmVkdWNlUmlnaHRgLCBhbmQgYF8udHJhbnNmb3JtYC5cbiAgICAgKlxuICAgICAqIFRoZSBndWFyZGVkIG1ldGhvZHMgYXJlOlxuICAgICAqIGBhc3NpZ25gLCBgZGVmYXVsdHNgLCBgZGVmYXVsdHNEZWVwYCwgYGluY2x1ZGVzYCwgYG1lcmdlYCwgYG9yZGVyQnlgLFxuICAgICAqIGFuZCBgc29ydEJ5YFxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8ucmVkdWNlUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yZWR1Y2UoWzEsIDJdLCBmdW5jdGlvbihzdW0sIG4pIHtcbiAgICAgKiAgIHJldHVybiBzdW0gKyBuO1xuICAgICAqIH0sIDApO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8ucmVkdWNlKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9LCBmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIChyZXN1bHRbdmFsdWVdIHx8IChyZXN1bHRbdmFsdWVdID0gW10pKS5wdXNoKGtleSk7XG4gICAgICogICByZXR1cm4gcmVzdWx0O1xuICAgICAqIH0sIHt9KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVkdWNlKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlSZWR1Y2UgOiBiYXNlUmVkdWNlLFxuICAgICAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnJlZHVjZWAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5yZWR1Y2VcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gW1swLCAxXSwgWzIsIDNdLCBbNCwgNV1dO1xuICAgICAqXG4gICAgICogXy5yZWR1Y2VSaWdodChhcnJheSwgZnVuY3Rpb24oZmxhdHRlbmVkLCBvdGhlcikge1xuICAgICAqICAgcmV0dXJuIGZsYXR0ZW5lZC5jb25jYXQob3RoZXIpO1xuICAgICAqIH0sIFtdKTtcbiAgICAgKiAvLyA9PiBbNCwgNSwgMiwgMywgMCwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWR1Y2VSaWdodChjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5UmVkdWNlUmlnaHQgOiBiYXNlUmVkdWNlLFxuICAgICAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoUmlnaHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5maWx0ZXJgOyB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmBcbiAgICAgKiB0aGF0IGBwcmVkaWNhdGVgIGRvZXMgKipub3QqKiByZXR1cm4gdHJ1dGh5IGZvci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICAgKiBAc2VlIF8uZmlsdGVyXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCB7ICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlamVjdChjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RmlsdGVyIDogYmFzZUZpbHRlcjtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIHJhbmRvbSBlbGVtZW50IGZyb20gYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNhbXBsZShbMSwgMiwgMywgNF0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzYW1wbGUoY29sbGVjdGlvbikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTYW1wbGUgOiBiYXNlU2FtcGxlO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBgbmAgcmFuZG9tIGVsZW1lbnRzIGF0IHVuaXF1ZSBrZXlzIGZyb20gYGNvbGxlY3Rpb25gIHVwIHRvIHRoZVxuICAgICAqIHNpemUgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2FtcGxlU2l6ZShbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFszLCAxXVxuICAgICAqXG4gICAgICogXy5zYW1wbGVTaXplKFsxLCAyLCAzXSwgNCk7XG4gICAgICogLy8gPT4gWzIsIDMsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2FtcGxlU2l6ZShjb2xsZWN0aW9uLCBuLCBndWFyZCkge1xuICAgICAgaWYgKChndWFyZCA/IGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIG4sIGd1YXJkKSA6IG4gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgbiA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgfVxuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTYW1wbGVTaXplIDogYmFzZVNhbXBsZVNpemU7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHNodWZmbGVkIHZhbHVlcywgdXNpbmcgYSB2ZXJzaW9uIG9mIHRoZVxuICAgICAqIFtGaXNoZXItWWF0ZXMgc2h1ZmZsZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmlzaGVyLVlhdGVzX3NodWZmbGUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNodWZmbGUoWzEsIDIsIDMsIDRdKTtcbiAgICAgKiAvLyA9PiBbNCwgMSwgMywgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaHVmZmxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5U2h1ZmZsZSA6IGJhc2VTaHVmZmxlO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc2l6ZSBvZiBgY29sbGVjdGlvbmAgYnkgcmV0dXJuaW5nIGl0cyBsZW5ndGggZm9yIGFycmF5LWxpa2VcbiAgICAgKiB2YWx1ZXMgb3IgdGhlIG51bWJlciBvZiBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBmb3Igb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29sbGVjdGlvbiBzaXplLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNpemUoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnNpemUoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiBfLnNpemUoJ3BlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiA3XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2l6ZShjb2xsZWN0aW9uKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKSA/IHN0cmluZ1NpemUoY29sbGVjdGlvbikgOiBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHZhciB0YWcgPSBnZXRUYWcoY29sbGVjdGlvbik7XG4gICAgICBpZiAodGFnID09IG1hcFRhZyB8fCB0YWcgPT0gc2V0VGFnKSB7XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uLnNpemU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUtleXMoY29sbGVjdGlvbikubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgKiphbnkqKiBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBJdGVyYXRpb24gaXMgc3RvcHBlZCBvbmNlIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29tZShbbnVsbCwgMCwgJ3llcycsIGZhbHNlXSwgQm9vbGVhbik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29tZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvbWUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvbWUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29tZShjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNvbWUgOiBiYXNlU29tZTtcbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSkge1xuICAgICAgICBwcmVkaWNhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzLCBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSByZXN1bHRzIG9mXG4gICAgICogcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gYSBjb2xsZWN0aW9uIHRocnUgZWFjaCBpdGVyYXRlZS4gVGhpcyBtZXRob2RcbiAgICAgKiBwZXJmb3JtcyBhIHN0YWJsZSBzb3J0LCB0aGF0IGlzLCBpdCBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIHNvcnQgb3JkZXIgb2ZcbiAgICAgKiBlcXVhbCBlbGVtZW50cy4gVGhlIGl0ZXJhdGVlcyBhcmUgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDggfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiAzMCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzQgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnNvcnRCeSh1c2VycywgW2Z1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlcjsgfV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM2XSwgWydiYXJuZXknLCAzNF0sIFsnZnJlZCcsIDQ4XSwgWydmcmVkJywgMzBdXVxuICAgICAqXG4gICAgICogXy5zb3J0QnkodXNlcnMsIFsndXNlcicsICdhZ2UnXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzRdLCBbJ2Jhcm5leScsIDM2XSwgWydmcmVkJywgMzBdLCBbJ2ZyZWQnLCA0OF1dXG4gICAgICovXG4gICAgdmFyIHNvcnRCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlcykge1xuICAgICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gaXRlcmF0ZWVzLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPiAxICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdKSkge1xuICAgICAgICBpdGVyYXRlZXMgPSBbXTtcbiAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID4gMiAmJiBpc0l0ZXJhdGVlQ2FsbChpdGVyYXRlZXNbMF0sIGl0ZXJhdGVlc1sxXSwgaXRlcmF0ZWVzWzJdKSkge1xuICAgICAgICBpdGVyYXRlZXMgPSBbaXRlcmF0ZWVzWzBdXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBiYXNlRmxhdHRlbihpdGVyYXRlZXMsIDEpLCBbXSk7XG4gICAgfSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAgICAgKiB0aGUgVW5peCBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBEYXRlXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXN0YW1wLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmVyKGZ1bmN0aW9uKHN0YW1wKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICAgICAqIH0sIF8ubm93KCkpO1xuICAgICAqIC8vID0+IExvZ3MgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdG9vayBmb3IgdGhlIGRlZmVycmVkIGludm9jYXRpb24uXG4gICAgICovXG4gICAgdmFyIG5vdyA9IGN0eE5vdyB8fCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiByb290LkRhdGUubm93KCk7XG4gICAgfTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5iZWZvcmVgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzXG4gICAgICogYGZ1bmNgIG9uY2UgaXQncyBjYWxsZWQgYG5gIG9yIG1vcmUgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGNhbGxzIGJlZm9yZSBgZnVuY2AgaXMgaW52b2tlZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgc2F2ZXMgPSBbJ3Byb2ZpbGUnLCAnc2V0dGluZ3MnXTtcbiAgICAgKlxuICAgICAqIHZhciBkb25lID0gXy5hZnRlcihzYXZlcy5sZW5ndGgsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ2RvbmUgc2F2aW5nIScpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogXy5mb3JFYWNoKHNhdmVzLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICogICBhc3luY1NhdmUoeyAndHlwZSc6IHR5cGUsICdjb21wbGV0ZSc6IGRvbmUgfSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnZG9uZSBzYXZpbmchJyBhZnRlciB0aGUgdHdvIGFzeW5jIHNhdmVzIGhhdmUgY29tcGxldGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFmdGVyKG4sIGZ1bmMpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICgtLW4gPCAxKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCwgd2l0aCB1cCB0byBgbmAgYXJndW1lbnRzLFxuICAgICAqIGlnbm9yaW5nIGFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj1mdW5jLmxlbmd0aF0gVGhlIGFyaXR5IGNhcC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tYXAoWyc2JywgJzgnLCAnMTAnXSwgXy5hcnkocGFyc2VJbnQsIDEpKTtcbiAgICAgKiAvLyA9PiBbNiwgOCwgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJ5KGZ1bmMsIG4sIGd1YXJkKSB7XG4gICAgICBuID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBuO1xuICAgICAgbiA9IChmdW5jICYmIG4gPT0gbnVsbCkgPyBmdW5jLmxlbmd0aCA6IG47XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0FSWV9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgLCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzXG4gICAgICogb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24sIHdoaWxlIGl0J3MgY2FsbGVkIGxlc3MgdGhhbiBgbmAgdGltZXMuIFN1YnNlcXVlbnRcbiAgICAgKiBjYWxscyB0byB0aGUgY3JlYXRlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AgaW52b2NhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgY2FsbHMgYXQgd2hpY2ggYGZ1bmNgIGlzIG5vIGxvbmdlciBpbnZva2VkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmJlZm9yZSg1LCBhZGRDb250YWN0VG9MaXN0KSk7XG4gICAgICogLy8gPT4gQWxsb3dzIGFkZGluZyB1cCB0byA0IGNvbnRhY3RzIHRvIHRoZSBsaXN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJlZm9yZShuLCBmdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKC0tbiA+IDApIHtcbiAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG4gPD0gMSkge1xuICAgICAgICAgIGZ1bmMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgYHRoaXNBcmdgXG4gICAgICogYW5kIGBwYXJ0aWFsc2AgcHJlcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBUaGUgYF8uYmluZC5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAgICAgKiBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIG5hdGl2ZSBgRnVuY3Rpb24jYmluZGAsIHRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiXG4gICAgICogcHJvcGVydHkgb2YgYm91bmQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYmluZC5cbiAgICAgKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBib3VuZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZ3JlZXQoZ3JlZXRpbmcsIHB1bmN0dWF0aW9uKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyB0aGlzLnVzZXIgKyBwdW5jdHVhdGlvbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAndXNlcic6ICdmcmVkJyB9O1xuICAgICAqXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kKGdyZWV0LCBvYmplY3QsICdoaScpO1xuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gQm91bmQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kKGdyZWV0LCBvYmplY3QsIF8sICchJyk7XG4gICAgICogYm91bmQoJ2hpJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqL1xuICAgIHZhciBiaW5kID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgdGhpc0FyZywgcGFydGlhbHMpIHtcbiAgICAgIHZhciBiaXRtYXNrID0gV1JBUF9CSU5EX0ZMQUc7XG4gICAgICBpZiAocGFydGlhbHMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihiaW5kKSk7XG4gICAgICAgIGJpdG1hc2sgfD0gV1JBUF9QQVJUSUFMX0ZMQUc7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBtZXRob2QgYXQgYG9iamVjdFtrZXldYCB3aXRoIGBwYXJ0aWFsc2BcbiAgICAgKiBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBgXy5iaW5kYCBieSBhbGxvd2luZyBib3VuZCBmdW5jdGlvbnMgdG8gcmVmZXJlbmNlXG4gICAgICogbWV0aG9kcyB0aGF0IG1heSBiZSByZWRlZmluZWQgb3IgZG9uJ3QgeWV0IGV4aXN0LiBTZWVcbiAgICAgKiBbUGV0ZXIgTWljaGF1eCdzIGFydGljbGVdKGh0dHA6Ly9wZXRlci5taWNoYXV4LmNhL2FydGljbGVzL2xhenktZnVuY3Rpb24tZGVmaW5pdGlvbi1wYXR0ZXJuKVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBUaGUgYF8uYmluZEtleS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljXG4gICAgICogYnVpbGRzLCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGludm9rZSB0aGUgbWV0aG9kIG9uLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge1xuICAgICAqICAgJ3VzZXInOiAnZnJlZCcsXG4gICAgICogICAnZ3JlZXQnOiBmdW5jdGlvbihncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAgICAgKiAgICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgdGhpcy51c2VyICsgcHVuY3R1YXRpb247XG4gICAgICogICB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBib3VuZCA9IF8uYmluZEtleShvYmplY3QsICdncmVldCcsICdoaScpO1xuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqXG4gICAgICogb2JqZWN0LmdyZWV0ID0gZnVuY3Rpb24oZ3JlZXRpbmcsIHB1bmN0dWF0aW9uKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAneWEgJyArIHRoaXMudXNlciArIHB1bmN0dWF0aW9uO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBib3VuZCgnIScpO1xuICAgICAqIC8vID0+ICdoaXlhIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gQm91bmQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kS2V5KG9iamVjdCwgJ2dyZWV0JywgXywgJyEnKTtcbiAgICAgKiBib3VuZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGl5YSBmcmVkISdcbiAgICAgKi9cbiAgICB2YXIgYmluZEtleSA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwga2V5LCBwYXJ0aWFscykge1xuICAgICAgdmFyIGJpdG1hc2sgPSBXUkFQX0JJTkRfRkxBRyB8IFdSQVBfQklORF9LRVlfRkxBRztcbiAgICAgIGlmIChwYXJ0aWFscy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKGJpbmRLZXkpKTtcbiAgICAgICAgYml0bWFzayB8PSBXUkFQX1BBUlRJQUxfRkxBRztcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGtleSwgYml0bWFzaywgb2JqZWN0LCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGFyZ3VtZW50cyBvZiBgZnVuY2AgYW5kIGVpdGhlciBpbnZva2VzXG4gICAgICogYGZ1bmNgIHJldHVybmluZyBpdHMgcmVzdWx0LCBpZiBhdCBsZWFzdCBgYXJpdHlgIG51bWJlciBvZiBhcmd1bWVudHMgaGF2ZVxuICAgICAqIGJlZW4gcHJvdmlkZWQsIG9yIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgdGhlIHJlbWFpbmluZyBgZnVuY2BcbiAgICAgKiBhcmd1bWVudHMsIGFuZCBzbyBvbi4gVGhlIGFyaXR5IG9mIGBmdW5jYCBtYXkgYmUgc3BlY2lmaWVkIGlmIGBmdW5jLmxlbmd0aGBcbiAgICAgKiBpcyBub3Qgc3VmZmljaWVudC5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5jdXJyeS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAgICAgKiBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgY3VycmllZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5PWZ1bmMubGVuZ3RoXSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFiYyA9IGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIHJldHVybiBbYSwgYiwgY107XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBjdXJyaWVkID0gXy5jdXJyeShhYmMpO1xuICAgICAqXG4gICAgICogY3VycmllZCgxKSgyKSgzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMSwgMikoMyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEsIDIsIDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogLy8gQ3VycmllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiBjdXJyaWVkKDEpKF8sIDMpKDIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1cnJ5KGZ1bmMsIGFyaXR5LCBndWFyZCkge1xuICAgICAgYXJpdHkgPSBndWFyZCA/IHVuZGVmaW5lZCA6IGFyaXR5O1xuICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9DVVJSWV9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkpO1xuICAgICAgcmVzdWx0LnBsYWNlaG9sZGVyID0gY3VycnkucGxhY2Vob2xkZXI7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY3VycnlgIGV4Y2VwdCB0aGF0IGFyZ3VtZW50cyBhcmUgYXBwbGllZCB0byBgZnVuY2BcbiAgICAgKiBpbiB0aGUgbWFubmVyIG9mIGBfLnBhcnRpYWxSaWdodGAgaW5zdGVhZCBvZiBgXy5wYXJ0aWFsYC5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5jdXJyeVJpZ2h0LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBjdXJyaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHk9ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYWJjID0gZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGN1cnJpZWQgPSBfLmN1cnJ5UmlnaHQoYWJjKTtcbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMykoMikoMSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDIsIDMpKDEpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogY3VycmllZCgxLCAyLCAzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIC8vIEN1cnJpZWQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogY3VycmllZCgzKSgxLCBfKSgyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXJyeVJpZ2h0KGZ1bmMsIGFyaXR5LCBndWFyZCkge1xuICAgICAgYXJpdHkgPSBndWFyZCA/IHVuZGVmaW5lZCA6IGFyaXR5O1xuICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9DVVJSWV9SSUdIVF9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkpO1xuICAgICAgcmVzdWx0LnBsYWNlaG9sZGVyID0gY3VycnlSaWdodC5wbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gICAgICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzXG4gICAgICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbFxuICAgICAqIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLlxuICAgICAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZVxuICAgICAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50XG4gICAgICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2BcbiAgICAgKiBpbnZvY2F0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICAgICAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gICAgICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICAgICAqXG4gICAgICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gICAgICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICAgICAqXG4gICAgICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gICAgICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy5kZWJvdW5jZWAgYW5kIGBfLnRocm90dGxlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9ZmFsc2VdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF1cbiAgICAgKiAgVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGludm9rZWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICAgICAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gQXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eC5cbiAgICAgKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpO1xuICAgICAqXG4gICAgICogLy8gSW52b2tlIGBzZW5kTWFpbGAgd2hlbiBjbGlja2VkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHMuXG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwge1xuICAgICAqICAgJ2xlYWRpbmcnOiB0cnVlLFxuICAgICAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAgICAgKiB9KSk7XG4gICAgICpcbiAgICAgKiAvLyBFbnN1cmUgYGJhdGNoTG9nYCBpcyBpbnZva2VkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzLlxuICAgICAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pO1xuICAgICAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTtcbiAgICAgKiBqUXVlcnkoc291cmNlKS5vbignbWVzc2FnZScsIGRlYm91bmNlZCk7XG4gICAgICpcbiAgICAgKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGRlYm91bmNlZC5jYW5jZWwpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBsYXN0QXJncyxcbiAgICAgICAgICBsYXN0VGhpcyxcbiAgICAgICAgICBtYXhXYWl0LFxuICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICB0aW1lcklkLFxuICAgICAgICAgIGxhc3RDYWxsVGltZSxcbiAgICAgICAgICBsYXN0SW52b2tlVGltZSA9IDAsXG4gICAgICAgICAgbGVhZGluZyA9IGZhbHNlLFxuICAgICAgICAgIG1heGluZyA9IGZhbHNlLFxuICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgd2FpdCA9IHRvTnVtYmVyKHdhaXQpIHx8IDA7XG4gICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgbGVhZGluZyA9ICEhb3B0aW9ucy5sZWFkaW5nO1xuICAgICAgICBtYXhpbmcgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucztcbiAgICAgICAgbWF4V2FpdCA9IG1heGluZyA/IG5hdGl2ZU1heCh0b051bWJlcihvcHRpb25zLm1heFdhaXQpIHx8IDAsIHdhaXQpIDogbWF4V2FpdDtcbiAgICAgICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKSB7XG4gICAgICAgIHZhciBhcmdzID0gbGFzdEFyZ3MsXG4gICAgICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7XG5cbiAgICAgICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKSB7XG4gICAgICAgIC8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuXG4gICAgICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICAgICAgLy8gU3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgdHJhaWxpbmcgZWRnZS5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgLy8gSW52b2tlIHRoZSBsZWFkaW5nIGVkZ2UuXG4gICAgICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKSB7XG4gICAgICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLFxuICAgICAgICAgICAgdGltZVdhaXRpbmcgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7XG5cbiAgICAgICAgcmV0dXJuIG1heGluZ1xuICAgICAgICAgID8gbmF0aXZlTWluKHRpbWVXYWl0aW5nLCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSlcbiAgICAgICAgICA6IHRpbWVXYWl0aW5nO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkge1xuICAgICAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZTtcblxuICAgICAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZVxuICAgICAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZ1xuICAgICAgICAvLyBpdCBhcyB0aGUgdHJhaWxpbmcgZWRnZSwgb3Igd2UndmUgaGl0IHRoZSBgbWF4V2FpdGAgbGltaXQuXG4gICAgICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQgfHwgKHRpbWVTaW5jZUxhc3RDYWxsID49IHdhaXQpIHx8XG4gICAgICAgICAgKHRpbWVTaW5jZUxhc3RDYWxsIDwgMCkgfHwgKG1heGluZyAmJiB0aW1lU2luY2VMYXN0SW52b2tlID49IG1heFdhaXQpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkge1xuICAgICAgICB2YXIgdGltZSA9IG5vdygpO1xuICAgICAgICBpZiAoc2hvdWxkSW52b2tlKHRpbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXN0YXJ0IHRoZSB0aW1lci5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCByZW1haW5pbmdXYWl0KHRpbWUpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHRpbWUpIHtcbiAgICAgICAgdGltZXJJZCA9IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4gICAgICAgIC8vIGRlYm91bmNlZCBhdCBsZWFzdCBvbmNlLlxuICAgICAgICBpZiAodHJhaWxpbmcgJiYgbGFzdEFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdEludm9rZVRpbWUgPSAwO1xuICAgICAgICBsYXN0QXJncyA9IGxhc3RDYWxsVGltZSA9IGxhc3RUaGlzID0gdGltZXJJZCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgICAgIHJldHVybiB0aW1lcklkID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0cmFpbGluZ0VkZ2Uobm93KCkpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgICAgIHZhciB0aW1lID0gbm93KCksXG4gICAgICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpO1xuXG4gICAgICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBsYXN0VGhpcyA9IHRoaXM7XG4gICAgICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7XG5cbiAgICAgICAgaWYgKGlzSW52b2tpbmcpIHtcbiAgICAgICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1heGluZykge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgICAgICByZXR1cm4gaW52b2tlRnVuYyhsYXN0Q2FsbFRpbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgZGVib3VuY2VkLmNhbmNlbCA9IGNhbmNlbDtcbiAgICAgIGRlYm91bmNlZC5mbHVzaCA9IGZsdXNoO1xuICAgICAgcmV0dXJuIGRlYm91bmNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZlcnMgaW52b2tpbmcgdGhlIGBmdW5jYCB1bnRpbCB0aGUgY3VycmVudCBjYWxsIHN0YWNrIGhhcyBjbGVhcmVkLiBBbnlcbiAgICAgKiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gYGZ1bmNgIHdoZW4gaXQncyBpbnZva2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVmZXIuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmZXIoZnVuY3Rpb24odGV4dCkge1xuICAgICAqICAgY29uc29sZS5sb2codGV4dCk7XG4gICAgICogfSwgJ2RlZmVycmVkJyk7XG4gICAgICogLy8gPT4gTG9ncyAnZGVmZXJyZWQnIGFmdGVyIG9uZSBtaWxsaXNlY29uZC5cbiAgICAgKi9cbiAgICB2YXIgZGVmZXIgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCBhcmdzKSB7XG4gICAgICByZXR1cm4gYmFzZURlbGF5KGZ1bmMsIDEsIGFyZ3MpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyBgZnVuY2AgYWZ0ZXIgYHdhaXRgIG1pbGxpc2Vjb25kcy4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZVxuICAgICAqIHByb3ZpZGVkIHRvIGBmdW5jYCB3aGVuIGl0J3MgaW52b2tlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVsYXkoZnVuY3Rpb24odGV4dCkge1xuICAgICAqICAgY29uc29sZS5sb2codGV4dCk7XG4gICAgICogfSwgMTAwMCwgJ2xhdGVyJyk7XG4gICAgICogLy8gPT4gTG9ncyAnbGF0ZXInIGFmdGVyIG9uZSBzZWNvbmQuXG4gICAgICovXG4gICAgdmFyIGRlbGF5ID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgd2FpdCwgYXJncykge1xuICAgICAgcmV0dXJuIGJhc2VEZWxheShmdW5jLCB0b051bWJlcih3YWl0KSB8fCAwLCBhcmdzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggYXJndW1lbnRzIHJldmVyc2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZmxpcCBhcmd1bWVudHMgZm9yLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZsaXBwZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmbGlwcGVkID0gXy5mbGlwKGZ1bmN0aW9uKCkge1xuICAgICAqICAgcmV0dXJuIF8udG9BcnJheShhcmd1bWVudHMpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogZmxpcHBlZCgnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAqIC8vID0+IFsnZCcsICdjJywgJ2InLCAnYSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxpcChmdW5jKSB7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0ZMSVBfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbWVtb2l6ZXMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuIElmIGByZXNvbHZlcmAgaXNcbiAgICAgKiBwcm92aWRlZCwgaXQgZGV0ZXJtaW5lcyB0aGUgY2FjaGUga2V5IGZvciBzdG9yaW5nIHRoZSByZXN1bHQgYmFzZWQgb24gdGhlXG4gICAgICogYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbi4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGFyZ3VtZW50XG4gICAgICogcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uIGlzIHVzZWQgYXMgdGhlIG1hcCBjYWNoZSBrZXkuIFRoZSBgZnVuY2BcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBtZW1vaXplZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGUgY2FjaGUgaXMgZXhwb3NlZCBhcyB0aGUgYGNhY2hlYCBwcm9wZXJ0eSBvbiB0aGUgbWVtb2l6ZWRcbiAgICAgKiBmdW5jdGlvbi4gSXRzIGNyZWF0aW9uIG1heSBiZSBjdXN0b21pemVkIGJ5IHJlcGxhY2luZyB0aGUgYF8ubWVtb2l6ZS5DYWNoZWBcbiAgICAgKiBjb25zdHJ1Y3RvciB3aXRoIG9uZSB3aG9zZSBpbnN0YW5jZXMgaW1wbGVtZW50IHRoZVxuICAgICAqIFtgTWFwYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcHJvcGVydGllcy1vZi10aGUtbWFwLXByb3RvdHlwZS1vYmplY3QpXG4gICAgICogbWV0aG9kIGludGVyZmFjZSBvZiBgY2xlYXJgLCBgZGVsZXRlYCwgYGdldGAsIGBoYXNgLCBhbmQgYHNldGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3Jlc29sdmVyXSBUaGUgZnVuY3Rpb24gdG8gcmVzb2x2ZSB0aGUgY2FjaGUga2V5LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICAgICAqIHZhciBvdGhlciA9IHsgJ2MnOiAzLCAnZCc6IDQgfTtcbiAgICAgKlxuICAgICAqIHZhciB2YWx1ZXMgPSBfLm1lbW9pemUoXy52YWx1ZXMpO1xuICAgICAqIHZhbHVlcyhvYmplY3QpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogdmFsdWVzKG90aGVyKTtcbiAgICAgKiAvLyA9PiBbMywgNF1cbiAgICAgKlxuICAgICAqIG9iamVjdC5hID0gMjtcbiAgICAgKiB2YWx1ZXMob2JqZWN0KTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIC8vIE1vZGlmeSB0aGUgcmVzdWx0IGNhY2hlLlxuICAgICAqIHZhbHVlcy5jYWNoZS5zZXQob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAgICAgKiB2YWx1ZXMob2JqZWN0KTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYiddXG4gICAgICpcbiAgICAgKiAvLyBSZXBsYWNlIGBfLm1lbW9pemUuQ2FjaGVgLlxuICAgICAqIF8ubWVtb2l6ZS5DYWNoZSA9IFdlYWtNYXA7XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCByZXNvbHZlcikge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicgfHwgKHJlc29sdmVyICE9IG51bGwgJiYgdHlwZW9mIHJlc29sdmVyICE9ICdmdW5jdGlvbicpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHZhciBtZW1vaXplZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGtleSA9IHJlc29sdmVyID8gcmVzb2x2ZXIuYXBwbHkodGhpcywgYXJncykgOiBhcmdzWzBdLFxuICAgICAgICAgICAgY2FjaGUgPSBtZW1vaXplZC5jYWNoZTtcblxuICAgICAgICBpZiAoY2FjaGUuaGFzKGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIG1lbW9pemVkLmNhY2hlID0gY2FjaGUuc2V0KGtleSwgcmVzdWx0KSB8fCBjYWNoZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgICBtZW1vaXplZC5jYWNoZSA9IG5ldyAobWVtb2l6ZS5DYWNoZSB8fCBNYXBDYWNoZSk7XG4gICAgICByZXR1cm4gbWVtb2l6ZWQ7XG4gICAgfVxuXG4gICAgLy8gRXhwb3NlIGBNYXBDYWNoZWAuXG4gICAgbWVtb2l6ZS5DYWNoZSA9IE1hcENhY2hlO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbmVnYXRlcyB0aGUgcmVzdWx0IG9mIHRoZSBwcmVkaWNhdGUgYGZ1bmNgLiBUaGVcbiAgICAgKiBgZnVuY2AgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGVcbiAgICAgKiBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBwcmVkaWNhdGUgdG8gbmVnYXRlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG5lZ2F0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzRXZlbihuKSB7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihbMSwgMiwgMywgNCwgNSwgNl0sIF8ubmVnYXRlKGlzRXZlbikpO1xuICAgICAqIC8vID0+IFsxLCAzLCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5lZ2F0ZShwcmVkaWNhdGUpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJlZGljYXRlICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMDogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzKTtcbiAgICAgICAgICBjYXNlIDE6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcywgYXJnc1swXSk7XG4gICAgICAgICAgY2FzZSAyOiByZXR1cm4gIXByZWRpY2F0ZS5jYWxsKHRoaXMsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXByZWRpY2F0ZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgcmVzdHJpY3RlZCB0byBpbnZva2luZyBgZnVuY2Agb25jZS4gUmVwZWF0IGNhbGxzXG4gICAgICogdG8gdGhlIGZ1bmN0aW9uIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGludm9jYXRpb24uIFRoZSBgZnVuY2AgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgaW5pdGlhbGl6ZSA9IF8ub25jZShjcmVhdGVBcHBsaWNhdGlvbik7XG4gICAgICogaW5pdGlhbGl6ZSgpO1xuICAgICAqIGluaXRpYWxpemUoKTtcbiAgICAgKiAvLyA9PiBgY3JlYXRlQXBwbGljYXRpb25gIGlzIGludm9rZWQgb25jZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uY2UoZnVuYykge1xuICAgICAgcmV0dXJuIGJlZm9yZSgyLCBmdW5jKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudHMgdHJhbnNmb3JtZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbdHJhbnNmb3Jtcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm1zLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBkb3VibGVkKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5vdmVyQXJncyhmdW5jdGlvbih4LCB5KSB7XG4gICAgICogICByZXR1cm4gW3gsIHldO1xuICAgICAqIH0sIFtzcXVhcmUsIGRvdWJsZWRdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoOSwgMyk7XG4gICAgICogLy8gPT4gWzgxLCA2XVxuICAgICAqXG4gICAgICogZnVuYygxMCwgNSk7XG4gICAgICogLy8gPT4gWzEwMCwgMTBdXG4gICAgICovXG4gICAgdmFyIG92ZXJBcmdzID0gY2FzdFJlc3QoZnVuY3Rpb24oZnVuYywgdHJhbnNmb3Jtcykge1xuICAgICAgdHJhbnNmb3JtcyA9ICh0cmFuc2Zvcm1zLmxlbmd0aCA9PSAxICYmIGlzQXJyYXkodHJhbnNmb3Jtc1swXSkpXG4gICAgICAgID8gYXJyYXlNYXAodHJhbnNmb3Jtc1swXSwgYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKVxuICAgICAgICA6IGFycmF5TWFwKGJhc2VGbGF0dGVuKHRyYW5zZm9ybXMsIDEpLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpO1xuXG4gICAgICB2YXIgZnVuY3NMZW5ndGggPSB0cmFuc2Zvcm1zLmxlbmd0aDtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKGFyZ3MubGVuZ3RoLCBmdW5jc0xlbmd0aCk7XG5cbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcmdzW2luZGV4XSA9IHRyYW5zZm9ybXNbaW5kZXhdLmNhbGwodGhpcywgYXJnc1tpbmRleF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBhcmdzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGVcbiAgICAgKiBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYmluZGAgZXhjZXB0IGl0IGRvZXMgKipub3QqKlxuICAgICAqIGFsdGVyIHRoZSBgdGhpc2AgYmluZGluZy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5wYXJ0aWFsLnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBwYXJ0aWFsbHlcbiAgICAgKiBhcHBsaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjIuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseSBhcmd1bWVudHMgdG8uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFydGlhbGx5IGFwcGxpZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGdyZWV0KGdyZWV0aW5nLCBuYW1lKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyBuYW1lO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBzYXlIZWxsb1RvID0gXy5wYXJ0aWFsKGdyZWV0LCAnaGVsbG8nKTtcbiAgICAgKiBzYXlIZWxsb1RvKCdmcmVkJyk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBQYXJ0aWFsbHkgYXBwbGllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgZ3JlZXRGcmVkID0gXy5wYXJ0aWFsKGdyZWV0LCBfLCAnZnJlZCcpO1xuICAgICAqIGdyZWV0RnJlZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCdcbiAgICAgKi9cbiAgICB2YXIgcGFydGlhbCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBnZXRIb2xkZXIocGFydGlhbCkpO1xuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9QQVJUSUFMX0ZMQUcsIHVuZGVmaW5lZCwgcGFydGlhbHMsIGhvbGRlcnMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wYXJ0aWFsYCBleGNlcHQgdGhhdCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHNcbiAgICAgKiBhcmUgYXBwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5wYXJ0aWFsUmlnaHQucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIHBhcnRpYWxseVxuICAgICAqIGFwcGxpZWQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5IGFyZ3VtZW50cyB0by5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXJ0aWFsbHkgYXBwbGllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZ3JlZXQoZ3JlZXRpbmcsIG5hbWUpIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIG5hbWU7XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGdyZWV0RnJlZCA9IF8ucGFydGlhbFJpZ2h0KGdyZWV0LCAnZnJlZCcpO1xuICAgICAqIGdyZWV0RnJlZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFBhcnRpYWxseSBhcHBsaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIHZhciBzYXlIZWxsb1RvID0gXy5wYXJ0aWFsUmlnaHQoZ3JlZXQsICdoZWxsbycsIF8pO1xuICAgICAqIHNheUhlbGxvVG8oJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCdcbiAgICAgKi9cbiAgICB2YXIgcGFydGlhbFJpZ2h0ID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgcGFydGlhbHMpIHtcbiAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihwYXJ0aWFsUmlnaHQpKTtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHLCB1bmRlZmluZWQsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggYXJndW1lbnRzIGFycmFuZ2VkIGFjY29yZGluZ1xuICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgYGluZGV4ZXNgIHdoZXJlIHRoZSBhcmd1bWVudCB2YWx1ZSBhdCB0aGUgZmlyc3QgaW5kZXggaXNcbiAgICAgKiBwcm92aWRlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQsIHRoZSBhcmd1bWVudCB2YWx1ZSBhdCB0aGUgc2Vjb25kIGluZGV4IGlzXG4gICAgICogcHJvdmlkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVhcnJhbmdlIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHBhcmFtIHsuLi4obnVtYmVyfG51bWJlcltdKX0gaW5kZXhlcyBUaGUgYXJyYW5nZWQgYXJndW1lbnQgaW5kZXhlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHJlYXJnZWQgPSBfLnJlYXJnKGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIHJldHVybiBbYSwgYiwgY107XG4gICAgICogfSwgWzIsIDAsIDFdKTtcbiAgICAgKlxuICAgICAqIHJlYXJnZWQoJ2InLCAnYycsICdhJylcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKi9cbiAgICB2YXIgcmVhcmcgPSBmbGF0UmVzdChmdW5jdGlvbihmdW5jLCBpbmRleGVzKSB7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX1JFQVJHX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGluZGV4ZXMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlXG4gICAgICogY3JlYXRlZCBmdW5jdGlvbiBhbmQgYXJndW1lbnRzIGZyb20gYHN0YXJ0YCBhbmQgYmV5b25kIHByb3ZpZGVkIGFzXG4gICAgICogYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb24gdGhlXG4gICAgICogW3Jlc3QgcGFyYW1ldGVyXShodHRwczovL21kbi5pby9yZXN0X3BhcmFtZXRlcnMpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXkgPSBfLnJlc3QoZnVuY3Rpb24od2hhdCwgbmFtZXMpIHtcbiAgICAgKiAgIHJldHVybiB3aGF0ICsgJyAnICsgXy5pbml0aWFsKG5hbWVzKS5qb2luKCcsICcpICtcbiAgICAgKiAgICAgKF8uc2l6ZShuYW1lcykgPiAxID8gJywgJiAnIDogJycpICsgXy5sYXN0KG5hbWVzKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHNheSgnaGVsbG8nLCAnZnJlZCcsICdiYXJuZXknLCAncGViYmxlcycpO1xuICAgICAqIC8vID0+ICdoZWxsbyBmcmVkLCBiYXJuZXksICYgcGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXN0KGZ1bmMsIHN0YXJ0KSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBzdGFydCA9IHN0YXJ0ID09PSB1bmRlZmluZWQgPyBzdGFydCA6IHRvSW50ZWdlcihzdGFydCk7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuYywgc3RhcnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZVxuICAgICAqIGNyZWF0ZSBmdW5jdGlvbiBhbmQgYW4gYXJyYXkgb2YgYXJndW1lbnRzIG11Y2ggbGlrZVxuICAgICAqIFtgRnVuY3Rpb24jYXBwbHlgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiB0aGVcbiAgICAgKiBbc3ByZWFkIG9wZXJhdG9yXShodHRwczovL21kbi5pby9zcHJlYWRfb3BlcmF0b3IpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gc3ByZWFkIGFyZ3VtZW50cyBvdmVyLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBzcHJlYWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXkgPSBfLnNwcmVhZChmdW5jdGlvbih3aG8sIHdoYXQpIHtcbiAgICAgKiAgIHJldHVybiB3aG8gKyAnIHNheXMgJyArIHdoYXQ7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBzYXkoWydmcmVkJywgJ2hlbGxvJ10pO1xuICAgICAqIC8vID0+ICdmcmVkIHNheXMgaGVsbG8nXG4gICAgICpcbiAgICAgKiB2YXIgbnVtYmVycyA9IFByb21pc2UuYWxsKFtcbiAgICAgKiAgIFByb21pc2UucmVzb2x2ZSg0MCksXG4gICAgICogICBQcm9taXNlLnJlc29sdmUoMzYpXG4gICAgICogXSk7XG4gICAgICpcbiAgICAgKiBudW1iZXJzLnRoZW4oXy5zcHJlYWQoZnVuY3Rpb24oeCwgeSkge1xuICAgICAqICAgcmV0dXJuIHggKyB5O1xuICAgICAqIH0pKTtcbiAgICAgKiAvLyA9PiBhIFByb21pc2Ugb2YgNzZcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzcHJlYWQoZnVuYywgc3RhcnQpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ID0gc3RhcnQgPT0gbnVsbCA/IDAgOiBuYXRpdmVNYXgodG9JbnRlZ2VyKHN0YXJ0KSwgMCk7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcmdzW3N0YXJ0XSxcbiAgICAgICAgICAgIG90aGVyQXJncyA9IGNhc3RTbGljZShhcmdzLCAwLCBzdGFydCk7XG5cbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgYXJyYXlQdXNoKG90aGVyQXJncywgYXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBvdGhlckFyZ3MpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHRocm90dGxlZCBmdW5jdGlvbiB0aGF0IG9ubHkgaW52b2tlcyBgZnVuY2AgYXQgbW9zdCBvbmNlIHBlclxuICAgICAqIGV2ZXJ5IGB3YWl0YCBtaWxsaXNlY29uZHMuIFRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgXG4gICAgICogbWV0aG9kIHRvIGNhbmNlbCBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0b1xuICAgICAqIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYFxuICAgICAqIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZSBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGBcbiAgICAgKiB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWQgd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlXG4gICAgICogdGhyb3R0bGVkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gcmV0dXJuIHRoZVxuICAgICAqIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AgaW52b2NhdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAgICAgKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIHRocm90dGxlZCBmdW5jdGlvblxuICAgICAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAgICAgKlxuICAgICAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICAgICAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAgICAgKlxuICAgICAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICAgICAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8udGhyb3R0bGVgIGFuZCBgXy5kZWJvdW5jZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhyb3R0bGUgaW52b2NhdGlvbnMgdG8uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPXRydWVdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgdGhyb3R0bGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBBdm9pZCBleGNlc3NpdmVseSB1cGRhdGluZyB0aGUgcG9zaXRpb24gd2hpbGUgc2Nyb2xsaW5nLlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdzY3JvbGwnLCBfLnRocm90dGxlKHVwZGF0ZVBvc2l0aW9uLCAxMDApKTtcbiAgICAgKlxuICAgICAqIC8vIEludm9rZSBgcmVuZXdUb2tlbmAgd2hlbiB0aGUgY2xpY2sgZXZlbnQgaXMgZmlyZWQsIGJ1dCBub3QgbW9yZSB0aGFuIG9uY2UgZXZlcnkgNSBtaW51dGVzLlxuICAgICAqIHZhciB0aHJvdHRsZWQgPSBfLnRocm90dGxlKHJlbmV3VG9rZW4sIDMwMDAwMCwgeyAndHJhaWxpbmcnOiBmYWxzZSB9KTtcbiAgICAgKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdGhyb3R0bGVkKTtcbiAgICAgKlxuICAgICAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgdGhyb3R0bGVkIGludm9jYXRpb24uXG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgdGhyb3R0bGVkLmNhbmNlbCk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gdGhyb3R0bGUoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICAgICAgdmFyIGxlYWRpbmcgPSB0cnVlLFxuICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy5sZWFkaW5nIDogbGVhZGluZztcbiAgICAgICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWJvdW5jZShmdW5jLCB3YWl0LCB7XG4gICAgICAgICdsZWFkaW5nJzogbGVhZGluZyxcbiAgICAgICAgJ21heFdhaXQnOiB3YWl0LFxuICAgICAgICAndHJhaWxpbmcnOiB0cmFpbGluZ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB1cCB0byBvbmUgYXJndW1lbnQsIGlnbm9yaW5nIGFueVxuICAgICAqIGFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1hcChbJzYnLCAnOCcsICcxMCddLCBfLnVuYXJ5KHBhcnNlSW50KSk7XG4gICAgICogLy8gPT4gWzYsIDgsIDEwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuYXJ5KGZ1bmMpIHtcbiAgICAgIHJldHVybiBhcnkoZnVuYywgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgYHZhbHVlYCB0byBgd3JhcHBlcmAgYXMgaXRzIGZpcnN0XG4gICAgICogYXJndW1lbnQuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZnVuY3Rpb24gYXJlIGFwcGVuZGVkXG4gICAgICogdG8gdGhvc2UgcHJvdmlkZWQgdG8gdGhlIGB3cmFwcGVyYC4gVGhlIHdyYXBwZXIgaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2BcbiAgICAgKiBiaW5kaW5nIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbd3JhcHBlcj1pZGVudGl0eV0gVGhlIHdyYXBwZXIgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBwID0gXy53cmFwKF8uZXNjYXBlLCBmdW5jdGlvbihmdW5jLCB0ZXh0KSB7XG4gICAgICogICByZXR1cm4gJzxwPicgKyBmdW5jKHRleHQpICsgJzwvcD4nO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogcCgnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiAnPHA+ZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzPC9wPidcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwKHZhbHVlLCB3cmFwcGVyKSB7XG4gICAgICByZXR1cm4gcGFydGlhbChjYXN0RnVuY3Rpb24od3JhcHBlciksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIGFzIGFuIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjQuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KDEpO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkoeyAnYSc6IDEgfSk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiAxIH1dXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSgnYWJjJyk7XG4gICAgICogLy8gPT4gWydhYmMnXVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkobnVsbCk7XG4gICAgICogLy8gPT4gW251bGxdXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSh1bmRlZmluZWQpO1xuICAgICAqIC8vID0+IFt1bmRlZmluZWRdXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSgpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICogY29uc29sZS5sb2coXy5jYXN0QXJyYXkoYXJyYXkpID09PSBhcnJheSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RBcnJheSgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHNbMF07XG4gICAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZVxuICAgICAqIFtzdHJ1Y3R1cmVkIGNsb25lIGFsZ29yaXRobV0oaHR0cHM6Ly9tZG4uaW8vU3RydWN0dXJlZF9jbG9uZV9hbGdvcml0aG0pXG4gICAgICogYW5kIHN1cHBvcnRzIGNsb25pbmcgYXJyYXlzLCBhcnJheSBidWZmZXJzLCBib29sZWFucywgZGF0ZSBvYmplY3RzLCBtYXBzLFxuICAgICAqIG51bWJlcnMsIGBPYmplY3RgIG9iamVjdHMsIHJlZ2V4ZXMsIHNldHMsIHN0cmluZ3MsIHN5bWJvbHMsIGFuZCB0eXBlZFxuICAgICAqIGFycmF5cy4gVGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYGFyZ3VtZW50c2Agb2JqZWN0cyBhcmUgY2xvbmVkXG4gICAgICogYXMgcGxhaW4gb2JqZWN0cy4gQW4gZW1wdHkgb2JqZWN0IGlzIHJldHVybmVkIGZvciB1bmNsb25lYWJsZSB2YWx1ZXMgc3VjaFxuICAgICAqIGFzIGVycm9yIG9iamVjdHMsIGZ1bmN0aW9ucywgRE9NIG5vZGVzLCBhbmQgV2Vha01hcHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lRGVlcFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICdhJzogMSB9LCB7ICdiJzogMiB9XTtcbiAgICAgKlxuICAgICAqIHZhciBzaGFsbG93ID0gXy5jbG9uZShvYmplY3RzKTtcbiAgICAgKiBjb25zb2xlLmxvZyhzaGFsbG93WzBdID09PSBvYmplY3RzWzBdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmUodmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX1NZTUJPTFNfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIGNsb25lZCB2YWx1ZS4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsXG4gICAgICogY2xvbmluZyBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGhcbiAgICAgKiB1cCB0byBmb3VyIGFyZ3VtZW50czsgKHZhbHVlIFssIGluZGV4fGtleSwgb2JqZWN0LCBzdGFja10pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lRGVlcFdpdGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcih2YWx1ZSkge1xuICAgICAqICAgaWYgKF8uaXNFbGVtZW50KHZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdmFsdWUuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZWwgPSBfLmNsb25lV2l0aChkb2N1bWVudC5ib2R5LCBjdXN0b21pemVyKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGVsID09PSBkb2N1bWVudC5ib2R5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqIGNvbnNvbGUubG9nKGVsLm5vZGVOYW1lKTtcbiAgICAgKiAvLyA9PiAnQk9EWSdcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5jaGlsZE5vZGVzLmxlbmd0aCk7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lV2l0aCh2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfU1lNQk9MU19GTEFHLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBjbG9uZXMgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmVjdXJzaXZlbHkgY2xvbmUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5jbG9uZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICdhJzogMSB9LCB7ICdiJzogMiB9XTtcbiAgICAgKlxuICAgICAqIHZhciBkZWVwID0gXy5jbG9uZURlZXAob2JqZWN0cyk7XG4gICAgICogY29uc29sZS5sb2coZGVlcFswXSA9PT0gb2JqZWN0c1swXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZURlZXAodmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX0RFRVBfRkxBRyB8IENMT05FX1NZTUJPTFNfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZVdpdGhgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGNsb25lcyBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZWN1cnNpdmVseSBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBkZWVwIGNsb25lZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8uY2xvbmVXaXRoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIodmFsdWUpIHtcbiAgICAgKiAgIGlmIChfLmlzRWxlbWVudCh2YWx1ZSkpIHtcbiAgICAgKiAgICAgcmV0dXJuIHZhbHVlLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZWwgPSBfLmNsb25lRGVlcFdpdGgoZG9jdW1lbnQuYm9keSwgY3VzdG9taXplcik7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhlbCA9PT0gZG9jdW1lbnQuYm9keSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5ub2RlTmFtZSk7XG4gICAgICogLy8gPT4gJ0JPRFknXG4gICAgICogY29uc29sZS5sb2coZWwuY2hpbGROb2Rlcy5sZW5ndGgpO1xuICAgICAqIC8vID0+IDIwXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVEZWVwV2l0aCh2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfREVFUF9GTEFHIHwgQ0xPTkVfU1lNQk9MU19GTEFHLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYG9iamVjdGAgY29uZm9ybXMgdG8gYHNvdXJjZWAgYnkgaW52b2tpbmcgdGhlIHByZWRpY2F0ZVxuICAgICAqIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byBgXy5jb25mb3Jtc2Agd2hlbiBgc291cmNlYCBpc1xuICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTQuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgY29uZm9ybXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAgICAgKlxuICAgICAqIF8uY29uZm9ybXNUbyhvYmplY3QsIHsgJ2InOiBmdW5jdGlvbihuKSB7IHJldHVybiBuID4gMTsgfSB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmNvbmZvcm1zVG8ob2JqZWN0LCB7ICdiJzogZnVuY3Rpb24obikgeyByZXR1cm4gbiA+IDI7IH0gfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25mb3Jtc1RvKG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gc291cmNlID09IG51bGwgfHwgYmFzZUNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UsIGtleXMoc291cmNlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYVxuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogXy5lcShvYmplY3QsIG9iamVjdCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lcShvYmplY3QsIG90aGVyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lcSgnYScsICdhJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lcSgnYScsIE9iamVjdCgnYScpKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lcShOYU4sIE5hTik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVxKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBvdGhlciB8fCAodmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5sdFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmd0KDMsIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZ3QoMywgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uZ3QoMSwgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgZ3QgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGJhc2VHdCk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYG90aGVyYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjkuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b1xuICAgICAqICBgb3RoZXJgLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLmx0ZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgzLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgzLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgxLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBndGUgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlID49IG90aGVyO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJndW1lbnRzID0gYmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID8gYmFzZUlzQXJndW1lbnRzIDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJlxuICAgICAgICAhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheSgnYWJjJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShfLm5vb3ApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlCdWZmZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXkgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUJ1ZmZlcihuZXcgQXJyYXlCdWZmZXIoMikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUJ1ZmZlcihuZXcgQXJyYXkoMikpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJyYXlCdWZmZXIgPSBub2RlSXNBcnJheUJ1ZmZlciA/IGJhc2VVbmFyeShub2RlSXNBcnJheUJ1ZmZlcikgOiBiYXNlSXNBcnJheUJ1ZmZlcjtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAgICAgKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gICAgICogZXF1YWwgdG8gYDBgIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0FycmF5TGlrZWAgZXhjZXB0IHRoYXQgaXQgYWxzbyBjaGVja3MgaWYgYHZhbHVlYFxuICAgICAqIGlzIGFuIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXktbGlrZSBvYmplY3QsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdCgnYWJjJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0FycmF5TGlrZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGJvb2xlYW4gcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBib29sZWFuLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNCb29sZWFuKGZhbHNlKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQm9vbGVhbihudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZSB8fFxuICAgICAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBib29sVGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0J1ZmZlcihuZXcgQnVmZmVyKDIpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQnVmZmVyKG5ldyBVaW50OEFycmF5KDIpKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0J1ZmZlciA9IG5hdGl2ZUlzQnVmZmVyIHx8IHN0dWJGYWxzZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRGF0ZWAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGRhdGUgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNEYXRlKG5ldyBEYXRlKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRGF0ZSgnTW9uIEFwcmlsIDIzIDIwMTInKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0RhdGUgPSBub2RlSXNEYXRlID8gYmFzZVVuYXJ5KG5vZGVJc0RhdGUpIDogYmFzZUlzRGF0ZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIERPTSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIERPTSBlbGVtZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNFbGVtZW50KGRvY3VtZW50LmJvZHkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbGVtZW50KCc8Ym9keT4nKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRWxlbWVudCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgdmFsdWUubm9kZVR5cGUgPT09IDEgJiYgIWlzUGxhaW5PYmplY3QodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGVtcHR5IG9iamVjdCwgY29sbGVjdGlvbiwgbWFwLCBvciBzZXQuXG4gICAgICpcbiAgICAgKiBPYmplY3RzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBubyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWRcbiAgICAgKiBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQXJyYXktbGlrZSB2YWx1ZXMgc3VjaCBhcyBgYXJndW1lbnRzYCBvYmplY3RzLCBhcnJheXMsIGJ1ZmZlcnMsIHN0cmluZ3MsIG9yXG4gICAgICogalF1ZXJ5LWxpa2UgY29sbGVjdGlvbnMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYGxlbmd0aGAgb2YgYDBgLlxuICAgICAqIFNpbWlsYXJseSwgbWFwcyBhbmQgc2V0cyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgc2l6ZWAgb2YgYDBgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBlbXB0eSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KHRydWUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eSgxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KHsgJ2EnOiAxIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheUxpa2UodmFsdWUpICYmXG4gICAgICAgICAgKGlzQXJyYXkodmFsdWUpIHx8IHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUuc3BsaWNlID09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgIGlzQnVmZmVyKHZhbHVlKSB8fCBpc1R5cGVkQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuICF2YWx1ZS5sZW5ndGg7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKTtcbiAgICAgIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHtcbiAgICAgICAgcmV0dXJuICF2YWx1ZS5zaXplO1xuICAgICAgfVxuICAgICAgaWYgKGlzUHJvdG90eXBlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gIWJhc2VLZXlzKHZhbHVlKS5sZW5ndGg7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmVcbiAgICAgKiBlcXVpdmFsZW50LlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIHN1cHBvcnRzIGNvbXBhcmluZyBhcnJheXMsIGFycmF5IGJ1ZmZlcnMsIGJvb2xlYW5zLFxuICAgICAqIGRhdGUgb2JqZWN0cywgZXJyb3Igb2JqZWN0cywgbWFwcywgbnVtYmVycywgYE9iamVjdGAgb2JqZWN0cywgcmVnZXhlcyxcbiAgICAgKiBzZXRzLCBzdHJpbmdzLCBzeW1ib2xzLCBhbmQgdHlwZWQgYXJyYXlzLiBgT2JqZWN0YCBvYmplY3RzIGFyZSBjb21wYXJlZFxuICAgICAqIGJ5IHRoZWlyIG93biwgbm90IGluaGVyaXRlZCwgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLiBGdW5jdGlvbnMgYW5kIERPTVxuICAgICAqIG5vZGVzIGFyZSBjb21wYXJlZCBieSBzdHJpY3QgZXF1YWxpdHksIGkuZS4gYD09PWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogXy5pc0VxdWFsKG9iamVjdCwgb3RoZXIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIG9iamVjdCA9PT0gb3RoZXI7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VxdWFsKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0VxdWFsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLCBjb21wYXJpc29uc1xuICAgICAqIGFyZSBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGggdXAgdG9cbiAgICAgKiBzaXggYXJndW1lbnRzOiAob2JqVmFsdWUsIG90aFZhbHVlIFssIGluZGV4fGtleSwgb2JqZWN0LCBvdGhlciwgc3RhY2tdKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzR3JlZXRpbmcodmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiAvXmgoPzppfGVsbG8pJC8udGVzdCh2YWx1ZSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgb3RoVmFsdWUpIHtcbiAgICAgKiAgIGlmIChpc0dyZWV0aW5nKG9ialZhbHVlKSAmJiBpc0dyZWV0aW5nKG90aFZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2hlbGxvJywgJ2dvb2RieWUnXTtcbiAgICAgKiB2YXIgb3RoZXIgPSBbJ2hpJywgJ2dvb2RieWUnXTtcbiAgICAgKlxuICAgICAqIF8uaXNFcXVhbFdpdGgoYXJyYXksIG90aGVyLCBjdXN0b21pemVyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFcXVhbFdpdGgodmFsdWUsIG90aGVyLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICB2YXIgcmVzdWx0ID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIodmFsdWUsIG90aGVyKSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgdW5kZWZpbmVkLCBjdXN0b21pemVyKSA6ICEhcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGBFcnJvcmAsIGBFdmFsRXJyb3JgLCBgUmFuZ2VFcnJvcmAsIGBSZWZlcmVuY2VFcnJvcmAsXG4gICAgICogYFN5bnRheEVycm9yYCwgYFR5cGVFcnJvcmAsIG9yIGBVUklFcnJvcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBlcnJvciBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Vycm9yKG5ldyBFcnJvcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Vycm9yKEVycm9yKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRXJyb3IodmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gICAgICByZXR1cm4gdGFnID09IGVycm9yVGFnIHx8IHRhZyA9PSBkb21FeGNUYWcgfHxcbiAgICAgICAgKHR5cGVvZiB2YWx1ZS5tZXNzYWdlID09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZS5uYW1lID09ICdzdHJpbmcnICYmICFpc1BsYWluT2JqZWN0KHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmaW5pdGUgcHJpbWl0aXZlIG51bWJlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzRmluaXRlYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzRmluaXRlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmaW5pdGUgbnVtYmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZShOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZSgnMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNGaW5pdGUodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgbmF0aXZlSXNGaW5pdGUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRnVuY3Rpb24oXyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAgICAgLy8gaW4gU2FmYXJpIDkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXlzIGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gICAgICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gICAgICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZyB8fCB0YWcgPT0gYXN5bmNUYWcgfHwgdGFnID09IHByb3h5VGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGludGVnZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYE51bWJlci5pc0ludGVnZXJgXShodHRwczovL21kbi5pby9OdW1iZXIvaXNJbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gaW50ZWdlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcigzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0ludGVnZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcignMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJbnRlZ2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmIHZhbHVlID09IHRvSW50ZWdlcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gICAgICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBsZW5ndGgsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0xlbmd0aCgzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0xlbmd0aCgnMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICAgICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICAgICAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAgICAgKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KHt9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdChfLm5vb3ApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3QobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICAgICAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2Uoe30pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYE1hcGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG1hcCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTWFwKG5ldyBNYXApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNNYXAobmV3IFdlYWtNYXApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzTWFwID0gbm9kZUlzTWFwID8gYmFzZVVuYXJ5KG5vZGVJc01hcCkgOiBiYXNlSXNNYXA7XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhIHBhcnRpYWwgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gYG9iamVjdGAgYW5kIGBzb3VyY2VgIHRvXG4gICAgICogZGV0ZXJtaW5lIGlmIGBvYmplY3RgIGNvbnRhaW5zIGVxdWl2YWxlbnQgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gYF8ubWF0Y2hlc2Agd2hlbiBgc291cmNlYCBpc1xuICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogUGFydGlhbCBjb21wYXJpc29ucyB3aWxsIG1hdGNoIGVtcHR5IGFycmF5IGFuZCBlbXB0eSBvYmplY3QgYHNvdXJjZWBcbiAgICAgKiB2YWx1ZXMgYWdhaW5zdCBhbnkgYXJyYXkgb3Igb2JqZWN0IHZhbHVlLCByZXNwZWN0aXZlbHkuIFNlZSBgXy5pc0VxdWFsYFxuICAgICAqIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gICAgICpcbiAgICAgKiBfLmlzTWF0Y2gob2JqZWN0LCB7ICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTWF0Y2gob2JqZWN0LCB7ICdiJzogMSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTWF0Y2gob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT09IHNvdXJjZSB8fCBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgZ2V0TWF0Y2hEYXRhKHNvdXJjZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNNYXRjaGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCwgY29tcGFyaXNvbnNcbiAgICAgKiBhcmUgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoIGZpdmVcbiAgICAgKiBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGluZGV4fGtleSwgb2JqZWN0LCBzb3VyY2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzR3JlZXRpbmcodmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiAvXmgoPzppfGVsbG8pJC8udGVzdCh2YWx1ZSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAgICAgKiAgIGlmIChpc0dyZWV0aW5nKG9ialZhbHVlKSAmJiBpc0dyZWV0aW5nKHNyY1ZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnZ3JlZXRpbmcnOiAnaGVsbG8nIH07XG4gICAgICogdmFyIHNvdXJjZSA9IHsgJ2dyZWV0aW5nJzogJ2hpJyB9O1xuICAgICAqXG4gICAgICogXy5pc01hdGNoV2l0aChvYmplY3QsIHNvdXJjZSwgY3VzdG9taXplcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTWF0Y2hXaXRoKG9iamVjdCwgc291cmNlLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIGdldE1hdGNoRGF0YShzb3VyY2UpLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgTmFOYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzTmFOYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzTmFOKSBhbmQgaXMgbm90IHRoZSBzYW1lIGFzXG4gICAgICogZ2xvYmFsIFtgaXNOYU5gXShodHRwczovL21kbi5pby9pc05hTikgd2hpY2ggcmV0dXJucyBgdHJ1ZWAgZm9yXG4gICAgICogYHVuZGVmaW5lZGAgYW5kIG90aGVyIG5vbi1udW1iZXIgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTmFOKE5hTik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05hTihuZXcgTnVtYmVyKE5hTikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGlzTmFOKHVuZGVmaW5lZCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05hTih1bmRlZmluZWQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOYU4odmFsdWUpIHtcbiAgICAgIC8vIEFuIGBOYU5gIHByaW1pdGl2ZSBpcyB0aGUgb25seSB2YWx1ZSB0aGF0IGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuXG4gICAgICAvLyBQZXJmb3JtIHRoZSBgdG9TdHJpbmdUYWdgIGNoZWNrIGZpcnN0IHRvIGF2b2lkIGVycm9ycyB3aXRoIHNvbWVcbiAgICAgIC8vIEFjdGl2ZVggb2JqZWN0cyBpbiBJRS5cbiAgICAgIHJldHVybiBpc051bWJlcih2YWx1ZSkgJiYgdmFsdWUgIT0gK3ZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcHJpc3RpbmUgbmF0aXZlIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGNhbid0IHJlbGlhYmx5IGRldGVjdCBuYXRpdmUgZnVuY3Rpb25zIGluIHRoZSBwcmVzZW5jZVxuICAgICAqIG9mIHRoZSBjb3JlLWpzIHBhY2thZ2UgYmVjYXVzZSBjb3JlLWpzIGNpcmN1bXZlbnRzIHRoaXMga2luZCBvZiBkZXRlY3Rpb24uXG4gICAgICogRGVzcGl0ZSBtdWx0aXBsZSByZXF1ZXN0cywgdGhlIGNvcmUtanMgbWFpbnRhaW5lciBoYXMgbWFkZSBpdCBjbGVhcjogYW55XG4gICAgICogYXR0ZW1wdCB0byBmaXggdGhlIGRldGVjdGlvbiB3aWxsIGJlIG9ic3RydWN0ZWQuIEFzIGEgcmVzdWx0LCB3ZSdyZSBsZWZ0XG4gICAgICogd2l0aCBsaXR0bGUgY2hvaWNlIGJ1dCB0byB0aHJvdyBhbiBlcnJvci4gVW5mb3J0dW5hdGVseSwgdGhpcyBhbHNvIGFmZmVjdHNcbiAgICAgKiBwYWNrYWdlcywgbGlrZSBbYmFiZWwtcG9seWZpbGxdKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2JhYmVsLXBvbHlmaWxsKSxcbiAgICAgKiB3aGljaCByZWx5IG9uIGNvcmUtanMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOYXRpdmUoQXJyYXkucHJvdG90eXBlLnB1c2gpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOYXRpdmUoXyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05hdGl2ZSh2YWx1ZSkge1xuICAgICAgaWYgKGlzTWFza2FibGUodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihDT1JFX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYG51bGxgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgbnVsbGAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc051bGwobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc051bGwodm9pZCAwKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTnVsbCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbnVsbGlzaCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTmlsKG51bGwpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOaWwodm9pZCAwKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmlsKE5hTik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05pbCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBOdW1iZXJgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVG8gZXhjbHVkZSBgSW5maW5pdHlgLCBgLUluZmluaXR5YCwgYW5kIGBOYU5gLCB3aGljaCBhcmVcbiAgICAgKiBjbGFzc2lmaWVkIGFzIG51bWJlcnMsIHVzZSB0aGUgYF8uaXNGaW5pdGVgIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBudW1iZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc051bWJlcigzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoJzMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8XG4gICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IG51bWJlclRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICAgICAqIGBPYmplY3RgIGNvbnN0cnVjdG9yIG9yIG9uZSB3aXRoIGEgYFtbUHJvdG90eXBlXV1gIG9mIGBudWxsYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjguMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QobmV3IEZvbyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSB8fCBiYXNlR2V0VGFnKHZhbHVlKSAhPSBvYmplY3RUYWcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlKHZhbHVlKTtcbiAgICAgIGlmIChwcm90byA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBDdG9yID0gaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgJ2NvbnN0cnVjdG9yJykgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gICAgICByZXR1cm4gdHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJlxuICAgICAgICBmdW5jVG9TdHJpbmcuY2FsbChDdG9yKSA9PSBvYmplY3RDdG9yU3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgUmVnRXhwYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcmVnZXhwLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNSZWdFeHAoL2FiYy8pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNSZWdFeHAoJy9hYmMvJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNSZWdFeHAgPSBub2RlSXNSZWdFeHAgPyBiYXNlVW5hcnkobm9kZUlzUmVnRXhwKSA6IGJhc2VJc1JlZ0V4cDtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgc2FmZSBpbnRlZ2VyLiBBbiBpbnRlZ2VyIGlzIHNhZmUgaWYgaXQncyBhbiBJRUVFLTc1NFxuICAgICAqIGRvdWJsZSBwcmVjaXNpb24gbnVtYmVyIHdoaWNoIGlzbid0IHRoZSByZXN1bHQgb2YgYSByb3VuZGVkIHVuc2FmZSBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BOdW1iZXIuaXNTYWZlSW50ZWdlcmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc1NhZmVJbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzYWZlIGludGVnZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNTYWZlSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSAmJiB2YWx1ZSA+PSAtTUFYX1NBRkVfSU5URUdFUiAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU2V0YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc2V0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTZXQobmV3IFNldCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1NldChuZXcgV2Vha1NldCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNTZXQgPSBub2RlSXNTZXQgPyBiYXNlVW5hcnkobm9kZUlzU2V0KSA6IGJhc2VJc1NldDtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3RyaW5nYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN0cmluZywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU3RyaW5nKDEpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHxcbiAgICAgICAgKCFpc0FycmF5KHZhbHVlKSAmJiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN0cmluZ1RhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN5bWJvbFRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIHR5cGVkIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNUeXBlZEFycmF5KG5ldyBVaW50OEFycmF5KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzVHlwZWRBcnJheShbXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNUeXBlZEFycmF5ID0gbm9kZUlzVHlwZWRBcnJheSA/IGJhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KSA6IGJhc2VJc1R5cGVkQXJyYXk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1VuZGVmaW5lZCh2b2lkIDApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNVbmRlZmluZWQobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBXZWFrTWFwYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgd2VhayBtYXAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtNYXAobmV3IFdlYWtNYXApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNXZWFrTWFwKG5ldyBNYXApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNXZWFrTWFwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IHdlYWtNYXBUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBXZWFrU2V0YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgd2VhayBzZXQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtTZXQobmV3IFdlYWtTZXQpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNXZWFrU2V0KG5ldyBTZXQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNXZWFrU2V0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSB3ZWFrU2V0VGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAc2VlIF8uZ3RcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sdCgxLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmx0KDMsIDMpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmx0KDMsIDEpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGx0ID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihiYXNlTHQpO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG9cbiAgICAgKiAgYG90aGVyYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5ndGVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sdGUoMSwgMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5sdGUoMywgMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5sdGUoMywgMSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgbHRlID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA8PSBvdGhlcjtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9BcnJheSh7ICdhJzogMSwgJ2InOiAyIH0pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy50b0FycmF5KCdhYmMnKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKlxuICAgICAqIF8udG9BcnJheSgxKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogXy50b0FycmF5KG51bGwpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSkge1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheUxpa2UodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBpc1N0cmluZyh2YWx1ZSkgPyBzdHJpbmdUb0FycmF5KHZhbHVlKSA6IGNvcHlBcnJheSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoc3ltSXRlcmF0b3IgJiYgdmFsdWVbc3ltSXRlcmF0b3JdKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvclRvQXJyYXkodmFsdWVbc3ltSXRlcmF0b3JdKCkpO1xuICAgICAgfVxuICAgICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSksXG4gICAgICAgICAgZnVuYyA9IHRhZyA9PSBtYXBUYWcgPyBtYXBUb0FycmF5IDogKHRhZyA9PSBzZXRUYWcgPyBzZXRUb0FycmF5IDogdmFsdWVzKTtcblxuICAgICAgcmV0dXJuIGZ1bmModmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTIuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKDMuMik7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDVlLTMyNFxuICAgICAqXG4gICAgICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gICAgICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAgICAgKlxuICAgICAqIF8udG9GaW5pdGUoJzMuMicpO1xuICAgICAqIC8vID0+IDMuMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICAgICAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgICAgIHJldHVybiBzaWduICogTUFYX0lOVEVHRVI7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gICAgICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b0ludGVnZXIoMy4yKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAgICAgKlxuICAgICAqIF8udG9JbnRlZ2VyKCczLjInKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLFxuICAgICAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgICAgIHJldHVybiByZXN1bHQgPT09IHJlc3VsdCA/IChyZW1haW5kZXIgPyByZXN1bHQgLSByZW1haW5kZXIgOiByZXN1bHQpIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIgc3VpdGFibGUgZm9yIHVzZSBhcyB0aGUgbGVuZ3RoIG9mIGFuXG4gICAgICogYXJyYXktbGlrZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKDMuMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy50b0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiA0Mjk0OTY3Mjk1XG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKCczLjInKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9MZW5ndGgodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA/IGJhc2VDbGFtcCh0b0ludGVnZXIodmFsdWUpLCAwLCBNQVhfQVJSQVlfTEVOR1RIKSA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoMy4yKTtcbiAgICAgKiAvLyA9PiAzLjJcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gNWUtMzI0XG4gICAgICpcbiAgICAgKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBJbmZpbml0eVxuICAgICAqXG4gICAgICogXy50b051bWJlcignMy4yJyk7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gTkFOO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSBiYXNlVHJpbSh2YWx1ZSk7XG4gICAgICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICAgICAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgICAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgcGxhaW4gb2JqZWN0IGZsYXR0ZW5pbmcgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nXG4gICAgICoga2V5ZWQgcHJvcGVydGllcyBvZiBgdmFsdWVgIHRvIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBwbGFpbiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29udmVydGVkIHBsYWluIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5hc3NpZ24oeyAnYSc6IDEgfSwgbmV3IEZvbyk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICpcbiAgICAgKiBfLmFzc2lnbih7ICdhJzogMSB9LCBfLnRvUGxhaW5PYmplY3QobmV3IEZvbykpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9QbGFpbk9iamVjdCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGNvcHlPYmplY3QodmFsdWUsIGtleXNJbih2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzYWZlIGludGVnZXIuIEEgc2FmZSBpbnRlZ2VyIGNhbiBiZSBjb21wYXJlZCBhbmRcbiAgICAgKiByZXByZXNlbnRlZCBjb3JyZWN0bHkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcigzLjIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiBfLnRvU2FmZUludGVnZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IDkwMDcxOTkyNTQ3NDA5OTFcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcignMy4yJyk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvU2FmZUludGVnZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICA/IGJhc2VDbGFtcCh0b0ludGVnZXIodmFsdWUpLCAtTUFYX1NBRkVfSU5URUdFUiwgTUFYX1NBRkVfSU5URUdFUilcbiAgICAgICAgOiAodmFsdWUgPT09IDAgPyB2YWx1ZSA6IDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG4gICAgICogYW5kIGB1bmRlZmluZWRgIHZhbHVlcy4gVGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1N0cmluZyhudWxsKTtcbiAgICAgKiAvLyA9PiAnJ1xuICAgICAqXG4gICAgICogXy50b1N0cmluZygtMCk7XG4gICAgICogLy8gPT4gJy0wJ1xuICAgICAqXG4gICAgICogXy50b1N0cmluZyhbMSwgMiwgM10pO1xuICAgICAqIC8vID0+ICcxLDIsMydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQXNzaWducyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2Ugb2JqZWN0cyB0byB0aGVcbiAgICAgKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC5cbiAgICAgKiBTdWJzZXF1ZW50IHNvdXJjZXMgb3ZlcndyaXRlIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHNvdXJjZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YCBhbmQgaXMgbG9vc2VseSBiYXNlZCBvblxuICAgICAqIFtgT2JqZWN0LmFzc2lnbmBdKGh0dHBzOi8vbWRuLmlvL09iamVjdC9hc3NpZ24pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uYXNzaWduSW5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBCYXIoKSB7XG4gICAgICogICB0aGlzLmMgPSAzO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYiA9IDI7XG4gICAgICogQmFyLnByb3RvdHlwZS5kID0gNDtcbiAgICAgKlxuICAgICAqIF8uYXNzaWduKHsgJ2EnOiAwIH0sIG5ldyBGb28sIG5ldyBCYXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICAgICAqL1xuICAgIHZhciBhc3NpZ24gPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgaWYgKGlzUHJvdG90eXBlKHNvdXJjZSkgfHwgaXNBcnJheUxpa2Uoc291cmNlKSkge1xuICAgICAgICBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIG93biBhbmRcbiAgICAgKiBpbmhlcml0ZWQgc291cmNlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBhbGlhcyBleHRlbmRcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmFzc2lnblxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEJhcigpIHtcbiAgICAgKiAgIHRoaXMuYyA9IDM7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5iID0gMjtcbiAgICAgKiBCYXIucHJvdG90eXBlLmQgPSA0O1xuICAgICAqXG4gICAgICogXy5hc3NpZ25Jbih7ICdhJzogMCB9LCBuZXcgRm9vLCBuZXcgQmFyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMsICdkJzogNCB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbkluID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduSW5gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCB0byBwcm9kdWNlIHRoZSBhc3NpZ25lZCB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zXG4gICAgICogYHVuZGVmaW5lZGAsIGFzc2lnbm1lbnQgaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmBcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggZml2ZSBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAYWxpYXMgZXh0ZW5kV2l0aFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IHNvdXJjZXMgVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5hc3NpZ25XaXRoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7XG4gICAgICogICByZXR1cm4gXy5pc1VuZGVmaW5lZChvYmpWYWx1ZSkgPyBzcmNWYWx1ZSA6IG9ialZhbHVlO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBkZWZhdWx0cyA9IF8ucGFydGlhbFJpZ2h0KF8uYXNzaWduSW5XaXRoLCBjdXN0b21pemVyKTtcbiAgICAgKlxuICAgICAqIGRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIHZhciBhc3NpZ25JbldpdGggPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0LCBjdXN0b21pemVyKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgYXNzaWduZWQgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJuc1xuICAgICAqIGB1bmRlZmluZWRgLCBhc3NpZ25tZW50IGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgXG4gICAgICogaXMgaW52b2tlZCB3aXRoIGZpdmUgYXJndW1lbnRzOiAob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmFzc2lnbkluV2l0aFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICAgICAqICAgcmV0dXJuIF8uaXNVbmRlZmluZWQob2JqVmFsdWUpID8gc3JjVmFsdWUgOiBvYmpWYWx1ZTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZGVmYXVsdHMgPSBfLnBhcnRpYWxSaWdodChfLmFzc2lnbldpdGgsIGN1c3RvbWl6ZXIpO1xuICAgICAqXG4gICAgICogZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbldpdGggPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCwgY3VzdG9taXplcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIGBwYXRoc2Agb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcGlja2VkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfSwgNF0gfTtcbiAgICAgKlxuICAgICAqIF8uYXQob2JqZWN0LCBbJ2FbMF0uYi5jJywgJ2FbMV0nXSk7XG4gICAgICogLy8gPT4gWzMsIDRdXG4gICAgICovXG4gICAgdmFyIGF0ID0gZmxhdFJlc3QoYmFzZUF0KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgaW5oZXJpdHMgZnJvbSB0aGUgYHByb3RvdHlwZWAgb2JqZWN0LiBJZiBhXG4gICAgICogYHByb3BlcnRpZXNgIG9iamVjdCBpcyBnaXZlbiwgaXRzIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzXG4gICAgICogYXJlIGFzc2lnbmVkIHRvIHRoZSBjcmVhdGVkIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvdG90eXBlIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllc10gVGhlIHByb3BlcnRpZXMgdG8gYXNzaWduIHRvIHRoZSBvYmplY3QuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gU2hhcGUoKSB7XG4gICAgICogICB0aGlzLnggPSAwO1xuICAgICAqICAgdGhpcy55ID0gMDtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBDaXJjbGUoKSB7XG4gICAgICogICBTaGFwZS5jYWxsKHRoaXMpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIENpcmNsZS5wcm90b3R5cGUgPSBfLmNyZWF0ZShTaGFwZS5wcm90b3R5cGUsIHtcbiAgICAgKiAgICdjb25zdHJ1Y3Rvcic6IENpcmNsZVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogdmFyIGNpcmNsZSA9IG5ldyBDaXJjbGU7XG4gICAgICogY2lyY2xlIGluc3RhbmNlb2YgQ2lyY2xlO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGNpcmNsZSBpbnN0YW5jZW9mIFNoYXBlO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocHJvdG90eXBlLCBwcm9wZXJ0aWVzKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZUNyZWF0ZShwcm90b3R5cGUpO1xuICAgICAgcmV0dXJuIHByb3BlcnRpZXMgPT0gbnVsbCA/IHJlc3VsdCA6IGJhc2VBc3NpZ24ocmVzdWx0LCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3NpZ25zIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlXG4gICAgICogb2JqZWN0cyB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0IGZvciBhbGwgZGVzdGluYXRpb24gcHJvcGVydGllcyB0aGF0XG4gICAgICogcmVzb2x2ZSB0byBgdW5kZWZpbmVkYC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICAgICAqIE9uY2UgYSBwcm9wZXJ0eSBpcyBzZXQsIGFkZGl0aW9uYWwgdmFsdWVzIG9mIHRoZSBzYW1lIHByb3BlcnR5IGFyZSBpZ25vcmVkLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmRlZmF1bHRzRGVlcFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIHZhciBkZWZhdWx0cyA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG5cbiAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgdmFyIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoO1xuICAgICAgdmFyIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLCBzb3VyY2VzWzFdLCBndWFyZCkpIHtcbiAgICAgICAgbGVuZ3RoID0gMTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgICAgICB2YXIgcHJvcHMgPSBrZXlzSW4oc291cmNlKTtcbiAgICAgICAgdmFyIHByb3BzSW5kZXggPSAtMTtcbiAgICAgICAgdmFyIHByb3BzTGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlICgrK3Byb3BzSW5kZXggPCBwcm9wc0xlbmd0aCkge1xuICAgICAgICAgIHZhciBrZXkgPSBwcm9wc1twcm9wc0luZGV4XTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgIChlcSh2YWx1ZSwgb2JqZWN0UHJvdG9ba2V5XSkgJiYgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICAgICAgb2JqZWN0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZGVmYXVsdHNgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGFzc2lnbnNcbiAgICAgKiBkZWZhdWx0IHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmRlZmF1bHRzXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmYXVsdHNEZWVwKHsgJ2EnOiB7ICdiJzogMiB9IH0sIHsgJ2EnOiB7ICdiJzogMSwgJ2MnOiAzIH0gfSk7XG4gICAgICogLy8gPT4geyAnYSc6IHsgJ2InOiAyLCAnYyc6IDMgfSB9XG4gICAgICovXG4gICAgdmFyIGRlZmF1bHRzRGVlcCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgIGFyZ3MucHVzaCh1bmRlZmluZWQsIGN1c3RvbURlZmF1bHRzTWVyZ2UpO1xuICAgICAgcmV0dXJuIGFwcGx5KG1lcmdlV2l0aCwgdW5kZWZpbmVkLCBhcmdzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUga2V5IG9mIHRoZSBmaXJzdFxuICAgICAqIGVsZW1lbnQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMS4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gUmV0dXJucyB0aGUga2V5IG9mIHRoZSBtYXRjaGVkIGVsZW1lbnQsXG4gICAgICogIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IHtcbiAgICAgKiAgICdiYXJuZXknOiAgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICAnZnJlZCc6ICAgIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgICdwZWJibGVzJzogeyAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAgICAgKiAvLyA9PiAnYmFybmV5JyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRLZXkodXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+ICdwZWJibGVzJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEtleSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+ICdmcmVkJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gJ2Jhcm5leSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kS2V5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBiYXNlRm9yT3duKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRLZXlgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBhIGNvbGxlY3Rpb24gaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gUmV0dXJucyB0aGUga2V5IG9mIHRoZSBtYXRjaGVkIGVsZW1lbnQsXG4gICAgICogIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IHtcbiAgICAgKiAgICdiYXJuZXknOiAgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICAnZnJlZCc6ICAgIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgICdwZWJibGVzJzogeyAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5maW5kTGFzdEtleSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7XG4gICAgICogLy8gPT4gcmV0dXJucyAncGViYmxlcycgYXNzdW1pbmcgYF8uZmluZEtleWAgcmV0dXJucyAnYmFybmV5J1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gJ2Jhcm5leSdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gJ2ZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gJ3BlYmJsZXMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluZExhc3RLZXkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiBiYXNlRmluZEtleShvYmplY3QsIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGJhc2VGb3JPd25SaWdodCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGFuXG4gICAgICogb2JqZWN0IGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwga2V5LCBvYmplY3QpLiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXRcbiAgICAgKiBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmZvckluUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uZm9ySW4obmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdhJywgJ2InLCB0aGVuICdjJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JJbihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGxcbiAgICAgICAgPyBvYmplY3RcbiAgICAgICAgOiBiYXNlRm9yKG9iamVjdCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpLCBrZXlzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZm9ySW5gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgcHJvcGVydGllcyBvZlxuICAgICAqIGBvYmplY3RgIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmZvckluXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvckluUmlnaHQobmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdjJywgJ2InLCB0aGVuICdhJyBhc3N1bWluZyBgXy5mb3JJbmAgbG9ncyAnYScsICdiJywgdGhlbiAnYycuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9ySW5SaWdodChvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGxcbiAgICAgICAgPyBvYmplY3RcbiAgICAgICAgOiBiYXNlRm9yUmlnaHQob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyksIGtleXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBhbiBvYmplY3QgYW5kXG4gICAgICogaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS4gSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvblxuICAgICAqIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5mb3JPd25SaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5mb3JPd24obmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JPd24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yT3duKG9iamVjdCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvck93bmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzIG9mXG4gICAgICogYG9iamVjdGAgaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZm9yT3duXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvck93blJpZ2h0KG5ldyBGb28sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnYicgdGhlbiAnYScgYXNzdW1pbmcgYF8uZm9yT3duYCBsb2dzICdhJyB0aGVuICdiJy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JPd25SaWdodChvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3JPd25SaWdodChvYmplY3QsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmcm9tIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXNcbiAgICAgKiBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGZ1bmN0aW9uIG5hbWVzLlxuICAgICAqIEBzZWUgXy5mdW5jdGlvbnNJblxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSBfLmNvbnN0YW50KCdhJyk7XG4gICAgICogICB0aGlzLmIgPSBfLmNvbnN0YW50KCdiJyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gXy5jb25zdGFudCgnYycpO1xuICAgICAqXG4gICAgICogXy5mdW5jdGlvbnMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZ1bmN0aW9ucyhvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZUZ1bmN0aW9ucyhvYmplY3QsIGtleXMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmcm9tIG93biBhbmQgaW5oZXJpdGVkXG4gICAgICogZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZXMuXG4gICAgICogQHNlZSBfLmZ1bmN0aW9uc1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSBfLmNvbnN0YW50KCdhJyk7XG4gICAgICogICB0aGlzLmIgPSBfLmNvbnN0YW50KCdiJyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gXy5jb25zdGFudCgnYycpO1xuICAgICAqXG4gICAgICogXy5mdW5jdGlvbnNJbihuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmdW5jdGlvbnNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZUZ1bmN0aW9ucyhvYmplY3QsIGtleXNJbihvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIHRoZSByZXNvbHZlZCB2YWx1ZSBpc1xuICAgICAqIGB1bmRlZmluZWRgLCB0aGUgYGRlZmF1bHRWYWx1ZWAgaXMgcmV0dXJuZWQgaW4gaXRzIHBsYWNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV0gVGhlIHZhbHVlIHJldHVybmVkIGZvciBgdW5kZWZpbmVkYCByZXNvbHZlZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICAgICAqXG4gICAgICogXy5nZXQob2JqZWN0LCAnYVswXS5iLmMnKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLmdldChvYmplY3QsIFsnYScsICcwJywgJ2InLCAnYyddKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLmdldChvYmplY3QsICdhLmIuYycsICdkZWZhdWx0Jyk7XG4gICAgICogLy8gPT4gJ2RlZmF1bHQnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0KG9iamVjdCwgcGF0aCwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBwcm9wZXJ0eSBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiB7ICdiJzogMiB9IH07XG4gICAgICogdmFyIG90aGVyID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICAgICAqXG4gICAgICogXy5oYXMob2JqZWN0LCAnYScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzKG9iamVjdCwgJ2EuYicpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzKG9iamVjdCwgWydhJywgJ2InXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXMob3RoZXIsICdhJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXMob2JqZWN0LCBwYXRoKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzUGF0aChvYmplY3QsIHBhdGgsIGJhc2VIYXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcGF0aGAgaXMgYSBkaXJlY3Qgb3IgaW5oZXJpdGVkIHByb3BlcnR5IG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICAgICAqXG4gICAgICogXy5oYXNJbihvYmplY3QsICdhJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXNJbihvYmplY3QsICdhLmInKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhc0luKG9iamVjdCwgWydhJywgJ2InXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXNJbihvYmplY3QsICdiJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNJbihvYmplY3QsIHBhdGgpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhc0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgaW52ZXJ0ZWQga2V5cyBhbmQgdmFsdWVzIG9mIGBvYmplY3RgLlxuICAgICAqIElmIGBvYmplY3RgIGNvbnRhaW5zIGR1cGxpY2F0ZSB2YWx1ZXMsIHN1YnNlcXVlbnQgdmFsdWVzIG92ZXJ3cml0ZVxuICAgICAqIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjcuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlZCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfTtcbiAgICAgKlxuICAgICAqIF8uaW52ZXJ0KG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnMSc6ICdjJywgJzInOiAnYicgfVxuICAgICAqL1xuICAgIHZhciBpbnZlcnQgPSBjcmVhdGVJbnZlcnRlcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmXG4gICAgICAgICAgdHlwZW9mIHZhbHVlLnRvU3RyaW5nICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFsdWUgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0W3ZhbHVlXSA9IGtleTtcbiAgICB9LCBjb25zdGFudChpZGVudGl0eSkpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbnZlcnRgIGV4Y2VwdCB0aGF0IHRoZSBpbnZlcnRlZCBvYmplY3QgaXMgZ2VuZXJhdGVkXG4gICAgICogZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nIGVhY2ggZWxlbWVudCBvZiBgb2JqZWN0YCB0aHJ1IGBpdGVyYXRlZWAuIFRoZVxuICAgICAqIGNvcnJlc3BvbmRpbmcgaW52ZXJ0ZWQgdmFsdWUgb2YgZWFjaCBpbnZlcnRlZCBrZXkgaXMgYW4gYXJyYXkgb2Yga2V5c1xuICAgICAqIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZSBpbnZlcnRlZCB2YWx1ZS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52ZXJ0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgaW52ZXJ0ZWQgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH07XG4gICAgICpcbiAgICAgKiBfLmludmVydEJ5KG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfVxuICAgICAqXG4gICAgICogXy5pbnZlcnRCeShvYmplY3QsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICByZXR1cm4gJ2dyb3VwJyArIHZhbHVlO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2dyb3VwMSc6IFsnYScsICdjJ10sICdncm91cDInOiBbJ2InXSB9XG4gICAgICovXG4gICAgdmFyIGludmVydEJ5ID0gY3JlYXRlSW52ZXJ0ZXIoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJlxuICAgICAgICAgIHR5cGVvZiB2YWx1ZS50b1N0cmluZyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhbHVlID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwgdmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdFt2YWx1ZV0ucHVzaChrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W3ZhbHVlXSA9IFtrZXldO1xuICAgICAgfVxuICAgIH0sIGdldEl0ZXJhdGVlKTtcblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiBbMSwgMiwgMywgNF0gfSB9XSB9O1xuICAgICAqXG4gICAgICogXy5pbnZva2Uob2JqZWN0LCAnYVswXS5iLmMuc2xpY2UnLCAxLCAzKTtcbiAgICAgKiAvLyA9PiBbMiwgM11cbiAgICAgKi9cbiAgICB2YXIgaW52b2tlID0gYmFzZVJlc3QoYmFzZUludm9rZSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLiBTZWUgdGhlXG4gICAgICogW0VTIHNwZWNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmtleXMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogXy5rZXlzKCdoaScpO1xuICAgICAqIC8vID0+IFsnMCcsICcxJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBrZXlzKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8ua2V5c0luKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGtleXNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QsIHRydWUpIDogYmFzZUtleXNJbihvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5tYXBWYWx1ZXNgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZVxuICAgICAqIHNhbWUgdmFsdWVzIGFzIGBvYmplY3RgIGFuZCBrZXlzIGdlbmVyYXRlZCBieSBydW5uaW5nIGVhY2ggb3duIGVudW1lcmFibGVcbiAgICAgKiBzdHJpbmcga2V5ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjguMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgb2JqZWN0LlxuICAgICAqIEBzZWUgXy5tYXBWYWx1ZXNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tYXBLZXlzKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgcmV0dXJuIGtleSArIHZhbHVlO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2ExJzogMSwgJ2IyJzogMiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwS2V5cyhvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICBpdGVyYXRlZSA9IGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKTtcblxuICAgICAgYmFzZUZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBpdGVyYXRlZSh2YWx1ZSwga2V5LCBvYmplY3QpLCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBrZXlzIGFzIGBvYmplY3RgIGFuZCB2YWx1ZXMgZ2VuZXJhdGVkXG4gICAgICogYnkgcnVubmluZyBlYWNoIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YCB0aHJ1XG4gICAgICogYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gICAgICogKHZhbHVlLCBrZXksIG9iamVjdCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIG9iamVjdC5cbiAgICAgKiBAc2VlIF8ubWFwS2V5c1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSB7XG4gICAgICogICAnZnJlZCc6ICAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCB9LFxuICAgICAqICAgJ3BlYmJsZXMnOiB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8ubWFwVmFsdWVzKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZTsgfSk7XG4gICAgICogLy8gPT4geyAnZnJlZCc6IDQwLCAncGViYmxlcyc6IDEgfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tYXBWYWx1ZXModXNlcnMsICdhZ2UnKTtcbiAgICAgKiAvLyA9PiB7ICdmcmVkJzogNDAsICdwZWJibGVzJzogMSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwVmFsdWVzKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpO1xuXG4gICAgICBiYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgaXRlcmF0ZWUodmFsdWUsIGtleSwgb2JqZWN0KSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IG1lcmdlcyBvd24gYW5kXG4gICAgICogaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlIG9iamVjdHMgaW50byB0aGVcbiAgICAgKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBwcm9wZXJ0aWVzIHRoYXQgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYCBhcmVcbiAgICAgKiBza2lwcGVkIGlmIGEgZGVzdGluYXRpb24gdmFsdWUgZXhpc3RzLiBBcnJheSBhbmQgcGxhaW4gb2JqZWN0IHByb3BlcnRpZXNcbiAgICAgKiBhcmUgbWVyZ2VkIHJlY3Vyc2l2ZWx5LiBPdGhlciBvYmplY3RzIGFuZCB2YWx1ZSB0eXBlcyBhcmUgb3ZlcnJpZGRlbiBieVxuICAgICAqIGFzc2lnbm1lbnQuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC4gU3Vic2VxdWVudFxuICAgICAqIHNvdXJjZXMgb3ZlcndyaXRlIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHNvdXJjZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjUuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHtcbiAgICAgKiAgICdhJzogW3sgJ2InOiAyIH0sIHsgJ2QnOiA0IH1dXG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBvdGhlciA9IHtcbiAgICAgKiAgICdhJzogW3sgJ2MnOiAzIH0sIHsgJ2UnOiA1IH1dXG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8ubWVyZ2Uob2JqZWN0LCBvdGhlcik7XG4gICAgICogLy8gPT4geyAnYSc6IFt7ICdiJzogMiwgJ2MnOiAzIH0sIHsgJ2QnOiA0LCAnZSc6IDUgfV0gfVxuICAgICAqL1xuICAgIHZhciBtZXJnZSA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCkge1xuICAgICAgYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1lcmdlYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgbWVyZ2VkIHZhbHVlcyBvZiB0aGUgZGVzdGluYXRpb24gYW5kIHNvdXJjZVxuICAgICAqIHByb3BlcnRpZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLCBtZXJnaW5nIGlzIGhhbmRsZWQgYnkgdGhlXG4gICAgICogbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoIHNpeCBhcmd1bWVudHM6XG4gICAgICogKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBzb3VyY2VzIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7XG4gICAgICogICBpZiAoXy5pc0FycmF5KG9ialZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gb2JqVmFsdWUuY29uY2F0KHNyY1ZhbHVlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFsxXSwgJ2InOiBbMl0gfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogWzNdLCAnYic6IFs0XSB9O1xuICAgICAqXG4gICAgICogXy5tZXJnZVdpdGgob2JqZWN0LCBvdGhlciwgY3VzdG9taXplcik7XG4gICAgICogLy8gPT4geyAnYSc6IFsxLCAzXSwgJ2InOiBbMiwgNF0gfVxuICAgICAqL1xuICAgIHZhciBtZXJnZVdpdGggPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLnBpY2tgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGVcbiAgICAgKiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IHBhdGhzIG9mIGBvYmplY3RgIHRoYXQgYXJlIG5vdCBvbWl0dGVkLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGNvbnNpZGVyYWJseSBzbG93ZXIgdGhhbiBgXy5waWNrYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIG9taXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLm9taXQob2JqZWN0LCBbJ2EnLCAnYyddKTtcbiAgICAgKiAvLyA9PiB7ICdiJzogJzInIH1cbiAgICAgKi9cbiAgICB2YXIgb21pdCA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgcGF0aHMpIHtcbiAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgdmFyIGlzRGVlcCA9IGZhbHNlO1xuICAgICAgcGF0aHMgPSBhcnJheU1hcChwYXRocywgZnVuY3Rpb24ocGF0aCkge1xuICAgICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcbiAgICAgICAgaXNEZWVwIHx8IChpc0RlZXAgPSBwYXRoLmxlbmd0aCA+IDEpO1xuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgIH0pO1xuICAgICAgY29weU9iamVjdChvYmplY3QsIGdldEFsbEtleXNJbihvYmplY3QpLCByZXN1bHQpO1xuICAgICAgaWYgKGlzRGVlcCkge1xuICAgICAgICByZXN1bHQgPSBiYXNlQ2xvbmUocmVzdWx0LCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9GTEFUX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcsIGN1c3RvbU9taXRDbG9uZSk7XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gcGF0aHMubGVuZ3RoO1xuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIGJhc2VVbnNldChyZXN1bHQsIHBhdGhzW2xlbmd0aF0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5waWNrQnlgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZlxuICAgICAqIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGBvYmplY3RgIHRoYXRcbiAgICAgKiBgcHJlZGljYXRlYCBkb2Vzbid0IHJldHVybiB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0d29cbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwga2V5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICAgICAqXG4gICAgICogXy5vbWl0Qnkob2JqZWN0LCBfLmlzTnVtYmVyKTtcbiAgICAgKiAvLyA9PiB7ICdiJzogJzInIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbWl0Qnkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiBwaWNrQnkob2JqZWN0LCBuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBwaWNrZWQgYG9iamVjdGAgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLnBpY2sob2JqZWN0LCBbJ2EnLCAnYyddKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2MnOiAzIH1cbiAgICAgKi9cbiAgICB2YXIgcGljayA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgcGF0aHMpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHt9IDogYmFzZVBpY2sob2JqZWN0LCBwYXRocyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgYG9iamVjdGAgcHJvcGVydGllcyBgcHJlZGljYXRlYCByZXR1cm5zXG4gICAgICogdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czogKHZhbHVlLCBrZXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgcHJvcGVydHkuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLnBpY2tCeShvYmplY3QsIF8uaXNOdW1iZXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBpY2tCeShvYmplY3QsIHByZWRpY2F0ZSkge1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wcyA9IGFycmF5TWFwKGdldEFsbEtleXNJbihvYmplY3QpLCBmdW5jdGlvbihwcm9wKSB7XG4gICAgICAgIHJldHVybiBbcHJvcF07XG4gICAgICB9KTtcbiAgICAgIHByZWRpY2F0ZSA9IGdldEl0ZXJhdGVlKHByZWRpY2F0ZSk7XG4gICAgICByZXR1cm4gYmFzZVBpY2tCeShvYmplY3QsIHByb3BzLCBmdW5jdGlvbih2YWx1ZSwgcGF0aCkge1xuICAgICAgICByZXR1cm4gcHJlZGljYXRlKHZhbHVlLCBwYXRoWzBdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZ2V0YCBleGNlcHQgdGhhdCBpZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXMgYVxuICAgICAqIGZ1bmN0aW9uIGl0J3MgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBpdHMgcGFyZW50IG9iamVjdCBhbmRcbiAgICAgKiBpdHMgcmVzdWx0IGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gcmVzb2x2ZS5cbiAgICAgKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgYHVuZGVmaW5lZGAgcmVzb2x2ZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MxJzogMywgJ2MyJzogXy5jb25zdGFudCg0KSB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzEnKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzInKTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzMnLCAnZGVmYXVsdCcpO1xuICAgICAqIC8vID0+ICdkZWZhdWx0J1xuICAgICAqXG4gICAgICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMzJywgXy5jb25zdGFudCgnZGVmYXVsdCcpKTtcbiAgICAgKiAvLyA9PiAnZGVmYXVsdCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXN1bHQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aDtcblxuICAgICAgLy8gRW5zdXJlIHRoZSBsb29wIGlzIGVudGVyZWQgd2hlbiBwYXRoIGlzIGVtcHR5LlxuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgbGVuZ3RoID0gMTtcbiAgICAgICAgb2JqZWN0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3RbdG9LZXkocGF0aFtpbmRleF0pXTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpbmRleCA9IGxlbmd0aDtcbiAgICAgICAgICB2YWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBvYmplY3QgPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHZhbHVlLmNhbGwob2JqZWN0KSA6IHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIGEgcG9ydGlvbiBvZiBgcGF0aGAgZG9lc24ndCBleGlzdCxcbiAgICAgKiBpdCdzIGNyZWF0ZWQuIEFycmF5cyBhcmUgY3JlYXRlZCBmb3IgbWlzc2luZyBpbmRleCBwcm9wZXJ0aWVzIHdoaWxlIG9iamVjdHNcbiAgICAgKiBhcmUgY3JlYXRlZCBmb3IgYWxsIG90aGVyIG1pc3NpbmcgcHJvcGVydGllcy4gVXNlIGBfLnNldFdpdGhgIHRvIGN1c3RvbWl6ZVxuICAgICAqIGBwYXRoYCBjcmVhdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8uc2V0KG9iamVjdCwgJ2FbMF0uYi5jJywgNCk7XG4gICAgICogY29uc29sZS5sb2cob2JqZWN0LmFbMF0uYi5jKTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLnNldChvYmplY3QsIFsneCcsICcwJywgJ3knLCAneiddLCA1KTtcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QueFswXS55LnopO1xuICAgICAqIC8vID0+IDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNldGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIG9iamVjdHMgb2YgYHBhdGhgLiAgSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGBcbiAgICAgKiBwYXRoIGNyZWF0aW9uIGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKG5zVmFsdWUsIGtleSwgbnNPYmplY3QpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHt9O1xuICAgICAqXG4gICAgICogXy5zZXRXaXRoKG9iamVjdCwgJ1swXVsxXScsICdhJywgT2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICcwJzogeyAnMSc6ICdhJyB9IH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRXaXRoKG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQtdmFsdWUgcGFpcnMgZm9yIGBvYmplY3RgXG4gICAgICogd2hpY2ggY2FuIGJlIGNvbnN1bWVkIGJ5IGBfLmZyb21QYWlyc2AuIElmIGBvYmplY3RgIGlzIGEgbWFwIG9yIHNldCwgaXRzXG4gICAgICogZW50cmllcyBhcmUgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAYWxpYXMgZW50cmllc1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLnRvUGFpcnMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gW1snYScsIDFdLCBbJ2InLCAyXV0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICB2YXIgdG9QYWlycyA9IGNyZWF0ZVRvUGFpcnMoa2V5cyk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkLXZhbHVlIHBhaXJzXG4gICAgICogZm9yIGBvYmplY3RgIHdoaWNoIGNhbiBiZSBjb25zdW1lZCBieSBgXy5mcm9tUGFpcnNgLiBJZiBgb2JqZWN0YCBpcyBhIG1hcFxuICAgICAqIG9yIHNldCwgaXRzIGVudHJpZXMgYXJlIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGFsaWFzIGVudHJpZXNJblxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLnRvUGFpcnNJbihuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbWydhJywgMV0sIFsnYicsIDJdLCBbJ2MnLCAzXV0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICB2YXIgdG9QYWlyc0luID0gY3JlYXRlVG9QYWlycyhrZXlzSW4pO1xuXG4gICAgLyoqXG4gICAgICogQW4gYWx0ZXJuYXRpdmUgdG8gYF8ucmVkdWNlYDsgdGhpcyBtZXRob2QgdHJhbnNmb3JtcyBgb2JqZWN0YCB0byBhIG5ld1xuICAgICAqIGBhY2N1bXVsYXRvcmAgb2JqZWN0IHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgcnVubmluZyBlYWNoIG9mIGl0cyBvd25cbiAgICAgKiBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIHRocnUgYGl0ZXJhdGVlYCwgd2l0aCBlYWNoIGludm9jYXRpb25cbiAgICAgKiBwb3RlbnRpYWxseSBtdXRhdGluZyB0aGUgYGFjY3VtdWxhdG9yYCBvYmplY3QuIElmIGBhY2N1bXVsYXRvcmAgaXMgbm90XG4gICAgICogcHJvdmlkZWQsIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBzYW1lIGBbW1Byb3RvdHlwZV1dYCB3aWxsIGJlIHVzZWQuIFRoZVxuICAgICAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czogKGFjY3VtdWxhdG9yLCB2YWx1ZSwga2V5LCBvYmplY3QpLlxuICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgY3VzdG9tIGFjY3VtdWxhdG9yIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmFuc2Zvcm0oWzIsIDMsIDRdLCBmdW5jdGlvbihyZXN1bHQsIG4pIHtcbiAgICAgKiAgIHJlc3VsdC5wdXNoKG4gKj0gbik7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAgICAgKiB9LCBbXSk7XG4gICAgICogLy8gPT4gWzQsIDldXG4gICAgICpcbiAgICAgKiBfLnRyYW5zZm9ybSh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfSwgZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICogICAocmVzdWx0W3ZhbHVlXSB8fCAocmVzdWx0W3ZhbHVlXSA9IFtdKSkucHVzaChrZXkpO1xuICAgICAqIH0sIHt9KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJhbnNmb3JtKG9iamVjdCwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KG9iamVjdCksXG4gICAgICAgICAgaXNBcnJMaWtlID0gaXNBcnIgfHwgaXNCdWZmZXIob2JqZWN0KSB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KTtcblxuICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCk7XG4gICAgICBpZiAoYWNjdW11bGF0b3IgPT0gbnVsbCkge1xuICAgICAgICB2YXIgQ3RvciA9IG9iamVjdCAmJiBvYmplY3QuY29uc3RydWN0b3I7XG4gICAgICAgIGlmIChpc0Fyckxpa2UpIHtcbiAgICAgICAgICBhY2N1bXVsYXRvciA9IGlzQXJyID8gbmV3IEN0b3IgOiBbXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgICAgYWNjdW11bGF0b3IgPSBpc0Z1bmN0aW9uKEN0b3IpID8gYmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSkgOiB7fTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBhY2N1bXVsYXRvciA9IHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAoaXNBcnJMaWtlID8gYXJyYXlFYWNoIDogYmFzZUZvck93bikob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgb2JqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHByb3BlcnR5IGF0IGBwYXRoYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHVuc2V0LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcHJvcGVydHkgaXMgZGVsZXRlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDcgfSB9XSB9O1xuICAgICAqIF8udW5zZXQob2JqZWN0LCAnYVswXS5iLmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QpO1xuICAgICAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IHt9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnVuc2V0KG9iamVjdCwgWydhJywgJzAnLCAnYicsICdjJ10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnYSc6IFt7ICdiJzoge30gfV0gfTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bnNldChvYmplY3QsIHBhdGgpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHRydWUgOiBiYXNlVW5zZXQob2JqZWN0LCBwYXRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNldGAgZXhjZXB0IHRoYXQgYWNjZXB0cyBgdXBkYXRlcmAgdG8gcHJvZHVjZSB0aGVcbiAgICAgKiB2YWx1ZSB0byBzZXQuIFVzZSBgXy51cGRhdGVXaXRoYCB0byBjdXN0b21pemUgYHBhdGhgIGNyZWF0aW9uLiBUaGUgYHVwZGF0ZXJgXG4gICAgICogaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNi4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVyIFRoZSBmdW5jdGlvbiB0byBwcm9kdWNlIHRoZSB1cGRhdGVkIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnVwZGF0ZShvYmplY3QsICdhWzBdLmIuYycsIGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gKiBuOyB9KTtcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QuYVswXS5iLmMpO1xuICAgICAqIC8vID0+IDlcbiAgICAgKlxuICAgICAqIF8udXBkYXRlKG9iamVjdCwgJ3hbMF0ueS56JywgZnVuY3Rpb24obikgeyByZXR1cm4gbiA/IG4gKyAxIDogMDsgfSk7XG4gICAgICogY29uc29sZS5sb2cob2JqZWN0LnhbMF0ueS56KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICovXG4gICAgZnVuY3Rpb24gdXBkYXRlKG9iamVjdCwgcGF0aCwgdXBkYXRlcikge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVVwZGF0ZShvYmplY3QsIHBhdGgsIGNhc3RGdW5jdGlvbih1cGRhdGVyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51cGRhdGVgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCB0byBwcm9kdWNlIHRoZSBvYmplY3RzIG9mIGBwYXRoYC4gIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgXG4gICAgICogcGF0aCBjcmVhdGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6IChuc1ZhbHVlLCBrZXksIG5zT2JqZWN0KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNi4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVyIFRoZSBmdW5jdGlvbiB0byBwcm9kdWNlIHRoZSB1cGRhdGVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge307XG4gICAgICpcbiAgICAgKiBfLnVwZGF0ZVdpdGgob2JqZWN0LCAnWzBdWzFdJywgXy5jb25zdGFudCgnYScpLCBPYmplY3QpO1xuICAgICAqIC8vID0+IHsgJzAnOiB7ICcxJzogJ2EnIH0gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZVdpdGgob2JqZWN0LCBwYXRoLCB1cGRhdGVyLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlVXBkYXRlKG9iamVjdCwgcGF0aCwgY2FzdEZ1bmN0aW9uKHVwZGF0ZXIpLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy52YWx1ZXMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gWzEsIDJdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiBfLnZhbHVlcygnaGknKTtcbiAgICAgKiAvLyA9PiBbJ2gnLCAnaSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gdmFsdWVzKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlVmFsdWVzKG9iamVjdCwga2V5cyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eVxuICAgICAqIHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8udmFsdWVzSW4obmV3IEZvbyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gdmFsdWVzSW4ob2JqZWN0KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBbXSA6IGJhc2VWYWx1ZXMob2JqZWN0LCBrZXlzSW4ob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ2xhbXBzIGBudW1iZXJgIHdpdGhpbiB0aGUgaW5jbHVzaXZlIGBsb3dlcmAgYW5kIGB1cHBlcmAgYm91bmRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE51bWJlclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjbGFtcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xvd2VyXSBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjbGFtcGVkIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jbGFtcCgtMTAsIC01LCA1KTtcbiAgICAgKiAvLyA9PiAtNVxuICAgICAqXG4gICAgICogXy5jbGFtcCgxMCwgLTUsIDUpO1xuICAgICAqIC8vID0+IDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbGFtcChudW1iZXIsIGxvd2VyLCB1cHBlcikge1xuICAgICAgaWYgKHVwcGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXBwZXIgPSBsb3dlcjtcbiAgICAgICAgbG93ZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAodXBwZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1cHBlciA9IHRvTnVtYmVyKHVwcGVyKTtcbiAgICAgICAgdXBwZXIgPSB1cHBlciA9PT0gdXBwZXIgPyB1cHBlciA6IDA7XG4gICAgICB9XG4gICAgICBpZiAobG93ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsb3dlciA9IHRvTnVtYmVyKGxvd2VyKTtcbiAgICAgICAgbG93ZXIgPSBsb3dlciA9PT0gbG93ZXIgPyBsb3dlciA6IDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUNsYW1wKHRvTnVtYmVyKG51bWJlciksIGxvd2VyLCB1cHBlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBuYCBpcyBiZXR3ZWVuIGBzdGFydGAgYW5kIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuIElmXG4gICAgICogYGVuZGAgaXMgbm90IHNwZWNpZmllZCwgaXQncyBzZXQgdG8gYHN0YXJ0YCB3aXRoIGBzdGFydGAgdGhlbiBzZXQgdG8gYDBgLlxuICAgICAqIElmIGBzdGFydGAgaXMgZ3JlYXRlciB0aGFuIGBlbmRgIHRoZSBwYXJhbXMgYXJlIHN3YXBwZWQgdG8gc3VwcG9ydFxuICAgICAqIG5lZ2F0aXZlIHJhbmdlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjMuMFxuICAgICAqIEBjYXRlZ29yeSBOdW1iZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBudW1iZXJgIGlzIGluIHRoZSByYW5nZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5yYW5nZSwgXy5yYW5nZVJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgzLCAyLCA0KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoNCwgOCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDQsIDIpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoMiwgMik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgxLjIsIDIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSg1LjIsIDQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoLTMsIC0yLCAtNik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluUmFuZ2UobnVtYmVyLCBzdGFydCwgZW5kKSB7XG4gICAgICBzdGFydCA9IHRvRmluaXRlKHN0YXJ0KTtcbiAgICAgIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbmQgPSBzdGFydDtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICAgIH1cbiAgICAgIG51bWJlciA9IHRvTnVtYmVyKG51bWJlcik7XG4gICAgICByZXR1cm4gYmFzZUluUmFuZ2UobnVtYmVyLCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9kdWNlcyBhIHJhbmRvbSBudW1iZXIgYmV0d2VlbiB0aGUgaW5jbHVzaXZlIGBsb3dlcmAgYW5kIGB1cHBlcmAgYm91bmRzLlxuICAgICAqIElmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHByb3ZpZGVkIGEgbnVtYmVyIGJldHdlZW4gYDBgIGFuZCB0aGUgZ2l2ZW4gbnVtYmVyXG4gICAgICogaXMgcmV0dXJuZWQuIElmIGBmbG9hdGluZ2AgaXMgYHRydWVgLCBvciBlaXRoZXIgYGxvd2VyYCBvciBgdXBwZXJgIGFyZVxuICAgICAqIGZsb2F0cywgYSBmbG9hdGluZy1wb2ludCBudW1iZXIgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIEphdmFTY3JpcHQgZm9sbG93cyB0aGUgSUVFRS03NTQgc3RhbmRhcmQgZm9yIHJlc29sdmluZ1xuICAgICAqIGZsb2F0aW5nLXBvaW50IHZhbHVlcyB3aGljaCBjYW4gcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgTnVtYmVyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcj0wXSBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt1cHBlcj0xXSBUaGUgdXBwZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZmxvYXRpbmddIFNwZWNpZnkgcmV0dXJuaW5nIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJhbmRvbSBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDAsIDUpO1xuICAgICAqIC8vID0+IGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA1XG4gICAgICpcbiAgICAgKiBfLnJhbmRvbSg1KTtcbiAgICAgKiAvLyA9PiBhbHNvIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA1XG4gICAgICpcbiAgICAgKiBfLnJhbmRvbSg1LCB0cnVlKTtcbiAgICAgKiAvLyA9PiBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBiZXR3ZWVuIDAgYW5kIDVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDEuMiwgNS4yKTtcbiAgICAgKiAvLyA9PiBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBiZXR3ZWVuIDEuMiBhbmQgNS4yXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmFuZG9tKGxvd2VyLCB1cHBlciwgZmxvYXRpbmcpIHtcbiAgICAgIGlmIChmbG9hdGluZyAmJiB0eXBlb2YgZmxvYXRpbmcgIT0gJ2Jvb2xlYW4nICYmIGlzSXRlcmF0ZWVDYWxsKGxvd2VyLCB1cHBlciwgZmxvYXRpbmcpKSB7XG4gICAgICAgIHVwcGVyID0gZmxvYXRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAoZmxvYXRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIHVwcGVyID09ICdib29sZWFuJykge1xuICAgICAgICAgIGZsb2F0aW5nID0gdXBwZXI7XG4gICAgICAgICAgdXBwZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGxvd2VyID09ICdib29sZWFuJykge1xuICAgICAgICAgIGZsb2F0aW5nID0gbG93ZXI7XG4gICAgICAgICAgbG93ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChsb3dlciA9PT0gdW5kZWZpbmVkICYmIHVwcGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbG93ZXIgPSAwO1xuICAgICAgICB1cHBlciA9IDE7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgbG93ZXIgPSB0b0Zpbml0ZShsb3dlcik7XG4gICAgICAgIGlmICh1cHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdXBwZXIgPSBsb3dlcjtcbiAgICAgICAgICBsb3dlciA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXBwZXIgPSB0b0Zpbml0ZSh1cHBlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChsb3dlciA+IHVwcGVyKSB7XG4gICAgICAgIHZhciB0ZW1wID0gbG93ZXI7XG4gICAgICAgIGxvd2VyID0gdXBwZXI7XG4gICAgICAgIHVwcGVyID0gdGVtcDtcbiAgICAgIH1cbiAgICAgIGlmIChmbG9hdGluZyB8fCBsb3dlciAlIDEgfHwgdXBwZXIgJSAxKSB7XG4gICAgICAgIHZhciByYW5kID0gbmF0aXZlUmFuZG9tKCk7XG4gICAgICAgIHJldHVybiBuYXRpdmVNaW4obG93ZXIgKyAocmFuZCAqICh1cHBlciAtIGxvd2VyICsgZnJlZVBhcnNlRmxvYXQoJzFlLScgKyAoKHJhbmQgKyAnJykubGVuZ3RoIC0gMSkpKSksIHVwcGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlUmFuZG9tKGxvd2VyLCB1cHBlcik7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gW2NhbWVsIGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NhbWVsQ2FzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjYW1lbCBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2FtZWxDYXNlKCdGb28gQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvb0JhcidcbiAgICAgKlxuICAgICAqIF8uY2FtZWxDYXNlKCctLWZvby1iYXItLScpO1xuICAgICAqIC8vID0+ICdmb29CYXInXG4gICAgICpcbiAgICAgKiBfLmNhbWVsQ2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnZm9vQmFyJ1xuICAgICAqL1xuICAgIHZhciBjYW1lbENhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHdvcmQgPSB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gY2FwaXRhbGl6ZSh3b3JkKSA6IHdvcmQpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byB1cHBlciBjYXNlIGFuZCB0aGUgcmVtYWluaW5nXG4gICAgICogdG8gbG93ZXIgY2FzZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjYXBpdGFsaXplLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNhcGl0YWxpemVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jYXBpdGFsaXplKCdGUkVEJyk7XG4gICAgICogLy8gPT4gJ0ZyZWQnXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHJpbmcpIHtcbiAgICAgIHJldHVybiB1cHBlckZpcnN0KHRvU3RyaW5nKHN0cmluZykudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVidXJycyBgc3RyaW5nYCBieSBjb252ZXJ0aW5nXG4gICAgICogW0xhdGluLTEgU3VwcGxlbWVudF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW4tMV9TdXBwbGVtZW50XyhVbmljb2RlX2Jsb2NrKSNDaGFyYWN0ZXJfdGFibGUpXG4gICAgICogYW5kIFtMYXRpbiBFeHRlbmRlZC1BXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MYXRpbl9FeHRlbmRlZC1BKVxuICAgICAqIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycyBhbmQgcmVtb3ZpbmdcbiAgICAgKiBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3MpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGRlYnVyci5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBkZWJ1cnJlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVidXJyKCdkw6lqw6AgdnUnKTtcbiAgICAgKiAvLyA9PiAnZGVqYSB2dSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWJ1cnIoc3RyaW5nKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcmV0dXJuIHN0cmluZyAmJiBzdHJpbmcucmVwbGFjZShyZUxhdGluLCBkZWJ1cnJMZXR0ZXIpLnJlcGxhY2UocmVDb21ib01hcmssICcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHN0cmluZ2AgZW5kcyB3aXRoIHRoZSBnaXZlbiB0YXJnZXQgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt0YXJnZXRdIFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3Bvc2l0aW9uPXN0cmluZy5sZW5ndGhdIFRoZSBwb3NpdGlvbiB0byBzZWFyY2ggdXAgdG8uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBzdHJpbmdgIGVuZHMgd2l0aCBgdGFyZ2V0YCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmVuZHNXaXRoKCdhYmMnLCAnYycpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZW5kc1dpdGgoJ2FiYycsICdiJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uZW5kc1dpdGgoJ2FiYycsICdiJywgMik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVuZHNXaXRoKHN0cmluZywgdGFyZ2V0LCBwb3NpdGlvbikge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHRhcmdldCA9IGJhc2VUb1N0cmluZyh0YXJnZXQpO1xuXG4gICAgICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gPT09IHVuZGVmaW5lZFxuICAgICAgICA/IGxlbmd0aFxuICAgICAgICA6IGJhc2VDbGFtcCh0b0ludGVnZXIocG9zaXRpb24pLCAwLCBsZW5ndGgpO1xuXG4gICAgICB2YXIgZW5kID0gcG9zaXRpb247XG4gICAgICBwb3NpdGlvbiAtPSB0YXJnZXQubGVuZ3RoO1xuICAgICAgcmV0dXJuIHBvc2l0aW9uID49IDAgJiYgc3RyaW5nLnNsaWNlKHBvc2l0aW9uLCBlbmQpID09IHRhcmdldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgY2hhcmFjdGVycyBcIiZcIiwgXCI8XCIsIFwiPlwiLCAnXCInLCBhbmQgXCInXCIgaW4gYHN0cmluZ2AgdG8gdGhlaXJcbiAgICAgKiBjb3JyZXNwb25kaW5nIEhUTUwgZW50aXRpZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm8gb3RoZXIgY2hhcmFjdGVycyBhcmUgZXNjYXBlZC4gVG8gZXNjYXBlIGFkZGl0aW9uYWxcbiAgICAgKiBjaGFyYWN0ZXJzIHVzZSBhIHRoaXJkLXBhcnR5IGxpYnJhcnkgbGlrZSBbX2hlX10oaHR0cHM6Ly9tdGhzLmJlL2hlKS5cbiAgICAgKlxuICAgICAqIFRob3VnaCB0aGUgXCI+XCIgY2hhcmFjdGVyIGlzIGVzY2FwZWQgZm9yIHN5bW1ldHJ5LCBjaGFyYWN0ZXJzIGxpa2VcbiAgICAgKiBcIj5cIiBhbmQgXCIvXCIgZG9uJ3QgbmVlZCBlc2NhcGluZyBpbiBIVE1MIGFuZCBoYXZlIG5vIHNwZWNpYWwgbWVhbmluZ1xuICAgICAqIHVubGVzcyB0aGV5J3JlIHBhcnQgb2YgYSB0YWcgb3IgdW5xdW90ZWQgYXR0cmlidXRlIHZhbHVlLiBTZWVcbiAgICAgKiBbTWF0aGlhcyBCeW5lbnMncyBhcnRpY2xlXShodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvYW1iaWd1b3VzLWFtcGVyc2FuZHMpXG4gICAgICogKHVuZGVyIFwic2VtaS1yZWxhdGVkIGZ1biBmYWN0XCIpIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBXaGVuIHdvcmtpbmcgd2l0aCBIVE1MIHlvdSBzaG91bGQgYWx3YXlzXG4gICAgICogW3F1b3RlIGF0dHJpYnV0ZSB2YWx1ZXNdKGh0dHA6Ly93b25rby5jb20vcG9zdC9odG1sLWVzY2FwaW5nKSB0byByZWR1Y2VcbiAgICAgKiBYU1MgdmVjdG9ycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBlc2NhcGUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZXNjYXBlKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycpO1xuICAgICAqIC8vID0+ICdmcmVkLCBiYXJuZXksICZhbXA7IHBlYmJsZXMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXNjYXBlKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHJldHVybiAoc3RyaW5nICYmIHJlSGFzVW5lc2NhcGVkSHRtbC50ZXN0KHN0cmluZykpXG4gICAgICAgID8gc3RyaW5nLnJlcGxhY2UocmVVbmVzY2FwZWRIdG1sLCBlc2NhcGVIdG1sQ2hhcilcbiAgICAgICAgOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXNjYXBlcyB0aGUgYFJlZ0V4cGAgc3BlY2lhbCBjaGFyYWN0ZXJzIFwiXlwiLCBcIiRcIiwgXCJcXFwiLCBcIi5cIiwgXCIqXCIsIFwiK1wiLFxuICAgICAqIFwiP1wiLCBcIihcIiwgXCIpXCIsIFwiW1wiLCBcIl1cIiwgXCJ7XCIsIFwifVwiLCBhbmQgXCJ8XCIgaW4gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gZXNjYXBlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmVzY2FwZVJlZ0V4cCgnW2xvZGFzaF0oaHR0cHM6Ly9sb2Rhc2guY29tLyknKTtcbiAgICAgKiAvLyA9PiAnXFxbbG9kYXNoXFxdXFwoaHR0cHM6Ly9sb2Rhc2hcXC5jb20vXFwpJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gKHN0cmluZyAmJiByZUhhc1JlZ0V4cENoYXIudGVzdChzdHJpbmcpKVxuICAgICAgICA/IHN0cmluZy5yZXBsYWNlKHJlUmVnRXhwQ2hhciwgJ1xcXFwkJicpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvXG4gICAgICogW2tlYmFiIGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xldHRlcl9jYXNlI1NwZWNpYWxfY2FzZV9zdHlsZXMpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUga2ViYWIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmtlYmFiQ2FzZSgnRm9vIEJhcicpO1xuICAgICAqIC8vID0+ICdmb28tYmFyJ1xuICAgICAqXG4gICAgICogXy5rZWJhYkNhc2UoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdmb28tYmFyJ1xuICAgICAqXG4gICAgICogXy5rZWJhYkNhc2UoJ19fRk9PX0JBUl9fJyk7XG4gICAgICogLy8gPT4gJ2Zvby1iYXInXG4gICAgICovXG4gICAgdmFyIGtlYmFiQ2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/ICctJyA6ICcnKSArIHdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBzcGFjZSBzZXBhcmF0ZWQgd29yZHMsIHRvIGxvd2VyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBsb3dlciBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubG93ZXJDYXNlKCctLUZvby1CYXItLScpO1xuICAgICAqIC8vID0+ICdmb28gYmFyJ1xuICAgICAqXG4gICAgICogXy5sb3dlckNhc2UoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdmb28gYmFyJ1xuICAgICAqXG4gICAgICogXy5sb3dlckNhc2UoJ19fRk9PX0JBUl9fJyk7XG4gICAgICogLy8gPT4gJ2ZvbyBiYXInXG4gICAgICovXG4gICAgdmFyIGxvd2VyQ2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/ICcgJyA6ICcnKSArIHdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AgdG8gbG93ZXIgY2FzZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubG93ZXJGaXJzdCgnRnJlZCcpO1xuICAgICAqIC8vID0+ICdmcmVkJ1xuICAgICAqXG4gICAgICogXy5sb3dlckZpcnN0KCdGUkVEJyk7XG4gICAgICogLy8gPT4gJ2ZSRUQnXG4gICAgICovXG4gICAgdmFyIGxvd2VyRmlyc3QgPSBjcmVhdGVDYXNlRmlyc3QoJ3RvTG93ZXJDYXNlJyk7XG5cbiAgICAvKipcbiAgICAgKiBQYWRzIGBzdHJpbmdgIG9uIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlcyBpZiBpdCdzIHNob3J0ZXIgdGhhbiBgbGVuZ3RoYC5cbiAgICAgKiBQYWRkaW5nIGNoYXJhY3RlcnMgYXJlIHRydW5jYXRlZCBpZiB0aGV5IGNhbid0IGJlIGV2ZW5seSBkaXZpZGVkIGJ5IGBsZW5ndGhgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHBhZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD0wXSBUaGUgcGFkZGluZyBsZW5ndGguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz0nICddIFRoZSBzdHJpbmcgdXNlZCBhcyBwYWRkaW5nLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHBhZGRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucGFkKCdhYmMnLCA4KTtcbiAgICAgKiAvLyA9PiAnICBhYmMgICAnXG4gICAgICpcbiAgICAgKiBfLnBhZCgnYWJjJywgOCwgJ18tJyk7XG4gICAgICogLy8gPT4gJ18tYWJjXy1fJ1xuICAgICAqXG4gICAgICogXy5wYWQoJ2FiYycsIDMpO1xuICAgICAqIC8vID0+ICdhYmMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFkKHN0cmluZywgbGVuZ3RoLCBjaGFycykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGxlbmd0aCA9IHRvSW50ZWdlcihsZW5ndGgpO1xuXG4gICAgICB2YXIgc3RyTGVuZ3RoID0gbGVuZ3RoID8gc3RyaW5nU2l6ZShzdHJpbmcpIDogMDtcbiAgICAgIGlmICghbGVuZ3RoIHx8IHN0ckxlbmd0aCA+PSBsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBtaWQgPSAobGVuZ3RoIC0gc3RyTGVuZ3RoKSAvIDI7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjcmVhdGVQYWRkaW5nKG5hdGl2ZUZsb29yKG1pZCksIGNoYXJzKSArXG4gICAgICAgIHN0cmluZyArXG4gICAgICAgIGNyZWF0ZVBhZGRpbmcobmF0aXZlQ2VpbChtaWQpLCBjaGFycylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFkcyBgc3RyaW5nYCBvbiB0aGUgcmlnaHQgc2lkZSBpZiBpdCdzIHNob3J0ZXIgdGhhbiBgbGVuZ3RoYC4gUGFkZGluZ1xuICAgICAqIGNoYXJhY3RlcnMgYXJlIHRydW5jYXRlZCBpZiB0aGV5IGV4Y2VlZCBgbGVuZ3RoYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBwYWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MF0gVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhZEVuZCgnYWJjJywgNik7XG4gICAgICogLy8gPT4gJ2FiYyAgICdcbiAgICAgKlxuICAgICAqIF8ucGFkRW5kKCdhYmMnLCA2LCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnYWJjXy1fJ1xuICAgICAqXG4gICAgICogXy5wYWRFbmQoJ2FiYycsIDMpO1xuICAgICAqIC8vID0+ICdhYmMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFkRW5kKHN0cmluZywgbGVuZ3RoLCBjaGFycykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGxlbmd0aCA9IHRvSW50ZWdlcihsZW5ndGgpO1xuXG4gICAgICB2YXIgc3RyTGVuZ3RoID0gbGVuZ3RoID8gc3RyaW5nU2l6ZShzdHJpbmcpIDogMDtcbiAgICAgIHJldHVybiAobGVuZ3RoICYmIHN0ckxlbmd0aCA8IGxlbmd0aClcbiAgICAgICAgPyAoc3RyaW5nICsgY3JlYXRlUGFkZGluZyhsZW5ndGggLSBzdHJMZW5ndGgsIGNoYXJzKSlcbiAgICAgICAgOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFkcyBgc3RyaW5nYCBvbiB0aGUgbGVmdCBzaWRlIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLiBQYWRkaW5nXG4gICAgICogY2hhcmFjdGVycyBhcmUgdHJ1bmNhdGVkIGlmIHRoZXkgZXhjZWVkIGBsZW5ndGhgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHBhZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD0wXSBUaGUgcGFkZGluZyBsZW5ndGguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz0nICddIFRoZSBzdHJpbmcgdXNlZCBhcyBwYWRkaW5nLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHBhZGRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucGFkU3RhcnQoJ2FiYycsIDYpO1xuICAgICAqIC8vID0+ICcgICBhYmMnXG4gICAgICpcbiAgICAgKiBfLnBhZFN0YXJ0KCdhYmMnLCA2LCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnXy1fYWJjJ1xuICAgICAqXG4gICAgICogXy5wYWRTdGFydCgnYWJjJywgMyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYWRTdGFydChzdHJpbmcsIGxlbmd0aCwgY2hhcnMpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBsZW5ndGggPSB0b0ludGVnZXIobGVuZ3RoKTtcblxuICAgICAgdmFyIHN0ckxlbmd0aCA9IGxlbmd0aCA/IHN0cmluZ1NpemUoc3RyaW5nKSA6IDA7XG4gICAgICByZXR1cm4gKGxlbmd0aCAmJiBzdHJMZW5ndGggPCBsZW5ndGgpXG4gICAgICAgID8gKGNyZWF0ZVBhZGRpbmcobGVuZ3RoIC0gc3RyTGVuZ3RoLCBjaGFycykgKyBzdHJpbmcpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGFuIGludGVnZXIgb2YgdGhlIHNwZWNpZmllZCByYWRpeC4gSWYgYHJhZGl4YCBpc1xuICAgICAqIGB1bmRlZmluZWRgIG9yIGAwYCwgYSBgcmFkaXhgIG9mIGAxMGAgaXMgdXNlZCB1bmxlc3MgYHZhbHVlYCBpcyBhXG4gICAgICogaGV4YWRlY2ltYWwsIGluIHdoaWNoIGNhc2UgYSBgcmFkaXhgIG9mIGAxNmAgaXMgdXNlZC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBhbGlnbnMgd2l0aCB0aGVcbiAgICAgKiBbRVM1IGltcGxlbWVudGF0aW9uXShodHRwczovL2VzNS5naXRodWIuaW8vI3gxNS4xLjIuMikgb2YgYHBhcnNlSW50YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl4PTEwXSBUaGUgcmFkaXggdG8gaW50ZXJwcmV0IGB2YWx1ZWAgYnkuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYXJzZUludCgnMDgnKTtcbiAgICAgKiAvLyA9PiA4XG4gICAgICpcbiAgICAgKiBfLm1hcChbJzYnLCAnMDgnLCAnMTAnXSwgXy5wYXJzZUludCk7XG4gICAgICogLy8gPT4gWzYsIDgsIDEwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhcnNlSW50KHN0cmluZywgcmFkaXgsIGd1YXJkKSB7XG4gICAgICBpZiAoZ3VhcmQgfHwgcmFkaXggPT0gbnVsbCkge1xuICAgICAgICByYWRpeCA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHJhZGl4KSB7XG4gICAgICAgIHJhZGl4ID0gK3JhZGl4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5hdGl2ZVBhcnNlSW50KHRvU3RyaW5nKHN0cmluZykucmVwbGFjZShyZVRyaW1TdGFydCwgJycpLCByYWRpeCB8fCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXBlYXRzIHRoZSBnaXZlbiBzdHJpbmcgYG5gIHRpbWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHJlcGVhdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHN0cmluZy5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJlcGVhdGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yZXBlYXQoJyonLCAzKTtcbiAgICAgKiAvLyA9PiAnKioqJ1xuICAgICAqXG4gICAgICogXy5yZXBlYXQoJ2FiYycsIDIpO1xuICAgICAqIC8vID0+ICdhYmNhYmMnXG4gICAgICpcbiAgICAgKiBfLnJlcGVhdCgnYWJjJywgMCk7XG4gICAgICogLy8gPT4gJydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXBlYXQoc3RyaW5nLCBuLCBndWFyZCkge1xuICAgICAgaWYgKChndWFyZCA/IGlzSXRlcmF0ZWVDYWxsKHN0cmluZywgbiwgZ3VhcmQpIDogbiA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICBuID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVJlcGVhdCh0b1N0cmluZyhzdHJpbmcpLCBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlcyBtYXRjaGVzIGZvciBgcGF0dGVybmAgaW4gYHN0cmluZ2Agd2l0aCBgcmVwbGFjZW1lbnRgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BTdHJpbmcjcmVwbGFjZWBdKGh0dHBzOi8vbWRuLmlvL1N0cmluZy9yZXBsYWNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBwYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIHJlcGxhY2UuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IHJlcGxhY2VtZW50IFRoZSBtYXRjaCByZXBsYWNlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBtb2RpZmllZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmVwbGFjZSgnSGkgRnJlZCcsICdGcmVkJywgJ0Jhcm5leScpO1xuICAgICAqIC8vID0+ICdIaSBCYXJuZXknXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwbGFjZSgpIHtcbiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgIHN0cmluZyA9IHRvU3RyaW5nKGFyZ3NbMF0pO1xuXG4gICAgICByZXR1cm4gYXJncy5sZW5ndGggPCAzID8gc3RyaW5nIDogc3RyaW5nLnJlcGxhY2UoYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG9cbiAgICAgKiBbc25ha2UgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU25ha2VfY2FzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzbmFrZSBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc25ha2VDYXNlKCdGb28gQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvb19iYXInXG4gICAgICpcbiAgICAgKiBfLnNuYWtlQ2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvb19iYXInXG4gICAgICpcbiAgICAgKiBfLnNuYWtlQ2FzZSgnLS1GT08tQkFSLS0nKTtcbiAgICAgKiAvLyA9PiAnZm9vX2JhcidcbiAgICAgKi9cbiAgICB2YXIgc25ha2VDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJ18nIDogJycpICsgd29yZC50b0xvd2VyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogU3BsaXRzIGBzdHJpbmdgIGJ5IGBzZXBhcmF0b3JgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BTdHJpbmcjc3BsaXRgXShodHRwczovL21kbi5pby9TdHJpbmcvc3BsaXQpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHNwbGl0LlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gc2VwYXJhdG9yIFRoZSBzZXBhcmF0b3IgcGF0dGVybiB0byBzcGxpdCBieS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xpbWl0XSBUaGUgbGVuZ3RoIHRvIHRydW5jYXRlIHJlc3VsdHMgdG8uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzdHJpbmcgc2VnbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc3BsaXQoJ2EtYi1jJywgJy0nLCAyKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYiddXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3BsaXQoc3RyaW5nLCBzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICBpZiAobGltaXQgJiYgdHlwZW9mIGxpbWl0ICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKHN0cmluZywgc2VwYXJhdG9yLCBsaW1pdCkpIHtcbiAgICAgICAgc2VwYXJhdG9yID0gbGltaXQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBsaW1pdCA9IGxpbWl0ID09PSB1bmRlZmluZWQgPyBNQVhfQVJSQVlfTEVOR1RIIDogbGltaXQgPj4+IDA7XG4gICAgICBpZiAoIWxpbWl0KSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBpZiAoc3RyaW5nICYmIChcbiAgICAgICAgICAgIHR5cGVvZiBzZXBhcmF0b3IgPT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIChzZXBhcmF0b3IgIT0gbnVsbCAmJiAhaXNSZWdFeHAoc2VwYXJhdG9yKSlcbiAgICAgICAgICApKSB7XG4gICAgICAgIHNlcGFyYXRvciA9IGJhc2VUb1N0cmluZyhzZXBhcmF0b3IpO1xuICAgICAgICBpZiAoIXNlcGFyYXRvciAmJiBoYXNVbmljb2RlKHN0cmluZykpIHtcbiAgICAgICAgICByZXR1cm4gY2FzdFNsaWNlKHN0cmluZ1RvQXJyYXkoc3RyaW5nKSwgMCwgbGltaXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyaW5nLnNwbGl0KHNlcGFyYXRvciwgbGltaXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvXG4gICAgICogW3N0YXJ0IGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xldHRlcl9jYXNlI1N0eWxpc3RpY19vcl9zcGVjaWFsaXNlZF91c2FnZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzdGFydCBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc3RhcnRDYXNlKCctLWZvby1iYXItLScpO1xuICAgICAqIC8vID0+ICdGb28gQmFyJ1xuICAgICAqXG4gICAgICogXy5zdGFydENhc2UoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdGb28gQmFyJ1xuICAgICAqXG4gICAgICogXy5zdGFydENhc2UoJ19fRk9PX0JBUl9fJyk7XG4gICAgICogLy8gPT4gJ0ZPTyBCQVInXG4gICAgICovXG4gICAgdmFyIHN0YXJ0Q2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/ICcgJyA6ICcnKSArIHVwcGVyRmlyc3Qod29yZCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHN0cmluZ2Agc3RhcnRzIHdpdGggdGhlIGdpdmVuIHRhcmdldCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3RhcmdldF0gVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcG9zaXRpb249MF0gVGhlIHBvc2l0aW9uIHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgc3RyaW5nYCBzdGFydHMgd2l0aCBgdGFyZ2V0YCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0c1dpdGgoJ2FiYycsICdhJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5zdGFydHNXaXRoKCdhYmMnLCAnYicpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0c1dpdGgoJ2FiYycsICdiJywgMSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyaW5nLCB0YXJnZXQsIHBvc2l0aW9uKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiA9PSBudWxsXG4gICAgICAgID8gMFxuICAgICAgICA6IGJhc2VDbGFtcCh0b0ludGVnZXIocG9zaXRpb24pLCAwLCBzdHJpbmcubGVuZ3RoKTtcblxuICAgICAgdGFyZ2V0ID0gYmFzZVRvU3RyaW5nKHRhcmdldCk7XG4gICAgICByZXR1cm4gc3RyaW5nLnNsaWNlKHBvc2l0aW9uLCBwb3NpdGlvbiArIHRhcmdldC5sZW5ndGgpID09IHRhcmdldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY29tcGlsZWQgdGVtcGxhdGUgZnVuY3Rpb24gdGhhdCBjYW4gaW50ZXJwb2xhdGUgZGF0YSBwcm9wZXJ0aWVzXG4gICAgICogaW4gXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlcnMsIEhUTUwtZXNjYXBlIGludGVycG9sYXRlZCBkYXRhIHByb3BlcnRpZXMgaW5cbiAgICAgKiBcImVzY2FwZVwiIGRlbGltaXRlcnMsIGFuZCBleGVjdXRlIEphdmFTY3JpcHQgaW4gXCJldmFsdWF0ZVwiIGRlbGltaXRlcnMuIERhdGFcbiAgICAgKiBwcm9wZXJ0aWVzIG1heSBiZSBhY2Nlc3NlZCBhcyBmcmVlIHZhcmlhYmxlcyBpbiB0aGUgdGVtcGxhdGUuIElmIGEgc2V0dGluZ1xuICAgICAqIG9iamVjdCBpcyBnaXZlbiwgaXQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGBfLnRlbXBsYXRlU2V0dGluZ3NgIHZhbHVlcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBJbiB0aGUgZGV2ZWxvcG1lbnQgYnVpbGQgYF8udGVtcGxhdGVgIHV0aWxpemVzXG4gICAgICogW3NvdXJjZVVSTHNdKGh0dHA6Ly93d3cuaHRtbDVyb2Nrcy5jb20vZW4vdHV0b3JpYWxzL2RldmVsb3BlcnRvb2xzL3NvdXJjZW1hcHMvI3RvYy1zb3VyY2V1cmwpXG4gICAgICogZm9yIGVhc2llciBkZWJ1Z2dpbmcuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBwcmVjb21waWxpbmcgdGVtcGxhdGVzIHNlZVxuICAgICAqIFtsb2Rhc2gncyBjdXN0b20gYnVpbGRzIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vbG9kYXNoLmNvbS9jdXN0b20tYnVpbGRzKS5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIENocm9tZSBleHRlbnNpb24gc2FuZGJveGVzIHNlZVxuICAgICAqIFtDaHJvbWUncyBleHRlbnNpb25zIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vZXh0ZW5zaW9ucy9zYW5kYm94aW5nRXZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSB0ZW1wbGF0ZSBzdHJpbmcuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IFtvcHRpb25zLmVzY2FwZT1fLnRlbXBsYXRlU2V0dGluZ3MuZXNjYXBlXVxuICAgICAqICBUaGUgSFRNTCBcImVzY2FwZVwiIGRlbGltaXRlci5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cH0gW29wdGlvbnMuZXZhbHVhdGU9Xy50ZW1wbGF0ZVNldHRpbmdzLmV2YWx1YXRlXVxuICAgICAqICBUaGUgXCJldmFsdWF0ZVwiIGRlbGltaXRlci5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuaW1wb3J0cz1fLnRlbXBsYXRlU2V0dGluZ3MuaW1wb3J0c11cbiAgICAgKiAgQW4gb2JqZWN0IHRvIGltcG9ydCBpbnRvIHRoZSB0ZW1wbGF0ZSBhcyBmcmVlIHZhcmlhYmxlcy5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cH0gW29wdGlvbnMuaW50ZXJwb2xhdGU9Xy50ZW1wbGF0ZVNldHRpbmdzLmludGVycG9sYXRlXVxuICAgICAqICBUaGUgXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuc291cmNlVVJMPSdsb2Rhc2gudGVtcGxhdGVTb3VyY2VzW25dJ11cbiAgICAgKiAgVGhlIHNvdXJjZVVSTCBvZiB0aGUgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnZhcmlhYmxlPSdvYmonXVxuICAgICAqICBUaGUgZGF0YSBvYmplY3QgdmFyaWFibGUgbmFtZS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgY29tcGlsZWQgdGVtcGxhdGUgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlciB0byBjcmVhdGUgYSBjb21waWxlZCB0ZW1wbGF0ZS5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyA8JT0gdXNlciAlPiEnKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2VyJzogJ2ZyZWQnIH0pO1xuICAgICAqIC8vID0+ICdoZWxsbyBmcmVkISdcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgSFRNTCBcImVzY2FwZVwiIGRlbGltaXRlciB0byBlc2NhcGUgZGF0YSBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPGI+PCUtIHZhbHVlICU+PC9iPicpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3ZhbHVlJzogJzxzY3JpcHQ+JyB9KTtcbiAgICAgKiAvLyA9PiAnPGI+Jmx0O3NjcmlwdCZndDs8L2I+J1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBcImV2YWx1YXRlXCIgZGVsaW1pdGVyIHRvIGV4ZWN1dGUgSmF2YVNjcmlwdCBhbmQgZ2VuZXJhdGUgSFRNTC5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCc8JSBfLmZvckVhY2godXNlcnMsIGZ1bmN0aW9uKHVzZXIpIHsgJT48bGk+PCUtIHVzZXIgJT48L2xpPjwlIH0pOyAlPicpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXJzJzogWydmcmVkJywgJ2Jhcm5leSddIH0pO1xuICAgICAqIC8vID0+ICc8bGk+ZnJlZDwvbGk+PGxpPmJhcm5leTwvbGk+J1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBpbnRlcm5hbCBgcHJpbnRgIGZ1bmN0aW9uIGluIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXJzLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzwlIHByaW50KFwiaGVsbG8gXCIgKyB1c2VyKTsgJT4hJyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcic6ICdiYXJuZXknIH0pO1xuICAgICAqIC8vID0+ICdoZWxsbyBiYXJuZXkhJ1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBFUyB0ZW1wbGF0ZSBsaXRlcmFsIGRlbGltaXRlciBhcyBhbiBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyLlxuICAgICAqIC8vIERpc2FibGUgc3VwcG9ydCBieSByZXBsYWNpbmcgdGhlIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8gJHsgdXNlciB9IScpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAncGViYmxlcycgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIHBlYmJsZXMhJ1xuICAgICAqXG4gICAgICogLy8gVXNlIGJhY2tzbGFzaGVzIHRvIHRyZWF0IGRlbGltaXRlcnMgYXMgcGxhaW4gdGV4dC5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCc8JT0gXCJcXFxcPCUtIHZhbHVlICVcXFxcPlwiICU+Jyk7XG4gICAgICogY29tcGlsZWQoeyAndmFsdWUnOiAnaWdub3JlZCcgfSk7XG4gICAgICogLy8gPT4gJzwlLSB2YWx1ZSAlPidcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgYGltcG9ydHNgIG9wdGlvbiB0byBpbXBvcnQgYGpRdWVyeWAgYXMgYGpxYC5cbiAgICAgKiB2YXIgdGV4dCA9ICc8JSBqcS5lYWNoKHVzZXJzLCBmdW5jdGlvbih1c2VyKSB7ICU+PGxpPjwlLSB1c2VyICU+PC9saT48JSB9KTsgJT4nO1xuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUodGV4dCwgeyAnaW1wb3J0cyc6IHsgJ2pxJzogalF1ZXJ5IH0gfSk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcnMnOiBbJ2ZyZWQnLCAnYmFybmV5J10gfSk7XG4gICAgICogLy8gPT4gJzxsaT5mcmVkPC9saT48bGk+YmFybmV5PC9saT4nXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGBzb3VyY2VVUkxgIG9wdGlvbiB0byBzcGVjaWZ5IGEgY3VzdG9tIHNvdXJjZVVSTCBmb3IgdGhlIHRlbXBsYXRlLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIDwlPSB1c2VyICU+IScsIHsgJ3NvdXJjZVVSTCc6ICcvYmFzaWMvZ3JlZXRpbmcuanN0JyB9KTtcbiAgICAgKiBjb21waWxlZChkYXRhKTtcbiAgICAgKiAvLyA9PiBGaW5kIHRoZSBzb3VyY2Ugb2YgXCJncmVldGluZy5qc3RcIiB1bmRlciB0aGUgU291cmNlcyB0YWIgb3IgUmVzb3VyY2VzIHBhbmVsIG9mIHRoZSB3ZWIgaW5zcGVjdG9yLlxuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBgdmFyaWFibGVgIG9wdGlvbiB0byBlbnN1cmUgYSB3aXRoLXN0YXRlbWVudCBpc24ndCB1c2VkIGluIHRoZSBjb21waWxlZCB0ZW1wbGF0ZS5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoaSA8JT0gZGF0YS51c2VyICU+IScsIHsgJ3ZhcmlhYmxlJzogJ2RhdGEnIH0pO1xuICAgICAqIGNvbXBpbGVkLnNvdXJjZTtcbiAgICAgKiAvLyA9PiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICogLy8gICB2YXIgX190LCBfX3AgPSAnJztcbiAgICAgKiAvLyAgIF9fcCArPSAnaGkgJyArICgoX190ID0gKCBkYXRhLnVzZXIgKSkgPT0gbnVsbCA/ICcnIDogX190KSArICchJztcbiAgICAgKiAvLyAgIHJldHVybiBfX3A7XG4gICAgICogLy8gfVxuICAgICAqXG4gICAgICogLy8gVXNlIGN1c3RvbSB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLlxuICAgICAqIF8udGVtcGxhdGVTZXR0aW5ncy5pbnRlcnBvbGF0ZSA9IC97eyhbXFxzXFxTXSs/KX19L2c7XG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8ge3sgdXNlciB9fSEnKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2VyJzogJ211c3RhY2hlJyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gbXVzdGFjaGUhJ1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBgc291cmNlYCBwcm9wZXJ0eSB0byBpbmxpbmUgY29tcGlsZWQgdGVtcGxhdGVzIGZvciBtZWFuaW5nZnVsXG4gICAgICogLy8gbGluZSBudW1iZXJzIGluIGVycm9yIG1lc3NhZ2VzIGFuZCBzdGFjayB0cmFjZXMuXG4gICAgICogZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2pzdC5qcycpLCAnXFxcbiAgICAgKiAgIHZhciBKU1QgPSB7XFxcbiAgICAgKiAgICAgXCJtYWluXCI6ICcgKyBfLnRlbXBsYXRlKG1haW5UZXh0KS5zb3VyY2UgKyAnXFxcbiAgICAgKiAgIH07XFxcbiAgICAgKiAnKTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0ZW1wbGF0ZShzdHJpbmcsIG9wdGlvbnMsIGd1YXJkKSB7XG4gICAgICAvLyBCYXNlZCBvbiBKb2huIFJlc2lnJ3MgYHRtcGxgIGltcGxlbWVudGF0aW9uXG4gICAgICAvLyAoaHR0cDovL2Vqb2huLm9yZy9ibG9nL2phdmFzY3JpcHQtbWljcm8tdGVtcGxhdGluZy8pXG4gICAgICAvLyBhbmQgTGF1cmEgRG9rdG9yb3ZhJ3MgZG9ULmpzIChodHRwczovL2dpdGh1Yi5jb20vb2xhZG8vZG9UKS5cbiAgICAgIHZhciBzZXR0aW5ncyA9IGxvZGFzaC50ZW1wbGF0ZVNldHRpbmdzO1xuXG4gICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc3RyaW5nLCBvcHRpb25zLCBndWFyZCkpIHtcbiAgICAgICAgb3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBvcHRpb25zID0gYXNzaWduSW5XaXRoKHt9LCBvcHRpb25zLCBzZXR0aW5ncywgY3VzdG9tRGVmYXVsdHNBc3NpZ25Jbik7XG5cbiAgICAgIHZhciBpbXBvcnRzID0gYXNzaWduSW5XaXRoKHt9LCBvcHRpb25zLmltcG9ydHMsIHNldHRpbmdzLmltcG9ydHMsIGN1c3RvbURlZmF1bHRzQXNzaWduSW4pLFxuICAgICAgICAgIGltcG9ydHNLZXlzID0ga2V5cyhpbXBvcnRzKSxcbiAgICAgICAgICBpbXBvcnRzVmFsdWVzID0gYmFzZVZhbHVlcyhpbXBvcnRzLCBpbXBvcnRzS2V5cyk7XG5cbiAgICAgIHZhciBpc0VzY2FwaW5nLFxuICAgICAgICAgIGlzRXZhbHVhdGluZyxcbiAgICAgICAgICBpbmRleCA9IDAsXG4gICAgICAgICAgaW50ZXJwb2xhdGUgPSBvcHRpb25zLmludGVycG9sYXRlIHx8IHJlTm9NYXRjaCxcbiAgICAgICAgICBzb3VyY2UgPSBcIl9fcCArPSAnXCI7XG5cbiAgICAgIC8vIENvbXBpbGUgdGhlIHJlZ2V4cCB0byBtYXRjaCBlYWNoIGRlbGltaXRlci5cbiAgICAgIHZhciByZURlbGltaXRlcnMgPSBSZWdFeHAoXG4gICAgICAgIChvcHRpb25zLmVzY2FwZSB8fCByZU5vTWF0Y2gpLnNvdXJjZSArICd8JyArXG4gICAgICAgIGludGVycG9sYXRlLnNvdXJjZSArICd8JyArXG4gICAgICAgIChpbnRlcnBvbGF0ZSA9PT0gcmVJbnRlcnBvbGF0ZSA/IHJlRXNUZW1wbGF0ZSA6IHJlTm9NYXRjaCkuc291cmNlICsgJ3wnICtcbiAgICAgICAgKG9wdGlvbnMuZXZhbHVhdGUgfHwgcmVOb01hdGNoKS5zb3VyY2UgKyAnfCQnXG4gICAgICAsICdnJyk7XG5cbiAgICAgIC8vIFVzZSBhIHNvdXJjZVVSTCBmb3IgZWFzaWVyIGRlYnVnZ2luZy5cbiAgICAgIC8vIFRoZSBzb3VyY2VVUkwgZ2V0cyBpbmplY3RlZCBpbnRvIHRoZSBzb3VyY2UgdGhhdCdzIGV2YWwtZWQsIHNvIGJlIGNhcmVmdWxcbiAgICAgIC8vIHRvIG5vcm1hbGl6ZSBhbGwga2luZHMgb2Ygd2hpdGVzcGFjZSwgc28gZS5nLiBuZXdsaW5lcyAoYW5kIHVuaWNvZGUgdmVyc2lvbnMgb2YgaXQpIGNhbid0IHNuZWFrIGluXG4gICAgICAvLyBhbmQgZXNjYXBlIHRoZSBjb21tZW50LCB0aHVzIGluamVjdGluZyBjb2RlIHRoYXQgZ2V0cyBldmFsZWQuXG4gICAgICB2YXIgc291cmNlVVJMID0gJy8vIyBzb3VyY2VVUkw9JyArXG4gICAgICAgIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMsICdzb3VyY2VVUkwnKVxuICAgICAgICAgID8gKG9wdGlvbnMuc291cmNlVVJMICsgJycpLnJlcGxhY2UoL1xccy9nLCAnICcpXG4gICAgICAgICAgOiAoJ2xvZGFzaC50ZW1wbGF0ZVNvdXJjZXNbJyArICgrK3RlbXBsYXRlQ291bnRlcikgKyAnXScpXG4gICAgICAgICkgKyAnXFxuJztcblxuICAgICAgc3RyaW5nLnJlcGxhY2UocmVEZWxpbWl0ZXJzLCBmdW5jdGlvbihtYXRjaCwgZXNjYXBlVmFsdWUsIGludGVycG9sYXRlVmFsdWUsIGVzVGVtcGxhdGVWYWx1ZSwgZXZhbHVhdGVWYWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIGludGVycG9sYXRlVmFsdWUgfHwgKGludGVycG9sYXRlVmFsdWUgPSBlc1RlbXBsYXRlVmFsdWUpO1xuXG4gICAgICAgIC8vIEVzY2FwZSBjaGFyYWN0ZXJzIHRoYXQgY2FuJ3QgYmUgaW5jbHVkZWQgaW4gc3RyaW5nIGxpdGVyYWxzLlxuICAgICAgICBzb3VyY2UgKz0gc3RyaW5nLnNsaWNlKGluZGV4LCBvZmZzZXQpLnJlcGxhY2UocmVVbmVzY2FwZWRTdHJpbmcsIGVzY2FwZVN0cmluZ0NoYXIpO1xuXG4gICAgICAgIC8vIFJlcGxhY2UgZGVsaW1pdGVycyB3aXRoIHNuaXBwZXRzLlxuICAgICAgICBpZiAoZXNjYXBlVmFsdWUpIHtcbiAgICAgICAgICBpc0VzY2FwaW5nID0gdHJ1ZTtcbiAgICAgICAgICBzb3VyY2UgKz0gXCInICtcXG5fX2UoXCIgKyBlc2NhcGVWYWx1ZSArIFwiKSArXFxuJ1wiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmFsdWF0ZVZhbHVlKSB7XG4gICAgICAgICAgaXNFdmFsdWF0aW5nID0gdHJ1ZTtcbiAgICAgICAgICBzb3VyY2UgKz0gXCInO1xcblwiICsgZXZhbHVhdGVWYWx1ZSArIFwiO1xcbl9fcCArPSAnXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludGVycG9sYXRlVmFsdWUpIHtcbiAgICAgICAgICBzb3VyY2UgKz0gXCInICtcXG4oKF9fdCA9IChcIiArIGludGVycG9sYXRlVmFsdWUgKyBcIikpID09IG51bGwgPyAnJyA6IF9fdCkgK1xcbidcIjtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IG9mZnNldCArIG1hdGNoLmxlbmd0aDtcblxuICAgICAgICAvLyBUaGUgSlMgZW5naW5lIGVtYmVkZGVkIGluIEFkb2JlIHByb2R1Y3RzIG5lZWRzIGBtYXRjaGAgcmV0dXJuZWQgaW5cbiAgICAgICAgLy8gb3JkZXIgdG8gcHJvZHVjZSB0aGUgY29ycmVjdCBgb2Zmc2V0YCB2YWx1ZS5cbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgfSk7XG5cbiAgICAgIHNvdXJjZSArPSBcIic7XFxuXCI7XG5cbiAgICAgIC8vIElmIGB2YXJpYWJsZWAgaXMgbm90IHNwZWNpZmllZCB3cmFwIGEgd2l0aC1zdGF0ZW1lbnQgYXJvdW5kIHRoZSBnZW5lcmF0ZWRcbiAgICAgIC8vIGNvZGUgdG8gYWRkIHRoZSBkYXRhIG9iamVjdCB0byB0aGUgdG9wIG9mIHRoZSBzY29wZSBjaGFpbi5cbiAgICAgIHZhciB2YXJpYWJsZSA9IGhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgJ3ZhcmlhYmxlJykgJiYgb3B0aW9ucy52YXJpYWJsZTtcbiAgICAgIGlmICghdmFyaWFibGUpIHtcbiAgICAgICAgc291cmNlID0gJ3dpdGggKG9iaikge1xcbicgKyBzb3VyY2UgKyAnXFxufVxcbic7XG4gICAgICB9XG4gICAgICAvLyBUaHJvdyBhbiBlcnJvciBpZiBhIGZvcmJpZGRlbiBjaGFyYWN0ZXIgd2FzIGZvdW5kIGluIGB2YXJpYWJsZWAsIHRvIHByZXZlbnRcbiAgICAgIC8vIHBvdGVudGlhbCBjb21tYW5kIGluamVjdGlvbiBhdHRhY2tzLlxuICAgICAgZWxzZSBpZiAocmVGb3JiaWRkZW5JZGVudGlmaWVyQ2hhcnMudGVzdCh2YXJpYWJsZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKElOVkFMSURfVEVNUExfVkFSX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGVhbnVwIGNvZGUgYnkgc3RyaXBwaW5nIGVtcHR5IHN0cmluZ3MuXG4gICAgICBzb3VyY2UgPSAoaXNFdmFsdWF0aW5nID8gc291cmNlLnJlcGxhY2UocmVFbXB0eVN0cmluZ0xlYWRpbmcsICcnKSA6IHNvdXJjZSlcbiAgICAgICAgLnJlcGxhY2UocmVFbXB0eVN0cmluZ01pZGRsZSwgJyQxJylcbiAgICAgICAgLnJlcGxhY2UocmVFbXB0eVN0cmluZ1RyYWlsaW5nLCAnJDE7Jyk7XG5cbiAgICAgIC8vIEZyYW1lIGNvZGUgYXMgdGhlIGZ1bmN0aW9uIGJvZHkuXG4gICAgICBzb3VyY2UgPSAnZnVuY3Rpb24oJyArICh2YXJpYWJsZSB8fCAnb2JqJykgKyAnKSB7XFxuJyArXG4gICAgICAgICh2YXJpYWJsZVxuICAgICAgICAgID8gJydcbiAgICAgICAgICA6ICdvYmogfHwgKG9iaiA9IHt9KTtcXG4nXG4gICAgICAgICkgK1xuICAgICAgICBcInZhciBfX3QsIF9fcCA9ICcnXCIgK1xuICAgICAgICAoaXNFc2NhcGluZ1xuICAgICAgICAgICA/ICcsIF9fZSA9IF8uZXNjYXBlJ1xuICAgICAgICAgICA6ICcnXG4gICAgICAgICkgK1xuICAgICAgICAoaXNFdmFsdWF0aW5nXG4gICAgICAgICAgPyAnLCBfX2ogPSBBcnJheS5wcm90b3R5cGUuam9pbjtcXG4nICtcbiAgICAgICAgICAgIFwiZnVuY3Rpb24gcHJpbnQoKSB7IF9fcCArPSBfX2ouY2FsbChhcmd1bWVudHMsICcnKSB9XFxuXCJcbiAgICAgICAgICA6ICc7XFxuJ1xuICAgICAgICApICtcbiAgICAgICAgc291cmNlICtcbiAgICAgICAgJ3JldHVybiBfX3BcXG59JztcblxuICAgICAgdmFyIHJlc3VsdCA9IGF0dGVtcHQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbihpbXBvcnRzS2V5cywgc291cmNlVVJMICsgJ3JldHVybiAnICsgc291cmNlKVxuICAgICAgICAgIC5hcHBseSh1bmRlZmluZWQsIGltcG9ydHNWYWx1ZXMpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFByb3ZpZGUgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uJ3Mgc291cmNlIGJ5IGl0cyBgdG9TdHJpbmdgIG1ldGhvZCBvclxuICAgICAgLy8gdGhlIGBzb3VyY2VgIHByb3BlcnR5IGFzIGEgY29udmVuaWVuY2UgZm9yIGlubGluaW5nIGNvbXBpbGVkIHRlbXBsYXRlcy5cbiAgICAgIHJlc3VsdC5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICBpZiAoaXNFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AsIGFzIGEgd2hvbGUsIHRvIGxvd2VyIGNhc2UganVzdCBsaWtlXG4gICAgICogW1N0cmluZyN0b0xvd2VyQ2FzZV0oaHR0cHM6Ly9tZG4uaW8vdG9Mb3dlckNhc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbG93ZXIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvTG93ZXIoJy0tRm9vLUJhci0tJyk7XG4gICAgICogLy8gPT4gJy0tZm9vLWJhci0tJ1xuICAgICAqXG4gICAgICogXy50b0xvd2VyKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vYmFyJ1xuICAgICAqXG4gICAgICogXy50b0xvd2VyKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdfX2Zvb19iYXJfXydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0xvd2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdG9TdHJpbmcodmFsdWUpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AsIGFzIGEgd2hvbGUsIHRvIHVwcGVyIGNhc2UganVzdCBsaWtlXG4gICAgICogW1N0cmluZyN0b1VwcGVyQ2FzZV0oaHR0cHM6Ly9tZG4uaW8vdG9VcHBlckNhc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdXBwZXIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvVXBwZXIoJy0tZm9vLWJhci0tJyk7XG4gICAgICogLy8gPT4gJy0tRk9PLUJBUi0tJ1xuICAgICAqXG4gICAgICogXy50b1VwcGVyKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnRk9PQkFSJ1xuICAgICAqXG4gICAgICogXy50b1VwcGVyKCdfX2Zvb19iYXJfXycpO1xuICAgICAqIC8vID0+ICdfX0ZPT19CQVJfXydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1VwcGVyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdG9TdHJpbmcodmFsdWUpLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIG9yIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGZyb20gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPXdoaXRlc3BhY2VdIFRoZSBjaGFyYWN0ZXJzIHRvIHRyaW0uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmltKCcgIGFiYyAgJyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKlxuICAgICAqIF8udHJpbSgnLV8tYWJjLV8tJywgJ18tJyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnICBmb28gICcsICcgIGJhciAgJ10sIF8udHJpbSk7XG4gICAgICogLy8gPT4gWydmb28nLCAnYmFyJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmltKHN0cmluZywgY2hhcnMsIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoZ3VhcmQgfHwgY2hhcnMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VUcmltKHN0cmluZyk7XG4gICAgICB9XG4gICAgICBpZiAoIXN0cmluZyB8fCAhKGNoYXJzID0gYmFzZVRvU3RyaW5nKGNoYXJzKSkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBzdHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShzdHJpbmcpLFxuICAgICAgICAgIGNoclN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KGNoYXJzKSxcbiAgICAgICAgICBzdGFydCA9IGNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLCBjaHJTeW1ib2xzKSxcbiAgICAgICAgICBlbmQgPSBjaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpICsgMTtcblxuICAgICAgcmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLCBzdGFydCwgZW5kKS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRyYWlsaW5nIHdoaXRlc3BhY2Ugb3Igc3BlY2lmaWVkIGNoYXJhY3RlcnMgZnJvbSBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byB0cmltLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9d2hpdGVzcGFjZV0gVGhlIGNoYXJhY3RlcnMgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRyaW1FbmQoJyAgYWJjICAnKTtcbiAgICAgKiAvLyA9PiAnICBhYmMnXG4gICAgICpcbiAgICAgKiBfLnRyaW1FbmQoJy1fLWFiYy1fLScsICdfLScpO1xuICAgICAqIC8vID0+ICctXy1hYmMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJpbUVuZChzdHJpbmcsIGNoYXJzLCBndWFyZCkge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGlmIChzdHJpbmcgJiYgKGd1YXJkIHx8IGNoYXJzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmcuc2xpY2UoMCwgdHJpbW1lZEVuZEluZGV4KHN0cmluZykgKyAxKTtcbiAgICAgIH1cbiAgICAgIGlmICghc3RyaW5nIHx8ICEoY2hhcnMgPSBiYXNlVG9TdHJpbmcoY2hhcnMpKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyksXG4gICAgICAgICAgZW5kID0gY2hhcnNFbmRJbmRleChzdHJTeW1ib2xzLCBzdHJpbmdUb0FycmF5KGNoYXJzKSkgKyAxO1xuXG4gICAgICByZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsIDAsIGVuZCkuam9pbignJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBsZWFkaW5nIHdoaXRlc3BhY2Ugb3Igc3BlY2lmaWVkIGNoYXJhY3RlcnMgZnJvbSBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byB0cmltLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9d2hpdGVzcGFjZV0gVGhlIGNoYXJhY3RlcnMgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRyaW1TdGFydCgnICBhYmMgICcpO1xuICAgICAqIC8vID0+ICdhYmMgICdcbiAgICAgKlxuICAgICAqIF8udHJpbVN0YXJ0KCctXy1hYmMtXy0nLCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnYWJjLV8tJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyaW1TdGFydChzdHJpbmcsIGNoYXJzLCBndWFyZCkge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGlmIChzdHJpbmcgJiYgKGd1YXJkIHx8IGNoYXJzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShyZVRyaW1TdGFydCwgJycpO1xuICAgICAgfVxuICAgICAgaWYgKCFzdHJpbmcgfHwgIShjaGFycyA9IGJhc2VUb1N0cmluZyhjaGFycykpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKSxcbiAgICAgICAgICBzdGFydCA9IGNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLCBzdHJpbmdUb0FycmF5KGNoYXJzKSk7XG5cbiAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scywgc3RhcnQpLmpvaW4oJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRydW5jYXRlcyBgc3RyaW5nYCBpZiBpdCdzIGxvbmdlciB0aGFuIHRoZSBnaXZlbiBtYXhpbXVtIHN0cmluZyBsZW5ndGguXG4gICAgICogVGhlIGxhc3QgY2hhcmFjdGVycyBvZiB0aGUgdHJ1bmNhdGVkIHN0cmluZyBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgb21pc3Npb25cbiAgICAgKiBzdHJpbmcgd2hpY2ggZGVmYXVsdHMgdG8gXCIuLi5cIi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byB0cnVuY2F0ZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubGVuZ3RoPTMwXSBUaGUgbWF4aW11bSBzdHJpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5vbWlzc2lvbj0nLi4uJ10gVGhlIHN0cmluZyB0byBpbmRpY2F0ZSB0ZXh0IGlzIG9taXR0ZWQuXG4gICAgICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBbb3B0aW9ucy5zZXBhcmF0b3JdIFRoZSBzZXBhcmF0b3IgcGF0dGVybiB0byB0cnVuY2F0ZSB0by5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cnVuY2F0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRydW5jYXRlKCdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm9yaW5vJyk7XG4gICAgICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hiby4uLidcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nLCB7XG4gICAgICogICAnbGVuZ3RoJzogMjQsXG4gICAgICogICAnc2VwYXJhdG9yJzogJyAnXG4gICAgICogfSk7XG4gICAgICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZSwuLi4nXG4gICAgICpcbiAgICAgKiBfLnRydW5jYXRlKCdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm9yaW5vJywge1xuICAgICAqICAgJ2xlbmd0aCc6IDI0LFxuICAgICAqICAgJ3NlcGFyYXRvcic6IC8sPyArL1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUuLi4nXG4gICAgICpcbiAgICAgKiBfLnRydW5jYXRlKCdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm9yaW5vJywge1xuICAgICAqICAgJ29taXNzaW9uJzogJyBbLi4uXSdcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnIFsuLi5dJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRydW5jYXRlKHN0cmluZywgb3B0aW9ucykge1xuICAgICAgdmFyIGxlbmd0aCA9IERFRkFVTFRfVFJVTkNfTEVOR1RILFxuICAgICAgICAgIG9taXNzaW9uID0gREVGQVVMVF9UUlVOQ19PTUlTU0lPTjtcblxuICAgICAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICAgIHZhciBzZXBhcmF0b3IgPSAnc2VwYXJhdG9yJyBpbiBvcHRpb25zID8gb3B0aW9ucy5zZXBhcmF0b3IgOiBzZXBhcmF0b3I7XG4gICAgICAgIGxlbmd0aCA9ICdsZW5ndGgnIGluIG9wdGlvbnMgPyB0b0ludGVnZXIob3B0aW9ucy5sZW5ndGgpIDogbGVuZ3RoO1xuICAgICAgICBvbWlzc2lvbiA9ICdvbWlzc2lvbicgaW4gb3B0aW9ucyA/IGJhc2VUb1N0cmluZyhvcHRpb25zLm9taXNzaW9uKSA6IG9taXNzaW9uO1xuICAgICAgfVxuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcblxuICAgICAgdmFyIHN0ckxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gICAgICBpZiAoaGFzVW5pY29kZShzdHJpbmcpKSB7XG4gICAgICAgIHZhciBzdHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShzdHJpbmcpO1xuICAgICAgICBzdHJMZW5ndGggPSBzdHJTeW1ib2xzLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGlmIChsZW5ndGggPj0gc3RyTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgZW5kID0gbGVuZ3RoIC0gc3RyaW5nU2l6ZShvbWlzc2lvbik7XG4gICAgICBpZiAoZW5kIDwgMSkge1xuICAgICAgICByZXR1cm4gb21pc3Npb247XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gc3RyU3ltYm9sc1xuICAgICAgICA/IGNhc3RTbGljZShzdHJTeW1ib2xzLCAwLCBlbmQpLmpvaW4oJycpXG4gICAgICAgIDogc3RyaW5nLnNsaWNlKDAsIGVuZCk7XG5cbiAgICAgIGlmIChzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0ICsgb21pc3Npb247XG4gICAgICB9XG4gICAgICBpZiAoc3RyU3ltYm9scykge1xuICAgICAgICBlbmQgKz0gKHJlc3VsdC5sZW5ndGggLSBlbmQpO1xuICAgICAgfVxuICAgICAgaWYgKGlzUmVnRXhwKHNlcGFyYXRvcikpIHtcbiAgICAgICAgaWYgKHN0cmluZy5zbGljZShlbmQpLnNlYXJjaChzZXBhcmF0b3IpKSB7XG4gICAgICAgICAgdmFyIG1hdGNoLFxuICAgICAgICAgICAgICBzdWJzdHJpbmcgPSByZXN1bHQ7XG5cbiAgICAgICAgICBpZiAoIXNlcGFyYXRvci5nbG9iYWwpIHtcbiAgICAgICAgICAgIHNlcGFyYXRvciA9IFJlZ0V4cChzZXBhcmF0b3Iuc291cmNlLCB0b1N0cmluZyhyZUZsYWdzLmV4ZWMoc2VwYXJhdG9yKSkgKyAnZycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXBhcmF0b3IubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICB3aGlsZSAoKG1hdGNoID0gc2VwYXJhdG9yLmV4ZWMoc3Vic3RyaW5nKSkpIHtcbiAgICAgICAgICAgIHZhciBuZXdFbmQgPSBtYXRjaC5pbmRleDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIG5ld0VuZCA9PT0gdW5kZWZpbmVkID8gZW5kIDogbmV3RW5kKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzdHJpbmcuaW5kZXhPZihiYXNlVG9TdHJpbmcoc2VwYXJhdG9yKSwgZW5kKSAhPSBlbmQpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gcmVzdWx0Lmxhc3RJbmRleE9mKHNlcGFyYXRvcik7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdCArIG9taXNzaW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBpbnZlcnNlIG9mIGBfLmVzY2FwZWA7IHRoaXMgbWV0aG9kIGNvbnZlcnRzIHRoZSBIVE1MIGVudGl0aWVzXG4gICAgICogYCZhbXA7YCwgYCZsdDtgLCBgJmd0O2AsIGAmcXVvdDtgLCBhbmQgYCYjMzk7YCBpbiBgc3RyaW5nYCB0b1xuICAgICAqIHRoZWlyIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVycy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBObyBvdGhlciBIVE1MIGVudGl0aWVzIGFyZSB1bmVzY2FwZWQuIFRvIHVuZXNjYXBlIGFkZGl0aW9uYWxcbiAgICAgKiBIVE1MIGVudGl0aWVzIHVzZSBhIHRoaXJkLXBhcnR5IGxpYnJhcnkgbGlrZSBbX2hlX10oaHR0cHM6Ly9tdGhzLmJlL2hlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjYuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byB1bmVzY2FwZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1bmVzY2FwZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuZXNjYXBlKCdmcmVkLCBiYXJuZXksICZhbXA7IHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiAnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5lc2NhcGUoc3RyaW5nKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcmV0dXJuIChzdHJpbmcgJiYgcmVIYXNFc2NhcGVkSHRtbC50ZXN0KHN0cmluZykpXG4gICAgICAgID8gc3RyaW5nLnJlcGxhY2UocmVFc2NhcGVkSHRtbCwgdW5lc2NhcGVIdG1sQ2hhcilcbiAgICAgICAgOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AsIGFzIHNwYWNlIHNlcGFyYXRlZCB3b3JkcywgdG8gdXBwZXIgY2FzZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVwcGVyIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51cHBlckNhc2UoJy0tZm9vLWJhcicpO1xuICAgICAqIC8vID0+ICdGT08gQkFSJ1xuICAgICAqXG4gICAgICogXy51cHBlckNhc2UoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdGT08gQkFSJ1xuICAgICAqXG4gICAgICogXy51cHBlckNhc2UoJ19fZm9vX2Jhcl9fJyk7XG4gICAgICogLy8gPT4gJ0ZPTyBCQVInXG4gICAgICovXG4gICAgdmFyIHVwcGVyQ2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/ICcgJyA6ICcnKSArIHdvcmQudG9VcHBlckNhc2UoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AgdG8gdXBwZXIgY2FzZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udXBwZXJGaXJzdCgnZnJlZCcpO1xuICAgICAqIC8vID0+ICdGcmVkJ1xuICAgICAqXG4gICAgICogXy51cHBlckZpcnN0KCdGUkVEJyk7XG4gICAgICogLy8gPT4gJ0ZSRUQnXG4gICAgICovXG4gICAgdmFyIHVwcGVyRmlyc3QgPSBjcmVhdGVDYXNlRmlyc3QoJ3RvVXBwZXJDYXNlJyk7XG5cbiAgICAvKipcbiAgICAgKiBTcGxpdHMgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IFtwYXR0ZXJuXSBUaGUgcGF0dGVybiB0byBtYXRjaCB3b3Jkcy5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd29yZHMgb2YgYHN0cmluZ2AuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ud29yZHMoJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJyk7XG4gICAgICogLy8gPT4gWydmcmVkJywgJ2Jhcm5leScsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIF8ud29yZHMoJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJywgL1teLCBdKy9nKTtcbiAgICAgKiAvLyA9PiBbJ2ZyZWQnLCAnYmFybmV5JywgJyYnLCAncGViYmxlcyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gd29yZHMoc3RyaW5nLCBwYXR0ZXJuLCBndWFyZCkge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHBhdHRlcm4gPSBndWFyZCA/IHVuZGVmaW5lZCA6IHBhdHRlcm47XG5cbiAgICAgIGlmIChwYXR0ZXJuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGhhc1VuaWNvZGVXb3JkKHN0cmluZykgPyB1bmljb2RlV29yZHMoc3RyaW5nKSA6IGFzY2lpV29yZHMoc3RyaW5nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmcubWF0Y2gocGF0dGVybikgfHwgW107XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQXR0ZW1wdHMgdG8gaW52b2tlIGBmdW5jYCwgcmV0dXJuaW5nIGVpdGhlciB0aGUgcmVzdWx0IG9yIHRoZSBjYXVnaHQgZXJyb3JcbiAgICAgKiBvYmplY3QuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gYGZ1bmNgIHdoZW4gaXQncyBpbnZva2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhdHRlbXB0LlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGBmdW5jYCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBgZnVuY2AgcmVzdWx0IG9yIGVycm9yIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gQXZvaWQgdGhyb3dpbmcgZXJyb3JzIGZvciBpbnZhbGlkIHNlbGVjdG9ycy5cbiAgICAgKiB2YXIgZWxlbWVudHMgPSBfLmF0dGVtcHQoZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgICAgKiAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICAgKiB9LCAnPl8+Jyk7XG4gICAgICpcbiAgICAgKiBpZiAoXy5pc0Vycm9yKGVsZW1lbnRzKSkge1xuICAgICAqICAgZWxlbWVudHMgPSBbXTtcbiAgICAgKiB9XG4gICAgICovXG4gICAgdmFyIGF0dGVtcHQgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCBhcmdzKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXBwbHkoZnVuYywgdW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGlzRXJyb3IoZSkgPyBlIDogbmV3IEVycm9yKGUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQmluZHMgbWV0aG9kcyBvZiBhbiBvYmplY3QgdG8gdGhlIG9iamVjdCBpdHNlbGYsIG92ZXJ3cml0aW5nIHRoZSBleGlzdGluZ1xuICAgICAqIG1ldGhvZC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBib3VuZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBiaW5kIGFuZCBhc3NpZ24gdGhlIGJvdW5kIG1ldGhvZHMgdG8uXG4gICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gbWV0aG9kTmFtZXMgVGhlIG9iamVjdCBtZXRob2QgbmFtZXMgdG8gYmluZC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdmlldyA9IHtcbiAgICAgKiAgICdsYWJlbCc6ICdkb2NzJyxcbiAgICAgKiAgICdjbGljayc6IGZ1bmN0aW9uKCkge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnY2xpY2tlZCAnICsgdGhpcy5sYWJlbCk7XG4gICAgICogICB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8uYmluZEFsbCh2aWV3LCBbJ2NsaWNrJ10pO1xuICAgICAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCB2aWV3LmNsaWNrKTtcbiAgICAgKiAvLyA9PiBMb2dzICdjbGlja2VkIGRvY3MnIHdoZW4gY2xpY2tlZC5cbiAgICAgKi9cbiAgICB2YXIgYmluZEFsbCA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgbWV0aG9kTmFtZXMpIHtcbiAgICAgIGFycmF5RWFjaChtZXRob2ROYW1lcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGtleSA9IHRvS2V5KGtleSk7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgYmluZChvYmplY3Rba2V5XSwgb2JqZWN0KSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpdGVyYXRlcyBvdmVyIGBwYWlyc2AgYW5kIGludm9rZXMgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICAgKiBmdW5jdGlvbiBvZiB0aGUgZmlyc3QgcHJlZGljYXRlIHRvIHJldHVybiB0cnV0aHkuIFRoZSBwcmVkaWNhdGUtZnVuY3Rpb25cbiAgICAgKiBwYWlycyBhcmUgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzIG9mIHRoZSBjcmVhdGVkXG4gICAgICogZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhaXJzIFRoZSBwcmVkaWNhdGUtZnVuY3Rpb24gcGFpcnMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG9zaXRlIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8uY29uZChbXG4gICAgICogICBbXy5tYXRjaGVzKHsgJ2EnOiAxIH0pLCAgICAgICAgICAgXy5jb25zdGFudCgnbWF0Y2hlcyBBJyldLFxuICAgICAqICAgW18uY29uZm9ybXMoeyAnYic6IF8uaXNOdW1iZXIgfSksIF8uY29uc3RhbnQoJ21hdGNoZXMgQicpXSxcbiAgICAgKiAgIFtfLnN0dWJUcnVlLCAgICAgICAgICAgICAgICAgICAgICBfLmNvbnN0YW50KCdubyBtYXRjaCcpXVxuICAgICAqIF0pO1xuICAgICAqXG4gICAgICogZnVuYyh7ICdhJzogMSwgJ2InOiAyIH0pO1xuICAgICAqIC8vID0+ICdtYXRjaGVzIEEnXG4gICAgICpcbiAgICAgKiBmdW5jKHsgJ2EnOiAwLCAnYic6IDEgfSk7XG4gICAgICogLy8gPT4gJ21hdGNoZXMgQidcbiAgICAgKlxuICAgICAqIGZ1bmMoeyAnYSc6ICcxJywgJ2InOiAnMicgfSk7XG4gICAgICogLy8gPT4gJ25vIG1hdGNoJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmQocGFpcnMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBwYWlycyA9PSBudWxsID8gMCA6IHBhaXJzLmxlbmd0aCxcbiAgICAgICAgICB0b0l0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoKTtcblxuICAgICAgcGFpcnMgPSAhbGVuZ3RoID8gW10gOiBhcnJheU1hcChwYWlycywgZnVuY3Rpb24ocGFpcikge1xuICAgICAgICBpZiAodHlwZW9mIHBhaXJbMV0gIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3RvSXRlcmF0ZWUocGFpclswXSksIHBhaXJbMV1dO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIHZhciBwYWlyID0gcGFpcnNbaW5kZXhdO1xuICAgICAgICAgIGlmIChhcHBseShwYWlyWzBdLCB0aGlzLCBhcmdzKSkge1xuICAgICAgICAgICAgcmV0dXJuIGFwcGx5KHBhaXJbMV0sIHRoaXMsIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0aGUgcHJlZGljYXRlIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgd2l0aFxuICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5IHZhbHVlcyBvZiBhIGdpdmVuIG9iamVjdCwgcmV0dXJuaW5nIGB0cnVlYCBpZlxuICAgICAqIGFsbCBwcmVkaWNhdGVzIHJldHVybiB0cnV0aHksIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGUgY3JlYXRlZCBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGBfLmNvbmZvcm1zVG9gIHdpdGhcbiAgICAgKiBgc291cmNlYCBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiAyLCAnYic6IDEgfSxcbiAgICAgKiAgIHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihvYmplY3RzLCBfLmNvbmZvcm1zKHsgJ2InOiBmdW5jdGlvbihuKSB7IHJldHVybiBuID4gMTsgfSB9KSk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiAxLCAnYic6IDIgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25mb3Jtcyhzb3VyY2UpIHtcbiAgICAgIHJldHVybiBiYXNlQ29uZm9ybXMoYmFzZUNsb25lKHNvdXJjZSwgQ0xPTkVfREVFUF9GTEFHKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZXR1cm4gZnJvbSB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbnN0YW50IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IF8udGltZXMoMiwgXy5jb25zdGFudCh7ICdhJzogMSB9KSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzKTtcbiAgICAgKiAvLyA9PiBbeyAnYSc6IDEgfSwgeyAnYSc6IDEgfV1cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdHNbMF0gPT09IG9iamVjdHNbMV0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25zdGFudCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBgdmFsdWVgIHRvIGRldGVybWluZSB3aGV0aGVyIGEgZGVmYXVsdCB2YWx1ZSBzaG91bGQgYmUgcmV0dXJuZWQgaW5cbiAgICAgKiBpdHMgcGxhY2UuIFRoZSBgZGVmYXVsdFZhbHVlYCBpcyByZXR1cm5lZCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBgbnVsbGAsXG4gICAgICogb3IgYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xNC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0geyp9IGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmYXVsdFRvKDEsIDEwKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiBfLmRlZmF1bHRUbyh1bmRlZmluZWQsIDEwKTtcbiAgICAgKiAvLyA9PiAxMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlZmF1bHRUbyh2YWx1ZSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICByZXR1cm4gKHZhbHVlID09IG51bGwgfHwgdmFsdWUgIT09IHZhbHVlKSA/IGRlZmF1bHRWYWx1ZSA6IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnZva2luZyB0aGUgZ2l2ZW4gZnVuY3Rpb25zXG4gICAgICogd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24sIHdoZXJlIGVhY2ggc3VjY2Vzc2l2ZVxuICAgICAqIGludm9jYXRpb24gaXMgc3VwcGxpZWQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJldmlvdXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbZnVuY3NdIFRoZSBmdW5jdGlvbnMgdG8gaW52b2tlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvc2l0ZSBmdW5jdGlvbi5cbiAgICAgKiBAc2VlIF8uZmxvd1JpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGFkZFNxdWFyZSA9IF8uZmxvdyhbXy5hZGQsIHNxdWFyZV0pO1xuICAgICAqIGFkZFNxdWFyZSgxLCAyKTtcbiAgICAgKiAvLyA9PiA5XG4gICAgICovXG4gICAgdmFyIGZsb3cgPSBjcmVhdGVGbG93KCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZsb3dgIGV4Y2VwdCB0aGF0IGl0IGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0XG4gICAgICogaW52b2tlcyB0aGUgZ2l2ZW4gZnVuY3Rpb25zIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtmdW5jc10gVGhlIGZ1bmN0aW9ucyB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG9zaXRlIGZ1bmN0aW9uLlxuICAgICAqIEBzZWUgXy5mbG93XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGFkZFNxdWFyZSA9IF8uZmxvd1JpZ2h0KFtzcXVhcmUsIF8uYWRkXSk7XG4gICAgICogYWRkU3F1YXJlKDEsIDIpO1xuICAgICAqIC8vID0+IDlcbiAgICAgKi9cbiAgICB2YXIgZmxvd1JpZ2h0ID0gY3JlYXRlRmxvdyh0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50IGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIEFueSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyBgdmFsdWVgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKF8uaWRlbnRpdHkob2JqZWN0KSA9PT0gb2JqZWN0KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWRcbiAgICAgKiBmdW5jdGlvbi4gSWYgYGZ1bmNgIGlzIGEgcHJvcGVydHkgbmFtZSwgdGhlIGNyZWF0ZWQgZnVuY3Rpb24gcmV0dXJucyB0aGVcbiAgICAgKiBwcm9wZXJ0eSB2YWx1ZSBmb3IgYSBnaXZlbiBlbGVtZW50LiBJZiBgZnVuY2AgaXMgYW4gYXJyYXkgb3Igb2JqZWN0LCB0aGVcbiAgICAgKiBjcmVhdGVkIGZ1bmN0aW9uIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGNvbnRhaW4gdGhlIGVxdWl2YWxlbnRcbiAgICAgKiBzb3VyY2UgcHJvcGVydGllcywgb3RoZXJ3aXNlIGl0IHJldHVybnMgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSBbZnVuYz1fLmlkZW50aXR5XSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhIGNhbGxiYWNrLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgY2FsbGJhY2suXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maWx0ZXIodXNlcnMsIF8uaXRlcmF0ZWUoeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogdHJ1ZSB9KSk7XG4gICAgICogLy8gPT4gW3sgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9XVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCBfLml0ZXJhdGVlKFsndXNlcicsICdmcmVkJ10pKTtcbiAgICAgKiAvLyA9PiBbeyAndXNlcic6ICdmcmVkJywgJ2FnZSc6IDQwIH1dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1hcCh1c2VycywgXy5pdGVyYXRlZSgndXNlcicpKTtcbiAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIENyZWF0ZSBjdXN0b20gaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKiBfLml0ZXJhdGVlID0gXy53cmFwKF8uaXRlcmF0ZWUsIGZ1bmN0aW9uKGl0ZXJhdGVlLCBmdW5jKSB7XG4gICAgICogICByZXR1cm4gIV8uaXNSZWdFeHAoZnVuYykgPyBpdGVyYXRlZShmdW5jKSA6IGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAqICAgICByZXR1cm4gZnVuYy50ZXN0KHN0cmluZyk7XG4gICAgICogICB9O1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogXy5maWx0ZXIoWydhYmMnLCAnZGVmJ10sIC9lZi8pO1xuICAgICAqIC8vID0+IFsnZGVmJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpdGVyYXRlZShmdW5jKSB7XG4gICAgICByZXR1cm4gYmFzZUl0ZXJhdGVlKHR5cGVvZiBmdW5jID09ICdmdW5jdGlvbicgPyBmdW5jIDogYmFzZUNsb25lKGZ1bmMsIENMT05FX0RFRVBfRkxBRykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgcGFydGlhbCBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiBhIGdpdmVuXG4gICAgICogb2JqZWN0IGFuZCBgc291cmNlYCwgcmV0dXJuaW5nIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGhhcyBlcXVpdmFsZW50XG4gICAgICogcHJvcGVydHkgdmFsdWVzLCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhlIGNyZWF0ZWQgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBgXy5pc01hdGNoYCB3aXRoIGBzb3VyY2VgXG4gICAgICogcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBQYXJ0aWFsIGNvbXBhcmlzb25zIHdpbGwgbWF0Y2ggZW1wdHkgYXJyYXkgYW5kIGVtcHR5IG9iamVjdCBgc291cmNlYFxuICAgICAqIHZhbHVlcyBhZ2FpbnN0IGFueSBhcnJheSBvciBvYmplY3QgdmFsdWUsIHJlc3BlY3RpdmVseS4gU2VlIGBfLmlzRXF1YWxgXG4gICAgICogZm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgdmFsdWUgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTXVsdGlwbGUgdmFsdWVzIGNhbiBiZSBjaGVja2VkIGJ5IGNvbWJpbmluZyBzZXZlcmFsIG1hdGNoZXJzXG4gICAgICogdXNpbmcgYF8ub3ZlclNvbWVgXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICogICB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSxcbiAgICAgKiAgIHsgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKG9iamVjdHMsIF8ubWF0Y2hlcyh7ICdhJzogNCwgJ2MnOiA2IH0pKTtcbiAgICAgKiAvLyA9PiBbeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1dXG4gICAgICpcbiAgICAgKiAvLyBDaGVja2luZyBmb3Igc2V2ZXJhbCBwb3NzaWJsZSB2YWx1ZXNcbiAgICAgKiBfLmZpbHRlcihvYmplY3RzLCBfLm92ZXJTb21lKFtfLm1hdGNoZXMoeyAnYSc6IDEgfSksIF8ubWF0Y2hlcyh7ICdhJzogNCB9KV0pKTtcbiAgICAgKiAvLyA9PiBbeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH0sIHsgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hdGNoZXMoc291cmNlKSB7XG4gICAgICByZXR1cm4gYmFzZU1hdGNoZXMoYmFzZUNsb25lKHNvdXJjZSwgQ0xPTkVfREVFUF9GTEFHKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZVxuICAgICAqIHZhbHVlIGF0IGBwYXRoYCBvZiBhIGdpdmVuIG9iamVjdCB0byBgc3JjVmFsdWVgLCByZXR1cm5pbmcgYHRydWVgIGlmIHRoZVxuICAgICAqIG9iamVjdCB2YWx1ZSBpcyBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogUGFydGlhbCBjb21wYXJpc29ucyB3aWxsIG1hdGNoIGVtcHR5IGFycmF5IGFuZCBlbXB0eSBvYmplY3RcbiAgICAgKiBgc3JjVmFsdWVgIHZhbHVlcyBhZ2FpbnN0IGFueSBhcnJheSBvciBvYmplY3QgdmFsdWUsIHJlc3BlY3RpdmVseS4gU2VlXG4gICAgICogYF8uaXNFcXVhbGAgZm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgdmFsdWUgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTXVsdGlwbGUgdmFsdWVzIGNhbiBiZSBjaGVja2VkIGJ5IGNvbWJpbmluZyBzZXZlcmFsIG1hdGNoZXJzXG4gICAgICogdXNpbmcgYF8ub3ZlclNvbWVgXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICogICB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSxcbiAgICAgKiAgIHsgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZChvYmplY3RzLCBfLm1hdGNoZXNQcm9wZXJ0eSgnYScsIDQpKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfVxuICAgICAqXG4gICAgICogLy8gQ2hlY2tpbmcgZm9yIHNldmVyYWwgcG9zc2libGUgdmFsdWVzXG4gICAgICogXy5maWx0ZXIob2JqZWN0cywgXy5vdmVyU29tZShbXy5tYXRjaGVzUHJvcGVydHkoJ2EnLCAxKSwgXy5tYXRjaGVzUHJvcGVydHkoJ2EnLCA0KV0pKTtcbiAgICAgKiAvLyA9PiBbeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH0sIHsgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hdGNoZXNQcm9wZXJ0eShwYXRoLCBzcmNWYWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VNYXRjaGVzUHJvcGVydHkocGF0aCwgYmFzZUNsb25lKHNyY1ZhbHVlLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBtZXRob2QgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0LlxuICAgICAqIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgaW52b2tlciBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICogICB7ICdhJzogeyAnYic6IF8uY29uc3RhbnQoMikgfSB9LFxuICAgICAqICAgeyAnYSc6IHsgJ2InOiBfLmNvbnN0YW50KDEpIH0gfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLm1hcChvYmplY3RzLCBfLm1ldGhvZCgnYS5iJykpO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqXG4gICAgICogXy5tYXAob2JqZWN0cywgXy5tZXRob2QoWydhJywgJ2InXSkpO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqL1xuICAgIHZhciBtZXRob2QgPSBiYXNlUmVzdChmdW5jdGlvbihwYXRoLCBhcmdzKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52b2tlKG9iamVjdCwgcGF0aCwgYXJncyk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLm1ldGhvZGA7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXNcbiAgICAgKiB0aGUgbWV0aG9kIGF0IGEgZ2l2ZW4gcGF0aCBvZiBgb2JqZWN0YC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZVxuICAgICAqIHByb3ZpZGVkIHRvIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjcuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZva2VyIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBfLnRpbWVzKDMsIF8uY29uc3RhbnQpLFxuICAgICAqICAgICBvYmplY3QgPSB7ICdhJzogYXJyYXksICdiJzogYXJyYXksICdjJzogYXJyYXkgfTtcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnYVsyXScsICdjWzBdJ10sIF8ubWV0aG9kT2Yob2JqZWN0KSk7XG4gICAgICogLy8gPT4gWzIsIDBdXG4gICAgICpcbiAgICAgKiBfLm1hcChbWydhJywgJzInXSwgWydjJywgJzAnXV0sIF8ubWV0aG9kT2Yob2JqZWN0KSk7XG4gICAgICogLy8gPT4gWzIsIDBdXG4gICAgICovXG4gICAgdmFyIG1ldGhvZE9mID0gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBhcmdzKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ocGF0aCkge1xuICAgICAgICByZXR1cm4gYmFzZUludm9rZShvYmplY3QsIHBhdGgsIGFyZ3MpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYWxsIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBmdW5jdGlvbiBwcm9wZXJ0aWVzIG9mIGEgc291cmNlXG4gICAgICogb2JqZWN0IHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QuIElmIGBvYmplY3RgIGlzIGEgZnVuY3Rpb24sIHRoZW4gbWV0aG9kc1xuICAgICAqIGFyZSBhZGRlZCB0byBpdHMgcHJvdG90eXBlIGFzIHdlbGwuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVXNlIGBfLnJ1bkluQ29udGV4dGAgdG8gY3JlYXRlIGEgcHJpc3RpbmUgYGxvZGFzaGAgZnVuY3Rpb24gdG9cbiAgICAgKiBhdm9pZCBjb25mbGljdHMgY2F1c2VkIGJ5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBbb2JqZWN0PWxvZGFzaF0gVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgZnVuY3Rpb25zIHRvIGFkZC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNoYWluPXRydWVdIFNwZWNpZnkgd2hldGhlciBtaXhpbnMgYXJlIGNoYWluYWJsZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb258T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiB2b3dlbHMoc3RyaW5nKSB7XG4gICAgICogICByZXR1cm4gXy5maWx0ZXIoc3RyaW5nLCBmdW5jdGlvbih2KSB7XG4gICAgICogICAgIHJldHVybiAvW2FlaW91XS9pLnRlc3Qodik7XG4gICAgICogICB9KTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLm1peGluKHsgJ3Zvd2Vscyc6IHZvd2VscyB9KTtcbiAgICAgKiBfLnZvd2VscygnZnJlZCcpO1xuICAgICAqIC8vID0+IFsnZSddXG4gICAgICpcbiAgICAgKiBfKCdmcmVkJykudm93ZWxzKCkudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbJ2UnXVxuICAgICAqXG4gICAgICogXy5taXhpbih7ICd2b3dlbHMnOiB2b3dlbHMgfSwgeyAnY2hhaW4nOiBmYWxzZSB9KTtcbiAgICAgKiBfKCdmcmVkJykudm93ZWxzKCk7XG4gICAgICogLy8gPT4gWydlJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtaXhpbihvYmplY3QsIHNvdXJjZSwgb3B0aW9ucykge1xuICAgICAgdmFyIHByb3BzID0ga2V5cyhzb3VyY2UpLFxuICAgICAgICAgIG1ldGhvZE5hbWVzID0gYmFzZUZ1bmN0aW9ucyhzb3VyY2UsIHByb3BzKTtcblxuICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCAmJlxuICAgICAgICAgICEoaXNPYmplY3Qoc291cmNlKSAmJiAobWV0aG9kTmFtZXMubGVuZ3RoIHx8ICFwcm9wcy5sZW5ndGgpKSkge1xuICAgICAgICBvcHRpb25zID0gc291cmNlO1xuICAgICAgICBzb3VyY2UgPSBvYmplY3Q7XG4gICAgICAgIG9iamVjdCA9IHRoaXM7XG4gICAgICAgIG1ldGhvZE5hbWVzID0gYmFzZUZ1bmN0aW9ucyhzb3VyY2UsIGtleXMoc291cmNlKSk7XG4gICAgICB9XG4gICAgICB2YXIgY2hhaW4gPSAhKGlzT2JqZWN0KG9wdGlvbnMpICYmICdjaGFpbicgaW4gb3B0aW9ucykgfHwgISFvcHRpb25zLmNoYWluLFxuICAgICAgICAgIGlzRnVuYyA9IGlzRnVuY3Rpb24ob2JqZWN0KTtcblxuICAgICAgYXJyYXlFYWNoKG1ldGhvZE5hbWVzLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgICAgIHZhciBmdW5jID0gc291cmNlW21ldGhvZE5hbWVdO1xuICAgICAgICBvYmplY3RbbWV0aG9kTmFtZV0gPSBmdW5jO1xuICAgICAgICBpZiAoaXNGdW5jKSB7XG4gICAgICAgICAgb2JqZWN0LnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGNoYWluQWxsID0gdGhpcy5fX2NoYWluX187XG4gICAgICAgICAgICBpZiAoY2hhaW4gfHwgY2hhaW5BbGwpIHtcbiAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG9iamVjdCh0aGlzLl9fd3JhcHBlZF9fKSxcbiAgICAgICAgICAgICAgICAgIGFjdGlvbnMgPSByZXN1bHQuX19hY3Rpb25zX18gPSBjb3B5QXJyYXkodGhpcy5fX2FjdGlvbnNfXyk7XG5cbiAgICAgICAgICAgICAgYWN0aW9ucy5wdXNoKHsgJ2Z1bmMnOiBmdW5jLCAnYXJncyc6IGFyZ3VtZW50cywgJ3RoaXNBcmcnOiBvYmplY3QgfSk7XG4gICAgICAgICAgICAgIHJlc3VsdC5fX2NoYWluX18gPSBjaGFpbkFsbDtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KG9iamVjdCwgYXJyYXlQdXNoKFt0aGlzLnZhbHVlKCldLCBhcmd1bWVudHMpKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnRzIHRoZSBgX2AgdmFyaWFibGUgdG8gaXRzIHByZXZpb3VzIHZhbHVlIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvXG4gICAgICogdGhlIGBsb2Rhc2hgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGBsb2Rhc2hgIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgbG9kYXNoID0gXy5ub0NvbmZsaWN0KCk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gbm9Db25mbGljdCgpIHtcbiAgICAgIGlmIChyb290Ll8gPT09IHRoaXMpIHtcbiAgICAgICAgcm9vdC5fID0gb2xkRGFzaDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDIsIF8ubm9vcCk7XG4gICAgICogLy8gPT4gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5vb3AoKSB7XG4gICAgICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkLlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGdldHMgdGhlIGFyZ3VtZW50IGF0IGluZGV4IGBuYC4gSWYgYG5gIGlzIG5lZ2F0aXZlLFxuICAgICAqIHRoZSBudGggYXJndW1lbnQgZnJvbSB0aGUgZW5kIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MF0gVGhlIGluZGV4IG9mIHRoZSBhcmd1bWVudCB0byByZXR1cm4uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFzcy10aHJ1IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ubnRoQXJnKDEpO1xuICAgICAqIGZ1bmMoJ2EnLCAnYicsICdjJywgJ2QnKTtcbiAgICAgKiAvLyA9PiAnYidcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5udGhBcmcoLTIpO1xuICAgICAqIGZ1bmMoJ2EnLCAnYicsICdjJywgJ2QnKTtcbiAgICAgKiAvLyA9PiAnYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBudGhBcmcobikge1xuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgIHJldHVybiBiYXNlTnRoKGFyZ3MsIG4pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgaXRlcmF0ZWVzYCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXNcbiAgICAgKiBhbmQgcmV0dXJucyB0aGVpciByZXN1bHRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2l0ZXJhdGVlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBpdGVyYXRlZXMgdG8gaW52b2tlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ub3ZlcihbTWF0aC5tYXgsIE1hdGgubWluXSk7XG4gICAgICpcbiAgICAgKiBmdW5jKDEsIDIsIDMsIDQpO1xuICAgICAqIC8vID0+IFs0LCAxXVxuICAgICAqL1xuICAgIHZhciBvdmVyID0gY3JlYXRlT3ZlcihhcnJheU1hcCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgKiphbGwqKiBvZiB0aGUgYHByZWRpY2F0ZXNgIHJldHVyblxuICAgICAqIHRydXRoeSB3aGVuIGludm9rZWQgd2l0aCB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogRm9sbG93aW5nIHNob3J0aGFuZHMgYXJlIHBvc3NpYmxlIGZvciBwcm92aWRpbmcgcHJlZGljYXRlcy5cbiAgICAgKiBQYXNzIGFuIGBPYmplY3RgIGFuZCBpdCB3aWxsIGJlIHVzZWQgYXMgYW4gcGFyYW1ldGVyIGZvciBgXy5tYXRjaGVzYCB0byBjcmVhdGUgdGhlIHByZWRpY2F0ZS5cbiAgICAgKiBQYXNzIGFuIGBBcnJheWAgb2YgcGFyYW1ldGVycyBmb3IgYF8ubWF0Y2hlc1Byb3BlcnR5YCBhbmQgdGhlIHByZWRpY2F0ZSB3aWxsIGJlIGNyZWF0ZWQgdXNpbmcgdGhlbS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtwcmVkaWNhdGVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIHByZWRpY2F0ZXMgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5vdmVyRXZlcnkoW0Jvb2xlYW4sIGlzRmluaXRlXSk7XG4gICAgICpcbiAgICAgKiBmdW5jKCcxJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogZnVuYyhudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogZnVuYyhOYU4pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIG92ZXJFdmVyeSA9IGNyZWF0ZU92ZXIoYXJyYXlFdmVyeSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgKiphbnkqKiBvZiB0aGUgYHByZWRpY2F0ZXNgIHJldHVyblxuICAgICAqIHRydXRoeSB3aGVuIGludm9rZWQgd2l0aCB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogRm9sbG93aW5nIHNob3J0aGFuZHMgYXJlIHBvc3NpYmxlIGZvciBwcm92aWRpbmcgcHJlZGljYXRlcy5cbiAgICAgKiBQYXNzIGFuIGBPYmplY3RgIGFuZCBpdCB3aWxsIGJlIHVzZWQgYXMgYW4gcGFyYW1ldGVyIGZvciBgXy5tYXRjaGVzYCB0byBjcmVhdGUgdGhlIHByZWRpY2F0ZS5cbiAgICAgKiBQYXNzIGFuIGBBcnJheWAgb2YgcGFyYW1ldGVycyBmb3IgYF8ubWF0Y2hlc1Byb3BlcnR5YCBhbmQgdGhlIHByZWRpY2F0ZSB3aWxsIGJlIGNyZWF0ZWQgdXNpbmcgdGhlbS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtwcmVkaWNhdGVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIHByZWRpY2F0ZXMgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5vdmVyU29tZShbQm9vbGVhbiwgaXNGaW5pdGVdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoJzEnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBmdW5jKG51bGwpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGZ1bmMoTmFOKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogdmFyIG1hdGNoZXNGdW5jID0gXy5vdmVyU29tZShbeyAnYSc6IDEgfSwgeyAnYSc6IDIgfV0pXG4gICAgICogdmFyIG1hdGNoZXNQcm9wZXJ0eUZ1bmMgPSBfLm92ZXJTb21lKFtbJ2EnLCAxXSwgWydhJywgMl1dKVxuICAgICAqL1xuICAgIHZhciBvdmVyU29tZSA9IGNyZWF0ZU92ZXIoYXJyYXlTb21lKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBhIGdpdmVuIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICogICB7ICdhJzogeyAnYic6IDIgfSB9LFxuICAgICAqICAgeyAnYSc6IHsgJ2InOiAxIH0gfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLm1hcChvYmplY3RzLCBfLnByb3BlcnR5KCdhLmInKSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICpcbiAgICAgKiBfLm1hcChfLnNvcnRCeShvYmplY3RzLCBfLnByb3BlcnR5KFsnYScsICdiJ10pKSwgJ2EuYicpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHByb3BlcnR5KHBhdGgpIHtcbiAgICAgIHJldHVybiBpc0tleShwYXRoKSA/IGJhc2VQcm9wZXJ0eSh0b0tleShwYXRoKSkgOiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5wcm9wZXJ0eWA7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnNcbiAgICAgKiB0aGUgdmFsdWUgYXQgYSBnaXZlbiBwYXRoIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFswLCAxLCAyXSxcbiAgICAgKiAgICAgb2JqZWN0ID0geyAnYSc6IGFycmF5LCAnYic6IGFycmF5LCAnYyc6IGFycmF5IH07XG4gICAgICpcbiAgICAgKiBfLm1hcChbJ2FbMl0nLCAnY1swXSddLCBfLnByb3BlcnR5T2Yob2JqZWN0KSk7XG4gICAgICogLy8gPT4gWzIsIDBdXG4gICAgICpcbiAgICAgKiBfLm1hcChbWydhJywgJzInXSwgWydjJywgJzAnXV0sIF8ucHJvcGVydHlPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwcm9wZXJ0eU9mKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgKHBvc2l0aXZlIGFuZC9vciBuZWdhdGl2ZSkgcHJvZ3Jlc3NpbmcgZnJvbVxuICAgICAqIGBzdGFydGAgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCBgZW5kYC4gQSBzdGVwIG9mIGAtMWAgaXMgdXNlZCBpZiBhIG5lZ2F0aXZlXG4gICAgICogYHN0YXJ0YCBpcyBzcGVjaWZpZWQgd2l0aG91dCBhbiBgZW5kYCBvciBgc3RlcGAuIElmIGBlbmRgIGlzIG5vdCBzcGVjaWZpZWQsXG4gICAgICogaXQncyBzZXQgdG8gYHN0YXJ0YCB3aXRoIGBzdGFydGAgdGhlbiBzZXQgdG8gYDBgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIEphdmFTY3JpcHQgZm9sbG93cyB0aGUgSUVFRS03NTQgc3RhbmRhcmQgZm9yIHJlc29sdmluZ1xuICAgICAqIGZsb2F0aW5nLXBvaW50IHZhbHVlcyB3aGljaCBjYW4gcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0xXSBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmdlIG9mIG51bWJlcnMuXG4gICAgICogQHNlZSBfLmluUmFuZ2UsIF8ucmFuZ2VSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDQpO1xuICAgICAqIC8vID0+IFswLCAxLCAyLCAzXVxuICAgICAqXG4gICAgICogXy5yYW5nZSgtNCk7XG4gICAgICogLy8gPT4gWzAsIC0xLCAtMiwgLTNdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDEsIDUpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzLCA0XVxuICAgICAqXG4gICAgICogXy5yYW5nZSgwLCAyMCwgNSk7XG4gICAgICogLy8gPT4gWzAsIDUsIDEwLCAxNV1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMCwgLTQsIC0xKTtcbiAgICAgKiAvLyA9PiBbMCwgLTEsIC0yLCAtM11cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMSwgNCwgMCk7XG4gICAgICogLy8gPT4gWzEsIDEsIDFdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDApO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgdmFyIHJhbmdlID0gY3JlYXRlUmFuZ2UoKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucmFuZ2VgIGV4Y2VwdCB0aGF0IGl0IHBvcHVsYXRlcyB2YWx1ZXMgaW5cbiAgICAgKiBkZXNjZW5kaW5nIG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MV0gVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICAgICAqIEBzZWUgXy5pblJhbmdlLCBfLnJhbmdlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCg0KTtcbiAgICAgKiAvLyA9PiBbMywgMiwgMSwgMF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgtNCk7XG4gICAgICogLy8gPT4gWy0zLCAtMiwgLTEsIDBdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoMSwgNSk7XG4gICAgICogLy8gPT4gWzQsIDMsIDIsIDFdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoMCwgMjAsIDUpO1xuICAgICAqIC8vID0+IFsxNSwgMTAsIDUsIDBdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoMCwgLTQsIC0xKTtcbiAgICAgKiAvLyA9PiBbLTMsIC0yLCAtMSwgMF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgxLCA0LCAwKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMV1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgwKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIHZhciByYW5nZVJpZ2h0ID0gY3JlYXRlUmFuZ2UodHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGVtcHR5IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZW1wdHkgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheXMgPSBfLnRpbWVzKDIsIF8uc3R1YkFycmF5KTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5cyk7XG4gICAgICogLy8gPT4gW1tdLCBbXV1cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5c1swXSA9PT0gYXJyYXlzWzFdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJBcnJheSgpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDIsIF8uc3R1YkZhbHNlKTtcbiAgICAgKiAvLyA9PiBbZmFsc2UsIGZhbHNlXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJGYWxzZSgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGVtcHR5IG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBlbXB0eSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gXy50aW1lcygyLCBfLnN0dWJPYmplY3QpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0cyk7XG4gICAgICogLy8gPT4gW3t9LCB7fV1cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdHNbMF0gPT09IG9iamVjdHNbMV0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1Yk9iamVjdCgpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVtcHR5IHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50aW1lcygyLCBfLnN0dWJTdHJpbmcpO1xuICAgICAqIC8vID0+IFsnJywgJyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1YlN0cmluZygpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB0cnVlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50aW1lcygyLCBfLnN0dWJUcnVlKTtcbiAgICAgKiAvLyA9PiBbdHJ1ZSwgdHJ1ZV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViVHJ1ZSgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIGl0ZXJhdGVlIGBuYCB0aW1lcywgcmV0dXJuaW5nIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mXG4gICAgICogZWFjaCBpbnZvY2F0aW9uLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDsgKGluZGV4KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMywgU3RyaW5nKTtcbiAgICAgKiAvLyA9PiBbJzAnLCAnMScsICcyJ11cbiAgICAgKlxuICAgICAqICBfLnRpbWVzKDQsIF8uY29uc3RhbnQoMCkpO1xuICAgICAqIC8vID0+IFswLCAwLCAwLCAwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRpbWVzKG4sIGl0ZXJhdGVlKSB7XG4gICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgaWYgKG4gPCAxIHx8IG4gPiBNQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IE1BWF9BUlJBWV9MRU5HVEgsXG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKG4sIE1BWF9BUlJBWV9MRU5HVEgpO1xuXG4gICAgICBpdGVyYXRlZSA9IGdldEl0ZXJhdGVlKGl0ZXJhdGVlKTtcbiAgICAgIG4gLT0gTUFYX0FSUkFZX0xFTkdUSDtcblxuICAgICAgdmFyIHJlc3VsdCA9IGJhc2VUaW1lcyhsZW5ndGgsIGl0ZXJhdGVlKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgICAgICBpdGVyYXRlZShpbmRleCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9QYXRoKCdhLmIuYycpO1xuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXVxuICAgICAqXG4gICAgICogXy50b1BhdGgoJ2FbMF0uYi5jJyk7XG4gICAgICogLy8gPT4gWydhJywgJzAnLCAnYicsICdjJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1BhdGgodmFsdWUpIHtcbiAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gYXJyYXlNYXAodmFsdWUsIHRvS2V5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc1N5bWJvbCh2YWx1ZSkgPyBbdmFsdWVdIDogY29weUFycmF5KHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQuIElmIGBwcmVmaXhgIGlzIGdpdmVuLCB0aGUgSUQgaXMgYXBwZW5kZWQgdG8gaXQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbcHJlZml4PScnXSBUaGUgdmFsdWUgdG8gcHJlZml4IHRoZSBJRCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuaXF1ZSBJRC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlxdWVJZCgnY29udGFjdF8nKTtcbiAgICAgKiAvLyA9PiAnY29udGFjdF8xMDQnXG4gICAgICpcbiAgICAgKiBfLnVuaXF1ZUlkKCk7XG4gICAgICogLy8gPT4gJzEwNSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmlxdWVJZChwcmVmaXgpIHtcbiAgICAgIHZhciBpZCA9ICsraWRDb3VudGVyO1xuICAgICAgcmV0dXJuIHRvU3RyaW5nKHByZWZpeCkgKyBpZDtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBBZGRzIHR3byBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYXVnZW5kIFRoZSBmaXJzdCBudW1iZXIgaW4gYW4gYWRkaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFkZGVuZCBUaGUgc2Vjb25kIG51bWJlciBpbiBhbiBhZGRpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0b3RhbC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5hZGQoNiwgNCk7XG4gICAgICogLy8gPT4gMTBcbiAgICAgKi9cbiAgICB2YXIgYWRkID0gY3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihhdWdlbmQsIGFkZGVuZCkge1xuICAgICAgcmV0dXJuIGF1Z2VuZCArIGFkZGVuZDtcbiAgICB9LCAwKTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIGBudW1iZXJgIHJvdW5kZWQgdXAgdG8gYHByZWNpc2lvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4xMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gcm91bmQgdXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwcmVjaXNpb249MF0gVGhlIHByZWNpc2lvbiB0byByb3VuZCB1cCB0by5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByb3VuZGVkIHVwIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jZWlsKDQuMDA2KTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICpcbiAgICAgKiBfLmNlaWwoNi4wMDQsIDIpO1xuICAgICAqIC8vID0+IDYuMDFcbiAgICAgKlxuICAgICAqIF8uY2VpbCg2MDQwLCAtMik7XG4gICAgICogLy8gPT4gNjEwMFxuICAgICAqL1xuICAgIHZhciBjZWlsID0gY3JlYXRlUm91bmQoJ2NlaWwnKTtcblxuICAgIC8qKlxuICAgICAqIERpdmlkZSB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRpdmlkZW5kIFRoZSBmaXJzdCBudW1iZXIgaW4gYSBkaXZpc2lvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGl2aXNvciBUaGUgc2Vjb25kIG51bWJlciBpbiBhIGRpdmlzaW9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHF1b3RpZW50LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRpdmlkZSg2LCA0KTtcbiAgICAgKiAvLyA9PiAxLjVcbiAgICAgKi9cbiAgICB2YXIgZGl2aWRlID0gY3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihkaXZpZGVuZCwgZGl2aXNvcikge1xuICAgICAgcmV0dXJuIGRpdmlkZW5kIC8gZGl2aXNvcjtcbiAgICB9LCAxKTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIGBudW1iZXJgIHJvdW5kZWQgZG93biB0byBgcHJlY2lzaW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byByb3VuZCBkb3duLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcHJlY2lzaW9uPTBdIFRoZSBwcmVjaXNpb24gdG8gcm91bmQgZG93biB0by5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByb3VuZGVkIGRvd24gbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZsb29yKDQuMDA2KTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLmZsb29yKDAuMDQ2LCAyKTtcbiAgICAgKiAvLyA9PiAwLjA0XG4gICAgICpcbiAgICAgKiBfLmZsb29yKDQwNjAsIC0yKTtcbiAgICAgKiAvLyA9PiA0MDAwXG4gICAgICovXG4gICAgdmFyIGZsb29yID0gY3JlYXRlUm91bmQoJ2Zsb29yJyk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgbWF4aW11bSB2YWx1ZSBvZiBgYXJyYXlgLiBJZiBgYXJyYXlgIGlzIGVtcHR5IG9yIGZhbHNleSxcbiAgICAgKiBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF4aW11bSB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tYXgoWzQsIDIsIDgsIDZdKTtcbiAgICAgKiAvLyA9PiA4XG4gICAgICpcbiAgICAgKiBfLm1heChbXSk7XG4gICAgICogLy8gPT4gdW5kZWZpbmVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF4KGFycmF5KSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGlkZW50aXR5LCBiYXNlR3QpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWF4YCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoXG4gICAgICogdGhlIHZhbHVlIGlzIHJhbmtlZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICduJzogMSB9LCB7ICduJzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8ubWF4Qnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAgICAgKiAvLyA9PiB7ICduJzogMiB9XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1heEJ5KG9iamVjdHMsICduJyk7XG4gICAgICogLy8gPT4geyAnbic6IDIgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1heEJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMiksIGJhc2VHdClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIG1lYW4gb2YgdGhlIHZhbHVlcyBpbiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG1lYW4uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWVhbihbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZWFuKGFycmF5KSB7XG4gICAgICByZXR1cm4gYmFzZU1lYW4oYXJyYXksIGlkZW50aXR5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1lYW5gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSB2YWx1ZSB0byBiZSBhdmVyYWdlZC5cbiAgICAgKiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbWVhbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDQgfSwgeyAnbic6IDIgfSwgeyAnbic6IDggfSwgeyAnbic6IDYgfV07XG4gICAgICpcbiAgICAgKiBfLm1lYW5CeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICAgICAqIC8vID0+IDVcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWVhbkJ5KG9iamVjdHMsICduJyk7XG4gICAgICogLy8gPT4gNVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lYW5CeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBiYXNlTWVhbihhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgbWluaW11bSB2YWx1ZSBvZiBgYXJyYXlgLiBJZiBgYXJyYXlgIGlzIGVtcHR5IG9yIGZhbHNleSxcbiAgICAgKiBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5taW4oWzQsIDIsIDgsIDZdKTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiBfLm1pbihbXSk7XG4gICAgICogLy8gPT4gdW5kZWZpbmVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWluKGFycmF5KSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGlkZW50aXR5LCBiYXNlTHQpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWluYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoXG4gICAgICogdGhlIHZhbHVlIGlzIHJhbmtlZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICduJzogMSB9LCB7ICduJzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8ubWluQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAgICAgKiAvLyA9PiB7ICduJzogMSB9XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1pbkJ5KG9iamVjdHMsICduJyk7XG4gICAgICogLy8gPT4geyAnbic6IDEgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1pbkJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMiksIGJhc2VMdClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTXVsdGlwbHkgdHdvIG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtdWx0aXBsaWVyIFRoZSBmaXJzdCBudW1iZXIgaW4gYSBtdWx0aXBsaWNhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbXVsdGlwbGljYW5kIFRoZSBzZWNvbmQgbnVtYmVyIGluIGEgbXVsdGlwbGljYXRpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcHJvZHVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tdWx0aXBseSg2LCA0KTtcbiAgICAgKiAvLyA9PiAyNFxuICAgICAqL1xuICAgIHZhciBtdWx0aXBseSA9IGNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24obXVsdGlwbGllciwgbXVsdGlwbGljYW5kKSB7XG4gICAgICByZXR1cm4gbXVsdGlwbGllciAqIG11bHRpcGxpY2FuZDtcbiAgICB9LCAxKTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIGBudW1iZXJgIHJvdW5kZWQgdG8gYHByZWNpc2lvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4xMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gcm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwcmVjaXNpb249MF0gVGhlIHByZWNpc2lvbiB0byByb3VuZCB0by5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByb3VuZGVkIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yb3VuZCg0LjAwNik7XG4gICAgICogLy8gPT4gNFxuICAgICAqXG4gICAgICogXy5yb3VuZCg0LjAwNiwgMik7XG4gICAgICogLy8gPT4gNC4wMVxuICAgICAqXG4gICAgICogXy5yb3VuZCg0MDYwLCAtMik7XG4gICAgICogLy8gPT4gNDEwMFxuICAgICAqL1xuICAgIHZhciByb3VuZCA9IGNyZWF0ZVJvdW5kKCdyb3VuZCcpO1xuXG4gICAgLyoqXG4gICAgICogU3VidHJhY3QgdHdvIG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW51ZW5kIFRoZSBmaXJzdCBudW1iZXIgaW4gYSBzdWJ0cmFjdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3VidHJhaGVuZCBUaGUgc2Vjb25kIG51bWJlciBpbiBhIHN1YnRyYWN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGRpZmZlcmVuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc3VidHJhY3QoNiwgNCk7XG4gICAgICogLy8gPT4gMlxuICAgICAqL1xuICAgIHZhciBzdWJ0cmFjdCA9IGNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24obWludWVuZCwgc3VidHJhaGVuZCkge1xuICAgICAgcmV0dXJuIG1pbnVlbmQgLSBzdWJ0cmFoZW5kO1xuICAgIH0sIDApO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIHN1bSBvZiB0aGUgdmFsdWVzIGluIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy40LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3VtLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnN1bShbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDIwXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3VtKGFycmF5KSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlU3VtKGFycmF5LCBpZGVudGl0eSlcbiAgICAgICAgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc3VtYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgdmFsdWUgdG8gYmUgc3VtbWVkLlxuICAgICAqIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdW0uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiA0IH0sIHsgJ24nOiAyIH0sIHsgJ24nOiA4IH0sIHsgJ24nOiA2IH1dO1xuICAgICAqXG4gICAgICogXy5zdW1CeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICAgICAqIC8vID0+IDIwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnN1bUJ5KG9iamVjdHMsICduJyk7XG4gICAgICogLy8gPT4gMjBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdW1CeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VTdW0oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiAwO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8vIEFkZCBtZXRob2RzIHRoYXQgcmV0dXJuIHdyYXBwZWQgdmFsdWVzIGluIGNoYWluIHNlcXVlbmNlcy5cbiAgICBsb2Rhc2guYWZ0ZXIgPSBhZnRlcjtcbiAgICBsb2Rhc2guYXJ5ID0gYXJ5O1xuICAgIGxvZGFzaC5hc3NpZ24gPSBhc3NpZ247XG4gICAgbG9kYXNoLmFzc2lnbkluID0gYXNzaWduSW47XG4gICAgbG9kYXNoLmFzc2lnbkluV2l0aCA9IGFzc2lnbkluV2l0aDtcbiAgICBsb2Rhc2guYXNzaWduV2l0aCA9IGFzc2lnbldpdGg7XG4gICAgbG9kYXNoLmF0ID0gYXQ7XG4gICAgbG9kYXNoLmJlZm9yZSA9IGJlZm9yZTtcbiAgICBsb2Rhc2guYmluZCA9IGJpbmQ7XG4gICAgbG9kYXNoLmJpbmRBbGwgPSBiaW5kQWxsO1xuICAgIGxvZGFzaC5iaW5kS2V5ID0gYmluZEtleTtcbiAgICBsb2Rhc2guY2FzdEFycmF5ID0gY2FzdEFycmF5O1xuICAgIGxvZGFzaC5jaGFpbiA9IGNoYWluO1xuICAgIGxvZGFzaC5jaHVuayA9IGNodW5rO1xuICAgIGxvZGFzaC5jb21wYWN0ID0gY29tcGFjdDtcbiAgICBsb2Rhc2guY29uY2F0ID0gY29uY2F0O1xuICAgIGxvZGFzaC5jb25kID0gY29uZDtcbiAgICBsb2Rhc2guY29uZm9ybXMgPSBjb25mb3JtcztcbiAgICBsb2Rhc2guY29uc3RhbnQgPSBjb25zdGFudDtcbiAgICBsb2Rhc2guY291bnRCeSA9IGNvdW50Qnk7XG4gICAgbG9kYXNoLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBsb2Rhc2guY3VycnkgPSBjdXJyeTtcbiAgICBsb2Rhc2guY3VycnlSaWdodCA9IGN1cnJ5UmlnaHQ7XG4gICAgbG9kYXNoLmRlYm91bmNlID0gZGVib3VuY2U7XG4gICAgbG9kYXNoLmRlZmF1bHRzID0gZGVmYXVsdHM7XG4gICAgbG9kYXNoLmRlZmF1bHRzRGVlcCA9IGRlZmF1bHRzRGVlcDtcbiAgICBsb2Rhc2guZGVmZXIgPSBkZWZlcjtcbiAgICBsb2Rhc2guZGVsYXkgPSBkZWxheTtcbiAgICBsb2Rhc2guZGlmZmVyZW5jZSA9IGRpZmZlcmVuY2U7XG4gICAgbG9kYXNoLmRpZmZlcmVuY2VCeSA9IGRpZmZlcmVuY2VCeTtcbiAgICBsb2Rhc2guZGlmZmVyZW5jZVdpdGggPSBkaWZmZXJlbmNlV2l0aDtcbiAgICBsb2Rhc2guZHJvcCA9IGRyb3A7XG4gICAgbG9kYXNoLmRyb3BSaWdodCA9IGRyb3BSaWdodDtcbiAgICBsb2Rhc2guZHJvcFJpZ2h0V2hpbGUgPSBkcm9wUmlnaHRXaGlsZTtcbiAgICBsb2Rhc2guZHJvcFdoaWxlID0gZHJvcFdoaWxlO1xuICAgIGxvZGFzaC5maWxsID0gZmlsbDtcbiAgICBsb2Rhc2guZmlsdGVyID0gZmlsdGVyO1xuICAgIGxvZGFzaC5mbGF0TWFwID0gZmxhdE1hcDtcbiAgICBsb2Rhc2guZmxhdE1hcERlZXAgPSBmbGF0TWFwRGVlcDtcbiAgICBsb2Rhc2guZmxhdE1hcERlcHRoID0gZmxhdE1hcERlcHRoO1xuICAgIGxvZGFzaC5mbGF0dGVuID0gZmxhdHRlbjtcbiAgICBsb2Rhc2guZmxhdHRlbkRlZXAgPSBmbGF0dGVuRGVlcDtcbiAgICBsb2Rhc2guZmxhdHRlbkRlcHRoID0gZmxhdHRlbkRlcHRoO1xuICAgIGxvZGFzaC5mbGlwID0gZmxpcDtcbiAgICBsb2Rhc2guZmxvdyA9IGZsb3c7XG4gICAgbG9kYXNoLmZsb3dSaWdodCA9IGZsb3dSaWdodDtcbiAgICBsb2Rhc2guZnJvbVBhaXJzID0gZnJvbVBhaXJzO1xuICAgIGxvZGFzaC5mdW5jdGlvbnMgPSBmdW5jdGlvbnM7XG4gICAgbG9kYXNoLmZ1bmN0aW9uc0luID0gZnVuY3Rpb25zSW47XG4gICAgbG9kYXNoLmdyb3VwQnkgPSBncm91cEJ5O1xuICAgIGxvZGFzaC5pbml0aWFsID0gaW5pdGlhbDtcbiAgICBsb2Rhc2guaW50ZXJzZWN0aW9uID0gaW50ZXJzZWN0aW9uO1xuICAgIGxvZGFzaC5pbnRlcnNlY3Rpb25CeSA9IGludGVyc2VjdGlvbkJ5O1xuICAgIGxvZGFzaC5pbnRlcnNlY3Rpb25XaXRoID0gaW50ZXJzZWN0aW9uV2l0aDtcbiAgICBsb2Rhc2guaW52ZXJ0ID0gaW52ZXJ0O1xuICAgIGxvZGFzaC5pbnZlcnRCeSA9IGludmVydEJ5O1xuICAgIGxvZGFzaC5pbnZva2VNYXAgPSBpbnZva2VNYXA7XG4gICAgbG9kYXNoLml0ZXJhdGVlID0gaXRlcmF0ZWU7XG4gICAgbG9kYXNoLmtleUJ5ID0ga2V5Qnk7XG4gICAgbG9kYXNoLmtleXMgPSBrZXlzO1xuICAgIGxvZGFzaC5rZXlzSW4gPSBrZXlzSW47XG4gICAgbG9kYXNoLm1hcCA9IG1hcDtcbiAgICBsb2Rhc2gubWFwS2V5cyA9IG1hcEtleXM7XG4gICAgbG9kYXNoLm1hcFZhbHVlcyA9IG1hcFZhbHVlcztcbiAgICBsb2Rhc2gubWF0Y2hlcyA9IG1hdGNoZXM7XG4gICAgbG9kYXNoLm1hdGNoZXNQcm9wZXJ0eSA9IG1hdGNoZXNQcm9wZXJ0eTtcbiAgICBsb2Rhc2gubWVtb2l6ZSA9IG1lbW9pemU7XG4gICAgbG9kYXNoLm1lcmdlID0gbWVyZ2U7XG4gICAgbG9kYXNoLm1lcmdlV2l0aCA9IG1lcmdlV2l0aDtcbiAgICBsb2Rhc2gubWV0aG9kID0gbWV0aG9kO1xuICAgIGxvZGFzaC5tZXRob2RPZiA9IG1ldGhvZE9mO1xuICAgIGxvZGFzaC5taXhpbiA9IG1peGluO1xuICAgIGxvZGFzaC5uZWdhdGUgPSBuZWdhdGU7XG4gICAgbG9kYXNoLm50aEFyZyA9IG50aEFyZztcbiAgICBsb2Rhc2gub21pdCA9IG9taXQ7XG4gICAgbG9kYXNoLm9taXRCeSA9IG9taXRCeTtcbiAgICBsb2Rhc2gub25jZSA9IG9uY2U7XG4gICAgbG9kYXNoLm9yZGVyQnkgPSBvcmRlckJ5O1xuICAgIGxvZGFzaC5vdmVyID0gb3ZlcjtcbiAgICBsb2Rhc2gub3ZlckFyZ3MgPSBvdmVyQXJncztcbiAgICBsb2Rhc2gub3ZlckV2ZXJ5ID0gb3ZlckV2ZXJ5O1xuICAgIGxvZGFzaC5vdmVyU29tZSA9IG92ZXJTb21lO1xuICAgIGxvZGFzaC5wYXJ0aWFsID0gcGFydGlhbDtcbiAgICBsb2Rhc2gucGFydGlhbFJpZ2h0ID0gcGFydGlhbFJpZ2h0O1xuICAgIGxvZGFzaC5wYXJ0aXRpb24gPSBwYXJ0aXRpb247XG4gICAgbG9kYXNoLnBpY2sgPSBwaWNrO1xuICAgIGxvZGFzaC5waWNrQnkgPSBwaWNrQnk7XG4gICAgbG9kYXNoLnByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgbG9kYXNoLnByb3BlcnR5T2YgPSBwcm9wZXJ0eU9mO1xuICAgIGxvZGFzaC5wdWxsID0gcHVsbDtcbiAgICBsb2Rhc2gucHVsbEFsbCA9IHB1bGxBbGw7XG4gICAgbG9kYXNoLnB1bGxBbGxCeSA9IHB1bGxBbGxCeTtcbiAgICBsb2Rhc2gucHVsbEFsbFdpdGggPSBwdWxsQWxsV2l0aDtcbiAgICBsb2Rhc2gucHVsbEF0ID0gcHVsbEF0O1xuICAgIGxvZGFzaC5yYW5nZSA9IHJhbmdlO1xuICAgIGxvZGFzaC5yYW5nZVJpZ2h0ID0gcmFuZ2VSaWdodDtcbiAgICBsb2Rhc2gucmVhcmcgPSByZWFyZztcbiAgICBsb2Rhc2gucmVqZWN0ID0gcmVqZWN0O1xuICAgIGxvZGFzaC5yZW1vdmUgPSByZW1vdmU7XG4gICAgbG9kYXNoLnJlc3QgPSByZXN0O1xuICAgIGxvZGFzaC5yZXZlcnNlID0gcmV2ZXJzZTtcbiAgICBsb2Rhc2guc2FtcGxlU2l6ZSA9IHNhbXBsZVNpemU7XG4gICAgbG9kYXNoLnNldCA9IHNldDtcbiAgICBsb2Rhc2guc2V0V2l0aCA9IHNldFdpdGg7XG4gICAgbG9kYXNoLnNodWZmbGUgPSBzaHVmZmxlO1xuICAgIGxvZGFzaC5zbGljZSA9IHNsaWNlO1xuICAgIGxvZGFzaC5zb3J0QnkgPSBzb3J0Qnk7XG4gICAgbG9kYXNoLnNvcnRlZFVuaXEgPSBzb3J0ZWRVbmlxO1xuICAgIGxvZGFzaC5zb3J0ZWRVbmlxQnkgPSBzb3J0ZWRVbmlxQnk7XG4gICAgbG9kYXNoLnNwbGl0ID0gc3BsaXQ7XG4gICAgbG9kYXNoLnNwcmVhZCA9IHNwcmVhZDtcbiAgICBsb2Rhc2gudGFpbCA9IHRhaWw7XG4gICAgbG9kYXNoLnRha2UgPSB0YWtlO1xuICAgIGxvZGFzaC50YWtlUmlnaHQgPSB0YWtlUmlnaHQ7XG4gICAgbG9kYXNoLnRha2VSaWdodFdoaWxlID0gdGFrZVJpZ2h0V2hpbGU7XG4gICAgbG9kYXNoLnRha2VXaGlsZSA9IHRha2VXaGlsZTtcbiAgICBsb2Rhc2gudGFwID0gdGFwO1xuICAgIGxvZGFzaC50aHJvdHRsZSA9IHRocm90dGxlO1xuICAgIGxvZGFzaC50aHJ1ID0gdGhydTtcbiAgICBsb2Rhc2gudG9BcnJheSA9IHRvQXJyYXk7XG4gICAgbG9kYXNoLnRvUGFpcnMgPSB0b1BhaXJzO1xuICAgIGxvZGFzaC50b1BhaXJzSW4gPSB0b1BhaXJzSW47XG4gICAgbG9kYXNoLnRvUGF0aCA9IHRvUGF0aDtcbiAgICBsb2Rhc2gudG9QbGFpbk9iamVjdCA9IHRvUGxhaW5PYmplY3Q7XG4gICAgbG9kYXNoLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICBsb2Rhc2gudW5hcnkgPSB1bmFyeTtcbiAgICBsb2Rhc2gudW5pb24gPSB1bmlvbjtcbiAgICBsb2Rhc2gudW5pb25CeSA9IHVuaW9uQnk7XG4gICAgbG9kYXNoLnVuaW9uV2l0aCA9IHVuaW9uV2l0aDtcbiAgICBsb2Rhc2gudW5pcSA9IHVuaXE7XG4gICAgbG9kYXNoLnVuaXFCeSA9IHVuaXFCeTtcbiAgICBsb2Rhc2gudW5pcVdpdGggPSB1bmlxV2l0aDtcbiAgICBsb2Rhc2gudW5zZXQgPSB1bnNldDtcbiAgICBsb2Rhc2gudW56aXAgPSB1bnppcDtcbiAgICBsb2Rhc2gudW56aXBXaXRoID0gdW56aXBXaXRoO1xuICAgIGxvZGFzaC51cGRhdGUgPSB1cGRhdGU7XG4gICAgbG9kYXNoLnVwZGF0ZVdpdGggPSB1cGRhdGVXaXRoO1xuICAgIGxvZGFzaC52YWx1ZXMgPSB2YWx1ZXM7XG4gICAgbG9kYXNoLnZhbHVlc0luID0gdmFsdWVzSW47XG4gICAgbG9kYXNoLndpdGhvdXQgPSB3aXRob3V0O1xuICAgIGxvZGFzaC53b3JkcyA9IHdvcmRzO1xuICAgIGxvZGFzaC53cmFwID0gd3JhcDtcbiAgICBsb2Rhc2gueG9yID0geG9yO1xuICAgIGxvZGFzaC54b3JCeSA9IHhvckJ5O1xuICAgIGxvZGFzaC54b3JXaXRoID0geG9yV2l0aDtcbiAgICBsb2Rhc2guemlwID0gemlwO1xuICAgIGxvZGFzaC56aXBPYmplY3QgPSB6aXBPYmplY3Q7XG4gICAgbG9kYXNoLnppcE9iamVjdERlZXAgPSB6aXBPYmplY3REZWVwO1xuICAgIGxvZGFzaC56aXBXaXRoID0gemlwV2l0aDtcblxuICAgIC8vIEFkZCBhbGlhc2VzLlxuICAgIGxvZGFzaC5lbnRyaWVzID0gdG9QYWlycztcbiAgICBsb2Rhc2guZW50cmllc0luID0gdG9QYWlyc0luO1xuICAgIGxvZGFzaC5leHRlbmQgPSBhc3NpZ25JbjtcbiAgICBsb2Rhc2guZXh0ZW5kV2l0aCA9IGFzc2lnbkluV2l0aDtcblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBsb2Rhc2gucHJvdG90eXBlYC5cbiAgICBtaXhpbihsb2Rhc2gsIGxvZGFzaCk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0aGF0IHJldHVybiB1bndyYXBwZWQgdmFsdWVzIGluIGNoYWluIHNlcXVlbmNlcy5cbiAgICBsb2Rhc2guYWRkID0gYWRkO1xuICAgIGxvZGFzaC5hdHRlbXB0ID0gYXR0ZW1wdDtcbiAgICBsb2Rhc2guY2FtZWxDYXNlID0gY2FtZWxDYXNlO1xuICAgIGxvZGFzaC5jYXBpdGFsaXplID0gY2FwaXRhbGl6ZTtcbiAgICBsb2Rhc2guY2VpbCA9IGNlaWw7XG4gICAgbG9kYXNoLmNsYW1wID0gY2xhbXA7XG4gICAgbG9kYXNoLmNsb25lID0gY2xvbmU7XG4gICAgbG9kYXNoLmNsb25lRGVlcCA9IGNsb25lRGVlcDtcbiAgICBsb2Rhc2guY2xvbmVEZWVwV2l0aCA9IGNsb25lRGVlcFdpdGg7XG4gICAgbG9kYXNoLmNsb25lV2l0aCA9IGNsb25lV2l0aDtcbiAgICBsb2Rhc2guY29uZm9ybXNUbyA9IGNvbmZvcm1zVG87XG4gICAgbG9kYXNoLmRlYnVyciA9IGRlYnVycjtcbiAgICBsb2Rhc2guZGVmYXVsdFRvID0gZGVmYXVsdFRvO1xuICAgIGxvZGFzaC5kaXZpZGUgPSBkaXZpZGU7XG4gICAgbG9kYXNoLmVuZHNXaXRoID0gZW5kc1dpdGg7XG4gICAgbG9kYXNoLmVxID0gZXE7XG4gICAgbG9kYXNoLmVzY2FwZSA9IGVzY2FwZTtcbiAgICBsb2Rhc2guZXNjYXBlUmVnRXhwID0gZXNjYXBlUmVnRXhwO1xuICAgIGxvZGFzaC5ldmVyeSA9IGV2ZXJ5O1xuICAgIGxvZGFzaC5maW5kID0gZmluZDtcbiAgICBsb2Rhc2guZmluZEluZGV4ID0gZmluZEluZGV4O1xuICAgIGxvZGFzaC5maW5kS2V5ID0gZmluZEtleTtcbiAgICBsb2Rhc2guZmluZExhc3QgPSBmaW5kTGFzdDtcbiAgICBsb2Rhc2guZmluZExhc3RJbmRleCA9IGZpbmRMYXN0SW5kZXg7XG4gICAgbG9kYXNoLmZpbmRMYXN0S2V5ID0gZmluZExhc3RLZXk7XG4gICAgbG9kYXNoLmZsb29yID0gZmxvb3I7XG4gICAgbG9kYXNoLmZvckVhY2ggPSBmb3JFYWNoO1xuICAgIGxvZGFzaC5mb3JFYWNoUmlnaHQgPSBmb3JFYWNoUmlnaHQ7XG4gICAgbG9kYXNoLmZvckluID0gZm9ySW47XG4gICAgbG9kYXNoLmZvckluUmlnaHQgPSBmb3JJblJpZ2h0O1xuICAgIGxvZGFzaC5mb3JPd24gPSBmb3JPd247XG4gICAgbG9kYXNoLmZvck93blJpZ2h0ID0gZm9yT3duUmlnaHQ7XG4gICAgbG9kYXNoLmdldCA9IGdldDtcbiAgICBsb2Rhc2guZ3QgPSBndDtcbiAgICBsb2Rhc2guZ3RlID0gZ3RlO1xuICAgIGxvZGFzaC5oYXMgPSBoYXM7XG4gICAgbG9kYXNoLmhhc0luID0gaGFzSW47XG4gICAgbG9kYXNoLmhlYWQgPSBoZWFkO1xuICAgIGxvZGFzaC5pZGVudGl0eSA9IGlkZW50aXR5O1xuICAgIGxvZGFzaC5pbmNsdWRlcyA9IGluY2x1ZGVzO1xuICAgIGxvZGFzaC5pbmRleE9mID0gaW5kZXhPZjtcbiAgICBsb2Rhc2guaW5SYW5nZSA9IGluUmFuZ2U7XG4gICAgbG9kYXNoLmludm9rZSA9IGludm9rZTtcbiAgICBsb2Rhc2guaXNBcmd1bWVudHMgPSBpc0FyZ3VtZW50cztcbiAgICBsb2Rhc2guaXNBcnJheSA9IGlzQXJyYXk7XG4gICAgbG9kYXNoLmlzQXJyYXlCdWZmZXIgPSBpc0FycmF5QnVmZmVyO1xuICAgIGxvZGFzaC5pc0FycmF5TGlrZSA9IGlzQXJyYXlMaWtlO1xuICAgIGxvZGFzaC5pc0FycmF5TGlrZU9iamVjdCA9IGlzQXJyYXlMaWtlT2JqZWN0O1xuICAgIGxvZGFzaC5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG4gICAgbG9kYXNoLmlzQnVmZmVyID0gaXNCdWZmZXI7XG4gICAgbG9kYXNoLmlzRGF0ZSA9IGlzRGF0ZTtcbiAgICBsb2Rhc2guaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuICAgIGxvZGFzaC5pc0VtcHR5ID0gaXNFbXB0eTtcbiAgICBsb2Rhc2guaXNFcXVhbCA9IGlzRXF1YWw7XG4gICAgbG9kYXNoLmlzRXF1YWxXaXRoID0gaXNFcXVhbFdpdGg7XG4gICAgbG9kYXNoLmlzRXJyb3IgPSBpc0Vycm9yO1xuICAgIGxvZGFzaC5pc0Zpbml0ZSA9IGlzRmluaXRlO1xuICAgIGxvZGFzaC5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcbiAgICBsb2Rhc2guaXNJbnRlZ2VyID0gaXNJbnRlZ2VyO1xuICAgIGxvZGFzaC5pc0xlbmd0aCA9IGlzTGVuZ3RoO1xuICAgIGxvZGFzaC5pc01hcCA9IGlzTWFwO1xuICAgIGxvZGFzaC5pc01hdGNoID0gaXNNYXRjaDtcbiAgICBsb2Rhc2guaXNNYXRjaFdpdGggPSBpc01hdGNoV2l0aDtcbiAgICBsb2Rhc2guaXNOYU4gPSBpc05hTjtcbiAgICBsb2Rhc2guaXNOYXRpdmUgPSBpc05hdGl2ZTtcbiAgICBsb2Rhc2guaXNOaWwgPSBpc05pbDtcbiAgICBsb2Rhc2guaXNOdWxsID0gaXNOdWxsO1xuICAgIGxvZGFzaC5pc051bWJlciA9IGlzTnVtYmVyO1xuICAgIGxvZGFzaC5pc09iamVjdCA9IGlzT2JqZWN0O1xuICAgIGxvZGFzaC5pc09iamVjdExpa2UgPSBpc09iamVjdExpa2U7XG4gICAgbG9kYXNoLmlzUGxhaW5PYmplY3QgPSBpc1BsYWluT2JqZWN0O1xuICAgIGxvZGFzaC5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuICAgIGxvZGFzaC5pc1NhZmVJbnRlZ2VyID0gaXNTYWZlSW50ZWdlcjtcbiAgICBsb2Rhc2guaXNTZXQgPSBpc1NldDtcbiAgICBsb2Rhc2guaXNTdHJpbmcgPSBpc1N0cmluZztcbiAgICBsb2Rhc2guaXNTeW1ib2wgPSBpc1N5bWJvbDtcbiAgICBsb2Rhc2guaXNUeXBlZEFycmF5ID0gaXNUeXBlZEFycmF5O1xuICAgIGxvZGFzaC5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuICAgIGxvZGFzaC5pc1dlYWtNYXAgPSBpc1dlYWtNYXA7XG4gICAgbG9kYXNoLmlzV2Vha1NldCA9IGlzV2Vha1NldDtcbiAgICBsb2Rhc2guam9pbiA9IGpvaW47XG4gICAgbG9kYXNoLmtlYmFiQ2FzZSA9IGtlYmFiQ2FzZTtcbiAgICBsb2Rhc2gubGFzdCA9IGxhc3Q7XG4gICAgbG9kYXNoLmxhc3RJbmRleE9mID0gbGFzdEluZGV4T2Y7XG4gICAgbG9kYXNoLmxvd2VyQ2FzZSA9IGxvd2VyQ2FzZTtcbiAgICBsb2Rhc2gubG93ZXJGaXJzdCA9IGxvd2VyRmlyc3Q7XG4gICAgbG9kYXNoLmx0ID0gbHQ7XG4gICAgbG9kYXNoLmx0ZSA9IGx0ZTtcbiAgICBsb2Rhc2gubWF4ID0gbWF4O1xuICAgIGxvZGFzaC5tYXhCeSA9IG1heEJ5O1xuICAgIGxvZGFzaC5tZWFuID0gbWVhbjtcbiAgICBsb2Rhc2gubWVhbkJ5ID0gbWVhbkJ5O1xuICAgIGxvZGFzaC5taW4gPSBtaW47XG4gICAgbG9kYXNoLm1pbkJ5ID0gbWluQnk7XG4gICAgbG9kYXNoLnN0dWJBcnJheSA9IHN0dWJBcnJheTtcbiAgICBsb2Rhc2guc3R1YkZhbHNlID0gc3R1YkZhbHNlO1xuICAgIGxvZGFzaC5zdHViT2JqZWN0ID0gc3R1Yk9iamVjdDtcbiAgICBsb2Rhc2guc3R1YlN0cmluZyA9IHN0dWJTdHJpbmc7XG4gICAgbG9kYXNoLnN0dWJUcnVlID0gc3R1YlRydWU7XG4gICAgbG9kYXNoLm11bHRpcGx5ID0gbXVsdGlwbHk7XG4gICAgbG9kYXNoLm50aCA9IG50aDtcbiAgICBsb2Rhc2gubm9Db25mbGljdCA9IG5vQ29uZmxpY3Q7XG4gICAgbG9kYXNoLm5vb3AgPSBub29wO1xuICAgIGxvZGFzaC5ub3cgPSBub3c7XG4gICAgbG9kYXNoLnBhZCA9IHBhZDtcbiAgICBsb2Rhc2gucGFkRW5kID0gcGFkRW5kO1xuICAgIGxvZGFzaC5wYWRTdGFydCA9IHBhZFN0YXJ0O1xuICAgIGxvZGFzaC5wYXJzZUludCA9IHBhcnNlSW50O1xuICAgIGxvZGFzaC5yYW5kb20gPSByYW5kb207XG4gICAgbG9kYXNoLnJlZHVjZSA9IHJlZHVjZTtcbiAgICBsb2Rhc2gucmVkdWNlUmlnaHQgPSByZWR1Y2VSaWdodDtcbiAgICBsb2Rhc2gucmVwZWF0ID0gcmVwZWF0O1xuICAgIGxvZGFzaC5yZXBsYWNlID0gcmVwbGFjZTtcbiAgICBsb2Rhc2gucmVzdWx0ID0gcmVzdWx0O1xuICAgIGxvZGFzaC5yb3VuZCA9IHJvdW5kO1xuICAgIGxvZGFzaC5ydW5JbkNvbnRleHQgPSBydW5JbkNvbnRleHQ7XG4gICAgbG9kYXNoLnNhbXBsZSA9IHNhbXBsZTtcbiAgICBsb2Rhc2guc2l6ZSA9IHNpemU7XG4gICAgbG9kYXNoLnNuYWtlQ2FzZSA9IHNuYWtlQ2FzZTtcbiAgICBsb2Rhc2guc29tZSA9IHNvbWU7XG4gICAgbG9kYXNoLnNvcnRlZEluZGV4ID0gc29ydGVkSW5kZXg7XG4gICAgbG9kYXNoLnNvcnRlZEluZGV4QnkgPSBzb3J0ZWRJbmRleEJ5O1xuICAgIGxvZGFzaC5zb3J0ZWRJbmRleE9mID0gc29ydGVkSW5kZXhPZjtcbiAgICBsb2Rhc2guc29ydGVkTGFzdEluZGV4ID0gc29ydGVkTGFzdEluZGV4O1xuICAgIGxvZGFzaC5zb3J0ZWRMYXN0SW5kZXhCeSA9IHNvcnRlZExhc3RJbmRleEJ5O1xuICAgIGxvZGFzaC5zb3J0ZWRMYXN0SW5kZXhPZiA9IHNvcnRlZExhc3RJbmRleE9mO1xuICAgIGxvZGFzaC5zdGFydENhc2UgPSBzdGFydENhc2U7XG4gICAgbG9kYXNoLnN0YXJ0c1dpdGggPSBzdGFydHNXaXRoO1xuICAgIGxvZGFzaC5zdWJ0cmFjdCA9IHN1YnRyYWN0O1xuICAgIGxvZGFzaC5zdW0gPSBzdW07XG4gICAgbG9kYXNoLnN1bUJ5ID0gc3VtQnk7XG4gICAgbG9kYXNoLnRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgbG9kYXNoLnRpbWVzID0gdGltZXM7XG4gICAgbG9kYXNoLnRvRmluaXRlID0gdG9GaW5pdGU7XG4gICAgbG9kYXNoLnRvSW50ZWdlciA9IHRvSW50ZWdlcjtcbiAgICBsb2Rhc2gudG9MZW5ndGggPSB0b0xlbmd0aDtcbiAgICBsb2Rhc2gudG9Mb3dlciA9IHRvTG93ZXI7XG4gICAgbG9kYXNoLnRvTnVtYmVyID0gdG9OdW1iZXI7XG4gICAgbG9kYXNoLnRvU2FmZUludGVnZXIgPSB0b1NhZmVJbnRlZ2VyO1xuICAgIGxvZGFzaC50b1N0cmluZyA9IHRvU3RyaW5nO1xuICAgIGxvZGFzaC50b1VwcGVyID0gdG9VcHBlcjtcbiAgICBsb2Rhc2gudHJpbSA9IHRyaW07XG4gICAgbG9kYXNoLnRyaW1FbmQgPSB0cmltRW5kO1xuICAgIGxvZGFzaC50cmltU3RhcnQgPSB0cmltU3RhcnQ7XG4gICAgbG9kYXNoLnRydW5jYXRlID0gdHJ1bmNhdGU7XG4gICAgbG9kYXNoLnVuZXNjYXBlID0gdW5lc2NhcGU7XG4gICAgbG9kYXNoLnVuaXF1ZUlkID0gdW5pcXVlSWQ7XG4gICAgbG9kYXNoLnVwcGVyQ2FzZSA9IHVwcGVyQ2FzZTtcbiAgICBsb2Rhc2gudXBwZXJGaXJzdCA9IHVwcGVyRmlyc3Q7XG5cbiAgICAvLyBBZGQgYWxpYXNlcy5cbiAgICBsb2Rhc2guZWFjaCA9IGZvckVhY2g7XG4gICAgbG9kYXNoLmVhY2hSaWdodCA9IGZvckVhY2hSaWdodDtcbiAgICBsb2Rhc2guZmlyc3QgPSBoZWFkO1xuXG4gICAgbWl4aW4obG9kYXNoLCAoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc291cmNlID0ge307XG4gICAgICBiYXNlRm9yT3duKGxvZGFzaCwgZnVuY3Rpb24oZnVuYywgbWV0aG9kTmFtZSkge1xuICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwobG9kYXNoLnByb3RvdHlwZSwgbWV0aG9kTmFtZSkpIHtcbiAgICAgICAgICBzb3VyY2VbbWV0aG9kTmFtZV0gPSBmdW5jO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfSgpKSwgeyAnY2hhaW4nOiBmYWxzZSB9KTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIFRoZSBzZW1hbnRpYyB2ZXJzaW9uIG51bWJlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgbG9kYXNoLlZFUlNJT04gPSBWRVJTSU9OO1xuXG4gICAgLy8gQXNzaWduIGRlZmF1bHQgcGxhY2Vob2xkZXJzLlxuICAgIGFycmF5RWFjaChbJ2JpbmQnLCAnYmluZEtleScsICdjdXJyeScsICdjdXJyeVJpZ2h0JywgJ3BhcnRpYWwnLCAncGFydGlhbFJpZ2h0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgIGxvZGFzaFttZXRob2ROYW1lXS5wbGFjZWhvbGRlciA9IGxvZGFzaDtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgZm9yIGBfLmRyb3BgIGFuZCBgXy50YWtlYCB2YXJpYW50cy5cbiAgICBhcnJheUVhY2goWydkcm9wJywgJ3Rha2UnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSwgaW5kZXgpIHtcbiAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgbiA9IG4gPT09IHVuZGVmaW5lZCA/IDEgOiBuYXRpdmVNYXgodG9JbnRlZ2VyKG4pLCAwKTtcblxuICAgICAgICB2YXIgcmVzdWx0ID0gKHRoaXMuX19maWx0ZXJlZF9fICYmICFpbmRleClcbiAgICAgICAgICA/IG5ldyBMYXp5V3JhcHBlcih0aGlzKVxuICAgICAgICAgIDogdGhpcy5jbG9uZSgpO1xuXG4gICAgICAgIGlmIChyZXN1bHQuX19maWx0ZXJlZF9fKSB7XG4gICAgICAgICAgcmVzdWx0Ll9fdGFrZUNvdW50X18gPSBuYXRpdmVNaW4obiwgcmVzdWx0Ll9fdGFrZUNvdW50X18pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdC5fX3ZpZXdzX18ucHVzaCh7XG4gICAgICAgICAgICAnc2l6ZSc6IG5hdGl2ZU1pbihuLCBNQVhfQVJSQVlfTEVOR1RIKSxcbiAgICAgICAgICAgICd0eXBlJzogbWV0aG9kTmFtZSArIChyZXN1bHQuX19kaXJfXyA8IDAgPyAnUmlnaHQnIDogJycpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG5cbiAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lICsgJ1JpZ2h0J10gPSBmdW5jdGlvbihuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJldmVyc2UoKVttZXRob2ROYW1lXShuKS5yZXZlcnNlKCk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyB0aGF0IGFjY2VwdCBhbiBgaXRlcmF0ZWVgIHZhbHVlLlxuICAgIGFycmF5RWFjaChbJ2ZpbHRlcicsICdtYXAnLCAndGFrZVdoaWxlJ10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICB2YXIgdHlwZSA9IGluZGV4ICsgMSxcbiAgICAgICAgICBpc0ZpbHRlciA9IHR5cGUgPT0gTEFaWV9GSUxURVJfRkxBRyB8fCB0eXBlID09IExBWllfV0hJTEVfRkxBRztcblxuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oaXRlcmF0ZWUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgcmVzdWx0Ll9faXRlcmF0ZWVzX18ucHVzaCh7XG4gICAgICAgICAgJ2l0ZXJhdGVlJzogZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpLFxuICAgICAgICAgICd0eXBlJzogdHlwZVxuICAgICAgICB9KTtcbiAgICAgICAgcmVzdWx0Ll9fZmlsdGVyZWRfXyA9IHJlc3VsdC5fX2ZpbHRlcmVkX18gfHwgaXNGaWx0ZXI7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyBmb3IgYF8uaGVhZGAgYW5kIGBfLmxhc3RgLlxuICAgIGFycmF5RWFjaChbJ2hlYWQnLCAnbGFzdCddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgdmFyIHRha2VOYW1lID0gJ3Rha2UnICsgKGluZGV4ID8gJ1JpZ2h0JyA6ICcnKTtcblxuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzW3Rha2VOYW1lXSgxKS52YWx1ZSgpWzBdO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgZm9yIGBfLmluaXRpYWxgIGFuZCBgXy50YWlsYC5cbiAgICBhcnJheUVhY2goWydpbml0aWFsJywgJ3RhaWwnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSwgaW5kZXgpIHtcbiAgICAgIHZhciBkcm9wTmFtZSA9ICdkcm9wJyArIChpbmRleCA/ICcnIDogJ1JpZ2h0Jyk7XG5cbiAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fX2ZpbHRlcmVkX18gPyBuZXcgTGF6eVdyYXBwZXIodGhpcykgOiB0aGlzW2Ryb3BOYW1lXSgxKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuY29tcGFjdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKGlkZW50aXR5KTtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlcihwcmVkaWNhdGUpLmhlYWQoKTtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmZpbmRMYXN0ID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXZlcnNlKCkuZmluZChwcmVkaWNhdGUpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuaW52b2tlTWFwID0gYmFzZVJlc3QoZnVuY3Rpb24ocGF0aCwgYXJncykge1xuICAgICAgaWYgKHR5cGVvZiBwYXRoID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMYXp5V3JhcHBlcih0aGlzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gYmFzZUludm9rZSh2YWx1ZSwgcGF0aCwgYXJncyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5yZWplY3QgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlcihuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlKSkpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gICAgICBzdGFydCA9IHRvSW50ZWdlcihzdGFydCk7XG5cbiAgICAgIHZhciByZXN1bHQgPSB0aGlzO1xuICAgICAgaWYgKHJlc3VsdC5fX2ZpbHRlcmVkX18gJiYgKHN0YXJ0ID4gMCB8fCBlbmQgPCAwKSkge1xuICAgICAgICByZXR1cm4gbmV3IExhenlXcmFwcGVyKHJlc3VsdCk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC50YWtlUmlnaHQoLXN0YXJ0KTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhcnQpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmRyb3Aoc3RhcnQpO1xuICAgICAgfVxuICAgICAgaWYgKGVuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVuZCA9IHRvSW50ZWdlcihlbmQpO1xuICAgICAgICByZXN1bHQgPSBlbmQgPCAwID8gcmVzdWx0LmRyb3BSaWdodCgtZW5kKSA6IHJlc3VsdC50YWtlKGVuZCAtIHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS50YWtlUmlnaHRXaGlsZSA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmV2ZXJzZSgpLnRha2VXaGlsZShwcmVkaWNhdGUpLnJldmVyc2UoKTtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRha2UoTUFYX0FSUkFZX0xFTkdUSCk7XG4gICAgfTtcblxuICAgIC8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgdG8gYGxvZGFzaC5wcm90b3R5cGVgLlxuICAgIGJhc2VGb3JPd24oTGF6eVdyYXBwZXIucHJvdG90eXBlLCBmdW5jdGlvbihmdW5jLCBtZXRob2ROYW1lKSB7XG4gICAgICB2YXIgY2hlY2tJdGVyYXRlZSA9IC9eKD86ZmlsdGVyfGZpbmR8bWFwfHJlamVjdCl8V2hpbGUkLy50ZXN0KG1ldGhvZE5hbWUpLFxuICAgICAgICAgIGlzVGFrZXIgPSAvXig/OmhlYWR8bGFzdCkkLy50ZXN0KG1ldGhvZE5hbWUpLFxuICAgICAgICAgIGxvZGFzaEZ1bmMgPSBsb2Rhc2hbaXNUYWtlciA/ICgndGFrZScgKyAobWV0aG9kTmFtZSA9PSAnbGFzdCcgPyAnUmlnaHQnIDogJycpKSA6IG1ldGhvZE5hbWVdLFxuICAgICAgICAgIHJldFVud3JhcHBlZCA9IGlzVGFrZXIgfHwgL15maW5kLy50ZXN0KG1ldGhvZE5hbWUpO1xuXG4gICAgICBpZiAoIWxvZGFzaEZ1bmMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbG9kYXNoLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl9fd3JhcHBlZF9fLFxuICAgICAgICAgICAgYXJncyA9IGlzVGFrZXIgPyBbMV0gOiBhcmd1bWVudHMsXG4gICAgICAgICAgICBpc0xhenkgPSB2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyLFxuICAgICAgICAgICAgaXRlcmF0ZWUgPSBhcmdzWzBdLFxuICAgICAgICAgICAgdXNlTGF6eSA9IGlzTGF6eSB8fCBpc0FycmF5KHZhbHVlKTtcblxuICAgICAgICB2YXIgaW50ZXJjZXB0b3IgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHZhciByZXN1bHQgPSBsb2Rhc2hGdW5jLmFwcGx5KGxvZGFzaCwgYXJyYXlQdXNoKFt2YWx1ZV0sIGFyZ3MpKTtcbiAgICAgICAgICByZXR1cm4gKGlzVGFrZXIgJiYgY2hhaW5BbGwpID8gcmVzdWx0WzBdIDogcmVzdWx0O1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh1c2VMYXp5ICYmIGNoZWNrSXRlcmF0ZWUgJiYgdHlwZW9mIGl0ZXJhdGVlID09ICdmdW5jdGlvbicgJiYgaXRlcmF0ZWUubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgICAvLyBBdm9pZCBsYXp5IHVzZSBpZiB0aGUgaXRlcmF0ZWUgaGFzIGEgXCJsZW5ndGhcIiB2YWx1ZSBvdGhlciB0aGFuIGAxYC5cbiAgICAgICAgICBpc0xhenkgPSB1c2VMYXp5ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNoYWluQWxsID0gdGhpcy5fX2NoYWluX18sXG4gICAgICAgICAgICBpc0h5YnJpZCA9ICEhdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgsXG4gICAgICAgICAgICBpc1Vud3JhcHBlZCA9IHJldFVud3JhcHBlZCAmJiAhY2hhaW5BbGwsXG4gICAgICAgICAgICBvbmx5TGF6eSA9IGlzTGF6eSAmJiAhaXNIeWJyaWQ7XG5cbiAgICAgICAgaWYgKCFyZXRVbndyYXBwZWQgJiYgdXNlTGF6eSkge1xuICAgICAgICAgIHZhbHVlID0gb25seUxhenkgPyB2YWx1ZSA6IG5ldyBMYXp5V3JhcHBlcih0aGlzKTtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5hcHBseSh2YWx1ZSwgYXJncyk7XG4gICAgICAgICAgcmVzdWx0Ll9fYWN0aW9uc19fLnB1c2goeyAnZnVuYyc6IHRocnUsICdhcmdzJzogW2ludGVyY2VwdG9yXSwgJ3RoaXNBcmcnOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHJlc3VsdCwgY2hhaW5BbGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Vud3JhcHBlZCAmJiBvbmx5TGF6eSkge1xuICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IHRoaXMudGhydShpbnRlcmNlcHRvcik7XG4gICAgICAgIHJldHVybiBpc1Vud3JhcHBlZCA/IChpc1Rha2VyID8gcmVzdWx0LnZhbHVlKClbMF0gOiByZXN1bHQudmFsdWUoKSkgOiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBBcnJheWAgbWV0aG9kcyB0byBgbG9kYXNoLnByb3RvdHlwZWAuXG4gICAgYXJyYXlFYWNoKFsncG9wJywgJ3B1c2gnLCAnc2hpZnQnLCAnc29ydCcsICdzcGxpY2UnLCAndW5zaGlmdCddLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgICB2YXIgZnVuYyA9IGFycmF5UHJvdG9bbWV0aG9kTmFtZV0sXG4gICAgICAgICAgY2hhaW5OYW1lID0gL14oPzpwdXNofHNvcnR8dW5zaGlmdCkkLy50ZXN0KG1ldGhvZE5hbWUpID8gJ3RhcCcgOiAndGhydScsXG4gICAgICAgICAgcmV0VW53cmFwcGVkID0gL14oPzpwb3B8c2hpZnQpJC8udGVzdChtZXRob2ROYW1lKTtcblxuICAgICAgbG9kYXNoLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgaWYgKHJldFVud3JhcHBlZCAmJiAhdGhpcy5fX2NoYWluX18pIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkoaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpc1tjaGFpbk5hbWVdKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkoaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdLCBhcmdzKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gTWFwIG1pbmlmaWVkIG1ldGhvZCBuYW1lcyB0byB0aGVpciByZWFsIG5hbWVzLlxuICAgIGJhc2VGb3JPd24oTGF6eVdyYXBwZXIucHJvdG90eXBlLCBmdW5jdGlvbihmdW5jLCBtZXRob2ROYW1lKSB7XG4gICAgICB2YXIgbG9kYXNoRnVuYyA9IGxvZGFzaFttZXRob2ROYW1lXTtcbiAgICAgIGlmIChsb2Rhc2hGdW5jKSB7XG4gICAgICAgIHZhciBrZXkgPSBsb2Rhc2hGdW5jLm5hbWUgKyAnJztcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlYWxOYW1lcywga2V5KSkge1xuICAgICAgICAgIHJlYWxOYW1lc1trZXldID0gW107XG4gICAgICAgIH1cbiAgICAgICAgcmVhbE5hbWVzW2tleV0ucHVzaCh7ICduYW1lJzogbWV0aG9kTmFtZSwgJ2Z1bmMnOiBsb2Rhc2hGdW5jIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVhbE5hbWVzW2NyZWF0ZUh5YnJpZCh1bmRlZmluZWQsIFdSQVBfQklORF9LRVlfRkxBRykubmFtZV0gPSBbe1xuICAgICAgJ25hbWUnOiAnd3JhcHBlcicsXG4gICAgICAnZnVuYyc6IHVuZGVmaW5lZFxuICAgIH1dO1xuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYExhenlXcmFwcGVyYC5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuY2xvbmUgPSBsYXp5Q2xvbmU7XG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnJldmVyc2UgPSBsYXp5UmV2ZXJzZTtcbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUudmFsdWUgPSBsYXp5VmFsdWU7XG5cbiAgICAvLyBBZGQgY2hhaW4gc2VxdWVuY2UgbWV0aG9kcyB0byB0aGUgYGxvZGFzaGAgd3JhcHBlci5cbiAgICBsb2Rhc2gucHJvdG90eXBlLmF0ID0gd3JhcHBlckF0O1xuICAgIGxvZGFzaC5wcm90b3R5cGUuY2hhaW4gPSB3cmFwcGVyQ2hhaW47XG4gICAgbG9kYXNoLnByb3RvdHlwZS5jb21taXQgPSB3cmFwcGVyQ29tbWl0O1xuICAgIGxvZGFzaC5wcm90b3R5cGUubmV4dCA9IHdyYXBwZXJOZXh0O1xuICAgIGxvZGFzaC5wcm90b3R5cGUucGxhbnQgPSB3cmFwcGVyUGxhbnQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5yZXZlcnNlID0gd3JhcHBlclJldmVyc2U7XG4gICAgbG9kYXNoLnByb3RvdHlwZS50b0pTT04gPSBsb2Rhc2gucHJvdG90eXBlLnZhbHVlT2YgPSBsb2Rhc2gucHJvdG90eXBlLnZhbHVlID0gd3JhcHBlclZhbHVlO1xuXG4gICAgLy8gQWRkIGxhenkgYWxpYXNlcy5cbiAgICBsb2Rhc2gucHJvdG90eXBlLmZpcnN0ID0gbG9kYXNoLnByb3RvdHlwZS5oZWFkO1xuXG4gICAgaWYgKHN5bUl0ZXJhdG9yKSB7XG4gICAgICBsb2Rhc2gucHJvdG90eXBlW3N5bUl0ZXJhdG9yXSA9IHdyYXBwZXJUb0l0ZXJhdG9yO1xuICAgIH1cbiAgICByZXR1cm4gbG9kYXNoO1xuICB9KTtcblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAvLyBFeHBvcnQgbG9kYXNoLlxuICB2YXIgXyA9IHJ1bkluQ29udGV4dCgpO1xuXG4gIC8vIFNvbWUgQU1EIGJ1aWxkIG9wdGltaXplcnMsIGxpa2Ugci5qcywgY2hlY2sgZm9yIGNvbmRpdGlvbiBwYXR0ZXJucyBsaWtlOlxuICBpZiAodHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBkZWZpbmUuYW1kID09ICdvYmplY3QnICYmIGRlZmluZS5hbWQpIHtcbiAgICAvLyBFeHBvc2UgTG9kYXNoIG9uIHRoZSBnbG9iYWwgb2JqZWN0IHRvIHByZXZlbnQgZXJyb3JzIHdoZW4gTG9kYXNoIGlzXG4gICAgLy8gbG9hZGVkIGJ5IGEgc2NyaXB0IHRhZyBpbiB0aGUgcHJlc2VuY2Ugb2YgYW4gQU1EIGxvYWRlci5cbiAgICAvLyBTZWUgaHR0cDovL3JlcXVpcmVqcy5vcmcvZG9jcy9lcnJvcnMuaHRtbCNtaXNtYXRjaCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgIC8vIFVzZSBgXy5ub0NvbmZsaWN0YCB0byByZW1vdmUgTG9kYXNoIGZyb20gdGhlIGdsb2JhbCBvYmplY3QuXG4gICAgcm9vdC5fID0gXztcblxuICAgIC8vIERlZmluZSBhcyBhbiBhbm9ueW1vdXMgbW9kdWxlIHNvLCB0aHJvdWdoIHBhdGggbWFwcGluZywgaXQgY2FuIGJlXG4gICAgLy8gcmVmZXJlbmNlZCBhcyB0aGUgXCJ1bmRlcnNjb3JlXCIgbW9kdWxlLlxuICAgIGRlZmluZShmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBfO1xuICAgIH0pO1xuICB9XG4gIC8vIENoZWNrIGZvciBgZXhwb3J0c2AgYWZ0ZXIgYGRlZmluZWAgaW4gY2FzZSBhIGJ1aWxkIG9wdGltaXplciBhZGRzIGl0LlxuICBlbHNlIGlmIChmcmVlTW9kdWxlKSB7XG4gICAgLy8gRXhwb3J0IGZvciBOb2RlLmpzLlxuICAgIChmcmVlTW9kdWxlLmV4cG9ydHMgPSBfKS5fID0gXztcbiAgICAvLyBFeHBvcnQgZm9yIENvbW1vbkpTIHN1cHBvcnQuXG4gICAgZnJlZUV4cG9ydHMuXyA9IF87XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gRXhwb3J0IHRvIHRoZSBnbG9iYWwgb2JqZWN0LlxuICAgIHJvb3QuXyA9IF87XG4gIH1cbn0uY2FsbCh0aGlzKSk7XG4iLCJpbXBvcnQge1xuICBEZWZpbmVGb3JtU2V0dXBPcHRpb25zLFxuICBUZW1wbGF0ZSxcbn0gZnJvbSBcIkAvaGVscGVycy9kZWZpbmVGb3JtU2V0dXAvdHlwZXNcIjtcbmltcG9ydCB7IEZvcm1TZXR1cExvYWRlciB9IGZyb20gXCIuLi9saWZlY3ljbGUvdHlwZXNcIjtcbmltcG9ydCB7IGtleUJ5IH0gZnJvbSBcImxvZGFzaFwiO1xuaW1wb3J0IHsgU1NSIH0gZnJvbSBcIkAvY29yZS9jb250ZXh0L3R5cGVzXCI7XG5cbmV4cG9ydCBjbGFzcyBGb3JtQ29udGV4dCB7XG4gIHN0YXRpYyBjb250ZXh0OiBEZWZpbmVGb3JtU2V0dXBPcHRpb25zO1xuICBzdGF0aWMgdGVtcGxhdGVCeUlkOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIERlZmluZUZvcm1TZXR1cE9wdGlvbnNbXCJ0ZW1wbGF0ZXNcIl1bbnVtYmVyXVxuICA+O1xuXG4gIHN0YXRpYyBwcm9jZXNzQ29udGV4dCgpIHtcbiAgICB0aGlzLnRlbXBsYXRlQnlJZCA9IGtleUJ5KHRoaXMuY29udGV4dC50ZW1wbGF0ZXMsIFwiaWRcIik7XG4gIH1cblxuICBzdGF0aWMgcGFyc2VMb2FkZXIobG9hZGVyOiBGb3JtU2V0dXBMb2FkZXIpIHtcbiAgICByZXR1cm4gbG9hZGVyKCkudGhlbigobW9kdWxlKSA9PiB7XG4gICAgICB0aGlzLmNvbnRleHQgPSBtb2R1bGUuZGVmYXVsdDtcbiAgICAgIHRoaXMucHJvY2Vzc0NvbnRleHQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRUZW1wbGF0ZSh0ZW1wbGF0ZUlkID0gdGhpcy5jb250ZXh0LmRlZmF1bHQudGVtcGxhdGVJZCk6IFRlbXBsYXRlIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZUJ5SWRbdGVtcGxhdGVJZF07XG4gIH1cbn1cbiIsImltcG9ydCB7IERlZmluZUZvcm1TZXR1cE9wdGlvbnMgfSBmcm9tIFwiQC9oZWxwZXJzL2RlZmluZUZvcm1TZXR1cC90eXBlc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lRm9ybVNldHVwKG9wdGlvbnM6IERlZmluZUZvcm1TZXR1cE9wdGlvbnMpIHtcbiAgcmV0dXJuIG9wdGlvbnM7XG59XG4iLCJpbXBvcnQgeyBSYXdTY2hlbWFzIH0gZnJvbSBcIkAvaGVscGVycy9kZWZpbmVGb3JtU2NoZW1hL3R5cGVzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVGb3JtU2NoZW1hKHNjaGVtYXM6IFJhd1NjaGVtYXMpIHtcbiAgcmV0dXJuIHNjaGVtYXM7XG59XG4iLCJpbXBvcnQgeyBGb3JtQ29udGV4dCB9IGZyb20gXCJAL2NvcmUvY29udGV4dFwiO1xuaW1wb3J0IHsgSW5pdEZvcm1PcHRpb25zIH0gZnJvbSBcIkAvaGVscGVycy9pbml0Rm9ybS90eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgaW5pdEZvcm0gPSB7XG4gIGluc3RhbGwoYXBwOiBhbnksIG9wdGlvbnM6IEluaXRGb3JtT3B0aW9ucykge1xuICAgIGNvbnN0IHsgbG9hZGVyIH0gPSBvcHRpb25zO1xuICAgIGlmICghbG9hZGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJsb2FkZXIgaXMgcmVxdWlyZWQuXCIpO1xuICAgIH1cbiAgICBjb25zdCBvcmlnaW5hbE1vdW50ID0gYXBwLm1vdW50O1xuICAgIC8vIFRPRE8gcmVmYWN0b3JcbiAgICBpZiAob3B0aW9ucy5lbnYgPT09IFwid2VhcHBcIikge1xuICAgICAgYXBwLm1vdW50ID0gKHJvb3RDb250YWluZXI6IHN0cmluZykgPT4ge1xuICAgICAgICBGb3JtQ29udGV4dC5wYXJzZUxvYWRlcihsb2FkZXIpO1xuICAgICAgICByZXR1cm4gb3JpZ2luYWxNb3VudChyb290Q29udGFpbmVyKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwcC5tb3VudCA9IGFzeW5jIChyb290Q29udGFpbmVyOiBzdHJpbmcpID0+IHtcbiAgICAgICAgYXdhaXQgRm9ybUNvbnRleHQucGFyc2VMb2FkZXIobG9hZGVyKTtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsTW91bnQocm9vdENvbnRhaW5lcik7XG4gICAgICB9O1xuICAgIH1cbiAgfSxcbn07XG4iLCJpbXBvcnQgUnVudGltZSBmcm9tIFwiQC9jb3JlL3J1bnRpbWVcIjtcbmltcG9ydCB7IEN1c3RvbUFkYXB0ZXIgfSBmcm9tIFwiQC9oZWxwZXJzL2RlZmluZUZvcm1TZXR1cC90eXBlc1wiO1xuXG5leHBvcnQgY2xhc3MgQXJjb1Z1ZUFkYXB0ZXIgaW1wbGVtZW50cyBDdXN0b21BZGFwdGVyIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJ1bnRpbWU6IFJ1bnRpbWUpIHt9XG5cbiAgZm9ybU1vZGVsTmFtZSA9IFwibW9kZWxcIjtcbiAgZm9ybU1vZGVsS2V5ID0gXCJmaWVsZFwiO1xuXG4gIHZhbGlkYXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5ydW50aW1lLl9yZW5kZXIuZm9ybVJlZi52YWx1ZS52YWxpZGF0ZSgoZXJyb3JzOiBhbnkpID0+IHtcbiAgICAgICAgZXJyb3JzID8gcmVqZWN0KGVycm9ycykgOiByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IFJ1bnRpbWUgZnJvbSBcIkAvY29yZS9ydW50aW1lXCI7XG5pbXBvcnQgeyBDdXN0b21BZGFwdGVyIH0gZnJvbSBcIkAvaGVscGVycy9kZWZpbmVGb3JtU2V0dXAvdHlwZXNcIjtcblxuZXhwb3J0IGNsYXNzIE5haXZlVUlBZGFwdGVyIGltcGxlbWVudHMgQ3VzdG9tQWRhcHRlciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBydW50aW1lOiBSdW50aW1lKSB7fVxuXG4gIGZvcm1Nb2RlbE5hbWUgPSBcIm1vZGVsXCI7XG4gIGZvcm1Nb2RlbEtleSA9IFwia2V5XCI7XG5cbiAgdmFsaWRhdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnJ1bnRpbWUuX3JlbmRlci5mb3JtUmVmLnZhbHVlLnZhbGlkYXRlKChlcnJvcnM6IGFueSkgPT4ge1xuICAgICAgICBlcnJvcnMgPyByZWplY3QoZXJyb3JzKSA6IHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgUnVudGltZSBmcm9tIFwiQC9jb3JlL3J1bnRpbWVcIjtcbmltcG9ydCB7IEN1c3RvbUFkYXB0ZXIgfSBmcm9tIFwiQC9oZWxwZXJzL2RlZmluZUZvcm1TZXR1cC90eXBlc1wiO1xuXG5leHBvcnQgY2xhc3MgTnV0VUlBZGFwdGVyIGltcGxlbWVudHMgQ3VzdG9tQWRhcHRlciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBydW50aW1lOiBSdW50aW1lKSB7fVxuXG4gIGZvcm1Nb2RlbE5hbWUgPSBcIm1vZGVsVmFsdWVcIjtcbiAgZm9ybU1vZGVsS2V5ID0gXCJwcm9wXCI7XG5cbiAgdmFsaWRhdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnJ1bnRpbWUuX3JlbmRlci5mb3JtUmVmLnZhbHVlXG4gICAgICAgIC52YWxpZGF0ZSgpXG4gICAgICAgIC50aGVuKCh7IHZhbGlkLCBlcnJvcnMgfTogeyB2YWxpZDogYm9vbGVhbjsgZXJyb3JzOiBhbnkgfSkgPT4ge1xuICAgICAgICAgIHZhbGlkID8gcmVzb2x2ZSgpIDogcmVqZWN0KGVycm9ycyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBBcmNvVnVlQWRhcHRlciB9IGZyb20gXCJAL2NvcmUvYWRhcHRlci9BcmNvVnVlQWRhcHRlclwiO1xuaW1wb3J0IHsgTmFpdmVVSUFkYXB0ZXIgfSBmcm9tIFwiQC9jb3JlL2FkYXB0ZXIvTmFpdmVVSUFkYXB0ZXJcIjtcbmltcG9ydCB7IE51dFVJQWRhcHRlciB9IGZyb20gXCJAL2NvcmUvYWRhcHRlci9OdXRVSUFkYXB0ZXJcIjtcbmltcG9ydCB7IEZvcm1Db250ZXh0IH0gZnJvbSBcIkAvY29yZS9jb250ZXh0XCI7XG5pbXBvcnQgUnVudGltZSBmcm9tIFwiQC9jb3JlL3J1bnRpbWVcIjtcbmltcG9ydCB7IEN1c3RvbUFkYXB0ZXIgfSBmcm9tIFwiQC9oZWxwZXJzL2RlZmluZUZvcm1TZXR1cC90eXBlc1wiO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gXCJsb2Rhc2hcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWRhcHRlciB7XG4gIHByZXNldEFkYXB0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBhZGFwdGVlOiBDdXN0b21BZGFwdGVyID0ge30gYXMgQ3VzdG9tQWRhcHRlcjtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcnVudGltZTogUnVudGltZSkge1xuICAgIHRoaXMucHJlc2V0QWRhcHRlcnMgPSB7XG4gICAgICBBcmNvVnVlOiBuZXcgQXJjb1Z1ZUFkYXB0ZXIocnVudGltZSksXG4gICAgICBOdXRVSTogbmV3IE51dFVJQWRhcHRlcihydW50aW1lKSxcbiAgICAgIE5haXZlVUk6IG5ldyBOYWl2ZVVJQWRhcHRlcihydW50aW1lKSxcbiAgICB9O1xuICAgIHRoaXMuaW5pdEFkYXB0ZXJzKCk7XG4gIH1cblxuICBpbml0QWRhcHRlcnMoKSB7XG4gICAgLy8gVE9ETzogaW1wcm92ZSB0eXBlXG4gICAgY29uc3QgdGVtcGxhdGUgPSBGb3JtQ29udGV4dC5nZXRUZW1wbGF0ZShcbiAgICAgIHRoaXMucnVudGltZS5fb3B0aW9ucy50ZW1wbGF0ZUlkXG4gICAgKSBhcyBhbnk7XG4gICAgaWYgKHRlbXBsYXRlLmFkYXB0ZXIpIHtcbiAgICAgIGNvbnN0IHByZXNldEFkYXB0ZXIgPVxuICAgICAgICB0aGlzLnByZXNldEFkYXB0ZXJzW1xuICAgICAgICAgIHRlbXBsYXRlLmFkYXB0ZXIgYXMga2V5b2YgdHlwZW9mIHRoaXMucHJlc2V0QWRhcHRlcnNcbiAgICAgICAgXSA/PyB7fTtcbiAgICAgIHRoaXMuYWRhcHRlZSA9IHByZXNldEFkYXB0ZXI7XG4gICAgfVxuXG4gICAgLy8gY3VzdG9tIOeahOS8mOWFiOe6p+mrmOS6jiBwcmVzZXRcbiAgICBpZiAodGVtcGxhdGUuY3VzdG9tQWRhcHRlcikge1xuICAgICAgT2JqZWN0LmtleXModGVtcGxhdGUuY3VzdG9tQWRhcHRlcikuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGFkYXB0ZXIgPSB0ZW1wbGF0ZS5jdXN0b21BZGFwdGVyW2tleSBhcyBrZXlvZiBDdXN0b21BZGFwdGVyXTtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oYWRhcHRlcikpIHtcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgdGhpcy5hZGFwdGVlW2tleSBhcyBrZXlvZiBDdXN0b21BZGFwdGVyXSA9ICgpID0+XG4gICAgICAgICAgICBhZGFwdGVyKHRoaXMucnVudGltZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hZGFwdGVlW2tleSBhcyBrZXlvZiBDdXN0b21BZGFwdGVyXSA9IGFkYXB0ZXI7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOdW1iZXIsIGlzU3RyaW5nIH0gZnJvbSBcImxvZGFzaFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1lcmljTGlrZSh2YWx1ZTogc3RyaW5nKSB7XG4gIGlmIChpc051bWJlcih2YWx1ZSkpIHJldHVybiB0cnVlO1xuICBpZiAoIWlzU3RyaW5nKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBpbnRlZ2VyUmVnZXggPSAvXi0/XFxkKyQvO1xuICByZXR1cm4gaW50ZWdlclJlZ2V4LnRlc3QodmFsdWUpO1xufVxuIiwiaW1wb3J0IHsgaXNOdW1lcmljTGlrZSB9IGZyb20gXCJAL2NvcmUvc2VydmljZXMvaXNOdW1lcmljTGlrZVwiO1xuaW1wb3J0IHsgZm9yRWFjaCwgaXNFbXB0eSB9IGZyb20gXCJsb2Rhc2hcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHdyYXBwZXJOdW1lcmljTGlrZSh2YWx1ZTogc3RyaW5nKSB7XG4gIGlmIChpc051bWVyaWNMaWtlKHZhbHVlKSkge1xuICAgIHJldHVybiBgWyR7dmFsdWV9XWA7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhdmVyc2UoXG4gIHRyZWU6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHZpc2l0b3I6IChub2RlOiBhbnksIGtleTogc3RyaW5nLCBwYXJlbnRLZXk/OiBzdHJpbmcpID0+IGJvb2xlYW4gfCB2b2lkLFxuICBwYXJlbnRLZXk/OiBzdHJpbmdcbikge1xuICBmb3JFYWNoKHRyZWUsIChub2RlLCBrZXkpID0+IHtcbiAgICBpZiAodmlzaXRvcihub2RlLCBrZXksIHBhcmVudEtleSkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFpc0VtcHR5KG5vZGUuY2hpbGRyZW4pKSB7XG4gICAgICB0cmF2ZXJzZShcbiAgICAgICAgbm9kZS5jaGlsZHJlbixcbiAgICAgICAgdmlzaXRvcixcbiAgICAgICAgcGFyZW50S2V5XG4gICAgICAgICAgPyBgJHt3cmFwcGVyTnVtZXJpY0xpa2UocGFyZW50S2V5KX0uY2hpbGRyZW4uJHt3cmFwcGVyTnVtZXJpY0xpa2UoXG4gICAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgKX1gXG4gICAgICAgICAgOiB3cmFwcGVyTnVtZXJpY0xpa2Uoa2V5KVxuICAgICAgKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgaXNGdW5jdGlvbiwgaXNPYmplY3QgfSBmcm9tIFwibG9kYXNoXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb21pc2UodmFsdWU6IGFueSkge1xuICByZXR1cm4gKFxuICAgIHZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSB8fFxuICAgIChpc09iamVjdCh2YWx1ZSkgJiZcbiAgICAgIGlzRnVuY3Rpb24oKHZhbHVlIGFzIGFueSk/LnRoZW4pICYmXG4gICAgICBpc0Z1bmN0aW9uKCh2YWx1ZSBhcyBhbnkpPy5jYXRjaCkpXG4gICk7XG59XG4iLCJpbXBvcnQgeyBpc1BsYWluT2JqZWN0IH0gZnJvbSBcImxvZGFzaFwiO1xuXG4vLyBUT0RPOiDpnIDopoHmnInnsbvlnovkuIrnmoTnuqbmnZ/vvIzlvZMgY29tcG9uZW50IOWSjCBsYXlvdXQg5Li65a+56LGh5pe277yM6K6k5Li65piv5pyJ5pWI57uE5Lu277yM5Zug5Li65LuO5qaC5b+15LiK5p2l6K+077yMbGF5b3V0IOeahOWAvOWPquW6lOivpeaYr+Wtl+espuS4suaIluiAhee7hOS7tuWvueixoVxuLy8g5omA5Lul6L+Z5Liq5Ye95pWw6Zmk5LqG5Yik5pat5pys6Lqr55qEIGNvbXBvbmVudCDov5jlupTor6XliKTmlq3lrrnlmaggbGF5b3V0IOeahOWAvOaYr+WQpuS4uue7hOS7tuWvueixoVxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRDb21wb25lbnQocHJvcGVydHlLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCwgdmFsdWU6IGFueSkge1xuICBpZiAoIXByb3BlcnR5S2V5KSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBbXCJjb21wb25lbnRcIiwgXCJsYXlvdXRcIl0uaW5jbHVkZXMocHJvcGVydHlLZXkpICYmIGlzUGxhaW5PYmplY3QodmFsdWUpO1xufVxuIiwiLy8g5LuO57uZ5a6a6Lev5b6E5Lit5o+Q5Y+W5omA5pyJ5Y+v6IO955qE54i257qn6Lev5b6EXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyZW50UGF0aHMocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcmVudFBhdGhzID0gW107XG5cbiAgLy8g5L2/55So5q2j5YiZ6KGo6L6+5byP5YiG5Ymy6Lev5b6E77yM5L+d55WZ5YiG6ZqU56ymXG4gIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdCgvKFxcW3xcXF1cXC5jaGlsZHJlblxcLnxcXF0pLyk7XG5cbiAgLy8g6YeN5paw5p6E5bu66Lev5b6E55qE5ZCE5Liq5bGC57qnXG4gIGxldCBjdXJyZW50UGF0aCA9IFwiXCI7XG4gIGxldCBicmFja2V0Q291bnQgPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzZWdtZW50ID0gc2VnbWVudHNbaV07XG5cbiAgICBpZiAoc2VnbWVudCA9PT0gXCJbXCIpIHtcbiAgICAgIGN1cnJlbnRQYXRoICs9IHNlZ21lbnQ7XG4gICAgICBicmFja2V0Q291bnQrKztcbiAgICB9IGVsc2UgaWYgKHNlZ21lbnQgPT09IFwiXVwiKSB7XG4gICAgICBjdXJyZW50UGF0aCArPSBzZWdtZW50O1xuICAgICAgYnJhY2tldENvdW50LS07XG5cbiAgICAgIC8vIOW9k+aLrOWPt+W5s+ihoeaXtu+8jOivtOaYjuWujOaIkOS6huS4gOS4quWujOaVtOeahOi3r+W+hOautVxuICAgICAgaWYgKGJyYWNrZXRDb3VudCA9PT0gMCAmJiBjdXJyZW50UGF0aC50cmltKCkgIT09IFwiXCIpIHtcbiAgICAgICAgcGFyZW50UGF0aHMucHVzaChjdXJyZW50UGF0aCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzZWdtZW50ID09PSBcIl0uY2hpbGRyZW4uXCIpIHtcbiAgICAgIGN1cnJlbnRQYXRoICs9IFwiXVwiO1xuICAgICAgaWYgKGJyYWNrZXRDb3VudCA9PT0gMCAmJiBjdXJyZW50UGF0aC50cmltKCkgIT09IFwiXCIpIHtcbiAgICAgICAgcGFyZW50UGF0aHMucHVzaChjdXJyZW50UGF0aCk7XG4gICAgICB9XG4gICAgICBjdXJyZW50UGF0aCArPSBcIi5jaGlsZHJlbi5cIjtcbiAgICAgIGJyYWNrZXRDb3VudCA9IDA7XG4gICAgfSBlbHNlIGlmIChzZWdtZW50ICYmIHNlZ21lbnQgIT09IFwiXCIpIHtcbiAgICAgIGN1cnJlbnRQYXRoICs9IHNlZ21lbnQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcmVudFBhdGhzO1xufVxuXG4vLyDmm7TnroDmtIHnmoTmlrnms5XvvJrnm7TmjqXku47ot6/lvoTkuK3mj5Dlj5bnm7TmjqXniLbnuqdcbmV4cG9ydCBmdW5jdGlvbiBnZXREaXJlY3RQYXJlbnQocGF0aDogc3RyaW5nKSB7XG4gIC8vIOWMuemFjeacgOWQjuS4gOS4qiAuY2hpbGRyZW4uW+aVsOWtl10g5qih5byPXG4gIGNvbnN0IG1hdGNoID0gcGF0aC5tYXRjaCgvXiguKylcXC5jaGlsZHJlblxcLlxcW1xcZCtcXF0kLyk7XG4gIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdIDogbnVsbDtcbn1cblxuLy8g6I635Y+W5omA5pyJ56WW5YWI6Lev5b6E77yI5LuO55u05o6l54i257qn5Yiw5qC557qn77yJXG5mdW5jdGlvbiBnZXRBbGxBbmNlc3RvclBhdGhzKHBhdGg6IHN0cmluZykge1xuICBjb25zdCBhbmNlc3RvcnMgPSBbXTtcbiAgbGV0IGN1cnJlbnRQYXRoID0gcGF0aDtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IHBhcmVudCA9IGdldERpcmVjdFBhcmVudChjdXJyZW50UGF0aCk7XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgYW5jZXN0b3JzLnB1c2gocGFyZW50KTtcbiAgICAgIGN1cnJlbnRQYXRoID0gcGFyZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYW5jZXN0b3JzO1xufVxuXG4vLyDmo4Dmn6Xnu5nlrprot6/lvoTnmoTniLbnuqfmmK/lkKblrZjlnKjkuo5NYXDkuK1cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1BhcmVudEV4aXN0cyhtYXA6IE1hcDxzdHJpbmcsIGFueT4sIGNoaWxkUGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGRpcmVjdFBhcmVudCA9IGdldERpcmVjdFBhcmVudChjaGlsZFBhdGgpO1xuICByZXR1cm4gZGlyZWN0UGFyZW50ID8gbWFwLmhhcyhkaXJlY3RQYXJlbnQpIDogZmFsc2U7XG59XG5cbi8vIOajgOafpee7meWumui3r+W+hOeahOaJgOacieelluWFiOaYr+WQpuWtmOWcqOS6jk1hcOS4rVxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrUmVsYXRpb25zKG1hcDogTWFwPHN0cmluZywgYW55PiwgY2hpbGRQYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgYW5jZXN0b3JzID0gZ2V0QWxsQW5jZXN0b3JQYXRocyhjaGlsZFBhdGgpO1xuICBjb25zdCBleGlzdGluZ0FuY2VzdG9yczogc3RyaW5nW10gPSBbXTtcblxuICAvLyDpppblhYjmt7vliqDlvZPliY3ot6/lvoTmnKzouqvvvIjlpoLmnpzlrZjlnKjkuo4gbWFwIOS4re+8iVxuICBpZiAobWFwLmhhcyhjaGlsZFBhdGgpKSB7XG4gICAgZXhpc3RpbmdBbmNlc3RvcnMucHVzaChjaGlsZFBhdGgpO1xuICB9XG5cbiAgLy8g54S25ZCO5re75Yqg5a2Y5Zyo55qE56WW5YWI6Lev5b6EXG4gIGFuY2VzdG9ycy5mb3JFYWNoKChhbmNlc3RvcikgPT4ge1xuICAgIGlmIChtYXAuaGFzKGFuY2VzdG9yKSkge1xuICAgICAgZXhpc3RpbmdBbmNlc3RvcnMucHVzaChhbmNlc3Rvcik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIGlzTGlzdENoaWxkOiBleGlzdGluZ0FuY2VzdG9ycy5sZW5ndGggPiAwLFxuICAgIGV4aXN0aW5nUmVsYXRpb25zOiBleGlzdGluZ0FuY2VzdG9ycy5tYXAoKGFuY2VzdG9yKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gbWFwLmdldChhbmNlc3Rvcik7XG4gICAgICBjb25zdCBkaXJlY3RQYXJlbnQgPSBnZXREaXJlY3RQYXJlbnQoYW5jZXN0b3IpO1xuICAgICAgY29uc3QgcGFyZW50ID0gZGlyZWN0UGFyZW50ID8gbWFwLmdldChkaXJlY3RQYXJlbnQpIDogbnVsbDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3VycmVudCxcbiAgICAgICAgcGFyZW50LFxuICAgICAgfTtcbiAgICB9KSxcbiAgfTtcbn1cbiIsImV4cG9ydCBjb25zdCBQQVRIX1NFUEFSQVRPUiA9ICcuJztcbmV4cG9ydCBjb25zdCBUQVJHRVQgPSBTeW1ib2woJ3RhcmdldCcpO1xuZXhwb3J0IGNvbnN0IFVOU1VCU0NSSUJFID0gU3ltYm9sKCd1bnN1YnNjcmliZScpO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGlzQnVpbHRpbldpdGhNdXRhYmxlTWV0aG9kcyh2YWx1ZSkge1xuXHRyZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlXG5cdFx0fHwgdmFsdWUgaW5zdGFuY2VvZiBTZXRcblx0XHR8fCB2YWx1ZSBpbnN0YW5jZW9mIE1hcFxuXHRcdHx8IHZhbHVlIGluc3RhbmNlb2YgV2Vha1NldFxuXHRcdHx8IHZhbHVlIGluc3RhbmNlb2YgV2Vha01hcFxuXHRcdHx8IEFycmF5QnVmZmVyLmlzVmlldyh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0J1aWx0aW5XaXRob3V0TXV0YWJsZU1ldGhvZHModmFsdWUpIHtcblx0Ly8gUHJpbWl0aXZlcyBhbmQgbnVsbCDihpIgdHJ1ZS4gRnVuY3Rpb25zIOKGkiBmYWxzZS4gUmVnRXhwIOKGkiB0cnVlLlxuXHRyZXR1cm4gdmFsdWUgPT09IG51bGxcblx0XHR8fCAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpXG5cdFx0fHwgdmFsdWUgaW5zdGFuY2VvZiBSZWdFeHA7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJztcbn1cbiIsImltcG9ydCB7UEFUSF9TRVBBUkFUT1J9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCBpc1N5bWJvbCBmcm9tICcuL2lzLXN5bWJvbC5qcyc7XG5cbmNvbnN0IHBhdGggPSB7XG5cdGFmdGVyKHBhdGgsIHN1YlBhdGgpIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkge1xuXHRcdFx0cmV0dXJuIHBhdGguc2xpY2Uoc3ViUGF0aC5sZW5ndGgpO1xuXHRcdH1cblxuXHRcdGlmIChzdWJQYXRoID09PSAnJykge1xuXHRcdFx0cmV0dXJuIHBhdGg7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBhdGguc2xpY2Uoc3ViUGF0aC5sZW5ndGggKyAxKTtcblx0fSxcblx0Y29uY2F0KHBhdGgsIGtleSkge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHBhdGgpKSB7XG5cdFx0XHRwYXRoID0gWy4uLnBhdGhdO1xuXG5cdFx0XHRpZiAoa2V5KSB7XG5cdFx0XHRcdHBhdGgucHVzaChrZXkpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcGF0aDtcblx0XHR9XG5cblx0XHRpZiAoa2V5ICYmIGtleS50b1N0cmluZyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAocGF0aCAhPT0gJycpIHtcblx0XHRcdFx0cGF0aCArPSBQQVRIX1NFUEFSQVRPUjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGlzU3ltYm9sKGtleSkpIHtcblx0XHRcdFx0cmV0dXJuIHBhdGggKyBrZXkudG9TdHJpbmcoKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHBhdGggKyBrZXk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBhdGg7XG5cdH0sXG5cdGluaXRpYWwocGF0aCkge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHBhdGgpKSB7XG5cdFx0XHRyZXR1cm4gcGF0aC5zbGljZSgwLCAtMSk7XG5cdFx0fVxuXG5cdFx0aWYgKHBhdGggPT09ICcnKSB7XG5cdFx0XHRyZXR1cm4gcGF0aDtcblx0XHR9XG5cblx0XHRjb25zdCBpbmRleCA9IHBhdGgubGFzdEluZGV4T2YoUEFUSF9TRVBBUkFUT1IpO1xuXG5cdFx0aWYgKGluZGV4ID09PSAtMSkge1xuXHRcdFx0cmV0dXJuICcnO1xuXHRcdH1cblxuXHRcdHJldHVybiBwYXRoLnNsaWNlKDAsIGluZGV4KTtcblx0fSxcblx0bGFzdChwYXRoKSB7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHtcblx0XHRcdHJldHVybiBwYXRoLmF0KC0xKSA/PyAnJztcblx0XHR9XG5cblx0XHRpZiAocGF0aCA9PT0gJycpIHtcblx0XHRcdHJldHVybiBwYXRoO1xuXHRcdH1cblxuXHRcdGNvbnN0IGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZihQQVRIX1NFUEFSQVRPUik7XG5cblx0XHRpZiAoaW5kZXggPT09IC0xKSB7XG5cdFx0XHRyZXR1cm4gcGF0aDtcblx0XHR9XG5cblx0XHRyZXR1cm4gcGF0aC5zbGljZShpbmRleCArIDEpO1xuXHR9LFxuXHR3YWxrKHBhdGgsIGNhbGxiYWNrKSB7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHtcblx0XHRcdGZvciAoY29uc3Qga2V5IG9mIHBhdGgpIHtcblx0XHRcdFx0Y2FsbGJhY2soa2V5KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHBhdGggIT09ICcnKSB7XG5cdFx0XHRsZXQgcG9zaXRpb24gPSAwO1xuXHRcdFx0bGV0IGluZGV4ID0gcGF0aC5pbmRleE9mKFBBVEhfU0VQQVJBVE9SKTtcblxuXHRcdFx0aWYgKGluZGV4ID09PSAtMSkge1xuXHRcdFx0XHRjYWxsYmFjayhwYXRoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdoaWxlIChwb3NpdGlvbiA8IHBhdGgubGVuZ3RoKSB7XG5cdFx0XHRcdFx0aWYgKGluZGV4ID09PSAtMSkge1xuXHRcdFx0XHRcdFx0aW5kZXggPSBwYXRoLmxlbmd0aDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjYWxsYmFjayhwYXRoLnNsaWNlKHBvc2l0aW9uLCBpbmRleCkpO1xuXG5cdFx0XHRcdFx0cG9zaXRpb24gPSBpbmRleCArIDE7XG5cdFx0XHRcdFx0aW5kZXggPSBwYXRoLmluZGV4T2YoUEFUSF9TRVBBUkFUT1IsIHBvc2l0aW9uKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0Z2V0KG9iamVjdCwgcGF0aCkge1xuXHRcdHRoaXMud2FsayhwYXRoLCBrZXkgPT4ge1xuXHRcdFx0b2JqZWN0ICYmPSBvYmplY3Rba2V5XTtcblx0XHR9KTtcblxuXHRcdHJldHVybiBvYmplY3Q7XG5cdH0sXG5cdGlzU3ViUGF0aChwYXRoLCBzdWJQYXRoKSB7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHtcblx0XHRcdGlmIChwYXRoLmxlbmd0aCA8IHN1YlBhdGgubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbm8tZm9yLWxvb3Bcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc3ViUGF0aC5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocGF0aFtpXSAhPT0gc3ViUGF0aFtpXSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAocGF0aC5sZW5ndGggPCBzdWJQYXRoLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGlmIChwYXRoID09PSBzdWJQYXRoKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAocGF0aC5zdGFydHNXaXRoKHN1YlBhdGgpKSB7XG5cdFx0XHRyZXR1cm4gcGF0aFtzdWJQYXRoLmxlbmd0aF0gPT09IFBBVEhfU0VQQVJBVE9SO1xuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblx0aXNSb290UGF0aChwYXRoKSB7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHtcblx0XHRcdHJldHVybiBwYXRoLmxlbmd0aCA9PT0gMDtcblx0XHR9XG5cblx0XHRyZXR1cm4gcGF0aCA9PT0gJyc7XG5cdH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBwYXRoO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcblx0cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNJdGVyYXRvcih2YWx1ZSkge1xuXHRyZXR1cm4gdmFsdWUgIT09IG51bGxcblx0XHQmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG5cdFx0JiYgdHlwZW9mIHZhbHVlLm5leHQgPT09ICdmdW5jdGlvbic7XG59XG4iLCJpbXBvcnQge1RBUkdFVH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuXG4vKipcbldyYXBzIGFuIGl0ZXJhdG9yJ3MgYG5leHQoKWAgc28geWllbGRlZCB2YWx1ZXMgKG9yIFtrZXksIHZhbHVlXSBwYWlycykgYXJlIHBhc3NlZCB0aHJvdWdoIGBwcmVwYXJlVmFsdWVgIHdpdGggdGhlIGNvcnJlY3Qgb3duZXIgYW5kIHBhdGguXG4qL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1wYXJhbXNcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdyYXBJdGVyYXRvcihpdGVyYXRvciwgdGFyZ2V0LCB0aGlzQXJndW1lbnQsIGFwcGx5UGF0aCwgcHJlcGFyZVZhbHVlKSB7XG5cdGNvbnN0IG9yaWdpbmFsTmV4dCA9IGl0ZXJhdG9yPy5uZXh0O1xuXHRpZiAodHlwZW9mIG9yaWdpbmFsTmV4dCAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdHJldHVybiBpdGVyYXRvcjtcblx0fVxuXG5cdGlmICh0YXJnZXQubmFtZSA9PT0gJ2VudHJpZXMnKSB7XG5cdFx0aXRlcmF0b3IubmV4dCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdGNvbnN0IHJlc3VsdCA9IG9yaWdpbmFsTmV4dC5jYWxsKHRoaXMpO1xuXG5cdFx0XHRpZiAocmVzdWx0ICYmIHJlc3VsdC5kb25lID09PSBmYWxzZSkge1xuXHRcdFx0XHRyZXN1bHQudmFsdWVbMF0gPSBwcmVwYXJlVmFsdWUoXG5cdFx0XHRcdFx0cmVzdWx0LnZhbHVlWzBdLFxuXHRcdFx0XHRcdHRhcmdldCxcblx0XHRcdFx0XHRyZXN1bHQudmFsdWVbMF0sXG5cdFx0XHRcdFx0YXBwbHlQYXRoLFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRyZXN1bHQudmFsdWVbMV0gPSBwcmVwYXJlVmFsdWUoXG5cdFx0XHRcdFx0cmVzdWx0LnZhbHVlWzFdLFxuXHRcdFx0XHRcdHRhcmdldCxcblx0XHRcdFx0XHRyZXN1bHQudmFsdWVbMF0sXG5cdFx0XHRcdFx0YXBwbHlQYXRoLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH07XG5cdH0gZWxzZSBpZiAodGFyZ2V0Lm5hbWUgPT09ICd2YWx1ZXMnKSB7XG5cdFx0Y29uc3Qga2V5SXRlcmF0b3IgPSB0aGlzQXJndW1lbnRbVEFSR0VUXS5rZXlzKCk7XG5cblx0XHRpdGVyYXRvci5uZXh0ID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gb3JpZ2luYWxOZXh0LmNhbGwodGhpcyk7XG5cblx0XHRcdGlmIChyZXN1bHQgJiYgcmVzdWx0LmRvbmUgPT09IGZhbHNlKSB7XG5cdFx0XHRcdHJlc3VsdC52YWx1ZSA9IHByZXBhcmVWYWx1ZShcblx0XHRcdFx0XHRyZXN1bHQudmFsdWUsXG5cdFx0XHRcdFx0dGFyZ2V0LFxuXHRcdFx0XHRcdGtleUl0ZXJhdG9yLm5leHQoKS52YWx1ZSxcblx0XHRcdFx0XHRhcHBseVBhdGgsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRpdGVyYXRvci5uZXh0ID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gb3JpZ2luYWxOZXh0LmNhbGwodGhpcyk7XG5cblx0XHRcdGlmIChyZXN1bHQgJiYgcmVzdWx0LmRvbmUgPT09IGZhbHNlKSB7XG5cdFx0XHRcdHJlc3VsdC52YWx1ZSA9IHByZXBhcmVWYWx1ZShcblx0XHRcdFx0XHRyZXN1bHQudmFsdWUsXG5cdFx0XHRcdFx0dGFyZ2V0LFxuXHRcdFx0XHRcdHJlc3VsdC52YWx1ZSxcblx0XHRcdFx0XHRhcHBseVBhdGgsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fTtcblx0fVxuXG5cdHJldHVybiBpdGVyYXRvcjtcbn1cbiIsImltcG9ydCBpc1N5bWJvbCBmcm9tICcuL2lzLXN5bWJvbC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlnbm9yZVByb3BlcnR5KGNhY2hlLCBvcHRpb25zLCBwcm9wZXJ0eSkge1xuXHRpZiAoY2FjaGUuaXNVbnN1YnNjcmliZWQpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGlmIChvcHRpb25zLmlnbm9yZVN5bWJvbHMgJiYgaXNTeW1ib2wocHJvcGVydHkpKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvLyBPbmx5IHN0cmluZ3MgY2FuIGJlIHByZWZpeGVkIHdpdGggXCJfXCJcblx0aWYgKG9wdGlvbnMuaWdub3JlVW5kZXJzY29yZXMgJiYgdHlwZW9mIHByb3BlcnR5ID09PSAnc3RyaW5nJyAmJiBwcm9wZXJ0eS5jaGFyQXQoMCkgPT09ICdfJykge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Y29uc3Qga2V5cyA9IG9wdGlvbnMuaWdub3JlS2V5cztcblx0aWYgKGtleXMpIHtcblx0XHRyZXR1cm4gQXJyYXkuaXNBcnJheShrZXlzKSA/IGtleXMuaW5jbHVkZXMocHJvcGVydHkpIDogKGtleXMgaW5zdGFuY2VvZiBTZXQgPyBrZXlzLmhhcyhwcm9wZXJ0eSkgOiBmYWxzZSk7XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICcuL3BhdGguanMnO1xuXG4vKipcbkBjbGFzcyBDYWNoZVxuQHByaXZhdGVcbiovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYWNoZSB7XG5cdGNvbnN0cnVjdG9yKGVxdWFscykge1xuXHRcdHRoaXMuX2VxdWFscyA9IGVxdWFscztcblx0XHR0aGlzLl9wcm94eUNhY2hlID0gbmV3IFdlYWtNYXAoKTtcblx0XHR0aGlzLl9wYXRoQ2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuXHRcdHRoaXMuX2FsbFBhdGhzQ2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuXHRcdHRoaXMuaXNVbnN1YnNjcmliZWQgPSBmYWxzZTtcblx0fVxuXG5cdF9wYXRoc0VxdWFsKHBhdGhBLCBwYXRoQikge1xuXHRcdGlmICghQXJyYXkuaXNBcnJheShwYXRoQSkgfHwgIUFycmF5LmlzQXJyYXkocGF0aEIpKSB7XG5cdFx0XHRyZXR1cm4gcGF0aEEgPT09IHBhdGhCO1xuXHRcdH1cblxuXHRcdHJldHVybiBwYXRoQS5sZW5ndGggPT09IHBhdGhCLmxlbmd0aFxuXHRcdFx0JiYgcGF0aEEuZXZlcnkoKHBhcnQsIGluZGV4KSA9PiBwYXJ0ID09PSBwYXRoQltpbmRleF0pO1xuXHR9XG5cblx0X2dldERlc2NyaXB0b3JDYWNoZSgpIHtcblx0XHRpZiAodGhpcy5fZGVzY3JpcHRvckNhY2hlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuX2Rlc2NyaXB0b3JDYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX2Rlc2NyaXB0b3JDYWNoZTtcblx0fVxuXG5cdF9nZXRQcm9wZXJ0aWVzKHRhcmdldCkge1xuXHRcdGNvbnN0IGRlc2NyaXB0b3JDYWNoZSA9IHRoaXMuX2dldERlc2NyaXB0b3JDYWNoZSgpO1xuXHRcdGxldCBwcm9wZXJ0aWVzID0gZGVzY3JpcHRvckNhY2hlLmdldCh0YXJnZXQpO1xuXG5cdFx0aWYgKHByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cHJvcGVydGllcyA9IHt9O1xuXHRcdFx0ZGVzY3JpcHRvckNhY2hlLnNldCh0YXJnZXQsIHByb3BlcnRpZXMpO1xuXHRcdH1cblxuXHRcdHJldHVybiBwcm9wZXJ0aWVzO1xuXHR9XG5cblx0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3BlcnR5KSB7XG5cdFx0aWYgKHRoaXMuaXNVbnN1YnNjcmliZWQpIHtcblx0XHRcdHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3BlcnR5KTtcblx0XHR9XG5cblx0XHRjb25zdCBwcm9wZXJ0aWVzID0gdGhpcy5fZ2V0UHJvcGVydGllcyh0YXJnZXQpO1xuXHRcdGxldCBkZXNjcmlwdG9yID0gcHJvcGVydGllc1twcm9wZXJ0eV07XG5cblx0XHRpZiAoZGVzY3JpcHRvciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRkZXNjcmlwdG9yID0gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wZXJ0eSk7XG5cdFx0XHRwcm9wZXJ0aWVzW3Byb3BlcnR5XSA9IGRlc2NyaXB0b3I7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlc2NyaXB0b3I7XG5cdH1cblxuXHRnZXRQcm94eSh0YXJnZXQsIHBhdGgsIGhhbmRsZXIsIHByb3h5VGFyZ2V0KSB7XG5cdFx0aWYgKHRoaXMuaXNVbnN1YnNjcmliZWQpIHtcblx0XHRcdHJldHVybiB0YXJnZXQ7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVmbGVjdFRhcmdldCA9IHByb3h5VGFyZ2V0ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB0YXJnZXRbcHJveHlUYXJnZXRdO1xuXHRcdGNvbnN0IHNvdXJjZSA9IHJlZmxlY3RUYXJnZXQgPz8gdGFyZ2V0O1xuXG5cdFx0Ly8gQWx3YXlzIHNldCB0aGUgcHJpbWFyeSBwYXRoIChmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSlcblx0XHR0aGlzLl9wYXRoQ2FjaGUuc2V0KHNvdXJjZSwgcGF0aCk7XG5cblx0XHQvLyBUcmFjayBhbGwgcGF0aHMgZm9yIHRoaXMgb2JqZWN0XG5cdFx0bGV0IGFsbFBhdGhzID0gdGhpcy5fYWxsUGF0aHNDYWNoZS5nZXQoc291cmNlKTtcblx0XHRpZiAoIWFsbFBhdGhzKSB7XG5cdFx0XHRhbGxQYXRocyA9IFtdO1xuXHRcdFx0dGhpcy5fYWxsUGF0aHNDYWNoZS5zZXQoc291cmNlLCBhbGxQYXRocyk7XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHBhdGggaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0XG5cdFx0Y29uc3QgcGF0aEV4aXN0cyA9IGFsbFBhdGhzLnNvbWUoZXhpc3RpbmdQYXRoID0+IHRoaXMuX3BhdGhzRXF1YWwoZXhpc3RpbmdQYXRoLCBwYXRoKSk7XG5cdFx0aWYgKCFwYXRoRXhpc3RzKSB7XG5cdFx0XHRhbGxQYXRocy5wdXNoKHBhdGgpO1xuXHRcdH1cblxuXHRcdGxldCBwcm94eSA9IHRoaXMuX3Byb3h5Q2FjaGUuZ2V0KHNvdXJjZSk7XG5cblx0XHRpZiAocHJveHkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cHJveHkgPSByZWZsZWN0VGFyZ2V0ID09PSB1bmRlZmluZWRcblx0XHRcdFx0PyBuZXcgUHJveHkodGFyZ2V0LCBoYW5kbGVyKVxuXHRcdFx0XHQ6IHRhcmdldDtcblxuXHRcdFx0dGhpcy5fcHJveHlDYWNoZS5zZXQoc291cmNlLCBwcm94eSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByb3h5O1xuXHR9XG5cblx0Z2V0UGF0aCh0YXJnZXQpIHtcblx0XHRyZXR1cm4gdGhpcy5pc1Vuc3Vic2NyaWJlZCA/IHVuZGVmaW5lZCA6IHRoaXMuX3BhdGhDYWNoZS5nZXQodGFyZ2V0KTtcblx0fVxuXG5cdGdldEFsbFBhdGhzKHRhcmdldCkge1xuXHRcdGlmICh0aGlzLmlzVW5zdWJzY3JpYmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLl9hbGxQYXRoc0NhY2hlLmdldCh0YXJnZXQpO1xuXHR9XG5cblx0aXNEZXRhY2hlZCh0YXJnZXQsIG9iamVjdCkge1xuXHRcdHJldHVybiAhT2JqZWN0LmlzKHRhcmdldCwgcGF0aC5nZXQob2JqZWN0LCB0aGlzLmdldFBhdGgodGFyZ2V0KSkpO1xuXHR9XG5cblx0ZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvcikge1xuXHRcdGlmICghUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5LCBkZXNjcmlwdG9yKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5pc1Vuc3Vic2NyaWJlZCkge1xuXHRcdFx0dGhpcy5fZ2V0UHJvcGVydGllcyh0YXJnZXQpW3Byb3BlcnR5XSA9IGRlc2NyaXB0b3I7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRzZXRQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSwgcmVjZWl2ZXIsIHByZXZpb3VzKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbWF4LXBhcmFtc1xuXHRcdGlmICghdGhpcy5fZXF1YWxzKHByZXZpb3VzLCB2YWx1ZSkgfHwgIShwcm9wZXJ0eSBpbiB0YXJnZXQpKSB7XG5cdFx0XHQvLyBDaGVjayBpZiB0aGVyZSdzIGEgc2V0dGVyIGFueXdoZXJlIGluIHRoZSBwcm90b3R5cGUgY2hhaW5cblx0XHRcdGxldCBoYXNTZXR0ZXJJbkNoYWluID0gZmFsc2U7XG5cdFx0XHRsZXQgY3VycmVudCA9IHRhcmdldDtcblx0XHRcdHdoaWxlIChjdXJyZW50KSB7XG5cdFx0XHRcdGNvbnN0IGRlc2NyaXB0b3IgPSBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjdXJyZW50LCBwcm9wZXJ0eSk7XG5cblx0XHRcdFx0aWYgKGRlc2NyaXB0b3IgJiYgJ3NldCcgaW4gZGVzY3JpcHRvcikge1xuXHRcdFx0XHRcdGhhc1NldHRlckluQ2hhaW4gPSB0cnVlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGhhc1NldHRlckluQ2hhaW4pIHtcblx0XHRcdFx0Ly8gVXNlIHJlY2VpdmVyIHRvIGVuc3VyZSBzZXR0ZXIgZ2V0cyBwcm94eSBhcyAndGhpcydcblx0XHRcdFx0cmV0dXJuIFJlZmxlY3Quc2V0KHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCByZWNlaXZlcik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvciBzaW1wbGUgcHJvcGVydGllcywgZG9uJ3QgdXNlIHJlY2VpdmVyIHRvIG1haW50YWluIGV4aXN0aW5nIGJlaGF2aW9yXG5cdFx0XHRyZXR1cm4gUmVmbGVjdC5zZXQodGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0ZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eSwgcHJldmlvdXMpIHtcblx0XHRpZiAoUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5KSkge1xuXHRcdFx0aWYgKCF0aGlzLmlzVW5zdWJzY3JpYmVkKSB7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLl9nZXREZXNjcmlwdG9yQ2FjaGUoKS5nZXQodGFyZ2V0KTtcblxuXHRcdFx0XHRpZiAocHJvcGVydGllcykge1xuXHRcdFx0XHRcdGRlbGV0ZSBwcm9wZXJ0aWVzW3Byb3BlcnR5XTtcblx0XHRcdFx0XHR0aGlzLl9wYXRoQ2FjaGUuZGVsZXRlKHByZXZpb3VzKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRpc1NhbWVEZXNjcmlwdG9yKGEsIHRhcmdldCwgcHJvcGVydHkpIHtcblx0XHRjb25zdCBiID0gdGhpcy5fZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcGVydHkpO1xuXG5cdFx0cmV0dXJuIGEgIT09IHVuZGVmaW5lZFxuXHRcdFx0JiYgYiAhPT0gdW5kZWZpbmVkXG5cdFx0XHQmJiBPYmplY3QuaXMoYS52YWx1ZSwgYi52YWx1ZSlcblx0XHRcdCYmIChhLndyaXRhYmxlIHx8IGZhbHNlKSA9PT0gKGIud3JpdGFibGUgfHwgZmFsc2UpXG5cdFx0XHQmJiAoYS5lbnVtZXJhYmxlIHx8IGZhbHNlKSA9PT0gKGIuZW51bWVyYWJsZSB8fCBmYWxzZSlcblx0XHRcdCYmIChhLmNvbmZpZ3VyYWJsZSB8fCBmYWxzZSkgPT09IChiLmNvbmZpZ3VyYWJsZSB8fCBmYWxzZSlcblx0XHRcdCYmIGEuZ2V0ID09PSBiLmdldFxuXHRcdFx0JiYgYS5zZXQgPT09IGIuc2V0O1xuXHR9XG5cblx0aXNHZXRJbnZhcmlhbnQodGFyZ2V0LCBwcm9wZXJ0eSkge1xuXHRcdGNvbnN0IGRlc2NyaXB0b3IgPSB0aGlzLl9nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wZXJ0eSk7XG5cblx0XHRyZXR1cm4gZGVzY3JpcHRvciAhPT0gdW5kZWZpbmVkXG5cdFx0XHQmJiBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSAhPT0gdHJ1ZVxuXHRcdFx0JiYgZGVzY3JpcHRvci53cml0YWJsZSAhPT0gdHJ1ZTtcblx0fVxuXG5cdHVuc3Vic2NyaWJlKCkge1xuXHRcdHRoaXMuX2Rlc2NyaXB0b3JDYWNoZSA9IG51bGw7XG5cdFx0dGhpcy5fcGF0aENhY2hlID0gbnVsbDtcblx0XHR0aGlzLl9wcm94eUNhY2hlID0gbnVsbDtcblx0XHR0aGlzLl9hbGxQYXRoc0NhY2hlID0gbnVsbDtcblx0XHR0aGlzLmlzVW5zdWJzY3JpYmVkID0gdHJ1ZTtcblx0fVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgQXJyYXkuaXNBcnJheTtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzRGlmZkNlcnRhaW4oKSB7XG5cdHJldHVybiB0cnVlO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNEaWZmQXJyYXlzKGNsb25lLCB2YWx1ZSkge1xuXHRpZiAoY2xvbmUgPT09IHZhbHVlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmV0dXJuIGNsb25lLmxlbmd0aCAhPT0gdmFsdWUubGVuZ3RoXG5cdFx0fHwgY2xvbmUuc29tZSgoaXRlbSwgaW5kZXgpID0+IHZhbHVlW2luZGV4XSAhPT0gaXRlbSk7XG59XG4iLCJleHBvcnQgY29uc3QgSU1NVVRBQkxFX09CSkVDVF9NRVRIT0RTID0gbmV3IFNldChbXG5cdCdoYXNPd25Qcm9wZXJ0eScsXG5cdCdpc1Byb3RvdHlwZU9mJyxcblx0J3Byb3BlcnR5SXNFbnVtZXJhYmxlJyxcblx0J3RvTG9jYWxlU3RyaW5nJyxcblx0J3RvU3RyaW5nJyxcblx0J3ZhbHVlT2YnLFxuXSk7XG4iLCJpbXBvcnQgaXNEaWZmQ2VydGFpbiBmcm9tICcuLi9kaWZmL2lzLWRpZmYtY2VydGFpbi5qcyc7XG5pbXBvcnQgaXNEaWZmQXJyYXlzIGZyb20gJy4uL2RpZmYvaXMtZGlmZi1hcnJheXMuanMnO1xuaW1wb3J0IHtJTU1VVEFCTEVfT0JKRUNUX01FVEhPRFN9IGZyb20gJy4vb2JqZWN0LmpzJztcblxuY29uc3QgSU1NVVRBQkxFX0FSUkFZX01FVEhPRFMgPSBuZXcgU2V0KFtcblx0J2NvbmNhdCcsXG5cdCdpbmNsdWRlcycsXG5cdCdpbmRleE9mJyxcblx0J2pvaW4nLFxuXHQna2V5cycsXG5cdCdsYXN0SW5kZXhPZicsXG5dKTtcblxuZXhwb3J0IGNvbnN0IE1VVEFCTEVfQVJSQVlfTUVUSE9EUyA9IHtcblx0cHVzaDogaXNEaWZmQ2VydGFpbixcblx0cG9wOiBpc0RpZmZDZXJ0YWluLFxuXHRzaGlmdDogaXNEaWZmQ2VydGFpbixcblx0dW5zaGlmdDogaXNEaWZmQ2VydGFpbixcblx0Y29weVdpdGhpbjogaXNEaWZmQXJyYXlzLFxuXHRyZXZlcnNlOiBpc0RpZmZBcnJheXMsXG5cdHNvcnQ6IGlzRGlmZkFycmF5cyxcblx0c3BsaWNlOiBpc0RpZmZBcnJheXMsXG5cdGZsYXQ6IGlzRGlmZkFycmF5cyxcblx0ZmlsbDogaXNEaWZmQXJyYXlzLFxufTtcblxuZXhwb3J0IGNvbnN0IEhBTkRMRURfQVJSQVlfTUVUSE9EUyA9IG5ldyBTZXQoW1xuXHQuLi5JTU1VVEFCTEVfT0JKRUNUX01FVEhPRFMsXG5cdC4uLklNTVVUQUJMRV9BUlJBWV9NRVRIT0RTLFxuXHQuLi5PYmplY3Qua2V5cyhNVVRBQkxFX0FSUkFZX01FVEhPRFMpLFxuXSk7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0RpZmZTZXRzKGNsb25lLCB2YWx1ZSkge1xuXHRpZiAoY2xvbmUgPT09IHZhbHVlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0aWYgKGNsb25lLnNpemUgIT09IHZhbHVlLnNpemUpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGZvciAoY29uc3QgZWxlbWVudCBvZiBjbG9uZSkge1xuXHRcdGlmICghdmFsdWUuaGFzKGVsZW1lbnQpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59XG4iLCJpbXBvcnQgaXNEaWZmU2V0cyBmcm9tICcuLi9kaWZmL2lzLWRpZmYtc2V0cy5qcyc7XG5cbmV4cG9ydCBjb25zdCBDT0xMRUNUSU9OX0lURVJBVE9SX01FVEhPRFMgPSBbXG5cdCdrZXlzJyxcblx0J3ZhbHVlcycsXG5cdCdlbnRyaWVzJyxcbl07XG5cbmV4cG9ydCBjb25zdCBJTU1VVEFCTEVfU0VUX01FVEhPRFMgPSBuZXcgU2V0KFtcblx0J2hhcycsXG5cdCd0b1N0cmluZycsXG5dKTtcblxuZXhwb3J0IGNvbnN0IE1VVEFCTEVfU0VUX01FVEhPRFMgPSB7XG5cdGFkZDogaXNEaWZmU2V0cyxcblx0Y2xlYXI6IGlzRGlmZlNldHMsXG5cdGRlbGV0ZTogaXNEaWZmU2V0cyxcblx0Zm9yRWFjaDogaXNEaWZmU2V0cyxcbn07XG5cbmV4cG9ydCBjb25zdCBIQU5ETEVEX1NFVF9NRVRIT0RTID0gbmV3IFNldChbXG5cdC4uLklNTVVUQUJMRV9TRVRfTUVUSE9EUyxcblx0Li4uT2JqZWN0LmtleXMoTVVUQUJMRV9TRVRfTUVUSE9EUyksXG5cdC4uLkNPTExFQ1RJT05fSVRFUkFUT1JfTUVUSE9EUyxcbl0pO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNEaWZmTWFwcyhjbG9uZSwgdmFsdWUpIHtcblx0aWYgKGNsb25lID09PSB2YWx1ZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGlmIChjbG9uZS5zaXplICE9PSB2YWx1ZS5zaXplKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRmb3IgKGNvbnN0IFtrZXksIGFWYWx1ZV0gb2YgY2xvbmUpIHtcblx0XHRjb25zdCBiVmFsdWUgPSB2YWx1ZS5nZXQoa2V5KTtcblx0XHQvLyBEaXN0aW5ndWlzaCBtaXNzaW5nIHZzIHVuZGVmaW5lZCBhbmQgY2F0Y2ggc3RyaWN0IGluZXF1YWxpdHlcblx0XHRpZiAoYlZhbHVlICE9PSBhVmFsdWUgfHwgKGJWYWx1ZSA9PT0gdW5kZWZpbmVkICYmICF2YWx1ZS5oYXMoa2V5KSkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBmYWxzZTtcbn1cbiIsImltcG9ydCBpc0RpZmZNYXBzIGZyb20gJy4uL2RpZmYvaXMtZGlmZi1tYXBzLmpzJztcbmltcG9ydCB7SU1NVVRBQkxFX1NFVF9NRVRIT0RTLCBDT0xMRUNUSU9OX0lURVJBVE9SX01FVEhPRFN9IGZyb20gJy4vc2V0LmpzJztcblxuY29uc3QgSU1NVVRBQkxFX01BUF9NRVRIT0RTID0gbmV3IFNldChbLi4uSU1NVVRBQkxFX1NFVF9NRVRIT0RTLCAnZ2V0J10pO1xuXG5leHBvcnQgY29uc3QgTVVUQUJMRV9NQVBfTUVUSE9EUyA9IHtcblx0c2V0OiBpc0RpZmZNYXBzLFxuXHRjbGVhcjogaXNEaWZmTWFwcyxcblx0ZGVsZXRlOiBpc0RpZmZNYXBzLFxuXHRmb3JFYWNoOiBpc0RpZmZNYXBzLFxufTtcblxuZXhwb3J0IGNvbnN0IEhBTkRMRURfTUFQX01FVEhPRFMgPSBuZXcgU2V0KFtcblx0Li4uSU1NVVRBQkxFX01BUF9NRVRIT0RTLFxuXHQuLi5PYmplY3Qua2V5cyhNVVRBQkxFX01BUF9NRVRIT0RTKSxcblx0Li4uQ09MTEVDVElPTl9JVEVSQVRPUl9NRVRIT0RTLFxuXSk7XG4iLCJpbXBvcnQgcGF0aCBmcm9tICcuLi8uLi9wYXRoLmpzJztcbmltcG9ydCBpc0FycmF5IGZyb20gJy4uLy4uL2lzLWFycmF5LmpzJztcbmltcG9ydCBpc09iamVjdCBmcm9tICcuLi8uLi9pcy1vYmplY3QuanMnO1xuaW1wb3J0IHtNVVRBQkxFX0FSUkFZX01FVEhPRFN9IGZyb20gJy4uL21ldGhvZHMvYXJyYXkuanMnO1xuaW1wb3J0IHtNVVRBQkxFX1NFVF9NRVRIT0RTfSBmcm9tICcuLi9tZXRob2RzL3NldC5qcyc7XG5pbXBvcnQge01VVEFCTEVfTUFQX01FVEhPRFN9IGZyb20gJy4uL21ldGhvZHMvbWFwLmpzJztcbmltcG9ydCB7SU1NVVRBQkxFX09CSkVDVF9NRVRIT0RTfSBmcm9tICcuLi9tZXRob2RzL29iamVjdC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENsb25lT2JqZWN0IHtcblx0Y29uc3RydWN0b3IodmFsdWUsIHBhdGgsIGFyZ3VtZW50c0xpc3QsIGhhc09uVmFsaWRhdGUpIHtcblx0XHR0aGlzLl9wYXRoID0gcGF0aDtcblx0XHR0aGlzLl9pc0NoYW5nZWQgPSBmYWxzZTtcblx0XHR0aGlzLl9jbG9uZWRDYWNoZSA9IG5ldyBTZXQoKTtcblx0XHR0aGlzLl9oYXNPblZhbGlkYXRlID0gaGFzT25WYWxpZGF0ZTtcblx0XHR0aGlzLl9jaGFuZ2VzID0gaGFzT25WYWxpZGF0ZSA/IFtdIDogbnVsbDtcblxuXHRcdHRoaXMuY2xvbmUgPSBwYXRoID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHRoaXMuX3NoYWxsb3dDbG9uZSh2YWx1ZSk7XG5cdH1cblxuXHRzdGF0aWMgaXNIYW5kbGVkTWV0aG9kKG5hbWUpIHtcblx0XHRyZXR1cm4gSU1NVVRBQkxFX09CSkVDVF9NRVRIT0RTLmhhcyhuYW1lKTtcblx0fVxuXG5cdF9zaGFsbG93Q2xvbmUodmFsdWUpIHtcblx0XHRsZXQgY2xvbmUgPSB2YWx1ZTtcblxuXHRcdGlmIChpc09iamVjdCh2YWx1ZSkpIHtcblx0XHRcdGNsb25lID0gey4uLnZhbHVlfTtcblx0XHR9IGVsc2UgaWYgKGlzQXJyYXkodmFsdWUpIHx8IEFycmF5QnVmZmVyLmlzVmlldyh2YWx1ZSkpIHtcblx0XHRcdGNsb25lID0gWy4uLnZhbHVlXTtcblx0XHR9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuXHRcdFx0Y2xvbmUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG5cdFx0fSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNldCkge1xuXHRcdFx0Y2xvbmUgPSBuZXcgU2V0KFsuLi52YWx1ZV0ubWFwKGl0ZW0gPT4gdGhpcy5fc2hhbGxvd0Nsb25lKGl0ZW0pKSk7XG5cdFx0fSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1hcCkge1xuXHRcdFx0Y2xvbmUgPSBuZXcgTWFwKCk7XG5cblx0XHRcdGZvciAoY29uc3QgW2tleSwgaXRlbV0gb2YgdmFsdWUuZW50cmllcygpKSB7XG5cdFx0XHRcdGNsb25lLnNldChrZXksIHRoaXMuX3NoYWxsb3dDbG9uZShpdGVtKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5fY2xvbmVkQ2FjaGUuYWRkKGNsb25lKTtcblxuXHRcdHJldHVybiBjbG9uZTtcblx0fVxuXG5cdHByZWZlcnJlZFRoaXNBcmcoaXNIYW5kbGVkTWV0aG9kLCBuYW1lLCB0aGlzQXJndW1lbnQsIHRoaXNQcm94eVRhcmdldCkge1xuXHRcdGlmIChpc0hhbmRsZWRNZXRob2QpIHtcblx0XHRcdGlmIChpc0FycmF5KHRoaXNQcm94eVRhcmdldCkpIHtcblx0XHRcdFx0dGhpcy5fb25Jc0NoYW5nZWQgPSBNVVRBQkxFX0FSUkFZX01FVEhPRFNbbmFtZV07XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXNQcm94eVRhcmdldCBpbnN0YW5jZW9mIFNldCkge1xuXHRcdFx0XHR0aGlzLl9vbklzQ2hhbmdlZCA9IE1VVEFCTEVfU0VUX01FVEhPRFNbbmFtZV07XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXNQcm94eVRhcmdldCBpbnN0YW5jZW9mIE1hcCkge1xuXHRcdFx0XHR0aGlzLl9vbklzQ2hhbmdlZCA9IE1VVEFCTEVfTUFQX01FVEhPRFNbbmFtZV07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzUHJveHlUYXJnZXQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNBcmd1bWVudDtcblx0fVxuXG5cdHVwZGF0ZShmdWxsUGF0aCwgcHJvcGVydHksIHZhbHVlKSB7XG5cdFx0Y29uc3QgY2hhbmdlUGF0aCA9IHBhdGguYWZ0ZXIoZnVsbFBhdGgsIHRoaXMuX3BhdGgpO1xuXG5cdFx0aWYgKHByb3BlcnR5ICE9PSAnbGVuZ3RoJykge1xuXHRcdFx0bGV0IG9iamVjdCA9IHRoaXMuY2xvbmU7XG5cblx0XHRcdHBhdGgud2FsayhjaGFuZ2VQYXRoLCBrZXkgPT4ge1xuXHRcdFx0XHRpZiAob2JqZWN0Py5ba2V5XSkge1xuXHRcdFx0XHRcdGlmICghdGhpcy5fY2xvbmVkQ2FjaGUuaGFzKG9iamVjdFtrZXldKSkge1xuXHRcdFx0XHRcdFx0b2JqZWN0W2tleV0gPSB0aGlzLl9zaGFsbG93Q2xvbmUob2JqZWN0W2tleV0pO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG9iamVjdCA9IG9iamVjdFtrZXldO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKHRoaXMuX2hhc09uVmFsaWRhdGUpIHtcblx0XHRcdFx0dGhpcy5fY2hhbmdlcy5wdXNoKHtcblx0XHRcdFx0XHRwYXRoOiBjaGFuZ2VQYXRoLFxuXHRcdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRcdHByZXZpb3VzOiB2YWx1ZSxcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvYmplY3Q/Lltwcm9wZXJ0eV0pIHtcblx0XHRcdFx0b2JqZWN0W3Byb3BlcnR5XSA9IHZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuX2lzQ2hhbmdlZCA9IHRydWU7XG5cdH1cblxuXHR1bmRvKG9iamVjdCkge1xuXHRcdGxldCBjaGFuZ2U7XG5cblx0XHRmb3IgKGxldCBpbmRleCA9IHRoaXMuX2NoYW5nZXMubGVuZ3RoIC0gMTsgaW5kZXggIT09IC0xOyBpbmRleC0tKSB7XG5cdFx0XHRjaGFuZ2UgPSB0aGlzLl9jaGFuZ2VzW2luZGV4XTtcblxuXHRcdFx0cGF0aC5nZXQob2JqZWN0LCBjaGFuZ2UucGF0aClbY2hhbmdlLnByb3BlcnR5XSA9IGNoYW5nZS5wcmV2aW91cztcblx0XHR9XG5cdH1cblxuXHRpc0NoYW5nZWQodmFsdWUsIF9lcXVhbHMpIHtcblx0XHRyZXR1cm4gdGhpcy5fb25Jc0NoYW5nZWQgPT09IHVuZGVmaW5lZFxuXHRcdFx0PyB0aGlzLl9pc0NoYW5nZWRcblx0XHRcdDogdGhpcy5fb25Jc0NoYW5nZWQodGhpcy5jbG9uZSwgdmFsdWUpO1xuXHR9XG5cblx0aXNQYXRoQXBwbGljYWJsZShjaGFuZ2VQYXRoKSB7XG5cdFx0cmV0dXJuIHBhdGguaXNSb290UGF0aCh0aGlzLl9wYXRoKSB8fCBwYXRoLmlzU3ViUGF0aChjaGFuZ2VQYXRoLCB0aGlzLl9wYXRoKTtcblx0fVxufVxuIiwiaW1wb3J0IHtIQU5ETEVEX0FSUkFZX01FVEhPRFN9IGZyb20gJy4uL21ldGhvZHMvYXJyYXkuanMnO1xuaW1wb3J0IENsb25lT2JqZWN0IGZyb20gJy4vY2xvbmUtb2JqZWN0LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2xvbmVBcnJheSBleHRlbmRzIENsb25lT2JqZWN0IHtcblx0c3RhdGljIGlzSGFuZGxlZE1ldGhvZChuYW1lKSB7XG5cdFx0cmV0dXJuIEhBTkRMRURfQVJSQVlfTUVUSE9EUy5oYXMobmFtZSk7XG5cdH1cbn1cbiIsImltcG9ydCBDbG9uZU9iamVjdCBmcm9tICcuL2Nsb25lLW9iamVjdC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENsb25lRGF0ZSBleHRlbmRzIENsb25lT2JqZWN0IHtcblx0dW5kbyhvYmplY3QpIHtcblx0XHRvYmplY3Quc2V0VGltZSh0aGlzLmNsb25lLmdldFRpbWUoKSk7XG5cdH1cblxuXHRpc0NoYW5nZWQodmFsdWUsIGVxdWFscykge1xuXHRcdHJldHVybiAhZXF1YWxzKHRoaXMuY2xvbmUudmFsdWVPZigpLCB2YWx1ZS52YWx1ZU9mKCkpO1xuXHR9XG59XG4iLCJpbXBvcnQge0hBTkRMRURfU0VUX01FVEhPRFN9IGZyb20gJy4uL21ldGhvZHMvc2V0LmpzJztcbmltcG9ydCBDbG9uZU9iamVjdCBmcm9tICcuL2Nsb25lLW9iamVjdC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENsb25lU2V0IGV4dGVuZHMgQ2xvbmVPYmplY3Qge1xuXHRzdGF0aWMgaXNIYW5kbGVkTWV0aG9kKG5hbWUpIHtcblx0XHRyZXR1cm4gSEFORExFRF9TRVRfTUVUSE9EUy5oYXMobmFtZSk7XG5cdH1cblxuXHR1bmRvKG9iamVjdCkge1xuXHRcdGZvciAoY29uc3QgdmFsdWUgb2YgdGhpcy5jbG9uZSkge1xuXHRcdFx0b2JqZWN0LmFkZCh2YWx1ZSk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCB2YWx1ZSBvZiBvYmplY3QpIHtcblx0XHRcdGlmICghdGhpcy5jbG9uZS5oYXModmFsdWUpKSB7XG5cdFx0XHRcdG9iamVjdC5kZWxldGUodmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuIiwiaW1wb3J0IHtIQU5ETEVEX01BUF9NRVRIT0RTfSBmcm9tICcuLi9tZXRob2RzL21hcC5qcyc7XG5pbXBvcnQgQ2xvbmVPYmplY3QgZnJvbSAnLi9jbG9uZS1vYmplY3QuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbG9uZU1hcCBleHRlbmRzIENsb25lT2JqZWN0IHtcblx0c3RhdGljIGlzSGFuZGxlZE1ldGhvZChuYW1lKSB7XG5cdFx0cmV0dXJuIEhBTkRMRURfTUFQX01FVEhPRFMuaGFzKG5hbWUpO1xuXHR9XG5cblx0dW5kbyhvYmplY3QpIHtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLmNsb25lLmVudHJpZXMoKSkge1xuXHRcdFx0b2JqZWN0LnNldChrZXksIHZhbHVlKTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGtleSBvZiBvYmplY3Qua2V5cygpKSB7XG5cdFx0XHRpZiAoIXRoaXMuY2xvbmUuaGFzKGtleSkpIHtcblx0XHRcdFx0b2JqZWN0LmRlbGV0ZShrZXkpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuIiwiaW1wb3J0IENsb25lT2JqZWN0IGZyb20gJy4vY2xvbmUtb2JqZWN0LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2xvbmVXZWFrU2V0IGV4dGVuZHMgQ2xvbmVPYmplY3Qge1xuXHRjb25zdHJ1Y3Rvcih2YWx1ZSwgcGF0aCwgYXJndW1lbnRzTGlzdCwgaGFzT25WYWxpZGF0ZSkge1xuXHRcdHN1cGVyKHVuZGVmaW5lZCwgcGF0aCwgYXJndW1lbnRzTGlzdCwgaGFzT25WYWxpZGF0ZSk7XG5cblx0XHR0aGlzLl9hcmd1bWVudDEgPSBhcmd1bWVudHNMaXN0WzBdO1xuXHRcdHRoaXMuX3dlYWtWYWx1ZSA9IHZhbHVlLmhhcyh0aGlzLl9hcmd1bWVudDEpO1xuXHR9XG5cblx0aXNDaGFuZ2VkKHZhbHVlLCBfZXF1YWxzKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3dlYWtWYWx1ZSAhPT0gdmFsdWUuaGFzKHRoaXMuX2FyZ3VtZW50MSk7XG5cdH1cblxuXHR1bmRvKG9iamVjdCkge1xuXHRcdGlmICh0aGlzLl93ZWFrVmFsdWUgJiYgIW9iamVjdC5oYXModGhpcy5fYXJndW1lbnQxKSkge1xuXHRcdFx0b2JqZWN0LmFkZCh0aGlzLl9hcmd1bWVudDEpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvYmplY3QuZGVsZXRlKHRoaXMuX2FyZ3VtZW50MSk7XG5cdFx0fVxuXHR9XG59XG4iLCJpbXBvcnQgQ2xvbmVPYmplY3QgZnJvbSAnLi9jbG9uZS1vYmplY3QuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbG9uZVdlYWtNYXAgZXh0ZW5kcyBDbG9uZU9iamVjdCB7XG5cdGNvbnN0cnVjdG9yKHZhbHVlLCBwYXRoLCBhcmd1bWVudHNMaXN0LCBoYXNPblZhbGlkYXRlKSB7XG5cdFx0c3VwZXIodW5kZWZpbmVkLCBwYXRoLCBhcmd1bWVudHNMaXN0LCBoYXNPblZhbGlkYXRlKTtcblxuXHRcdHRoaXMuX3dlYWtLZXkgPSBhcmd1bWVudHNMaXN0WzBdO1xuXHRcdHRoaXMuX3dlYWtIYXMgPSB2YWx1ZS5oYXModGhpcy5fd2Vha0tleSk7XG5cdFx0dGhpcy5fd2Vha1ZhbHVlID0gdmFsdWUuZ2V0KHRoaXMuX3dlYWtLZXkpO1xuXHR9XG5cblx0aXNDaGFuZ2VkKHZhbHVlLCBfZXF1YWxzKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3dlYWtWYWx1ZSAhPT0gdmFsdWUuZ2V0KHRoaXMuX3dlYWtLZXkpO1xuXHR9XG5cblx0dW5kbyhvYmplY3QpIHtcblx0XHRjb25zdCB3ZWFrSGFzID0gb2JqZWN0Lmhhcyh0aGlzLl93ZWFrS2V5KTtcblxuXHRcdGlmICh0aGlzLl93ZWFrSGFzICYmICF3ZWFrSGFzKSB7XG5cdFx0XHRvYmplY3Quc2V0KHRoaXMuX3dlYWtLZXksIHRoaXMuX3dlYWtWYWx1ZSk7XG5cdFx0fSBlbHNlIGlmICghdGhpcy5fd2Vha0hhcyAmJiB3ZWFrSGFzKSB7XG5cdFx0XHRvYmplY3QuZGVsZXRlKHRoaXMuX3dlYWtLZXkpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5fd2Vha1ZhbHVlICE9PSBvYmplY3QuZ2V0KHRoaXMuX3dlYWtLZXkpKSB7XG5cdFx0XHRvYmplY3Quc2V0KHRoaXMuX3dlYWtLZXksIHRoaXMuX3dlYWtWYWx1ZSk7XG5cdFx0fVxuXHR9XG59XG4iLCJpbXBvcnQgaXNBcnJheSBmcm9tICcuLi9pcy1hcnJheS5qcyc7XG5pbXBvcnQge2lzQnVpbHRpbldpdGhNdXRhYmxlTWV0aG9kc30gZnJvbSAnLi4vaXMtYnVpbHRpbi5qcyc7XG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnLi4vaXMtb2JqZWN0LmpzJztcbmltcG9ydCBDbG9uZU9iamVjdCBmcm9tICcuL2Nsb25lL2Nsb25lLW9iamVjdC5qcyc7XG5pbXBvcnQgQ2xvbmVBcnJheSBmcm9tICcuL2Nsb25lL2Nsb25lLWFycmF5LmpzJztcbmltcG9ydCBDbG9uZURhdGUgZnJvbSAnLi9jbG9uZS9jbG9uZS1kYXRlLmpzJztcbmltcG9ydCBDbG9uZVNldCBmcm9tICcuL2Nsb25lL2Nsb25lLXNldC5qcyc7XG5pbXBvcnQgQ2xvbmVNYXAgZnJvbSAnLi9jbG9uZS9jbG9uZS1tYXAuanMnO1xuaW1wb3J0IENsb25lV2Vha1NldCBmcm9tICcuL2Nsb25lL2Nsb25lLXdlYWtzZXQuanMnO1xuaW1wb3J0IENsb25lV2Vha01hcCBmcm9tICcuL2Nsb25lL2Nsb25lLXdlYWttYXAuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTbWFydENsb25lIHtcblx0Y29uc3RydWN0b3IoaGFzT25WYWxpZGF0ZSkge1xuXHRcdHRoaXMuX3N0YWNrID0gW107XG5cdFx0dGhpcy5faGFzT25WYWxpZGF0ZSA9IGhhc09uVmFsaWRhdGU7XG5cdH1cblxuXHRzdGF0aWMgaXNIYW5kbGVkVHlwZSh2YWx1ZSkge1xuXHRcdHJldHVybiBpc09iamVjdCh2YWx1ZSlcblx0XHRcdHx8IGlzQXJyYXkodmFsdWUpXG5cdFx0XHR8fCBpc0J1aWx0aW5XaXRoTXV0YWJsZU1ldGhvZHModmFsdWUpO1xuXHR9XG5cblx0c3RhdGljIGlzSGFuZGxlZE1ldGhvZCh0YXJnZXQsIG5hbWUpIHtcblx0XHRpZiAoaXNPYmplY3QodGFyZ2V0KSkge1xuXHRcdFx0cmV0dXJuIENsb25lT2JqZWN0LmlzSGFuZGxlZE1ldGhvZChuYW1lKTtcblx0XHR9XG5cblx0XHRpZiAoaXNBcnJheSh0YXJnZXQpKSB7XG5cdFx0XHRyZXR1cm4gQ2xvbmVBcnJheS5pc0hhbmRsZWRNZXRob2QobmFtZSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRhcmdldCBpbnN0YW5jZW9mIFNldCkge1xuXHRcdFx0cmV0dXJuIENsb25lU2V0LmlzSGFuZGxlZE1ldGhvZChuYW1lKTtcblx0XHR9XG5cblx0XHRpZiAodGFyZ2V0IGluc3RhbmNlb2YgTWFwKSB7XG5cdFx0XHRyZXR1cm4gQ2xvbmVNYXAuaXNIYW5kbGVkTWV0aG9kKG5hbWUpO1xuXHRcdH1cblxuXHRcdHJldHVybiBpc0J1aWx0aW5XaXRoTXV0YWJsZU1ldGhvZHModGFyZ2V0KTtcblx0fVxuXG5cdGdldCBpc0Nsb25pbmcoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3N0YWNrLmxlbmd0aCA+IDA7XG5cdH1cblxuXHRzdGFydCh2YWx1ZSwgcGF0aCwgYXJndW1lbnRzTGlzdCkge1xuXHRcdGxldCBDbG9uZUNsYXNzID0gQ2xvbmVPYmplY3Q7XG5cblx0XHRpZiAoaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdENsb25lQ2xhc3MgPSBDbG9uZUFycmF5O1xuXHRcdH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG5cdFx0XHRDbG9uZUNsYXNzID0gQ2xvbmVEYXRlO1xuXHRcdH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZXQpIHtcblx0XHRcdENsb25lQ2xhc3MgPSBDbG9uZVNldDtcblx0XHR9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKSB7XG5cdFx0XHRDbG9uZUNsYXNzID0gQ2xvbmVNYXA7XG5cdFx0fSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFdlYWtTZXQpIHtcblx0XHRcdENsb25lQ2xhc3MgPSBDbG9uZVdlYWtTZXQ7XG5cdFx0fSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFdlYWtNYXApIHtcblx0XHRcdENsb25lQ2xhc3MgPSBDbG9uZVdlYWtNYXA7XG5cdFx0fVxuXG5cdFx0dGhpcy5fc3RhY2sucHVzaChuZXcgQ2xvbmVDbGFzcyh2YWx1ZSwgcGF0aCwgYXJndW1lbnRzTGlzdCwgdGhpcy5faGFzT25WYWxpZGF0ZSkpO1xuXHR9XG5cblx0dXBkYXRlKGZ1bGxQYXRoLCBwcm9wZXJ0eSwgdmFsdWUpIHtcblx0XHR0aGlzLl9zdGFjay5hdCgtMSkudXBkYXRlKGZ1bGxQYXRoLCBwcm9wZXJ0eSwgdmFsdWUpO1xuXHR9XG5cblx0cHJlZmVycmVkVGhpc0FyZyh0YXJnZXQsIHRoaXNBcmd1bWVudCwgdGhpc1Byb3h5VGFyZ2V0KSB7XG5cdFx0Y29uc3Qge25hbWV9ID0gdGFyZ2V0O1xuXHRcdGNvbnN0IGlzSGFuZGxlZE1ldGhvZCA9IFNtYXJ0Q2xvbmUuaXNIYW5kbGVkTWV0aG9kKHRoaXNQcm94eVRhcmdldCwgbmFtZSk7XG5cblx0XHRyZXR1cm4gdGhpcy5fc3RhY2suYXQoLTEpXG5cdFx0XHQucHJlZmVycmVkVGhpc0FyZyhpc0hhbmRsZWRNZXRob2QsIG5hbWUsIHRoaXNBcmd1bWVudCwgdGhpc1Byb3h5VGFyZ2V0KTtcblx0fVxuXG5cdGlzQ2hhbmdlZCh2YWx1ZSwgZXF1YWxzKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3N0YWNrLmF0KC0xKS5pc0NoYW5nZWQodmFsdWUsIGVxdWFscyk7XG5cdH1cblxuXHRpc1BhcnRPZkNsb25lKGNoYW5nZVBhdGgpIHtcblx0XHRyZXR1cm4gdGhpcy5fc3RhY2suYXQoLTEpLmlzUGF0aEFwcGxpY2FibGUoY2hhbmdlUGF0aCk7XG5cdH1cblxuXHR1bmRvKG9iamVjdCkge1xuXHRcdGlmICh0aGlzLl9wcmV2aW91c0Nsb25lICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuX3ByZXZpb3VzQ2xvbmUudW5kbyhvYmplY3QpO1xuXHRcdH1cblx0fVxuXG5cdHN0b3AoKSB7XG5cdFx0dGhpcy5fcHJldmlvdXNDbG9uZSA9IHRoaXMuX3N0YWNrLnBvcCgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX3ByZXZpb3VzQ2xvbmUuY2xvbmU7XG5cdH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIHVuaWNvcm4vcHJlZmVyLXNwcmVhZCAqL1xuaW1wb3J0IHtUQVJHRVQsIFVOU1VCU0NSSUJFLCBQQVRIX1NFUEFSQVRPUn0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHtpc0J1aWx0aW5XaXRoTXV0YWJsZU1ldGhvZHMsIGlzQnVpbHRpbldpdGhvdXRNdXRhYmxlTWV0aG9kc30gZnJvbSAnLi9pcy1idWlsdGluLmpzJztcbmltcG9ydCBwYXRoIGZyb20gJy4vcGF0aC5qcyc7XG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnLi9pcy1vYmplY3QuanMnO1xuaW1wb3J0IGlzU3ltYm9sIGZyb20gJy4vaXMtc3ltYm9sLmpzJztcbmltcG9ydCBpc0l0ZXJhdG9yIGZyb20gJy4vaXMtaXRlcmF0b3IuanMnO1xuaW1wb3J0IHdyYXBJdGVyYXRvciBmcm9tICcuL3dyYXAtaXRlcmF0b3IuanMnO1xuaW1wb3J0IGlnbm9yZVByb3BlcnR5IGZyb20gJy4vaWdub3JlLXByb3BlcnR5LmpzJztcbmltcG9ydCBDYWNoZSBmcm9tICcuL2NhY2hlLmpzJztcbmltcG9ydCBTbWFydENsb25lIGZyb20gJy4vc21hcnQtY2xvbmUvc21hcnQtY2xvbmUuanMnO1xuXG4vLyBDb25zdGFudCBzZXQgb2YgaXRlcmF0b3IgbWV0aG9kIG5hbWVzIGZvciBlZmZpY2llbnQgbG9va3VwXG5jb25zdCBJVEVSQVRPUl9NRVRIT0RfTkFNRVMgPSBuZXcgU2V0KFsndmFsdWVzJywgJ2tleXMnLCAnZW50cmllcyddKTtcblxuLy8gQ29uc3RhbnQgc2V0IG9mIGFycmF5IHNlYXJjaCBtZXRob2RzIGZvciBlZmZpY2llbnQgbG9va3VwXG5jb25zdCBBUlJBWV9TRUFSQ0hfTUVUSE9EUyA9IG5ldyBTZXQoWydpbmRleE9mJywgJ2xhc3RJbmRleE9mJywgJ2luY2x1ZGVzJ10pO1xuXG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcblx0ZXF1YWxzOiBPYmplY3QuaXMsXG5cdGlzU2hhbGxvdzogZmFsc2UsXG5cdHBhdGhBc0FycmF5OiBmYWxzZSxcblx0aWdub3JlU3ltYm9sczogZmFsc2UsXG5cdGlnbm9yZVVuZGVyc2NvcmVzOiBmYWxzZSxcblx0aWdub3JlRGV0YWNoZWQ6IGZhbHNlLFxuXHRkZXRhaWxzOiBmYWxzZSxcbn07XG5cbmNvbnN0IHNob3VsZFByb3ZpZGVBcHBseURhdGEgPSAoZGV0YWlscywgbWV0aG9kTmFtZSkgPT4gZGV0YWlscyA9PT0gZmFsc2Vcblx0fHwgZGV0YWlscyA9PT0gdHJ1ZVxuXHR8fCAoQXJyYXkuaXNBcnJheShkZXRhaWxzKSAmJiBkZXRhaWxzLmluY2x1ZGVzKG1ldGhvZE5hbWUpKTtcblxuY29uc3Qgb25DaGFuZ2UgPSAob2JqZWN0LCBvbkNoYW5nZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG5cdG9wdGlvbnMgPSB7XG5cdFx0Li4uZGVmYXVsdE9wdGlvbnMsXG5cdFx0Li4ub3B0aW9ucyxcblx0fTtcblxuXHRjb25zdCBwcm94eVRhcmdldCA9IFN5bWJvbCgnUHJveHlUYXJnZXQnKTtcblx0Y29uc3Qge2VxdWFscywgaXNTaGFsbG93LCBpZ25vcmVEZXRhY2hlZCwgZGV0YWlsc30gPSBvcHRpb25zO1xuXHRjb25zdCBjYWNoZSA9IG5ldyBDYWNoZShlcXVhbHMpO1xuXHRjb25zdCBoYXNPblZhbGlkYXRlID0gdHlwZW9mIG9wdGlvbnMub25WYWxpZGF0ZSA9PT0gJ2Z1bmN0aW9uJztcblx0Y29uc3Qgc21hcnRDbG9uZSA9IG5ldyBTbWFydENsb25lKGhhc09uVmFsaWRhdGUpO1xuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtcGFyYW1zXG5cdGNvbnN0IHZhbGlkYXRlID0gKHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCBwcmV2aW91cywgYXBwbHlEYXRhKSA9PiAhaGFzT25WYWxpZGF0ZVxuXHRcdHx8IHNtYXJ0Q2xvbmUuaXNDbG9uaW5nXG5cdFx0fHwgb3B0aW9ucy5vblZhbGlkYXRlKHBhdGguY29uY2F0KGNhY2hlLmdldFBhdGgodGFyZ2V0KSwgcHJvcGVydHkpLCB2YWx1ZSwgcHJldmlvdXMsIGFwcGx5RGF0YSkgPT09IHRydWU7XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1wYXJhbXNcblx0Y29uc3QgaGFuZGxlQ2hhbmdlT25UYXJnZXQgPSAodGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUsIHByZXZpb3VzLCBhcHBseURhdGEpID0+IHtcblx0XHRpZiAoXG5cdFx0XHRpZ25vcmVQcm9wZXJ0eShjYWNoZSwgb3B0aW9ucywgcHJvcGVydHkpXG5cdFx0XHR8fCAoaWdub3JlRGV0YWNoZWQgJiYgY2FjaGUuaXNEZXRhY2hlZCh0YXJnZXQsIG9iamVjdCkpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZXJtaW5lIHdoaWNoIHBhdGhzIHRvIG5vdGlmeVxuXHRcdGNvbnN0IGFsbFBhdGhzID0gY2FjaGUuZ2V0QWxsUGF0aHModGFyZ2V0KTtcblx0XHRjb25zdCBwYXRoc1RvTm90aWZ5ID0gIXNtYXJ0Q2xvbmUuaXNDbG9uaW5nICYmIGFsbFBhdGhzICYmIGFsbFBhdGhzLmxlbmd0aCA+IDFcblx0XHRcdD8gYWxsUGF0aHNcblx0XHRcdDogW2NhY2hlLmdldFBhdGgodGFyZ2V0KV07XG5cblx0XHQvLyBOb3RpZnkgYWxsIHJlbGV2YW50IHBhdGhzXG5cdFx0Zm9yIChjb25zdCBjaGFuZ2VQYXRoIG9mIHBhdGhzVG9Ob3RpZnkpIHtcblx0XHRcdGhhbmRsZUNoYW5nZShjaGFuZ2VQYXRoLCBwcm9wZXJ0eSwgdmFsdWUsIHByZXZpb3VzLCBhcHBseURhdGEpO1xuXHRcdH1cblx0fTtcblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXBhcmFtc1xuXHRjb25zdCBoYW5kbGVDaGFuZ2UgPSAoY2hhbmdlUGF0aCwgcHJvcGVydHksIHZhbHVlLCBwcmV2aW91cywgYXBwbHlEYXRhKSA9PiB7XG5cdFx0aWYgKHNtYXJ0Q2xvbmUuaXNDbG9uaW5nICYmIHNtYXJ0Q2xvbmUuaXNQYXJ0T2ZDbG9uZShjaGFuZ2VQYXRoKSkge1xuXHRcdFx0c21hcnRDbG9uZS51cGRhdGUoY2hhbmdlUGF0aCwgcHJvcGVydHksIHByZXZpb3VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b25DaGFuZ2UocGF0aC5jb25jYXQoY2hhbmdlUGF0aCwgcHJvcGVydHkpLCB2YWx1ZSwgcHJldmlvdXMsIGFwcGx5RGF0YSk7XG5cdFx0fVxuXHR9O1xuXG5cdGNvbnN0IGdldFByb3h5VGFyZ2V0ID0gdmFsdWUgPT5cblx0XHQodmFsdWUgIT09IG51bGwgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSlcblx0XHRcdD8gKHZhbHVlW3Byb3h5VGFyZ2V0XSA/PyB2YWx1ZSlcblx0XHRcdDogdmFsdWU7XG5cblx0Y29uc3QgcHJlcGFyZVZhbHVlID0gKHZhbHVlLCB0YXJnZXQsIHByb3BlcnR5LCBiYXNlUGF0aCkgPT4ge1xuXHRcdGlmIChcblx0XHRcdGlzQnVpbHRpbldpdGhvdXRNdXRhYmxlTWV0aG9kcyh2YWx1ZSlcblx0XHRcdHx8IHByb3BlcnR5ID09PSAnY29uc3RydWN0b3InXG5cdFx0XHR8fCAoaXNTaGFsbG93ICYmICFTbWFydENsb25lLmlzSGFuZGxlZE1ldGhvZCh0YXJnZXQsIHByb3BlcnR5KSlcblx0XHRcdHx8IGlnbm9yZVByb3BlcnR5KGNhY2hlLCBvcHRpb25zLCBwcm9wZXJ0eSlcblx0XHRcdHx8IGNhY2hlLmlzR2V0SW52YXJpYW50KHRhcmdldCwgcHJvcGVydHkpXG5cdFx0XHR8fCAoaWdub3JlRGV0YWNoZWQgJiYgY2FjaGUuaXNEZXRhY2hlZCh0YXJnZXQsIG9iamVjdCkpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXG5cdFx0aWYgKGJhc2VQYXRoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGJhc2VQYXRoID0gY2FjaGUuZ2V0UGF0aCh0YXJnZXQpO1xuXHRcdH1cblxuXHRcdC8qXG4gIFx0XHRDaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcy5cblxuICBcdFx0SWYgdGhlIHZhbHVlIGFscmVhZHkgaGFzIGEgY29ycmVzcG9uZGluZyBwYXRoL3Byb3h5LFxuXHRcdGFuZCBpZiB0aGUgcGF0aCBjb3JyZXNwb25kcyB0byBvbmUgb2YgdGhlIHBhcmVudHMsXG5cdFx0dGhlbiB3ZSBhcmUgb24gYSBjaXJjdWxhciBjYXNlLCB3aGVyZSB0aGUgY2hpbGQgaXMgcG9pbnRpbmcgdG8gdGhlaXIgcGFyZW50LlxuXHRcdEluIHRoaXMgY2FzZSB3ZSByZXR1cm4gdGhlIHByb3h5IG9iamVjdCB3aXRoIHRoZSBzaG9ydGVzdCBwYXRoLlxuICBcdFx0Ki9cblx0XHRjb25zdCBjaGlsZFBhdGggPSBwYXRoLmNvbmNhdChiYXNlUGF0aCwgcHJvcGVydHkpO1xuXHRcdGNvbnN0IGV4aXN0aW5nUGF0aCA9IGNhY2hlLmdldFBhdGgodmFsdWUpO1xuXG5cdFx0aWYgKGV4aXN0aW5nUGF0aCAmJiBpc1NhbWVPYmplY3RUcmVlKGNoaWxkUGF0aCwgZXhpc3RpbmdQYXRoKSkge1xuXHRcdFx0Ly8gV2UgYXJlIG9uIHRoZSBzYW1lIG9iamVjdCB0cmVlIGJ1dCBkZWVwZXIsIHNvIHdlIHVzZSB0aGUgcGFyZW50IHBhdGguXG5cdFx0XHRyZXR1cm4gY2FjaGUuZ2V0UHJveHkodmFsdWUsIGV4aXN0aW5nUGF0aCwgaGFuZGxlciwgcHJveHlUYXJnZXQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjYWNoZS5nZXRQcm94eSh2YWx1ZSwgY2hpbGRQYXRoLCBoYW5kbGVyLCBwcm94eVRhcmdldCk7XG5cdH07XG5cblx0Lypcblx0UmV0dXJucyB0cnVlIGlmIGBjaGlsZFBhdGhgIGlzIGEgc3VicGF0aCBvZiBgZXhpc3RpbmdQYXRoYFxuXHQoaWYgY2hpbGRQYXRoIHN0YXJ0cyB3aXRoIGV4aXN0aW5nUGF0aCkuIE90aGVyd2lzZSwgaXQgcmV0dXJucyBmYWxzZS5cblxuIFx0SXQgYWxzbyByZXR1cm5zIGZhbHNlIGlmIHRoZSAyIHBhdGhzIGFyZSBpZGVudGljYWwuXG5cbiBcdEZvciBleGFtcGxlOlxuXHQtIGNoaWxkUGF0aCAgICA9IGdyb3VwLmxheWVycy4wLnBhcmVudC5sYXllcnMuMC52YWx1ZVxuXHQtIGV4aXN0aW5nUGF0aCA9IGdyb3VwLmxheWVycy4wLnBhcmVudFxuXHQqL1xuXHRjb25zdCBpc1NhbWVPYmplY3RUcmVlID0gKGNoaWxkUGF0aCwgZXhpc3RpbmdQYXRoKSA9PiB7XG5cdFx0aWYgKGlzU3ltYm9sKGNoaWxkUGF0aCkgfHwgY2hpbGRQYXRoLmxlbmd0aCA8PSBleGlzdGluZ1BhdGgubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKEFycmF5LmlzQXJyYXkoZXhpc3RpbmdQYXRoKSAmJiBleGlzdGluZ1BhdGgubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2hpbGRQYXJ0cyA9IEFycmF5LmlzQXJyYXkoY2hpbGRQYXRoKSA/IGNoaWxkUGF0aCA6IGNoaWxkUGF0aC5zcGxpdChQQVRIX1NFUEFSQVRPUik7XG5cdFx0Y29uc3QgZXhpc3RpbmdQYXJ0cyA9IEFycmF5LmlzQXJyYXkoZXhpc3RpbmdQYXRoKSA/IGV4aXN0aW5nUGF0aCA6IGV4aXN0aW5nUGF0aC5zcGxpdChQQVRIX1NFUEFSQVRPUik7XG5cblx0XHRpZiAoY2hpbGRQYXJ0cy5sZW5ndGggPD0gZXhpc3RpbmdQYXJ0cy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gIShleGlzdGluZ1BhcnRzLnNvbWUoKHBhcnQsIGluZGV4KSA9PiBwYXJ0ICE9PSBjaGlsZFBhcnRzW2luZGV4XSkpO1xuXHR9O1xuXG5cdC8vIFVuaWZpZWQgaGFuZGxlciBmb3IgU21hcnRDbG9uZS1iYXNlZCBtZXRob2QgZXhlY3V0aW9uXG5cdGNvbnN0IGhhbmRsZU1ldGhvZEV4ZWN1dGlvbiA9ICh0YXJnZXQsIHRoaXNBcmd1bWVudCwgdGhpc1Byb3h5VGFyZ2V0LCBhcmd1bWVudHNMaXN0KSA9PiB7XG5cdFx0Ly8gU3RhbmRhcmQgU21hcnRDbG9uZSBwYXRoIGZvciBhbGwgaGFuZGxlZCB0eXBlcyBpbmNsdWRpbmcgRGF0ZVxuXHRcdGxldCBhcHBseVBhdGggPSBwYXRoLmluaXRpYWwoY2FjaGUuZ2V0UGF0aCh0YXJnZXQpKTtcblx0XHRjb25zdCBpc0hhbmRsZWRNZXRob2QgPSBTbWFydENsb25lLmlzSGFuZGxlZE1ldGhvZCh0aGlzUHJveHlUYXJnZXQsIHRhcmdldC5uYW1lKTtcblxuXHRcdHNtYXJ0Q2xvbmUuc3RhcnQodGhpc1Byb3h5VGFyZ2V0LCBhcHBseVBhdGgsIGFyZ3VtZW50c0xpc3QpO1xuXG5cdFx0bGV0IHJlc3VsdDtcblx0XHQvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBhcnJheSBzZWFyY2ggbWV0aG9kcyB0aGF0IG5lZWQgcHJveHktYXdhcmUgY29tcGFyaXNvblxuXHRcdGlmIChBcnJheS5pc0FycmF5KHRoaXNQcm94eVRhcmdldCkgJiYgQVJSQVlfU0VBUkNIX01FVEhPRFMuaGFzKHRhcmdldC5uYW1lKSkge1xuXHRcdFx0cmVzdWx0ID0gcGVyZm9ybVByb3h5QXdhcmVBcnJheVNlYXJjaCh7XG5cdFx0XHRcdHByb3h5QXJyYXk6IHRoaXNQcm94eVRhcmdldCxcblx0XHRcdFx0bWV0aG9kTmFtZTogdGFyZ2V0Lm5hbWUsXG5cdFx0XHRcdHNlYXJjaEVsZW1lbnQ6IGFyZ3VtZW50c0xpc3RbMF0sXG5cdFx0XHRcdGZyb21JbmRleDogYXJndW1lbnRzTGlzdFsxXSxcblx0XHRcdFx0Z2V0UHJveHlUYXJnZXQsXG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0ID0gUmVmbGVjdC5hcHBseShcblx0XHRcdFx0dGFyZ2V0LFxuXHRcdFx0XHRzbWFydENsb25lLnByZWZlcnJlZFRoaXNBcmcodGFyZ2V0LCB0aGlzQXJndW1lbnQsIHRoaXNQcm94eVRhcmdldCksXG5cdFx0XHRcdGlzSGFuZGxlZE1ldGhvZFxuXHRcdFx0XHRcdD8gYXJndW1lbnRzTGlzdC5tYXAoYXJndW1lbnQgPT4gZ2V0UHJveHlUYXJnZXQoYXJndW1lbnQpKVxuXHRcdFx0XHRcdDogYXJndW1lbnRzTGlzdCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaXNDaGFuZ2VkID0gc21hcnRDbG9uZS5pc0NoYW5nZWQodGhpc1Byb3h5VGFyZ2V0LCBlcXVhbHMpO1xuXHRcdGNvbnN0IHByZXZpb3VzID0gc21hcnRDbG9uZS5zdG9wKCk7XG5cblx0XHRpZiAoU21hcnRDbG9uZS5pc0hhbmRsZWRUeXBlKHJlc3VsdCkgJiYgaXNIYW5kbGVkTWV0aG9kKSB7XG5cdFx0XHRpZiAodGhpc0FyZ3VtZW50IGluc3RhbmNlb2YgTWFwICYmIHRhcmdldC5uYW1lID09PSAnZ2V0Jykge1xuXHRcdFx0XHRhcHBseVBhdGggPSBwYXRoLmNvbmNhdChhcHBseVBhdGgsIGFyZ3VtZW50c0xpc3RbMF0pO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXN1bHQgPSBjYWNoZS5nZXRQcm94eShyZXN1bHQsIGFwcGx5UGF0aCwgaGFuZGxlcik7XG5cdFx0fVxuXG5cdFx0aWYgKGlzQ2hhbmdlZCkge1xuXHRcdFx0Ly8gUHJvdmlkZSBhcHBseURhdGEgYmFzZWQgb24gZGV0YWlscyBjb25maWd1cmF0aW9uXG5cdFx0XHRjb25zdCBhcHBseURhdGEgPSBzaG91bGRQcm92aWRlQXBwbHlEYXRhKGRldGFpbHMsIHRhcmdldC5uYW1lKVxuXHRcdFx0XHQ/IHtcblx0XHRcdFx0XHRuYW1lOiB0YXJnZXQubmFtZSxcblx0XHRcdFx0XHRhcmdzOiBhcmd1bWVudHNMaXN0LFxuXHRcdFx0XHRcdHJlc3VsdCxcblx0XHRcdFx0fVxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblxuXHRcdFx0Y29uc3QgY2hhbmdlUGF0aCA9IHNtYXJ0Q2xvbmUuaXNDbG9uaW5nXG5cdFx0XHRcdD8gcGF0aC5pbml0aWFsKGFwcGx5UGF0aClcblx0XHRcdFx0OiBhcHBseVBhdGg7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eSA9IHNtYXJ0Q2xvbmUuaXNDbG9uaW5nXG5cdFx0XHRcdD8gcGF0aC5sYXN0KGFwcGx5UGF0aClcblx0XHRcdFx0OiAnJztcblxuXHRcdFx0aWYgKHZhbGlkYXRlKHBhdGguZ2V0KG9iamVjdCwgY2hhbmdlUGF0aCksIHByb3BlcnR5LCB0aGlzUHJveHlUYXJnZXQsIHByZXZpb3VzLCBhcHBseURhdGEpKSB7XG5cdFx0XHRcdGhhbmRsZUNoYW5nZShjaGFuZ2VQYXRoLCBwcm9wZXJ0eSwgdGhpc1Byb3h5VGFyZ2V0LCBwcmV2aW91cywgYXBwbHlEYXRhKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNtYXJ0Q2xvbmUudW5kbyh0aGlzUHJveHlUYXJnZXQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdCh0aGlzQXJndW1lbnQgaW5zdGFuY2VvZiBNYXAgfHwgdGhpc0FyZ3VtZW50IGluc3RhbmNlb2YgU2V0KVxuXHRcdFx0JiYgaXNJdGVyYXRvcihyZXN1bHQpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gd3JhcEl0ZXJhdG9yKHJlc3VsdCwgdGFyZ2V0LCB0aGlzQXJndW1lbnQsIGFwcGx5UGF0aCwgcHJlcGFyZVZhbHVlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9O1xuXG5cdGNvbnN0IGhhbmRsZXIgPSB7XG5cdFx0Z2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG5cdFx0XHRpZiAoaXNTeW1ib2wocHJvcGVydHkpKSB7XG5cdFx0XHRcdGlmIChwcm9wZXJ0eSA9PT0gcHJveHlUYXJnZXQgfHwgcHJvcGVydHkgPT09IFRBUkdFVCkge1xuXHRcdFx0XHRcdHJldHVybiB0YXJnZXQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0cHJvcGVydHkgPT09IFVOU1VCU0NSSUJFXG5cdFx0XHRcdFx0JiYgIWNhY2hlLmlzVW5zdWJzY3JpYmVkXG5cdFx0XHRcdFx0JiYgY2FjaGUuZ2V0UGF0aCh0YXJnZXQpLmxlbmd0aCA9PT0gMFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRjYWNoZS51bnN1YnNjcmliZSgpO1xuXHRcdFx0XHRcdHJldHVybiB0YXJnZXQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgdmFsdWUgPSBpc0J1aWx0aW5XaXRoTXV0YWJsZU1ldGhvZHModGFyZ2V0KVxuXHRcdFx0XHQ/IFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcGVydHkpXG5cdFx0XHRcdDogUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpO1xuXG5cdFx0XHRyZXR1cm4gcHJlcGFyZVZhbHVlKHZhbHVlLCB0YXJnZXQsIHByb3BlcnR5KTtcblx0XHR9LFxuXG5cdFx0c2V0KHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCByZWNlaXZlcikge1xuXHRcdFx0dmFsdWUgPSBnZXRQcm94eVRhcmdldCh2YWx1ZSk7XG5cblx0XHRcdGNvbnN0IHJlZmxlY3RUYXJnZXQgPSB0YXJnZXRbcHJveHlUYXJnZXRdID8/IHRhcmdldDtcblx0XHRcdGNvbnN0IHByZXZpb3VzID0gcmVmbGVjdFRhcmdldFtwcm9wZXJ0eV07XG5cblx0XHRcdGlmIChlcXVhbHMocHJldmlvdXMsIHZhbHVlKSAmJiBwcm9wZXJ0eSBpbiB0YXJnZXQpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGlzVmFsaWQgPSB2YWxpZGF0ZSh0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSwgcHJldmlvdXMpO1xuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdGlzVmFsaWRcblx0XHRcdFx0JiYgY2FjaGUuc2V0UHJvcGVydHkocmVmbGVjdFRhcmdldCwgcHJvcGVydHksIHZhbHVlLCByZWNlaXZlciwgcHJldmlvdXMpXG5cdFx0XHQpIHtcblx0XHRcdFx0aGFuZGxlQ2hhbmdlT25UYXJnZXQodGFyZ2V0LCBwcm9wZXJ0eSwgdGFyZ2V0W3Byb3BlcnR5XSwgcHJldmlvdXMpO1xuXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gIWlzVmFsaWQ7XG5cdFx0fSxcblxuXHRcdGRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHksIGRlc2NyaXB0b3IpIHtcblx0XHRcdGlmICghY2FjaGUuaXNTYW1lRGVzY3JpcHRvcihkZXNjcmlwdG9yLCB0YXJnZXQsIHByb3BlcnR5KSkge1xuXHRcdFx0XHRjb25zdCBwcmV2aW91cyA9IHRhcmdldFtwcm9wZXJ0eV07XG5cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHZhbGlkYXRlKHRhcmdldCwgcHJvcGVydHksIGRlc2NyaXB0b3IudmFsdWUsIHByZXZpb3VzKVxuXHRcdFx0XHRcdCYmIGNhY2hlLmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHksIGRlc2NyaXB0b3IpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdC8vIEZvciBhY2Nlc3NvciBkZXNjcmlwdG9ycyAoZ2V0dGVycy9zZXR0ZXJzKSwgZGVzY3JpcHRvci52YWx1ZSBpcyB1bmRlZmluZWRcblx0XHRcdFx0XHQvLyBXZSBuZWVkIHRvIGdldCB0aGUgYWN0dWFsIHZhbHVlIGFmdGVyIHRoZSBwcm9wZXJ0eSBpcyBkZWZpbmVkXG5cdFx0XHRcdFx0Y29uc3QgaGFzVmFsdWUgPSBPYmplY3QuaGFzT3duKGRlc2NyaXB0b3IsICd2YWx1ZScpO1xuXHRcdFx0XHRcdGNvbnN0IHZhbHVlID0gaGFzVmFsdWVcblx0XHRcdFx0XHRcdD8gZGVzY3JpcHRvci52YWx1ZVxuXHRcdFx0XHRcdFx0OiAoKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFJlYWQgdGhlIGFjdHVhbCB2YWx1ZSB0aHJvdWdoIHRoZSBnZXR0ZXJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdGFyZ2V0W3Byb3BlcnR5XTtcblx0XHRcdFx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIGdldHRlciB0aHJvd3MsIHVzZSB1bmRlZmluZWRcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KSgpO1xuXG5cdFx0XHRcdFx0aGFuZGxlQ2hhbmdlT25UYXJnZXQodGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUsIHByZXZpb3VzKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0ZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eSkge1xuXHRcdFx0aWYgKCFSZWZsZWN0Lmhhcyh0YXJnZXQsIHByb3BlcnR5KSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcHJldmlvdXMgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3BlcnR5KTtcblx0XHRcdGNvbnN0IGlzVmFsaWQgPSB2YWxpZGF0ZSh0YXJnZXQsIHByb3BlcnR5LCB1bmRlZmluZWQsIHByZXZpb3VzKTtcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRpc1ZhbGlkXG5cdFx0XHRcdCYmIGNhY2hlLmRlbGV0ZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHksIHByZXZpb3VzKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGhhbmRsZUNoYW5nZU9uVGFyZ2V0KHRhcmdldCwgcHJvcGVydHksIHVuZGVmaW5lZCwgcHJldmlvdXMpO1xuXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gIWlzVmFsaWQ7XG5cdFx0fSxcblxuXHRcdGFwcGx5KHRhcmdldCwgdGhpc0FyZ3VtZW50LCBhcmd1bWVudHNMaXN0KSB7XG5cdFx0XHQvLyBIYW5kbGUgY2FzZSB3aGVyZSB0aGlzQXJndW1lbnQgaXMgdW5kZWZpbmVkL251bGwgKGUuZy4sIGV4dHJhY3RlZCBtZXRob2QgY2FsbHMpXG5cdFx0XHRjb25zdCB0aGlzUHJveHlUYXJnZXQgPSB0aGlzQXJndW1lbnQ/Lltwcm94eVRhcmdldF0gPz8gdGhpc0FyZ3VtZW50O1xuXG5cdFx0XHRpZiAoY2FjaGUuaXNVbnN1YnNjcmliZWQpIHtcblx0XHRcdFx0cmV0dXJuIFJlZmxlY3QuYXBwbHkodGFyZ2V0LCB0aGlzUHJveHlUYXJnZXQsIGFyZ3VtZW50c0xpc3QpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDaGVjayBpZiBTbWFydENsb25lIHNob3VsZCBiZSB1c2VkIGZvciBhZ2dyZWdhdGUgY2hhbmdlIHRyYWNraW5nXG5cdFx0XHRpZiAoU21hcnRDbG9uZS5pc0hhbmRsZWRUeXBlKHRoaXNQcm94eVRhcmdldCkpIHtcblx0XHRcdFx0Ly8gU2tpcCBTbWFydENsb25lIGZvciBjdXN0b20gbWV0aG9kcyBvbiBwbGFpbiBvYmplY3RzIHRvIGVuYWJsZSBwcm9wZXJ0eS1sZXZlbCB0cmFja2luZ1xuXHRcdFx0XHQvLyBOb3RlOiBUaGlzIGFwcHJvYWNoIGRvZXNuJ3Qgc3VwcG9ydCBwcml2YXRlIGZpZWxkcyAoI2ZpZWxkKSB3aGljaCByZXF1aXJlIHRoZSBvcmlnaW5hbCBpbnN0YW5jZVxuXHRcdFx0XHRjb25zdCBpc1BsYWluT2JqZWN0Q3VzdG9tTWV0aG9kID0gaXNPYmplY3QodGhpc1Byb3h5VGFyZ2V0KVxuXHRcdFx0XHRcdCYmICFTbWFydENsb25lLmlzSGFuZGxlZE1ldGhvZCh0aGlzUHJveHlUYXJnZXQsIHRhcmdldC5uYW1lKTtcblxuXHRcdFx0XHRpZiAoIWlzUGxhaW5PYmplY3RDdXN0b21NZXRob2QpIHtcblx0XHRcdFx0XHQvLyBVc2UgU21hcnRDbG9uZSBmb3IgaW50ZXJuYWwgbWV0aG9kcyBvciBiYXNlZCBvbiBkZXRhaWxzIGNvbmZpZ3VyYXRpb25cblx0XHRcdFx0XHRjb25zdCBpc0ludGVybmFsTWV0aG9kID0gdHlwZW9mIHRhcmdldC5uYW1lID09PSAnc3ltYm9sJ1xuXHRcdFx0XHRcdFx0fHwgSVRFUkFUT1JfTUVUSE9EX05BTUVTLmhhcyh0YXJnZXQubmFtZSk7XG5cblx0XHRcdFx0XHRjb25zdCBzaG91bGRVc2VTbWFydENsb25lID0gaXNJbnRlcm5hbE1ldGhvZFxuXHRcdFx0XHRcdFx0fHwgZGV0YWlscyA9PT0gZmFsc2Vcblx0XHRcdFx0XHRcdHx8IChBcnJheS5pc0FycmF5KGRldGFpbHMpICYmICFkZXRhaWxzLmluY2x1ZGVzKHRhcmdldC5uYW1lKSk7XG5cblx0XHRcdFx0XHRpZiAoc2hvdWxkVXNlU21hcnRDbG9uZSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGhhbmRsZU1ldGhvZEV4ZWN1dGlvbih0YXJnZXQsIHRoaXNBcmd1bWVudCwgdGhpc1Byb3h5VGFyZ2V0LCBhcmd1bWVudHNMaXN0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gU3BlY2lhbCBoYW5kbGluZyBmb3IgRGF0ZSBtdXRhdGlvbnMgd2hlbiBkZXRhaWxzIG9wdGlvbiBpcyB1c2VkXG5cdFx0XHQvLyBUaGlzIGFsbG93cyB0cmFja2luZyBEYXRlIG1ldGhvZCBjYWxscyB3aXRoIGFwcGx5IGRhdGFcblx0XHRcdGlmICh0aGlzUHJveHlUYXJnZXQgaW5zdGFuY2VvZiBEYXRlICYmIFNtYXJ0Q2xvbmUuaXNIYW5kbGVkTWV0aG9kKHRoaXNQcm94eVRhcmdldCwgdGFyZ2V0Lm5hbWUpKSB7XG5cdFx0XHRcdGNvbnN0IHByZXZpb3VzVGltZSA9IHRoaXNQcm94eVRhcmdldC5nZXRUaW1lKCk7XG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuYXBwbHkodGFyZ2V0LCB0aGlzUHJveHlUYXJnZXQsIGFyZ3VtZW50c0xpc3QpO1xuXHRcdFx0XHRjb25zdCBjdXJyZW50VGltZSA9IHRoaXNQcm94eVRhcmdldC5nZXRUaW1lKCk7XG5cblx0XHRcdFx0aWYgKCFlcXVhbHMocHJldmlvdXNUaW1lLCBjdXJyZW50VGltZSkpIHtcblx0XHRcdFx0XHRjb25zdCBhcHBseVBhdGggPSBjYWNoZS5nZXRQYXRoKHRoaXNQcm94eVRhcmdldCk7XG5cblx0XHRcdFx0XHRpZiAoc2hvdWxkUHJvdmlkZUFwcGx5RGF0YShkZXRhaWxzLCB0YXJnZXQubmFtZSkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGFwcGx5RGF0YSA9IHtcblx0XHRcdFx0XHRcdFx0bmFtZTogdGFyZ2V0Lm5hbWUsXG5cdFx0XHRcdFx0XHRcdGFyZ3M6IGFyZ3VtZW50c0xpc3QsXG5cdFx0XHRcdFx0XHRcdHJlc3VsdCxcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRjb25zdCBwcmV2aW91c0RhdGUgPSBuZXcgRGF0ZShwcmV2aW91c1RpbWUpO1xuXG5cdFx0XHRcdFx0XHRpZiAodmFsaWRhdGUocGF0aC5nZXQob2JqZWN0LCBhcHBseVBhdGgpLCAnJywgdGhpc1Byb3h5VGFyZ2V0LCBwcmV2aW91c0RhdGUsIGFwcGx5RGF0YSkpIHtcblx0XHRcdFx0XHRcdFx0aGFuZGxlQ2hhbmdlKGFwcGx5UGF0aCwgJycsIHRoaXNQcm94eVRhcmdldCwgcHJldmlvdXNEYXRlLCBhcHBseURhdGEpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gVW5kbyB0aGUgY2hhbmdlIGlmIHZhbGlkYXRpb24gZmFpbHNcblx0XHRcdFx0XHRcdFx0dGhpc1Byb3h5VGFyZ2V0LnNldFRpbWUocHJldmlvdXNUaW1lKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGb3IgcGxhaW4gb2JqZWN0IGN1c3RvbSBtZXRob2RzIG9yIHdoZW4gU21hcnRDbG9uZSBpcyBub3QgdXNlZCxcblx0XHRcdC8vIHVzZSB0aGUgcHJveHkgYXMgJ3RoaXMnIHRvIGVuc3VyZSBwcm9wZXJ0eSBtdXRhdGlvbnMgZ28gdGhyb3VnaCBwcm94eSB0cmFwc1xuXHRcdFx0cmV0dXJuIFJlZmxlY3QuYXBwbHkodGFyZ2V0LCB0aGlzQXJndW1lbnQsIGFyZ3VtZW50c0xpc3QpO1xuXHRcdH0sXG5cdH07XG5cblx0Y29uc3QgcHJveHkgPSBjYWNoZS5nZXRQcm94eShvYmplY3QsIG9wdGlvbnMucGF0aEFzQXJyYXkgPyBbXSA6ICcnLCBoYW5kbGVyKTtcblx0b25DaGFuZ2UgPSBvbkNoYW5nZS5iaW5kKHByb3h5KTtcblxuXHRpZiAoaGFzT25WYWxpZGF0ZSkge1xuXHRcdG9wdGlvbnMub25WYWxpZGF0ZSA9IG9wdGlvbnMub25WYWxpZGF0ZS5iaW5kKHByb3h5KTtcblx0fVxuXG5cdHJldHVybiBwcm94eTtcbn07XG5cbi8vIEhlbHBlciBmdW5jdGlvbiBmb3IgYXJyYXkgc2VhcmNoIG1ldGhvZHMgdGhhdCBuZWVkIHByb3h5LWF3YXJlIGNvbXBhcmlzb25cbmNvbnN0IHBlcmZvcm1Qcm94eUF3YXJlQXJyYXlTZWFyY2ggPSBvcHRpb25zID0+IHtcblx0Y29uc3Qge3Byb3h5QXJyYXksIG1ldGhvZE5hbWUsIHNlYXJjaEVsZW1lbnQsIGZyb21JbmRleCwgZ2V0UHJveHlUYXJnZXR9ID0gb3B0aW9ucztcblx0Y29uc3Qge2xlbmd0aH0gPSBwcm94eUFycmF5O1xuXG5cdGlmIChsZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4gbWV0aG9kTmFtZSA9PT0gJ2luY2x1ZGVzJyA/IGZhbHNlIDogLTE7XG5cdH1cblxuXHQvLyBQYXJzZSBmcm9tSW5kZXggYWNjb3JkaW5nIHRvIEVDTUFTY3JpcHQgc3BlY2lmaWNhdGlvblxuXHRjb25zdCBpc0xhc3RJbmRleE9mID0gbWV0aG9kTmFtZSA9PT0gJ2xhc3RJbmRleE9mJztcblx0bGV0IHN0YXJ0SW5kZXggPSBmcm9tSW5kZXggPT09IHVuZGVmaW5lZFxuXHRcdD8gKGlzTGFzdEluZGV4T2YgPyBsZW5ndGggLSAxIDogMClcblx0XHQ6IE1hdGgudHJ1bmMoTnVtYmVyKGZyb21JbmRleCkpIHx8IDA7XG5cblx0aWYgKHN0YXJ0SW5kZXggPCAwKSB7XG5cdFx0c3RhcnRJbmRleCA9IE1hdGgubWF4KDAsIGxlbmd0aCArIHN0YXJ0SW5kZXgpO1xuXHR9IGVsc2UgaWYgKGlzTGFzdEluZGV4T2YpIHtcblx0XHRzdGFydEluZGV4ID0gTWF0aC5taW4oc3RhcnRJbmRleCwgbGVuZ3RoIC0gMSk7XG5cdH1cblxuXHQvLyBDYWNoZSB0aGUgc2VhcmNoIGVsZW1lbnQncyB0YXJnZXQgZm9yIGVmZmljaWVuY3lcblx0Y29uc3Qgc2VhcmNoVGFyZ2V0ID0gZ2V0UHJveHlUYXJnZXQoc2VhcmNoRWxlbWVudCk7XG5cblx0Ly8gU2VhcmNoIHdpdGggYm90aCBwcm94eSBhbmQgdGFyZ2V0IGNvbXBhcmlzb25cblx0Y29uc3Qgc2VhcmNoQmFja3dhcmQgPSBtZXRob2ROYW1lID09PSAnbGFzdEluZGV4T2YnO1xuXHRjb25zdCBlbmRJbmRleCA9IHNlYXJjaEJhY2t3YXJkID8gLTEgOiBsZW5ndGg7XG5cdGNvbnN0IHN0ZXAgPSBzZWFyY2hCYWNrd2FyZCA/IC0xIDogMTtcblxuXHRmb3IgKGxldCBpbmRleCA9IHN0YXJ0SW5kZXg7IHNlYXJjaEJhY2t3YXJkID8gaW5kZXggPiBlbmRJbmRleCA6IGluZGV4IDwgZW5kSW5kZXg7IGluZGV4ICs9IHN0ZXApIHtcblx0XHRjb25zdCBlbGVtZW50ID0gcHJveHlBcnJheVtpbmRleF07XG5cdFx0aWYgKGVsZW1lbnQgPT09IHNlYXJjaEVsZW1lbnQgfHwgZ2V0UHJveHlUYXJnZXQoZWxlbWVudCkgPT09IHNlYXJjaFRhcmdldCkge1xuXHRcdFx0cmV0dXJuIG1ldGhvZE5hbWUgPT09ICdpbmNsdWRlcycgPyB0cnVlIDogaW5kZXg7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG1ldGhvZE5hbWUgPT09ICdpbmNsdWRlcycgPyBmYWxzZSA6IC0xO1xufTtcblxub25DaGFuZ2UudGFyZ2V0ID0gcHJveHkgPT4gcHJveHk/LltUQVJHRVRdID8/IHByb3h5O1xub25DaGFuZ2UudW5zdWJzY3JpYmUgPSBwcm94eSA9PiBwcm94eT8uW1VOU1VCU0NSSUJFXSA/PyBwcm94eTtcblxuZXhwb3J0IGRlZmF1bHQgb25DaGFuZ2U7XG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAL2NvcmUvbGlmZWN5Y2xlL1NjaGVtYS90eXBlc1wiO1xuaW1wb3J0IFJ1bnRpbWUgZnJvbSBcIkAvY29yZS9ydW50aW1lXCI7XG5pbXBvcnQgeyBjaGVja1JlbGF0aW9ucyB9IGZyb20gXCJAL2NvcmUvc2VydmljZXNcIjtcbmltcG9ydCB7IGNsb25lRGVlcCwgcmV2ZXJzZSwgc2V0IH0gZnJvbSBcImxvZGFzaFwiO1xuaW1wb3J0IG9uQ2hhbmdlIGZyb20gXCJvbi1jaGFuZ2VcIjtcbmltcG9ydCB7IHJlZiB9IGZyb20gXCJ2dWVcIjtcblxuLy8g6ZyA6KaB6ICD6JmR55qE5piv5Yib5bu657G75Z6L77yf77yM5Yib5bu65LuA5LmI5qC355qE57G75Z6LXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJ1bnRpbWU6IFJ1bnRpbWUpIHt9XG5cbiAgLyoqXG4gICAqIOaIkeS7rOefpemBkyBtb2RlbCDnmoTlhbPplK7mmK8gZmllbGQg5ZKMIGRlZmF1bHRWYWx1ZSwg55Sx5LqO5oiR5Lus5qC55pys5LiN55+l6YGT6L+Z5Liq6L+H56iL5LuA5LmI5pe25YCZXG4gICAqIOS8muinpuWPkeWIsOiwge+8jOacieWPr+iDvemDveaYr+W8guatpe+8jOaIkeS7rOS5n+S4jeefpemBk+iwgeWFiOaJp+ihjO+8jOS9huaYr+WvueS6juWIneWni+WMliBtb2RlbCDmnaXor7TvvIzmiJHku6znn6XpgZPvvIzkuIDlrprmnIlcbiAgICog5LiA5Liq5ZCMIHBhdGgg55qEIGZpZWxkIOWvueW6lOS4gOS4quWQjCBwYXRoIOeahCBkZWZhdWx0VmFsdWXvvIzlpoLmnpzlpITnkIblrozpg73ov5jmsqHmnInnu5PmnZ/vvIzpgqPkuYjliankuIvnmoRcbiAgICog5bCx5piv5rKh5pyJ5o+Q5L6bIGRlZmF1bHRWYWx1ZSDnmoQgZmllbGTvvIzpgqPkuYjmiJHku6zlho3nu5nku5borr7nva7kuLogdW5kZWZpbmVkXG4gICAqL1xuXG4gIC8vIOWFs+ezu+ihqO+8jOeUqOS6juaUtumbhiBmaWVsZCDlkowgZGVmYXVsdFZhbHVlIOeahOWvueW6lOWFs+ezuywga2V5IOaYryBwYXRoXG4gIHJlbGF0aW9uTWFwID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcblxuICBtb2RlbCA9IHJlZjxSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgICBvbkNoYW5nZSh7fSwgKHBhdGgpID0+IHtcbiAgICAgIHRoaXMucnVudGltZS5fdXBkYXRlLnRyaWdnZXIoXCJtb2RlbFwiLCBwYXRoKTtcbiAgICB9KVxuICApO1xuXG4gIGltbXV0YWJsZU1vZGVsID0ge307XG5cbiAgYWxsQ29uc3VtZWQgPSByZWYoZmFsc2UpO1xuXG4gIC8vIOm7mOiupOaYr+iusOW9leWFs+ezu++8jOWmguaenOajgOa1i+WIsOWQjCBwYXRoIOeahCBkZWZhdWx0VmFsdWUg5ZKMIGZpZWxkIOmDveW3sue7j+eos+WumiBwcm9jZXNzZWTvvIzpgqPkuYjliJnlj6/ku6XmtojotLnorrDlvZVcbiAgLy8g5raI6LS56K6w5b2V5Y+q6ZyA6KaB57uZ5piv5ZCm5raI6LS555qE5qCH6K6w572u5Li6IHRydWVcbiAgcHJvY2Vzc1JlbGF0aW9uKG1ldGFkYXRhOiBNZXRhZGF0YSwgdmFsdWU6IGFueSkge1xuICAgIGlmIChcbiAgICAgICFtZXRhZGF0YS5wcm9wZXJ0eUtleSB8fFxuICAgICAgIVtcImRlZmF1bHRWYWx1ZVwiLCBcImZpZWxkXCIsIFwidHlwZVwiXS5pbmNsdWRlcyhtZXRhZGF0YS5wcm9wZXJ0eUtleSkgfHxcbiAgICAgIC8vIOi/memHjOaYr+S4uuS6humYsuatouWDjyBjb21wb25lbnRQcm9wcyDkuK3miJbogIXku4DkuYggc2xvdHMg5Lit5Lmf5Ye6546wIHR5cGUg6KKr5b2T5L2c57G75Yir5p2l5aSE55CGXG4gICAgICAhbWV0YWRhdGEucGF0aC5lbmRzV2l0aChcIl1cIilcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhLnByb3BlcnR5S2V5ID09PSBcInR5cGVcIiAmJiB2YWx1ZSA9PT0gXCJncm91cFwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1heUJlUmVsYXRpb24gPSB0aGlzLnJlbGF0aW9uTWFwLmdldChtZXRhZGF0YS5wYXRoKTtcbiAgICBsZXQgYWxsb3dDb25zdW1lID0gZmFsc2U7XG4gICAgbGV0IHNraXBDb25zdW1lID0gZmFsc2U7XG4gICAgaWYgKG1heUJlUmVsYXRpb24gJiYgbWF5QmVSZWxhdGlvbi5pc0NvbnN1bWVkID09PSB0cnVlKSB7XG4gICAgICBza2lwQ29uc3VtZSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHNraXBDb25zdW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmICghYWxsb3dDb25zdW1lKSB7XG4gICAgICB0aGlzLnJlbGF0aW9uTWFwLnNldChtZXRhZGF0YS5wYXRoLCB7XG4gICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAuLi50aGlzLnJlbGF0aW9uTWFwLmdldChtZXRhZGF0YS5wYXRoKSxcbiAgICAgICAgW21ldGFkYXRhLnByb3BlcnR5S2V5XTogdmFsdWUsXG4gICAgICAgIGlzQ29uc3VtZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBsYXRlc3RSZWxhdGlvbiA9IHRoaXMucmVsYXRpb25NYXAuZ2V0KG1ldGFkYXRhLnBhdGgpO1xuICAgICAgaWYgKFxuICAgICAgICBcImRlZmF1bHRWYWx1ZVwiIGluIGxhdGVzdFJlbGF0aW9uICYmXG4gICAgICAgIFwiZmllbGRcIiBpbiBsYXRlc3RSZWxhdGlvbiAmJlxuICAgICAgICBcInR5cGVcIiBpbiBsYXRlc3RSZWxhdGlvblxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZVJlbGF0aW9uKG1ldGFkYXRhLnBhdGgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN1bWVSZWxhdGlvbihwYXRoOiBzdHJpbmcpIHtcbiAgICAvLyDmtojotLnlhbPns7tcbiAgICBjb25zdCByZWxhdGlvbiA9IHRoaXMucmVsYXRpb25NYXAuZ2V0KHBhdGgpO1xuICAgIGlmIChyZWxhdGlvbi5wcm9jZXNzZWRQYXRoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g5raI6LS5XG4gICAgdGhpcy5jb25zdW1lKHJlbGF0aW9uKTtcblxuICAgIC8vIOiuvue9ruWfuuS6jiBwYXRoIOeahOWkhOeQhueKtuaAgVxuICAgIHRoaXMucmVsYXRpb25NYXAuc2V0KHBhdGgsIHtcbiAgICAgIC4uLnJlbGF0aW9uLFxuICAgICAgcHJvY2Vzc2VkUGF0aDogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorqnmiJHku6zlhYjmnaXmmI7noa7kuIDkupvnjrDnirZcbiAgICog55Sx5LqO5pW05Liq6Kej5p6Q6L+H56iL5piv5peg54q25oCB5peg5L6d6LWW5peg6aG65bqP55qE77yM5omA5Lul5oiR5Lus5bm25LiN5riF5qWa6LCB5YWI5p2l5ZCO5Yiw77yM5omA5Lul5Zyo6L+Z56eN5Zy65pmv5LiL77yM5pWw5o2u5LiA5a6a6KaB6Z2e5bi455qE5bmy5YeA5pyJ6YC76L6RXG4gICAqIDHjgIHml6AgZmllbGQg55qE57G75Z6L5LiN5Lya6KKr6K6h5YWlIHJhbGF0aW9uTWFwXG4gICAqIDLjgIHlpoLmnpzkuIDkuKrmtojotLnlhbPns7vnmoQgcGF0aCDljIXlkKvkuoYgY2hpbGRyZW7vvIzpgqPkuYjlroPlj6/og73mmK/lnKggZ3JvdXAg6YeM77yM5Lmf5Y+v6IO95piv5ZyoIGxpc3Qg6YeMXG4gICAqIDPjgIHlpoLmnpzkuIDkuKrmtojotLnlhbPns7vnmoQgcGF0aCDljIXlkKvkuoYgY2hpbGRyZW7vvIzlubbkuJQgcmVsYXRpb25NYXAg5Lit5a2Y5ZyoIHBhdGgg5piv5b2T5YmNIHBhdGgg55qE5YmN57yA77yM6YKj5LmI5a6D5LiA5a6a5piv5ZyoIGxpc3Qg6YeMXG4gICAqIDTjgIHlkIznkIbvvIzlpoLmnpzmib7kuI3liLDov5nmoLfnmoTliY3nvIDvvIzpgqPkuYjlroPkuIDlrprmmK/lnKggZ3JvdXAg6YeMXG4gICAqL1xuICBjb25zdW1lKHJlbGF0aW9uOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgY29uc3QgcGF0aCA9IHJlbGF0aW9uLm1ldGFkYXRhLnBhdGg7XG4gICAgY29uc3QgY2hlY2tSZXN1bHQgPSBjaGVja1JlbGF0aW9ucyh0aGlzLnJlbGF0aW9uTWFwLCBwYXRoKTtcblxuICAgIGlmIChwYXRoLmluY2x1ZGVzKFwiY2hpbGRyZW5cIikpIHtcbiAgICAgIC8qKlxuICAgICAgICog6ZyA6KaB5Yy65YiG5pivIGdyb3VwIOi/mOaYryBsaXN077yMZ3JvdXAg5YiZ5L2/55So5pmu6YCa55qE5raI6LS56YC76L6R77yMbGlzdCDliJnpnIDopoHmm7TlpI3mnYLnmoTpgLvovpFcbiAgICAgICAqIOWvueS6jiBsaXN0IOadpeivtO+8jOWmguaenOW9k+WJjSBtb2RlbFxuICAgICAgICovXG5cbiAgICAgIGlmICghY2hlY2tSZXN1bHQuaXNMaXN0Q2hpbGQpIHtcbiAgICAgICAgLy8g5a+55LqOIGdyb3VwIOexu+Wei+S4i+eahOaVsOaNru+8jOebtOaOpea2iOi0uVxuXG4gICAgICAgIHNldCh0aGlzLm1vZGVsLnZhbHVlLCByZWxhdGlvbi5maWVsZCwgcmVsYXRpb24uZGVmYXVsdFZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOWIneWni+WMluaIluiAheS+neasoeiOt+WPluW9k+WJjSBtb2RlbCDph4znmoTnirbmgIFcbiAgICAgICAgLy8g6L+Z6YeM5Lmf5pyJ5Lik56eN5oOF5Ya1XG4gICAgICAgIC8vIDHjgIHov5nml7blgJkgbGlzdCBmaWVsZCDlt7Lnu4/lrZjlnKjvvIzpgqPkuYjlj6rpnIDopoHlvoDlrZjlnKjnmoTmlbDmja7kuK3ljrvmm7TmlrBcbiAgICAgICAgLy8gMuOAgei/meaXtuWAmSBsaXN0IOeahCBmaWVsZCDov5jmnKrnn6XvvIzmiJHku6zkuZ/kuI3nn6XpgZPopoHmm7TmlrDliLDku4DkuYjlnLDmlrnvvIzmiYDku6Xov5nkuKrmm7TmlrDmmK/kuIDkuKrmgqzlnoLnmoTnirbmgIFcbiAgICAgICAgdGhpcy5yZXNvbHZlUmVsYXRpb25zKHJldmVyc2UoY2hlY2tSZXN1bHQuZXhpc3RpbmdSZWxhdGlvbnMpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8g5pmu6YCa5raI6LS56YC76L6RXG4gICAgICBzZXQodGhpcy5tb2RlbC52YWx1ZSwgcmVsYXRpb24uZmllbGQsIHJlbGF0aW9uLmRlZmF1bHRWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5q+P5qyh6YO95qOA5rWL5LiA5LiL77yM5b2T5omA5pyJ55qE5raI6LS55Z2H5bey5a6M5oiQ5pe277yM5YiZ5Y+v5Lul55WZ5a2Y5LiA5Lu95rC46L+c5LiN5Lya6KKr5pS55Y+Y55qEIG1vZGVs77yM6L+Z5LiqIG1vZGVsIOaYr+WIneWni+WMliBtb2RlbCDnmoTmnIDnu4jnu5PmnpzvvIzkvr/kuo5cbiAgICAgKiDlkI7nu63lrp7njrDph43nva7pgLvovpHmiJbogIXmmK8gbGlzdCDnmoTmt7vliqDpgLvovpHnrYlcbiAgICAgKi9cbiAgICB0aGlzLmNoZWNraW5nQ29uc3VtZSgpO1xuICB9XG5cbiAgZGVmYXVsdFZhbHVlQ2FsY0J5VHlwZSh0eXBlOiBzdHJpbmcpIHtcbiAgICBpZiAodHlwZSA9PT0gXCJsaXN0XCIpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJlc29sdmVSZWxhdGlvbnMocmVsYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sIGJhc2VQYXRoPzogc3RyaW5nKSB7XG4gICAgaWYgKHJlbGF0aW9ucy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCB7IGN1cnJlbnQsIHBhcmVudCB9ID0gcmVsYXRpb25zWzBdO1xuICAgIGlmICghY3VycmVudC5maWVsZCkgcmV0dXJuO1xuICAgIC8vIOWmguaenOaciSBmaWVsZCDkvYbmmK/msqHmnIkgZGVmYXVsdFZhbHVlIOivtOaYjiBkZWZhdWx0VmFsdWUg5piv5byC5q2l5aSE55CG77yM5L2GIGZpZWxkIOW3sue7j+acieS6hu+8jOaJgOS7peWPr+S7peS4jemYu+Whnue7p+e7reW+gOS4i+i1sFxuICAgIGlmICghKFwiZGVmYXVsdFZhbHVlXCIgaW4gY3VycmVudCkpIHtcbiAgICAgIHJlbGF0aW9ucy5zaGlmdCgpO1xuICAgICAgdGhpcy5yZXNvbHZlUmVsYXRpb25zKFxuICAgICAgICBbLi4ucmVsYXRpb25zXSxcbiAgICAgICAgYmFzZVBhdGhcbiAgICAgICAgICA/IGAke2Jhc2VQYXRofS5bMF0uJHtjdXJyZW50LmZpZWxkfWBcbiAgICAgICAgICA6ICFwYXJlbnRcbiAgICAgICAgICA/IGN1cnJlbnQuZmllbGRcbiAgICAgICAgICA6IGBbMF0uJHtjdXJyZW50LmZpZWxkfWBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFjdXJyZW50LmlzQ29uc3VtZWQpIHtcbiAgICAgIHNldChcbiAgICAgICAgdGhpcy5tb2RlbC52YWx1ZSxcbiAgICAgICAgYCR7YmFzZVBhdGggPyBgJHtiYXNlUGF0aH0uWzBdLiR7Y3VycmVudC5maWVsZH1gIDogYCR7Y3VycmVudC5maWVsZH1gfWAsXG4gICAgICAgIGN1cnJlbnQuZGVmYXVsdFZhbHVlID8/IHRoaXMuZGVmYXVsdFZhbHVlQ2FsY0J5VHlwZShjdXJyZW50LnR5cGUpXG4gICAgICApO1xuICAgICAgY3VycmVudC5pc0NvbnN1bWVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZWxhdGlvbnMuc2hpZnQoKTtcbiAgICB0aGlzLnJlc29sdmVSZWxhdGlvbnMoXG4gICAgICBbLi4ucmVsYXRpb25zXSxcbiAgICAgIGJhc2VQYXRoXG4gICAgICAgID8gYCR7YmFzZVBhdGh9LlswXS4ke2N1cnJlbnQuZmllbGR9YFxuICAgICAgICA6ICFwYXJlbnRcbiAgICAgICAgPyBjdXJyZW50LmZpZWxkXG4gICAgICAgIDogYFswXS4ke2N1cnJlbnQuZmllbGR9YFxuICAgICk7XG4gIH1cblxuICBpc0FsbENvbnN1bWVkKCkge1xuICAgIHJldHVybiAodGhpcy5hbGxDb25zdW1lZC52YWx1ZSA9IEFycmF5LmZyb20oXG4gICAgICB0aGlzLnJlbGF0aW9uTWFwLnZhbHVlcygpXG4gICAgKS5ldmVyeSgocmVsYXRpb24pID0+IHtcbiAgICAgIC8vIOi/memHjOi/mOmcgOimgemhvuWPiuS4gOenjeaDheWGte+8jOS5n+WwseaYr+eUqOaIt+aPkOS+m+S6huS4jeWtmOWcqCBmaWVsZCDkuZ/kuI3lrZjlnKggZGVmYXVsdFZhbHVlIOeahCByZWxhdGlvbu+8jOavlOWmguS7heWBmuWxleekuueUqOeahOe7hOS7tu+8jOaXpeacn+Wxleekuuetieetiei/meenjeaDheWGtVxuICAgICAgLy8g5Lmf5bqU5b2T6KKr6K6k5Li65piv5LiA56eN5aSE55CG5a6M5q+V55qE54q25oCBXG4gICAgICBpZiAoIShcImRlZmF1bHRWYWx1ZVwiIGluIHJlbGF0aW9uKSAmJiAhKFwiZmllbGRcIiBpbiByZWxhdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVsYXRpb24uaXNDb25zdW1lZDtcbiAgICB9KSk7XG4gIH1cblxuICBjaGVja2luZ0NvbnN1bWUoKSB7XG4gICAgLy8g5qOA5rWLIHJlbGF0aW9uTWFwIOmHjOavj+S4gOmhuemDveaciSBcImRlZmF1bHRWYWx1ZVwiIFwidHlwZVwiIFwiZmllbGRcIlxuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbiBvZiB0aGlzLnJlbGF0aW9uTWFwLnZhbHVlcygpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIFwiZGVmYXVsdFZhbHVlXCIgaW4gcmVsYXRpb24gJiZcbiAgICAgICAgXCJ0eXBlXCIgaW4gcmVsYXRpb24gJiZcbiAgICAgICAgXCJmaWVsZFwiIGluIHJlbGF0aW9uXG4gICAgICApIHtcbiAgICAgICAgcmVsYXRpb24uaXNDb25zdW1lZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNBbGxDb25zdW1lZCgpKSB7XG4gICAgICB0aGlzLmltbXV0YWJsZU1vZGVsID0gY2xvbmVEZWVwKHRoaXMubW9kZWwudmFsdWUpO1xuICAgIH1cbiAgfVxufVxuIiwiLy8gVE9ETyDlkI7nu63liqDlhaUgcHgg6L2s5o2i5Zmo77yM5L2/5b6X5LiA5Lqb6ZyA6KaB6L2s5o2i55qE5Zy65pmv5Y+v5Lul57uf5LiA5aSE55CG5ZCI6YCC55qE6Ze06LedXG5cbmltcG9ydCB7IEZvcm1Db250ZXh0IH0gZnJvbSBcIkAvY29yZS9jb250ZXh0XCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VCYXNlU3R5bGUodmFsdWU/OiBudW1iZXIpOiBBbnlPYmplY3Qge1xuICBjb25zdCBnYXAgPSB2YWx1ZSA/PyBGb3JtQ29udGV4dC5jb250ZXh0LmRlZmF1bHQ/LmxheW91dEdhcCA/PyAxNjtcbiAgcmV0dXJuIHtcbiAgICBnYXA6IGAke2dhcH1weGAsXG4gICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgZmxleFdyYXA6IFwid3JhcFwiLFxuICAgIGp1c3RpZnlDb250ZW50OiBcImZsZXgtc3RhcnRcIixcbiAgICBiYWNrZ3JvdW5kOiBGb3JtQ29udGV4dC5jb250ZXh0LmRlZmF1bHQ/LmdhcEJnQ29sb3IgPz8gXCJ0cmFuc3BhcmVudFwiLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlTGlzdEJhc2VTdHlsZSh2YWx1ZT86IG51bWJlcik6IEFueU9iamVjdCB7XG4gIGNvbnN0IGdhcCA9IHZhbHVlID8/IEZvcm1Db250ZXh0LmNvbnRleHQuZGVmYXVsdD8ubGlzdExheW91dEdhcCA/PyAxNjtcbiAgcmV0dXJuIHtcbiAgICBnYXA6IGAke2dhcH1weGAsXG4gICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgZmxleFdyYXA6IFwid3JhcFwiLFxuICAgIGp1c3RpZnlDb250ZW50OiBcImZsZXgtc3RhcnRcIixcbiAgICBiYWNrZ3JvdW5kOiBGb3JtQ29udGV4dC5jb250ZXh0LmRlZmF1bHQ/LmdhcEJnQ29sb3IgPz8gXCJ0cmFuc3BhcmVudFwiLFxuICB9O1xufVxuIiwiaW1wb3J0IFJ1bnRpbWUgZnJvbSBcIkAvY29yZS9ydW50aW1lXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VGb3JtSXRlbVByb3BzKFxuICBydW50aW1lOiBSdW50aW1lLFxuICBzY2hlbWE6IGFueSxcbiAgYmFzZUZpZWxkUGF0aD86IHN0cmluZ1xuKSB7XG4gIGNvbnN0IF9mb3JtTW9kZWxLZXkgPSBydW50aW1lLl9hZGFwdGVyLmFkYXB0ZWUuZm9ybU1vZGVsS2V5O1xuICBjb25zdCBmb3JtSXRlbVByb3BzID0ge1xuICAgIFtfZm9ybU1vZGVsS2V5XTogYmFzZUZpZWxkUGF0aFxuICAgICAgPyBgJHtiYXNlRmllbGRQYXRofS4ke3NjaGVtYS5maWVsZH1gXG4gICAgICA6IHNjaGVtYS5maWVsZCxcbiAgICAuLi5zY2hlbWEuZm9ybUl0ZW1Qcm9wcyxcbiAgfTtcbiAgcmV0dXJuIGZvcm1JdGVtUHJvcHM7XG59XG4iLCJpbXBvcnQgeyBGb3JtQ29udGV4dCB9IGZyb20gXCJAL2NvcmUvY29udGV4dFwiO1xuaW1wb3J0IFJ1bnRpbWUgZnJvbSBcIkAvY29yZS9ydW50aW1lXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VGb3JtUHJvcHMocnVudGltZTogUnVudGltZSkge1xuICBjb25zdCBmb3JtUHJvcHMgPSB7XG4gICAgLi4uKEZvcm1Db250ZXh0LmNvbnRleHQuZGVmYXVsdD8uZm9ybVByb3BzID8/IHt9KSxcbiAgICAuLi5ydW50aW1lLl9vcHRpb25zLmZvcm1Qcm9wcyxcbiAgfTtcbiAgcmV0dXJuIGZvcm1Qcm9wcztcbn1cbiIsImltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSBcImxvZGFzaFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlTGFiZWwobGFiZWw6IHN0cmluZyB8IEFueUZ1bmN0aW9uLCBiYXNlRmllbGRQYXRoPzogc3RyaW5nKSB7XG4gIGlmICghbGFiZWwpIHJldHVybjtcbiAgaWYgKCFiYXNlRmllbGRQYXRoIHx8IGlzU3RyaW5nKGxhYmVsKSkge1xuICAgIHJldHVybiBsYWJlbDtcbiAgfVxuICBjb25zdCBpbmRleCA9IGJhc2VGaWVsZFBhdGguc3BsaXQoXCIuXCIpLnBvcCgpO1xuICByZXR1cm4gbGFiZWwoaW5kZXgpO1xufVxuIiwiaW1wb3J0IFJ1bnRpbWUgZnJvbSBcIkAvY29yZS9ydW50aW1lXCI7XG5pbXBvcnQgeyBpc1BsYWluT2JqZWN0LCBpc1N0cmluZyB9IGZyb20gXCJsb2Rhc2hcIjtcblxuY29uc3Qgc2NoZW1hVHlwZVRvTGF5b3V0ID0ge1xuICBpdGVtOiBcIkl0ZW1cIixcbiAgZ3JvdXA6IFwiR3JvdXBcIixcbiAgbGlzdDogXCJMaXN0XCIsXG4gIGxpc3RJdGVtOiBcIkxpc3RJdGVtXCIsXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlTGF5b3V0KHJ1bnRpbWU6IFJ1bnRpbWUsIHNjaGVtYTogYW55LCBmYWxsYmFjaz86IHN0cmluZykge1xuICBpZiAoc2NoZW1hLnR5cGUgPT09IFwibGlzdFwiKSB7XG4gICAgY29uc3QgbGF5b3V0cyA9IHtcbiAgICAgIExpc3Q6IHJ1bnRpbWUuX3JlbmRlci5tZXRhLmxheW91dHMuTGlzdCxcbiAgICAgIExpc3RJdGVtOiBydW50aW1lLl9yZW5kZXIubWV0YS5sYXlvdXRzLkxpc3RJdGVtLFxuICAgIH07XG4gICAgaWYgKHNjaGVtYS5sYXlvdXQ/Lkxpc3QgfHwgc2NoZW1hLmxheW91dD8uTGlzdEl0ZW0pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmxheW91dHMsXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKHNjaGVtYS5sYXlvdXQpLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgICBpZiAoaXNTdHJpbmcoc2NoZW1hLmxheW91dFtrZXldKSkge1xuICAgICAgICAgICAgYWNjW2tleV0gPVxuICAgICAgICAgICAgICBydW50aW1lLl9yZW5kZXIubWV0YS5sYXlvdXRzW1xuICAgICAgICAgICAgICAgIHNjaGVtYS5sYXlvdXRba2V5XSBhcyBrZXlvZiB0eXBlb2YgcnVudGltZS5fcmVuZGVyLm1ldGEubGF5b3V0c1xuICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzUGxhaW5PYmplY3Qoc2NoZW1hLmxheW91dFtrZXldKSkge1xuICAgICAgICAgICAgYWNjW2tleV0gPSBzY2hlbWEubGF5b3V0W2tleV07XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhY2Nba2V5XSA9XG4gICAgICAgICAgICBydW50aW1lLl9yZW5kZXIubWV0YS5sYXlvdXRzW1xuICAgICAgICAgICAgICBrZXkgYXMga2V5b2YgdHlwZW9mIHJ1bnRpbWUuX3JlbmRlci5tZXRhLmxheW91dHNcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgYW55PiksXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbGF5b3V0cztcbiAgICB9XG4gIH1cblxuICBpZiAoaXNTdHJpbmcoc2NoZW1hLmxheW91dCkpIHtcbiAgICByZXR1cm4gcnVudGltZS5fcmVuZGVyLm1ldGEubGF5b3V0c1tcbiAgICAgIHNjaGVtYS5sYXlvdXQgYXMga2V5b2YgdHlwZW9mIHJ1bnRpbWUuX3JlbmRlci5tZXRhLmxheW91dHNcbiAgICBdO1xuICB9XG4gIGlmIChpc1BsYWluT2JqZWN0KHNjaGVtYS5sYXlvdXQpKSB7XG4gICAgcmV0dXJuIHNjaGVtYS5sYXlvdXQ7XG4gIH1cbiAgaWYgKGZhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHJ1bnRpbWUuX3JlbmRlci5tZXRhLmxheW91dHNbXG4gICAgICBmYWxsYmFjayBhcyBrZXlvZiB0eXBlb2YgcnVudGltZS5fcmVuZGVyLm1ldGEubGF5b3V0c1xuICAgIF07XG4gIH1cbiAgcmV0dXJuIHJ1bnRpbWUuX3JlbmRlci5tZXRhLmxheW91dHNbXG4gICAgc2NoZW1hVHlwZVRvTGF5b3V0W1xuICAgICAgc2NoZW1hLnR5cGUgYXMga2V5b2YgdHlwZW9mIHNjaGVtYVR5cGVUb0xheW91dFxuICAgIF0gYXMga2V5b2YgdHlwZW9mIHJ1bnRpbWUuX3JlbmRlci5tZXRhLmxheW91dHNcbiAgXTtcbn1cbiIsIi8qKlxuICogVE9ET++8muS4gOenjeeugOWNleeahOW4g+WxgOiuoeeul++8jOWPr+iDveW4puadpeeahOmXrumimOaYr+WcqOWtmOWcqCBweCDovazmjaLnmoTmg4XlhrXkuIvvvIzov5nkuKrluIPlsYDkuI3kvJrlvojnsr7lh4bvvIwxNnB4IOWSjOWunumZheeahOmhueebriBweCDlj6/og73lrZjlnKjlt67lvIJcbiAqIOWQjue7reaciemcgOimgeeahOivneWPr+S7peaPkOS+m+S4gOS4qiBweCDnmoTlrprkuYnlmajvvIzmr5Xnq5/np7vliqjnq6/kuIrpnIDopoHov5nnp43luIPlsYDnmoTlnLrmma/kuZ/kuI3lpJpcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlTGF5b3V0U3R5bGUoc2NoZW1hOiBBbnlPYmplY3QsIGxheW91dEdhcCA9IDE2KSB7XG4gIGlmICghc2NoZW1hLnNwYW4pXG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICB9O1xuXG4gIGNvbnN0IGdhcCA9IGxheW91dEdhcDtcbiAgY29uc3QgbGF5b3V0Q291bnQgPSAyNCAvIChzY2hlbWEuc3BhbiA/PyAyNCk7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IGBjYWxjKCR7KChzY2hlbWEuc3BhbiA/PyAyNCkgLyAyNCkgKiAxMDB9JSAtICR7XG4gICAgICAoKHNjaGVtYS5zcGFuID8/IDI0KSAvIDI0KSAqIGdhcCAqIChsYXlvdXRDb3VudCAtIDEpXG4gICAgfXB4KWAsXG4gICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcbiAgICBib3hTaXppbmc6IFwiYm9yZGVyLWJveFwiLFxuICAgIHZlcnRpY2FsQWxpZ246IFwidG9wXCIsXG4gIH07XG59XG4iLCJpbXBvcnQgeyBwaWNrQnkgfSBmcm9tIFwibG9kYXNoXCI7XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVZhbHVlVG9LZXkodGFyZ2V0OiBBbnlPYmplY3QpIHtcbiAgY29uc3QgdHJhbnNmb3JtZWQ6IEFueU9iamVjdCA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiB0YXJnZXQpIHtcbiAgICB0YXJnZXRba2V5XS5mb3JFYWNoKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICB0cmFuc2Zvcm1lZFt2YWx1ZV0gPSBrZXk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHRyYW5zZm9ybWVkO1xufVxuXG5jb25zdCBuYW1lUGxhY2Vob2xkZXJNYXAgPSB0cmFuc2Zvcm1WYWx1ZVRvS2V5KHtcbiAg6K+36YCJ5oupOiBbXCJzZWxlY3RcIiwgXCJ0cmVlXCIsIFwiY2FzY2FkZXJcIl0sXG4gIOivt+i+k+WFpTogW1wiaW5wdXRcIl0sXG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVBsYWNlaG9sZGVyKGxhYmVsOiBzdHJpbmcsIGNvbXBvbmVudE5hbWU/OiBzdHJpbmcpIHtcbiAgaWYgKCFsYWJlbCkgcmV0dXJuO1xuICBsZXQgcGxhY2Vob2xkZXIgPSBg6K+36L6T5YWlJHtsYWJlbH1gO1xuICBPYmplY3Qua2V5cyhuYW1lUGxhY2Vob2xkZXJNYXApLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGlmIChjb21wb25lbnROYW1lPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGtleS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgcGxhY2Vob2xkZXIgPSBgJHtuYW1lUGxhY2Vob2xkZXJNYXBba2V5XX0ke2xhYmVsfWA7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHBsYWNlaG9sZGVyO1xufVxuIiwiaW1wb3J0IHsgaXNCb29sZWFuLCBpc1N0cmluZyB9IGZyb20gXCJsb2Rhc2hcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVJ1bGVzKHNjaGVtYTogQW55T2JqZWN0KSB7XG4gIGxldCB7IHJ1bGVzLCByZXF1aXJlZCB9ID0gc2NoZW1hO1xuICBydWxlcyA9IHJ1bGVzID8gWy4uLnJ1bGVzXSA6IFtdO1xuICBjb25zdCByZXF1aXJlZFJ1bGVJbmRleCA9IHJ1bGVzLmZpbmRJbmRleChcbiAgICAocnVsZTogQW55T2JqZWN0KSA9PiByZXF1aXJlZCBpbiBydWxlXG4gICk7XG4gIGlmIChpc1N0cmluZyhyZXF1aXJlZCkpIHtcbiAgICBjb25zdCByZXF1aXJlZFJ1bGUgPSB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiByZXF1aXJlZCB9O1xuICAgIGlmIChyZXF1aXJlZFJ1bGVJbmRleCA+PSAwKSB7XG4gICAgICBydWxlc1tyZXF1aXJlZFJ1bGVJbmRleF0gPSByZXF1aXJlZFJ1bGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJ1bGVzLnVuc2hpZnQocmVxdWlyZWRSdWxlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuKHJlcXVpcmVkKSAmJiByZXF1aXJlZCkge1xuICAgIGNvbnN0IHJ1bGUgPSB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiBgJHtzY2hlbWEubGFiZWx95LiN6IO95Li656m6YCB9O1xuICAgIGlmIChyZXF1aXJlZFJ1bGVJbmRleCA+PSAwKSB7XG4gICAgICBydWxlc1tyZXF1aXJlZFJ1bGVJbmRleF0gPSBydWxlO1xuICAgIH0gZWxzZSB7XG4gICAgICBydWxlcy51bnNoaWZ0KHJ1bGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBydWxlcztcbn1cbiIsImltcG9ydCB7IEZvcm1Db250ZXh0IH0gZnJvbSBcIkAvY29yZS9jb250ZXh0XCI7XG5pbXBvcnQge1xuICB1c2VCYXNlU3R5bGUsXG4gIHVzZUxpc3RCYXNlU3R5bGUsXG59IGZyb20gXCJAL2NvcmUvbGlmZWN5Y2xlL2hvb2tzL3VzZUJhc2VTdHlsZVwiO1xuaW1wb3J0IHsgdXNlRm9ybUl0ZW1Qcm9wcyB9IGZyb20gXCJAL2NvcmUvbGlmZWN5Y2xlL2hvb2tzL3VzZUZvcm1JdGVtUHJvcHNcIjtcbmltcG9ydCB7IHVzZUZvcm1Qcm9wcyB9IGZyb20gXCJAL2NvcmUvbGlmZWN5Y2xlL2hvb2tzL3VzZUZvcm1Qcm9wc1wiO1xuaW1wb3J0IHsgdXNlTGFiZWwgfSBmcm9tIFwiQC9jb3JlL2xpZmVjeWNsZS9ob29rcy91c2VMYWJlbFwiO1xuaW1wb3J0IHsgdXNlTGF5b3V0IH0gZnJvbSBcIkAvY29yZS9saWZlY3ljbGUvaG9va3MvdXNlTGF5b3V0XCI7XG5pbXBvcnQgeyB1c2VMYXlvdXRTdHlsZSB9IGZyb20gXCJAL2NvcmUvbGlmZWN5Y2xlL2hvb2tzL3VzZUxheW91dFN0eWxlXCI7XG5pbXBvcnQgeyB1c2VQbGFjZWhvbGRlciB9IGZyb20gXCJAL2NvcmUvbGlmZWN5Y2xlL2hvb2tzL3VzZVBsYWNlaG9sZGVyXCI7XG5pbXBvcnQgeyB1c2VSdWxlcyB9IGZyb20gXCJAL2NvcmUvbGlmZWN5Y2xlL2hvb2tzL3VzZVJ1bGVzXCI7XG5pbXBvcnQgeyBQYXJzZWRTY2hlbWEgfSBmcm9tIFwiQC9jb3JlL2xpZmVjeWNsZS9TY2hlbWEvdHlwZXNcIjtcbmltcG9ydCBSdW50aW1lIGZyb20gXCJAL2NvcmUvcnVudGltZVwiO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBnZXQsIGlzQm9vbGVhbiwgaXNTdHJpbmcsIHNldCB9IGZyb20gXCJsb2Rhc2hcIjtcbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCwgcmVmLCB0b1JhdyB9IGZyb20gXCJ2dWVcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVuZGVyIHtcbiAgcHVibGljIG1ldGE7XG4gIHB1YmxpYyBmb3JtUmVmID0gcmVmKCk7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHJ1bnRpbWU6IFJ1bnRpbWUpIHtcbiAgICB0aGlzLm1ldGEgPSB0aGlzLmdldFJlbmRlck1ldGEoKTtcbiAgfVxuXG4gIGdldFJlbmRlck1ldGEoKSB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSBGb3JtQ29udGV4dC5nZXRUZW1wbGF0ZSh0aGlzLnJ1bnRpbWUuX29wdGlvbnMudGVtcGxhdGVJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIEZvcm06IHRlbXBsYXRlLnByb3ZpZGVycy5Gb3JtLFxuICAgICAgRm9ybUl0ZW06IHRlbXBsYXRlLnByb3ZpZGVycy5Gb3JtSXRlbSxcbiAgICAgIGxheW91dHM6IHRlbXBsYXRlLnByb3ZpZGVycy5sYXlvdXRzLFxuICAgICAgYWRhcHRlcnM6IHt9LFxuICAgIH07XG4gIH1cblxuICByZW5kZXJJdGVtU2NoZW1hKFxuICAgIHNjaGVtYTogUGFyc2VkU2NoZW1hLFxuICAgIG1vZGVsU291cmNlID0gdGhpcy5ydW50aW1lLl9tb2RlbC5tb2RlbC52YWx1ZSxcbiAgICBiYXNlRmllbGRQYXRoPzogc3RyaW5nLFxuICAgIExheW91dD86IGFueVxuICApIHtcbiAgICBjb25zdCBmaWVsZFRhcmdldCA9IGJhc2VGaWVsZFBhdGhcbiAgICAgID8gYCR7YmFzZUZpZWxkUGF0aH0uJHtzY2hlbWEuZmllbGR9YFxuICAgICAgOiBzY2hlbWEuZmllbGQ7XG4gICAgY29uc3QgY29tcG9uZW50UmVmID0gcmVmKCk7XG4gICAgLy8g5pS26ZuGIHJlZnMg5Lul5L6bIGhlbHBlcnMg5L2/55SoXG4gICAgdGhpcy5ydW50aW1lLl9zY2hlbWEucmVmcy5zZXQoZmllbGRUYXJnZXQsIGNvbXBvbmVudFJlZik7XG4gICAgY29uc3QgQ29tcG9uZW50ID0gdG9SYXcoc2NoZW1hLmNvbXBvbmVudCk7XG4gICAgaWYgKCFDb21wb25lbnQpIHJldHVybjtcbiAgICBjb25zdCBmb3JtSXRlbVByb3BzID0gdXNlRm9ybUl0ZW1Qcm9wcyh0aGlzLnJ1bnRpbWUsIHNjaGVtYSwgYmFzZUZpZWxkUGF0aCk7XG4gICAgY29uc3Qgc2hvdyA9IGlzQm9vbGVhbihzY2hlbWEuc2hvdykgPyBzY2hlbWEuc2hvdyA6IHRydWU7XG4gICAgY29uc3QgbGFiZWwgPSB1c2VMYWJlbChzY2hlbWEubGFiZWwsIGJhc2VGaWVsZFBhdGgpO1xuICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gdXNlUGxhY2Vob2xkZXIobGFiZWwsIENvbXBvbmVudC5uYW1lKTtcblxuICAgIHJldHVybiAoXG4gICAgICBzaG93ICYmIChcbiAgICAgICAgPExheW91dCBzdHlsZT17dXNlTGF5b3V0U3R5bGUoc2NoZW1hLCB0aGlzLnJ1bnRpbWUuX29wdGlvbnMubGF5b3V0R2FwKX0+XG4gICAgICAgICAgPHRoaXMubWV0YS5Gb3JtSXRlbVxuICAgICAgICAgICAgey4uLmZvcm1JdGVtUHJvcHN9XG4gICAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgICBydWxlcz17dXNlUnVsZXMoc2NoZW1hKX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAuLi5zY2hlbWEuZm9ybUl0ZW1TbG90cyxcbiAgICAgICAgICAgICAgZGVmYXVsdDogKCkgPT4gKFxuICAgICAgICAgICAgICAgIDxDb21wb25lbnRcbiAgICAgICAgICAgICAgICAgIHJlZj17Y29tcG9uZW50UmVmfVxuICAgICAgICAgICAgICAgICAgbW9kZWxWYWx1ZT17Z2V0KG1vZGVsU291cmNlLCBzY2hlbWEuZmllbGQpfVxuICAgICAgICAgICAgICAgICAgb25VcGRhdGU6bW9kZWxWYWx1ZT17KHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0KG1vZGVsU291cmNlLCBzY2hlbWEuZmllbGQsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgICAgICAgICB7Li4uc2NoZW1hLmNvbXBvbmVudFByb3BzfVxuICAgICAgICAgICAgICAgID48L0NvbXBvbmVudD5cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPC90aGlzLm1ldGEuRm9ybUl0ZW0+XG4gICAgICAgIDwvTGF5b3V0PlxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICByZW5kZXJMaXN0U2NoZW1hKFxuICAgIHNjaGVtYTogUGFyc2VkU2NoZW1hLFxuICAgIG1vZGVsU291cmNlID0gdGhpcy5ydW50aW1lLl9tb2RlbC5tb2RlbC52YWx1ZSxcbiAgICBiYXNlRmllbGRQYXRoPzogc3RyaW5nLFxuICAgIGJhc2VNb2RlbFBhdGg/OiBzdHJpbmcsXG4gICAgTGF5b3V0PzogYW55XG4gICkge1xuICAgIC8vIOi/memHjOS9v+eUqCBbe31dIOaYr+WboOS4uuS+v+S6juW/q+mAn+a4suafk+WHuuesrOS4gOS4quepuuiKgueCue+8jOmBv+WFjeWboOS4uui/mOayoeWkhOeQhuWujOaIkOWvvOiHtOmhtemdouS4gOebtOS4jeWxleekuuWGheWuuVxuICAgIGNvbnN0IGxpc3RNb2RlbCA9IGdldChtb2RlbFNvdXJjZSwgc2NoZW1hLmZpZWxkKSA/PyBbe31dO1xuICAgIHJldHVybiAoXG4gICAgICA8TGF5b3V0Lkxpc3RcbiAgICAgICAgbGlzdE1vZGVsPXtsaXN0TW9kZWx9XG4gICAgICAgIHN0eWxlPXt1c2VMYXlvdXRTdHlsZShzY2hlbWEsIHRoaXMucnVudGltZS5fb3B0aW9ucy5sYXlvdXRHYXApfVxuICAgICAgPlxuICAgICAgICB7e1xuICAgICAgICAgIGRlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBsaXN0TW9kZWwubWFwKChtb2RlbDogYW55LCBtb2RlbEluZGV4OiBudW1iZXIpID0+IChcbiAgICAgICAgICAgICAgPExheW91dC5MaXN0SXRlbT5cbiAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt1c2VMaXN0QmFzZVN0eWxlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bnRpbWUuX29wdGlvbnMubGlzdExheW91dEdhcFxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7c2NoZW1hLmNoaWxkcmVuLm1hcCgoY2hpbGRTY2hlbWE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJQYXJzZWRTY2hlbWEoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRTY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUZpZWxkUGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBgJHtiYXNlRmllbGRQYXRofS4ke3NjaGVtYS5maWVsZH0uJHttb2RlbEluZGV4fWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYCR7c2NoZW1hLmZpZWxkfS4ke21vZGVsSW5kZXh9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlTW9kZWxQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGAke2Jhc2VNb2RlbFBhdGh9LiR7c2NoZW1hLmZpZWxkfS5bJHswfV1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGAke3NjaGVtYS5maWVsZH0uWyR7MH1dYFxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZGVsZXRlOiAoeyByZW5kZXIgfTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IERlbGV0ZSA9IHJlbmRlcigpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtaW5MZW4gPSBzY2hlbWEubWluTGVuID8/IDE7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgbGlzdE1vZGVsLmxlbmd0aCA+IG1pbkxlbiAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8RGVsZXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshdGhpcy5ydW50aW1lLl9tb2RlbC5hbGxDb25zdW1lZC52YWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RNb2RlbC5zcGxpY2UobGlzdE1vZGVsLmluZGV4T2YobW9kZWwpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA8L0xheW91dC5MaXN0SXRlbT5cbiAgICAgICAgICAgICkpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgYWRkOiAoeyByZW5kZXIgfTogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBBZGQgPSByZW5kZXIoKTtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIDxBZGRcbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17IXRoaXMucnVudGltZS5fbW9kZWwuYWxsQ29uc3VtZWQudmFsdWV9XG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZU1vZGVsID0gYCR7XG4gICAgICAgICAgICAgICAgICAgIGJhc2VNb2RlbFBhdGhcbiAgICAgICAgICAgICAgICAgICAgICA/IGAke2Jhc2VNb2RlbFBhdGh9LiR7c2NoZW1hLmZpZWxkfS5bMF1gXG4gICAgICAgICAgICAgICAgICAgICAgOiBgJHtzY2hlbWEuZmllbGR9LlswXWBcbiAgICAgICAgICAgICAgICAgIH1gO1xuICAgICAgICAgICAgICAgICAgY29uc3QgdG9CZUFkZGVkID0gZ2V0KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bnRpbWUuX21vZGVsLmltbXV0YWJsZU1vZGVsLFxuICAgICAgICAgICAgICAgICAgICBiYXNlTW9kZWxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBtb2RlbFNvdXJjZVtzY2hlbWEuZmllbGRdLnB1c2goY2xvbmVEZWVwKHRvQmVBZGRlZCkpO1xuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgIH19XG4gICAgICA8L0xheW91dC5MaXN0PlxuICAgICk7XG4gIH1cblxuICByZW5kZXJHcm91cFNjaGVtYShcbiAgICBzY2hlbWE6IFBhcnNlZFNjaGVtYSxcbiAgICBtb2RlbFNvdXJjZSA9IHRoaXMucnVudGltZS5fbW9kZWwubW9kZWwudmFsdWUsXG4gICAgYmFzZUZpZWxkUGF0aD86IHN0cmluZyxcbiAgICBMYXlvdXQ/OiBhbnlcbiAgKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxMYXlvdXQgc3R5bGU9e3VzZUxheW91dFN0eWxlKHNjaGVtYSwgdGhpcy5ydW50aW1lLl9vcHRpb25zLmxheW91dEdhcCl9PlxuICAgICAgICB7e1xuICAgICAgICAgIGRlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzY2hlbWEuY2hpbGRyZW4ubWFwKChjaGlsZFNjaGVtYTogYW55KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlclBhcnNlZFNjaGVtYShcbiAgICAgICAgICAgICAgICBjaGlsZFNjaGVtYSxcbiAgICAgICAgICAgICAgICBtb2RlbFNvdXJjZSxcbiAgICAgICAgICAgICAgICBiYXNlRmllbGRQYXRoXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICB9fVxuICAgICAgPC9MYXlvdXQ+XG4gICAgKTtcbiAgfVxuXG4gIHJlbmRlclBhcnNlZFNjaGVtYShcbiAgICBzY2hlbWE6IFBhcnNlZFNjaGVtYSxcbiAgICBtb2RlbFNvdXJjZSA9IHRoaXMucnVudGltZS5fbW9kZWwubW9kZWwudmFsdWUsXG4gICAgYmFzZUZpZWxkUGF0aD86IHN0cmluZyxcbiAgICBiYXNlTW9kZWxQYXRoPzogc3RyaW5nXG4gICkge1xuICAgIGNvbnN0IExheW91dCA9IHVzZUxheW91dCh0aGlzLnJ1bnRpbWUsIHNjaGVtYSk7XG4gICAgc3dpdGNoIChzY2hlbWEudHlwZSkge1xuICAgICAgY2FzZSBcIml0ZW1cIjpcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVySXRlbVNjaGVtYShcbiAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgbW9kZWxTb3VyY2UsXG4gICAgICAgICAgYmFzZUZpZWxkUGF0aCxcbiAgICAgICAgICBMYXlvdXRcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJncm91cFwiOlxuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJHcm91cFNjaGVtYShcbiAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgbW9kZWxTb3VyY2UsXG4gICAgICAgICAgYmFzZUZpZWxkUGF0aCxcbiAgICAgICAgICBMYXlvdXRcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJsaXN0XCI6XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlckxpc3RTY2hlbWEoXG4gICAgICAgICAgc2NoZW1hLFxuICAgICAgICAgIG1vZGVsU291cmNlLFxuICAgICAgICAgIGJhc2VGaWVsZFBhdGgsXG4gICAgICAgICAgYmFzZU1vZGVsUGF0aCxcbiAgICAgICAgICBMYXlvdXRcbiAgICAgICAgKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlckl0ZW1TY2hlbWEoXG4gICAgICAgICAgc2NoZW1hLFxuICAgICAgICAgIG1vZGVsU291cmNlLFxuICAgICAgICAgIGJhc2VGaWVsZFBhdGgsXG4gICAgICAgICAgTGF5b3V0XG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiBkZWZpbmVDb21wb25lbnQoe1xuICAgICAgc2V0dXA6ICgpID0+IHtcbiAgICAgICAgY29uc3QgZm9ybVByb3BzID0gdXNlRm9ybVByb3BzKHRoaXMucnVudGltZSk7XG4gICAgICAgIHJldHVybiAoKSA9PiAoXG4gICAgICAgICAgPHRoaXMubWV0YS5Gb3JtXG4gICAgICAgICAgICByZWY9e3RoaXMuZm9ybVJlZn1cbiAgICAgICAgICAgIHsuLi5mb3JtUHJvcHN9XG4gICAgICAgICAgICB7Li4ue1xuICAgICAgICAgICAgICBbdGhpcy5ydW50aW1lLl9hZGFwdGVyLmFkYXB0ZWUuZm9ybU1vZGVsTmFtZV06XG4gICAgICAgICAgICAgICAgdGhpcy5ydW50aW1lLl9tb2RlbC5tb2RlbC52YWx1ZSxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgLi4udGhpcy5ydW50aW1lLl9vcHRpb25zLmZvcm1TbG90cyxcbiAgICAgICAgICAgICAgZGVmYXVsdDogKCkgPT4gKFxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3VzZUJhc2VTdHlsZSh0aGlzLnJ1bnRpbWUuX29wdGlvbnMubGF5b3V0R2FwKX0+XG4gICAgICAgICAgICAgICAgICB7dGhpcy5ydW50aW1lLl9zY2hlbWEucGFyc2VkU2NoZW1hcy52YWx1ZS5tYXAoKHNjaGVtYSkgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJQYXJzZWRTY2hlbWEuYmluZCh0aGlzKShzY2hlbWEpXG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA8L3RoaXMubWV0YS5Gb3JtPlxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHVzZVBhdGhUcmFja2VyPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICB0YXJnZXQ6IFQsXG4gIG9uQWNjZXNzOiAocGF0aDogc3RyaW5nKSA9PiB2b2lkXG4pOiBUIHtcbiAgY29uc3QgZ2V0RGVlcFZhbHVlU2FmZWx5ID0gKHBhdGg6IHN0cmluZ1tdKSA9PiB7XG4gICAgbGV0IHZhbHVlOiBhbnkgPSB0YXJnZXQ7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgcGF0aCkge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB2YWx1ZSA9IHZhbHVlW2tleV07XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcblxuICBjb25zdCBjcmVhdGVQcm94eSA9IChwYXRoOiBzdHJpbmdbXSk6IGFueSA9PiB7XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gZ2V0RGVlcFZhbHVlU2FmZWx5KHBhdGgpO1xuICAgIGNvbnN0IHByb3h5VGFyZ2V0ID0gdHlwZW9mIGN1cnJlbnRWYWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gKCkgPT4ge30gOiB7fTtcblxuICAgIHJldHVybiBuZXcgUHJveHkocHJveHlUYXJnZXQsIHtcbiAgICAgIGdldChfdGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJfX3Jhd19fXCIpIHtcbiAgICAgICAgICByZXR1cm4gY3VycmVudFZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGtleSA9PT0gXCJ2YWx1ZU9mXCIgfHxcbiAgICAgICAgICBrZXkgPT09IFwidG9TdHJpbmdcIiB8fFxuICAgICAgICAgIGtleSA9PT0gU3ltYm9sLnRvUHJpbWl0aXZlXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihcIi5cIik7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldERlZXBWYWx1ZVNhZmVseShwYXRoKTtcblxuICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoID4gMCkgb25BY2Nlc3MoZnVsbFBhdGgpO1xuXG4gICAgICAgICAgICBpZiAoa2V5ID09PSBcInRvU3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgICAgICAgICAgICAgIDogU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgICBjb25zdCBuZXh0UGF0aCA9IFsuLi5wYXRoLCBTdHJpbmcoa2V5KV07XG4gICAgICAgIGNvbnN0IG5leHRWYWx1ZSA9IGdldERlZXBWYWx1ZVNhZmVseShuZXh0UGF0aCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5leHRWYWx1ZSA9PT0gbnVsbCB8fFxuICAgICAgICAgIG5leHRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgKHR5cGVvZiBuZXh0VmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG5leHRWYWx1ZSAhPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBmdWxsUGF0aCA9IG5leHRQYXRoLmpvaW4oXCIuXCIpO1xuICAgICAgICAgIG9uQWNjZXNzKGZ1bGxQYXRoKTtcbiAgICAgICAgICByZXR1cm4gbmV4dFZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0ZVByb3h5KG5leHRQYXRoKTtcbiAgICAgIH0sXG5cbiAgICAgIGFwcGx5KF90YXJnZXQsIF90aGlzQXJnLCBhcmdzKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKFwiLlwiKTtcbiAgICAgICAgaWYgKHBhdGgubGVuZ3RoID4gMCkgb25BY2Nlc3MoZnVsbFBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGZ1bmMgPSBnZXREZWVwVmFsdWVTYWZlbHkocGF0aCk7XG4gICAgICAgIGlmICh0eXBlb2YgZnVuYyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguc2xpY2UoMCwgLTEpO1xuICAgICAgICAgIGNvbnN0IHBhcmVudCA9IGdldERlZXBWYWx1ZVNhZmVseShwYXJlbnRQYXRoKSB8fCB0YXJnZXQ7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkocGFyZW50LCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSxcblxuICAgICAgaGFzKF90YXJnZXQsIGtleSkge1xuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBnZXREZWVwVmFsdWVTYWZlbHkocGF0aCk7XG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgJiYgdHlwZW9mIGN1cnJlbnRWYWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmhhcyhjdXJyZW50VmFsdWUsIGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSxcblxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF90YXJnZXQsIGtleSkge1xuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBnZXREZWVwVmFsdWVTYWZlbHkocGF0aCk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAmJiB0eXBlb2YgY3VycmVudFZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgY29uc3QgZGVzYyA9IFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGN1cnJlbnRWYWx1ZSwga2V5KTtcblxuICAgICAgICAgIC8vIOWFs+mUruS/ruWkje+8muehruS/neaPj+i/sOespuS4juS7o+eQhuebruagh+WFvOWuuVxuICAgICAgICAgIC8vIOWmguaenOWxnuaAp+S4jeWPr+mFjee9ru+8jOaIkeS7rOmcgOimgeehruS/neWug+WcqOebruagh+S4iuWtmOWcqFxuICAgICAgICAgIGlmIChkZXNjICYmICFkZXNjLmNvbmZpZ3VyYWJsZSkge1xuICAgICAgICAgICAgLy8g5qOA5p+l5Luj55CG55uu5qCH5LiK5piv5ZCm5pyJ6L+Z5Liq5bGe5oCnXG4gICAgICAgICAgICBjb25zdCB0YXJnZXREZXNjID0gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX3RhcmdldCwga2V5KTtcbiAgICAgICAgICAgIGlmICghdGFyZ2V0RGVzYykge1xuICAgICAgICAgICAgICAvLyDlpoLmnpzku6PnkIbnm67moIfkuIrmsqHmnInvvIzov5Tlm57kuIDkuKrlj6/phY3nva7nmoTniYjmnKxcbiAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uZGVzYywgY29uZmlndXJhYmxlOiB0cnVlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGRlc2M7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSxcblxuICAgICAgb3duS2V5cyhfdGFyZ2V0KSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGdldERlZXBWYWx1ZVNhZmVseShwYXRoKTtcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAmJiB0eXBlb2YgY3VycmVudFZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyhjdXJyZW50VmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIGNyZWF0ZVByb3h5KFtdKTtcbn1cbiIsImltcG9ydCB7IEZvcm1Db250ZXh0IH0gZnJvbSBcIkAvY29yZS9jb250ZXh0XCI7XG5pbXBvcnQgUnVudGltZSBmcm9tIFwiQC9jb3JlL3J1bnRpbWVcIjtcbmltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSBcImxvZGFzaFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlU1NSQ29tcG9uZW50KGNvbXBvbmVudE5hbWU6IHN0cmluZywgcnVudGltZTogUnVudGltZSkge1xuICBpZiAoaXNTdHJpbmcoY29tcG9uZW50TmFtZSkpIHtcbiAgICByZXR1cm4gYXN5bmMgKCkgPT4gYXdhaXQgcnVudGltZS5zc3IucmVuZGVyQ29tcG9uZW50KGNvbXBvbmVudE5hbWUpO1xuICB9XG4gIHJldHVybiBjb21wb25lbnROYW1lO1xufVxuIiwiZXhwb3J0IGludGVyZmFjZSBUcmF2ZXJzZUNvbnRleHQge1xuICAvKipcbiAgICog5b2T5YmN6IqC54K55Zyo54i26IqC54K55Lit55qEIGtlee+8iOWmguaenOaYr+aVsOe7hO+8jOWImeS4uue0ouW8le+8iVxuICAgKi9cbiAga2V5OiBzdHJpbmcgfCBudW1iZXI7XG4gIC8qKlxuICAgKiDku47moLnliLDlvZPliY3oioLngrnnmoTot6/lvoTmlbDnu4RcbiAgICovXG4gIHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW107XG4gIC8qKlxuICAgKiDlvZPliY3oioLngrnnmoTniLboioLngrnvvIjlr7nosaHmiJbmlbDnu4TvvIlcbiAgICovXG4gIHBhcmVudDogYW55O1xuICAvKipcbiAgICog5qOA5p+l5b2T5YmN6IqC54K55piv5ZCm5Li65Y+25a2Q6IqC54K577yI5rKh5pyJ5a2Q6IqC54K577yJXG4gICAqL1xuICBpc0xlYWY6IGJvb2xlYW47XG59XG5cbi8qKlxuICog6YGN5Y6G5aSE55CG5Ye95pWwXG4gKiBAcGFyYW0gdmFsdWUg5b2T5YmN6IqC54K555qE5YC8XG4gKiBAcGFyYW0gY29udGV4dCDlvZPliY3oioLngrnnmoTkuIrkuIvmlodcbiAqIEByZXR1cm5zIOi/lOWbnuaWsOWAvOOAglxuICogLSDov5Tlm54gYFNLSVBg77ya6Lez6L+H5a2Q6IqC54K56YGN5Y6G44CCXG4gKiAtIOi/lOWbniBgREVMRVRFYO+8muWIoOmZpOatpOiKgueCueOAglxuICogLSDov5Tlm57lhbbku5blgLzvvJrnlKjor6XlgLzmm7/mjaLlvZPliY3oioLngrnjgIJcbiAqL1xuZXhwb3J0IHR5cGUgVHJhdmVyc2VIYW5kbGVyID0gKHZhbHVlOiBhbnksIGNvbnRleHQ6IFRyYXZlcnNlQ29udGV4dCkgPT4gYW55O1xuXG4vLyAtLS0g5Li75Ye95pWwIC0tLVxuXG4vKipcbiAqIOa3seW6pumBjeWOhuS4gOS4quWvueixoeaIluaVsOe7hO+8jOW5tuWFgeiuuOmAmui/hyBoYW5kbGVyIFwi5Y6f5ZywXCIg5L+u5pS544CB6Lez6L+H5oiW5Yig6Zmk6IqC54K544CCXG4gKiBAcGFyYW0gdGFyZ2V0IOimgemBjeWOhueahOWvueixoeaIluaVsOe7hFxuICogQHBhcmFtIGhhbmRsZXIg5Zyo5q+P5Liq6IqC54K55LiK6LCD55So55qE5aSE55CG5Ye95pWwXG4gKiBAcmV0dXJucyDnu4/ov4cgaGFuZGxlciDkv67mlLnlkI7nmoTljp/lp4vlr7nosaEgKGluLXBsYWNlKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcFRyYXZlcnNlPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICB0YXJnZXQ6IFQsXG4gIGhhbmRsZXI6IFRyYXZlcnNlSGFuZGxlclxuKTogVCB7XG4gIC8qKlxuICAgKiDlhoXpg6jpgJLlvZLlh73mlbBcbiAgICogQHBhcmFtIGN1cnJlbnQg5b2T5YmN5q2j5Zyo6YGN5Y6G55qE5YC8XG4gICAqIEBwYXJhbSBwYXRoIOWIsOi+viBgY3VycmVudGAg55qE6Lev5b6EXG4gICAqL1xuICBmdW5jdGlvbiB0cmF2ZXJzZVJlY3Vyc2l2ZShjdXJyZW50OiBhbnksIHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pIHtcbiAgICAvLyDmo4Dmn6XmmK/lkKbkuLrlr7nosaHmiJbmlbDnu4TvvIzlpoLmnpzkuI3mmK/vvIzliJnml6Dms5XigJzmt7HlhaXigJ1cbiAgICBpZiAodHlwZW9mIGN1cnJlbnQgIT09IFwib2JqZWN0XCIgfHwgY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIDEuIOWkhOeQhuaVsOe7hFxuICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnQpKSB7XG4gICAgICAvLyAqKuWFs+mUrioq77ya5L2/55So5qCH5YeGIGZvciDlvqrnjq/vvIjogIzkuI3mmK8gZm9yRWFjaO+8ie+8jFxuICAgICAgLy8g5Zug5Li65oiR5Lus6ZyA6KaB5ZyoIGBERUxFVEVgIOaTjeS9nOWQjuWuieWFqOWcsOS/ruaUuee0ouW8lSAoaW5kZXgtLSnjgIJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjdXJyZW50Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGN1cnJlbnRbaW5kZXhdO1xuICAgICAgICBjb25zdCBpc0xlYWYgPSB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGw7XG5cbiAgICAgICAgY29uc3QgY29udGV4dDogVHJhdmVyc2VDb250ZXh0ID0ge1xuICAgICAgICAgIGtleTogaW5kZXgsXG4gICAgICAgICAgcGF0aDogWy4uLnBhdGgsIGluZGV4XSxcbiAgICAgICAgICBwYXJlbnQ6IGN1cnJlbnQsXG4gICAgICAgICAgaXNMZWFmOiBpc0xlYWYsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSwgY29udGV4dCk7XG5cbiAgICAgICAgY3VycmVudFtpbmRleF0gPSByZXN1bHQ7XG5cbiAgICAgICAgLy8g5aaC5p6c5paw5YC85piv5Y+v6YGN5Y6G55qE77yI5LiU5pyq6KKr6Lez6L+H77yJ77yM5YiZ6YCS5b2SXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcIm9iamVjdFwiICYmIHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHRyYXZlcnNlUmVjdXJzaXZlKHJlc3VsdCwgY29udGV4dC5wYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyAyLiDlpITnkIbnuq/lr7nosaFcbiAgICBlbHNlIHtcbiAgICAgIC8vIOS9v+eUqCBPYmplY3Qua2V5cyDpgY3ljoZcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhjdXJyZW50KTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjdXJyZW50W2tleV07XG4gICAgICAgIGNvbnN0IGlzTGVhZiA9IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbDtcblxuICAgICAgICBjb25zdCBjb250ZXh0OiBUcmF2ZXJzZUNvbnRleHQgPSB7XG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgcGF0aDogWy4uLnBhdGgsIGtleV0sXG4gICAgICAgICAgcGFyZW50OiBjdXJyZW50LFxuICAgICAgICAgIGlzTGVhZjogaXNMZWFmLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIC0tLSDosIPnlKggSGFuZGxlciDlubblpITnkIbnu5PmnpwgLS0tXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGhhbmRsZXIodmFsdWUsIGNvbnRleHQpO1xuXG4gICAgICAgIC8vIOWOn+WcsOabv+aNolxuICAgICAgICBjdXJyZW50W2tleV0gPSByZXN1bHQ7XG5cbiAgICAgICAgLy8g5aaC5p6c5paw5YC85piv5Y+v6YGN5Y6G55qE77yI5LiU5pyq6KKr6Lez6L+H77yJ77yM5YiZ6YCS5b2SXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcIm9iamVjdFwiICYmIHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHRyYXZlcnNlUmVjdXJzaXZlKHJlc3VsdCwgY29udGV4dC5wYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIOW8gOWni+mBjeWOhuOAglxuICAvLyDms6jmhI/vvJrmiJHku6zkuI3lpITnkIbmoLnoioLngrnmnKzouqvvvIzlj6rlpITnkIblroPnmoTlrZDoioLngrnjgIJcbiAgLy8gKOS4jiBgdHJhdmVyc2VgIOW6k+S4jeWQjO+8jGB0cmF2ZXJzZWAg5Lya6K6/6Zeu5qC56IqC54K5KVxuICAvLyDov5nnp43orr7orqHmm7TnrKblkIggXCLljp/lnLBcIiDmm7/mjaLnmoTnm7Top4njgIJcbiAgdHJhdmVyc2VSZWN1cnNpdmUodGFyZ2V0LCBbXSk7XG5cbiAgLy8g6L+U5Zue6KKr5L+u5pS555qE5Y6f5aeL5a+56LGhXG4gIHJldHVybiB0YXJnZXQ7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gaXNSZXF1ZXN0RGlzcGF0Y2goZGlzcGF0Y2g6IHN0cmluZykge1xuICByZXR1cm4gW1wiR0VUXCIsIFwiUE9TVFwiLCBcIlBVVFwiLCBcIkRFTEVURVwiLCBcIlBBVENIXCJdLmluY2x1ZGVzKGRpc3BhdGNoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29uZGl0aW9uRGlzcGF0Y2goZGlzcGF0Y2g6IHN0cmluZykge1xuICByZXR1cm4gW1wiQ09ORElUSU9OXCJdLmluY2x1ZGVzKGRpc3BhdGNoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRXZlbnRIYW5kbGVyRGlzcGF0Y2goZGlzcGF0Y2g6IHN0cmluZykge1xuICByZXR1cm4gW1wiRVZFTlRfSEFORExFUlwiXS5pbmNsdWRlcyhkaXNwYXRjaCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NldE1vZGVsRGlzcGF0Y2goZGlzcGF0Y2g6IHN0cmluZykge1xuICByZXR1cm4gW1wiU0VUX01PREVMXCJdLmluY2x1ZGVzKGRpc3BhdGNoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2V0U2hhcmVkRGlzcGF0Y2goZGlzcGF0Y2g6IHN0cmluZykge1xuICByZXR1cm4gW1wiU0VUX1NIQVJFRFwiXS5pbmNsdWRlcyhkaXNwYXRjaCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0dldE1vZGVsRGlzcGF0Y2goZGlzcGF0Y2g6IHN0cmluZykge1xuICByZXR1cm4gW1wiR0VUX01PREVMXCJdLmluY2x1ZGVzKGRpc3BhdGNoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzR2V0U2hhcmVkRGlzcGF0Y2goZGlzcGF0Y2g6IHN0cmluZykge1xuICByZXR1cm4gW1wiR0VUX1NIQVJFRFwiXS5pbmNsdWRlcyhkaXNwYXRjaCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlZnNEaXNwYXRjaChkaXNwYXRjaDogc3RyaW5nKSB7XG4gIHJldHVybiBbXCJSRUZTXCJdLmluY2x1ZGVzKGRpc3BhdGNoKTtcbn1cbiIsImltcG9ydCB7XG4gIGV2ZW50QXJnc1N5bWJvbCxcbiAgcmVxdWVzdEVyclN5bWJvbCxcbiAgcmVxdWVzdFJlc1N5bWJvbCxcbn0gZnJvbSBcIkAvY29yZS9saWZlY3ljbGUvaG9va3MvdXNlRGlzcGF0Y2hIYW5kbGVyXCI7XG5pbXBvcnQgUnVudGltZSBmcm9tIFwiQC9jb3JlL3J1bnRpbWVcIjtcbmltcG9ydCB7IGdldCwgaXNTdHJpbmcsIGVzY2FwZVJlZ0V4cCwgaXNBcnJheSwgaXNQbGFpbk9iamVjdCB9IGZyb20gXCJsb2Rhc2hcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzRHluYW1pY1ZhbHVlKHZhbHVlOiBzdHJpbmcsIHJ1bnRpbWU6IFJ1bnRpbWUpIHtcbiAgY29uc3QgbW9kZWxEZWZpbml0aW9uID0gcnVudGltZS5zc3IuZGVmaW5pdGlvbnM/Lm1vZGVsO1xuICBjb25zdCBzaGFyZWREZWZpbml0aW9uID0gcnVudGltZS5zc3IuZGVmaW5pdGlvbnM/LnNoYXJlZDtcbiAgY29uc3QgcmVzRGVmaW5pdGlvbiA9IHJ1bnRpbWUuc3NyLmRlZmluaXRpb25zPy5yZXM7XG4gIGNvbnN0IGVyckRlZmluaXRpb24gPSBydW50aW1lLnNzci5kZWZpbml0aW9ucz8uZXJyO1xuICBpZiAobW9kZWxEZWZpbml0aW9uICYmIHZhbHVlLmluY2x1ZGVzKG1vZGVsRGVmaW5pdGlvbikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoc2hhcmVkRGVmaW5pdGlvbiAmJiB2YWx1ZS5pbmNsdWRlcyhzaGFyZWREZWZpbml0aW9uKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChyZXNEZWZpbml0aW9uICYmIHZhbHVlLmluY2x1ZGVzKHJlc0RlZmluaXRpb24pKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGVyckRlZmluaXRpb24gJiYgdmFsdWUuaW5jbHVkZXMoZXJyRGVmaW5pdGlvbikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIOWkhOeQhuWPr+iDveaYr+WKqOaAgeaVsOaNrueahOaDheWGtSwg5pWw5o2u55Sx5LqO6YO95pivIHNzciDov5vmnaXnmoTvvIzmiYDku6XkuIDlrprmmK8gc3RyaW5nXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0R5bmFtaWNWYWx1ZShcbiAgdmFsdWU6IHN0cmluZyB8IEFueU9iamVjdCB8IEFueUFycmF5LFxuICB7IG1vZGVsLCBzaGFyZWQgfTogQW55T2JqZWN0LFxuICBydW50aW1lOiBSdW50aW1lLFxuICBydW50aW1lSW5mbz86IEFueU9iamVjdFxuKTogYW55IHtcbiAgY29uc3QgbW9kZWxEZWZpbml0aW9uID0gcnVudGltZS5zc3IuZGVmaW5pdGlvbnM/Lm1vZGVsO1xuICBjb25zdCBzaGFyZWREZWZpbml0aW9uID0gcnVudGltZS5zc3IuZGVmaW5pdGlvbnM/LnNoYXJlZDtcbiAgY29uc3QgcmVzRGVmaW5pdGlvbiA9IHJ1bnRpbWUuc3NyLmRlZmluaXRpb25zPy5yZXM7XG4gIGNvbnN0IGVyckRlZmluaXRpb24gPSBydW50aW1lLnNzci5kZWZpbml0aW9ucz8uZXJyO1xuICBjb25zdCBhcmdzRGVmaW5pdGlvbiA9IHJ1bnRpbWUuc3NyLmRlZmluaXRpb25zPy5hcmdzO1xuXG4gIGlmICghaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc0FycmF5RHluYW1pYyhcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHsgbW9kZWwsIHNoYXJlZCB9LFxuICAgICAgICBydW50aW1lLFxuICAgICAgICBydW50aW1lSW5mb1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc1BsYWluT2JqZWN0RHluYW1pYyhcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHsgbW9kZWwsIHNoYXJlZCB9LFxuICAgICAgICBydW50aW1lLFxuICAgICAgICBydW50aW1lSW5mb1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgaWYgKG1vZGVsRGVmaW5pdGlvbikge1xuICAgIGNvbnN0IGVzY2FwZWQgPSBlc2NhcGVSZWdFeHAobW9kZWxEZWZpbml0aW9uKTtcbiAgICBjb25zdCBleGFjdE1hdGNoID0gbmV3IFJlZ0V4cChgXiR7ZXNjYXBlZH1cXFxcLihbXFxcXHdcXFxcLlxcXFxbXFxcXF1dKykkYCkuZXhlYyhcbiAgICAgIHZhbHVlXG4gICAgKTtcbiAgICBpZiAoZXhhY3RNYXRjaCkge1xuICAgICAgcmV0dXJuIGdldChtb2RlbCwgZXhhY3RNYXRjaFsxXSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNoYXJlZERlZmluaXRpb24pIHtcbiAgICBjb25zdCBlc2NhcGVkID0gZXNjYXBlUmVnRXhwKHNoYXJlZERlZmluaXRpb24pO1xuICAgIGNvbnN0IGV4YWN0TWF0Y2ggPSBuZXcgUmVnRXhwKGBeJHtlc2NhcGVkfVxcXFwuKFtcXFxcd1xcXFwuXFxcXFtcXFxcXV0rKSRgKS5leGVjKFxuICAgICAgdmFsdWVcbiAgICApO1xuICAgIGlmIChleGFjdE1hdGNoKSB7XG4gICAgICByZXR1cm4gZ2V0KHNoYXJlZCwgZXhhY3RNYXRjaFsxXSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHJlc0RlZmluaXRpb24pIHtcbiAgICBjb25zdCBlc2NhcGVkID0gZXNjYXBlUmVnRXhwKHJlc0RlZmluaXRpb24pO1xuICAgIGNvbnN0IGV4YWN0TWF0Y2ggPSBuZXcgUmVnRXhwKGBeJHtlc2NhcGVkfVxcXFwuKFtcXFxcd1xcXFwuXFxcXFtcXFxcXV0rKSRgKS5leGVjKFxuICAgICAgdmFsdWVcbiAgICApO1xuICAgIGlmIChleGFjdE1hdGNoKSB7XG4gICAgICByZXR1cm4gZ2V0KHJ1bnRpbWVJbmZvPy5bcmVxdWVzdFJlc1N5bWJvbF0sIGV4YWN0TWF0Y2hbMV0pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChlcnJEZWZpbml0aW9uKSB7XG4gICAgY29uc3QgZXNjYXBlZCA9IGVzY2FwZVJlZ0V4cChlcnJEZWZpbml0aW9uKTtcbiAgICBjb25zdCBleGFjdE1hdGNoID0gbmV3IFJlZ0V4cChgXiR7ZXNjYXBlZH1cXFxcLihbXFxcXHdcXFxcLlxcXFxbXFxcXF1dKykkYCkuZXhlYyhcbiAgICAgIHZhbHVlXG4gICAgKTtcbiAgICBpZiAoZXhhY3RNYXRjaCkge1xuICAgICAgcmV0dXJuIGdldChydW50aW1lSW5mbz8uW3JlcXVlc3RFcnJTeW1ib2xdLCBleGFjdE1hdGNoWzFdKTtcbiAgICB9XG4gIH1cblxuICBpZiAoYXJnc0RlZmluaXRpb24pIHtcbiAgICBjb25zdCBlc2NhcGVkID0gZXNjYXBlUmVnRXhwKGFyZ3NEZWZpbml0aW9uKTtcbiAgICBjb25zdCBleGFjdE1hdGNoID0gbmV3IFJlZ0V4cChgXiR7ZXNjYXBlZH1cXFxcLihbXFxcXHdcXFxcLlxcXFxbXFxcXF1dKykkYCkuZXhlYyhcbiAgICAgIHZhbHVlXG4gICAgKTtcbiAgICBpZiAoZXhhY3RNYXRjaCkge1xuICAgICAgcmV0dXJuIGdldChydW50aW1lSW5mbz8uW2V2ZW50QXJnc1N5bWJvbF0sIGV4YWN0TWF0Y2hbMV0pO1xuICAgIH1cbiAgfVxuXG4gIGxldCBwcm9jZXNzZWQgPSB2YWx1ZTtcblxuICBpZiAobW9kZWxEZWZpbml0aW9uKSB7XG4gICAgY29uc3QgZXNjYXBlZCA9IGVzY2FwZVJlZ0V4cChtb2RlbERlZmluaXRpb24pO1xuICAgIHByb2Nlc3NlZCA9IHByb2Nlc3NlZC5yZXBsYWNlKFxuICAgICAgbmV3IFJlZ0V4cChgJHtlc2NhcGVkfVxcXFwuKFtcXFxcd1xcXFwuXFxcXFtcXFxcXV0rKWAsIFwiZ1wiKSxcbiAgICAgIChfLCBwYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGdldChtb2RlbCwgcGF0aCk7XG4gICAgICAgIHJldHVybiByZXMgPT09IHVuZGVmaW5lZCB8fCByZXMgPT09IG51bGwgPyBcIlwiIDogU3RyaW5nKHJlcyk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGlmIChzaGFyZWREZWZpbml0aW9uKSB7XG4gICAgY29uc3QgZXNjYXBlZCA9IGVzY2FwZVJlZ0V4cChzaGFyZWREZWZpbml0aW9uKTtcbiAgICBwcm9jZXNzZWQgPSBwcm9jZXNzZWQucmVwbGFjZShcbiAgICAgIG5ldyBSZWdFeHAoYCR7ZXNjYXBlZH1cXFxcLihbXFxcXHdcXFxcLlxcXFxbXFxcXF1dKylgLCBcImdcIiksXG4gICAgICAoXywgcGF0aCkgPT4ge1xuICAgICAgICBjb25zdCByZXMgPSBnZXQoc2hhcmVkLCBwYXRoKTtcbiAgICAgICAgcmV0dXJuIHJlcyA9PT0gdW5kZWZpbmVkIHx8IHJlcyA9PT0gbnVsbCA/IFwiXCIgOiBTdHJpbmcocmVzKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgaWYgKHJlc0RlZmluaXRpb24pIHtcbiAgICBjb25zdCBlc2NhcGVkID0gZXNjYXBlUmVnRXhwKHJlc0RlZmluaXRpb24pO1xuICAgIHByb2Nlc3NlZCA9IHByb2Nlc3NlZC5yZXBsYWNlKFxuICAgICAgbmV3IFJlZ0V4cChgJHtlc2NhcGVkfVxcXFwuKFtcXFxcd1xcXFwuXFxcXFtcXFxcXV0rKWAsIFwiZ1wiKSxcbiAgICAgIChfLCBwYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGdldChydW50aW1lSW5mbz8uW3JlcXVlc3RSZXNTeW1ib2xdLCBwYXRoKTtcbiAgICAgICAgcmV0dXJuIHJlcyA9PT0gdW5kZWZpbmVkIHx8IHJlcyA9PT0gbnVsbCA/IFwiXCIgOiBTdHJpbmcocmVzKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgaWYgKGFyZ3NEZWZpbml0aW9uKSB7XG4gICAgY29uc3QgZXNjYXBlZCA9IGVzY2FwZVJlZ0V4cChhcmdzRGVmaW5pdGlvbik7XG4gICAgcHJvY2Vzc2VkID0gcHJvY2Vzc2VkLnJlcGxhY2UoXG4gICAgICBuZXcgUmVnRXhwKGAke2VzY2FwZWR9XFxcXC4oW1xcXFx3XFxcXC5cXFxcW1xcXFxdXSspYCwgXCJnXCIpLFxuICAgICAgKF8sIHBhdGgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gZ2V0KHJ1bnRpbWVJbmZvPy5bZXZlbnRBcmdzU3ltYm9sXSwgcGF0aCk7XG4gICAgICAgIHJldHVybiByZXMgPT09IHVuZGVmaW5lZCB8fCByZXMgPT09IG51bGwgPyBcIlwiIDogU3RyaW5nKHJlcyk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBwcm9jZXNzZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzQXJyYXlEeW5hbWljKFxuICB2YWx1ZTogYW55W10sXG4gIHsgbW9kZWwsIHNoYXJlZCB9OiBBbnlPYmplY3QsXG4gIHJ1bnRpbWU6IFJ1bnRpbWUsXG4gIHJ1bnRpbWVJbmZvPzogQW55T2JqZWN0XG4pIHtcbiAgcmV0dXJuIHZhbHVlLm1hcCgoaXRlbSkgPT5cbiAgICBwcm9jZXNzRHluYW1pY1ZhbHVlKGl0ZW0sIHsgbW9kZWwsIHNoYXJlZCB9LCBydW50aW1lLCBydW50aW1lSW5mbylcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NQbGFpbk9iamVjdER5bmFtaWMoXG4gIHZhbHVlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICB7IG1vZGVsLCBzaGFyZWQgfTogQW55T2JqZWN0LFxuICBydW50aW1lOiBSdW50aW1lLFxuICBydW50aW1lSW5mbz86IEFueU9iamVjdFxuKSB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXModmFsdWUpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgICBrZXksXG4gICAgICBwcm9jZXNzRHluYW1pY1ZhbHVlKHZhbHVlLCB7IG1vZGVsLCBzaGFyZWQgfSwgcnVudGltZSwgcnVudGltZUluZm8pLFxuICAgIF0pXG4gICk7XG59XG4iLCJpbXBvcnQgeyBwcm9jZXNzRGlzcGF0Y2ggfSBmcm9tIFwiQC9jb3JlL2xpZmVjeWNsZS9ob29rcy91c2VEaXNwYXRjaEhhbmRsZXJcIjtcbmltcG9ydCB7IHByb2Nlc3NEeW5hbWljVmFsdWUgfSBmcm9tIFwiQC9jb3JlL2xpZmVjeWNsZS9ob29rcy91c2VEaXNwYXRjaEhhbmRsZXIvcHJvY2Vzc0R5bmFtaWNWYWx1ZVwiO1xuaW1wb3J0IFJ1bnRpbWUgZnJvbSBcIkAvY29yZS9ydW50aW1lXCI7XG5pbXBvcnQgeyBpc0FycmF5LCBpc1N0cmluZyB9IGZyb20gXCJsb2Rhc2hcIjtcblxuLyoqXG4gKiBza2lwUHJvY2VzcyDnmoTlvJXlhaXmmK/kuLrkuobmlK/mjIEgbGVmdCDlkowgcmlnaHQg5Lul5Y+KIHJpZ2h0VmFsdWVzIOmDveaYryBkaXNwYXRjaCDnmoTmg4XlhrVcbiAqIOS9hueUseS6juS4jeaOqOiNkOi/m+ihjOi2hee6p+WumuWItueahCBkaXNwYXRjaO+8jOWboOS4uuaVsOaNruacrOi6q+WwseW3sue7j+WcqOWQjuerr+S6hu+8jOiDveWkn+WwveWPr+iDveaLvOWlveeahOS4jemcgOimgeWkquWKqOaAgeeahOWPr+S7peeVpei/h1xuICog5omA5Lul6L+Z6YeM5LiN5YGa5rex5bqm55qE5aSE55CG77yM5Y+q5aSE55CG56ys5LiA5bGC55qE5oOF5Ya1XG4gKi9cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NDb21wYXJlKFxuICBkYXRhOiBBbnlPYmplY3QsXG4gIHV0aWxzOiBBbnlPYmplY3QsXG4gIHJ1bnRpbWU6IFJ1bnRpbWUsXG4gIHJ1bnRpbWVJbmZvPzogQW55T2JqZWN0LFxuICBza2lwUHJvY2VzcyA9IGZhbHNlXG4pIHtcbiAgaWYgKCghaXNTdHJpbmcoZGF0YS5sZWZ0KSB8fCAhaXNTdHJpbmcoZGF0YS5yaWdodCkpICYmICFza2lwUHJvY2Vzcykge1xuICAgIGxldCBsZWZ0VmFsdWUsXG4gICAgICByaWdodFZhbHVlLFxuICAgICAgcmlnaHRWYWx1ZXM6IEFueUFycmF5ID0gW107XG4gICAgaWYgKCFpc1N0cmluZyhkYXRhLmxlZnQpKSB7XG4gICAgICBsZWZ0VmFsdWUgPSBhd2FpdCBwcm9jZXNzRGlzcGF0Y2goXG4gICAgICAgIGRhdGEubGVmdCBhcyB1bmtub3duIGFzIEFueU9iamVjdCxcbiAgICAgICAgdXRpbHMsXG4gICAgICAgIHJ1bnRpbWUsXG4gICAgICAgIHJ1bnRpbWVJbmZvXG4gICAgICApO1xuICAgICAgZGF0YS5sZWZ0ID0gbGVmdFZhbHVlO1xuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKGRhdGEucmlnaHQpKSB7XG4gICAgICBpZiAoaXNBcnJheShkYXRhLnJpZ2h0KSkge1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IGRhdGEucmlnaHQubWFwKCh2OiBhbnkpID0+IHtcbiAgICAgICAgICByZXR1cm4gcHJvY2Vzc0Rpc3BhdGNoKFxuICAgICAgICAgICAgdiBhcyB1bmtub3duIGFzIEFueU9iamVjdCxcbiAgICAgICAgICAgIHV0aWxzLFxuICAgICAgICAgICAgcnVudGltZSxcbiAgICAgICAgICAgIHJ1bnRpbWVJbmZvXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgIHJpZ2h0VmFsdWVzID0gcmVzO1xuICAgICAgICB9KTtcbiAgICAgICAgZGF0YS5yaWdodCA9IHJpZ2h0VmFsdWVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmlnaHRWYWx1ZSA9IGF3YWl0IHByb2Nlc3NEaXNwYXRjaChcbiAgICAgICAgICBkYXRhLnJpZ2h0IGFzIHVua25vd24gYXMgQW55T2JqZWN0LFxuICAgICAgICAgIHV0aWxzLFxuICAgICAgICAgIHJ1bnRpbWUsXG4gICAgICAgICAgcnVudGltZUluZm9cbiAgICAgICAgKTtcbiAgICAgICAgZGF0YS5yaWdodCA9IHJpZ2h0VmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb2Nlc3NDb21wYXJlKGRhdGEsIHV0aWxzLCBydW50aW1lLCBydW50aW1lSW5mbywgdHJ1ZSk7XG4gIH1cbiAgY29uc3QgbGVmdFZhbHVlID0gcHJvY2Vzc0R5bmFtaWNWYWx1ZShkYXRhLmxlZnQsIHV0aWxzLCBydW50aW1lLCBydW50aW1lSW5mbyk7XG4gIGNvbnN0IHJpZ2h0VmFsdWUgPSBwcm9jZXNzRHluYW1pY1ZhbHVlKFxuICAgIGRhdGEucmlnaHQsXG4gICAgdXRpbHMsXG4gICAgcnVudGltZSxcbiAgICBydW50aW1lSW5mb1xuICApO1xuXG4gIGNvbnN0IHJpZ2h0VmFsdWVzID0gaXNBcnJheShkYXRhLnJpZ2h0KVxuICAgID8gZGF0YS5yaWdodC5tYXAoKHY6IGFueSkgPT5cbiAgICAgICAgcHJvY2Vzc0R5bmFtaWNWYWx1ZSh2LCB1dGlscywgcnVudGltZSwgcnVudGltZUluZm8pXG4gICAgICApXG4gICAgOiBpc0FycmF5KGRhdGEudmFsdWVzKVxuICAgID8gZGF0YS52YWx1ZXMubWFwKCh2OiBhbnkpID0+XG4gICAgICAgIHByb2Nlc3NEeW5hbWljVmFsdWUodiwgdXRpbHMsIHJ1bnRpbWUsIHJ1bnRpbWVJbmZvKVxuICAgICAgKVxuICAgIDogbnVsbDtcblxuICAvLyDljZXlgLzmr5TovoPmk43kvZznrKZcbiAgaWYgKGRhdGEub3AgPT09IFwiZXFcIikge1xuICAgIHJldHVybiBsZWZ0VmFsdWUgPT09IHJpZ2h0VmFsdWU7XG4gIH1cbiAgaWYgKGRhdGEub3AgPT09IFwibmVcIikge1xuICAgIHJldHVybiBsZWZ0VmFsdWUgIT09IHJpZ2h0VmFsdWU7XG4gIH1cbiAgaWYgKGRhdGEub3AgPT09IFwiZ3RcIikge1xuICAgIHJldHVybiBsZWZ0VmFsdWUgPiByaWdodFZhbHVlO1xuICB9XG4gIGlmIChkYXRhLm9wID09PSBcImdlXCIgfHwgZGF0YS5vcCA9PT0gXCJndGVcIikge1xuICAgIHJldHVybiBsZWZ0VmFsdWUgPj0gcmlnaHRWYWx1ZTtcbiAgfVxuICBpZiAoZGF0YS5vcCA9PT0gXCJsdFwiKSB7XG4gICAgcmV0dXJuIGxlZnRWYWx1ZSA8IHJpZ2h0VmFsdWU7XG4gIH1cbiAgaWYgKGRhdGEub3AgPT09IFwibGVcIiB8fCBkYXRhLm9wID09PSBcImx0ZVwiKSB7XG4gICAgcmV0dXJuIGxlZnRWYWx1ZSA8PSByaWdodFZhbHVlO1xuICB9XG5cbiAgLy8g5aSa5YC85pON5L2c56ymXG4gIGlmIChkYXRhLm9wID09PSBcImJldHdlZW5cIikge1xuICAgIGlmICghcmlnaHRWYWx1ZXMgfHwgcmlnaHRWYWx1ZXMubGVuZ3RoIDwgMikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBsZWZ0VmFsdWUgPj0gcmlnaHRWYWx1ZXNbMF0gJiYgbGVmdFZhbHVlIDw9IHJpZ2h0VmFsdWVzWzFdO1xuICB9XG4gIGlmIChkYXRhLm9wID09PSBcIm5vdF9iZXR3ZWVuXCIpIHtcbiAgICBpZiAoIXJpZ2h0VmFsdWVzIHx8IHJpZ2h0VmFsdWVzLmxlbmd0aCA8IDIpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBsZWZ0VmFsdWUgPCByaWdodFZhbHVlc1swXSB8fCBsZWZ0VmFsdWUgPiByaWdodFZhbHVlc1sxXTtcbiAgfVxuICBpZiAoZGF0YS5vcCA9PT0gXCJpblwiKSB7XG4gICAgaWYgKCFyaWdodFZhbHVlcyB8fCByaWdodFZhbHVlcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gcmlnaHRWYWx1ZXMuaW5jbHVkZXMobGVmdFZhbHVlKTtcbiAgfVxuICBpZiAoZGF0YS5vcCA9PT0gXCJub3RfaW5cIikge1xuICAgIGlmICghcmlnaHRWYWx1ZXMgfHwgcmlnaHRWYWx1ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gIXJpZ2h0VmFsdWVzLmluY2x1ZGVzKGxlZnRWYWx1ZSk7XG4gIH1cblxuICAvLyDlrZfnrKbkuLLljLnphY3mk43kvZznrKbvvIjljZXlgLzvvIlcbiAgY29uc3QgbGVmdFN0ciA9IFN0cmluZyhsZWZ0VmFsdWUpO1xuICBjb25zdCByaWdodFN0ciA9IFN0cmluZyhyaWdodFZhbHVlKTtcblxuICBpZiAoZGF0YS5vcCA9PT0gXCJsaWtlXCIpIHtcbiAgICBpZiAocmlnaHRWYWx1ZXMgJiYgcmlnaHRWYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8g5aSa5YC86L+H5ruk77yM5LulT1Lmi7zmjqVcbiAgICAgIHJldHVybiByaWdodFZhbHVlcy5zb21lKCh2OiBhbnkpID0+IGxlZnRTdHIuaW5jbHVkZXMoU3RyaW5nKHYpKSk7XG4gICAgfVxuICAgIC8vIOWNleWAvOi/h+a7pFxuICAgIHJldHVybiBsZWZ0U3RyLmluY2x1ZGVzKHJpZ2h0U3RyKTtcbiAgfVxuICBpZiAoZGF0YS5vcCA9PT0gXCJub3RfbGlrZVwiKSB7XG4gICAgaWYgKHJpZ2h0VmFsdWVzICYmIHJpZ2h0VmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIOWkmuWAvOi/h+a7pO+8jOS7pU9S5ou85o6l77yI5LiN5YyF5ZCr5Lu75L2V5LiA5Liq77yJXG4gICAgICByZXR1cm4gIXJpZ2h0VmFsdWVzLnNvbWUoKHY6IGFueSkgPT4gbGVmdFN0ci5pbmNsdWRlcyhTdHJpbmcodikpKTtcbiAgICB9XG4gICAgLy8g5Y2V5YC86L+H5rukXG4gICAgcmV0dXJuICFsZWZ0U3RyLmluY2x1ZGVzKHJpZ2h0U3RyKTtcbiAgfVxuICBpZiAoZGF0YS5vcCA9PT0gXCJsaWtlX2xlZnRcIikge1xuICAgIGlmIChyaWdodFZhbHVlcyAmJiByaWdodFZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyDlpJrlgLzov4fmu6TvvIzku6VPUuaLvOaOpVxuICAgICAgcmV0dXJuIHJpZ2h0VmFsdWVzLnNvbWUoKHY6IGFueSkgPT4gbGVmdFN0ci5zdGFydHNXaXRoKFN0cmluZyh2KSkpO1xuICAgIH1cbiAgICAvLyDljZXlgLzov4fmu6RcbiAgICByZXR1cm4gbGVmdFN0ci5zdGFydHNXaXRoKHJpZ2h0U3RyKTtcbiAgfVxuICBpZiAoZGF0YS5vcCA9PT0gXCJub3RfbGlrZV9sZWZ0XCIpIHtcbiAgICBpZiAocmlnaHRWYWx1ZXMgJiYgcmlnaHRWYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8g5aSa5YC86L+H5ruk77yM5LulT1Lmi7zmjqXvvIjkuI3ku6Xku7vkvZXkuIDkuKrlvIDlpLTvvIlcbiAgICAgIHJldHVybiAhcmlnaHRWYWx1ZXMuc29tZSgodjogYW55KSA9PiBsZWZ0U3RyLnN0YXJ0c1dpdGgoU3RyaW5nKHYpKSk7XG4gICAgfVxuICAgIC8vIOWNleWAvOi/h+a7pFxuICAgIHJldHVybiAhbGVmdFN0ci5zdGFydHNXaXRoKHJpZ2h0U3RyKTtcbiAgfVxuICBpZiAoZGF0YS5vcCA9PT0gXCJsaWtlX3JpZ2h0XCIpIHtcbiAgICBpZiAocmlnaHRWYWx1ZXMgJiYgcmlnaHRWYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8g5aSa5YC86L+H5ruk77yM5LulT1Lmi7zmjqVcbiAgICAgIHJldHVybiByaWdodFZhbHVlcy5zb21lKCh2OiBhbnkpID0+IGxlZnRTdHIuZW5kc1dpdGgoU3RyaW5nKHYpKSk7XG4gICAgfVxuICAgIC8vIOWNleWAvOi/h+a7pFxuICAgIHJldHVybiBsZWZ0U3RyLmVuZHNXaXRoKHJpZ2h0U3RyKTtcbiAgfVxuICBpZiAoZGF0YS5vcCA9PT0gXCJub3RfbGlrZV9yaWdodFwiKSB7XG4gICAgaWYgKHJpZ2h0VmFsdWVzICYmIHJpZ2h0VmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIOWkmuWAvOi/h+a7pO+8jOS7pU9S5ou85o6l77yI5LiN5Lul5Lu75L2V5LiA5Liq57uT5bC+77yJXG4gICAgICByZXR1cm4gIXJpZ2h0VmFsdWVzLnNvbWUoKHY6IGFueSkgPT4gbGVmdFN0ci5lbmRzV2l0aChTdHJpbmcodikpKTtcbiAgICB9XG4gICAgLy8g5Y2V5YC86L+H5rukXG4gICAgcmV0dXJuICFsZWZ0U3RyLmVuZHNXaXRoKHJpZ2h0U3RyKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbiIsImltcG9ydCB7IHByb2Nlc3NEeW5hbWljVmFsdWUgfSBmcm9tIFwiQC9jb3JlL2xpZmVjeWNsZS9ob29rcy91c2VEaXNwYXRjaEhhbmRsZXIvcHJvY2Vzc0R5bmFtaWNWYWx1ZVwiO1xuaW1wb3J0IFJ1bnRpbWUgZnJvbSBcIkAvY29yZS9ydW50aW1lXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzUmVxdWVzdHMoXG4gIGRpc3BhdGNoOiBrZXlvZiB0eXBlb2YgcnVudGltZS5zc3IuYWN0aW9ucyxcbiAgZGF0YTogQW55T2JqZWN0LFxuICB1dGlsczogQW55T2JqZWN0LFxuICBydW50aW1lOiBSdW50aW1lLFxuICBydW50aW1lSW5mbz86IEFueU9iamVjdFxuKSB7XG4gIGNvbnN0IGFjdGlvbiA9IHJ1bnRpbWUuc3NyLmFjdGlvbnNbZGlzcGF0Y2hdO1xuXG4gIGNvbnN0IHByb2Nlc3NlZFBhcmFtcyA9IHByb2Nlc3NQYXJhbXMoZGF0YSwgdXRpbHMsIHJ1bnRpbWUsIHJ1bnRpbWVJbmZvKTtcbiAgY29uc3QgcHJvY2Vzc2VkRGF0YSA9IHByb2Nlc3NEYXRhKGRhdGEsIHV0aWxzLCBydW50aW1lLCBydW50aW1lSW5mbyk7XG5cbiAgcmV0dXJuIGF3YWl0IGFjdGlvbj8uKHtcbiAgICAuLi5kYXRhLFxuICAgIHBhcmFtczogcHJvY2Vzc2VkUGFyYW1zLFxuICAgIGRhdGE6IHByb2Nlc3NlZERhdGEsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzUGFyYW1zKFxuICBkYXRhOiBBbnlPYmplY3QsXG4gIHV0aWxzOiBBbnlPYmplY3QsXG4gIHJ1bnRpbWU6IFJ1bnRpbWUsXG4gIHJ1bnRpbWVJbmZvPzogQW55T2JqZWN0XG4pIHtcbiAgaWYgKCFkYXRhLnBhcmFtcykgcmV0dXJuIHt9O1xuICBjb25zdCBwcm9jZXNzZWRQYXJhbXM6IEFueU9iamVjdCA9IHt9O1xuXG4gIE9iamVjdC5lbnRyaWVzKGRhdGEucGFyYW1zKS5mb3JFYWNoKChba2V5LCB2YWx1ZV06IFtzdHJpbmcsIGFueV0pID0+IHtcbiAgICBwcm9jZXNzZWRQYXJhbXNba2V5XSA9IHByb2Nlc3NEeW5hbWljVmFsdWUoXG4gICAgICB2YWx1ZSxcbiAgICAgIHV0aWxzLFxuICAgICAgcnVudGltZSxcbiAgICAgIHJ1bnRpbWVJbmZvXG4gICAgKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHByb2Nlc3NlZFBhcmFtcztcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0RhdGEoXG4gIGRhdGE6IEFueU9iamVjdCxcbiAgdXRpbHM6IEFueU9iamVjdCxcbiAgcnVudGltZTogUnVudGltZSxcbiAgcnVudGltZUluZm8/OiBBbnlPYmplY3Rcbikge1xuICBpZiAoIWRhdGEuZGF0YSkgcmV0dXJuIHt9O1xuICBjb25zdCBwcm9jZXNzZWREYXRhOiBBbnlPYmplY3QgPSB7fTtcblxuICBPYmplY3QuZW50cmllcyhkYXRhLmRhdGEpLmZvckVhY2goKFtrZXksIHZhbHVlXTogW3N0cmluZywgYW55XSkgPT4ge1xuICAgIHByb2Nlc3NlZERhdGFba2V5XSA9IHByb2Nlc3NEeW5hbWljVmFsdWUoXG4gICAgICB2YWx1ZSxcbiAgICAgIHV0aWxzLFxuICAgICAgcnVudGltZSxcbiAgICAgIHJ1bnRpbWVJbmZvXG4gICAgKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHByb2Nlc3NlZERhdGE7XG59XG4iLCJpbXBvcnQgeyBpc0FycmF5IH0gZnJvbSBcImxvZGFzaFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc1RyYW5zZm9ybShkYXRhOiBhbnksIHRyYW5zZm9ybTogQW55T2JqZWN0KSB7XG4gIHN3aXRjaCAodHJhbnNmb3JtLm1ldGhvZCkge1xuICAgIGNhc2UgXCJtYXBcIjpcbiAgICAgIGlmIChpc0FycmF5KGRhdGEpKSB7XG4gICAgICAgIHJldHVybiBkYXRhLm1hcCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAuLi5PYmplY3Qua2V5cyh0cmFuc2Zvcm0ucmVsYXRpb24pLnJlZHVjZSgoYWNjLCBjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uYWNjLFxuICAgICAgICAgICAgICAgIFt0cmFuc2Zvcm0ucmVsYXRpb25bY3VycmVudF1dOiBpdGVtW2N1cnJlbnRdLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSwge30pLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBkYXRhO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBpc0NvbmRpdGlvbkRpc3BhdGNoLFxuICBpc0V2ZW50SGFuZGxlckRpc3BhdGNoLFxuICBpc0dldE1vZGVsRGlzcGF0Y2gsXG4gIGlzR2V0U2hhcmVkRGlzcGF0Y2gsXG4gIGlzUmVmc0Rpc3BhdGNoLFxuICBpc1JlcXVlc3REaXNwYXRjaCxcbiAgaXNTZXRNb2RlbERpc3BhdGNoLFxuICBpc1NldFNoYXJlZERpc3BhdGNoLFxufSBmcm9tIFwiQC9jb3JlL2xpZmVjeWNsZS9ob29rcy91c2VEaXNwYXRjaEhhbmRsZXIvaXNcIjtcbmltcG9ydCB7IHByb2Nlc3NDb21wYXJlIH0gZnJvbSBcIkAvY29yZS9saWZlY3ljbGUvaG9va3MvdXNlRGlzcGF0Y2hIYW5kbGVyL3Byb2Nlc3NDb21wYXJlXCI7XG5pbXBvcnQgeyBwcm9jZXNzRHluYW1pY1ZhbHVlIH0gZnJvbSBcIkAvY29yZS9saWZlY3ljbGUvaG9va3MvdXNlRGlzcGF0Y2hIYW5kbGVyL3Byb2Nlc3NEeW5hbWljVmFsdWVcIjtcbmltcG9ydCB7IHByb2Nlc3NSZXF1ZXN0cyB9IGZyb20gXCJAL2NvcmUvbGlmZWN5Y2xlL2hvb2tzL3VzZURpc3BhdGNoSGFuZGxlci9wcm9jZXNzUmVxdWVzdHNcIjtcbmltcG9ydCB7IHByb2Nlc3NUcmFuc2Zvcm0gfSBmcm9tIFwiQC9jb3JlL2xpZmVjeWNsZS9ob29rcy91c2VEaXNwYXRjaEhhbmRsZXIvcHJvY2Vzc1RyYW5zZm9ybVwiO1xuaW1wb3J0IFJ1bnRpbWUgZnJvbSBcIkAvY29yZS9ydW50aW1lXCI7XG5pbXBvcnQgeyByYXcgfSBmcm9tIFwiQC9oZWxwZXJzXCI7XG5pbXBvcnQgeyBnZXQsIGlzQXJyYXksIGlzU3RyaW5nLCBzZXQgfSBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQgeyBuZXh0VGljayB9IGZyb20gXCJ2dWVcIjtcblxuZXhwb3J0IGNvbnN0IHJlcXVlc3RSZXNTeW1ib2wgPSBTeW1ib2woXCJyZXF1ZXN0UmVzXCIpO1xuZXhwb3J0IGNvbnN0IHJlcXVlc3RFcnJTeW1ib2wgPSBTeW1ib2woXCJyZXF1ZXN0RXJyXCIpO1xuZXhwb3J0IGNvbnN0IGV2ZW50QXJnc1N5bWJvbCA9IFN5bWJvbChcImV2ZW50QXJnc1wiKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NEaXNwYXRjaChcbiAgZGF0YTogQW55T2JqZWN0LFxuICB1dGlsczogQW55T2JqZWN0LFxuICBydW50aW1lOiBSdW50aW1lLFxuICBydW50aW1lSW5mbz86IEFueU9iamVjdFxuKTogUHJvbWlzZTxhbnk+IHtcbiAgaWYgKCFydW50aW1lLnNzci5kZWZpbml0aW9ucz8uZGlzcGF0Y2gpIHJldHVybjtcbiAgY29uc3QgZGlzcGF0Y2ggPSBkYXRhW3J1bnRpbWUuc3NyLmRlZmluaXRpb25zPy5kaXNwYXRjaF07XG5cbiAgaWYgKGlzUmVxdWVzdERpc3BhdGNoKGRpc3BhdGNoKSkge1xuICAgIHJldHVybiBhd2FpdCBwcm9jZXNzUmVxdWVzdHMoZGlzcGF0Y2gsIGRhdGEsIHV0aWxzLCBydW50aW1lLCBydW50aW1lSW5mbylcbiAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgLy8g5L2/55SoIHNldHRpbWVvdXQg5piv5Zug5Li65oiRIGZvcm0g5Luj56CB6YeM5pys6Lqr5bCx5bey57uP5pyJ5LqGIG5leHRUaWNrIOeahOaOp+WItu+8jOWmguaenOebtOaOpeS9v+eUqCBuZXh0VGljayDkvJrml6Dms5Xojrflj5bmnIDmlrDmlbDmja5cbiAgICAgICAgbGV0IHJlcXVlc3RSZXMgPSBkYXRhLnBhdGggPyBnZXQocmVzLCBkYXRhLnBhdGgpIDogcmVzO1xuICAgICAgICBpZiAoXCJ0cmFuc2Zvcm1cIiBpbiBkYXRhKSB7XG4gICAgICAgICAgcmVxdWVzdFJlcyA9IHByb2Nlc3NUcmFuc2Zvcm0ocmVxdWVzdFJlcywgZGF0YS50cmFuc2Zvcm0pO1xuICAgICAgICB9XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmIChcInRoZW5cIiBpbiBkYXRhKSB7XG4gICAgICAgICAgICBwcm9jZXNzRGlzcGF0Y2goZGF0YS50aGVuLCB1dGlscywgcnVudGltZSwge1xuICAgICAgICAgICAgICBbcmVxdWVzdFJlc1N5bWJvbF06IHtcbiAgICAgICAgICAgICAgICBwYXJlbnRSZXM6IHJ1bnRpbWVJbmZvPy5bcmVxdWVzdFJlc1N5bWJvbF0sXG4gICAgICAgICAgICAgICAgLi4ucmVxdWVzdFJlcyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlcXVlc3RSZXM7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgaWYgKFwiY2F0Y2hcIiBpbiBkYXRhKSB7XG4gICAgICAgICAgcHJvY2Vzc0Rpc3BhdGNoKGRhdGEuY2F0Y2gsIHV0aWxzLCBydW50aW1lLCB7XG4gICAgICAgICAgICBbcmVxdWVzdEVyclN5bWJvbF06IGVycixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cbiAgaWYgKGlzQ29uZGl0aW9uRGlzcGF0Y2goZGlzcGF0Y2gpKSB7XG4gICAgYXdhaXQgbmV4dFRpY2soKTsgLy8g55So5LqO6I635Y+W5pyA5paw5pWw5o2uXG4gICAgaWYgKGlzQXJyYXkoZGF0YS5hbmQpKSB7XG4gICAgICBjb25zdCBwcm9taXNlcyA9IGRhdGEuYW5kLm1hcCgoY29uZGl0aW9uOiBBbnlPYmplY3QpID0+IHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NDb21wYXJlKGNvbmRpdGlvbiwgdXRpbHMsIHJ1bnRpbWUsIHJ1bnRpbWVJbmZvKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgY29uZGl0aW9uUmVzdWx0cyA9IChhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcykpLmV2ZXJ5KEJvb2xlYW4pO1xuICAgICAgaWYgKGNvbmRpdGlvblJlc3VsdHMgJiYgXCJ0aGVuXCIgaW4gZGF0YSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzc0Rpc3BhdGNoKGRhdGEudGhlbiwgdXRpbHMsIHJ1bnRpbWUsIHJ1bnRpbWVJbmZvKTtcbiAgICAgIH1cbiAgICAgIGlmICghY29uZGl0aW9uUmVzdWx0cyAmJiBcImVsc2VcIiBpbiBkYXRhKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzRGlzcGF0Y2goZGF0YS5lbHNlLCB1dGlscywgcnVudGltZSwgcnVudGltZUluZm8pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbmRpdGlvblJlc3VsdHM7XG4gICAgfVxuICAgIGlmIChpc0FycmF5KGRhdGEub3IpKSB7XG4gICAgICBjb25zdCBwcm9taXNlcyA9IGRhdGEub3IubWFwKChjb25kaXRpb246IEFueU9iamVjdCkgPT4ge1xuICAgICAgICByZXR1cm4gcHJvY2Vzc0NvbXBhcmUoY29uZGl0aW9uLCB1dGlscywgcnVudGltZSwgcnVudGltZUluZm8pO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBjb25kaXRpb25SZXN1bHRzID0gKGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKSkuc29tZShCb29sZWFuKTtcbiAgICAgIGlmIChjb25kaXRpb25SZXN1bHRzICYmIFwidGhlblwiIGluIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NEaXNwYXRjaChkYXRhLnRoZW4sIHV0aWxzLCBydW50aW1lLCBydW50aW1lSW5mbyk7XG4gICAgICB9XG4gICAgICBpZiAoIWNvbmRpdGlvblJlc3VsdHMgJiYgXCJlbHNlXCIgaW4gZGF0YSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzc0Rpc3BhdGNoKGRhdGEuZWxzZSwgdXRpbHMsIHJ1bnRpbWUsIHJ1bnRpbWVJbmZvKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb25kaXRpb25SZXN1bHRzO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmRpdGlvblJlc3VsdCA9IGF3YWl0IHByb2Nlc3NDb21wYXJlKFxuICAgICAgZGF0YSxcbiAgICAgIHV0aWxzLFxuICAgICAgcnVudGltZSxcbiAgICAgIHJ1bnRpbWVJbmZvXG4gICAgKTtcbiAgICBpZiAoIShcInRoZW5cIiBpbiBkYXRhIHx8IFwiZWxzZVwiIGluIGRhdGEpKSB7XG4gICAgICByZXR1cm4gY29uZGl0aW9uUmVzdWx0O1xuICAgIH1cbiAgICBpZiAoY29uZGl0aW9uUmVzdWx0ICYmIFwidGhlblwiIGluIGRhdGEpIHtcbiAgICAgIHJldHVybiBwcm9jZXNzRGlzcGF0Y2goZGF0YS50aGVuLCB1dGlscywgcnVudGltZSwgcnVudGltZUluZm8pO1xuICAgIH1cbiAgICBpZiAoIWNvbmRpdGlvblJlc3VsdCAmJiBcImVsc2VcIiBpbiBkYXRhKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc0Rpc3BhdGNoKGRhdGEuZWxzZSwgdXRpbHMsIHJ1bnRpbWUsIHJ1bnRpbWVJbmZvKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaXNFdmVudEhhbmRsZXJEaXNwYXRjaChkaXNwYXRjaCkpIHtcbiAgICByZXR1cm4gcmF3KCh1dGlsczogQW55T2JqZWN0LCAuLi5hcmdzOiBBbnlBcnJheSkgPT4ge1xuICAgICAgZGF0YS5waXBlcy5mb3JFYWNoKChwaXBlOiBBbnlPYmplY3QpID0+IHtcbiAgICAgICAgcHJvY2Vzc0Rpc3BhdGNoKHBpcGUsIHV0aWxzLCBydW50aW1lLCB7XG4gICAgICAgICAgLi4ucnVudGltZUluZm8sXG4gICAgICAgICAgW2V2ZW50QXJnc1N5bWJvbF06IHtcbiAgICAgICAgICAgIHBhcmVudEFyZ3M6IHJ1bnRpbWVJbmZvPy5bZXZlbnRBcmdzU3ltYm9sXSxcbiAgICAgICAgICAgIC4uLmFyZ3MsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChpc1NldE1vZGVsRGlzcGF0Y2goZGlzcGF0Y2gpKSB7XG4gICAgaWYgKGlzU3RyaW5nKGRhdGEuYXMpKSB7XG4gICAgICBjb25zdCBzZXRSZXN1bHQgPSBzZXQoXG4gICAgICAgIHJ1bnRpbWUuX21vZGVsLm1vZGVsLnZhbHVlLFxuICAgICAgICBkYXRhLmZpZWxkLFxuICAgICAgICBwcm9jZXNzRHluYW1pY1ZhbHVlKGRhdGEuYXMsIHV0aWxzLCBydW50aW1lLCBydW50aW1lSW5mbylcbiAgICAgICk7XG4gICAgICBpZiAoXCJ0aGVuXCIgaW4gZGF0YSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzc0Rpc3BhdGNoKGRhdGEudGhlbiwgdXRpbHMsIHJ1bnRpbWUsIHJ1bnRpbWVJbmZvKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZXRSZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IHNldFJlc3VsdCA9IHNldChcbiAgICAgIHJ1bnRpbWUuX21vZGVsLm1vZGVsLnZhbHVlLFxuICAgICAgZGF0YS5maWVsZCxcbiAgICAgIGF3YWl0IHByb2Nlc3NEaXNwYXRjaChkYXRhLmFzLCB1dGlscywgcnVudGltZSwgcnVudGltZUluZm8pXG4gICAgKTtcbiAgICBpZiAoXCJ0aGVuXCIgaW4gZGF0YSkge1xuICAgICAgcmV0dXJuIHByb2Nlc3NEaXNwYXRjaChkYXRhLnRoZW4sIHV0aWxzLCBydW50aW1lLCBydW50aW1lSW5mbyk7XG4gICAgfVxuICAgIHJldHVybiBzZXRSZXN1bHQ7XG4gIH1cblxuICBpZiAoaXNTZXRTaGFyZWREaXNwYXRjaChkaXNwYXRjaCkpIHtcbiAgICBpZiAoaXNTdHJpbmcoZGF0YS5hcykpIHtcbiAgICAgIGNvbnN0IHNldFJlc3VsdCA9IHNldChcbiAgICAgICAgcnVudGltZS5zaGFyZWQsXG4gICAgICAgIGRhdGEuZmllbGQsXG4gICAgICAgIHByb2Nlc3NEeW5hbWljVmFsdWUoZGF0YS5hcywgdXRpbHMsIHJ1bnRpbWUsIHJ1bnRpbWVJbmZvKVxuICAgICAgKTtcbiAgICAgIGlmIChcInRoZW5cIiBpbiBkYXRhKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzRGlzcGF0Y2goZGF0YS50aGVuLCB1dGlscywgcnVudGltZSwgcnVudGltZUluZm8pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNldFJlc3VsdDtcbiAgICB9XG4gICAgY29uc3Qgc2V0UmVzdWx0ID0gc2V0KFxuICAgICAgcnVudGltZS5zaGFyZWQsXG4gICAgICBkYXRhLmZpZWxkLFxuICAgICAgYXdhaXQgcHJvY2Vzc0Rpc3BhdGNoKGRhdGEuYXMsIHV0aWxzLCBydW50aW1lLCBydW50aW1lSW5mbylcbiAgICApO1xuICAgIGlmIChcInRoZW5cIiBpbiBkYXRhKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc0Rpc3BhdGNoKGRhdGEudGhlbiwgdXRpbHMsIHJ1bnRpbWUsIHJ1bnRpbWVJbmZvKTtcbiAgICB9XG4gICAgcmV0dXJuIHNldFJlc3VsdDtcbiAgfVxuXG4gIGlmIChpc0dldFNoYXJlZERpc3BhdGNoKGRpc3BhdGNoKSkge1xuICAgIHJldHVybiBnZXQodXRpbHMuc2hhcmVkLCBkYXRhLmZpZWxkKTtcbiAgfVxuXG4gIGlmIChpc0dldE1vZGVsRGlzcGF0Y2goZGlzcGF0Y2gpKSB7XG4gICAgcmV0dXJuIGdldChydW50aW1lLl9tb2RlbC5tb2RlbC52YWx1ZSwgZGF0YS5maWVsZCk7XG4gIH1cblxuICBpZiAoaXNSZWZzRGlzcGF0Y2goZGlzcGF0Y2gpKSB7XG4gICAgY29uc3QgdGFyZ2V0UmVmID0gdXRpbHMucmVmcy5nZXQoZGF0YS5maWVsZCk7XG4gICAgaWYgKCF0YXJnZXRSZWYpIHJldHVybjtcbiAgICBpZiAoZGF0YS5nZXQpIHtcbiAgICAgIHJldHVybiB0YXJnZXRSZWYudmFsdWVbZGF0YS5nZXRdO1xuICAgIH1cbiAgICBpZiAoZGF0YS5jYWxsKSB7XG4gICAgICB0YXJnZXRSZWYudmFsdWVbZGF0YS5jYWxsXShcbiAgICAgICAgcHJvY2Vzc0R5bmFtaWNWYWx1ZShkYXRhLmFyZ3MsIHV0aWxzLCBydW50aW1lLCBydW50aW1lSW5mbylcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpc0FycmF5KGRhdGEpKSB7XG4gICAgcmV0dXJuIGRhdGEubWFwKChpdGVtOiBBbnlPYmplY3QpID0+XG4gICAgICBwcm9jZXNzRGlzcGF0Y2goaXRlbSwgdXRpbHMsIHJ1bnRpbWUsIHJ1bnRpbWVJbmZvKVxuICAgICk7XG4gIH1cblxuICBpZiAocnVudGltZS5zc3IuYWN0aW9uc1tkaXNwYXRjaF0pIHtcbiAgICBjb25zdCBwcm9jZXNzZWREYXRhOiBBbnlPYmplY3QgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhkYXRhKSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBwcm9jZXNzRGlzcGF0Y2goXG4gICAgICAgIGRhdGFba2V5XSxcbiAgICAgICAgdXRpbHMsXG4gICAgICAgIHJ1bnRpbWUsXG4gICAgICAgIHJ1bnRpbWVJbmZvXG4gICAgICApO1xuICAgICAgcHJvY2Vzc2VkRGF0YVtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBydW50aW1lLnNzci5hY3Rpb25zW2Rpc3BhdGNoXShwcm9jZXNzZWREYXRhLCBydW50aW1lSW5mbyk7XG4gIH1cblxuICByZXR1cm4gcHJvY2Vzc0R5bmFtaWNWYWx1ZShkYXRhLCB1dGlscywgcnVudGltZSwgcnVudGltZUluZm8pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlRGlzcGF0Y2hIYW5kbGVyKGRhdGE6IGFueSwgcnVudGltZTogUnVudGltZSkge1xuICByZXR1cm4gKHV0aWxzOiBBbnlPYmplY3QpID0+IHtcbiAgICByZXR1cm4gcHJvY2Vzc0Rpc3BhdGNoKGRhdGEsIHV0aWxzLCBydW50aW1lKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7IE1ldGFkYXRhLCBQYXJzZWRTY2hlbWFzIH0gZnJvbSBcIkAvY29yZS9saWZlY3ljbGUvU2NoZW1hL3R5cGVzXCI7XG5pbXBvcnQgUnVudGltZSBmcm9tIFwiQC9jb3JlL3J1bnRpbWVcIjtcbmltcG9ydCB7XG4gIHRyYXZlcnNlLFxuICBpc1Byb21pc2UsXG4gIGlzVmFsaWRDb21wb25lbnQsXG4gIHdyYXBwZXJOdW1lcmljTGlrZSxcbn0gZnJvbSBcIkAvY29yZS9zZXJ2aWNlc1wiO1xuaW1wb3J0IHsgUmF3U2NoZW1hcyB9IGZyb20gXCJAL2hlbHBlcnMvZGVmaW5lRm9ybVNjaGVtYS90eXBlc1wiO1xuaW1wb3J0IHsgRm9ybUNvbnRleHQsIGlzT25jZSwgaXNSYXcgfSBmcm9tIFwiQC9pbmRleFwiO1xuaW1wb3J0IHtcbiAgY2xvbmVEZWVwLFxuICBnZXQsXG4gIGlzRnVuY3Rpb24sXG4gIGlzUGxhaW5PYmplY3QsXG4gIGlzU3RyaW5nLFxuICBpc1VuZGVmaW5lZCxcbiAgbWVyZ2UsXG4gIHNldCxcbn0gZnJvbSBcImxvZGFzaFwiO1xuaW1wb3J0IHsgUmVmLCByZWYgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1c2VQYXRoVHJhY2tlciB9IGZyb20gXCJAL2NvcmUvbGlmZWN5Y2xlL2hvb2tzL3VzZVBhdGhUcmFja2VyXCI7XG5pbXBvcnQgeyB1c2VTU1JDb21wb25lbnQgfSBmcm9tIFwiQC9jb3JlL2xpZmVjeWNsZS9ob29rcy91c2VTU1JDb21wb25lbnRcIjtcbmltcG9ydCB7IGRlZXBUcmF2ZXJzZSB9IGZyb20gXCJAL2NvcmUvc2VydmljZXMvZGVlcFRyYXZlcnNlXCI7XG5pbXBvcnQgeyB1c2VEaXNwYXRjaEhhbmRsZXIgfSBmcm9tIFwiQC9jb3JlL2xpZmVjeWNsZS9ob29rcy91c2VEaXNwYXRjaEhhbmRsZXJcIjtcbmltcG9ydCB7XG4gIGlzRHluYW1pY1ZhbHVlLFxuICBwcm9jZXNzRHluYW1pY1ZhbHVlLFxufSBmcm9tIFwiQC9jb3JlL2xpZmVjeWNsZS9ob29rcy91c2VEaXNwYXRjaEhhbmRsZXIvcHJvY2Vzc0R5bmFtaWNWYWx1ZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTY2hlbWEge1xuICByYXdTY2hlbWFzOiBSYXdTY2hlbWFzIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBwYXJzZWRTY2hlbWFzOiBSZWY8UGFyc2VkU2NoZW1hcz4gPSByZWYoW10pO1xuICByZWZzID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcnVudGltZTogUnVudGltZSkge1xuICAgIHRoaXMucHJvY2Vzc1NjaGVtYXMoKTtcbiAgfVxuXG4gIHByb2Nlc3NTU1Ioc2NoZW1hczogUmF3U2NoZW1hcykge1xuICAgIGlmICh0aGlzLnJ1bnRpbWUuaXNTc3IpIHtcbiAgICAgIGRlZXBUcmF2ZXJzZShzY2hlbWFzLCAoZGF0YSwgY29udGV4dCkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5ydW50aW1lLnNzci5kZWZpbml0aW9ucz8uZGlzcGF0Y2ggJiZcbiAgICAgICAgICBkYXRhW3RoaXMucnVudGltZS5zc3IuZGVmaW5pdGlvbnM/LmRpc3BhdGNoXVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gdXNlRGlzcGF0Y2hIYW5kbGVyKGRhdGEsIHRoaXMucnVudGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRleHQua2V5ID09PSBcImNvbXBvbmVudFwiKSB7XG4gICAgICAgICAgcmV0dXJuIHVzZVNTUkNvbXBvbmVudChkYXRhLCB0aGlzLnJ1bnRpbWUpOyAvLyDov5nph4znmoQgZGF0YSDlsLHmmK8gY29tcG9uZW50TmFtZSDkuobvvIwg5ZyoIHNzciDnmoTmg4XlhrXkuItcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNTdHJpbmcoZGF0YSkgJiYgaXNEeW5hbWljVmFsdWUoZGF0YSwgdGhpcy5ydW50aW1lKSkge1xuICAgICAgICAgIHJldHVybiAodXRpbHM6IEFueU9iamVjdCkgPT5cbiAgICAgICAgICAgIHByb2Nlc3NEeW5hbWljVmFsdWUoZGF0YSwgdXRpbHMsIHRoaXMucnVudGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHNjaGVtYXM7XG4gIH1cblxuICBwcm9jZXNzU2NoZW1hcygpIHtcbiAgICBpZiAoaXNGdW5jdGlvbih0aGlzLnJ1bnRpbWUuX29wdGlvbnMuc2NoZW1hcykpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucnVudGltZS5fb3B0aW9ucy5zY2hlbWFzKCkgYXMgYW55O1xuICAgICAgaWYgKGlzUHJvbWlzZShyZXN1bHQpKSB7XG4gICAgICAgIHJlc3VsdC50aGVuKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMucmF3U2NoZW1hcyA9IGNsb25lRGVlcChyZXMpO1xuICAgICAgICAgIHRoaXMudHJhdmVyc2VTY2hlbWFzKHRoaXMucHJvY2Vzc1NTUihjbG9uZURlZXAocmVzKSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudHJhdmVyc2VTY2hlbWFzKHRoaXMucHJvY2Vzc1NTUihjbG9uZURlZXAocmVzdWx0KSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNQcm9taXNlKHRoaXMucnVudGltZS5fb3B0aW9ucy5zY2hlbWFzKSkge1xuICAgICAgKHRoaXMucnVudGltZS5fb3B0aW9ucy5zY2hlbWFzIGFzIHVua25vd24gYXMgUHJvbWlzZTxSYXdTY2hlbWFzPikudGhlbihcbiAgICAgICAgKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5yYXdTY2hlbWFzID0gY2xvbmVEZWVwKHJlcyk7XG4gICAgICAgICAgdGhpcy50cmF2ZXJzZVNjaGVtYXModGhpcy5wcm9jZXNzU1NSKGNsb25lRGVlcChyZXMpKSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmF3U2NoZW1hcyA9IGNsb25lRGVlcCh0aGlzLnJ1bnRpbWUuX29wdGlvbnMuc2NoZW1hcyk7XG4gICAgICB0aGlzLnRyYXZlcnNlU2NoZW1hcyhcbiAgICAgICAgdGhpcy5wcm9jZXNzU1NSKGNsb25lRGVlcCh0aGlzLnJ1bnRpbWUuX29wdGlvbnMuc2NoZW1hcykpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIEkgaG9wZSB0aGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlXG4gIHRyYXZlcnNlU2NoZW1hcyhzY2hlbWFzOiBSYXdTY2hlbWFzKSB7XG4gICAgdHJhdmVyc2Uoc2NoZW1hcywgKF8sIGtleSwgcGFyZW50S2V5KSA9PiB7XG4gICAgICBjb25zdCBwYXRoID0gcGFyZW50S2V5XG4gICAgICAgID8gYCR7d3JhcHBlck51bWVyaWNMaWtlKHBhcmVudEtleSl9LmNoaWxkcmVuLiR7d3JhcHBlck51bWVyaWNMaWtlKGtleSl9YFxuICAgICAgICA6IHdyYXBwZXJOdW1lcmljTGlrZShrZXkpO1xuXG4gICAgICBjb25zdCBzY2hlbWEgPSBnZXQoc2NoZW1hcywgcGF0aCk7XG5cbiAgICAgIC8vIOi/memHjOaYr+S4uuS6huaWueS+v+WQjue7reeahOa2iOi0ueWkhOeQhuWIneWni+WMliBtb2RlbCDlgZrlh4blpIdcbiAgICAgIGlmIChpc1VuZGVmaW5lZChzY2hlbWEudHlwZSkpIHtcbiAgICAgICAgc2NoZW1hLnR5cGUgPSBcIml0ZW1cIjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wYXJzZVNjaGVtYShzY2hlbWEsIHtcbiAgICAgICAgcGF0aCxcbiAgICAgICAgc2V0dGVyOiAocHJvY2Vzc2VkVmFsdWUsIG1ldGFkYXRhLCBqdW1wQ29uc3VtZSA9IGZhbHNlKSA9PiB7XG4gICAgICAgICAgIWp1bXBDb25zdW1lICYmXG4gICAgICAgICAgICB0aGlzLnJ1bnRpbWUuX21vZGVsLnByb2Nlc3NSZWxhdGlvbihtZXRhZGF0YSwgcHJvY2Vzc2VkVmFsdWUpO1xuXG4gICAgICAgICAgLy8g6L+Z6YeM55qE6aKE5pyf5piv5Zyo56Gu5a6a5pyJIGZpZWxkIOeahOaDheWGteS4i+WOu+ato+ehruS4uuayoeacieaPkOS+myBkZWZhdWx0VmFsdWUg55qEIHNjaGVtYSDmj5DkvpsgdW5kZWZpbmVkIOS+v+S6juWQjue7reeahOa2iOi0uVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG1ldGFkYXRhLnByb3BlcnR5S2V5ID09PSBcImZpZWxkXCIgJiZcbiAgICAgICAgICAgIGlzVW5kZWZpbmVkKHNjaGVtYS5kZWZhdWx0VmFsdWUpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBzY2hlbWEuZGVmYXVsdFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgLy8g56uL5Y2z6Kem5Y+R5LiA5qyh5raI6LS577yM5qih5ouf5LiN5a2Y5ZyoIGRlZmF1bHRWYWx1ZSDlnKjlvZPliY0gc2NoZW1hIOiiq+WkhOeQhuaIkOeos+WumueahCB1bmRlZmluZWQg5LmL5ZCO55qE5pWI5p6cXG4gICAgICAgICAgICAvLyDvvIzku47ogIzmjqjov5vlpITnkIbmtYHnqIvvvIzpgb/lhY3kuK3mlq1cbiAgICAgICAgICAgIHRoaXMucnVudGltZS5fbW9kZWwucHJvY2Vzc1JlbGF0aW9uKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4ubWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXk6IFwiZGVmYXVsdFZhbHVlXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXQoXG4gICAgICAgICAgICB0aGlzLnBhcnNlZFNjaGVtYXMudmFsdWUsXG4gICAgICAgICAgICBgJHttZXRhZGF0YS5wYXRofS4ke21ldGFkYXRhLnByb3BlcnR5S2V5fWAsXG4gICAgICAgICAgICBwcm9jZXNzZWRWYWx1ZVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOmcgOimgeazqOaEj+eahOaYr++8jOW9k+aIkeWcqOWunueOsOi/meS4queahOaXtuWAme+8jOaIkeeahCBoYXBweSBwYXRoIOWFtuWunuaYr+i/h+WIhuWFs+azqOS6jiBpbnB1dCA9PiByZW5kZXJhYmxlIOeahO+8jOi/mVxuICAgKiDlhbblrp7lvojlpKfnqIvluqbkuIrlrZjlnKjpo47pmanvvIznqI3mnInkuI3mhY7lsLHkvJrluKbmnaXkuI3lj6/pgb/lhY3nmoTph43mnoTpmr7luqbvvIzlr7nmraTvvIzpmaTkuobosKjmhY7ogIPomZHlvJXlhaXkuYvlpJbvvIzmiJHov5jlu7rorq7lnKjorr7orqHkuYvliJ1cbiAgICog5bCx5byV5YWl6Laz5aSf5aSN5p2C55qE5Zy65pmv77yM6YG/5YWN6L+H5LqOIGhhcHB5IHBhdGgg5a+86Ie05aSN55So5oCn5beu5bm25LiU5Luj56CB5aSN5p2C55qE6Zeu6aKYXG4gICAqL1xuXG4gIHBhcnNlU2NoZW1hKHNjaGVtYTogYW55LCBtZXRhZGF0YTogTWV0YWRhdGEpIHtcbiAgICBPYmplY3Qua2V5cyhzY2hlbWEpLmZvckVhY2goKHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICBjb25zdCBwcm9wZXJ0eVZhbHVlID0gc2NoZW1hW3Byb3BlcnR5S2V5XTtcblxuICAgICAgLy8g6L+Z6YeM6Kej5p6EIG1ldGFkYXRh77yM6YG/5YWN5LiL5bGC5pWw5o2u5Zyo5rex5bqm6YCS5b2S55qE5Zy65pmv5LiL5Y+R55Sf5rGh5p+TXG4gICAgICB0aGlzLnBhcnNlUHJvcGVydHkocHJvcGVydHlLZXksIHByb3BlcnR5VmFsdWUsIHtcbiAgICAgICAgLi4ubWV0YWRhdGEsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlhYjor7Tor7Tov5nkuKrlh73mlbDlgZrku4DkuYjvvIzpmLLmraLlkI7nu63or6/nlKjvvIzkubHnlKhcbiAgICog6L+Z5Liq5Ye95pWw5bm25LiN5piv5Y+q55So5p2l5aSE55CGIHNjaGVtYSDnmoTnrKzkuIDlsYLpgY3ljobvvIzogIzmmK/kuIDkuKrpgJrnlKjlnovnmoTlh73mlbDvvIzku5bnmoTnm67nmoTmmK/nlKjmnaXlpITnkIbku7vmhI/plK7lgLzlr7lcbiAgICog5bm25LiU5bCG5aSE55CG55qE57uT5p6c5aal5ZaE55qE5qC55o2uIG1ldGFkYXRhIOiuvuWumuWIsOW6lOivpeWOu+eahOWcsOaWue+8jOmCo+S5iOWPr+S7peaDs+ixoeWIsOeahOaYr1xuICAgKiDov5nkuKrlh73mlbDnmoTlh7rlj6PmmK/lm7rlrprnmoTvvIzkvYbmmK/lhaXlj6PmmK/kuI3lm7rlrprnmoTvvIzmiYDku6XmiJHkvJrnuqbmnZ/ov5nkuKrlh73mlbDnmoTlh7rlj6Pov5Tlm57nmoTlj4LmlbDvvIzkvYbpnIDopoHlhaXlj6PmnaXpgILphY3ov5nkupvlj4LmlbDmiY3og73mraPluLjkvb/nlKjlroNcbiAgICpcbiAgICog6YKj5LmI6L+Z5Liq5Ye95pWw55qE55uu55qE5Lmf5bCx5piO5LqG5LqG77yMXG4gICAqIDHjgIHlvpfliLDlpITnkIblrozmiJDnmoTlgLxcbiAgICogICAgMeOAgeS7gOS5iOaYr+WkhOeQhuWujOaIkO+8n1xuICAgKiAgICAy44CB5LuA5LmI6K+l5aSE55CG77yM5LuA5LmI5LiN6K+l5aSE55CG77yfXG4gICAqICAgIDPjgIHmgI7kuYjlpITnkIbvvJ9cbiAgICogMuOAgeiwg+eUqCBtZXRhZGF0YSDph4znmoQgc2V0dGVy77yM5bm25LiU5bCG5aSE55CG5a6M5oiQ55qE5YC85ZKMIG1ldGFkYXRhIOS8oOWFpVxuICAgKi9cbiAgcGFyc2VQcm9wZXJ0eShwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eVZhbHVlOiBhbnksIG1ldGFkYXRhOiBNZXRhZGF0YSkge1xuICAgIG1lcmdlKG1ldGFkYXRhLCB7XG4gICAgICBwcm9wZXJ0eUtleSxcbiAgICAgIHByb2Nlc3NlZFNldHRlcihwcm9jZXNzZWRWYWx1ZTogYW55LCBqdW1wQ29uc3VtZSA9IGZhbHNlKSB7XG4gICAgICAgIG1ldGFkYXRhLnNldHRlcihwcm9jZXNzZWRWYWx1ZSwgbWV0YWRhdGEsIGp1bXBDb25zdW1lKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyDop6PlvIAgbWV0YWRhdGEg6YG/5YWN5pWw5o2u5rGh5p+TXG4gICAgdGhpcy5wcm9jZXNzaW5nKHByb3BlcnR5VmFsdWUsIG1ldGFkYXRhKTtcbiAgfVxuXG4gIHVzYWdlVHJhY2tlciA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcblxuICAvKipcbiAgICog5aSE55CG5ZmoXG4gICAqIDHjgIHov5Tlm57lgLzmmK/ku4DkuYhcbiAgICogMuOAgeS7gOS5iOivpeWkhOeQhu+8jOS7gOS5iOS4jeWkhOeQhlxuICAgKlxuICAgKiDlpITnkIblmajpnIDopoHot58gVXBkYXRlIOaJk+mAmu+8jOeVmeWtmOiusOW9lVxuICAgKlxuICAgKiDmgJ3ot69cbiAgICog5a+55LqO5Ye95pWw6ICM6KiA77yM5bCG5omA5pyJ5ZCM5q2l5oiW5byC5q2l55qE5Ye95pWw6YO95aSE55CG5oiQ57uT5p6c5ZCO77yM5YaN6L+b5YWlIHByb2Nlc3NOb25GdW5jdGlvbiDlh73mlbDov5vooYzlpITnkIbvvIzogIzlr7nkuo7lhbbku5bmlbDmja7vvIzliJnnm7TmjqXov5vlhaVcbiAgICogcHJvY2Vzc05vbkZ1bmN0aW9uIOWHveaVsOi/m+ihjOWkhOeQhlxuICAgKi9cbiAgcHJvY2Vzc2luZyh2YWx1ZTogYW55LCBtZXRhZGF0YTogTWV0YWRhdGEpIHtcbiAgICBpZiAoaXNSYXcodmFsdWUpKSB7XG4gICAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgdXRpbHMgPSB7XG4gICAgICAgICAgbW9kZWw6IHRoaXMucnVudGltZS5fbW9kZWwubW9kZWwudmFsdWUsXG4gICAgICAgICAgc2hhcmU6IHRoaXMucnVudGltZS5zaGFyZS5iaW5kKHRoaXMucnVudGltZSksXG4gICAgICAgICAgc2hhcmVkOiB0aGlzLnJ1bnRpbWUuc2hhcmVkLFxuICAgICAgICAgIHJlZnM6IHRoaXMucmVmcyxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG1ldGFkYXRhLnByb2Nlc3NlZFNldHRlcj8uKCguLi5hcmdzOiBBbnlBcnJheSkgPT5cbiAgICAgICAgICB2YWx1ZSh1dGlscywgLi4uYXJncylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXRhZGF0YS5wcm9jZXNzZWRTZXR0ZXI/Lih2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICBjb25zdCBlZmZlY3RLZXkgPSBgJHttZXRhZGF0YS5wYXRofS4ke21ldGFkYXRhLnByb3BlcnR5S2V5fWA7XG5cbiAgICAgIGNvbnN0IHV0aWxzID0gdXNlUGF0aFRyYWNrZXIoXG4gICAgICAgIHtcbiAgICAgICAgICBtb2RlbDogdGhpcy5ydW50aW1lLl9tb2RlbC5tb2RlbC52YWx1ZSxcbiAgICAgICAgICBzaGFyZTogdGhpcy5ydW50aW1lLnNoYXJlLmJpbmQodGhpcy5ydW50aW1lKSxcbiAgICAgICAgICBzaGFyZWQ6IHRoaXMucnVudGltZS5zaGFyZWQsXG4gICAgICAgICAgcmVmczogdGhpcy5yZWZzLFxuICAgICAgICB9LFxuICAgICAgICAocGF0aCkgPT4ge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIOi/meS4pOWdl+S7o+eggei/meS5iOWGmeeci+edgOiHg+iCv++8jOS9huWFtuWunuaYr+S4uuS6huabtOWlveeahOS7o+eggeWPr+ivu+aAp1xuICAgICAgICAgICAqIOi/meihqOekuuebruWJjeWPqiB0cmFjayDkuKTnp43mlbDmja7nmoQgZWZmZWN077yM5LiA56eN5piv5L2/55So5LqGIG1vZGVsIOeahO+8jOWPpuWkluS4gOenjeaYr+S9v+eUqOS6hiBzaGFyZWTvvIzov5nkuKTnp41cbiAgICAgICAgICAgKiDmlbDmja7lnKjlj5jljJbnmoTml7blgJnpnIDopoHph43mlrDmiafooYzkvp3otZZcbiAgICAgICAgICAgKi9cbiAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwibW9kZWwuXCIpKSB7XG4gICAgICAgICAgICBpZiAoIWlzT25jZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5ydW50aW1lLl91cGRhdGUudHJhY2soZWZmZWN0S2V5LCB7XG4gICAgICAgICAgICAgICAgZWZmZWN0S2V5LFxuICAgICAgICAgICAgICAgIHRyYWNrZWRFZmZlY3Q6IHNjaGVtYUVmZmVjdCxcbiAgICAgICAgICAgICAgICB0cmFja2luZ1R5cGU6IFwibW9kZWxcIixcbiAgICAgICAgICAgICAgICB0cmFja2luZ1BhdGg6IHBhdGgucmVwbGFjZSgvXm1vZGVsXFwuLywgXCJcIiksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwic2hhcmVkLlwiKSkge1xuICAgICAgICAgICAgaWYgKCFpc09uY2UodmFsdWUpKSB7XG4gICAgICAgICAgICAgIHRoaXMucnVudGltZS5fdXBkYXRlLnRyYWNrKGVmZmVjdEtleSwge1xuICAgICAgICAgICAgICAgIGVmZmVjdEtleSxcbiAgICAgICAgICAgICAgICB0cmFja2VkRWZmZWN0OiBzY2hlbWFFZmZlY3QsXG4gICAgICAgICAgICAgICAgdHJhY2tpbmdUeXBlOiBcInNoYXJlXCIsXG4gICAgICAgICAgICAgICAgdHJhY2tpbmdQYXRoOiBwYXRoLnJlcGxhY2UoL15zaGFyZWRcXC4vLCBcIlwiKSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBzY2hlbWFFZmZlY3QgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGV4ZWN1dGlvblJlcyA9IHZhbHVlKHV0aWxzKTtcbiAgICAgICAgaWYgKGlzUHJvbWlzZShleGVjdXRpb25SZXMpKSB7XG4gICAgICAgICAgLy8g6L+Z6YeM5Li76KaB5piv5Li65LqG5LiN6Zi75aGe5byC5q2l5pWw5o2u5riy5p+T77yM5L2G5piv6YCa6L+HIGp1bXBDb25zdW1lIOi3s+i/h+a2iOi0ue+8jOWcqOacgOe7iCB0aGVuIOS5i+WQjuaJjeeci+S9nOaYr+a2iOi0uVxuICAgICAgICAgIHRoaXMucHJvY2Vzc2luZ05vbkZ1bmN0aW9uKHVuZGVmaW5lZCwgY2xvbmVEZWVwKG1ldGFkYXRhKSwgdHJ1ZSk7XG4gICAgICAgICAgZXhlY3V0aW9uUmVzLnRoZW4oKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NpbmdOb25GdW5jdGlvbihyZXMsIGNsb25lRGVlcChtZXRhZGF0YSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzaW5nTm9uRnVuY3Rpb24oZXhlY3V0aW9uUmVzLCBjbG9uZURlZXAobWV0YWRhdGEpKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBzY2hlbWFFZmZlY3QoKTtcbiAgICB9XG5cbiAgICB0aGlzLnByb2Nlc3NpbmdOb25GdW5jdGlvbih2YWx1ZSwgbWV0YWRhdGEpO1xuICB9XG5cbiAgLy8g5aSE55CG6Z2e5Ye95pWw5oCn5pWw5o2uXG4gIC8vIOmAmui/hyBqdW1wQ29uc3VtZSDot7Pov4fmtojotLnvvIznlKjkuo7lnKjkuIDkupvkuK3pl7TnirbmgIHmj5Dkvpvnq4vljbPnmoTmlbDmja7mlK/mjIFcbiAgcHJvY2Vzc2luZ05vbkZ1bmN0aW9uKHZhbHVlOiBhbnksIG1ldGFkYXRhOiBNZXRhZGF0YSwganVtcENvbnN1bWUgPSBmYWxzZSkge1xuICAgIGlmIChpc1ZhbGlkQ29tcG9uZW50KG1ldGFkYXRhLnByb3BlcnR5S2V5LCB2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBtZXRhZGF0YS5wcm9jZXNzZWRTZXR0ZXI/Lih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8g5Yiw5LqG6L+Z5LiA5q2l77yM5Y+v5Lul6K6k5Li66L+Z5LqbIG9iamVjdO+8jOmDveaYr+imgea3seW6pui/m+ihjOWkhOeQhueahO+8jOWboOS4uiByYXcg5ZKMIGNvbXBvbmVudCDlt7Lnu4/lnKjliY3pnaLnu5nmkJ7lrprkuoZcblxuICAgIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgbGV0IHByb3BlcnR5S2V5ID0gbWV0YWRhdGEucHJvcGVydHlLZXkhO1xuXG4gICAgICAvLyDov5nkuKrlpITnkIbmmK/kuLrkuobpmLLmraLlnKjmlLbpm4YgZmllbGQg5ZKMIGRlZmF1bHRWYWx1ZSDnmoTml7blgJnph43lpI3ov5vooYzmlLbpm4bvvIzlm6DkuLogeHh4LjAg5ZKMIHh4eC5bMF0g5YW25a6e6YO95piv5LiA5LiqIHNjaGVtYe+8jOS9huaYr+S8muiiq1xuICAgICAgLy8g6ZSZ6K+v55qE5pS26ZuG5Lik5qyhXG4gICAgICAvLyDmm7TmlrAgcGF0aO+8jOaWueS+v+WQjue7reabtOaWsOato+ehrueahCBzY2hlbWEg5L2N572uXG4gICAgICBtZXRhZGF0YS5wYXRoID0gYCR7bWV0YWRhdGEucGF0aH0uJHt3cmFwcGVyTnVtZXJpY0xpa2UocHJvcGVydHlLZXkpfWA7XG4gICAgICB0aGlzLnBhcnNlU2NoZW1hKHZhbHVlLCBtZXRhZGF0YSk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgdGhpcy5wcm9jZXNzaW5nKHZhbHVlLCBtZXRhZGF0YSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g6Z2eIG9iamVjdCDmlbDmja7vvIzlj6/ku6Xnm7TmjqXorqTkuLrmmK/lpITnkIblrozmiJBcbiAgICBtZXRhZGF0YS5wcm9jZXNzZWRTZXR0ZXI/Lih2YWx1ZSwganVtcENvbnN1bWUpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBUcmlnZ2VyVHlwZSB9IGZyb20gXCJAL2NvcmUvbGlmZWN5Y2xlL1VwZGF0ZS90eXBlc1wiO1xuaW1wb3J0IFJ1bnRpbWUgZnJvbSBcIkAvY29yZS9ydW50aW1lXCI7XG5pbXBvcnQgeyB3YXRjaEVmZmVjdCB9IGZyb20gXCJ2dWVcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXBkYXRlIHtcbiAgZWZmZWN0cyA9IG5ldyBNYXAoKTtcbiAgY29uc3RydWN0b3IocHVibGljIHJ1bnRpbWU6IFJ1bnRpbWUpIHt9XG5cbiAgdHJhY2soa2V5OiBzdHJpbmcsIGVmZmVjdDogYW55KSB7XG4gICAgLy8g5Li65Y+v6IO95a2Y5Zyo55qEIHNoYXJlIOS5n+S/neWtmOS4gOS7vSB0cmFja++8jOS7juiAjOmalOemu+W8gOadpe+8jOmBv+WFjeaXoOmZkOinpuWPkVxuICAgIGxldCBlZmZlY3RNYXAgPSB0aGlzLmVmZmVjdHMuZ2V0KGtleSk7XG4gICAgaWYgKCFlZmZlY3RNYXApIHtcbiAgICAgIGVmZmVjdE1hcCA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgaWYgKCFlZmZlY3RNYXAuaGFzKGVmZmVjdC50cmFja2luZ1BhdGgpKSB7XG4gICAgICBlZmZlY3RNYXAuc2V0KGVmZmVjdC50cmFja2luZ1BhdGgsIGVmZmVjdCk7XG4gICAgfVxuICAgIHRoaXMuZWZmZWN0cy5zZXQoa2V5LCBlZmZlY3RNYXApO1xuICB9XG5cbiAgLy8g55uu5YmN55qE5pu05paw6YC76L6R5piv5b2TIG1vZGVsIOWPmOWMluaIluiAhSBzaGFyZSDmiafooYzml7bvvIzop6blj5Egc2NoZW1hIOeahOmHjeaWsOiuoeeul1xuICAvLyBUT0RPIOS8mOWMluaVsOaNrue7k+aehO+8jOaPkOWNh+abtOaWsOaViOiDvVxuICB0cmlnZ2VyKHR5cGU6IFRyaWdnZXJUeXBlID0gXCJtb2RlbFwiLCBwYXRoPzogc3RyaW5nKSB7XG4gICAgZm9yIChjb25zdCBlZmZlY3Qgb2YgdGhpcy5lZmZlY3RzLnZhbHVlcygpKSB7XG4gICAgICBmb3IgKGNvbnN0IGVmZmVjdEl0ZW0gb2YgZWZmZWN0LnZhbHVlcygpKSB7XG4gICAgICAgIGlmIChlZmZlY3RJdGVtLnRyYWNraW5nVHlwZSAhPT0gdHlwZSkgYnJlYWs7XG4gICAgICAgIGlmICghZWZmZWN0SXRlbS50cmFja2luZ1BhdGguaW5jbHVkZXMocGF0aCkpIGNvbnRpbnVlO1xuXG4gICAgICAgIGVmZmVjdEl0ZW0udHJhY2tlZEVmZmVjdCh0eXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBBZGFwdGVyIGZyb20gXCJAL2NvcmUvYWRhcHRlclwiO1xuaW1wb3J0IHsgRm9ybUNvbnRleHQgfSBmcm9tIFwiQC9jb3JlL2NvbnRleHRcIjtcbmltcG9ydCB7IFNTUiB9IGZyb20gXCJAL2NvcmUvY29udGV4dC90eXBlc1wiO1xuaW1wb3J0IE1vZGVsIGZyb20gXCJAL2NvcmUvbGlmZWN5Y2xlL01vZGVsXCI7XG5pbXBvcnQgUmVuZGVyIGZyb20gXCJAL2NvcmUvbGlmZWN5Y2xlL1JlbmRlclwiO1xuaW1wb3J0IFNjaGVtYSBmcm9tIFwiQC9jb3JlL2xpZmVjeWNsZS9TY2hlbWFcIjtcbmltcG9ydCBVcGRhdGUgZnJvbSBcIkAvY29yZS9saWZlY3ljbGUvVXBkYXRlXCI7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiQC9oZWxwZXJzL2RlZmluZUZvcm1TZXR1cC90eXBlc1wiO1xuaW1wb3J0IHsgVXNlRm9ybU9wdGlvbnMgfSBmcm9tIFwiQC9oZWxwZXJzL3VzZUZvcm0vdHlwZXNcIjtcbmltcG9ydCBvbkNoYW5nZSBmcm9tIFwib24tY2hhbmdlXCI7XG5pbXBvcnQgeyBuZXh0VGljaywgd2F0Y2ggfSBmcm9tIFwidnVlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJ1bnRpbWUge1xuICBwdWJsaWMgX3NjaGVtYTogU2NoZW1hO1xuICBwdWJsaWMgX21vZGVsOiBNb2RlbDtcbiAgcHVibGljIF9yZW5kZXI6IFJlbmRlcjtcbiAgcHVibGljIF91cGRhdGU6IFVwZGF0ZTtcbiAgcHVibGljIF9vcHRpb25zOiBVc2VGb3JtT3B0aW9ucztcbiAgcHVibGljIF9jb250ZXh0OiBGb3JtQ29udGV4dDtcbiAgcHVibGljIF9hZGFwdGVyOiBBZGFwdGVyO1xuICBwdWJsaWMgc2hhcmVkID0gb25DaGFuZ2Uoe30sIChwYXRoKSA9PiB7XG4gICAgdGhpcy5fdXBkYXRlLnRyaWdnZXIoXCJzaGFyZVwiLCBwYXRoKTtcbiAgfSk7XG4gIHB1YmxpYyBpc1NzciA9IGZhbHNlO1xuICBwdWJsaWMgc3NyID0ge30gYXMgU1NSO1xuICBwdWJsaWMgZGVmYXVsdFNTUkRlZmluaXRpb25zID0ge1xuICAgIGRpc3BhdGNoOiBcIiRkaXNwYXRjaFwiLFxuICAgIG1vZGVsOiBcIiRtb2RlbFwiLFxuICAgIHNoYXJlZDogXCIkc2hhcmVkXCIsXG4gICAgcmVzOiBcIiRyZXNcIixcbiAgICBlcnI6IFwiJGVyclwiLFxuICAgIGFyZ3M6IFwiJGFyZ3NcIixcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBVc2VGb3JtT3B0aW9ucykge1xuICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMucHJvY2Vzc1NTUihvcHRpb25zKTtcbiAgICB0aGlzLl9jb250ZXh0ID0gRm9ybUNvbnRleHQ7XG4gICAgdGhpcy5fbW9kZWwgPSBuZXcgTW9kZWwodGhpcyk7XG4gICAgdGhpcy5fcmVuZGVyID0gbmV3IFJlbmRlcih0aGlzKTtcbiAgICB0aGlzLl91cGRhdGUgPSBuZXcgVXBkYXRlKHRoaXMpO1xuICAgIHRoaXMuX3NjaGVtYSA9IG5ldyBTY2hlbWEodGhpcyk7XG4gICAgdGhpcy5fYWRhcHRlciA9IG5ldyBBZGFwdGVyKHRoaXMpO1xuICB9XG5cbiAgcHJvY2Vzc1NTUihvcHRpb25zOiBVc2VGb3JtT3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnNzcikge1xuICAgICAgdGhpcy5pc1NzciA9IHRydWU7XG4gICAgICB0aGlzLnNzciA9IG9wdGlvbnMuc3NyO1xuICAgICAgdGhpcy5zc3IuZGVmaW5pdGlvbnMgPSB7XG4gICAgICAgIC4uLnRoaXMuZGVmYXVsdFNTUkRlZmluaXRpb25zLFxuICAgICAgICAuLi5vcHRpb25zLnNzci5kZWZpbml0aW9ucyxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOi/meS4quWcsOaWueWcqOiwg+aVtOWQjuWNs+S9v+aYr+S4jeWGmei/meauteS5n+ayoeS6i++8jOWboOS4uiBzc3Ig55qE5Yik5a6a5piv6Lef552AIHVzZUZvcm0g6LWw55qEXG4gICAgICAvLyDov5nmoLfku5bmnInni6znq4vkuIrkuIvmlofvvIzpgb/lhY3kuoblpJrkuKogZm9ybSDlnKjkuIDkuKrpobXpnaLml7bnmoTkvrXmn5NcbiAgICAgIHRoaXMuaXNTc3IgPSBmYWxzZTtcbiAgICAgIHRoaXMuc3NyID0ge30gYXMgU1NSO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpOiBDb21wb25lbnQge1xuICAgIHJldHVybiB0aGlzLl9yZW5kZXIucmVuZGVyKCk7XG4gIH1cblxuICBzdWJtaXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0ZXIuYWRhcHRlZS52YWxpZGF0ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuX21vZGVsLm1vZGVsLnZhbHVlO1xuICAgIH0pO1xuICB9XG5cbiAgc2hhcmUoc2hhcmVkOiBBbnlPYmplY3QpIHtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuc2hhcmVkLCBzaGFyZWQpO1xuICB9XG5cbiAgaXNSZWFkeShoYW5kbGVyOiBBbnlGdW5jdGlvbikge1xuICAgIGNvbnN0IHVud2F0Y2ggPSB3YXRjaChcbiAgICAgICgpID0+IHRoaXMuX21vZGVsLmFsbENvbnN1bWVkLnZhbHVlLFxuICAgICAgKHZhbCkgPT4ge1xuICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBoYW5kbGVyKCk7XG4gICAgICAgICAgICBuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgIHVud2F0Y2goKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpbW1lZGlhdGU6IHRydWUsXG4gICAgICAgIGRlZXA6IHRydWUsXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGh5ZHJhdGUobW9kZWw6IEFueU9iamVjdCkge1xuICAgIHRoaXMuaXNSZWFkeSgoKSA9PiB7XG4gICAgICB0aGlzLl9tb2RlbC5tb2RlbC52YWx1ZSA9IHtcbiAgICAgICAgLi4udGhpcy5fbW9kZWwubW9kZWwudmFsdWUsXG4gICAgICAgIC4uLm1vZGVsLFxuICAgICAgfTtcbiAgICAgIGNvbnNvbGUubG9nKFwiaHlkcmF0ZVwiLCB0aGlzLl9tb2RlbC5tb2RlbC52YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRGb3JtUmVmKCkge1xuICAgIHJldHVybiB0aGlzLl9yZW5kZXIuZm9ybVJlZjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRm9ybUNvbnRleHQgfSBmcm9tIFwiQC9jb3JlL2NvbnRleHRcIjtcbmltcG9ydCB7IFNTUiB9IGZyb20gXCJAL2NvcmUvY29udGV4dC90eXBlc1wiO1xuaW1wb3J0IFJ1bnRpbWUgZnJvbSBcIkAvY29yZS9ydW50aW1lXCI7XG5pbXBvcnQgeyBVc2VGb3JtT3B0aW9ucyB9IGZyb20gXCJAL2hlbHBlcnMvdXNlRm9ybS90eXBlc1wiO1xuXG4vKipcbiAqIFRvZG86IGRvY3NcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlRm9ybShvcHRpb25zOiBVc2VGb3JtT3B0aW9ucykge1xuICBjb25zdCBydW50aW1lID0gbmV3IFJ1bnRpbWUob3B0aW9ucyk7XG5cbiAgcmV0dXJuIFtcbiAgICBydW50aW1lLnJlbmRlcigpLFxuICAgIHtcbiAgICAgIHN1Ym1pdDogcnVudGltZS5zdWJtaXQuYmluZChydW50aW1lKSxcbiAgICAgIHNoYXJlOiBydW50aW1lLnNoYXJlLmJpbmQocnVudGltZSksXG4gICAgICBtb2RlbDogcnVudGltZS5fbW9kZWwubW9kZWwsXG4gICAgICBzY2hlbWFzOiBydW50aW1lLl9zY2hlbWEucGFyc2VkU2NoZW1hcyxcbiAgICAgIGlzUmVhZHk6IHJ1bnRpbWUuaXNSZWFkeS5iaW5kKHJ1bnRpbWUpLFxuICAgICAgaHlkcmF0ZTogcnVudGltZS5oeWRyYXRlLmJpbmQocnVudGltZSksXG4gICAgICBnZXRGb3JtUmVmOiBydW50aW1lLmdldEZvcm1SZWYuYmluZChydW50aW1lKSxcbiAgICB9LFxuICBdO1xufVxuIiwiLyoqXG4gKiDmiJHmnaXor7TmmI7kuIDkuIvmiJHluIzmnJvov5nkuKrlh73mlbDlubLllaVcbiAqIOmmluWFiO+8jOaIkeW4jOacm+WHveaVsOWPr+S7peiHquW3seWIpOaWreS8oOWFpeeahOWPguaVsOaYryBvYmplY3Qg6L+Y5pivIGZ1bmN0aW9uXG4gKlxuICog5bm25LiU5qC55o2uIG9iamVjdCDov5jmmK8gZnVuY3Rpb24g6L+b6KGM5a+55bqU55qE5qCH6K6wXG4gKiDmiJHov5jkvJrmjqjlh7ogaXNSYXcg55qE5pa55rOV77yM5Zyo5bqU55So5bGC5L2/55So77yM5L2c5Li65Yik5pat6KaB5LiN6KaB5aSE55CG55qE5L6d5o2uXG4gKi9cblxuaW1wb3J0IHsgaXNPYmplY3QsIG1lcmdlIH0gZnJvbSBcImxvZGFzaFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcmF3KHZhbHVlOiBhbnkpIHtcbiAgLy8gaGFwcHkgcGF0aCBvZiBhbnkgb3RoZXIgdHlwZXNcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcblxuICByZXR1cm4gbWVyZ2UodmFsdWUsIHtcbiAgICBfX29reWl3d19mb3JtX3Jhd19fOiB0cnVlLFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmF3KHZhbHVlOiBhbnkpIHtcbiAgcmV0dXJuIHZhbHVlPy5fX29reWl3d19mb3JtX3Jhd19fID09PSB0cnVlO1xufVxuIiwiaW1wb3J0IHsgaXNPYmplY3QsIG1lcmdlIH0gZnJvbSBcImxvZGFzaFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gb25jZSh2YWx1ZTogYW55KSB7XG4gIC8vIGhhcHB5IHBhdGggb2YgYW55IG90aGVyIHR5cGVzXG4gIGlmICghaXNPYmplY3QodmFsdWUpKSByZXR1cm4gdmFsdWU7XG5cbiAgcmV0dXJuIG1lcmdlKHZhbHVlLCB7XG4gICAgX19va3lpd3dfZm9ybV9vbmNlX186IHRydWUsXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPbmNlKHZhbHVlOiBhbnkpIHtcbiAgcmV0dXJuIHZhbHVlPy5fX29reWl3d19mb3JtX29uY2VfXyA9PT0gdHJ1ZTtcbn1cbiIsImNvbnN0IHZlcnNpb24gPSBcIjAuMC4xXCI7XG5cbmV4cG9ydCB7IHZlcnNpb24gfTtcbmV4cG9ydCAqIGZyb20gXCIuL2NvcmUvY29udGV4dFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaGVscGVyc1wiO1xuIl0sIm5hbWVzIjpbInVuZGVmaW5lZCIsIlZFUlNJT04iLCJMQVJHRV9BUlJBWV9TSVpFIiwiQ09SRV9FUlJPUl9URVhUIiwiRlVOQ19FUlJPUl9URVhUIiwiSU5WQUxJRF9URU1QTF9WQVJfRVJST1JfVEVYVCIsIkhBU0hfVU5ERUZJTkVEIiwiTUFYX01FTU9JWkVfU0laRSIsIlBMQUNFSE9MREVSIiwiQ0xPTkVfREVFUF9GTEFHIiwiQ0xPTkVfRkxBVF9GTEFHIiwiQ0xPTkVfU1lNQk9MU19GTEFHIiwiQ09NUEFSRV9QQVJUSUFMX0ZMQUciLCJDT01QQVJFX1VOT1JERVJFRF9GTEFHIiwiV1JBUF9CSU5EX0ZMQUciLCJXUkFQX0JJTkRfS0VZX0ZMQUciLCJXUkFQX0NVUlJZX0JPVU5EX0ZMQUciLCJXUkFQX0NVUlJZX0ZMQUciLCJXUkFQX0NVUlJZX1JJR0hUX0ZMQUciLCJXUkFQX1BBUlRJQUxfRkxBRyIsIldSQVBfUEFSVElBTF9SSUdIVF9GTEFHIiwiV1JBUF9BUllfRkxBRyIsIldSQVBfUkVBUkdfRkxBRyIsIldSQVBfRkxJUF9GTEFHIiwiREVGQVVMVF9UUlVOQ19MRU5HVEgiLCJERUZBVUxUX1RSVU5DX09NSVNTSU9OIiwiSE9UX0NPVU5UIiwiSE9UX1NQQU4iLCJMQVpZX0ZJTFRFUl9GTEFHIiwiTEFaWV9NQVBfRkxBRyIsIkxBWllfV0hJTEVfRkxBRyIsIklORklOSVRZIiwiTUFYX1NBRkVfSU5URUdFUiIsIk1BWF9JTlRFR0VSIiwiTkFOIiwiTUFYX0FSUkFZX0xFTkdUSCIsIk1BWF9BUlJBWV9JTkRFWCIsIkhBTEZfTUFYX0FSUkFZX0xFTkdUSCIsIndyYXBGbGFncyIsImFyZ3NUYWciLCJhcnJheVRhZyIsImFzeW5jVGFnIiwiYm9vbFRhZyIsImRhdGVUYWciLCJkb21FeGNUYWciLCJlcnJvclRhZyIsImZ1bmNUYWciLCJnZW5UYWciLCJtYXBUYWciLCJudW1iZXJUYWciLCJudWxsVGFnIiwib2JqZWN0VGFnIiwicHJvbWlzZVRhZyIsInByb3h5VGFnIiwicmVnZXhwVGFnIiwic2V0VGFnIiwic3RyaW5nVGFnIiwic3ltYm9sVGFnIiwidW5kZWZpbmVkVGFnIiwid2Vha01hcFRhZyIsIndlYWtTZXRUYWciLCJhcnJheUJ1ZmZlclRhZyIsImRhdGFWaWV3VGFnIiwiZmxvYXQzMlRhZyIsImZsb2F0NjRUYWciLCJpbnQ4VGFnIiwiaW50MTZUYWciLCJpbnQzMlRhZyIsInVpbnQ4VGFnIiwidWludDhDbGFtcGVkVGFnIiwidWludDE2VGFnIiwidWludDMyVGFnIiwicmVFbXB0eVN0cmluZ0xlYWRpbmciLCJyZUVtcHR5U3RyaW5nTWlkZGxlIiwicmVFbXB0eVN0cmluZ1RyYWlsaW5nIiwicmVFc2NhcGVkSHRtbCIsInJlVW5lc2NhcGVkSHRtbCIsInJlSGFzRXNjYXBlZEh0bWwiLCJyZUhhc1VuZXNjYXBlZEh0bWwiLCJyZUVzY2FwZSIsInJlRXZhbHVhdGUiLCJyZUludGVycG9sYXRlIiwicmVJc0RlZXBQcm9wIiwicmVJc1BsYWluUHJvcCIsInJlUHJvcE5hbWUiLCJyZVJlZ0V4cENoYXIiLCJyZUhhc1JlZ0V4cENoYXIiLCJyZVRyaW1TdGFydCIsInJlV2hpdGVzcGFjZSIsInJlV3JhcENvbW1lbnQiLCJyZVdyYXBEZXRhaWxzIiwicmVTcGxpdERldGFpbHMiLCJyZUFzY2lpV29yZCIsInJlRm9yYmlkZGVuSWRlbnRpZmllckNoYXJzIiwicmVFc2NhcGVDaGFyIiwicmVFc1RlbXBsYXRlIiwicmVGbGFncyIsInJlSXNCYWRIZXgiLCJyZUlzQmluYXJ5IiwicmVJc0hvc3RDdG9yIiwicmVJc09jdGFsIiwicmVJc1VpbnQiLCJyZUxhdGluIiwicmVOb01hdGNoIiwicmVVbmVzY2FwZWRTdHJpbmciLCJyc0FzdHJhbFJhbmdlIiwicnNDb21ib01hcmtzUmFuZ2UiLCJyZUNvbWJvSGFsZk1hcmtzUmFuZ2UiLCJyc0NvbWJvU3ltYm9sc1JhbmdlIiwicnNDb21ib1JhbmdlIiwicnNEaW5nYmF0UmFuZ2UiLCJyc0xvd2VyUmFuZ2UiLCJyc01hdGhPcFJhbmdlIiwicnNOb25DaGFyUmFuZ2UiLCJyc1B1bmN0dWF0aW9uUmFuZ2UiLCJyc1NwYWNlUmFuZ2UiLCJyc1VwcGVyUmFuZ2UiLCJyc1ZhclJhbmdlIiwicnNCcmVha1JhbmdlIiwicnNBcG9zIiwicnNBc3RyYWwiLCJyc0JyZWFrIiwicnNDb21ibyIsInJzRGlnaXRzIiwicnNEaW5nYmF0IiwicnNMb3dlciIsInJzTWlzYyIsInJzRml0eiIsInJzTW9kaWZpZXIiLCJyc05vbkFzdHJhbCIsInJzUmVnaW9uYWwiLCJyc1N1cnJQYWlyIiwicnNVcHBlciIsInJzWldKIiwicnNNaXNjTG93ZXIiLCJyc01pc2NVcHBlciIsInJzT3B0Q29udHJMb3dlciIsInJzT3B0Q29udHJVcHBlciIsInJlT3B0TW9kIiwicnNPcHRWYXIiLCJyc09wdEpvaW4iLCJyc09yZExvd2VyIiwicnNPcmRVcHBlciIsInJzU2VxIiwicnNFbW9qaSIsInJzU3ltYm9sIiwicmVBcG9zIiwicmVDb21ib01hcmsiLCJyZVVuaWNvZGUiLCJyZVVuaWNvZGVXb3JkIiwicmVIYXNVbmljb2RlIiwicmVIYXNVbmljb2RlV29yZCIsImNvbnRleHRQcm9wcyIsInRlbXBsYXRlQ291bnRlciIsInR5cGVkQXJyYXlUYWdzIiwiY2xvbmVhYmxlVGFncyIsImRlYnVycmVkTGV0dGVycyIsImh0bWxFc2NhcGVzIiwiaHRtbFVuZXNjYXBlcyIsInN0cmluZ0VzY2FwZXMiLCJmcmVlUGFyc2VGbG9hdCIsImZyZWVQYXJzZUludCIsImZyZWVHbG9iYWwiLCJnbG9iYWwiLCJmcmVlU2VsZiIsInJvb3QiLCJmcmVlRXhwb3J0cyIsImV4cG9ydHMiLCJmcmVlTW9kdWxlIiwibW9kdWxlIiwibW9kdWxlRXhwb3J0cyIsImZyZWVQcm9jZXNzIiwibm9kZVV0aWwiLCJ0eXBlcyIsIm5vZGVJc0FycmF5QnVmZmVyIiwibm9kZUlzRGF0ZSIsIm5vZGVJc01hcCIsIm5vZGVJc1JlZ0V4cCIsIm5vZGVJc1NldCIsIm5vZGVJc1R5cGVkQXJyYXkiLCJhcHBseSIsImZ1bmMiLCJ0aGlzQXJnIiwiYXJncyIsImFycmF5QWdncmVnYXRvciIsImFycmF5Iiwic2V0dGVyIiwiaXRlcmF0ZWUiLCJhY2N1bXVsYXRvciIsImluZGV4IiwibGVuZ3RoIiwidmFsdWUiLCJhcnJheUVhY2giLCJhcnJheUVhY2hSaWdodCIsImFycmF5RXZlcnkiLCJwcmVkaWNhdGUiLCJhcnJheUZpbHRlciIsInJlc0luZGV4IiwicmVzdWx0IiwiYXJyYXlJbmNsdWRlcyIsImJhc2VJbmRleE9mIiwiYXJyYXlJbmNsdWRlc1dpdGgiLCJjb21wYXJhdG9yIiwiYXJyYXlNYXAiLCJhcnJheVB1c2giLCJ2YWx1ZXMiLCJvZmZzZXQiLCJhcnJheVJlZHVjZSIsImluaXRBY2N1bSIsImFycmF5UmVkdWNlUmlnaHQiLCJhcnJheVNvbWUiLCJhc2NpaVNpemUiLCJiYXNlUHJvcGVydHkiLCJhc2NpaVRvQXJyYXkiLCJzdHJpbmciLCJhc2NpaVdvcmRzIiwiYmFzZUZpbmRLZXkiLCJjb2xsZWN0aW9uIiwiZWFjaEZ1bmMiLCJrZXkiLCJiYXNlRmluZEluZGV4IiwiZnJvbUluZGV4IiwiZnJvbVJpZ2h0Iiwic3RyaWN0SW5kZXhPZiIsImJhc2VJc05hTiIsImJhc2VJbmRleE9mV2l0aCIsImJhc2VNZWFuIiwiYmFzZVN1bSIsIm9iamVjdCIsImJhc2VQcm9wZXJ0eU9mIiwiYmFzZVJlZHVjZSIsImJhc2VTb3J0QnkiLCJjb21wYXJlciIsImN1cnJlbnQiLCJiYXNlVGltZXMiLCJuIiwiYmFzZVRvUGFpcnMiLCJwcm9wcyIsImJhc2VUcmltIiwidHJpbW1lZEVuZEluZGV4IiwiYmFzZVVuYXJ5IiwiYmFzZVZhbHVlcyIsImNhY2hlSGFzIiwiY2FjaGUiLCJjaGFyc1N0YXJ0SW5kZXgiLCJzdHJTeW1ib2xzIiwiY2hyU3ltYm9scyIsImNoYXJzRW5kSW5kZXgiLCJjb3VudEhvbGRlcnMiLCJwbGFjZWhvbGRlciIsImRlYnVyckxldHRlciIsImVzY2FwZUh0bWxDaGFyIiwiZXNjYXBlU3RyaW5nQ2hhciIsImNociIsImdldFZhbHVlIiwiaGFzVW5pY29kZSIsImhhc1VuaWNvZGVXb3JkIiwiaXRlcmF0b3JUb0FycmF5IiwiaXRlcmF0b3IiLCJkYXRhIiwibWFwVG9BcnJheSIsIm1hcCIsIm92ZXJBcmciLCJ0cmFuc2Zvcm0iLCJhcmciLCJyZXBsYWNlSG9sZGVycyIsInNldFRvQXJyYXkiLCJzZXQiLCJzZXRUb1BhaXJzIiwic3RyaWN0TGFzdEluZGV4T2YiLCJzdHJpbmdTaXplIiwidW5pY29kZVNpemUiLCJzdHJpbmdUb0FycmF5IiwidW5pY29kZVRvQXJyYXkiLCJ1bmVzY2FwZUh0bWxDaGFyIiwidW5pY29kZVdvcmRzIiwicnVuSW5Db250ZXh0IiwiY29udGV4dCIsIl8iLCJBcnJheSIsIkRhdGUiLCJFcnJvciIsIkZ1bmN0aW9uIiwiTWF0aCIsIk9iamVjdCIsIlJlZ0V4cCIsIlN0cmluZyIsIlR5cGVFcnJvciIsImFycmF5UHJvdG8iLCJmdW5jUHJvdG8iLCJvYmplY3RQcm90byIsImNvcmVKc0RhdGEiLCJmdW5jVG9TdHJpbmciLCJoYXNPd25Qcm9wZXJ0eSIsImlkQ291bnRlciIsIm1hc2tTcmNLZXkiLCJ1aWQiLCJuYXRpdmVPYmplY3RUb1N0cmluZyIsIm9iamVjdEN0b3JTdHJpbmciLCJvbGREYXNoIiwicmVJc05hdGl2ZSIsIkJ1ZmZlciIsIlN5bWJvbCIsIlVpbnQ4QXJyYXkiLCJhbGxvY1Vuc2FmZSIsImdldFByb3RvdHlwZSIsIm9iamVjdENyZWF0ZSIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwic3BsaWNlIiwic3ByZWFkYWJsZVN5bWJvbCIsInN5bUl0ZXJhdG9yIiwic3ltVG9TdHJpbmdUYWciLCJkZWZpbmVQcm9wZXJ0eSIsImdldE5hdGl2ZSIsImN0eENsZWFyVGltZW91dCIsImN0eE5vdyIsImN0eFNldFRpbWVvdXQiLCJuYXRpdmVDZWlsIiwibmF0aXZlRmxvb3IiLCJuYXRpdmVHZXRTeW1ib2xzIiwibmF0aXZlSXNCdWZmZXIiLCJuYXRpdmVJc0Zpbml0ZSIsIm5hdGl2ZUpvaW4iLCJuYXRpdmVLZXlzIiwibmF0aXZlTWF4IiwibmF0aXZlTWluIiwibmF0aXZlTm93IiwibmF0aXZlUGFyc2VJbnQiLCJuYXRpdmVSYW5kb20iLCJuYXRpdmVSZXZlcnNlIiwiRGF0YVZpZXciLCJNYXAiLCJQcm9taXNlIiwiU2V0IiwiV2Vha01hcCIsIm5hdGl2ZUNyZWF0ZSIsIm1ldGFNYXAiLCJyZWFsTmFtZXMiLCJkYXRhVmlld0N0b3JTdHJpbmciLCJ0b1NvdXJjZSIsIm1hcEN0b3JTdHJpbmciLCJwcm9taXNlQ3RvclN0cmluZyIsInNldEN0b3JTdHJpbmciLCJ3ZWFrTWFwQ3RvclN0cmluZyIsInN5bWJvbFByb3RvIiwic3ltYm9sVmFsdWVPZiIsInN5bWJvbFRvU3RyaW5nIiwibG9kYXNoIiwiaXNPYmplY3RMaWtlIiwiaXNBcnJheSIsIkxhenlXcmFwcGVyIiwiTG9kYXNoV3JhcHBlciIsIndyYXBwZXJDbG9uZSIsImJhc2VDcmVhdGUiLCJwcm90byIsImlzT2JqZWN0IiwiYmFzZUxvZGFzaCIsImNoYWluQWxsIiwibGF6eUNsb25lIiwiY29weUFycmF5IiwibGF6eVJldmVyc2UiLCJsYXp5VmFsdWUiLCJkaXIiLCJpc0FyciIsImlzUmlnaHQiLCJhcnJMZW5ndGgiLCJ2aWV3IiwiZ2V0VmlldyIsInN0YXJ0IiwiZW5kIiwiaXRlcmF0ZWVzIiwiaXRlckxlbmd0aCIsInRha2VDb3VudCIsImJhc2VXcmFwcGVyVmFsdWUiLCJvdXRlciIsIml0ZXJJbmRleCIsInR5cGUiLCJjb21wdXRlZCIsIkhhc2giLCJlbnRyaWVzIiwiZW50cnkiLCJoYXNoQ2xlYXIiLCJoYXNoRGVsZXRlIiwiaGFzaEdldCIsImhhc2hIYXMiLCJoYXNoU2V0IiwiTGlzdENhY2hlIiwibGlzdENhY2hlQ2xlYXIiLCJsaXN0Q2FjaGVEZWxldGUiLCJhc3NvY0luZGV4T2YiLCJsYXN0SW5kZXgiLCJsaXN0Q2FjaGVHZXQiLCJsaXN0Q2FjaGVIYXMiLCJsaXN0Q2FjaGVTZXQiLCJNYXBDYWNoZSIsIm1hcENhY2hlQ2xlYXIiLCJtYXBDYWNoZURlbGV0ZSIsImdldE1hcERhdGEiLCJtYXBDYWNoZUdldCIsIm1hcENhY2hlSGFzIiwibWFwQ2FjaGVTZXQiLCJzaXplIiwiU2V0Q2FjaGUiLCJzZXRDYWNoZUFkZCIsInNldENhY2hlSGFzIiwiU3RhY2siLCJzdGFja0NsZWFyIiwic3RhY2tEZWxldGUiLCJzdGFja0dldCIsInN0YWNrSGFzIiwic3RhY2tTZXQiLCJwYWlycyIsImFycmF5TGlrZUtleXMiLCJpbmhlcml0ZWQiLCJpc0FyZyIsImlzQXJndW1lbnRzIiwiaXNCdWZmIiwiaXNCdWZmZXIiLCJpc1R5cGUiLCJpc1R5cGVkQXJyYXkiLCJza2lwSW5kZXhlcyIsImlzSW5kZXgiLCJhcnJheVNhbXBsZSIsImJhc2VSYW5kb20iLCJhcnJheVNhbXBsZVNpemUiLCJzaHVmZmxlU2VsZiIsImJhc2VDbGFtcCIsImFycmF5U2h1ZmZsZSIsImFzc2lnbk1lcmdlVmFsdWUiLCJlcSIsImJhc2VBc3NpZ25WYWx1ZSIsImFzc2lnblZhbHVlIiwib2JqVmFsdWUiLCJiYXNlQWdncmVnYXRvciIsImJhc2VFYWNoIiwiYmFzZUFzc2lnbiIsInNvdXJjZSIsImNvcHlPYmplY3QiLCJrZXlzIiwiYmFzZUFzc2lnbkluIiwia2V5c0luIiwiYmFzZUF0IiwicGF0aHMiLCJza2lwIiwiZ2V0IiwibnVtYmVyIiwibG93ZXIiLCJ1cHBlciIsImJhc2VDbG9uZSIsImJpdG1hc2siLCJjdXN0b21pemVyIiwic3RhY2siLCJpc0RlZXAiLCJpc0ZsYXQiLCJpc0Z1bGwiLCJpbml0Q2xvbmVBcnJheSIsInRhZyIsImdldFRhZyIsImlzRnVuYyIsImNsb25lQnVmZmVyIiwiaW5pdENsb25lT2JqZWN0IiwiY29weVN5bWJvbHNJbiIsImNvcHlTeW1ib2xzIiwiaW5pdENsb25lQnlUYWciLCJzdGFja2VkIiwiaXNTZXQiLCJzdWJWYWx1ZSIsImlzTWFwIiwia2V5c0Z1bmMiLCJnZXRBbGxLZXlzSW4iLCJnZXRBbGxLZXlzIiwiYmFzZUNvbmZvcm1zIiwiYmFzZUNvbmZvcm1zVG8iLCJiYXNlRGVsYXkiLCJ3YWl0Iiwic2V0VGltZW91dCIsImJhc2VEaWZmZXJlbmNlIiwiaW5jbHVkZXMiLCJpc0NvbW1vbiIsInZhbHVlc0xlbmd0aCIsInZhbHVlc0luZGV4IiwiY3JlYXRlQmFzZUVhY2giLCJiYXNlRm9yT3duIiwiYmFzZUVhY2hSaWdodCIsImJhc2VGb3JPd25SaWdodCIsImJhc2VFdmVyeSIsImJhc2VFeHRyZW11bSIsImlzU3ltYm9sIiwiYmFzZUZpbGwiLCJ0b0ludGVnZXIiLCJ0b0xlbmd0aCIsImJhc2VGaWx0ZXIiLCJiYXNlRmxhdHRlbiIsImRlcHRoIiwiaXNTdHJpY3QiLCJpc0ZsYXR0ZW5hYmxlIiwiYmFzZUZvciIsImNyZWF0ZUJhc2VGb3IiLCJiYXNlRm9yUmlnaHQiLCJiYXNlRnVuY3Rpb25zIiwiaXNGdW5jdGlvbiIsImJhc2VHZXQiLCJwYXRoIiwiY2FzdFBhdGgiLCJ0b0tleSIsImJhc2VHZXRBbGxLZXlzIiwic3ltYm9sc0Z1bmMiLCJiYXNlR2V0VGFnIiwiZ2V0UmF3VGFnIiwib2JqZWN0VG9TdHJpbmciLCJiYXNlR3QiLCJvdGhlciIsImJhc2VIYXMiLCJiYXNlSGFzSW4iLCJiYXNlSW5SYW5nZSIsImJhc2VJbnRlcnNlY3Rpb24iLCJhcnJheXMiLCJvdGhMZW5ndGgiLCJvdGhJbmRleCIsImNhY2hlcyIsIm1heExlbmd0aCIsInNlZW4iLCJiYXNlSW52ZXJ0ZXIiLCJiYXNlSW52b2tlIiwicGFyZW50IiwibGFzdCIsImJhc2VJc0FyZ3VtZW50cyIsImJhc2VJc0FycmF5QnVmZmVyIiwiYmFzZUlzRGF0ZSIsImJhc2VJc0VxdWFsIiwiYmFzZUlzRXF1YWxEZWVwIiwiZXF1YWxGdW5jIiwib2JqSXNBcnIiLCJvdGhJc0FyciIsIm9ialRhZyIsIm90aFRhZyIsIm9iaklzT2JqIiwib3RoSXNPYmoiLCJpc1NhbWVUYWciLCJlcXVhbEFycmF5cyIsImVxdWFsQnlUYWciLCJvYmpJc1dyYXBwZWQiLCJvdGhJc1dyYXBwZWQiLCJvYmpVbndyYXBwZWQiLCJvdGhVbndyYXBwZWQiLCJlcXVhbE9iamVjdHMiLCJiYXNlSXNNYXAiLCJiYXNlSXNNYXRjaCIsIm1hdGNoRGF0YSIsIm5vQ3VzdG9taXplciIsInNyY1ZhbHVlIiwiYmFzZUlzTmF0aXZlIiwiaXNNYXNrZWQiLCJwYXR0ZXJuIiwiYmFzZUlzUmVnRXhwIiwiYmFzZUlzU2V0IiwiYmFzZUlzVHlwZWRBcnJheSIsImlzTGVuZ3RoIiwiYmFzZUl0ZXJhdGVlIiwiaWRlbnRpdHkiLCJiYXNlTWF0Y2hlc1Byb3BlcnR5IiwiYmFzZU1hdGNoZXMiLCJwcm9wZXJ0eSIsImJhc2VLZXlzIiwiaXNQcm90b3R5cGUiLCJiYXNlS2V5c0luIiwibmF0aXZlS2V5c0luIiwiaXNQcm90byIsImJhc2VMdCIsImJhc2VNYXAiLCJpc0FycmF5TGlrZSIsImdldE1hdGNoRGF0YSIsIm1hdGNoZXNTdHJpY3RDb21wYXJhYmxlIiwiaXNLZXkiLCJpc1N0cmljdENvbXBhcmFibGUiLCJoYXNJbiIsImJhc2VNZXJnZSIsInNyY0luZGV4IiwiYmFzZU1lcmdlRGVlcCIsIm5ld1ZhbHVlIiwic2FmZUdldCIsIm1lcmdlRnVuYyIsImlzVHlwZWQiLCJpc0FycmF5TGlrZU9iamVjdCIsImNsb25lVHlwZWRBcnJheSIsImlzUGxhaW5PYmplY3QiLCJ0b1BsYWluT2JqZWN0IiwiYmFzZU50aCIsImJhc2VPcmRlckJ5Iiwib3JkZXJzIiwiZ2V0SXRlcmF0ZWUiLCJjcml0ZXJpYSIsImNvbXBhcmVNdWx0aXBsZSIsImJhc2VQaWNrIiwiYmFzZVBpY2tCeSIsImJhc2VTZXQiLCJiYXNlUHJvcGVydHlEZWVwIiwiYmFzZVB1bGxBbGwiLCJpbmRleE9mIiwiYmFzZVB1bGxBdCIsImluZGV4ZXMiLCJwcmV2aW91cyIsImJhc2VVbnNldCIsImJhc2VSYW5nZSIsInN0ZXAiLCJiYXNlUmVwZWF0IiwiYmFzZVJlc3QiLCJzZXRUb1N0cmluZyIsIm92ZXJSZXN0IiwiYmFzZVNhbXBsZSIsImJhc2VTYW1wbGVTaXplIiwibmVzdGVkIiwiYmFzZVNldERhdGEiLCJiYXNlU2V0VG9TdHJpbmciLCJjb25zdGFudCIsImJhc2VTaHVmZmxlIiwiYmFzZVNsaWNlIiwiYmFzZVNvbWUiLCJiYXNlU29ydGVkSW5kZXgiLCJyZXRIaWdoZXN0IiwibG93IiwiaGlnaCIsIm1pZCIsImJhc2VTb3J0ZWRJbmRleEJ5IiwidmFsSXNOYU4iLCJ2YWxJc051bGwiLCJ2YWxJc1N5bWJvbCIsInZhbElzVW5kZWZpbmVkIiwib3RoSXNEZWZpbmVkIiwib3RoSXNOdWxsIiwib3RoSXNSZWZsZXhpdmUiLCJvdGhJc1N5bWJvbCIsInNldExvdyIsImJhc2VTb3J0ZWRVbmlxIiwiYmFzZVRvTnVtYmVyIiwiYmFzZVRvU3RyaW5nIiwiYmFzZVVuaXEiLCJjcmVhdGVTZXQiLCJzZWVuSW5kZXgiLCJiYXNlVXBkYXRlIiwidXBkYXRlciIsImJhc2VXaGlsZSIsImlzRHJvcCIsImFjdGlvbnMiLCJhY3Rpb24iLCJiYXNlWG9yIiwiYmFzZVppcE9iamVjdCIsImFzc2lnbkZ1bmMiLCJ2YWxzTGVuZ3RoIiwiY2FzdEFycmF5TGlrZU9iamVjdCIsImNhc3RGdW5jdGlvbiIsInN0cmluZ1RvUGF0aCIsInRvU3RyaW5nIiwiY2FzdFJlc3QiLCJjYXN0U2xpY2UiLCJjbGVhclRpbWVvdXQiLCJpZCIsImJ1ZmZlciIsImNsb25lQXJyYXlCdWZmZXIiLCJhcnJheUJ1ZmZlciIsImNsb25lRGF0YVZpZXciLCJkYXRhVmlldyIsImNsb25lUmVnRXhwIiwicmVnZXhwIiwiY2xvbmVTeW1ib2wiLCJzeW1ib2wiLCJ0eXBlZEFycmF5IiwiY29tcGFyZUFzY2VuZGluZyIsInZhbElzRGVmaW5lZCIsInZhbElzUmVmbGV4aXZlIiwib2JqQ3JpdGVyaWEiLCJvdGhDcml0ZXJpYSIsIm9yZGVyc0xlbmd0aCIsIm9yZGVyIiwiY29tcG9zZUFyZ3MiLCJwYXJ0aWFscyIsImhvbGRlcnMiLCJpc0N1cnJpZWQiLCJhcmdzSW5kZXgiLCJhcmdzTGVuZ3RoIiwiaG9sZGVyc0xlbmd0aCIsImxlZnRJbmRleCIsImxlZnRMZW5ndGgiLCJyYW5nZUxlbmd0aCIsImlzVW5jdXJyaWVkIiwiY29tcG9zZUFyZ3NSaWdodCIsImhvbGRlcnNJbmRleCIsInJpZ2h0SW5kZXgiLCJyaWdodExlbmd0aCIsImlzTmV3IiwiZ2V0U3ltYm9scyIsImdldFN5bWJvbHNJbiIsImNyZWF0ZUFnZ3JlZ2F0b3IiLCJpbml0aWFsaXplciIsImNyZWF0ZUFzc2lnbmVyIiwiYXNzaWduZXIiLCJzb3VyY2VzIiwiZ3VhcmQiLCJpc0l0ZXJhdGVlQ2FsbCIsIml0ZXJhYmxlIiwiY3JlYXRlQmluZCIsImlzQmluZCIsIkN0b3IiLCJjcmVhdGVDdG9yIiwid3JhcHBlciIsImZuIiwiY3JlYXRlQ2FzZUZpcnN0IiwibWV0aG9kTmFtZSIsInRyYWlsaW5nIiwiY3JlYXRlQ29tcG91bmRlciIsImNhbGxiYWNrIiwid29yZHMiLCJkZWJ1cnIiLCJ0aGlzQmluZGluZyIsImNyZWF0ZUN1cnJ5IiwiYXJpdHkiLCJnZXRIb2xkZXIiLCJjcmVhdGVSZWN1cnJ5IiwiY3JlYXRlSHlicmlkIiwiY3JlYXRlRmluZCIsImZpbmRJbmRleEZ1bmMiLCJjcmVhdGVGbG93IiwiZmxhdFJlc3QiLCJmdW5jcyIsInByZXJlcSIsImdldEZ1bmNOYW1lIiwiZnVuY05hbWUiLCJnZXREYXRhIiwiaXNMYXppYWJsZSIsInBhcnRpYWxzUmlnaHQiLCJob2xkZXJzUmlnaHQiLCJhcmdQb3MiLCJhcnkiLCJpc0FyeSIsImlzQmluZEtleSIsImlzRmxpcCIsImhvbGRlcnNDb3VudCIsIm5ld0hvbGRlcnMiLCJyZW9yZGVyIiwiY3JlYXRlSW52ZXJ0ZXIiLCJ0b0l0ZXJhdGVlIiwiY3JlYXRlTWF0aE9wZXJhdGlvbiIsIm9wZXJhdG9yIiwiZGVmYXVsdFZhbHVlIiwiY3JlYXRlT3ZlciIsImFycmF5RnVuYyIsImNyZWF0ZVBhZGRpbmciLCJjaGFycyIsImNoYXJzTGVuZ3RoIiwiY3JlYXRlUGFydGlhbCIsImNyZWF0ZVJhbmdlIiwidG9GaW5pdGUiLCJjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uIiwidG9OdW1iZXIiLCJ3cmFwRnVuYyIsImlzQ3VycnkiLCJuZXdIb2xkZXJzUmlnaHQiLCJuZXdQYXJ0aWFscyIsIm5ld1BhcnRpYWxzUmlnaHQiLCJuZXdEYXRhIiwic2V0RGF0YSIsInNldFdyYXBUb1N0cmluZyIsImNyZWF0ZVJvdW5kIiwicHJlY2lzaW9uIiwicGFpciIsIm5vb3AiLCJjcmVhdGVUb1BhaXJzIiwiY3JlYXRlV3JhcCIsIm1lcmdlRGF0YSIsImN1c3RvbURlZmF1bHRzQXNzaWduSW4iLCJjdXN0b21EZWZhdWx0c01lcmdlIiwiY3VzdG9tT21pdENsb25lIiwiaXNQYXJ0aWFsIiwiYXJyU3RhY2tlZCIsIm90aFN0YWNrZWQiLCJhcnJWYWx1ZSIsIm90aFZhbHVlIiwiY29tcGFyZWQiLCJjb252ZXJ0Iiwib2JqUHJvcHMiLCJvYmpMZW5ndGgiLCJvdGhQcm9wcyIsIm9ialN0YWNrZWQiLCJza2lwQ3RvciIsIm9iakN0b3IiLCJvdGhDdG9yIiwiZmxhdHRlbiIsIm90aGVyRnVuYyIsImlzS2V5YWJsZSIsImlzT3duIiwidW5tYXNrZWQiLCJzdHViQXJyYXkiLCJjdG9yU3RyaW5nIiwidHJhbnNmb3JtcyIsImdldFdyYXBEZXRhaWxzIiwibWF0Y2giLCJoYXNQYXRoIiwiaGFzRnVuYyIsImluc2VydFdyYXBEZXRhaWxzIiwiZGV0YWlscyIsImlzTWFza2FibGUiLCJzdHViRmFsc2UiLCJtZW1vaXplQ2FwcGVkIiwibWVtb2l6ZSIsInNyY0JpdG1hc2siLCJuZXdCaXRtYXNrIiwiaXNDb21ibyIsIm90aGVyQXJncyIsIm9sZEFycmF5Iiwic2hvcnRPdXQiLCJyZWZlcmVuY2UiLCJ1cGRhdGVXcmFwRGV0YWlscyIsImNvdW50IiwibGFzdENhbGxlZCIsInN0YW1wIiwicmVtYWluaW5nIiwicmFuZCIsInF1b3RlIiwic3ViU3RyaW5nIiwiY2h1bmsiLCJjb21wYWN0IiwiY29uY2F0IiwiZGlmZmVyZW5jZSIsImRpZmZlcmVuY2VCeSIsImRpZmZlcmVuY2VXaXRoIiwiZHJvcCIsImRyb3BSaWdodCIsImRyb3BSaWdodFdoaWxlIiwiZHJvcFdoaWxlIiwiZmlsbCIsImZpbmRJbmRleCIsImZpbmRMYXN0SW5kZXgiLCJmbGF0dGVuRGVlcCIsImZsYXR0ZW5EZXB0aCIsImZyb21QYWlycyIsImhlYWQiLCJpbml0aWFsIiwiaW50ZXJzZWN0aW9uIiwibWFwcGVkIiwiaW50ZXJzZWN0aW9uQnkiLCJpbnRlcnNlY3Rpb25XaXRoIiwiam9pbiIsInNlcGFyYXRvciIsImxhc3RJbmRleE9mIiwibnRoIiwicHVsbCIsInB1bGxBbGwiLCJwdWxsQWxsQnkiLCJwdWxsQWxsV2l0aCIsInB1bGxBdCIsInJlbW92ZSIsInJldmVyc2UiLCJzbGljZSIsInNvcnRlZEluZGV4Iiwic29ydGVkSW5kZXhCeSIsInNvcnRlZEluZGV4T2YiLCJzb3J0ZWRMYXN0SW5kZXgiLCJzb3J0ZWRMYXN0SW5kZXhCeSIsInNvcnRlZExhc3RJbmRleE9mIiwic29ydGVkVW5pcSIsInNvcnRlZFVuaXFCeSIsInRhaWwiLCJ0YWtlIiwidGFrZVJpZ2h0IiwidGFrZVJpZ2h0V2hpbGUiLCJ0YWtlV2hpbGUiLCJ1bmlvbiIsInVuaW9uQnkiLCJ1bmlvbldpdGgiLCJ1bmlxIiwidW5pcUJ5IiwidW5pcVdpdGgiLCJ1bnppcCIsImdyb3VwIiwidW56aXBXaXRoIiwid2l0aG91dCIsInhvciIsInhvckJ5IiwieG9yV2l0aCIsInppcCIsInppcE9iamVjdCIsInppcE9iamVjdERlZXAiLCJ6aXBXaXRoIiwiY2hhaW4iLCJ0YXAiLCJpbnRlcmNlcHRvciIsInRocnUiLCJ3cmFwcGVyQXQiLCJ3cmFwcGVyQ2hhaW4iLCJ3cmFwcGVyQ29tbWl0Iiwid3JhcHBlck5leHQiLCJ0b0FycmF5IiwiZG9uZSIsIndyYXBwZXJUb0l0ZXJhdG9yIiwid3JhcHBlclBsYW50IiwiY2xvbmUiLCJ3cmFwcGVyUmV2ZXJzZSIsIndyYXBwZWQiLCJ3cmFwcGVyVmFsdWUiLCJjb3VudEJ5IiwiZXZlcnkiLCJmaWx0ZXIiLCJmaW5kIiwiZmluZExhc3QiLCJmbGF0TWFwIiwiZmxhdE1hcERlZXAiLCJmbGF0TWFwRGVwdGgiLCJmb3JFYWNoIiwiZm9yRWFjaFJpZ2h0IiwiZ3JvdXBCeSIsImlzU3RyaW5nIiwiaW52b2tlTWFwIiwia2V5QnkiLCJvcmRlckJ5IiwicGFydGl0aW9uIiwicmVkdWNlIiwicmVkdWNlUmlnaHQiLCJyZWplY3QiLCJuZWdhdGUiLCJzYW1wbGUiLCJzYW1wbGVTaXplIiwic2h1ZmZsZSIsInNvbWUiLCJzb3J0QnkiLCJub3ciLCJhZnRlciIsImJlZm9yZSIsImJpbmQiLCJiaW5kS2V5IiwiY3VycnkiLCJjdXJyeVJpZ2h0IiwiZGVib3VuY2UiLCJvcHRpb25zIiwibGFzdEFyZ3MiLCJsYXN0VGhpcyIsIm1heFdhaXQiLCJ0aW1lcklkIiwibGFzdENhbGxUaW1lIiwibGFzdEludm9rZVRpbWUiLCJsZWFkaW5nIiwibWF4aW5nIiwiaW52b2tlRnVuYyIsInRpbWUiLCJsZWFkaW5nRWRnZSIsInRpbWVyRXhwaXJlZCIsInJlbWFpbmluZ1dhaXQiLCJ0aW1lU2luY2VMYXN0Q2FsbCIsInRpbWVTaW5jZUxhc3RJbnZva2UiLCJ0aW1lV2FpdGluZyIsInNob3VsZEludm9rZSIsInRyYWlsaW5nRWRnZSIsImNhbmNlbCIsImZsdXNoIiwiZGVib3VuY2VkIiwiaXNJbnZva2luZyIsImRlZmVyIiwiZGVsYXkiLCJmbGlwIiwicmVzb2x2ZXIiLCJtZW1vaXplZCIsIm9uY2UiLCJvdmVyQXJncyIsImZ1bmNzTGVuZ3RoIiwicGFydGlhbCIsInBhcnRpYWxSaWdodCIsInJlYXJnIiwicmVzdCIsInNwcmVhZCIsInRocm90dGxlIiwidW5hcnkiLCJ3cmFwIiwiY2FzdEFycmF5IiwiY2xvbmVXaXRoIiwiY2xvbmVEZWVwIiwiY2xvbmVEZWVwV2l0aCIsImNvbmZvcm1zVG8iLCJndCIsImd0ZSIsImlzQXJyYXlCdWZmZXIiLCJpc0Jvb2xlYW4iLCJpc0RhdGUiLCJpc0VsZW1lbnQiLCJpc0VtcHR5IiwiaXNFcXVhbCIsImlzRXF1YWxXaXRoIiwiaXNFcnJvciIsImlzRmluaXRlIiwiaXNJbnRlZ2VyIiwiaXNNYXRjaCIsImlzTWF0Y2hXaXRoIiwiaXNOYU4iLCJpc051bWJlciIsImlzTmF0aXZlIiwiaXNOdWxsIiwiaXNOaWwiLCJpc1JlZ0V4cCIsImlzU2FmZUludGVnZXIiLCJpc1VuZGVmaW5lZCIsImlzV2Vha01hcCIsImlzV2Vha1NldCIsImx0IiwibHRlIiwic2lnbiIsInJlbWFpbmRlciIsImlzQmluYXJ5IiwidG9TYWZlSW50ZWdlciIsImFzc2lnbiIsImFzc2lnbkluIiwiYXNzaWduSW5XaXRoIiwiYXNzaWduV2l0aCIsImF0IiwiY3JlYXRlIiwicHJvdG90eXBlIiwicHJvcGVydGllcyIsImRlZmF1bHRzIiwicHJvcHNJbmRleCIsInByb3BzTGVuZ3RoIiwiZGVmYXVsdHNEZWVwIiwibWVyZ2VXaXRoIiwiZmluZEtleSIsImZpbmRMYXN0S2V5IiwiZm9ySW4iLCJmb3JJblJpZ2h0IiwiZm9yT3duIiwiZm9yT3duUmlnaHQiLCJmdW5jdGlvbnMiLCJmdW5jdGlvbnNJbiIsImhhcyIsImludmVydCIsImludmVydEJ5IiwiaW52b2tlIiwibWFwS2V5cyIsIm1hcFZhbHVlcyIsIm1lcmdlIiwib21pdCIsIm9taXRCeSIsInBpY2tCeSIsInBpY2siLCJwcm9wIiwic2V0V2l0aCIsInRvUGFpcnMiLCJ0b1BhaXJzSW4iLCJpc0Fyckxpa2UiLCJ1bnNldCIsInVwZGF0ZSIsInVwZGF0ZVdpdGgiLCJ2YWx1ZXNJbiIsImNsYW1wIiwiaW5SYW5nZSIsInJhbmRvbSIsImZsb2F0aW5nIiwidGVtcCIsImNhbWVsQ2FzZSIsIndvcmQiLCJjYXBpdGFsaXplIiwidXBwZXJGaXJzdCIsImVuZHNXaXRoIiwidGFyZ2V0IiwicG9zaXRpb24iLCJlc2NhcGUiLCJlc2NhcGVSZWdFeHAiLCJrZWJhYkNhc2UiLCJsb3dlckNhc2UiLCJsb3dlckZpcnN0IiwicGFkIiwic3RyTGVuZ3RoIiwicGFkRW5kIiwicGFkU3RhcnQiLCJwYXJzZUludCIsInJhZGl4IiwicmVwZWF0IiwicmVwbGFjZSIsInNuYWtlQ2FzZSIsInNwbGl0IiwibGltaXQiLCJzdGFydENhc2UiLCJzdGFydHNXaXRoIiwidGVtcGxhdGUiLCJzZXR0aW5ncyIsImltcG9ydHMiLCJpbXBvcnRzS2V5cyIsImltcG9ydHNWYWx1ZXMiLCJpc0VzY2FwaW5nIiwiaXNFdmFsdWF0aW5nIiwiaW50ZXJwb2xhdGUiLCJyZURlbGltaXRlcnMiLCJzb3VyY2VVUkwiLCJlc2NhcGVWYWx1ZSIsImludGVycG9sYXRlVmFsdWUiLCJlc1RlbXBsYXRlVmFsdWUiLCJldmFsdWF0ZVZhbHVlIiwidmFyaWFibGUiLCJhdHRlbXB0IiwidG9Mb3dlciIsInRvVXBwZXIiLCJ0cmltIiwidHJpbUVuZCIsInRyaW1TdGFydCIsInRydW5jYXRlIiwib21pc3Npb24iLCJzdWJzdHJpbmciLCJuZXdFbmQiLCJ1bmVzY2FwZSIsInVwcGVyQ2FzZSIsImUiLCJiaW5kQWxsIiwibWV0aG9kTmFtZXMiLCJjb25kIiwiY29uZm9ybXMiLCJkZWZhdWx0VG8iLCJmbG93IiwiZmxvd1JpZ2h0IiwibWF0Y2hlcyIsIm1hdGNoZXNQcm9wZXJ0eSIsIm1ldGhvZCIsIm1ldGhvZE9mIiwibWl4aW4iLCJub0NvbmZsaWN0IiwibnRoQXJnIiwib3ZlciIsIm92ZXJFdmVyeSIsIm92ZXJTb21lIiwicHJvcGVydHlPZiIsInJhbmdlIiwicmFuZ2VSaWdodCIsInN0dWJPYmplY3QiLCJzdHViU3RyaW5nIiwic3R1YlRydWUiLCJ0aW1lcyIsInRvUGF0aCIsInVuaXF1ZUlkIiwicHJlZml4IiwiYWRkIiwiYXVnZW5kIiwiYWRkZW5kIiwiY2VpbCIsImRpdmlkZSIsImRpdmlkZW5kIiwiZGl2aXNvciIsImZsb29yIiwibWF4IiwibWF4QnkiLCJtZWFuIiwibWVhbkJ5IiwibWluIiwibWluQnkiLCJtdWx0aXBseSIsIm11bHRpcGxpZXIiLCJtdWx0aXBsaWNhbmQiLCJyb3VuZCIsInN1YnRyYWN0IiwibWludWVuZCIsInN1YnRyYWhlbmQiLCJzdW0iLCJzdW1CeSIsImlzRmlsdGVyIiwidGFrZU5hbWUiLCJkcm9wTmFtZSIsImNoZWNrSXRlcmF0ZWUiLCJpc1Rha2VyIiwibG9kYXNoRnVuYyIsInJldFVud3JhcHBlZCIsImlzTGF6eSIsInVzZUxhenkiLCJpc0h5YnJpZCIsImlzVW53cmFwcGVkIiwib25seUxhenkiLCJjaGFpbk5hbWUiLCJ0aGlzIiwiRm9ybUNvbnRleHQiLCJsb2FkZXIiLCJ0ZW1wbGF0ZUlkIiwiX19wdWJsaWNGaWVsZCIsImRlZmluZUZvcm1TZXR1cCIsImRlZmluZUZvcm1TY2hlbWEiLCJzY2hlbWFzIiwiaW5pdEZvcm0iLCJhcHAiLCJvcmlnaW5hbE1vdW50Iiwicm9vdENvbnRhaW5lciIsIkFyY29WdWVBZGFwdGVyIiwicnVudGltZSIsInJlc29sdmUiLCJlcnJvcnMiLCJOYWl2ZVVJQWRhcHRlciIsIk51dFVJQWRhcHRlciIsInZhbGlkIiwiQWRhcHRlciIsInByZXNldEFkYXB0ZXIiLCJhZGFwdGVyIiwiaXNOdW1lcmljTGlrZSIsIndyYXBwZXJOdW1lcmljTGlrZSIsInRyYXZlcnNlIiwidHJlZSIsInZpc2l0b3IiLCJwYXJlbnRLZXkiLCJub2RlIiwiaXNQcm9taXNlIiwiaXNWYWxpZENvbXBvbmVudCIsInByb3BlcnR5S2V5IiwiZ2V0RGlyZWN0UGFyZW50IiwiZ2V0QWxsQW5jZXN0b3JQYXRocyIsImFuY2VzdG9ycyIsImN1cnJlbnRQYXRoIiwiY2hlY2tSZWxhdGlvbnMiLCJjaGlsZFBhdGgiLCJleGlzdGluZ0FuY2VzdG9ycyIsImFuY2VzdG9yIiwiZGlyZWN0UGFyZW50IiwiUEFUSF9TRVBBUkFUT1IiLCJUQVJHRVQiLCJVTlNVQlNDUklCRSIsImlzQnVpbHRpbldpdGhNdXRhYmxlTWV0aG9kcyIsImlzQnVpbHRpbldpdGhvdXRNdXRhYmxlTWV0aG9kcyIsInN1YlBhdGgiLCJpIiwiaXNJdGVyYXRvciIsIndyYXBJdGVyYXRvciIsInRoaXNBcmd1bWVudCIsImFwcGx5UGF0aCIsInByZXBhcmVWYWx1ZSIsIm9yaWdpbmFsTmV4dCIsImtleUl0ZXJhdG9yIiwiaWdub3JlUHJvcGVydHkiLCJDYWNoZSIsImVxdWFscyIsInBhdGhBIiwicGF0aEIiLCJwYXJ0IiwiZGVzY3JpcHRvckNhY2hlIiwiZGVzY3JpcHRvciIsImhhbmRsZXIiLCJwcm94eVRhcmdldCIsInJlZmxlY3RUYXJnZXQiLCJhbGxQYXRocyIsImV4aXN0aW5nUGF0aCIsInByb3h5IiwicmVjZWl2ZXIiLCJoYXNTZXR0ZXJJbkNoYWluIiwiYSIsImIiLCJpc0RpZmZDZXJ0YWluIiwiaXNEaWZmQXJyYXlzIiwiaXRlbSIsIklNTVVUQUJMRV9PQkpFQ1RfTUVUSE9EUyIsIklNTVVUQUJMRV9BUlJBWV9NRVRIT0RTIiwiTVVUQUJMRV9BUlJBWV9NRVRIT0RTIiwiSEFORExFRF9BUlJBWV9NRVRIT0RTIiwiaXNEaWZmU2V0cyIsImVsZW1lbnQiLCJDT0xMRUNUSU9OX0lURVJBVE9SX01FVEhPRFMiLCJJTU1VVEFCTEVfU0VUX01FVEhPRFMiLCJNVVRBQkxFX1NFVF9NRVRIT0RTIiwiSEFORExFRF9TRVRfTUVUSE9EUyIsImlzRGlmZk1hcHMiLCJhVmFsdWUiLCJiVmFsdWUiLCJJTU1VVEFCTEVfTUFQX01FVEhPRFMiLCJNVVRBQkxFX01BUF9NRVRIT0RTIiwiSEFORExFRF9NQVBfTUVUSE9EUyIsIkNsb25lT2JqZWN0IiwiYXJndW1lbnRzTGlzdCIsImhhc09uVmFsaWRhdGUiLCJuYW1lIiwiaXNIYW5kbGVkTWV0aG9kIiwidGhpc1Byb3h5VGFyZ2V0IiwiZnVsbFBhdGgiLCJjaGFuZ2VQYXRoIiwiY2hhbmdlIiwiX2VxdWFscyIsIkNsb25lQXJyYXkiLCJDbG9uZURhdGUiLCJDbG9uZVNldCIsIkNsb25lTWFwIiwiQ2xvbmVXZWFrU2V0IiwiQ2xvbmVXZWFrTWFwIiwid2Vha0hhcyIsIlNtYXJ0Q2xvbmUiLCJDbG9uZUNsYXNzIiwiSVRFUkFUT1JfTUVUSE9EX05BTUVTIiwiQVJSQVlfU0VBUkNIX01FVEhPRFMiLCJkZWZhdWx0T3B0aW9ucyIsInNob3VsZFByb3ZpZGVBcHBseURhdGEiLCJvbkNoYW5nZSIsImlzU2hhbGxvdyIsImlnbm9yZURldGFjaGVkIiwic21hcnRDbG9uZSIsInZhbGlkYXRlIiwiYXBwbHlEYXRhIiwiaGFuZGxlQ2hhbmdlT25UYXJnZXQiLCJwYXRoc1RvTm90aWZ5IiwiaGFuZGxlQ2hhbmdlIiwiZ2V0UHJveHlUYXJnZXQiLCJiYXNlUGF0aCIsImlzU2FtZU9iamVjdFRyZWUiLCJjaGlsZFBhcnRzIiwiZXhpc3RpbmdQYXJ0cyIsImhhbmRsZU1ldGhvZEV4ZWN1dGlvbiIsInBlcmZvcm1Qcm94eUF3YXJlQXJyYXlTZWFyY2giLCJhcmd1bWVudCIsImlzQ2hhbmdlZCIsImlzVmFsaWQiLCJwcmV2aW91c1RpbWUiLCJjdXJyZW50VGltZSIsInByZXZpb3VzRGF0ZSIsInByb3h5QXJyYXkiLCJzZWFyY2hFbGVtZW50IiwiaXNMYXN0SW5kZXhPZiIsInN0YXJ0SW5kZXgiLCJzZWFyY2hUYXJnZXQiLCJzZWFyY2hCYWNrd2FyZCIsImVuZEluZGV4IiwiTW9kZWwiLCJyZWYiLCJtZXRhZGF0YSIsIm1heUJlUmVsYXRpb24iLCJza2lwQ29uc3VtZSIsImxhdGVzdFJlbGF0aW9uIiwicmVsYXRpb24iLCJjaGVja1Jlc3VsdCIsInJlbGF0aW9ucyIsInVzZUJhc2VTdHlsZSIsIl9hIiwiX2IiLCJ1c2VMaXN0QmFzZVN0eWxlIiwidXNlRm9ybUl0ZW1Qcm9wcyIsInNjaGVtYSIsImJhc2VGaWVsZFBhdGgiLCJ1c2VGb3JtUHJvcHMiLCJ1c2VMYWJlbCIsImxhYmVsIiwic2NoZW1hVHlwZVRvTGF5b3V0IiwidXNlTGF5b3V0IiwiZmFsbGJhY2siLCJsYXlvdXRzIiwiYWNjIiwidXNlTGF5b3V0U3R5bGUiLCJsYXlvdXRHYXAiLCJnYXAiLCJsYXlvdXRDb3VudCIsInRyYW5zZm9ybVZhbHVlVG9LZXkiLCJ0cmFuc2Zvcm1lZCIsIm5hbWVQbGFjZWhvbGRlck1hcCIsInVzZVBsYWNlaG9sZGVyIiwiY29tcG9uZW50TmFtZSIsInVzZVJ1bGVzIiwicnVsZXMiLCJyZXF1aXJlZCIsInJlcXVpcmVkUnVsZUluZGV4IiwicnVsZSIsInJlcXVpcmVkUnVsZSIsIlJlbmRlciIsImNvbnN0cnVjdG9yIiwiZm9ybVJlZiIsIm1ldGEiLCJnZXRSZW5kZXJNZXRhIiwiZ2V0VGVtcGxhdGUiLCJfb3B0aW9ucyIsIkZvcm0iLCJwcm92aWRlcnMiLCJGb3JtSXRlbSIsImFkYXB0ZXJzIiwicmVuZGVySXRlbVNjaGVtYSIsIm1vZGVsU291cmNlIiwiX21vZGVsIiwibW9kZWwiLCJMYXlvdXQiLCJmaWVsZFRhcmdldCIsImZpZWxkIiwiY29tcG9uZW50UmVmIiwiX3NjaGVtYSIsInJlZnMiLCJDb21wb25lbnQiLCJ0b1JhdyIsImNvbXBvbmVudCIsImZvcm1JdGVtUHJvcHMiLCJzaG93IiwiX2NyZWF0ZVZOb2RlIiwiZGVmYXVsdCIsIl9tZXJnZVByb3BzIiwiZm9ybUl0ZW1TbG90cyIsImNvbXBvbmVudFByb3BzIiwicmVuZGVyTGlzdFNjaGVtYSIsImJhc2VNb2RlbFBhdGgiLCJsaXN0TW9kZWwiLCJMaXN0IiwibW9kZWxJbmRleCIsIkxpc3RJdGVtIiwibGlzdExheW91dEdhcCIsImNoaWxkcmVuIiwiY2hpbGRTY2hlbWEiLCJyZW5kZXJQYXJzZWRTY2hlbWEiLCJkZWxldGUiLCJyZW5kZXIiLCJEZWxldGUiLCJtaW5MZW4iLCJhbGxDb25zdW1lZCIsIm9uQ2xpY2siLCJBZGQiLCJiYXNlTW9kZWwiLCJ0b0JlQWRkZWQiLCJpbW11dGFibGVNb2RlbCIsInB1c2giLCJyZW5kZXJHcm91cFNjaGVtYSIsInNldHVwIiwiZm9ybVByb3BzIiwiX2FkYXB0ZXIiLCJhZGFwdGVlIiwiZm9ybU1vZGVsTmFtZSIsImZvcm1TbG90cyIsInBhcnNlZFNjaGVtYXMiLCJ1c2VQYXRoVHJhY2tlciIsIm9uQWNjZXNzIiwiZ2V0RGVlcFZhbHVlU2FmZWx5IiwiY3JlYXRlUHJveHkiLCJjdXJyZW50VmFsdWUiLCJfdGFyZ2V0IiwibmV4dFBhdGgiLCJuZXh0VmFsdWUiLCJfdGhpc0FyZyIsInBhcmVudFBhdGgiLCJkZXNjIiwidXNlU1NSQ29tcG9uZW50IiwiZGVlcFRyYXZlcnNlIiwidHJhdmVyc2VSZWN1cnNpdmUiLCJpc0xlYWYiLCJpc1JlcXVlc3REaXNwYXRjaCIsImRpc3BhdGNoIiwiaXNDb25kaXRpb25EaXNwYXRjaCIsImlzRXZlbnRIYW5kbGVyRGlzcGF0Y2giLCJpc1NldE1vZGVsRGlzcGF0Y2giLCJpc1NldFNoYXJlZERpc3BhdGNoIiwiaXNHZXRNb2RlbERpc3BhdGNoIiwiaXNHZXRTaGFyZWREaXNwYXRjaCIsImlzUmVmc0Rpc3BhdGNoIiwiaXNEeW5hbWljVmFsdWUiLCJtb2RlbERlZmluaXRpb24iLCJzaGFyZWREZWZpbml0aW9uIiwicmVzRGVmaW5pdGlvbiIsIl9jIiwiZXJyRGVmaW5pdGlvbiIsIl9kIiwicHJvY2Vzc0R5bmFtaWNWYWx1ZSIsInNoYXJlZCIsInJ1bnRpbWVJbmZvIiwiYXJnc0RlZmluaXRpb24iLCJfZSIsInByb2Nlc3NBcnJheUR5bmFtaWMiLCJwcm9jZXNzUGxhaW5PYmplY3REeW5hbWljIiwiZXNjYXBlZCIsImV4YWN0TWF0Y2giLCJyZXF1ZXN0UmVzU3ltYm9sIiwicmVxdWVzdEVyclN5bWJvbCIsImV2ZW50QXJnc1N5bWJvbCIsInByb2Nlc3NlZCIsInJlcyIsInByb2Nlc3NDb21wYXJlIiwidXRpbHMiLCJza2lwUHJvY2VzcyIsImxlZnRWYWx1ZSIsInJpZ2h0VmFsdWUiLCJyaWdodFZhbHVlcyIsInByb2Nlc3NEaXNwYXRjaCIsInByb21pc2VzIiwidiIsImxlZnRTdHIiLCJyaWdodFN0ciIsInByb2Nlc3NSZXF1ZXN0cyIsInByb2Nlc3NlZFBhcmFtcyIsInByb2Nlc3NQYXJhbXMiLCJwcm9jZXNzZWREYXRhIiwicHJvY2Vzc0RhdGEiLCJwcm9jZXNzVHJhbnNmb3JtIiwicmVxdWVzdFJlcyIsImVyciIsIm5leHRUaWNrIiwiY29uZGl0aW9uIiwiY29uZGl0aW9uUmVzdWx0cyIsImNvbmRpdGlvblJlc3VsdCIsInJhdyIsInBpcGUiLCJzZXRSZXN1bHQiLCJ0YXJnZXRSZWYiLCJ1c2VEaXNwYXRjaEhhbmRsZXIiLCJTY2hlbWEiLCJwcm9jZXNzZWRWYWx1ZSIsImp1bXBDb25zdW1lIiwicHJvcGVydHlWYWx1ZSIsImlzUmF3IiwiZWZmZWN0S2V5IiwiaXNPbmNlIiwic2NoZW1hRWZmZWN0IiwiZXhlY3V0aW9uUmVzIiwiVXBkYXRlIiwiZWZmZWN0IiwiZWZmZWN0TWFwIiwiZWZmZWN0SXRlbSIsIlJ1bnRpbWUiLCJ1bndhdGNoIiwid2F0Y2giLCJ2YWwiLCJ1c2VGb3JtIiwidmVyc2lvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQVFDLEtBQUMsV0FBVztBQUdYLFVBQUlBLEdBR0FDLElBQVUsV0FHVkMsSUFBbUIsS0FHbkJDLElBQWtCLG1FQUNsQkMsSUFBa0IsdUJBQ2xCQyxJQUErQixzREFHL0JDLElBQWlCLDZCQUdqQkMsSUFBbUIsS0FHbkJDLElBQWMsMEJBR2RDLElBQWtCLEdBQ2xCQyxLQUFrQixHQUNsQkMsS0FBcUIsR0FHckJDLEtBQXVCLEdBQ3ZCQyxLQUF5QixHQUd6QkMsSUFBaUIsR0FDakJDLEtBQXFCLEdBQ3JCQyxLQUF3QixHQUN4QkMsSUFBa0IsR0FDbEJDLElBQXdCLElBQ3hCQyxJQUFvQixJQUNwQkMsSUFBMEIsSUFDMUJDLElBQWdCLEtBQ2hCQyxJQUFrQixLQUNsQkMsS0FBaUIsS0FHakJDLEtBQXVCLElBQ3ZCQyxLQUF5QixPQUd6QkMsS0FBWSxLQUNaQyxLQUFXLElBR1hDLEtBQW1CLEdBQ25CQyxLQUFnQixHQUNoQkMsS0FBa0IsR0FHbEJDLEtBQVcsT0FDWEMsS0FBbUIsa0JBQ25CQyxLQUFjLHVCQUNkQyxLQUFNLEtBR05DLEtBQW1CLFlBQ25CQyxL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QUFRO0FBQUEsUUFDaEQsR0FBUTtBQUFBLFFBQU0sR0FBUTtBQUFBLFFBQUssR0FBUTtBQUFBLFFBQUssR0FBUTtBQUFBLFFBQ2hELEdBQVE7QUFBQSxRQUFNLEdBQVE7QUFBQSxRQUN0QixHQUFRO0FBQUEsUUFBTSxHQUFRO0FBQUEsUUFBSyxHQUFRO0FBQUEsUUFBSyxHQUFRO0FBQUEsUUFBSyxHQUFRO0FBQUEsUUFBSyxHQUFRO0FBQUEsUUFDMUUsR0FBUTtBQUFBLFFBQU0sR0FBUTtBQUFBLFFBQUssR0FBUTtBQUFBLFFBQUssR0FBUTtBQUFBLFFBQUssR0FBUTtBQUFBLFFBQUssR0FBUTtBQUFBLFFBQzFFLEdBQVE7QUFBQSxRQUFNLEdBQVE7QUFBQSxRQUFLLEdBQVE7QUFBQSxRQUFLLEdBQVE7QUFBQSxRQUNoRCxHQUFRO0FBQUEsUUFBTSxHQUFRO0FBQUEsUUFBSyxHQUFRO0FBQUEsUUFBSyxHQUFRO0FBQUEsUUFDaEQsR0FBUTtBQUFBLFFBQU0sR0FBUTtBQUFBLFFBQUssR0FBUTtBQUFBLFFBQ25DLEdBQVE7QUFBQSxRQUFNLEdBQVE7QUFBQSxRQUN0QixHQUFRO0FBQUEsUUFBTSxHQUFRO0FBQUEsUUFDdEIsR0FBUTtBQUFBO0FBQUEsUUFFUixHQUFVO0FBQUEsUUFBTSxHQUFVO0FBQUEsUUFBSyxHQUFVO0FBQUEsUUFDekMsR0FBVTtBQUFBLFFBQU0sR0FBVTtBQUFBLFFBQUssR0FBVTtBQUFBLFFBQ3pDLEdBQVU7QUFBQSxRQUFNLEdBQVU7QUFBQSxRQUFLLEdBQVU7QUFBQSxRQUFLLEdBQVU7QUFBQSxRQUN4RCxHQUFVO0FBQUEsUUFBTSxHQUFVO0FBQUEsUUFBSyxHQUFVO0FBQUEsUUFBSyxHQUFVO0FBQUEsUUFDeEQsR0FBVTtBQUFBLFFBQU0sR0FBVTtBQUFBLFFBQUssR0FBVTtBQUFBLFFBQUssR0FBVTtBQUFBLFFBQ3hELEdBQVU7QUFBQSxRQUFNLEdBQVU7QUFBQSxRQUFLLEdBQVU7QUFBQSxRQUFLLEdBQVU7QUFBQSxRQUFLLEdBQVU7QUFBQSxRQUN2RSxHQUFVO0FBQUEsUUFBTSxHQUFVO0FBQUEsUUFBSyxHQUFVO0FBQUEsUUFBSyxHQUFVO0FBQUEsUUFBSyxHQUFVO0FBQUEsUUFDdkUsR0FBVTtBQUFBLFFBQU0sR0FBVTtBQUFBLFFBQUssR0FBVTtBQUFBLFFBQUssR0FBVTtBQUFBLFFBQ3hELEdBQVU7QUFBQSxRQUFNLEdBQVU7QUFBQSxRQUFLLEdBQVU7QUFBQSxRQUFLLEdBQVU7QUFBQSxRQUN4RCxHQUFVO0FBQUEsUUFBTSxHQUFVO0FBQUEsUUFBSyxHQUFVO0FBQUEsUUFBSyxHQUFVO0FBQUEsUUFDeEQsR0FBVTtBQUFBLFFBQU0sR0FBVTtBQUFBLFFBQUssR0FBVTtBQUFBLFFBQUssR0FBVTtBQUFBLFFBQUssR0FBVTtBQUFBLFFBQ3ZFLEdBQVU7QUFBQSxRQUFNLEdBQVU7QUFBQSxRQUFLLEdBQVU7QUFBQSxRQUFLLEdBQVU7QUFBQSxRQUFLLEdBQVU7QUFBQSxRQUN2RSxHQUFVO0FBQUEsUUFBTSxHQUFVO0FBQUEsUUFDMUIsR0FBVTtBQUFBLFFBQU0sR0FBVTtBQUFBLFFBQUssR0FBVTtBQUFBLFFBQ3pDLEdBQVU7QUFBQSxRQUFNLEdBQVU7QUFBQSxRQUFLLEdBQVU7QUFBQSxRQUFLLEdBQVU7QUFBQSxRQUFLLEdBQVU7QUFBQSxRQUN2RSxHQUFVO0FBQUEsUUFBTSxHQUFVO0FBQUEsUUFBSyxHQUFVO0FBQUEsUUFBSyxHQUFVO0FBQUEsUUFBSyxHQUFVO0FBQUEsUUFDdkUsR0FBVTtBQUFBLFFBQU0sR0FBVTtBQUFBLFFBQUssR0FBVTtBQUFBLFFBQUssR0FBVTtBQUFBLFFBQ3hELEdBQVU7QUFBQSxRQUFNLEdBQVU7QUFBQSxRQUFLLEdBQVU7QUFBQSxRQUFLLEdBQVU7QUFBQSxRQUN4RCxHQUFVO0FBQUEsUUFBTSxHQUFVO0FBQUEsUUFBSyxHQUFVO0FBQUEsUUFDekMsR0FBVTtBQUFBLFFBQU0sR0FBVTtBQUFBLFFBQUssR0FBVTtBQUFBLFFBQ3pDLEdBQVU7QUFBQSxRQUFNLEdBQVU7QUFBQSxRQUFLLEdBQVU7QUFBQSxRQUN6QyxHQUFVO0FBQUEs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QUNyQyxTQUFTQSxFQUFRLFFBQVEsS0FBS0EsQ0FBTztBQUFBLE1BQ3JDLFlBQVlBLEVBQVEsV0FBVyxLQUFLQSxDQUFPO0FBQUEsSUFBQTtBQUFBLEVBRS9DO0FBQ0Y7QUNkTyxTQUFTMFMsR0FBSXh3QyxHQUFZO0FBRTlCLFNBQUtvSyxFQUFBLFNBQVNwSyxDQUFLLElBRVowMEIsRUFBQUEsTUFBTTEwQixHQUFPO0FBQUEsSUFDbEIscUJBQXFCO0FBQUEsRUFBQSxDQUN0QixJQUo0QkE7QUFLL0I7QUFFTyxTQUFTaXhDLEdBQU1qeEMsR0FBWTtBQUNoQyxVQUFPQSxLQUFBLGdCQUFBQSxFQUFPLHlCQUF3QjtBQUN4QztBQ25CTyxTQUFTaXdCLEdBQUtqd0IsR0FBWTtBQUUvQixTQUFLb0ssRUFBQSxTQUFTcEssQ0FBSyxJQUVaMDBCLEVBQUFBLE1BQU0xMEIsR0FBTztBQUFBLElBQ2xCLHNCQUFzQjtBQUFBLEVBQUEsQ0FDdkIsSUFKNEJBO0FBSy9CO0FBRU8sU0FBU214QyxHQUFPbnhDLEdBQVk7QUFDakMsVUFBT0EsS0FBQSxnQkFBQUEsRUFBTywwQkFBeUI7QUFDekM7QUNiQSxNQUFNK3hDLEtBQVU7IiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzAsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDBdfQ==
|